From d8790ad2f133bc8e73501893407200f977fd4d91 Mon Sep 17 00:00:00 2001 From: FlightControl Date: Sun, 5 Jun 2016 00:03:27 +0200 Subject: [PATCH 1/7] First test mission with ZONE_POLYGON working! --- Moose Development/Dcs/Moose_Test_WRAPPER.lua | 8 - Moose Development/Moose/Group.lua | 28 +- Moose Development/Moose/Scheduler.lua | 2 +- Moose Development/Moose/Zone.lua | 355 +- .../l10n/DEFAULT/Moose.lua | 17334 +--------------- Moose Mission Setup/Moose.lua | 17334 +--------------- .../Moose_Test_ZONE_POLYGON.lua | 27 + .../Moose_Test_ZONE_POLYGON.miz | Bin 0 -> 20400 bytes Moose Training/Documentation/Zone.html | 826 +- Moose Training/Documentation/index.html | 3 +- 10 files changed, 1188 insertions(+), 34729 deletions(-) delete mode 100644 Moose Development/Dcs/Moose_Test_WRAPPER.lua create mode 100644 Moose Test Missions/Moose_Test_ZONE_POLYGON/Moose_Test_ZONE_POLYGON.lua create mode 100644 Moose Test Missions/Moose_Test_ZONE_POLYGON/Moose_Test_ZONE_POLYGON.miz diff --git a/Moose Development/Dcs/Moose_Test_WRAPPER.lua b/Moose Development/Dcs/Moose_Test_WRAPPER.lua deleted file mode 100644 index bed5f303a..000000000 --- a/Moose Development/Dcs/Moose_Test_WRAPPER.lua +++ /dev/null @@ -1,8 +0,0 @@ - -Include.File( "Group" ) -Include.File( "Unit" ) - -local UnitAirPlaneAI = _DATABASE:FindUnit( "Airplane AI" ) - -UnitAirPlaneAI:FlareRed() - diff --git a/Moose Development/Moose/Group.lua b/Moose Development/Moose/Group.lua index 3427faa70..faaa6004f 100644 --- a/Moose Development/Moose/Group.lua +++ b/Moose Development/Moose/Group.lua @@ -526,6 +526,24 @@ end -- Is Functions +--- Returns if all units of the group are within a @{Zone#ZONE}. +-- @param #GROUP self +-- @param Zone#ZONE_BASE Zone The zone to test. +-- @return #boolean Returns true if the Group is completely within the @{Zone#ZONE} +function GROUP:IsCompletelyInZone( Zone ) + self:F2( { self.GroupName, Zone } ) + + for UnitID, UnitData in pairs( self:GetUnits() ) do + local Unit = UnitData -- Unit#UNIT + if Zone:IsPointVec3InZone( Unit:GetPointVec3() ) then + else + return false + end + end + + return true +end + --- Returns if the group is of an air category. -- If the group is a helicopter or a plane, then this method will return true, otherwise false. -- @param #GROUP self @@ -2488,7 +2506,7 @@ end --- Returns a message for a coalition or a client. -- @param #GROUP self -- @param #string Message The message text --- @param #Duration Duration The duration of the message. +-- @param DCSTypes#Duration Duration The duration of the message. -- @return Message#MESSAGE function GROUP:Message( Message, Duration ) self:F2( { Message, Duration } ) @@ -2505,7 +2523,7 @@ end -- The message will appear in the message area. The message will begin with the callsign of the group and the type of the first unit sending the message. -- @param #GROUP self -- @param #string Message The message text --- @param #Duration Duration The duration of the message. +-- @param DCSTypes#Duration Duration The duration of the message. function GROUP:MessageToAll( Message, Duration ) self:F2( { Message, Duration } ) @@ -2521,7 +2539,7 @@ end -- The message will appear in the message area. The message will begin with the callsign of the group and the type of the first unit sending the message. -- @param #GROUP self -- @param #string Message The message text --- @param #Duration Duration The duration of the message. +-- @param DCSTYpes#Duration Duration The duration of the message. function GROUP:MessageToRed( Message, Duration ) self:F2( { Message, Duration } ) @@ -2537,7 +2555,7 @@ end -- The message will appear in the message area. The message will begin with the callsign of the group and the type of the first unit sending the message. -- @param #GROUP self -- @param #string Message The message text --- @param #Duration Duration The duration of the message. +-- @param DCSTypes#Duration Duration The duration of the message. function GROUP:MessageToBlue( Message, Duration ) self:F2( { Message, Duration } ) @@ -2553,7 +2571,7 @@ end -- The message will appear in the message area. The message will begin with the callsign of the group and the type of the first unit sending the message. -- @param #GROUP self -- @param #string Message The message text --- @param #Duration Duration The duration of the message. +-- @param DCSTypes#Duration Duration The duration of the message. -- @param Client#CLIENT Client The client object receiving the message. function GROUP:MessageToClient( Message, Duration, Client ) self:F2( { Message, Duration } ) diff --git a/Moose Development/Moose/Scheduler.lua b/Moose Development/Moose/Scheduler.lua index a45b85135..a9bfddb62 100644 --- a/Moose Development/Moose/Scheduler.lua +++ b/Moose Development/Moose/Scheduler.lua @@ -121,7 +121,7 @@ function SCHEDULER:_Scheduler() self:T( { Status, Result } ) - if Status and Status == true and Result and Result == true then + if Status and ( ( not Result ) or ( Result and Result ~= false ) ) then if self.Repeat and ( not self.StopSeconds or ( self.StopSeconds and timer.getTime() <= self.StartTime + self.StopSeconds ) ) then timer.scheduleFunction( self._Scheduler, diff --git a/Moose Development/Moose/Zone.lua b/Moose Development/Moose/Zone.lua index c85cae774..80efaf0e5 100644 --- a/Moose Development/Moose/Zone.lua +++ b/Moose Development/Moose/Zone.lua @@ -1,79 +1,346 @@ --- ZONE Classes +-- ============= +-- This module contains the ZONE classes, inherited from @{Zone#ZONE_BASE}. +-- There are essentially two core functions that zones accomodate: +-- +-- * Test if an object is within the zone boundaries. +-- * Provide the zone behaviour. Some zones are static, while others are moveable. +-- +-- The object classes are using the zone classes to test the zone boundaries, which can take various forms: +-- +-- * Test if completely within the zone. +-- * Test if partly within the zone (for @{Group#GROUP} objects). +-- * Test if not in the zone. +-- * Distance to the nearest intersecting point of the zone. +-- * Distance to the center of the zone. +-- * ... +-- +-- Each of these ZONE classes have a zone name, and specific parameters defining the zone type: +-- +-- * @{Zone#ZONE_BASE}: The ZONE_BASE class defining the base for all other zone classes. +-- * @{Zone#ZONE_RADIUS}: The ZONE_RADIUS class defined by a zone name, a location and a radius. +-- * @{Zone#ZONE}: The ZONE class, defined by the zone name as defined within the Mission Editor. +-- * @{Zone#ZONE_UNIT}: The ZONE_UNIT class defined by a zone around a @{Unit#UNIT} with a radius. +-- * @{Zone#ZONE_POLYGON}: The ZONE_POLYGON class defined by a sequence of @{Group#GROUP} waypoints within the Mission Editor, forming a polygon. +-- +-- Polymorphic methods +-- =================== +-- Each zone implements two polymorphic functions defined in @{Zone#ZONE_BASE}: +-- +-- * @{#ZONE_BASE.IsPointVec2InZone}: Returns if a location is within the zone. +-- * @{#ZONE_BASE.IsPointVec3InZone}: Returns if a point is within the zone. +-- -- @module Zone +-- @author FlightControl + Include.File( "Routines" ) Include.File( "Base" ) Include.File( "Message" ) ---- The ZONE class --- @type ZONE --- @Extends Base#BASE -ZONE = { - ClassName="ZONE", - } - -function ZONE:New( ZoneName ) - local self = BASE:Inherit( self, BASE:New() ) - self:F( ZoneName ) - local Zone = trigger.misc.getZone( ZoneName ) - - if not Zone then - error( "Zone " .. ZoneName .. " does not exist." ) - return nil - end - - self.Zone = Zone - self.ZoneName = ZoneName + +--- The ZONE_BASE class +-- @type ZONE_BASE +-- @Extends Base#BASE +ZONE_BASE = { + ClassName = "ZONE_BASE", + } + +function ZONE_BASE:New( ZoneName ) + local self = BASE:Inherit( self, BASE:New() ) + self:F( ZoneName ) + + self.ZoneName = ZoneName + + return self +end + +--- Returns if a location is within the zone. +-- @param #ZONE_RADIUS self +-- @param DCSTypes#Vec2 PointVec2 The location to test. +-- @return #boolean true if the location is within the zone. +function ZONE_BASE:IsPointVec2InZone( PointVec2 ) + self:F2( PointVec2 ) + + return false +end + +--- Returns if a point is within the zone. +-- @param #ZONE_RADIUS self +-- @param DCSTypes#Vec3 PointVec3 The point to test. +-- @return #boolean true if the point is within the zone. +function ZONE_BASE:IsPointVec3InZone( PointVec3 ) + self:F2( PointVec3 ) + + local InZone = self:IsPointVec2InZone( { x = PointVec3.x, y = PointVec3.z } ) + + return InZone +end + + +--- The ZONE_RADIUS class, defined by a zone name, a location and a radius. +-- @type ZONE_RADIUS +-- @field DCSTypes#Vec2 PointVec2 The current location of the zone. +-- @field DCSTypes#Distance Radius The radius of the zone. +-- @Extends Zone#ZONE_BASE +ZONE_RADIUS = { + ClassName="ZONE_RADIUS", + } + +--- Constructor of ZONE_RADIUS, taking the zone name, the zone location and a radius. +-- @param #ZONE_RADIUS self +-- @param DCSTypes#Vec2 PointVec2 The location of the zone. +-- @param DCSTypes#Distance Radius The radius of the zone. +-- @return #ZONE_RADIUS +function ZONE_RADIUS:New( ZoneName, PointVec2, Radius ) + local self = BASE:Inherit( self, ZONE_BASE:New( ZoneName ) ) + self:F( { ZoneName, PointVec2, Radius } ) + + self.Radius = Radius + self.PointVec2 = PointVec2 return self end -function ZONE:GetPointVec2() - self:F( self.ZoneName ) - local Zone = trigger.misc.getZone( self.ZoneName ) - local Point = { x = Zone.point.x, y = Zone.point.z } +--- Returns the radius of the zone. +-- @param #ZONE_RADIUS self +-- @return DCSTypes#Distance The radius of the zone. +function ZONE_RADIUS:GetRadius() + self:F2( self.ZoneName ) - self:T( { Zone, Point } ) + self:T2( { self.Radius } ) + + return self.Radius +end + +--- Sets the radius of the zone. +-- @param #ZONE_RADIUS self +-- @param DCSTypes#Distance Radius The radius of the zone. +-- @return DCSTypes#Distance The radius of the zone. +function ZONE_RADIUS:SetRadius( Radius ) + self:F2( self.ZoneName ) + + self.Radius = Radius + self:T2( { self.Radius } ) + + return self.Radius +end + +--- Returns the location of the zone. +-- @param #ZONE_RADIUS self +-- @return DCSTypes#Vec2 The location of the zone. +function ZONE_RADIUS:GetPointVec2() + self:F2( self.ZoneName ) + + self:T2( { self.PointVec2 } ) - return Point + return self.PointVec2 end -function ZONE:GetPointVec3( Height ) - self:F( self.ZoneName ) - - local Zone = trigger.misc.getZone( self.ZoneName ) - local Point = { x = Zone.point.x, y = land.getHeight( self:GetPointVec2() ) + Height, z = Zone.point.z } - - self:T( { Zone, Point } ) +--- Sets the location of the zone. +-- @param #ZONE_RADIUS self +-- @param DCSTypes#Vec2 PointVec2 The new location of the zone. +-- @return DCSTypes#Vec2 The new location of the zone. +function ZONE_RADIUS:SetPointVec2( PointVec2 ) + self:F2( self.ZoneName ) - return Point + self.PointVec2 = PointVec2 + + self:T2( { self.PointVec2 } ) + + return self.PointVec2 end -function ZONE:GetRandomPointVec2() +--- Returns the point of the zone. +-- @param #ZONE_RADIUS self +-- @param DCSTypes#Distance Height The height to add to the land height where the center of the zone is located. +-- @return DCSTypes#Vec3 The point of the zone. +function ZONE_RADIUS:GetPointVec3( Height ) + self:F2( self.ZoneName ) + + local PointVec2 = self:GetPointVec2() + + local PointVec3 = { x = PointVec2.x, y = land.getHeight( self:GetPointVec2() ) + Height, z = PointVec2.y } + + self:T2( { PointVec3 } ) + + return PointVec3 +end + +--- Returns if a location is within the zone. +-- @param #ZONE_RADIUS self +-- @param DCSTypes#Vec2 PointVec2 The location to test. +-- @return #boolean true if the location is within the zone. +function ZONE_RADIUS:IsPointVec2InZone( PointVec2 ) + self:F2( PointVec2 ) + + if (( PointVec2.x - self.PointVec2.x )^2 + ( PointVec2.y - self.PointVec2.y ) ^2 ) ^ 0.5 <= self.Radius then + return true + end + + return false +end + +--- Returns if a point is within the zone. +-- @param #ZONE_RADIUS self +-- @param DCSTypes#Vec3 PointVec3 The point to test. +-- @return #boolean true if the point is within the zone. +function ZONE_RADIUS:IsPointVec3InZone( PointVec3 ) + self:F2( PointVec3 ) + + local InZone = self:IsPointVec3InZone( { x = PointVec3.x, y = PointVec3.z } ) + + return InZone +end + +--- Returns a random location within the zone. +-- @param #ZONE_RADIUS self +-- @return DCSTypes#Vec2 The random location within the zone. +function ZONE_RADIUS:GetRandomPointVec2() self:F( self.ZoneName ) local Point = {} - local Zone = trigger.misc.getZone( self.ZoneName ) - local angle = math.random() * math.pi*2; - Point.x = Zone.point.x + math.cos( angle ) * math.random() * Zone.radius; - Point.y = Zone.point.z + math.sin( angle ) * math.random() * Zone.radius; + Point.x = self.PointVec2.x + math.cos( angle ) * math.random() * self.Radius; + Point.y = self.PointVec2.y + math.sin( angle ) * math.random() * self.Radius; - self:T( { Zone, Point } ) + self:T( { Point } ) return Point end -function ZONE:GetRadius() - self:F( self.ZoneName ) - local Zone = trigger.misc.getZone( self.ZoneName ) - self:T( { Zone } ) +--- The ZONE class, defined by the zone name as defined within the Mission Editor. The location and the radius are automatically collected from the mission settings. +-- @type ZONE +-- @Extends Zone#ZONE_RADIUS +ZONE = { + ClassName="ZONE", + } - return Zone.radius + +--- Constructor of ZONE, taking the zone name. +-- @param #ZONE self +-- @param #string ZoneName The name of the zone as defined within the mission editor. +-- @return #ZONE +function ZONE:New( ZoneName ) + + local Zone = trigger.misc.getZone( ZoneName ) + + if not Zone then + error( "Zone " .. ZoneName .. " does not exist." ) + return nil + end + + local self = BASE:Inherit( self, ZONE_RADIUS:New( ZoneName, { x = Zone.x, y = Zone.y }, Zone.radius ) ) + self:F( ZoneName ) + + self.Zone = Zone + + return self +end + + + +--- The ZONE_UNIT class defined by a zone around a @{Unit#UNIT} with a radius. +-- @type ZONE_UNIT +-- @field Unit#UNIT ZoneUNIT +-- @Extends Zone#ZONE_RADIUS +ZONE_UNIT = { + ClassName="ZONE_UNIT", + } + +--- Constructor to create a ZONE_UNIT instance, taking the zone name, a zone unit and a radius. +-- @param #ZONE_UNIT self +-- @param #string ZoneName Name of the zone. +-- @param Unit#UNIT ZoneUNIT The unit as the center of the zone. +-- @param DCSTypes#Distance Radius The radius of the zone. +-- @return #ZONE_UNIT self +function ZONE_UNIT:New( ZoneName, ZoneUNIT, Radius ) + local self = BASE:Inherit( self, ZONE_RADIUS:New( ZoneName, ZoneUNIT:GetPointVec2(), Radius ) ) + self:F( { ZoneName, ZoneUNIT:GetPointVec2(), Radius } ) + + self.ZoneUNIT = ZoneUNIT + + return self +end + + +--- Returns the current location of the @{Unit#UNIT}. +-- @param #ZONE_UNIT self +-- @return DCSTypes#Vec2 The location of the zone based on the @{Unit#UNIT}location. +function ZONE_UNIT:GetPointVec2() + self:F( self.ZoneName ) + + local ZonePointVec2 = self.ZoneUNIT:GetPointVec2() + + self:T( { ZonePointVec2 } ) + + return ZonePointVec2 +end + + +--- The ZONE_POLYGON class defined by a sequence of @{Group#GROUP} waypoints within the Mission Editor, forming a polygon. +-- @type ZONE_POLYGON +-- @Extends Zone#ZONE_BASE +ZONE_POLYGON = { + ClassName="ZONE_POLYGON", + } + +--- Constructor to create a ZONE_POLYGON instance, taking the zone name and the name of the @{Group#GROUP} defined within the Mission Editor. +-- The @{Group#GROUP} waypoints define the polygon corners. The first and the last point are automatically connected by ZONE_POLYGON. +-- @param #ZONE_POLYGON self +-- @param #string ZoneName Name of the zone. +-- @param Group#GROUP ZoneGroup The GROUP waypoints as defined within the Mission Editor define the polygon shape. +-- @return #ZONE_POLYGON self +function ZONE_POLYGON:New( ZoneName, ZoneGroup ) + local self = BASE:Inherit( self, ZONE_BASE:New( ZoneName ) ) + self:F( { ZoneName, ZoneGroup } ) + + local GroupPoints = ZoneGroup:GetTaskRoute() + local i = 0 + + self.Polygon = {} + + for i = 1, #GroupPoints do + self.Polygon[i] = {} + self.Polygon[i].x = GroupPoints[i].x + self.Polygon[i].y = GroupPoints[i].y + end + + return self +end + + +--- Returns if a location is within the zone. +-- @param #ZONE_POLYGON self +-- @param DCSTypes#Vec2 PointVec2 The location to test. +-- @return #boolean true if the location is within the zone. +function ZONE_POLYGON:IsPointVec2InZone( PointVec2 ) + self:F2( PointVec2 ) + + local i + local j + local c = false + + i = 1 + j = #self.Polygon + + while i < #self.Polygon do + j = i + i = i + 1 + self:T( { i, j, self.Polygon[i], self.Polygon[j] } ) + if ( ( ( self.Polygon[i].y > PointVec2.y ) ~= ( self.Polygon[j].y > PointVec2.y ) ) and + ( PointVec2.x < ( self.Polygon[j].x - self.Polygon[i].x ) * ( PointVec2.y - self.Polygon[i].y ) / ( self.Polygon[j].y - self.Polygon[i].y ) + self.Polygon[i].x ) + ) then + c = not c + end + self:T( { "c = ", c } ) + end + + return c 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 07c019def..dc9f9f58b 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,6 @@ -env.info( '*** MOOSE STATIC INCLUDE START *** ' ) -env.info( 'Moose Generation Timestamp: 20160602_1448' ) +env.info( '*** MOOSE DYNAMIC INCLUDE START *** ' ) +env.info( 'Moose Generation Timestamp: 20160604_1716' ) + local base = _G env.info("Loading MOOSE " .. base.timer.getAbsTime() ) @@ -11,9 +12,27 @@ Include.Path = function() end Include.File = function( IncludeFile ) + if not Include.Files[ IncludeFile ] then + Include.Files[IncludeFile] = IncludeFile + env.info( "Include:" .. IncludeFile .. " from " .. Include.ProgramPath ) + local f = assert( base.loadfile( Include.ProgramPath .. IncludeFile .. ".lua" ) ) + if f == nil then + env.info( "Include:" .. IncludeFile .. " from " .. Include.MissionPath ) + local f = assert( base.loadfile( Include.MissionPath .. IncludeFile .. ".lua" ) ) + if f == nil then + error ("Could not load MOOSE file " .. IncludeFile .. ".lua" ) + else + env.info( "Include:" .. IncludeFile .. " loaded from " .. Include.MissionPath ) + return f() + end + else + env.info( "Include:" .. IncludeFile .. " loaded from " .. Include.ProgramPath ) + return f() + end + end end -Include.ProgramPath = "Scripts/Moose/Moose/" +Include.ProgramPath = "Scripts/Moose/" Include.MissionPath = Include.Path() env.info( "Include.ProgramPath = " .. Include.ProgramPath) @@ -23,17311 +42,4 @@ Include.Files = {} Include.File( "Moose" ) -env.info("Loaded MOOSE Include Engine") ---- Various routines --- @module routines --- @author Flightcontrol - ---Include.File( "Trace" ) ---Include.File( "Message" ) - - -env.setErrorMessageBoxEnabled(false) - ---- Extract of MIST functions. --- @author Grimes - -routines = {} - - --- don't change these -routines.majorVersion = 3 -routines.minorVersion = 3 -routines.build = 22 - ------------------------------------------------------------------------------------------------------------------ - ----------------------------------------------------------------------------------------------- --- Utils- conversion, Lua utils, etc. -routines.utils = {} - ---from http://lua-users.org/wiki/CopyTable -routines.utils.deepCopy = function(object) - local lookup_table = {} - local function _copy(object) - if type(object) ~= "table" then - return object - elseif lookup_table[object] then - return lookup_table[object] - end - local new_table = {} - lookup_table[object] = new_table - for index, value in pairs(object) do - new_table[_copy(index)] = _copy(value) - end - return setmetatable(new_table, getmetatable(object)) - end - local objectreturn = _copy(object) - return objectreturn -end - - --- porting in Slmod's serialize_slmod2 -routines.utils.oneLineSerialize = function(tbl) -- serialization of a table all on a single line, no comments, made to replace old get_table_string function - - lookup_table = {} - - local function _Serialize( tbl ) - - if type(tbl) == 'table' then --function only works for tables! - - if lookup_table[tbl] then - return lookup_table[object] - end - - local tbl_str = {} - - lookup_table[tbl] = tbl_str - - tbl_str[#tbl_str + 1] = '{' - - for ind,val in pairs(tbl) do -- serialize its fields - local ind_str = {} - if type(ind) == "number" then - ind_str[#ind_str + 1] = '[' - ind_str[#ind_str + 1] = tostring(ind) - ind_str[#ind_str + 1] = ']=' - else --must be a string - ind_str[#ind_str + 1] = '[' - ind_str[#ind_str + 1] = routines.utils.basicSerialize(ind) - ind_str[#ind_str + 1] = ']=' - end - - local val_str = {} - if ((type(val) == 'number') or (type(val) == 'boolean')) then - val_str[#val_str + 1] = tostring(val) - val_str[#val_str + 1] = ',' - tbl_str[#tbl_str + 1] = table.concat(ind_str) - tbl_str[#tbl_str + 1] = table.concat(val_str) - elseif type(val) == 'string' then - val_str[#val_str + 1] = routines.utils.basicSerialize(val) - val_str[#val_str + 1] = ',' - tbl_str[#tbl_str + 1] = table.concat(ind_str) - tbl_str[#tbl_str + 1] = table.concat(val_str) - elseif type(val) == 'nil' then -- won't ever happen, right? - val_str[#val_str + 1] = 'nil,' - tbl_str[#tbl_str + 1] = table.concat(ind_str) - tbl_str[#tbl_str + 1] = table.concat(val_str) - elseif type(val) == 'table' then - if ind == "__index" then - -- tbl_str[#tbl_str + 1] = "__index" - -- tbl_str[#tbl_str + 1] = ',' --I think this is right, I just added it - else - - val_str[#val_str + 1] = _Serialize(val) - val_str[#val_str + 1] = ',' --I think this is right, I just added it - tbl_str[#tbl_str + 1] = table.concat(ind_str) - tbl_str[#tbl_str + 1] = table.concat(val_str) - end - elseif type(val) == 'function' then - -- tbl_str[#tbl_str + 1] = "function " .. tostring(ind) - -- tbl_str[#tbl_str + 1] = ',' --I think this is right, I just added it - else --- env.info('unable to serialize value type ' .. routines.utils.basicSerialize(type(val)) .. ' at index ' .. tostring(ind)) --- env.info( debug.traceback() ) - end - - end - tbl_str[#tbl_str + 1] = '}' - return table.concat(tbl_str) - else - return tostring(tbl) - end - end - - local objectreturn = _Serialize(tbl) - return objectreturn -end - ---porting in Slmod's "safestring" basic serialize -routines.utils.basicSerialize = function(s) - if s == nil then - return "\"\"" - else - if ((type(s) == 'number') or (type(s) == 'boolean') or (type(s) == 'function') or (type(s) == 'table') or (type(s) == 'userdata') ) then - return tostring(s) - elseif type(s) == 'string' then - s = string.format('%q', s) - return s - end - end -end - - -routines.utils.toDegree = function(angle) - return angle*180/math.pi -end - -routines.utils.toRadian = function(angle) - return angle*math.pi/180 -end - -routines.utils.metersToNM = function(meters) - return meters/1852 -end - -routines.utils.metersToFeet = function(meters) - return meters/0.3048 -end - -routines.utils.NMToMeters = function(NM) - return NM*1852 -end - -routines.utils.feetToMeters = function(feet) - return feet*0.3048 -end - -routines.utils.mpsToKnots = function(mps) - return mps*3600/1852 -end - -routines.utils.mpsToKmph = function(mps) - return mps*3.6 -end - -routines.utils.knotsToMps = function(knots) - return knots*1852/3600 -end - -routines.utils.kmphToMps = function(kmph) - return kmph/3.6 -end - -function routines.utils.makeVec2(Vec3) - if Vec3.z then - return {x = Vec3.x, y = Vec3.z} - else - return {x = Vec3.x, y = Vec3.y} -- it was actually already vec2. - end -end - -function routines.utils.makeVec3(Vec2, y) - if not Vec2.z then - if not y then - y = 0 - end - return {x = Vec2.x, y = y, z = Vec2.y} - else - return {x = Vec2.x, y = Vec2.y, z = Vec2.z} -- it was already Vec3, actually. - end -end - -function routines.utils.makeVec3GL(Vec2, offset) - local adj = offset or 0 - - if not Vec2.z then - return {x = Vec2.x, y = (land.getHeight(Vec2) + adj), z = Vec2.y} - else - return {x = Vec2.x, y = (land.getHeight({x = Vec2.x, y = Vec2.z}) + adj), z = Vec2.z} - end -end - -routines.utils.zoneToVec3 = function(zone) - local new = {} - if type(zone) == 'table' and zone.point then - new.x = zone.point.x - new.y = zone.point.y - new.z = zone.point.z - return new - elseif type(zone) == 'string' then - zone = trigger.misc.getZone(zone) - if zone then - new.x = zone.point.x - new.y = zone.point.y - new.z = zone.point.z - return new - end - end -end - --- gets heading-error corrected direction from point along vector vec. -function routines.utils.getDir(vec, point) - local dir = math.atan2(vec.z, vec.x) - dir = dir + routines.getNorthCorrection(point) - if dir < 0 then - dir = dir + 2*math.pi -- put dir in range of 0 to 2*pi - end - return dir -end - --- gets distance in meters between two points (2 dimensional) -function routines.utils.get2DDist(point1, point2) - point1 = routines.utils.makeVec3(point1) - point2 = routines.utils.makeVec3(point2) - return routines.vec.mag({x = point1.x - point2.x, y = 0, z = point1.z - point2.z}) -end - --- gets distance in meters between two points (3 dimensional) -function routines.utils.get3DDist(point1, point2) - return routines.vec.mag({x = point1.x - point2.x, y = point1.y - point2.y, z = point1.z - point2.z}) -end - - - --- From http://lua-users.org/wiki/SimpleRound --- use negative idp for rounding ahead of decimal place, positive for rounding after decimal place -routines.utils.round = function(num, idp) - local mult = 10^(idp or 0) - return math.floor(num * mult + 0.5) / mult -end - --- porting in Slmod's dostring -routines.utils.dostring = function(s) - local f, err = loadstring(s) - if f then - return true, f() - else - return false, err - end -end - - ---3D Vector manipulation -routines.vec = {} - -routines.vec.add = function(vec1, vec2) - return {x = vec1.x + vec2.x, y = vec1.y + vec2.y, z = vec1.z + vec2.z} -end - -routines.vec.sub = function(vec1, vec2) - return {x = vec1.x - vec2.x, y = vec1.y - vec2.y, z = vec1.z - vec2.z} -end - -routines.vec.scalarMult = function(vec, mult) - return {x = vec.x*mult, y = vec.y*mult, z = vec.z*mult} -end - -routines.vec.scalar_mult = routines.vec.scalarMult - -routines.vec.dp = function(vec1, vec2) - return vec1.x*vec2.x + vec1.y*vec2.y + vec1.z*vec2.z -end - -routines.vec.cp = function(vec1, vec2) - return { x = vec1.y*vec2.z - vec1.z*vec2.y, y = vec1.z*vec2.x - vec1.x*vec2.z, z = vec1.x*vec2.y - vec1.y*vec2.x} -end - -routines.vec.mag = function(vec) - return (vec.x^2 + vec.y^2 + vec.z^2)^0.5 -end - -routines.vec.getUnitVec = function(vec) - local mag = routines.vec.mag(vec) - return { x = vec.x/mag, y = vec.y/mag, z = vec.z/mag } -end - -routines.vec.rotateVec2 = function(vec2, theta) - return { x = vec2.x*math.cos(theta) - vec2.y*math.sin(theta), y = vec2.x*math.sin(theta) + vec2.y*math.cos(theta)} -end ---------------------------------------------------------------------------------------------------------------------------- - - - - --- acc- the accuracy of each easting/northing. 0, 1, 2, 3, 4, or 5. -routines.tostringMGRS = function(MGRS, acc) - if acc == 0 then - return MGRS.UTMZone .. ' ' .. MGRS.MGRSDigraph - else - return MGRS.UTMZone .. ' ' .. MGRS.MGRSDigraph .. ' ' .. string.format('%0' .. acc .. 'd', routines.utils.round(MGRS.Easting/(10^(5-acc)), 0)) - .. ' ' .. string.format('%0' .. acc .. 'd', routines.utils.round(MGRS.Northing/(10^(5-acc)), 0)) - end -end - ---[[acc: -in DM: decimal point of minutes. -In DMS: decimal point of seconds. -position after the decimal of the least significant digit: -So: -42.32 - acc of 2. -]] -routines.tostringLL = function(lat, lon, acc, DMS) - - local latHemi, lonHemi - if lat > 0 then - latHemi = 'N' - else - latHemi = 'S' - end - - if lon > 0 then - lonHemi = 'E' - else - lonHemi = 'W' - end - - lat = math.abs(lat) - lon = math.abs(lon) - - local latDeg = math.floor(lat) - local latMin = (lat - latDeg)*60 - - local lonDeg = math.floor(lon) - local lonMin = (lon - lonDeg)*60 - - if DMS then -- degrees, minutes, and seconds. - local oldLatMin = latMin - latMin = math.floor(latMin) - local latSec = routines.utils.round((oldLatMin - latMin)*60, acc) - - local oldLonMin = lonMin - lonMin = math.floor(lonMin) - local lonSec = routines.utils.round((oldLonMin - lonMin)*60, acc) - - if latSec == 60 then - latSec = 0 - latMin = latMin + 1 - end - - if lonSec == 60 then - lonSec = 0 - lonMin = lonMin + 1 - end - - local secFrmtStr -- create the formatting string for the seconds place - if acc <= 0 then -- no decimal place. - secFrmtStr = '%02d' - else - local width = 3 + acc -- 01.310 - that's a width of 6, for example. - secFrmtStr = '%0' .. width .. '.' .. acc .. 'f' - end - - return string.format('%02d', latDeg) .. ' ' .. string.format('%02d', latMin) .. '\' ' .. string.format(secFrmtStr, latSec) .. '"' .. latHemi .. ' ' - .. string.format('%02d', lonDeg) .. ' ' .. string.format('%02d', lonMin) .. '\' ' .. string.format(secFrmtStr, lonSec) .. '"' .. lonHemi - - else -- degrees, decimal minutes. - latMin = routines.utils.round(latMin, acc) - lonMin = routines.utils.round(lonMin, acc) - - if latMin == 60 then - latMin = 0 - latDeg = latDeg + 1 - end - - if lonMin == 60 then - lonMin = 0 - lonDeg = lonDeg + 1 - end - - local minFrmtStr -- create the formatting string for the minutes place - if acc <= 0 then -- no decimal place. - minFrmtStr = '%02d' - else - local width = 3 + acc -- 01.310 - that's a width of 6, for example. - minFrmtStr = '%0' .. width .. '.' .. acc .. 'f' - end - - return string.format('%02d', latDeg) .. ' ' .. string.format(minFrmtStr, latMin) .. '\'' .. latHemi .. ' ' - .. string.format('%02d', lonDeg) .. ' ' .. string.format(minFrmtStr, lonMin) .. '\'' .. lonHemi - - end -end - ---[[ required: az - radian - required: dist - meters - optional: alt - meters (set to false or nil if you don't want to use it). - optional: metric - set true to get dist and alt in km and m. - precision will always be nearest degree and NM or km.]] -routines.tostringBR = function(az, dist, alt, metric) - az = routines.utils.round(routines.utils.toDegree(az), 0) - - if metric then - dist = routines.utils.round(dist/1000, 2) - else - dist = routines.utils.round(routines.utils.metersToNM(dist), 2) - end - - local s = string.format('%03d', az) .. ' for ' .. dist - - if alt then - if metric then - s = s .. ' at ' .. routines.utils.round(alt, 0) - else - s = s .. ' at ' .. routines.utils.round(routines.utils.metersToFeet(alt), 0) - end - end - return s -end - -routines.getNorthCorrection = function(point) --gets the correction needed for true north - if not point.z then --Vec2; convert to Vec3 - point.z = point.y - point.y = 0 - end - local lat, lon = coord.LOtoLL(point) - local north_posit = coord.LLtoLO(lat + 1, lon) - return math.atan2(north_posit.z - point.z, north_posit.x - point.x) -end - - --- the main area -do - -- THE MAIN FUNCTION -- Accessed 100 times/sec. - routines.main = function() - timer.scheduleFunction(routines.main, {}, timer.getTime() + 2) --reschedule first in case of Lua error - ---------------------------------------------------------------------------------------------------------- - --area to add new stuff in - - routines.do_scheduled_functions() - end -- end of routines.main - - timer.scheduleFunction(routines.main, {}, timer.getTime() + 2) - -end - - -do - local idNum = 0 - - --Simplified event handler - routines.addEventHandler = function(f) --id is optional! - local handler = {} - idNum = idNum + 1 - handler.id = idNum - handler.f = f - handler.onEvent = function(self, event) - self.f(event) - end - world.addEventHandler(handler) - end - - routines.removeEventHandler = function(id) - for key, handler in pairs(world.eventHandlers) do - if handler.id and handler.id == id then - world.eventHandlers[key] = nil - return true - end - end - return false - end -end - --- need to return a Vec3 or Vec2? -function routines.getRandPointInCircle(point, radius, innerRadius) - local theta = 2*math.pi*math.random() - local rad = math.random() + math.random() - if rad > 1 then - rad = 2 - rad - end - - local radMult - if innerRadius and innerRadius <= radius then - radMult = (radius - innerRadius)*rad + innerRadius - else - radMult = radius*rad - end - - if not point.z then --might as well work with vec2/3 - point.z = point.y - end - - local rndCoord - if radius > 0 then - rndCoord = {x = math.cos(theta)*radMult + point.x, y = math.sin(theta)*radMult + point.z} - else - rndCoord = {x = point.x, y = point.z} - end - return rndCoord -end - -routines.goRoute = function(group, path) - local misTask = { - id = 'Mission', - params = { - route = { - points = routines.utils.deepCopy(path), - }, - }, - } - if type(group) == 'string' then - group = Group.getByName(group) - end - local groupCon = group:getController() - if groupCon then - groupCon:setTask(misTask) - return true - end - - Controller.setTask(groupCon, misTask) - return false -end - - --- Useful atomic functions from mist, ported. - -routines.ground = {} -routines.fixedWing = {} -routines.heli = {} - -routines.ground.buildWP = function(point, overRideForm, overRideSpeed) - - local wp = {} - wp.x = point.x - - if point.z then - wp.y = point.z - else - wp.y = point.y - end - local form, speed - - if point.speed and not overRideSpeed then - wp.speed = point.speed - elseif type(overRideSpeed) == 'number' then - wp.speed = overRideSpeed - else - wp.speed = routines.utils.kmphToMps(20) - end - - if point.form and not overRideForm then - form = point.form - else - form = overRideForm - end - - if not form then - wp.action = 'Cone' - else - form = string.lower(form) - if form == 'off_road' or form == 'off road' then - wp.action = 'Off Road' - elseif form == 'on_road' or form == 'on road' then - wp.action = 'On Road' - elseif form == 'rank' or form == 'line_abrest' or form == 'line abrest' or form == 'lineabrest'then - wp.action = 'Rank' - elseif form == 'cone' then - wp.action = 'Cone' - elseif form == 'diamond' then - wp.action = 'Diamond' - elseif form == 'vee' then - wp.action = 'Vee' - elseif form == 'echelon_left' or form == 'echelon left' or form == 'echelonl' then - wp.action = 'EchelonL' - elseif form == 'echelon_right' or form == 'echelon right' or form == 'echelonr' then - wp.action = 'EchelonR' - else - wp.action = 'Cone' -- if nothing matched - end - end - - wp.type = 'Turning Point' - - return wp - -end - -routines.fixedWing.buildWP = function(point, WPtype, speed, alt, altType) - - local wp = {} - wp.x = point.x - - if point.z then - wp.y = point.z - else - wp.y = point.y - end - - if alt and type(alt) == 'number' then - wp.alt = alt - else - wp.alt = 2000 - end - - if altType then - altType = string.lower(altType) - if altType == 'radio' or 'agl' then - wp.alt_type = 'RADIO' - elseif altType == 'baro' or 'asl' then - wp.alt_type = 'BARO' - end - else - wp.alt_type = 'RADIO' - end - - if point.speed then - speed = point.speed - end - - if point.type then - WPtype = point.type - end - - if not speed then - wp.speed = routines.utils.kmphToMps(500) - else - wp.speed = speed - end - - if not WPtype then - wp.action = 'Turning Point' - else - WPtype = string.lower(WPtype) - if WPtype == 'flyover' or WPtype == 'fly over' or WPtype == 'fly_over' then - wp.action = 'Fly Over Point' - elseif WPtype == 'turningpoint' or WPtype == 'turning point' or WPtype == 'turning_point' then - wp.action = 'Turning Point' - else - wp.action = 'Turning Point' - end - end - - wp.type = 'Turning Point' - return wp -end - -routines.heli.buildWP = function(point, WPtype, speed, alt, altType) - - local wp = {} - wp.x = point.x - - if point.z then - wp.y = point.z - else - wp.y = point.y - end - - if alt and type(alt) == 'number' then - wp.alt = alt - else - wp.alt = 500 - end - - if altType then - altType = string.lower(altType) - if altType == 'radio' or 'agl' then - wp.alt_type = 'RADIO' - elseif altType == 'baro' or 'asl' then - wp.alt_type = 'BARO' - end - else - wp.alt_type = 'RADIO' - end - - if point.speed then - speed = point.speed - end - - if point.type then - WPtype = point.type - end - - if not speed then - wp.speed = routines.utils.kmphToMps(200) - else - wp.speed = speed - end - - if not WPtype then - wp.action = 'Turning Point' - else - WPtype = string.lower(WPtype) - if WPtype == 'flyover' or WPtype == 'fly over' or WPtype == 'fly_over' then - wp.action = 'Fly Over Point' - elseif WPtype == 'turningpoint' or WPtype == 'turning point' or WPtype == 'turning_point' then - wp.action = 'Turning Point' - else - wp.action = 'Turning Point' - end - end - - wp.type = 'Turning Point' - return wp -end - -routines.groupToRandomPoint = function(vars) - local group = vars.group --Required - local point = vars.point --required - local radius = vars.radius or 0 - local innerRadius = vars.innerRadius - local form = vars.form or 'Cone' - local heading = vars.heading or math.random()*2*math.pi - local headingDegrees = vars.headingDegrees - local speed = vars.speed or routines.utils.kmphToMps(20) - - - local useRoads - if not vars.disableRoads then - useRoads = true - else - useRoads = false - end - - local path = {} - - if headingDegrees then - heading = headingDegrees*math.pi/180 - end - - if heading >= 2*math.pi then - heading = heading - 2*math.pi - end - - local rndCoord = routines.getRandPointInCircle(point, radius, innerRadius) - - local offset = {} - local posStart = routines.getLeadPos(group) - - offset.x = routines.utils.round(math.sin(heading - (math.pi/2)) * 50 + rndCoord.x, 3) - offset.z = routines.utils.round(math.cos(heading + (math.pi/2)) * 50 + rndCoord.y, 3) - path[#path + 1] = routines.ground.buildWP(posStart, form, speed) - - - if useRoads == true and ((point.x - posStart.x)^2 + (point.z - posStart.z)^2)^0.5 > radius * 1.3 then - path[#path + 1] = routines.ground.buildWP({['x'] = posStart.x + 11, ['z'] = posStart.z + 11}, 'off_road', speed) - path[#path + 1] = routines.ground.buildWP(posStart, 'on_road', speed) - path[#path + 1] = routines.ground.buildWP(offset, 'on_road', speed) - else - path[#path + 1] = routines.ground.buildWP({['x'] = posStart.x + 25, ['z'] = posStart.z + 25}, form, speed) - end - - path[#path + 1] = routines.ground.buildWP(offset, form, speed) - path[#path + 1] = routines.ground.buildWP(rndCoord, form, speed) - - routines.goRoute(group, path) - - return -end - -routines.groupRandomDistSelf = function(gpData, dist, form, heading, speed) - local pos = routines.getLeadPos(gpData) - local fakeZone = {} - fakeZone.radius = dist or math.random(300, 1000) - fakeZone.point = {x = pos.x, y, pos.y, z = pos.z} - routines.groupToRandomZone(gpData, fakeZone, form, heading, speed) - - return -end - -routines.groupToRandomZone = function(gpData, zone, form, heading, speed) - if type(gpData) == 'string' then - gpData = Group.getByName(gpData) - end - - if type(zone) == 'string' then - zone = trigger.misc.getZone(zone) - elseif type(zone) == 'table' and not zone.radius then - zone = trigger.misc.getZone(zone[math.random(1, #zone)]) - end - - if speed then - speed = routines.utils.kmphToMps(speed) - end - - local vars = {} - vars.group = gpData - vars.radius = zone.radius - vars.form = form - vars.headingDegrees = heading - vars.speed = speed - vars.point = routines.utils.zoneToVec3(zone) - - routines.groupToRandomPoint(vars) - - return -end - -routines.isTerrainValid = function(coord, terrainTypes) -- vec2/3 and enum or table of acceptable terrain types - if coord.z then - coord.y = coord.z - end - local typeConverted = {} - - if type(terrainTypes) == 'string' then -- if its a string it does this check - for constId, constData in pairs(land.SurfaceType) do - if string.lower(constId) == string.lower(terrainTypes) or string.lower(constData) == string.lower(terrainTypes) then - table.insert(typeConverted, constId) - end - end - elseif type(terrainTypes) == 'table' then -- if its a table it does this check - for typeId, typeData in pairs(terrainTypes) do - for constId, constData in pairs(land.SurfaceType) do - if string.lower(constId) == string.lower(typeData) or string.lower(constData) == string.lower(typeId) then - table.insert(typeConverted, constId) - end - end - end - end - for validIndex, validData in pairs(typeConverted) do - if land.getSurfaceType(coord) == land.SurfaceType[validData] then - return true - end - end - return false -end - -routines.groupToPoint = function(gpData, point, form, heading, speed, useRoads) - if type(point) == 'string' then - point = trigger.misc.getZone(point) - end - if speed then - speed = routines.utils.kmphToMps(speed) - end - - local vars = {} - vars.group = gpData - vars.form = form - vars.headingDegrees = heading - vars.speed = speed - vars.disableRoads = useRoads - vars.point = routines.utils.zoneToVec3(point) - routines.groupToRandomPoint(vars) - - return -end - - -routines.getLeadPos = function(group) - if type(group) == 'string' then -- group name - group = Group.getByName(group) - end - - local units = group:getUnits() - - local leader = units[1] - if not leader then -- SHOULD be good, but if there is a bug, this code future-proofs it then. - local lowestInd = math.huge - for ind, unit in pairs(units) do - if ind < lowestInd then - lowestInd = ind - leader = unit - end - end - end - if leader and Unit.isExist(leader) then -- maybe a little too paranoid now... - return leader:getPosition().p - end -end - ---[[ vars for routines.getMGRSString: -vars.units - table of unit names (NOT unitNameTable- maybe this should change). -vars.acc - integer between 0 and 5, inclusive -]] -routines.getMGRSString = function(vars) - local units = vars.units - local acc = vars.acc or 5 - local avgPos = routines.getAvgPos(units) - if avgPos then - return routines.tostringMGRS(coord.LLtoMGRS(coord.LOtoLL(avgPos)), acc) - end -end - ---[[ vars for routines.getLLString -vars.units - table of unit names (NOT unitNameTable- maybe this should change). -vars.acc - integer, number of numbers after decimal place -vars.DMS - if true, output in degrees, minutes, seconds. Otherwise, output in degrees, minutes. - - -]] -routines.getLLString = function(vars) - local units = vars.units - local acc = vars.acc or 3 - local DMS = vars.DMS - local avgPos = routines.getAvgPos(units) - if avgPos then - local lat, lon = coord.LOtoLL(avgPos) - return routines.tostringLL(lat, lon, acc, DMS) - end -end - ---[[ -vars.zone - table of a zone name. -vars.ref - vec3 ref point, maybe overload for vec2 as well? -vars.alt - boolean, if used, includes altitude in string -vars.metric - boolean, gives distance in km instead of NM. -]] -routines.getBRStringZone = function(vars) - local zone = trigger.misc.getZone( vars.zone ) - local ref = routines.utils.makeVec3(vars.ref, 0) -- turn it into Vec3 if it is not already. - local alt = vars.alt - local metric = vars.metric - if zone then - local vec = {x = zone.point.x - ref.x, y = zone.point.y - ref.y, z = zone.point.z - ref.z} - local dir = routines.utils.getDir(vec, ref) - local dist = routines.utils.get2DDist(zone.point, ref) - if alt then - alt = zone.y - end - return routines.tostringBR(dir, dist, alt, metric) - else - env.info( 'routines.getBRStringZone: error: zone is nil' ) - end -end - ---[[ -vars.units- table of unit names (NOT unitNameTable- maybe this should change). -vars.ref - vec3 ref point, maybe overload for vec2 as well? -vars.alt - boolean, if used, includes altitude in string -vars.metric - boolean, gives distance in km instead of NM. -]] -routines.getBRString = function(vars) - local units = vars.units - local ref = routines.utils.makeVec3(vars.ref, 0) -- turn it into Vec3 if it is not already. - local alt = vars.alt - local metric = vars.metric - local avgPos = routines.getAvgPos(units) - if avgPos then - local vec = {x = avgPos.x - ref.x, y = avgPos.y - ref.y, z = avgPos.z - ref.z} - local dir = routines.utils.getDir(vec, ref) - local dist = routines.utils.get2DDist(avgPos, ref) - if alt then - alt = avgPos.y - end - return routines.tostringBR(dir, dist, alt, metric) - end -end - - --- Returns the Vec3 coordinates of the average position of the concentration of units most in the heading direction. ---[[ vars for routines.getLeadingPos: -vars.units - table of unit names -vars.heading - direction -vars.radius - number -vars.headingDegrees - boolean, switches heading to degrees -]] -routines.getLeadingPos = function(vars) - local units = vars.units - local heading = vars.heading - local radius = vars.radius - if vars.headingDegrees then - heading = routines.utils.toRadian(vars.headingDegrees) - end - - local unitPosTbl = {} - for i = 1, #units do - local unit = Unit.getByName(units[i]) - if unit and unit:isExist() then - unitPosTbl[#unitPosTbl + 1] = unit:getPosition().p - end - end - if #unitPosTbl > 0 then -- one more more units found. - -- first, find the unit most in the heading direction - local maxPos = -math.huge - - local maxPosInd -- maxPos - the furthest in direction defined by heading; maxPosInd = - for i = 1, #unitPosTbl do - local rotatedVec2 = routines.vec.rotateVec2(routines.utils.makeVec2(unitPosTbl[i]), heading) - if (not maxPos) or maxPos < rotatedVec2.x then - maxPos = rotatedVec2.x - maxPosInd = i - end - end - - --now, get all the units around this unit... - local avgPos - if radius then - local maxUnitPos = unitPosTbl[maxPosInd] - local avgx, avgy, avgz, totNum = 0, 0, 0, 0 - for i = 1, #unitPosTbl do - if routines.utils.get2DDist(maxUnitPos, unitPosTbl[i]) <= radius then - avgx = avgx + unitPosTbl[i].x - avgy = avgy + unitPosTbl[i].y - avgz = avgz + unitPosTbl[i].z - totNum = totNum + 1 - end - end - avgPos = { x = avgx/totNum, y = avgy/totNum, z = avgz/totNum} - else - avgPos = unitPosTbl[maxPosInd] - end - - return avgPos - end -end - - ---[[ vars for routines.getLeadingMGRSString: -vars.units - table of unit names -vars.heading - direction -vars.radius - number -vars.headingDegrees - boolean, switches heading to degrees -vars.acc - number, 0 to 5. -]] -routines.getLeadingMGRSString = function(vars) - local pos = routines.getLeadingPos(vars) - if pos then - local acc = vars.acc or 5 - return routines.tostringMGRS(coord.LLtoMGRS(coord.LOtoLL(pos)), acc) - end -end - ---[[ vars for routines.getLeadingLLString: -vars.units - table of unit names -vars.heading - direction, number -vars.radius - number -vars.headingDegrees - boolean, switches heading to degrees -vars.acc - number of digits after decimal point (can be negative) -vars.DMS - boolean, true if you want DMS. -]] -routines.getLeadingLLString = function(vars) - local pos = routines.getLeadingPos(vars) - if pos then - local acc = vars.acc or 3 - local DMS = vars.DMS - local lat, lon = coord.LOtoLL(pos) - return routines.tostringLL(lat, lon, acc, DMS) - end -end - - - ---[[ vars for routines.getLeadingBRString: -vars.units - table of unit names -vars.heading - direction, number -vars.radius - number -vars.headingDegrees - boolean, switches heading to degrees -vars.metric - boolean, if true, use km instead of NM. -vars.alt - boolean, if true, include altitude. -vars.ref - vec3/vec2 reference point. -]] -routines.getLeadingBRString = function(vars) - local pos = routines.getLeadingPos(vars) - if pos then - local ref = vars.ref - local alt = vars.alt - local metric = vars.metric - - local vec = {x = pos.x - ref.x, y = pos.y - ref.y, z = pos.z - ref.z} - local dir = routines.utils.getDir(vec, ref) - local dist = routines.utils.get2DDist(pos, ref) - if alt then - alt = pos.y - end - return routines.tostringBR(dir, dist, alt, metric) - end -end - ---[[ vars for routines.message.add - vars.text = 'Hello World' - vars.displayTime = 20 - vars.msgFor = {coa = {'red'}, countries = {'Ukraine', 'Georgia'}, unitTypes = {'A-10C'}} - -]] - ---[[ vars for routines.msgMGRS -vars.units - table of unit names (NOT unitNameTable- maybe this should change). -vars.acc - integer between 0 and 5, inclusive -vars.text - text in the message -vars.displayTime - self explanatory -vars.msgFor - scope -]] -routines.msgMGRS = function(vars) - local units = vars.units - local acc = vars.acc - local text = vars.text - local displayTime = vars.displayTime - local msgFor = vars.msgFor - - local s = routines.getMGRSString{units = units, acc = acc} - local newText - if string.find(text, '%%s') then -- look for %s - newText = string.format(text, s) -- insert the coordinates into the message - else -- else, just append to the end. - newText = text .. s - end - - routines.message.add{ - text = newText, - displayTime = displayTime, - msgFor = msgFor - } -end - ---[[ vars for routines.msgLL -vars.units - table of unit names (NOT unitNameTable- maybe this should change) (Yes). -vars.acc - integer, number of numbers after decimal place -vars.DMS - if true, output in degrees, minutes, seconds. Otherwise, output in degrees, minutes. -vars.text - text in the message -vars.displayTime - self explanatory -vars.msgFor - scope -]] -routines.msgLL = function(vars) - local units = vars.units -- technically, I don't really need to do this, but it helps readability. - local acc = vars.acc - local DMS = vars.DMS - local text = vars.text - local displayTime = vars.displayTime - local msgFor = vars.msgFor - - local s = routines.getLLString{units = units, acc = acc, DMS = DMS} - local newText - if string.find(text, '%%s') then -- look for %s - newText = string.format(text, s) -- insert the coordinates into the message - else -- else, just append to the end. - newText = text .. s - end - - routines.message.add{ - text = newText, - displayTime = displayTime, - msgFor = msgFor - } - -end - - ---[[ -vars.units- table of unit names (NOT unitNameTable- maybe this should change). -vars.ref - vec3 ref point, maybe overload for vec2 as well? -vars.alt - boolean, if used, includes altitude in string -vars.metric - boolean, gives distance in km instead of NM. -vars.text - text of the message -vars.displayTime -vars.msgFor - scope -]] -routines.msgBR = function(vars) - local units = vars.units -- technically, I don't really need to do this, but it helps readability. - local ref = vars.ref -- vec2/vec3 will be handled in routines.getBRString - local alt = vars.alt - local metric = vars.metric - local text = vars.text - local displayTime = vars.displayTime - local msgFor = vars.msgFor - - local s = routines.getBRString{units = units, ref = ref, alt = alt, metric = metric} - local newText - if string.find(text, '%%s') then -- look for %s - newText = string.format(text, s) -- insert the coordinates into the message - else -- else, just append to the end. - newText = text .. s - end - - routines.message.add{ - text = newText, - displayTime = displayTime, - msgFor = msgFor - } - -end - - --------------------------------------------------------------------------------------------- --- basically, just sub-types of routines.msgBR... saves folks the work of getting the ref point. ---[[ -vars.units- table of unit names (NOT unitNameTable- maybe this should change). -vars.ref - string red, blue -vars.alt - boolean, if used, includes altitude in string -vars.metric - boolean, gives distance in km instead of NM. -vars.text - text of the message -vars.displayTime -vars.msgFor - scope -]] -routines.msgBullseye = function(vars) - if string.lower(vars.ref) == 'red' then - vars.ref = routines.DBs.missionData.bullseye.red - routines.msgBR(vars) - elseif string.lower(vars.ref) == 'blue' then - vars.ref = routines.DBs.missionData.bullseye.blue - routines.msgBR(vars) - end -end - ---[[ -vars.units- table of unit names (NOT unitNameTable- maybe this should change). -vars.ref - unit name of reference point -vars.alt - boolean, if used, includes altitude in string -vars.metric - boolean, gives distance in km instead of NM. -vars.text - text of the message -vars.displayTime -vars.msgFor - scope -]] - -routines.msgBRA = function(vars) - if Unit.getByName(vars.ref) then - vars.ref = Unit.getByName(vars.ref):getPosition().p - if not vars.alt then - vars.alt = true - end - routines.msgBR(vars) - end -end --------------------------------------------------------------------------------------------- - ---[[ vars for routines.msgLeadingMGRS: -vars.units - table of unit names -vars.heading - direction -vars.radius - number -vars.headingDegrees - boolean, switches heading to degrees (optional) -vars.acc - number, 0 to 5. -vars.text - text of the message -vars.displayTime -vars.msgFor - scope -]] -routines.msgLeadingMGRS = function(vars) - local units = vars.units -- technically, I don't really need to do this, but it helps readability. - local heading = vars.heading - local radius = vars.radius - local headingDegrees = vars.headingDegrees - local acc = vars.acc - local text = vars.text - local displayTime = vars.displayTime - local msgFor = vars.msgFor - - local s = routines.getLeadingMGRSString{units = units, heading = heading, radius = radius, headingDegrees = headingDegrees, acc = acc} - local newText - if string.find(text, '%%s') then -- look for %s - newText = string.format(text, s) -- insert the coordinates into the message - else -- else, just append to the end. - newText = text .. s - end - - routines.message.add{ - text = newText, - displayTime = displayTime, - msgFor = msgFor - } - - -end ---[[ vars for routines.msgLeadingLL: -vars.units - table of unit names -vars.heading - direction, number -vars.radius - number -vars.headingDegrees - boolean, switches heading to degrees (optional) -vars.acc - number of digits after decimal point (can be negative) -vars.DMS - boolean, true if you want DMS. (optional) -vars.text - text of the message -vars.displayTime -vars.msgFor - scope -]] -routines.msgLeadingLL = function(vars) - local units = vars.units -- technically, I don't really need to do this, but it helps readability. - local heading = vars.heading - local radius = vars.radius - local headingDegrees = vars.headingDegrees - local acc = vars.acc - local DMS = vars.DMS - local text = vars.text - local displayTime = vars.displayTime - local msgFor = vars.msgFor - - local s = routines.getLeadingLLString{units = units, heading = heading, radius = radius, headingDegrees = headingDegrees, acc = acc, DMS = DMS} - local newText - if string.find(text, '%%s') then -- look for %s - newText = string.format(text, s) -- insert the coordinates into the message - else -- else, just append to the end. - newText = text .. s - end - - routines.message.add{ - text = newText, - displayTime = displayTime, - msgFor = msgFor - } - -end - ---[[ -vars.units - table of unit names -vars.heading - direction, number -vars.radius - number -vars.headingDegrees - boolean, switches heading to degrees (optional) -vars.metric - boolean, if true, use km instead of NM. (optional) -vars.alt - boolean, if true, include altitude. (optional) -vars.ref - vec3/vec2 reference point. -vars.text - text of the message -vars.displayTime -vars.msgFor - scope -]] -routines.msgLeadingBR = function(vars) - local units = vars.units -- technically, I don't really need to do this, but it helps readability. - local heading = vars.heading - local radius = vars.radius - local headingDegrees = vars.headingDegrees - local metric = vars.metric - local alt = vars.alt - local ref = vars.ref -- vec2/vec3 will be handled in routines.getBRString - local text = vars.text - local displayTime = vars.displayTime - local msgFor = vars.msgFor - - local s = routines.getLeadingBRString{units = units, heading = heading, radius = radius, headingDegrees = headingDegrees, metric = metric, alt = alt, ref = ref} - local newText - if string.find(text, '%%s') then -- look for %s - newText = string.format(text, s) -- insert the coordinates into the message - else -- else, just append to the end. - newText = text .. s - end - - routines.message.add{ - text = newText, - displayTime = displayTime, - msgFor = msgFor - } -end - - -function spairs(t, order) - -- collect the keys - local keys = {} - for k in pairs(t) do keys[#keys+1] = k end - - -- if order function given, sort by it by passing the table and keys a, b, - -- otherwise just sort the keys - if order then - table.sort(keys, function(a,b) return order(t, a, b) end) - else - table.sort(keys) - end - - -- return the iterator function - local i = 0 - return function() - i = i + 1 - if keys[i] then - return keys[i], t[keys[i]] - end - end -end - - -function routines.IsPartOfGroupInZones( CargoGroup, LandingZones ) ---trace.f() - - local CurrentZoneID = nil - - if CargoGroup then - local CargoUnits = CargoGroup:getUnits() - for CargoUnitID, CargoUnit in pairs( CargoUnits ) do - if CargoUnit and CargoUnit:getLife() >= 1.0 then - CurrentZoneID = routines.IsUnitInZones( CargoUnit, LandingZones ) - if CurrentZoneID then - break - end - end - end - end - ---trace.r( "", "", { CurrentZoneID } ) - return CurrentZoneID -end - - - -function routines.IsUnitInZones( TransportUnit, LandingZones ) ---trace.f("", "routines.IsUnitInZones" ) - - local TransportZoneResult = nil - local TransportZonePos = nil - local TransportZone = nil - - -- fill-up some local variables to support further calculations to determine location of units within the zone. - if TransportUnit then - local TransportUnitPos = TransportUnit:getPosition().p - if type( LandingZones ) == "table" then - for LandingZoneID, LandingZoneName in pairs( LandingZones ) do - TransportZone = trigger.misc.getZone( LandingZoneName ) - if TransportZone then - TransportZonePos = {radius = TransportZone.radius, x = TransportZone.point.x, y = TransportZone.point.y, z = TransportZone.point.z} - if ((( TransportUnitPos.x - TransportZonePos.x)^2 + (TransportUnitPos.z - TransportZonePos.z)^2)^0.5 <= TransportZonePos.radius) then - TransportZoneResult = LandingZoneID - break - end - end - end - else - TransportZone = trigger.misc.getZone( LandingZones ) - TransportZonePos = {radius = TransportZone.radius, x = TransportZone.point.x, y = TransportZone.point.y, z = TransportZone.point.z} - if ((( TransportUnitPos.x - TransportZonePos.x)^2 + (TransportUnitPos.z - TransportZonePos.z)^2)^0.5 <= TransportZonePos.radius) then - TransportZoneResult = 1 - end - end - if TransportZoneResult then - --trace.i( "routines", "TransportZone:" .. TransportZoneResult ) - else - --trace.i( "routines", "TransportZone:nil logic" ) - end - return TransportZoneResult - else - --trace.i( "routines", "TransportZone:nil hard" ) - return nil - end -end - -function routines.IsUnitNearZonesRadius( TransportUnit, LandingZones, ZoneRadius ) ---trace.f("", "routines.IsUnitInZones" ) - - local TransportZoneResult = nil - local TransportZonePos = nil - local TransportZone = nil - - -- fill-up some local variables to support further calculations to determine location of units within the zone. - if TransportUnit then - local TransportUnitPos = TransportUnit:getPosition().p - if type( LandingZones ) == "table" then - for LandingZoneID, LandingZoneName in pairs( LandingZones ) do - TransportZone = trigger.misc.getZone( LandingZoneName ) - if TransportZone then - TransportZonePos = {radius = TransportZone.radius, x = TransportZone.point.x, y = TransportZone.point.y, z = TransportZone.point.z} - if ((( TransportUnitPos.x - TransportZonePos.x)^2 + (TransportUnitPos.z - TransportZonePos.z)^2)^0.5 <= ZoneRadius ) then - TransportZoneResult = LandingZoneID - break - end - end - end - else - TransportZone = trigger.misc.getZone( LandingZones ) - TransportZonePos = {radius = TransportZone.radius, x = TransportZone.point.x, y = TransportZone.point.y, z = TransportZone.point.z} - if ((( TransportUnitPos.x - TransportZonePos.x)^2 + (TransportUnitPos.z - TransportZonePos.z)^2)^0.5 <= ZoneRadius ) then - TransportZoneResult = 1 - end - end - if TransportZoneResult then - --trace.i( "routines", "TransportZone:" .. TransportZoneResult ) - else - --trace.i( "routines", "TransportZone:nil logic" ) - end - return TransportZoneResult - else - --trace.i( "routines", "TransportZone:nil hard" ) - return nil - end -end - - -function routines.IsStaticInZones( TransportStatic, LandingZones ) ---trace.f() - - local TransportZoneResult = nil - local TransportZonePos = nil - local TransportZone = nil - - -- fill-up some local variables to support further calculations to determine location of units within the zone. - local TransportStaticPos = TransportStatic:getPosition().p - if type( LandingZones ) == "table" then - for LandingZoneID, LandingZoneName in pairs( LandingZones ) do - TransportZone = trigger.misc.getZone( LandingZoneName ) - if TransportZone then - TransportZonePos = {radius = TransportZone.radius, x = TransportZone.point.x, y = TransportZone.point.y, z = TransportZone.point.z} - if ((( TransportStaticPos.x - TransportZonePos.x)^2 + (TransportStaticPos.z - TransportZonePos.z)^2)^0.5 <= TransportZonePos.radius) then - TransportZoneResult = LandingZoneID - break - end - end - end - else - TransportZone = trigger.misc.getZone( LandingZones ) - TransportZonePos = {radius = TransportZone.radius, x = TransportZone.point.x, y = TransportZone.point.y, z = TransportZone.point.z} - if ((( TransportStaticPos.x - TransportZonePos.x)^2 + (TransportStaticPos.z - TransportZonePos.z)^2)^0.5 <= TransportZonePos.radius) then - TransportZoneResult = 1 - end - end - ---trace.r( "", "", { TransportZoneResult } ) - return TransportZoneResult -end - - -function routines.IsUnitInRadius( CargoUnit, ReferencePosition, Radius ) ---trace.f() - - local Valid = true - - -- fill-up some local variables to support further calculations to determine location of units within the zone. - local CargoPos = CargoUnit:getPosition().p - local ReferenceP = ReferencePosition.p - - if (((CargoPos.x - ReferenceP.x)^2 + (CargoPos.z - ReferenceP.z)^2)^0.5 <= Radius) then - else - Valid = false - end - - return Valid -end - -function routines.IsPartOfGroupInRadius( CargoGroup, ReferencePosition, Radius ) ---trace.f() - - local Valid = true - - Valid = routines.ValidateGroup( CargoGroup, "CargoGroup", Valid ) - - -- fill-up some local variables to support further calculations to determine location of units within the zone - local CargoUnits = CargoGroup:getUnits() - for CargoUnitId, CargoUnit in pairs( CargoUnits ) do - local CargoUnitPos = CargoUnit:getPosition().p --- env.info( 'routines.IsPartOfGroupInRadius: CargoUnitPos.x = ' .. CargoUnitPos.x .. ' CargoUnitPos.z = ' .. CargoUnitPos.z ) - local ReferenceP = ReferencePosition.p --- env.info( 'routines.IsPartOfGroupInRadius: ReferenceGroupPos.x = ' .. ReferenceGroupPos.x .. ' ReferenceGroupPos.z = ' .. ReferenceGroupPos.z ) - - if ((( CargoUnitPos.x - ReferenceP.x)^2 + (CargoUnitPos.z - ReferenceP.z)^2)^0.5 <= Radius) then - else - Valid = false - break - end - end - - return Valid -end - - -function routines.ValidateString( Variable, VariableName, Valid ) ---trace.f() - - if type( Variable ) == "string" then - if Variable == "" then - error( "routines.ValidateString: error: " .. VariableName .. " must be filled out!" ) - Valid = false - end - else - error( "routines.ValidateString: error: " .. VariableName .. " is not a string." ) - Valid = false - end - ---trace.r( "", "", { Valid } ) - return Valid -end - -function routines.ValidateNumber( Variable, VariableName, Valid ) ---trace.f() - - if type( Variable ) == "number" then - else - error( "routines.ValidateNumber: error: " .. VariableName .. " is not a number." ) - Valid = false - end - ---trace.r( "", "", { Valid } ) - return Valid - -end - -function routines.ValidateGroup( Variable, VariableName, Valid ) ---trace.f() - - if Variable == nil then - error( "routines.ValidateGroup: error: " .. VariableName .. " is a nil value!" ) - Valid = false - end - ---trace.r( "", "", { Valid } ) - return Valid -end - -function routines.ValidateZone( LandingZones, VariableName, Valid ) ---trace.f() - - if LandingZones == nil then - error( "routines.ValidateGroup: error: " .. VariableName .. " is a nil value!" ) - Valid = false - end - - if type( LandingZones ) == "table" then - for LandingZoneID, LandingZoneName in pairs( LandingZones ) do - if trigger.misc.getZone( LandingZoneName ) == nil then - error( "routines.ValidateGroup: error: Zone " .. LandingZoneName .. " does not exist!" ) - Valid = false - break - end - end - else - if trigger.misc.getZone( LandingZones ) == nil then - error( "routines.ValidateGroup: error: Zone " .. LandingZones .. " does not exist!" ) - Valid = false - end - end - ---trace.r( "", "", { Valid } ) - return Valid -end - -function routines.ValidateEnumeration( Variable, VariableName, Enum, Valid ) ---trace.f() - - local ValidVariable = false - - for EnumId, EnumData in pairs( Enum ) do - if Variable == EnumData then - ValidVariable = true - break - end - end - - if ValidVariable then - else - error( 'TransportValidateEnum: " .. VariableName .. " is not a valid type.' .. Variable ) - Valid = false - end - ---trace.r( "", "", { Valid } ) - return Valid -end - -function routines.getGroupRoute(groupIdent, task) -- same as getGroupPoints but returns speed and formation type along with vec2 of point} - -- refactor to search by groupId and allow groupId and groupName as inputs - local gpId = groupIdent - if type(groupIdent) == 'string' and not tonumber(groupIdent) then - gpId = _DATABASE.Templates.Groups[groupIdent].groupId - end - - for coa_name, coa_data in pairs(env.mission.coalition) do - if (coa_name == 'red' or coa_name == 'blue') and type(coa_data) == 'table' then - if coa_data.country then --there is a country table - for cntry_id, cntry_data in pairs(coa_data.country) do - for obj_type_name, obj_type_data in pairs(cntry_data) do - if obj_type_name == "helicopter" or obj_type_name == "ship" or obj_type_name == "plane" or obj_type_name == "vehicle" then -- only these types have points - if ((type(obj_type_data) == 'table') and obj_type_data.group and (type(obj_type_data.group) == 'table') and (#obj_type_data.group > 0)) then --there's a group! - for group_num, group_data in pairs(obj_type_data.group) do - if group_data and group_data.groupId == gpId then -- this is the group we are looking for - if group_data.route and group_data.route.points and #group_data.route.points > 0 then - local points = {} - - for point_num, point in pairs(group_data.route.points) do - local routeData = {} - if not point.point then - routeData.x = point.x - routeData.y = point.y - else - routeData.point = point.point --it's possible that the ME could move to the point = Vec2 notation. - end - routeData.form = point.action - routeData.speed = point.speed - routeData.alt = point.alt - routeData.alt_type = point.alt_type - routeData.airdromeId = point.airdromeId - routeData.helipadId = point.helipadId - routeData.type = point.type - routeData.action = point.action - if task then - routeData.task = point.task - end - points[point_num] = routeData - end - - return points - end - return - end --if group_data and group_data.name and group_data.name == 'groupname' - end --for group_num, group_data in pairs(obj_type_data.group) do - end --if ((type(obj_type_data) == 'table') and obj_type_data.group and (type(obj_type_data.group) == 'table') and (#obj_type_data.group > 0)) then - end --if obj_type_name == "helicopter" or obj_type_name == "ship" or obj_type_name == "plane" or obj_type_name == "vehicle" or obj_type_name == "static" then - end --for obj_type_name, obj_type_data in pairs(cntry_data) do - end --for cntry_id, cntry_data in pairs(coa_data.country) do - end --if coa_data.country then --there is a country table - end --if coa_name == 'red' or coa_name == 'blue' and type(coa_data) == 'table' then - end --for coa_name, coa_data in pairs(mission.coalition) do -end - -routines.ground.patrolRoute = function(vars) - - - local tempRoute = {} - local useRoute = {} - local gpData = vars.gpData - if type(gpData) == 'string' then - gpData = Group.getByName(gpData) - end - - local useGroupRoute - if not vars.useGroupRoute then - useGroupRoute = vars.gpData - else - useGroupRoute = vars.useGroupRoute - end - local routeProvided = false - if not vars.route then - if useGroupRoute then - tempRoute = routines.getGroupRoute(useGroupRoute) - end - else - useRoute = vars.route - local posStart = routines.getLeadPos(gpData) - useRoute[1] = routines.ground.buildWP(posStart, useRoute[1].action, useRoute[1].speed) - routeProvided = true - end - - - local overRideSpeed = vars.speed or 'default' - local pType = vars.pType - local offRoadForm = vars.offRoadForm or 'default' - local onRoadForm = vars.onRoadForm or 'default' - - if routeProvided == false and #tempRoute > 0 then - local posStart = routines.getLeadPos(gpData) - - - useRoute[#useRoute + 1] = routines.ground.buildWP(posStart, offRoadForm, overRideSpeed) - for i = 1, #tempRoute do - local tempForm = tempRoute[i].action - local tempSpeed = tempRoute[i].speed - - if offRoadForm == 'default' then - tempForm = tempRoute[i].action - end - if onRoadForm == 'default' then - onRoadForm = 'On Road' - end - if (string.lower(tempRoute[i].action) == 'on road' or string.lower(tempRoute[i].action) == 'onroad' or string.lower(tempRoute[i].action) == 'on_road') then - tempForm = onRoadForm - else - tempForm = offRoadForm - end - - if type(overRideSpeed) == 'number' then - tempSpeed = overRideSpeed - end - - - useRoute[#useRoute + 1] = routines.ground.buildWP(tempRoute[i], tempForm, tempSpeed) - end - - if pType and string.lower(pType) == 'doubleback' then - local curRoute = routines.utils.deepCopy(useRoute) - for i = #curRoute, 2, -1 do - useRoute[#useRoute + 1] = routines.ground.buildWP(curRoute[i], curRoute[i].action, curRoute[i].speed) - end - end - - useRoute[1].action = useRoute[#useRoute].action -- make it so the first WP matches the last WP - end - - local cTask3 = {} - local newPatrol = {} - newPatrol.route = useRoute - newPatrol.gpData = gpData:getName() - cTask3[#cTask3 + 1] = 'routines.ground.patrolRoute(' - cTask3[#cTask3 + 1] = routines.utils.oneLineSerialize(newPatrol) - cTask3[#cTask3 + 1] = ')' - cTask3 = table.concat(cTask3) - local tempTask = { - id = 'WrappedAction', - params = { - action = { - id = 'Script', - params = { - command = cTask3, - - }, - }, - }, - } - - - useRoute[#useRoute].task = tempTask - routines.goRoute(gpData, useRoute) - - return -end - -routines.ground.patrol = function(gpData, pType, form, speed) - local vars = {} - - if type(gpData) == 'table' and gpData:getName() then - gpData = gpData:getName() - end - - vars.useGroupRoute = gpData - vars.gpData = gpData - vars.pType = pType - vars.offRoadForm = form - vars.speed = speed - - routines.ground.patrolRoute(vars) - - return -end - -function routines.GetUnitHeight( CheckUnit ) ---trace.f( "routines" ) - - local UnitPoint = CheckUnit:getPoint() - local UnitPosition = { x = UnitPoint.x, y = UnitPoint.z } - local UnitHeight = UnitPoint.y - - local LandHeight = land.getHeight( UnitPosition ) - - --env.info(( 'CarrierHeight: LandHeight = ' .. LandHeight .. ' CarrierHeight = ' .. CarrierHeight )) - - --trace.f( "routines", "Unit Height = " .. UnitHeight - LandHeight ) - - return UnitHeight - LandHeight - -end - - - -Su34Status = { status = {} } -boardMsgRed = { statusMsg = "" } -boardMsgAll = { timeMsg = "" } -SpawnSettings = {} -Su34MenuPath = {} -Su34Menus = 0 - - -function Su34AttackCarlVinson(groupName) ---trace.menu("", "Su34AttackCarlVinson") - local groupSu34 = Group.getByName( groupName ) - local controllerSu34 = groupSu34.getController(groupSu34) - local groupCarlVinson = Group.getByName("US Carl Vinson #001") - controllerSu34.setOption( controllerSu34, AI.Option.Air.id.ROE, AI.Option.Air.val.ROE.OPEN_FIRE ) - controllerSu34.setOption( controllerSu34, AI.Option.Air.id.REACTION_ON_THREAT, AI.Option.Air.val.REACTION_ON_THREAT.EVADE_FIRE ) - if groupCarlVinson ~= nil then - controllerSu34.pushTask(controllerSu34,{id = 'AttackGroup', params = { groupId = groupCarlVinson:getID(), expend = AI.Task.WeaponExpend.ALL, attackQtyLimit = true}}) - end - Su34Status.status[groupName] = 1 - MessageToRed( string.format('%s: ',groupName) .. 'Attacking carrier Carl Vinson. ', 10, 'RedStatus' .. groupName ) -end - -function Su34AttackWest(groupName) ---trace.f("","Su34AttackWest") - local groupSu34 = Group.getByName( groupName ) - local controllerSu34 = groupSu34.getController(groupSu34) - local groupShipWest1 = Group.getByName("US Ship West #001") - local groupShipWest2 = Group.getByName("US Ship West #002") - controllerSu34.setOption( controllerSu34, AI.Option.Air.id.ROE, AI.Option.Air.val.ROE.OPEN_FIRE ) - controllerSu34.setOption( controllerSu34, AI.Option.Air.id.REACTION_ON_THREAT, AI.Option.Air.val.REACTION_ON_THREAT.EVADE_FIRE ) - if groupShipWest1 ~= nil then - controllerSu34.pushTask(controllerSu34,{id = 'AttackGroup', params = { groupId = groupShipWest1:getID(), expend = AI.Task.WeaponExpend.ALL, attackQtyLimit = true}}) - end - if groupShipWest2 ~= nil then - controllerSu34.pushTask(controllerSu34,{id = 'AttackGroup', params = { groupId = groupShipWest2:getID(), expend = AI.Task.WeaponExpend.ALL, attackQtyLimit = true}}) - end - Su34Status.status[groupName] = 2 - MessageToRed( string.format('%s: ',groupName) .. 'Attacking invading ships in the west. ', 10, 'RedStatus' .. groupName ) -end - -function Su34AttackNorth(groupName) ---trace.menu("","Su34AttackNorth") - local groupSu34 = Group.getByName( groupName ) - local controllerSu34 = groupSu34.getController(groupSu34) - local groupShipNorth1 = Group.getByName("US Ship North #001") - local groupShipNorth2 = Group.getByName("US Ship North #002") - local groupShipNorth3 = Group.getByName("US Ship North #003") - controllerSu34.setOption( controllerSu34, AI.Option.Air.id.ROE, AI.Option.Air.val.ROE.OPEN_FIRE ) - controllerSu34.setOption( controllerSu34, AI.Option.Air.id.REACTION_ON_THREAT, AI.Option.Air.val.REACTION_ON_THREAT.EVADE_FIRE ) - if groupShipNorth1 ~= nil then - controllerSu34.pushTask(controllerSu34,{id = 'AttackGroup', params = { groupId = groupShipNorth1:getID(), expend = AI.Task.WeaponExpend.ALL, attackQtyLimit = false}}) - end - if groupShipNorth2 ~= nil then - controllerSu34.pushTask(controllerSu34,{id = 'AttackGroup', params = { groupId = groupShipNorth2:getID(), expend = AI.Task.WeaponExpend.ALL, attackQtyLimit = false}}) - end - if groupShipNorth3 ~= nil then - controllerSu34.pushTask(controllerSu34,{id = 'AttackGroup', params = { groupId = groupShipNorth3:getID(), expend = AI.Task.WeaponExpend.ALL, attackQtyLimit = false}}) - end - Su34Status.status[groupName] = 3 - MessageToRed( string.format('%s: ',groupName) .. 'Attacking invading ships in the north. ', 10, 'RedStatus' .. groupName ) -end - -function Su34Orbit(groupName) ---trace.menu("","Su34Orbit") - local groupSu34 = Group.getByName( groupName ) - local controllerSu34 = groupSu34:getController() - controllerSu34.setOption( controllerSu34, AI.Option.Air.id.ROE, AI.Option.Air.val.ROE.WEAPON_HOLD ) - controllerSu34.setOption( controllerSu34, AI.Option.Air.id.REACTION_ON_THREAT, AI.Option.Air.val.REACTION_ON_THREAT.EVADE_FIRE ) - controllerSu34:pushTask( {id = 'ControlledTask', params = { task = { id = 'Orbit', params = { pattern = AI.Task.OrbitPattern.RACE_TRACK } }, stopCondition = { duration = 600 } } } ) - Su34Status.status[groupName] = 4 - MessageToRed( string.format('%s: ',groupName) .. 'In orbit and awaiting further instructions. ', 10, 'RedStatus' .. groupName ) -end - -function Su34TakeOff(groupName) ---trace.menu("","Su34TakeOff") - local groupSu34 = Group.getByName( groupName ) - local controllerSu34 = groupSu34:getController() - controllerSu34.setOption( controllerSu34, AI.Option.Air.id.ROE, AI.Option.Air.val.ROE.WEAPON_HOLD ) - controllerSu34.setOption( controllerSu34, AI.Option.Air.id.REACTION_ON_THREAT, AI.Option.Air.val.REACTION_ON_THREAT.BYPASS_AND_ESCAPE ) - Su34Status.status[groupName] = 8 - MessageToRed( string.format('%s: ',groupName) .. 'Take-Off. ', 10, 'RedStatus' .. groupName ) -end - -function Su34Hold(groupName) ---trace.menu("","Su34Hold") - local groupSu34 = Group.getByName( groupName ) - local controllerSu34 = groupSu34:getController() - controllerSu34.setOption( controllerSu34, AI.Option.Air.id.ROE, AI.Option.Air.val.ROE.WEAPON_HOLD ) - controllerSu34.setOption( controllerSu34, AI.Option.Air.id.REACTION_ON_THREAT, AI.Option.Air.val.REACTION_ON_THREAT.BYPASS_AND_ESCAPE ) - Su34Status.status[groupName] = 5 - MessageToRed( string.format('%s: ',groupName) .. 'Holding Weapons. ', 10, 'RedStatus' .. groupName ) -end - -function Su34RTB(groupName) ---trace.menu("","Su34RTB") - Su34Status.status[groupName] = 6 - MessageToRed( string.format('%s: ',groupName) .. 'Return to Krasnodar. ', 10, 'RedStatus' .. groupName ) -end - -function Su34Destroyed(groupName) ---trace.menu("","Su34Destroyed") - Su34Status.status[groupName] = 7 - MessageToRed( string.format('%s: ',groupName) .. 'Destroyed. ', 30, 'RedStatus' .. groupName ) -end - -function GroupAlive( groupName ) ---trace.menu("","GroupAlive") - local groupTest = Group.getByName( groupName ) - - local groupExists = false - - if groupTest then - groupExists = groupTest:isExist() - end - - --trace.r( "", "", { groupExists } ) - return groupExists -end - -function Su34IsDead() ---trace.f() - -end - -function Su34OverviewStatus() ---trace.menu("","Su34OverviewStatus") - local msg = "" - local currentStatus = 0 - local Exists = false - - for groupName, currentStatus in pairs(Su34Status.status) do - - env.info(('Su34 Overview Status: GroupName = ' .. groupName )) - Alive = GroupAlive( groupName ) - - if Alive then - if currentStatus == 1 then - msg = msg .. string.format("%s: ",groupName) - msg = msg .. "Attacking carrier Carl Vinson. " - elseif currentStatus == 2 then - msg = msg .. string.format("%s: ",groupName) - msg = msg .. "Attacking supporting ships in the west. " - elseif currentStatus == 3 then - msg = msg .. string.format("%s: ",groupName) - msg = msg .. "Attacking invading ships in the north. " - elseif currentStatus == 4 then - msg = msg .. string.format("%s: ",groupName) - msg = msg .. "In orbit and awaiting further instructions. " - elseif currentStatus == 5 then - msg = msg .. string.format("%s: ",groupName) - msg = msg .. "Holding Weapons. " - elseif currentStatus == 6 then - msg = msg .. string.format("%s: ",groupName) - msg = msg .. "Return to Krasnodar. " - elseif currentStatus == 7 then - msg = msg .. string.format("%s: ",groupName) - msg = msg .. "Destroyed. " - elseif currentStatus == 8 then - msg = msg .. string.format("%s: ",groupName) - msg = msg .. "Take-Off. " - end - else - if currentStatus == 7 then - msg = msg .. string.format("%s: ",groupName) - msg = msg .. "Destroyed. " - else - Su34Destroyed(groupName) - end - end - end - - boardMsgRed.statusMsg = msg -end - - -function UpdateBoardMsg() ---trace.f() - Su34OverviewStatus() - MessageToRed( boardMsgRed.statusMsg, 15, 'RedStatus' ) -end - -function MusicReset( flg ) ---trace.f() - trigger.action.setUserFlag(95,flg) -end - -function PlaneActivate(groupNameFormat, flg) ---trace.f() - local groupName = groupNameFormat .. string.format("#%03d", trigger.misc.getUserFlag(flg)) - --trigger.action.outText(groupName,10) - trigger.action.activateGroup(Group.getByName(groupName)) -end - -function Su34Menu(groupName) ---trace.f() - - --env.info(( 'Su34Menu(' .. groupName .. ')' )) - local groupSu34 = Group.getByName( groupName ) - - if Su34Status.status[groupName] == 1 or - Su34Status.status[groupName] == 2 or - Su34Status.status[groupName] == 3 or - Su34Status.status[groupName] == 4 or - Su34Status.status[groupName] == 5 then - if Su34MenuPath[groupName] == nil then - if planeMenuPath == nil then - planeMenuPath = missionCommands.addSubMenuForCoalition( - coalition.side.RED, - "SU-34 anti-ship flights", - nil - ) - end - Su34MenuPath[groupName] = missionCommands.addSubMenuForCoalition( - coalition.side.RED, - "Flight " .. groupName, - planeMenuPath - ) - - missionCommands.addCommandForCoalition( - coalition.side.RED, - "Attack carrier Carl Vinson", - Su34MenuPath[groupName], - Su34AttackCarlVinson, - groupName - ) - - missionCommands.addCommandForCoalition( - coalition.side.RED, - "Attack ships in the west", - Su34MenuPath[groupName], - Su34AttackWest, - groupName - ) - - missionCommands.addCommandForCoalition( - coalition.side.RED, - "Attack ships in the north", - Su34MenuPath[groupName], - Su34AttackNorth, - groupName - ) - - missionCommands.addCommandForCoalition( - coalition.side.RED, - "Hold position and await instructions", - Su34MenuPath[groupName], - Su34Orbit, - groupName - ) - - missionCommands.addCommandForCoalition( - coalition.side.RED, - "Report status", - Su34MenuPath[groupName], - Su34OverviewStatus - ) - end - else - if Su34MenuPath[groupName] then - missionCommands.removeItemForCoalition(coalition.side.RED, Su34MenuPath[groupName]) - end - end -end - ---- Obsolete function, but kept to rework in framework. - -function ChooseInfantry ( TeleportPrefixTable, TeleportMax ) ---trace.f("Spawn") - --env.info(( 'ChooseInfantry: ' )) - - TeleportPrefixTableCount = #TeleportPrefixTable - TeleportPrefixTableIndex = math.random( 1, TeleportPrefixTableCount ) - - --env.info(( 'ChooseInfantry: TeleportPrefixTableIndex = ' .. TeleportPrefixTableIndex .. ' TeleportPrefixTableCount = ' .. TeleportPrefixTableCount .. ' TeleportMax = ' .. TeleportMax )) - - local TeleportFound = false - local TeleportLoop = true - local Index = TeleportPrefixTableIndex - local TeleportPrefix = '' - - while TeleportLoop do - TeleportPrefix = TeleportPrefixTable[Index] - if SpawnSettings[TeleportPrefix] then - if SpawnSettings[TeleportPrefix]['SpawnCount'] - 1 < TeleportMax then - SpawnSettings[TeleportPrefix]['SpawnCount'] = SpawnSettings[TeleportPrefix]['SpawnCount'] + 1 - TeleportFound = true - else - TeleportFound = false - end - else - SpawnSettings[TeleportPrefix] = {} - SpawnSettings[TeleportPrefix]['SpawnCount'] = 0 - TeleportFound = true - end - if TeleportFound then - TeleportLoop = false - else - if Index < TeleportPrefixTableCount then - Index = Index + 1 - else - TeleportLoop = false - end - end - --env.info(( 'ChooseInfantry: Loop 1 - TeleportPrefix = ' .. TeleportPrefix .. ' Index = ' .. Index )) - end - - if TeleportFound == false then - TeleportLoop = true - Index = 1 - while TeleportLoop do - TeleportPrefix = TeleportPrefixTable[Index] - if SpawnSettings[TeleportPrefix] then - if SpawnSettings[TeleportPrefix]['SpawnCount'] - 1 < TeleportMax then - SpawnSettings[TeleportPrefix]['SpawnCount'] = SpawnSettings[TeleportPrefix]['SpawnCount'] + 1 - TeleportFound = true - else - TeleportFound = false - end - else - SpawnSettings[TeleportPrefix] = {} - SpawnSettings[TeleportPrefix]['SpawnCount'] = 0 - TeleportFound = true - end - if TeleportFound then - TeleportLoop = false - else - if Index < TeleportPrefixTableIndex then - Index = Index + 1 - else - TeleportLoop = false - end - end - --env.info(( 'ChooseInfantry: Loop 2 - TeleportPrefix = ' .. TeleportPrefix .. ' Index = ' .. Index )) - end - end - - local TeleportGroupName = '' - if TeleportFound == true then - TeleportGroupName = TeleportPrefix .. string.format("#%03d", SpawnSettings[TeleportPrefix]['SpawnCount'] ) - else - TeleportGroupName = '' - end - - --env.info(('ChooseInfantry: TeleportGroupName = ' .. TeleportGroupName )) - --env.info(('ChooseInfantry: return')) - - return TeleportGroupName -end - -SpawnedInfantry = 0 - -function LandCarrier ( CarrierGroup, LandingZonePrefix ) ---trace.f() - --env.info(( 'LandCarrier: ' )) - --env.info(( 'LandCarrier: CarrierGroup = ' .. CarrierGroup:getName() )) - --env.info(( 'LandCarrier: LandingZone = ' .. LandingZonePrefix )) - - local controllerGroup = CarrierGroup:getController() - - local LandingZone = trigger.misc.getZone(LandingZonePrefix) - local LandingZonePos = {} - LandingZonePos.x = LandingZone.point.x + math.random(LandingZone.radius * -1, LandingZone.radius) - LandingZonePos.y = LandingZone.point.z + math.random(LandingZone.radius * -1, LandingZone.radius) - - controllerGroup:pushTask( { id = 'Land', params = { point = LandingZonePos, durationFlag = true, duration = 10 } } ) - - --env.info(( 'LandCarrier: end' )) -end - -EscortCount = 0 -function EscortCarrier ( CarrierGroup, EscortPrefix, EscortLastWayPoint, EscortEngagementDistanceMax, EscortTargetTypes ) ---trace.f() - --env.info(( 'EscortCarrier: ' )) - --env.info(( 'EscortCarrier: CarrierGroup = ' .. CarrierGroup:getName() )) - --env.info(( 'EscortCarrier: EscortPrefix = ' .. EscortPrefix )) - - local CarrierName = CarrierGroup:getName() - - local EscortMission = {} - local CarrierMission = {} - - local EscortMission = SpawnMissionGroup( EscortPrefix ) - local CarrierMission = SpawnMissionGroup( CarrierGroup:getName() ) - - if EscortMission ~= nil and CarrierMission ~= nil then - - EscortCount = EscortCount + 1 - EscortMissionName = string.format( EscortPrefix .. '#Escort %s', CarrierName ) - EscortMission.name = EscortMissionName - EscortMission.groupId = nil - EscortMission.lateActivation = false - EscortMission.taskSelected = false - - local EscortUnits = #EscortMission.units - for u = 1, EscortUnits do - EscortMission.units[u].name = string.format( EscortPrefix .. '#Escort %s %02d', CarrierName, u ) - EscortMission.units[u].unitId = nil - end - - - EscortMission.route.points[1].task = { id = "ComboTask", - params = - { - tasks = - { - [1] = - { - enabled = true, - auto = false, - id = "Escort", - number = 1, - params = - { - lastWptIndexFlagChangedManually = false, - groupId = CarrierGroup:getID(), - lastWptIndex = nil, - lastWptIndexFlag = false, - engagementDistMax = EscortEngagementDistanceMax, - targetTypes = EscortTargetTypes, - pos = - { - y = 20, - x = 20, - z = 0, - } -- end of ["pos"] - } -- end of ["params"] - } -- end of [1] - } -- end of ["tasks"] - } -- end of ["params"] - } -- end of ["task"] - - SpawnGroupAdd( EscortPrefix, EscortMission ) - - end -end - -function SendMessageToCarrier( CarrierGroup, CarrierMessage ) ---trace.f() - - if CarrierGroup ~= nil then - MessageToGroup( CarrierGroup, CarrierMessage, 30, 'Carrier/' .. CarrierGroup:getName() ) - end - -end - -function MessageToGroup( MsgGroup, MsgText, MsgTime, MsgName ) ---trace.f() - - if type(MsgGroup) == 'string' then - --env.info( 'MessageToGroup: Converted MsgGroup string "' .. MsgGroup .. '" into a Group structure.' ) - MsgGroup = Group.getByName( MsgGroup ) - end - - if MsgGroup ~= nil then - local MsgTable = {} - MsgTable.text = MsgText - MsgTable.displayTime = MsgTime - MsgTable.msgFor = { units = { MsgGroup:getUnits()[1]:getName() } } - MsgTable.name = MsgName - --routines.message.add( MsgTable ) - --env.info(('MessageToGroup: Message sent to ' .. MsgGroup:getUnits()[1]:getName() .. ' -> ' .. MsgText )) - end -end - -function MessageToUnit( UnitName, MsgText, MsgTime, MsgName ) ---trace.f() - - if UnitName ~= nil then - local MsgTable = {} - MsgTable.text = MsgText - MsgTable.displayTime = MsgTime - MsgTable.msgFor = { units = { UnitName } } - MsgTable.name = MsgName - --routines.message.add( MsgTable ) - end -end - -function MessageToAll( MsgText, MsgTime, MsgName ) ---trace.f() - - MESSAGE:New( MsgText, "Message", MsgTime, MsgName ):ToCoalition( coalition.side.RED ):ToCoalition( coalition.side.BLUE ) -end - -function MessageToRed( MsgText, MsgTime, MsgName ) ---trace.f() - - MESSAGE:New( MsgText, "To Red Coalition", MsgTime, MsgName ):ToCoalition( coalition.side.RED ) -end - -function MessageToBlue( MsgText, MsgTime, MsgName ) ---trace.f() - - MESSAGE:New( MsgText, "To Blue Coalition", MsgTime, MsgName ):ToCoalition( coalition.side.RED ) -end - -function getCarrierHeight( CarrierGroup ) ---trace.f() - - if CarrierGroup ~= nil then - if table.getn(CarrierGroup:getUnits()) == 1 then - local CarrierUnit = CarrierGroup:getUnits()[1] - local CurrentPoint = CarrierUnit:getPoint() - - local CurrentPosition = { x = CurrentPoint.x, y = CurrentPoint.z } - local CarrierHeight = CurrentPoint.y - - local LandHeight = land.getHeight( CurrentPosition ) - - --env.info(( 'CarrierHeight: LandHeight = ' .. LandHeight .. ' CarrierHeight = ' .. CarrierHeight )) - - return CarrierHeight - LandHeight - else - return 999999 - end - else - return 999999 - end - -end - -function GetUnitHeight( CheckUnit ) ---trace.f() - - local UnitPoint = CheckUnit:getPoint() - local UnitPosition = { x = CurrentPoint.x, y = CurrentPoint.z } - local UnitHeight = CurrentPoint.y - - local LandHeight = land.getHeight( CurrentPosition ) - - --env.info(( 'CarrierHeight: LandHeight = ' .. LandHeight .. ' CarrierHeight = ' .. CarrierHeight )) - - return UnitHeight - LandHeight - -end - - -_MusicTable = {} -_MusicTable.Files = {} -_MusicTable.Queue = {} -_MusicTable.FileCnt = 0 - - -function MusicRegister( SndRef, SndFile, SndTime ) ---trace.f() - - env.info(( 'MusicRegister: SndRef = ' .. SndRef )) - env.info(( 'MusicRegister: SndFile = ' .. SndFile )) - env.info(( 'MusicRegister: SndTime = ' .. SndTime )) - - - _MusicTable.FileCnt = _MusicTable.FileCnt + 1 - - _MusicTable.Files[_MusicTable.FileCnt] = {} - _MusicTable.Files[_MusicTable.FileCnt].Ref = SndRef - _MusicTable.Files[_MusicTable.FileCnt].File = SndFile - _MusicTable.Files[_MusicTable.FileCnt].Time = SndTime - - if not _MusicTable.Function then - _MusicTable.Function = routines.scheduleFunction( MusicScheduler, { }, timer.getTime() + 10, 10) - end - -end - -function MusicToPlayer( SndRef, PlayerName, SndContinue ) ---trace.f() - - --env.info(( 'MusicToPlayer: SndRef = ' .. SndRef )) - - local PlayerUnits = AlivePlayerUnits() - for PlayerUnitIdx, PlayerUnit in pairs(PlayerUnits) do - local PlayerUnitName = PlayerUnit:getPlayerName() - --env.info(( 'MusicToPlayer: PlayerUnitName = ' .. PlayerUnitName )) - if PlayerName == PlayerUnitName then - PlayerGroup = PlayerUnit:getGroup() - if PlayerGroup then - --env.info(( 'MusicToPlayer: PlayerGroup = ' .. PlayerGroup:getName() )) - MusicToGroup( SndRef, PlayerGroup, SndContinue ) - end - break - end - end - - --env.info(( 'MusicToPlayer: end' )) - -end - -function MusicToGroup( SndRef, SndGroup, SndContinue ) ---trace.f() - - --env.info(( 'MusicToGroup: SndRef = ' .. SndRef )) - - if SndGroup ~= nil then - if _MusicTable and _MusicTable.FileCnt > 0 then - if SndGroup:isExist() then - if MusicCanStart(SndGroup:getUnit(1):getPlayerName()) then - --env.info(( 'MusicToGroup: OK for Sound.' )) - local SndIdx = 0 - if SndRef == '' then - --env.info(( 'MusicToGroup: SndRef as empty. Queueing at random.' )) - SndIdx = math.random( 1, _MusicTable.FileCnt ) - else - for SndIdx = 1, _MusicTable.FileCnt do - if _MusicTable.Files[SndIdx].Ref == SndRef then - break - end - end - end - --env.info(( 'MusicToGroup: SndIdx = ' .. SndIdx )) - --env.info(( 'MusicToGroup: Queueing Music ' .. _MusicTable.Files[SndIdx].File .. ' for Group ' .. SndGroup:getID() )) - trigger.action.outSoundForGroup( SndGroup:getID(), _MusicTable.Files[SndIdx].File ) - MessageToGroup( SndGroup, 'Playing ' .. _MusicTable.Files[SndIdx].File, 15, 'Music-' .. SndGroup:getUnit(1):getPlayerName() ) - - local SndQueueRef = SndGroup:getUnit(1):getPlayerName() - if _MusicTable.Queue[SndQueueRef] == nil then - _MusicTable.Queue[SndQueueRef] = {} - end - _MusicTable.Queue[SndQueueRef].Start = timer.getTime() - _MusicTable.Queue[SndQueueRef].PlayerName = SndGroup:getUnit(1):getPlayerName() - _MusicTable.Queue[SndQueueRef].Group = SndGroup - _MusicTable.Queue[SndQueueRef].ID = SndGroup:getID() - _MusicTable.Queue[SndQueueRef].Ref = SndIdx - _MusicTable.Queue[SndQueueRef].Continue = SndContinue - _MusicTable.Queue[SndQueueRef].Type = Group - end - end - end - end -end - -function MusicCanStart(PlayerName) ---trace.f() - - --env.info(( 'MusicCanStart:' )) - - local MusicOut = false - - if _MusicTable['Queue'] ~= nil and _MusicTable.FileCnt > 0 then - --env.info(( 'MusicCanStart: PlayerName = ' .. PlayerName )) - local PlayerFound = false - local MusicStart = 0 - local MusicTime = 0 - for SndQueueIdx, SndQueue in pairs( _MusicTable.Queue ) do - if SndQueue.PlayerName == PlayerName then - PlayerFound = true - MusicStart = SndQueue.Start - MusicTime = _MusicTable.Files[SndQueue.Ref].Time - break - end - end - if PlayerFound then - --env.info(( 'MusicCanStart: MusicStart = ' .. MusicStart )) - --env.info(( 'MusicCanStart: MusicTime = ' .. MusicTime )) - --env.info(( 'MusicCanStart: timer.getTime() = ' .. timer.getTime() )) - - if MusicStart + MusicTime <= timer.getTime() then - MusicOut = true - end - else - MusicOut = true - end - end - - if MusicOut then - --env.info(( 'MusicCanStart: true' )) - else - --env.info(( 'MusicCanStart: false' )) - end - - return MusicOut -end - -function MusicScheduler() ---trace.scheduled("", "MusicScheduler") - - --env.info(( 'MusicScheduler:' )) - if _MusicTable['Queue'] ~= nil and _MusicTable.FileCnt > 0 then - --env.info(( 'MusicScheduler: Walking Sound Queue.')) - for SndQueueIdx, SndQueue in pairs( _MusicTable.Queue ) do - if SndQueue.Continue then - if MusicCanStart(SndQueue.PlayerName) then - --env.info(('MusicScheduler: MusicToGroup')) - MusicToPlayer( '', SndQueue.PlayerName, true ) - end - end - end - end - -end - - -env.info(( 'Init: Scripts Loaded v1.1' )) - ---- BASE classes. --- --- @{#BASE} class --- ============== --- The @{#BASE} class is the super class for most of the classes defined within MOOSE. --- --- It handles: --- --- * The construction and inheritance of child classes. --- * The tracing of objects during mission execution within the DCS.log file (under saved games folder). --- --- Note: Normally you would not use the BASE class unless you are extending the MOOSE framework with new classes. --- --- BASE Trace functionality --- ======================== --- The BASE class contains trace methods to trace progress within a mission execution of a certain object. --- Note that these trace methods are inherited by each MOOSE class interiting BASE. --- As such, each object created from derived class from BASE can use the tracing functions to trace its execution. --- --- Trace a function call --- --------------------- --- There are basically 3 types of tracing methods available within BASE: --- --- * @{#BASE.F}: Trace the beginning of a function and its given parameters. --- * @{#BASE.T}: Trace further logic within a function giving optional variables or parameters. --- * @{#BASE.E}: Trace an execption within a function giving optional variables or parameters. An exception will always be traced. --- --- Tracing levels --- -------------- --- There are 3 tracing levels within MOOSE. --- These tracing levels were defined to avoid bulks of tracing to be generated by lots of objects. --- --- As such, the F and T methods have additional variants to trace level 2 and 3 respectively: --- --- * @{#BASE.F2}: Trace the beginning of a function and its given parameters with tracing level 2. --- * @{#BASE.F3}: Trace the beginning of a function and its given parameters with tracing level 3. --- * @{#BASE.T2}: Trace further logic within a function giving optional variables or parameters with tracing level 2. --- * @{#BASE.T3}: Trace further logic within a function giving optional variables or parameters with tracing level 3. --- --- BASE Inheritance support --- ======================== --- The following methods are available to support inheritance: --- --- * @{#BASE.Inherit}: Inherits from a class. --- * @{#BASE.Inherited}: Returns the parent class from the class. --- --- Future --- ====== --- Further methods may be added to BASE whenever there is a need to make "overall" functions available within MOOSE. --- --- ==== --- --- @module Base --- @author FlightControl - -Include.File( "Routines" ) - -local _TraceOn = true -local _TraceLevel = 1 -local _TraceClass = { - --DATABASE = true, - --SEAD = true, - --DESTROYBASETASK = true, - --MOVEMENT = true, - --SPAWN = true, - --STAGE = true, - --ZONE = true, - --GROUP = true, - --UNIT = true, - --CLIENT = true, - --CARGO = true, - --CARGO_GROUP = true, - --CARGO_PACKAGE = true, - --CARGO_SLINGLOAD = true, - --CARGO_ZONE = true, - --CLEANUP = true, - --MENU_CLIENT = true, - --MENU_CLIENT_COMMAND = true, - --ESCORT = true, - } -local _TraceClassMethod = {} - ---- The BASE Class --- @type BASE --- @field ClassName The name of the class. --- @field ClassID The ID number of the class. -BASE = { - ClassName = "BASE", - ClassID = 0, - Events = {} -} - ---- The Formation Class --- @type FORMATION --- @field Cone A cone formation. -FORMATION = { - Cone = "Cone" -} - - - ---- The base constructor. This is the top top class of all classed defined within the MOOSE. --- Any new class needs to be derived from this class for proper inheritance. --- @param #BASE self --- @return #BASE The new instance of the BASE class. --- @usage --- function TASK:New() --- --- local self = BASE:Inherit( self, BASE:New() ) --- --- -- assign Task default values during construction --- self.TaskBriefing = "Task: No Task." --- self.Time = timer.getTime() --- self.ExecuteStage = _TransportExecuteStage.NONE --- --- return self --- end --- @todo need to investigate if the deepCopy is really needed... Don't think so. -function BASE:New() - local Child = routines.utils.deepCopy( self ) - local Parent = {} - setmetatable( Child, Parent ) - Child.__index = Child - self.ClassID = self.ClassID + 1 - Child.ClassID = self.ClassID - --Child.AddEvent( Child, S_EVENT_BIRTH, Child.EventBirth ) - return Child -end - ---- This is the worker method to inherit from a parent class. --- @param #BASE self --- @param Child is the Child class that inherits. --- @param #BASE Parent is the Parent class that the Child inherits from. --- @return #BASE Child -function BASE:Inherit( Child, Parent ) - local Child = routines.utils.deepCopy( Child ) - local Parent = routines.utils.deepCopy( Parent ) - if Child ~= nil then - setmetatable( Child, Parent ) - Child.__index = Child - end - --Child.ClassName = Child.ClassName .. '.' .. Child.ClassID - self:T( 'Inherited from ' .. Parent.ClassName ) - return Child -end - ---- This is the worker method to retrieve the Parent class. --- @param #BASE self --- @param #BASE Child is the Child class from which the Parent class needs to be retrieved. --- @return #BASE -function BASE:Inherited( Child ) - local Parent = getmetatable( Child ) --- env.info('Inherited class of ' .. Child.ClassName .. ' is ' .. Parent.ClassName ) - return Parent -end - ---- Get the ClassName + ClassID of the class instance. --- The ClassName + ClassID is formatted as '%s#%09d'. --- @param #BASE self --- @return #string The ClassName + ClassID of the class instance. -function BASE:GetClassNameAndID() - return string.format( '%s#%09d', self:GetClassName(), self:GetClassID() ) -end - ---- Get the ClassName of the class instance. --- @param #BASE self --- @return #string The ClassName of the class instance. -function BASE:GetClassName() - return self.ClassName -end - ---- Get the ClassID of the class instance. --- @param #BASE self --- @return #string The ClassID of the class instance. -function BASE:GetClassID() - return self.ClassID -end - ---- Set a new listener for the class. --- @param self --- @param DCSTypes#Event Event --- @param #function EventFunction --- @return #BASE -function BASE:AddEvent( Event, EventFunction ) - self:F( Event ) - - self.Events[#self.Events+1] = {} - self.Events[#self.Events].Event = Event - self.Events[#self.Events].EventFunction = EventFunction - self.Events[#self.Events].EventEnabled = false - - return self -end - ---- Returns the event dispatcher --- @param #BASE self --- @return Event#EVENT -function BASE:Event() - - return _EVENTDISPATCHER -end - - - - - ---- Enable the event listeners for the class. --- @param #BASE self --- @return #BASE -function BASE:EnableEvents() - self:F( #self.Events ) - - for EventID, Event in pairs( self.Events ) do - Event.Self = self - Event.EventEnabled = true - end - self.Events.Handler = world.addEventHandler( self ) - - return self -end - - ---- Disable the event listeners for the class. --- @param #BASE self --- @return #BASE -function BASE:DisableEvents() - self:F() - - world.removeEventHandler( self ) - for EventID, Event in pairs( self.Events ) do - Event.Self = nil - Event.EventEnabled = false - end - - return self -end - - -local BaseEventCodes = { - "S_EVENT_SHOT", - "S_EVENT_HIT", - "S_EVENT_TAKEOFF", - "S_EVENT_LAND", - "S_EVENT_CRASH", - "S_EVENT_EJECTION", - "S_EVENT_REFUELING", - "S_EVENT_DEAD", - "S_EVENT_PILOT_DEAD", - "S_EVENT_BASE_CAPTURED", - "S_EVENT_MISSION_START", - "S_EVENT_MISSION_END", - "S_EVENT_TOOK_CONTROL", - "S_EVENT_REFUELING_STOP", - "S_EVENT_BIRTH", - "S_EVENT_HUMAN_FAILURE", - "S_EVENT_ENGINE_STARTUP", - "S_EVENT_ENGINE_SHUTDOWN", - "S_EVENT_PLAYER_ENTER_UNIT", - "S_EVENT_PLAYER_LEAVE_UNIT", - "S_EVENT_PLAYER_COMMENT", - "S_EVENT_SHOOTING_START", - "S_EVENT_SHOOTING_END", - "S_EVENT_MAX", -} - ---onEvent( {[1]="S_EVENT_BIRTH",[2]={["subPlace"]=5,["time"]=0,["initiator"]={["id_"]=16884480,},["place"]={["id_"]=5000040,},["id"]=15,["IniUnitName"]="US F-15C@RAMP-Air Support Mountains#001-01",},} --- Event = { --- id = enum world.event, --- time = Time, --- initiator = Unit, --- target = Unit, --- place = Unit, --- subPlace = enum world.BirthPlace, --- weapon = Weapon --- } - ---- Creation of a Birth Event. --- @param #BASE self --- @param DCSTypes#Time EventTime The time stamp of the event. --- @param DCSObject#Object Initiator The initiating object of the event. --- @param #string IniUnitName The initiating unit name. --- @param place --- @param subplace -function BASE:CreateEventBirth( EventTime, Initiator, IniUnitName, place, subplace ) - self:F( { EventTime, Initiator, IniUnitName, place, subplace } ) - - local Event = { - id = world.event.S_EVENT_BIRTH, - time = EventTime, - initiator = Initiator, - IniUnitName = IniUnitName, - place = place, - subplace = subplace - } - - world.onEvent( Event ) -end - ---- Creation of a Crash Event. --- @param #BASE self --- @param DCSTypes#Time EventTime The time stamp of the event. --- @param DCSObject#Object Initiator The initiating object of the event. -function BASE:CreateEventCrash( EventTime, Initiator ) - self:F( { EventTime, Initiator } ) - - local Event = { - id = world.event.S_EVENT_CRASH, - time = EventTime, - initiator = Initiator, - } - - world.onEvent( Event ) -end - --- TODO: Complete DCSTypes#Event structure. ---- The main event handling function... This function captures all events generated for the class. --- @param #BASE self --- @param DCSTypes#Event event -function BASE:onEvent(event) - --self:F( { BaseEventCodes[event.id], event } ) - - if self then - for EventID, EventObject in pairs( self.Events ) do - if EventObject.EventEnabled then - --env.info( 'onEvent Table EventObject.Self = ' .. tostring(EventObject.Self) ) - --env.info( 'onEvent event.id = ' .. tostring(event.id) ) - --env.info( 'onEvent EventObject.Event = ' .. tostring(EventObject.Event) ) - if event.id == EventObject.Event then - if self == EventObject.Self then - if event.initiator and event.initiator:isExist() then - event.IniUnitName = event.initiator:getName() - end - if event.target and event.target:isExist() then - event.TgtUnitName = event.target:getName() - end - --self:T( { BaseEventCodes[event.id], event } ) - --EventObject.EventFunction( self, event ) - end - end - end - end - end -end - --- Trace section - --- Log a trace (only shown when trace is on) --- TODO: Make trace function using variable parameters. - ---- Set trace level --- @param #BASE self --- @param #number Level -function BASE:TraceLevel( Level ) - _TraceLevel = Level - self:E( "Tracing level " .. Level ) -end - ---- Set tracing for a class --- @param #BASE self --- @param #string Class -function BASE:TraceClass( Class ) - _TraceClass[Class] = true - _TraceClassMethod[Class] = {} - self:E( "Tracing class " .. Class ) -end - ---- Set tracing for a specific method of class --- @param #BASE self --- @param #string Class --- @param #string Method -function BASE:TraceClassMethod( Class, Method ) - if not _TraceClassMethod[Class] then - _TraceClassMethod[Class] = {} - _TraceClassMethod[Class].Method = {} - end - _TraceClassMethod[Class].Method[Method] = true - self:E( "Tracing method " .. Method .. " of class " .. Class ) -end - ---- Trace a function call. Must be at the beginning of the function logic. --- @param #BASE self --- @param Arguments A #table or any field. -function BASE:F( Arguments ) - - if _TraceOn and ( _TraceClass[self.ClassName] or _TraceClassMethod[self.ClassName] ) then - - local DebugInfoCurrent = debug.getinfo( 2, "nl" ) - local DebugInfoFrom = debug.getinfo( 3, "l" ) - - local Function = "function" - if DebugInfoCurrent.name then - Function = DebugInfoCurrent.name - end - - if _TraceClass[self.ClassName] or _TraceClassMethod[self.ClassName].Method[Function] then - local LineCurrent = DebugInfoCurrent.currentline - local LineFrom = 0 - if DebugInfoFrom then - LineFrom = DebugInfoFrom.currentline - end - env.info( string.format( "%6d(%6d)/%1s:%20s%05d.%s(%s)" , LineCurrent, LineFrom, "F", self.ClassName, self.ClassID, Function, routines.utils.oneLineSerialize( Arguments ) ) ) - end - end -end - ---- Trace a function call level 2. Must be at the beginning of the function logic. --- @param #BASE self --- @param Arguments A #table or any field. -function BASE:F2( Arguments ) - - if _TraceLevel >= 2 then - self:F( Arguments ) - end - -end - ---- Trace a function call level 3. Must be at the beginning of the function logic. --- @param #BASE self --- @param Arguments A #table or any field. -function BASE:F3( Arguments ) - - if _TraceLevel >= 3 then - self:F( Arguments ) - end - -end - ---- Trace a function logic. Can be anywhere within the function logic. --- @param #BASE self --- @param Arguments A #table or any field. -function BASE:T( Arguments ) - - if _TraceOn and ( _TraceClass[self.ClassName] or _TraceClassMethod[self.ClassName] ) then - - local DebugInfoCurrent = debug.getinfo( 2, "nl" ) - local DebugInfoFrom = debug.getinfo( 3, "l" ) - - local Function = "function" - if DebugInfoCurrent.name then - Function = DebugInfoCurrent.name - end - - if _TraceClass[self.ClassName] or _TraceClassMethod[self.ClassName].Method[Function] then - local LineCurrent = DebugInfoCurrent.currentline - local LineFrom = 0 - if DebugInfoFrom then - LineFrom = DebugInfoFrom.currentline - end - env.info( string.format( "%6d(%6d)/%1s:%20s%05d.%s" , LineCurrent, LineFrom, "T", self.ClassName, self.ClassID, routines.utils.oneLineSerialize( Arguments ) ) ) - end - end -end - ---- Trace a function logic level 2. Can be anywhere within the function logic. --- @param #BASE self --- @param Arguments A #table or any field. -function BASE:T2( Arguments ) - - if _TraceLevel >= 2 then - self:T( Arguments ) - end - -end - ---- Trace a function logic level 3. Can be anywhere within the function logic. --- @param #BASE self --- @param Arguments A #table or any field. -function BASE:T3( Arguments ) - - if _TraceLevel >= 3 then - self:T( Arguments ) - end - -end - ---- Log an exception which will be traced always. Can be anywhere within the function logic. --- @param #BASE self --- @param Arguments A #table or any field. -function BASE:E( Arguments ) - - local DebugInfoCurrent = debug.getinfo( 2, "nl" ) - local DebugInfoFrom = debug.getinfo( 3, "l" ) - - local Function = "function" - if DebugInfoCurrent.name then - Function = DebugInfoCurrent.name - end - - local LineCurrent = DebugInfoCurrent.currentline - local LineFrom = -1 - if DebugInfoFrom then - LineFrom = DebugInfoFrom.currentline - end - - env.info( string.format( "%6d(%6d)/%1s:%20s%05d.%s(%s)" , LineCurrent, LineFrom, "E", self.ClassName, self.ClassID, Function, routines.utils.oneLineSerialize( Arguments ) ) ) -end - - - ---- Models time events calling event handing functions. --- --- @{SCHEDULER} class --- =================== --- The @{SCHEDULER} class models time events calling given event handling functions. --- --- SCHEDULER constructor --- ===================== --- The SCHEDULER class is quite easy to use: --- --- * @{#SCHEDULER.New}: Setup a new scheduler and start it with the specified parameters. --- --- SCHEDULER timer methods --- ======================= --- The SCHEDULER can be stopped and restarted with the following methods: --- --- * @{#SCHEDULER.Start}: (Re-)Start the scheduler. --- * @{#SCHEDULER.Start}: Stop the scheduler. --- --- @module Scheduler --- @author FlightControl - -Include.File( "Routines" ) -Include.File( "Base" ) - - ---- The SCHEDULER class --- @type SCHEDULER --- @extends Base#BASE -SCHEDULER = { - ClassName = "SCHEDULER", -} - - ---- Constructor. --- @param #SCHEDULER self --- @param #table TimeEventObject Specified for which Moose object the timer is setup. If a value of nil is provided, a scheduler will be setup without an object reference. --- @param #function TimeEventFunction The event function to be called when a timer event occurs. The event function needs to accept the parameters specified in TimeEventFunctionArguments. --- @param #table TimeEventFunctionArguments Optional arguments that can be given as part of scheduler. The arguments need to be given as a table { param1, param 2, ... }. --- @param #number StartSeconds Specifies the amount of seconds that will be waited before the scheduling is started, and the event function is called. --- @param #number RepeatSecondsInterval Specifies the interval in seconds when the scheduler will call the event function. --- @param #number RandomizationFactor Specifies a randomization factor between 0 and 1 to randomize the RepeatSecondsInterval. --- @param #number StopSeconds Specifies the amount of seconds when the scheduler will be stopped. --- @return #SCHEDULER self -function SCHEDULER:New( TimeEventObject, TimeEventFunction, TimeEventFunctionArguments, StartSeconds, RepeatSecondsInterval, RandomizationFactor, StopSeconds ) - local self = BASE:Inherit( self, BASE:New() ) - self:F2( { TimeEventObject, TimeEventFunction, TimeEventFunctionArguments, StartSeconds, RepeatSecondsInterval, RandomizationFactor, StopSeconds } ) - - self.TimeEventObject = TimeEventObject - self.TimeEventFunction = TimeEventFunction - self.TimeEventFunctionArguments = TimeEventFunctionArguments - self.StartSeconds = StartSeconds - - if RepeatSecondsInterval then - self.RepeatSecondsInterval = RepeatSecondsInterval - else - self.RepeatSecondsInterval = 0 - end - - if RandomizationFactor then - self.RandomizationFactor = RandomizationFactor - else - self.RandomizationFactor = 0 - end - - if StopSeconds then - self.StopSeconds = StopSeconds - end - - self.Repeat = false - - self.StartTime = timer.getTime() - - self:Start() - - return self -end - ---- (Re-)Starts the scheduler. --- @param #SCHEDULER self --- @return #SCHEDULER self -function SCHEDULER:Start() - self:F2( self.TimeEventObject ) - - self.Repeat = true - timer.scheduleFunction( self._Scheduler, self, timer.getTime() + self.StartSeconds + .01 ) - - return self -end - ---- Stops the scheduler. --- @param #SCHEDULER self --- @return #SCHEDULER self -function SCHEDULER:Stop() - self:F2( self.TimeEventObject ) - - self.Repeat = false - - return self -end - --- Private Functions - -function SCHEDULER:_Scheduler() - self:F2( self.TimeEventFunctionArguments ) - - local ErrorHandler = function( errmsg ) - - env.info( "Error in SCHEDULER function:" .. errmsg ) - env.info( debug.traceback() ) - - return errmsg - end - - local Status, Result - if self.TimeEventObject then - Status, Result = xpcall( function() return self.TimeEventFunction( self.TimeEventObject, unpack( self.TimeEventFunctionArguments ) ) end, ErrorHandler ) - else - Status, Result = xpcall( function() return self.TimeEventFunction( unpack( self.TimeEventFunctionArguments ) ) end, ErrorHandler ) - end - - self:T( { Status, Result } ) - - if Status and Status == true and Result and Result == true then - if self.Repeat and ( not self.StopSeconds or ( self.StopSeconds and timer.getTime() <= self.StartTime + self.StopSeconds ) ) then - timer.scheduleFunction( - self._Scheduler, - self, - timer.getTime() + self.RepeatSecondsInterval + math.random( - ( self.RandomizationFactor * self.RepeatSecondsInterval / 2 ), ( self.RandomizationFactor * self.RepeatSecondsInterval / 2 ) ) + 0.01 - ) - end - end - -end - - - - - - - - ---- The EVENT class models an efficient event handling process between other classes and its units, weapons. --- @module Event --- @author FlightControl - -Include.File( "Routines" ) -Include.File( "Base" ) - ---- The EVENT structure --- @type EVENT --- @field #EVENT.Events Events -EVENT = { - ClassName = "EVENT", - ClassID = 0, -} - -local _EVENTCODES = { - "S_EVENT_SHOT", - "S_EVENT_HIT", - "S_EVENT_TAKEOFF", - "S_EVENT_LAND", - "S_EVENT_CRASH", - "S_EVENT_EJECTION", - "S_EVENT_REFUELING", - "S_EVENT_DEAD", - "S_EVENT_PILOT_DEAD", - "S_EVENT_BASE_CAPTURED", - "S_EVENT_MISSION_START", - "S_EVENT_MISSION_END", - "S_EVENT_TOOK_CONTROL", - "S_EVENT_REFUELING_STOP", - "S_EVENT_BIRTH", - "S_EVENT_HUMAN_FAILURE", - "S_EVENT_ENGINE_STARTUP", - "S_EVENT_ENGINE_SHUTDOWN", - "S_EVENT_PLAYER_ENTER_UNIT", - "S_EVENT_PLAYER_LEAVE_UNIT", - "S_EVENT_PLAYER_COMMENT", - "S_EVENT_SHOOTING_START", - "S_EVENT_SHOOTING_END", - "S_EVENT_MAX", -} - ---- The Event structure --- @type EVENTDATA --- @field id --- @field initiator --- @field target --- @field weapon --- @field IniDCSUnit --- @field IniDCSUnitName --- @field IniDCSGroup --- @field IniDCSGroupName --- @field TgtDCSUnit --- @field TgtDCSUnitName --- @field TgtDCSGroup --- @field TgtDCSGroupName --- @field Weapon --- @field WeaponName --- @field WeaponTgtDCSUnit - ---- The Events structure --- @type EVENT.Events --- @field #number IniUnit - -function EVENT:New() - local self = BASE:Inherit( self, BASE:New() ) - self:F2() - self.EventHandler = world.addEventHandler( self ) - return self -end - -function EVENT:EventText( EventID ) - - local EventText = _EVENTCODES[EventID] - - return EventText -end - - ---- Initializes the Events structure for the event --- @param #EVENT self --- @param DCSWorld#world.event EventID --- @param #string EventClass --- @return #EVENT.Events -function EVENT:Init( EventID, EventClass ) - self:F3( { _EVENTCODES[EventID], EventClass } ) - if not self.Events[EventID] then - self.Events[EventID] = {} - end - if not self.Events[EventID][EventClass] then - self.Events[EventID][EventClass] = {} - end - return self.Events[EventID][EventClass] -end - - ---- Create an OnDead event handler for a group --- @param #EVENT self --- @param #table EventTemplate --- @param #function EventFunction The function to be called when the event occurs for the unit. --- @param EventSelf The self instance of the class for which the event is. --- @param #function OnEventFunction --- @return #EVENT -function EVENT:OnEventForTemplate( EventTemplate, EventFunction, EventSelf, OnEventFunction ) - self:F2( EventTemplate.name ) - - for EventUnitID, EventUnit in pairs( EventTemplate.units ) do - OnEventFunction( self, EventUnit.name, EventFunction, EventSelf ) - end - return self -end - ---- Set a new listener for an S_EVENT_X event independent from a unit or a weapon. --- @param #EVENT self --- @param #function EventFunction The function to be called when the event occurs for the unit. --- @param Base#BASE EventSelf The self instance of the class for which the event is. --- @param EventID --- @return #EVENT -function EVENT:OnEventGeneric( EventFunction, EventSelf, EventID ) - self:F2( { EventID } ) - - local Event = self:Init( EventID, EventSelf:GetClassNameAndID() ) - Event.EventFunction = EventFunction - Event.EventSelf = EventSelf - return self -end - - ---- Set a new listener for an S_EVENT_X event --- @param #EVENT self --- @param #string EventDCSUnitName --- @param #function EventFunction The function to be called when the event occurs for the unit. --- @param Base#BASE EventSelf The self instance of the class for which the event is. --- @param EventID --- @return #EVENT -function EVENT:OnEventForUnit( EventDCSUnitName, EventFunction, EventSelf, EventID ) - self:F2( EventDCSUnitName ) - - local Event = self:Init( EventID, EventSelf:GetClassNameAndID() ) - if not Event.IniUnit then - Event.IniUnit = {} - end - Event.IniUnit[EventDCSUnitName] = {} - Event.IniUnit[EventDCSUnitName].EventFunction = EventFunction - Event.IniUnit[EventDCSUnitName].EventSelf = EventSelf - return self -end - - ---- Create an OnBirth event handler for a group --- @param #EVENT self --- @param Group#GROUP EventGroup --- @param #function EventFunction The function to be called when the event occurs for the unit. --- @param EventSelf The self instance of the class for which the event is. --- @return #EVENT -function EVENT:OnBirthForTemplate( EventTemplate, EventFunction, EventSelf ) - self:F2( EventTemplate.name ) - - self:OnEventForTemplate( EventTemplate, EventFunction, EventSelf, self.OnBirthForUnit ) - - return self -end - ---- Set a new listener for an S_EVENT_BIRTH event, and registers the unit born. --- @param #EVENT self --- @param #function EventFunction The function to be called when the event occurs for the unit. --- @param Base#BASE EventSelf --- @return #EVENT -function EVENT:OnBirth( EventFunction, EventSelf ) - self:F2() - - self:OnEventGeneric( EventFunction, EventSelf, world.event.S_EVENT_BIRTH ) - - return self -end - ---- Set a new listener for an S_EVENT_BIRTH event. --- @param #EVENT self --- @param #string EventDCSUnitName The id of the unit for the event to be handled. --- @param #function EventFunction The function to be called when the event occurs for the unit. --- @param Base#BASE EventSelf --- @return #EVENT -function EVENT:OnBirthForUnit( EventDCSUnitName, EventFunction, EventSelf ) - self:F2( EventDCSUnitName ) - - self:OnEventForUnit( EventDCSUnitName, EventFunction, EventSelf, world.event.S_EVENT_BIRTH ) - - return self -end - ---- Create an OnCrash event handler for a group --- @param #EVENT self --- @param Group#GROUP EventGroup --- @param #function EventFunction The function to be called when the event occurs for the unit. --- @param EventSelf The self instance of the class for which the event is. --- @return #EVENT -function EVENT:OnCrashForTemplate( EventTemplate, EventFunction, EventSelf ) - self:F2( EventTemplate.name ) - - self:OnEventForTemplate( EventTemplate, EventFunction, EventSelf, self.OnCrashForUnit ) - - return self -end - ---- Set a new listener for an S_EVENT_CRASH event. --- @param #EVENT self --- @param #function EventFunction The function to be called when the event occurs for the unit. --- @param Base#BASE EventSelf --- @return #EVENT -function EVENT:OnCrash( EventFunction, EventSelf ) - self:F2() - - self:OnEventGeneric( EventFunction, EventSelf, world.event.S_EVENT_CRASH ) - - return self -end - ---- Set a new listener for an S_EVENT_CRASH event. --- @param #EVENT self --- @param #string EventDCSUnitName --- @param #function EventFunction The function to be called when the event occurs for the unit. --- @param Base#BASE EventSelf The self instance of the class for which the event is. --- @return #EVENT -function EVENT:OnCrashForUnit( EventDCSUnitName, EventFunction, EventSelf ) - self:F2( EventDCSUnitName ) - - self:OnEventForUnit( EventDCSUnitName, EventFunction, EventSelf, world.event.S_EVENT_CRASH ) - - return self -end - ---- Create an OnDead event handler for a group --- @param #EVENT self --- @param Group#GROUP EventGroup --- @param #function EventFunction The function to be called when the event occurs for the unit. --- @param EventSelf The self instance of the class for which the event is. --- @return #EVENT -function EVENT:OnDeadForTemplate( EventTemplate, EventFunction, EventSelf ) - self:F2( EventTemplate.name ) - - self:OnEventForTemplate( EventTemplate, EventFunction, EventSelf, self.OnDeadForUnit ) - - return self -end - ---- Set a new listener for an S_EVENT_DEAD event. --- @param #EVENT self --- @param #function EventFunction The function to be called when the event occurs for the unit. --- @param Base#BASE EventSelf --- @return #EVENT -function EVENT:OnDead( EventFunction, EventSelf ) - self:F2() - - self:OnEventGeneric( EventFunction, EventSelf, world.event.S_EVENT_DEAD ) - - return self -end - - ---- Set a new listener for an S_EVENT_DEAD event. --- @param #EVENT self --- @param #string EventDCSUnitName --- @param #function EventFunction The function to be called when the event occurs for the unit. --- @param Base#BASE EventSelf The self instance of the class for which the event is. --- @return #EVENT -function EVENT:OnDeadForUnit( EventDCSUnitName, EventFunction, EventSelf ) - self:F2( EventDCSUnitName ) - - self:OnEventForUnit( EventDCSUnitName, EventFunction, EventSelf, world.event.S_EVENT_DEAD ) - - return self -end - ---- Set a new listener for an S_EVENT_PILOT_DEAD event. --- @param #EVENT self --- @param #string EventDCSUnitName --- @param #function EventFunction The function to be called when the event occurs for the unit. --- @param Base#BASE EventSelf The self instance of the class for which the event is. --- @return #EVENT -function EVENT:OnPilotDeadForUnit( EventDCSUnitName, EventFunction, EventSelf ) - self:F2( EventDCSUnitName ) - - self:OnEventForUnit( EventDCSUnitName, EventFunction, EventSelf, world.event.S_EVENT_PILOT_DEAD ) - - return self -end - ---- Create an OnDead event handler for a group --- @param #EVENT self --- @param #table EventTemplate --- @param #function EventFunction The function to be called when the event occurs for the unit. --- @param EventSelf The self instance of the class for which the event is. --- @return #EVENT -function EVENT:OnLandForTemplate( EventTemplate, EventFunction, EventSelf ) - self:F2( EventTemplate.name ) - - self:OnEventForTemplate( EventTemplate, EventFunction, EventSelf, self.OnLandForUnit ) - - return self -end - ---- Set a new listener for an S_EVENT_LAND event. --- @param #EVENT self --- @param #string EventDCSUnitName --- @param #function EventFunction The function to be called when the event occurs for the unit. --- @param Base#BASE EventSelf The self instance of the class for which the event is. --- @return #EVENT -function EVENT:OnLandForUnit( EventDCSUnitName, EventFunction, EventSelf ) - self:F2( EventDCSUnitName ) - - self:OnEventForUnit( EventDCSUnitName, EventFunction, EventSelf, world.event.S_EVENT_LAND ) - - return self -end - ---- Create an OnDead event handler for a group --- @param #EVENT self --- @param #table EventTemplate --- @param #function EventFunction The function to be called when the event occurs for the unit. --- @param EventSelf The self instance of the class for which the event is. --- @return #EVENT -function EVENT:OnTakeOffForTemplate( EventTemplate, EventFunction, EventSelf ) - self:F2( EventTemplate.name ) - - self:OnEventForTemplate( EventTemplate, EventFunction, EventSelf, self.OnTakeOffForUnit ) - - return self -end - ---- Set a new listener for an S_EVENT_TAKEOFF event. --- @param #EVENT self --- @param #string EventDCSUnitName --- @param #function EventFunction The function to be called when the event occurs for the unit. --- @param Base#BASE EventSelf The self instance of the class for which the event is. --- @return #EVENT -function EVENT:OnTakeOffForUnit( EventDCSUnitName, EventFunction, EventSelf ) - self:F2( EventDCSUnitName ) - - self:OnEventForUnit( EventDCSUnitName, EventFunction, EventSelf, world.event.S_EVENT_TAKEOFF ) - - return self -end - ---- Create an OnDead event handler for a group --- @param #EVENT self --- @param #table EventTemplate --- @param #function EventFunction The function to be called when the event occurs for the unit. --- @param EventSelf The self instance of the class for which the event is. --- @return #EVENT -function EVENT:OnEngineShutDownForTemplate( EventTemplate, EventFunction, EventSelf ) - self:F2( EventTemplate.name ) - - self:OnEventForTemplate( EventTemplate, EventFunction, EventSelf, self.OnEngineShutDownForUnit ) - - return self -end - ---- Set a new listener for an S_EVENT_ENGINE_SHUTDOWN event. --- @param #EVENT self --- @param #string EventDCSUnitName --- @param #function EventFunction The function to be called when the event occurs for the unit. --- @param Base#BASE EventSelf The self instance of the class for which the event is. --- @return #EVENT -function EVENT:OnEngineShutDownForUnit( EventDCSUnitName, EventFunction, EventSelf ) - self:F2( EventDCSUnitName ) - - self:OnEventForUnit( EventDCSUnitName, EventFunction, EventSelf, world.event.S_EVENT_ENGINE_SHUTDOWN ) - - return self -end - ---- Set a new listener for an S_EVENT_ENGINE_STARTUP event. --- @param #EVENT self --- @param #string EventDCSUnitName --- @param #function EventFunction The function to be called when the event occurs for the unit. --- @param Base#BASE EventSelf The self instance of the class for which the event is. --- @return #EVENT -function EVENT:OnEngineStartUpForUnit( EventDCSUnitName, EventFunction, EventSelf ) - self:F2( EventDCSUnitName ) - - self:OnEventForUnit( EventDCSUnitName, EventFunction, EventSelf, world.event.S_EVENT_ENGINE_STARTUP ) - - return self -end - ---- Set a new listener for an S_EVENT_SHOT event. --- @param #EVENT self --- @param #function EventFunction The function to be called when the event occurs for the unit. --- @param Base#BASE EventSelf The self instance of the class for which the event is. --- @return #EVENT -function EVENT:OnShot( EventFunction, EventSelf ) - self:F2() - - self:OnEventGeneric( EventFunction, EventSelf, world.event.S_EVENT_SHOT ) - - return self -end - ---- Set a new listener for an S_EVENT_SHOT event for a unit. --- @param #EVENT self --- @param #string EventDCSUnitName --- @param #function EventFunction The function to be called when the event occurs for the unit. --- @param Base#BASE EventSelf The self instance of the class for which the event is. --- @return #EVENT -function EVENT:OnShotForUnit( EventDCSUnitName, EventFunction, EventSelf ) - self:F2( EventDCSUnitName ) - - self:OnEventForUnit( EventDCSUnitName, EventFunction, EventSelf, world.event.S_EVENT_SHOT ) - - return self -end - ---- Set a new listener for an S_EVENT_HIT event. --- @param #EVENT self --- @param #function EventFunction The function to be called when the event occurs for the unit. --- @param Base#BASE EventSelf The self instance of the class for which the event is. --- @return #EVENT -function EVENT:OnHit( EventFunction, EventSelf ) - self:F2() - - self:OnEventGeneric( EventFunction, EventSelf, world.event.S_EVENT_HIT ) - - return self -end - ---- Set a new listener for an S_EVENT_HIT event. --- @param #EVENT self --- @param #string EventDCSUnitName --- @param #function EventFunction The function to be called when the event occurs for the unit. --- @param Base#BASE EventSelf The self instance of the class for which the event is. --- @return #EVENT -function EVENT:OnHitForUnit( EventDCSUnitName, EventFunction, EventSelf ) - self:F2( EventDCSUnitName ) - - self:OnEventForUnit( EventDCSUnitName, EventFunction, EventSelf, world.event.S_EVENT_HIT ) - - return self -end - ---- Set a new listener for an S_EVENT_PLAYER_ENTER_UNIT event. --- @param #EVENT self --- @param #function EventFunction The function to be called when the event occurs for the unit. --- @param Base#BASE EventSelf The self instance of the class for which the event is. --- @return #EVENT -function EVENT:OnPlayerEnterUnit( EventFunction, EventSelf ) - self:F2() - - self:OnEventGeneric( EventFunction, EventSelf, world.event.S_EVENT_PLAYER_ENTER_UNIT ) - - return self -end - ---- Set a new listener for an S_EVENT_PLAYER_LEAVE_UNIT event. --- @param #EVENT self --- @param #function EventFunction The function to be called when the event occurs for the unit. --- @param Base#BASE EventSelf The self instance of the class for which the event is. --- @return #EVENT -function EVENT:OnPlayerLeaveUnit( EventFunction, EventSelf ) - self:F2() - - self:OnEventGeneric( EventFunction, EventSelf, world.event.S_EVENT_PLAYER_LEAVE_UNIT ) - - return self -end - - - -function EVENT:onEvent( Event ) - self:F2( { _EVENTCODES[Event.id], Event } ) - - if self and self.Events and self.Events[Event.id] then - if Event.initiator and Event.initiator:getCategory() == Object.Category.UNIT then - Event.IniDCSUnit = Event.initiator - Event.IniDCSGroup = Event.IniDCSUnit:getGroup() - Event.IniDCSUnitName = Event.IniDCSUnit:getName() - Event.IniDCSGroupName = "" - if Event.IniDCSGroup and Event.IniDCSGroup:isExist() then - Event.IniDCSGroupName = Event.IniDCSGroup:getName() - end - end - if Event.target then - if Event.target and Event.target:getCategory() == Object.Category.UNIT then - Event.TgtDCSUnit = Event.target - Event.TgtDCSGroup = Event.TgtDCSUnit:getGroup() - Event.TgtDCSUnitName = Event.TgtDCSUnit:getName() - Event.TgtDCSGroupName = "" - if Event.TgtDCSGroup and Event.TgtDCSGroup:isExist() then - Event.TgtDCSGroupName = Event.TgtDCSGroup:getName() - end - end - end - if Event.weapon then - Event.Weapon = Event.weapon - Event.WeaponName = Event.Weapon:getTypeName() - --Event.WeaponTgtDCSUnit = Event.Weapon:getTarget() - end - self:E( { _EVENTCODES[Event.id], Event } ) - for ClassName, EventData in pairs( self.Events[Event.id] ) do - if Event.IniDCSUnitName and EventData.IniUnit and EventData.IniUnit[Event.IniDCSUnitName] then - self:T2( { "Calling event function for class ", ClassName, " unit ", Event.IniDCSUnitName } ) - EventData.IniUnit[Event.IniDCSUnitName].EventFunction( EventData.IniUnit[Event.IniDCSUnitName].EventSelf, Event ) - else - if Event.IniDCSUnit and not EventData.IniUnit then - self:T2( { "Calling event function for class ", ClassName } ) - EventData.EventFunction( EventData.EventSelf, Event ) - end - end - end - end -end - ---- Encapsulation of DCS World Menu system in a set of MENU classes. --- @module Menu - -Include.File( "Routines" ) -Include.File( "Base" ) - ---- The MENU class --- @type MENU --- @extends Base#BASE -MENU = { - ClassName = "MENU", - MenuPath = nil, - MenuText = "", - MenuParentPath = nil -} - ---- -function MENU:New( MenuText, MenuParentPath ) - - -- Arrange meta tables - local Child = BASE:Inherit( self, BASE:New() ) - - Child.MenuPath = nil - Child.MenuText = MenuText - Child.MenuParentPath = MenuParentPath - return Child -end - ---- The COMMANDMENU class --- @type COMMANDMENU --- @extends Menu#MENU -COMMANDMENU = { - ClassName = "COMMANDMENU", - CommandMenuFunction = nil, - CommandMenuArgument = nil -} - -function COMMANDMENU:New( MenuText, ParentMenu, CommandMenuFunction, CommandMenuArgument ) - - -- Arrange meta tables - - local MenuParentPath = nil - if ParentMenu ~= nil then - MenuParentPath = ParentMenu.MenuPath - end - - local Child = BASE:Inherit( self, MENU:New( MenuText, MenuParentPath ) ) - - Child.MenuPath = missionCommands.addCommand( MenuText, MenuParentPath, CommandMenuFunction, CommandMenuArgument ) - Child.CommandMenuFunction = CommandMenuFunction - Child.CommandMenuArgument = CommandMenuArgument - return Child -end - ---- The SUBMENU class --- @type SUBMENU --- @extends Menu#MENU -SUBMENU = { - ClassName = "SUBMENU" -} - -function SUBMENU:New( MenuText, ParentMenu ) - - -- Arrange meta tables - local MenuParentPath = nil - if ParentMenu ~= nil then - MenuParentPath = ParentMenu.MenuPath - end - - local Child = BASE:Inherit( self, MENU:New( MenuText, MenuParentPath ) ) - - Child.MenuPath = missionCommands.addSubMenu( MenuText, MenuParentPath ) - return Child -end - --- This local variable is used to cache the menus registered under clients. --- Menus don't dissapear when clients are destroyed and restarted. --- So every menu for a client created must be tracked so that program logic accidentally does not create --- the same menus twice during initialization logic. --- These menu classes are handling this logic with this variable. -local _MENUCLIENTS = {} - ---- The MENU_CLIENT class --- @type MENU_CLIENT --- @extends Menu#MENU -MENU_CLIENT = { - ClassName = "MENU_CLIENT" -} - ---- Creates a new menu item for a group --- @param self --- @param Client#CLIENT MenuClient The Client owning the menu. --- @param #string MenuText The text for the menu. --- @param #table ParentMenu The parent menu. --- @return #MENU_CLIENT self -function MENU_CLIENT:New( MenuClient, MenuText, ParentMenu ) - - -- Arrange meta tables - local MenuParentPath = {} - if ParentMenu ~= nil then - MenuParentPath = ParentMenu.MenuPath - end - - local self = BASE:Inherit( self, MENU:New( MenuText, MenuParentPath ) ) - self:F( { MenuClient, MenuText, ParentMenu } ) - - self.MenuClient = MenuClient - self.MenuClientGroupID = MenuClient:GetClientGroupID() - self.MenuParentPath = MenuParentPath - self.MenuText = MenuText - self.ParentMenu = ParentMenu - - self.Menus = {} - - if not _MENUCLIENTS[self.MenuClientGroupID] then - _MENUCLIENTS[self.MenuClientGroupID] = {} - end - - local MenuPath = _MENUCLIENTS[self.MenuClientGroupID] - - self:T( { MenuClient:GetClientGroupName(), MenuPath[table.concat(MenuParentPath)], MenuParentPath, MenuText } ) - - local MenuPathID = table.concat(MenuParentPath) .. "/" .. MenuText - if MenuPath[MenuPathID] then - missionCommands.removeItemForGroup( self.MenuClient:GetClientGroupID(), MenuPath[MenuPathID] ) - end - - self.MenuPath = missionCommands.addSubMenuForGroup( self.MenuClient:GetClientGroupID(), MenuText, MenuParentPath ) - MenuPath[MenuPathID] = self.MenuPath - - self:T( { MenuClient:GetClientGroupName(), self.MenuPath } ) - - if ParentMenu and ParentMenu.Menus then - ParentMenu.Menus[self.MenuPath] = self - end - return self -end - ---- Removes the sub menus recursively of this MENU_CLIENT. --- @param #MENU_CLIENT self --- @return #MENU_CLIENT self -function MENU_CLIENT:RemoveSubMenus() - self:F( self.MenuPath ) - - for MenuID, Menu in pairs( self.Menus ) do - Menu:Remove() - end - -end - ---- Removes the sub menus recursively of this MENU_CLIENT. --- @param #MENU_CLIENT self --- @return #MENU_CLIENT self -function MENU_CLIENT:Remove() - self:F( self.MenuPath ) - - self:RemoveSubMenus() - - if not _MENUCLIENTS[self.MenuClientGroupID] then - _MENUCLIENTS[self.MenuClientGroupID] = {} - end - - local MenuPath = _MENUCLIENTS[self.MenuClientGroupID] - - if MenuPath[table.concat(self.MenuParentPath) .. "/" .. self.MenuText] then - MenuPath[table.concat(self.MenuParentPath) .. "/" .. self.MenuText] = nil - end - - missionCommands.removeItemForGroup( self.MenuClient:GetClientGroupID(), self.MenuPath ) - self.ParentMenu.Menus[self.MenuPath] = nil - return nil -end - - ---- The MENU_CLIENT_COMMAND class --- @type MENU_CLIENT_COMMAND --- @extends Menu#MENU -MENU_CLIENT_COMMAND = { - ClassName = "MENU_CLIENT_COMMAND" -} - ---- Creates a new radio command item for a group --- @param self --- @param Client#CLIENT MenuClient The Client owning the menu. --- @param MenuText The text for the menu. --- @param ParentMenu The parent menu. --- @param CommandMenuFunction A function that is called when the menu key is pressed. --- @param CommandMenuArgument An argument for the function. --- @return Menu#MENU_CLIENT_COMMAND self -function MENU_CLIENT_COMMAND:New( MenuClient, MenuText, ParentMenu, CommandMenuFunction, CommandMenuArgument ) - - -- Arrange meta tables - - local MenuParentPath = {} - if ParentMenu ~= nil then - MenuParentPath = ParentMenu.MenuPath - end - - local self = BASE:Inherit( self, MENU:New( MenuText, MenuParentPath ) ) - - self.MenuClient = MenuClient - self.MenuClientGroupID = MenuClient:GetClientGroupID() - self.MenuParentPath = MenuParentPath - self.MenuText = MenuText - self.ParentMenu = ParentMenu - - if not _MENUCLIENTS[self.MenuClientGroupID] then - _MENUCLIENTS[self.MenuClientGroupID] = {} - end - - local MenuPath = _MENUCLIENTS[self.MenuClientGroupID] - - self:T( { MenuClient:GetClientGroupName(), MenuPath[table.concat(MenuParentPath)], MenuParentPath, MenuText, CommandMenuFunction, CommandMenuArgument } ) - - local MenuPathID = table.concat(MenuParentPath) .. "/" .. MenuText - if MenuPath[MenuPathID] then - missionCommands.removeItemForGroup( self.MenuClient:GetClientGroupID(), MenuPath[MenuPathID] ) - end - - self.MenuPath = missionCommands.addCommandForGroup( self.MenuClient:GetClientGroupID(), MenuText, MenuParentPath, CommandMenuFunction, CommandMenuArgument ) - MenuPath[MenuPathID] = self.MenuPath - - self.CommandMenuFunction = CommandMenuFunction - self.CommandMenuArgument = CommandMenuArgument - - ParentMenu.Menus[self.MenuPath] = self - - return self -end - -function MENU_CLIENT_COMMAND:Remove() - self:F( self.MenuPath ) - - if not _MENUCLIENTS[self.MenuClientGroupID] then - _MENUCLIENTS[self.MenuClientGroupID] = {} - end - - local MenuPath = _MENUCLIENTS[self.MenuClientGroupID] - - if MenuPath[table.concat(self.MenuParentPath) .. "/" .. self.MenuText] then - MenuPath[table.concat(self.MenuParentPath) .. "/" .. self.MenuText] = nil - end - - missionCommands.removeItemForGroup( self.MenuClient:GetClientGroupID(), self.MenuPath ) - self.ParentMenu.Menus[self.MenuPath] = nil - return nil -end - - ---- The MENU_COALITION class --- @type MENU_COALITION --- @extends Menu#MENU -MENU_COALITION = { - ClassName = "MENU_COALITION" -} - ---- Creates a new coalition menu item --- @param #MENU_COALITION self --- @param DCSCoalition#coalition.side MenuCoalition The coalition owning the menu. --- @param #string MenuText The text for the menu. --- @param #table ParentMenu The parent menu. --- @return #MENU_COALITION self -function MENU_COALITION:New( MenuCoalition, MenuText, ParentMenu ) - - -- Arrange meta tables - local MenuParentPath = {} - if ParentMenu ~= nil then - MenuParentPath = ParentMenu.MenuPath - end - - local self = BASE:Inherit( self, MENU:New( MenuText, MenuParentPath ) ) - self:F( { MenuCoalition, MenuText, ParentMenu } ) - - self.MenuCoalition = MenuCoalition - self.MenuParentPath = MenuParentPath - self.MenuText = MenuText - self.ParentMenu = ParentMenu - - self.Menus = {} - - self:T( { MenuParentPath, MenuText } ) - - self.MenuPath = missionCommands.addSubMenuForCoalition( self.MenuCoalition, MenuText, MenuParentPath ) - - self:T( { self.MenuPath } ) - - if ParentMenu and ParentMenu.Menus then - ParentMenu.Menus[self.MenuPath] = self - end - return self -end - ---- Removes the sub menus recursively of this MENU_COALITION. --- @param #MENU_COALITION self --- @return #MENU_COALITION self -function MENU_COALITION:RemoveSubMenus() - self:F( self.MenuPath ) - - for MenuID, Menu in pairs( self.Menus ) do - Menu:Remove() - end - -end - ---- Removes the sub menus recursively of this MENU_COALITION. --- @param #MENU_COALITION self --- @return #MENU_COALITION self -function MENU_COALITION:Remove() - self:F( self.MenuPath ) - - self:RemoveSubMenus() - missionCommands.removeItemForCoalition( self.MenuCoalition, self.MenuPath ) - self.ParentMenu.Menus[self.MenuPath] = nil - - return nil -end - - ---- The MENU_COALITION_COMMAND class --- @type MENU_COALITION_COMMAND --- @extends Menu#MENU -MENU_COALITION_COMMAND = { - ClassName = "MENU_COALITION_COMMAND" -} - ---- Creates a new radio command item for a group --- @param #MENU_COALITION_COMMAND self --- @param DCSCoalition#coalition.side MenuCoalition The coalition owning the menu. --- @param MenuText The text for the menu. --- @param ParentMenu The parent menu. --- @param CommandMenuFunction A function that is called when the menu key is pressed. --- @param CommandMenuArgument An argument for the function. --- @return #MENU_COALITION_COMMAND self -function MENU_COALITION_COMMAND:New( MenuCoalition, MenuText, ParentMenu, CommandMenuFunction, CommandMenuArgument ) - - -- Arrange meta tables - - local MenuParentPath = {} - if ParentMenu ~= nil then - MenuParentPath = ParentMenu.MenuPath - end - - local self = BASE:Inherit( self, MENU:New( MenuText, MenuParentPath ) ) - - self.MenuCoalition = MenuCoalition - self.MenuParentPath = MenuParentPath - self.MenuText = MenuText - self.ParentMenu = ParentMenu - - self:T( { MenuParentPath, MenuText, CommandMenuFunction, CommandMenuArgument } ) - - self.MenuPath = missionCommands.addCommandForCoalition( self.MenuCoalition, MenuText, MenuParentPath, CommandMenuFunction, CommandMenuArgument ) - - self.CommandMenuFunction = CommandMenuFunction - self.CommandMenuArgument = CommandMenuArgument - - ParentMenu.Menus[self.MenuPath] = self - - return self -end - ---- Removes a radio command item for a coalition --- @param #MENU_COALITION_COMMAND self --- @return #MENU_COALITION_COMMAND self -function MENU_COALITION_COMMAND:Remove() - self:F( self.MenuPath ) - - missionCommands.removeItemForCoalition( self.MenuCoalition, self.MenuPath ) - self.ParentMenu.Menus[self.MenuPath] = nil - return nil -end ---- GROUP class. --- --- @{GROUP} class --- ============== --- The @{GROUP} class is a wrapper class to handle the DCS Group objects: --- --- * Support all DCS Group APIs. --- * Enhance with Group specific APIs not in the DCS Group API set. --- * Handle local Group Controller. --- * Manage the "state" of the DCS Group. --- --- --- GROUP reference methods --- ======================= --- For each DCS Group object alive within a running mission, a GROUP wrapper object (instance) will be created within the _@{DATABASE} object. --- This is done at the beginning of the mission (when the mission starts), and dynamically when new DCS Group objects are spawned (using the @{SPAWN} class). --- --- The GROUP class does not contain a :New() method, rather it provides :Find() methods to retrieve the object reference --- using the DCS Group or the DCS GroupName. --- --- Another thing to know is that GROUP objects do not "contain" the DCS Group object. --- The GROUP methods will reference the DCS Group object by name when it is needed during API execution. --- If the DCS Group object does not exist or is nil, the GROUP methods will return nil and log an exception in the DCS.log file. --- --- The GROUP class provides the following functions to retrieve quickly the relevant GROUP instance: --- --- * @{#GROUP.Find}(): Find a GROUP instance from the _DATABASE object using a DCS Group object. --- * @{#GROUP.FindByName}(): Find a GROUP instance from the _DATABASE object using a DCS Group name. --- --- IMPORTANT: ONE SHOULD NEVER SANATIZE these GROUP OBJECT REFERENCES! (make the GROUP object references nil). --- @module Group --- @author FlightControl - -Include.File( "Routines" ) -Include.File( "Base" ) -Include.File( "Message" ) -Include.File( "Unit" ) - ---- The GROUP class --- @type GROUP --- @extends Base#BASE --- @field DCSGroup#Group DCSGroup The DCS group class. --- @field #string GroupName The name of the group. -GROUP = { - ClassName = "GROUP", - GroupName = "", - GroupID = 0, - Controller = nil, - DCSGroup = nil, - WayPointFunctions = {}, -} - ---- A DCSGroup --- @type DCSGroup --- @field id_ The ID of the group in DCS - ---- Create a new GROUP from a DCSGroup --- @param #GROUP self --- @param DCSGroup#Group GroupName The DCS Group name --- @return #GROUP self -function GROUP:Register( GroupName ) - local self = BASE:Inherit( self, BASE:New() ) - self:F2( GroupName ) - self.GroupName = GroupName - return self -end - --- Reference methods. - ---- Find the GROUP wrapper class instance using the DCS Group. --- @param #GROUP self --- @param DCSGroup#Group DCSGroup The DCS Group. --- @return #GROUP The GROUP. -function GROUP:Find( DCSGroup ) - - local GroupName = DCSGroup:getName() -- Group#GROUP - local GroupFound = _DATABASE:FindGroup( GroupName ) - return GroupFound -end - ---- Find the created GROUP using the DCS Group Name. --- @param #GROUP self --- @param #string GroupName The DCS Group Name. --- @return #GROUP The GROUP. -function GROUP:FindByName( GroupName ) - - local GroupFound = _DATABASE:FindGroup( GroupName ) - return GroupFound -end - --- DCS Group methods support. - ---- Returns the DCS Group. --- @param #GROUP self --- @return DCSGroup#Group The DCS Group. -function GROUP:GetDCSGroup() - local DCSGroup = Group.getByName( self.GroupName ) - - if DCSGroup then - return DCSGroup - end - - return nil -end - - ---- Returns if the DCS Group is alive. --- When the group exists at run-time, this method will return true, otherwise false. --- @param #GROUP self --- @return #boolean true if the DCS Group is alive. -function GROUP:IsAlive() - self:F2( self.GroupName ) - - local DCSGroup = self:GetDCSGroup() - - if DCSGroup then - local GroupIsAlive = DCSGroup:isExist() - self:T3( GroupIsAlive ) - return GroupIsAlive - end - - return nil -end - ---- Destroys the DCS Group and all of its DCS Units. --- Note that this destroy method also raises a destroy event at run-time. --- So all event listeners will catch the destroy event of this DCS Group. --- @param #GROUP self -function GROUP:Destroy() - self:F2( self.GroupName ) - - local DCSGroup = self:GetDCSGroup() - - if DCSGroup then - for Index, UnitData in pairs( DCSGroup:getUnits() ) do - self:CreateEventCrash( timer.getTime(), UnitData ) - end - DCSGroup:destroy() - DCSGroup = nil - end - - return nil -end - ---- Returns category of the DCS Group. --- @param #GROUP self --- @return DCSGroup#Group.Category The category ID -function GROUP:GetCategory() - self:F2( self.GroupName ) - - local DCSGroup = self:GetDCSGroup() - if DCSGroup then - local GroupCategory = DCSGroup:getCategory() - self:T3( GroupCategory ) - return GroupCategory - end - - return nil -end - ---- Returns the category name of the DCS Group. --- @param #GROUP self --- @return #string Category name = Helicopter, Airplane, Ground Unit, Ship -function GROUP:GetCategoryName() - self:F2( self.GroupName ) - - local DCSGroup = self:GetDCSGroup() - if DCSGroup then - local CategoryNames = { - [Group.Category.AIRPLANE] = "Airplane", - [Group.Category.HELICOPTER] = "Helicopter", - [Group.Category.GROUND] = "Ground Unit", - [Group.Category.SHIP] = "Ship", - } - local GroupCategory = DCSGroup:getCategory() - self:T3( GroupCategory ) - - return CategoryNames[GroupCategory] - end - - return nil -end - - ---- Returns the coalition of the DCS Group. --- @param #GROUP self --- @return DCSCoalitionObject#coalition.side The coalition side of the DCS Group. -function GROUP:GetCoalition() - self:F2( self.GroupName ) - - local DCSGroup = self:GetDCSGroup() - if DCSGroup then - local GroupCoalition = DCSGroup:getCoalition() - self:T3( GroupCoalition ) - return GroupCoalition - end - - return nil -end - ---- Returns the country of the DCS Group. --- @param #GROUP self --- @return DCScountry#country.id The country identifier. --- @return #nil The DCS Group is not existing or alive. -function GROUP:GetCountry() - self:F2( self.GroupName ) - - local DCSGroup = self:GetDCSGroup() - if DCSGroup then - local GroupCountry = DCSGroup:getUnit(1):getCountry() - self:T3( GroupCountry ) - return GroupCountry - end - - return nil -end - ---- Returns the name of the DCS Group. --- @param #GROUP self --- @return #string The DCS Group name. -function GROUP:GetName() - self:F2( self.GroupName ) - - local DCSGroup = self:GetDCSGroup() - - if DCSGroup then - local GroupName = DCSGroup:getName() - self:T3( GroupName ) - return GroupName - end - - return nil -end - ---- Returns the DCS Group identifier. --- @param #GROUP self --- @return #number The identifier of the DCS Group. -function GROUP:GetID() - self:F2( self.GroupName ) - - local DCSGroup = self:GetDCSGroup() - - if DCSGroup then - local GroupID = DCSGroup:getID() - self:T3( GroupID ) - return GroupID - end - - return nil -end - ---- Returns the UNIT wrapper class with number UnitNumber. --- If the underlying DCS Unit does not exist, the method will return nil. . --- @param #GROUP self --- @param #number UnitNumber The number of the UNIT wrapper class to be returned. --- @return Unit#UNIT The UNIT wrapper class. -function GROUP:GetUnit( UnitNumber ) - self:F2( { self.GroupName, UnitNumber } ) - - local DCSGroup = self:GetDCSGroup() - - if DCSGroup then - local UnitFound = UNIT:Find( DCSGroup:getUnit( UnitNumber ) ) - self:T3( UnitFound.UnitName ) - self:T2( UnitFound ) - return UnitFound - end - - return nil -end - ---- Returns the DCS Unit with number UnitNumber. --- If the underlying DCS Unit does not exist, the method will return nil. . --- @param #GROUP self --- @param #number UnitNumber The number of the DCS Unit to be returned. --- @return DCSUnit#Unit The DCS Unit. -function GROUP:GetDCSUnit( UnitNumber ) - self:F2( { self.GroupName, UnitNumber } ) - - local DCSGroup = self:GetDCSGroup() - - if DCSGroup then - local DCSUnitFound = DCSGroup:getUnit( UnitNumber ) - self:T3( DCSUnitFound ) - return DCSUnitFound - end - - return nil -end - ---- Returns current size of the DCS Group. --- If some of the DCS Units of the DCS Group are destroyed the size of the DCS Group is changed. --- @param #GROUP self --- @return #number The DCS Group size. -function GROUP:GetSize() - self:F2( { self.GroupName } ) - local DCSGroup = self:GetDCSGroup() - - if DCSGroup then - local GroupSize = DCSGroup:getSize() - self:T3( GroupSize ) - return GroupSize - end - - return nil -end - ---- ---- Returns the initial size of the DCS Group. --- If some of the DCS Units of the DCS Group are destroyed, the initial size of the DCS Group is unchanged. --- @param #GROUP self --- @return #number The DCS Group initial size. -function GROUP:GetInitialSize() - self:F2( { self.GroupName } ) - local DCSGroup = self:GetDCSGroup() - - if DCSGroup then - local GroupInitialSize = DCSGroup:getInitialSize() - self:T3( GroupInitialSize ) - return GroupInitialSize - end - - return nil -end - ---- Returns the UNITs wrappers of the DCS Units of the DCS Group. --- @param #GROUP self --- @return #table The UNITs wrappers. -function GROUP:GetUnits() - self:F2( { self.GroupName } ) - local DCSGroup = self:GetDCSGroup() - - if DCSGroup then - local DCSUnits = DCSGroup:getUnits() - local Units = {} - for Index, UnitData in pairs( DCSUnits ) do - Units[#Units+1] = UNIT:Find( UnitData ) - end - self:T3( Units ) - return Units - end - - return nil -end - - ---- Returns the DCS Units of the DCS Group. --- @param #GROUP self --- @return #table The DCS Units. -function GROUP:GetDCSUnits() - self:F2( { self.GroupName } ) - local DCSGroup = self:GetDCSGroup() - - if DCSGroup then - local DCSUnits = DCSGroup:getUnits() - self:T3( DCSUnits ) - return DCSUnits - end - - return nil -end - ---- Get the controller for the GROUP. --- @param #GROUP self --- @return DCSController#Controller -function GROUP:_GetController() - self:F2( { self.GroupName } ) - local DCSGroup = self:GetDCSGroup() - - if DCSGroup then - local GroupController = DCSGroup:getController() - self:T3( GroupController ) - return GroupController - end - - return nil -end - - ---- Retrieve the group mission and allow to place function hooks within the mission waypoint plan. --- Use the method @{Group#GROUP:WayPointFunction} to define the hook functions for specific waypoints. --- Use the method @{Group@GROUP:WayPointExecute) to start the execution of the new mission plan. --- Note that when WayPointInitialize is called, the Mission of the group is RESTARTED! --- @param #GROUP self --- @return #GROUP -function GROUP:WayPointInitialize() - - self.WayPoints = self:GetTaskRoute() - - return self -end - - ---- Registers a waypoint function that will be executed when the group moves over the WayPoint. --- @param #GROUP self --- @param #number WayPoint The waypoint number. Note that the start waypoint on the route is WayPoint 1! --- @param #number WayPointIndex When defining multiple WayPoint functions for one WayPoint, use WayPointIndex to set the sequence of actions. --- @param #function WayPointFunction The waypoint function to be called when the group moves over the waypoint. The waypoint function takes variable parameters. --- @return #GROUP -function GROUP:WayPointFunction( WayPoint, WayPointIndex, WayPointFunction, ... ) - self:F2( { WayPoint, WayPointIndex, WayPointFunction } ) - - table.insert( self.WayPoints[WayPoint].task.params.tasks, WayPointIndex ) - self.WayPoints[WayPoint].task.params.tasks[WayPointIndex] = self:TaskFunction( WayPoint, WayPointIndex, WayPointFunction, arg ) - return self -end - - -function GROUP:TaskFunction( WayPoint, WayPointIndex, FunctionString, FunctionArguments ) - - local DCSTask - - local DCSScript = {} - DCSScript[#DCSScript+1] = "local MissionGroup = GROUP:Find( ... ) " - - if FunctionArguments.n > 0 then - DCSScript[#DCSScript+1] = FunctionString .. "( MissionGroup, " .. table.concat( FunctionArguments, "," ) .. ")" - else - DCSScript[#DCSScript+1] = FunctionString .. "( MissionGroup )" - end - - DCSTask = self:TaskWrappedAction( - self:CommandDoScript( - table.concat( DCSScript ) - ), WayPointIndex - ) - - self:T3( DCSTask ) - - return DCSTask - -end - - - ---- Executes the WayPoint plan. --- The function gets a WayPoint parameter, that you can use to restart the mission at a specific WayPoint. --- Note that when the WayPoint parameter is used, the new start mission waypoint of the group will be 1! --- @param #GROUP self --- @param #number WayPoint The WayPoint from where to execute the mission. --- @param #WaitTime The amount seconds to wait before initiating the mission. --- @return #GROUP -function GROUP:WayPointExecute( WayPoint, WaitTime ) - - if not WayPoint then - WayPoint = 1 - end - - -- When starting the mission from a certain point, the TaskPoints need to be deleted before the given WayPoint. - for TaskPointID = 1, WayPoint - 1 do - table.remove( self.WayPoints, 1 ) - end - - self:T3( self.WayPoints ) - - self:SetTask( self:TaskRoute( self.WayPoints ), WaitTime ) - - return self -end - - ---- Activates a GROUP. --- @param #GROUP self -function GROUP:Activate() - self:F2( { self.GroupName } ) - trigger.action.activateGroup( self:GetDCSGroup() ) - return self:GetDCSGroup() -end - - ---- Gets the type name of the group. --- @param #GROUP self --- @return #string The type name of the group. -function GROUP:GetTypeName() - self:F2( self.GroupName ) - - local DCSGroup = self:GetDCSGroup() - - if DCSGroup then - local GroupTypeName = DCSGroup:getUnit(1):getTypeName() - self:T3( GroupTypeName ) - return( GroupTypeName ) - end - - return nil -end - ---- Gets the CallSign of the first DCS Unit of the DCS Group. --- @param #GROUP self --- @return #string The CallSign of the first DCS Unit of the DCS Group. -function GROUP:GetCallsign() - self:F2( self.GroupName ) - - local DCSGroup = self:GetDCSGroup() - - if DCSGroup then - local GroupCallSign = DCSGroup:getUnit(1):getCallsign() - self:T3( GroupCallSign ) - return GroupCallSign - end - - return nil -end - ---- Returns the current point (Vec2 vector) of the first DCS Unit in the DCS Group. --- @return DCSTypes#Vec2 Current Vec2 point of the first DCS Unit of the DCS Group. -function GROUP:GetPointVec2() - self:F2( self.GroupName ) - - local GroupPointVec2 = self:GetUnit(1):GetPointVec2() - self:T3( GroupPointVec2 ) - return GroupPointVec2 -end - ---- Returns the current point (Vec3 vector) of the first DCS Unit in the DCS Group. --- @return DCSTypes#Vec3 Current Vec3 point of the first DCS Unit of the DCS Group. -function GROUP:GetPointVec3() - self:F2( self.GroupName ) - - local GroupPointVec3 = self:GetUnit(1):GetPointVec3() - self:T3( GroupPointVec3 ) - return GroupPointVec3 -end - - - --- Is Functions - ---- Returns if the group is of an air category. --- If the group is a helicopter or a plane, then this method will return true, otherwise false. --- @param #GROUP self --- @return #boolean Air category evaluation result. -function GROUP:IsAir() - self:F2( self.GroupName ) - - local DCSGroup = self:GetDCSGroup() - - if DCSGroup then - local IsAirResult = DCSGroup:getCategory() == Group.Category.AIRPLANE or DCSGroup:getCategory() == Group.Category.HELICOPTER - self:T3( IsAirResult ) - return IsAirResult - end - - return nil -end - ---- Returns if the DCS Group contains Helicopters. --- @param #GROUP self --- @return #boolean true if DCS Group contains Helicopters. -function GROUP:IsHelicopter() - self:F2( self.GroupName ) - - local DCSGroup = self:GetDCSGroup() - - if DCSGroup then - local GroupCategory = DCSGroup:getCategory() - self:T2( GroupCategory ) - return GroupCategory == Group.Category.HELICOPTER - end - - return nil -end - ---- Returns if the DCS Group contains AirPlanes. --- @param #GROUP self --- @return #boolean true if DCS Group contains AirPlanes. -function GROUP:IsAirPlane() - self:F2() - - local DCSGroup = self:GetDCSGroup() - - if DCSGroup then - local GroupCategory = DCSGroup:getCategory() - self:T2( GroupCategory ) - return GroupCategory == Group.Category.AIRPLANE - end - - return nil -end - ---- Returns if the DCS Group contains Ground troops. --- @param #GROUP self --- @return #boolean true if DCS Group contains Ground troops. -function GROUP:IsGround() - self:F2() - - local DCSGroup = self:GetDCSGroup() - - if DCSGroup then - local GroupCategory = DCSGroup:getCategory() - self:T2( GroupCategory ) - return GroupCategory == Group.Category.GROUND - end - - return nil -end - ---- Returns if the DCS Group contains Ships. --- @param #GROUP self --- @return #boolean true if DCS Group contains Ships. -function GROUP:IsShip() - self:F2() - - local DCSGroup = self:GetDCSGroup() - - if DCSGroup then - local GroupCategory = DCSGroup:getCategory() - self:T2( GroupCategory ) - return GroupCategory == Group.Category.SHIP - end - - return nil -end - ---- Returns if all units of the group are on the ground or landed. --- If all units of this group are on the ground, this function will return true, otherwise false. --- @param #GROUP self --- @return #boolean All units on the ground result. -function GROUP:AllOnGround() - self:F2() - - local DCSGroup = self:GetDCSGroup() - - if DCSGroup then - local AllOnGroundResult = true - - for Index, UnitData in pairs( DCSGroup:getUnits() ) do - if UnitData:inAir() then - AllOnGroundResult = false - end - end - - self:T3( AllOnGroundResult ) - return AllOnGroundResult - end - - return nil -end - ---- Returns the current maximum velocity of the group. --- Each unit within the group gets evaluated, and the maximum velocity (= the unit which is going the fastest) is returned. --- @param #GROUP self --- @return #number Maximum velocity found. -function GROUP:GetMaxVelocity() - self:F2() - - local DCSGroup = self:GetDCSGroup() - - if DCSGroup then - local MaxVelocity = 0 - - for Index, UnitData in pairs( DCSGroup:getUnits() ) do - - local Velocity = UnitData:getVelocity() - local VelocityTotal = math.abs( Velocity.x ) + math.abs( Velocity.y ) + math.abs( Velocity.z ) - - if VelocityTotal < MaxVelocity then - MaxVelocity = VelocityTotal - end - end - - return MaxVelocity - end - - return nil -end - ---- Returns the current minimum height of the group. --- Each unit within the group gets evaluated, and the minimum height (= the unit which is the lowest elevated) is returned. --- @param #GROUP self --- @return #number Minimum height found. -function GROUP:GetMinHeight() - self:F2() - -end - ---- Returns the current maximum height of the group. --- Each unit within the group gets evaluated, and the maximum height (= the unit which is the highest elevated) is returned. --- @param #GROUP self --- @return #number Maximum height found. -function GROUP:GetMaxHeight() - self:F2() - -end - --- Tasks - ---- Popping current Task from the group. --- @param #GROUP self --- @return Group#GROUP self -function GROUP:PopCurrentTask() - self:F2() - - local DCSGroup = self:GetDCSGroup() - - if DCSGroup then - local Controller = self:_GetController() - Controller:popTask() - return self - end - - return nil -end - ---- Pushing Task on the queue from the group. --- @param #GROUP self --- @return Group#GROUP self -function GROUP:PushTask( DCSTask, WaitTime ) - self:F2() - - local DCSGroup = self:GetDCSGroup() - - if DCSGroup then - local Controller = self:_GetController() - - -- When a group SPAWNs, it takes about a second to get the group in the simulator. Setting tasks to unspawned groups provides unexpected results. - -- Therefore we schedule the functions to set the mission and options for the Group. - -- Controller:pushTask( DCSTask ) - - if WaitTime then - --routines.scheduleFunction( Controller.pushTask, { Controller, DCSTask }, timer.getTime() + WaitTime ) - SCHEDULER:New( Controller, Controller.pushTask, { DCSTask }, WaitTime ) - else - Controller:pushTask( DCSTask ) - end - - return self - end - - return nil -end - ---- Clearing the Task Queue and Setting the Task on the queue from the group. --- @param #GROUP self --- @return Group#GROUP self -function GROUP:SetTask( DCSTask, WaitTime ) - self:F2( { DCSTask } ) - - local DCSGroup = self:GetDCSGroup() - - if DCSGroup then - - local Controller = self:_GetController() - - -- When a group SPAWNs, it takes about a second to get the group in the simulator. Setting tasks to unspawned groups provides unexpected results. - -- Therefore we schedule the functions to set the mission and options for the Group. - -- Controller.setTask( Controller, DCSTask ) - - if not WaitTime then - WaitTime = 1 - end - --routines.scheduleFunction( Controller.setTask, { Controller, DCSTask }, timer.getTime() + WaitTime ) - SCHEDULER:New( Controller, Controller.setTask, { DCSTask }, WaitTime ) - - return self - end - - return nil -end - - ---- Return a condition section for a controlled task --- @param #GROUP self --- @param DCSTime#Time time --- @param #string userFlag --- @param #boolean userFlagValue --- @param #string condition --- @param DCSTime#Time duration --- @param #number lastWayPoint --- return DCSTask#Task -function GROUP:TaskCondition( time, userFlag, userFlagValue, condition, duration, lastWayPoint ) - self:F2( { time, userFlag, userFlagValue, condition, duration, lastWayPoint } ) - - local DCSStopCondition = {} - DCSStopCondition.time = time - DCSStopCondition.userFlag = userFlag - DCSStopCondition.userFlagValue = userFlagValue - DCSStopCondition.condition = condition - DCSStopCondition.duration = duration - DCSStopCondition.lastWayPoint = lastWayPoint - - self:T3( { DCSStopCondition } ) - return DCSStopCondition -end - ---- Return a Controlled Task taking a Task and a TaskCondition --- @param #GROUP self --- @param DCSTask#Task DCSTask --- @param #DCSStopCondition DCSStopCondition --- @return DCSTask#Task -function GROUP:TaskControlled( DCSTask, DCSStopCondition ) - self:F2( { DCSTask, DCSStopCondition } ) - - local DCSTaskControlled - - DCSTaskControlled = { - id = 'ControlledTask', - params = { - task = DCSTask, - stopCondition = DCSStopCondition - } - } - - self:T3( { DCSTaskControlled } ) - return DCSTaskControlled -end - ---- Return a Combo Task taking an array of Tasks --- @param #GROUP self --- @param #list DCSTasks --- @return DCSTask#Task -function GROUP:TaskCombo( DCSTasks ) - self:F2( { DCSTasks } ) - - local DCSTaskCombo - - DCSTaskCombo = { - id = 'ComboTask', - params = { - tasks = DCSTasks - } - } - - self:T3( { DCSTaskCombo } ) - return DCSTaskCombo -end - ---- Return a WrappedAction Task taking a Command --- @param #GROUP self --- @param DCSCommand#Command DCSCommand --- @return DCSTask#Task -function GROUP:TaskWrappedAction( DCSCommand, Index ) - self:F2( { DCSCommand } ) - - local DCSTaskWrappedAction - - DCSTaskWrappedAction = { - id = "WrappedAction", - enabled = true, - number = Index, - auto = false, - params = { - action = DCSCommand, - }, - } - - self:T3( { DCSTaskWrappedAction } ) - return DCSTaskWrappedAction -end - ---- Executes a command action --- @param #GROUP self --- @param DCSCommand#Command DCSCommand --- @return #GROUP self -function GROUP:SetCommand( DCSCommand ) - self:F2( DCSCommand ) - - local DCSGroup = self:GetDCSGroup() - - if DCSGroup then - local Controller = self:_GetController() - Controller:setCommand( DCSCommand ) - return self - end - - return nil -end - ---- Perform a switch waypoint command --- @param #GROUP self --- @param #number FromWayPoint --- @param #number ToWayPoint --- @return DCSTask#Task -function GROUP:CommandSwitchWayPoint( FromWayPoint, ToWayPoint, Index ) - self:F2( { FromWayPoint, ToWayPoint, Index } ) - - local CommandSwitchWayPoint = { - id = 'SwitchWaypoint', - params = { - fromWaypointIndex = FromWayPoint, - goToWaypointIndex = ToWayPoint, - }, - } - - self:T3( { CommandSwitchWayPoint } ) - return CommandSwitchWayPoint -end - - --- TASKS FOR AIR GROUPS - - ---- (AIR) Attack a Group. --- @param #GROUP self --- @param Group#GROUP AttackGroup The Group to be attacked. --- @param #number WeaponType (optional) Bitmask of weapon types those allowed to use. If parameter is not defined that means no limits on weapon usage. --- @param DCSTypes#AI.Task.WeaponExpend WeaponExpend (optional) Determines how much weapon will be released at each attack. If parameter is not defined the unit / group will choose expend on its own discretion. --- @param #number AttackQty (optional) This parameter limits maximal quantity of attack. The aicraft/group will not make more attack than allowed even if the target group not destroyed and the aicraft/group still have ammo. If not defined the aircraft/group will attack target until it will be destroyed or until the aircraft/group will run out of ammo. --- @param DCSTypes#Azimuth Direction (optional) Desired ingress direction from the target to the attacking aircraft. Group/aircraft will make its attacks from the direction. Of course if there is no way to attack from the direction due the terrain group/aircraft will choose another direction. --- @param DCSTypes#Distance Altitude (optional) Desired attack start altitude. Group/aircraft will make its attacks from the altitude. If the altitude is too low or too high to use weapon aircraft/group will choose closest altitude to the desired attack start altitude. If the desired altitude is defined group/aircraft will not attack from safe altitude. --- @param #boolean AttackQtyLimit (optional) The flag determines how to interpret attackQty parameter. If the flag is true then attackQty is a limit on maximal attack quantity for "AttackGroup" and "AttackUnit" tasks. If the flag is false then attackQty is a desired attack quantity for "Bombing" and "BombingRunway" tasks. --- @return DCSTask#Task The DCS task structure. -function GROUP:TaskAttackGroup( AttackGroup, WeaponType, WeaponExpend, AttackQty, Direction, Altitude, AttackQtyLimit ) - self:F2( { self.GroupName, AttackGroup, WeaponType, WeaponExpend, AttackQty, Direction, Altitude, AttackQtyLimit } ) - - -- AttackGroup = { - -- id = 'AttackGroup', - -- params = { - -- groupId = Group.ID, - -- weaponType = number, - -- expend = enum AI.Task.WeaponExpend, - -- attackQty = number, - -- directionEnabled = boolean, - -- direction = Azimuth, - -- altitudeEnabled = boolean, - -- altitude = Distance, - -- attackQtyLimit = boolean, - -- } - -- } - - local DirectionEnabled = nil - if Direction then - DirectionEnabled = true - end - - local AltitudeEnabled = nil - if Altitude then - AltitudeEnabled = true - end - - local DCSTask - DCSTask = { id = 'AttackGroup', - params = { - groupId = AttackGroup:GetID(), - weaponType = WeaponType, - expend = WeaponExpend, - attackQty = AttackQty, - directionEnabled = DirectionEnabled, - direction = Direction, - altitudeEnabled = AltitudeEnabled, - altitude = Altitude, - attackQtyLimit = AttackQtyLimit, - }, - }, - - self:T3( { DCSTask } ) - return DCSTask -end - - ---- (AIR) Attack the Unit. --- @param #GROUP self --- @param Unit#UNIT AttackUnit The unit. --- @param #number WeaponType (optional) Bitmask of weapon types those allowed to use. If parameter is not defined that means no limits on weapon usage. --- @param DCSTypes#AI.Task.WeaponExpend WeaponExpend (optional) Determines how much weapon will be released at each attack. If parameter is not defined the unit / group will choose expend on its own discretion. --- @param #number AttackQty (optional) This parameter limits maximal quantity of attack. The aicraft/group will not make more attack than allowed even if the target group not destroyed and the aicraft/group still have ammo. If not defined the aircraft/group will attack target until it will be destroyed or until the aircraft/group will run out of ammo. --- @param DCSTypes#Azimuth Direction (optional) Desired ingress direction from the target to the attacking aircraft. Group/aircraft will make its attacks from the direction. Of course if there is no way to attack from the direction due the terrain group/aircraft will choose another direction. --- @param #boolean AttackQtyLimit (optional) The flag determines how to interpret attackQty parameter. If the flag is true then attackQty is a limit on maximal attack quantity for "AttackGroup" and "AttackUnit" tasks. If the flag is false then attackQty is a desired attack quantity for "Bombing" and "BombingRunway" tasks. --- @param #boolean GroupAttack (optional) Flag indicates that the target must be engaged by all aircrafts of the group. Has effect only if the task is assigned to a group, not to a single aircraft. --- @return DCSTask#Task The DCS task structure. -function GROUP:TaskAttackUnit( AttackUnit, WeaponType, WeaponExpend, AttackQty, Direction, AttackQtyLimit, GroupAttack ) - self:F2( { self.GroupName, AttackUnit, WeaponType, WeaponExpend, AttackQty, Direction, AttackQtyLimit, GroupAttack } ) - - -- AttackUnit = { - -- id = 'AttackUnit', - -- params = { - -- unitId = Unit.ID, - -- weaponType = number, - -- expend = enum AI.Task.WeaponExpend - -- attackQty = number, - -- direction = Azimuth, - -- attackQtyLimit = boolean, - -- groupAttack = boolean, - -- } - -- } - - local DCSTask - DCSTask = { id = 'AttackUnit', - params = { - unitId = AttackUnit:GetID(), - weaponType = WeaponType, - expend = WeaponExpend, - attackQty = AttackQty, - direction = Direction, - attackQtyLimit = AttackQtyLimit, - groupAttack = GroupAttack, - }, - }, - - self:T3( { DCSTask } ) - return DCSTask -end - - ---- (AIR) Delivering weapon at the point on the ground. --- @param #GROUP self --- @param DCSTypes#Vec2 PointVec2 2D-coordinates of the point to deliver weapon at. --- @param #number WeaponType (optional) Bitmask of weapon types those allowed to use. If parameter is not defined that means no limits on weapon usage. --- @param DCSTypes#AI.Task.WeaponExpend WeaponExpend (optional) Determines how much weapon will be released at each attack. If parameter is not defined the unit / group will choose expend on its own discretion. --- @param #number AttackQty (optional) Desired quantity of passes. The parameter is not the same in AttackGroup and AttackUnit tasks. --- @param DCSTypes#Azimuth Direction (optional) Desired ingress direction from the target to the attacking aircraft. Group/aircraft will make its attacks from the direction. Of course if there is no way to attack from the direction due the terrain group/aircraft will choose another direction. --- @param #boolean GroupAttack (optional) Flag indicates that the target must be engaged by all aircrafts of the group. Has effect only if the task is assigned to a group, not to a single aircraft. --- @return DCSTask#Task The DCS task structure. -function GROUP:TaskBombing( PointVec2, WeaponType, WeaponExpend, AttackQty, Direction, GroupAttack ) - self:F2( { self.GroupName, PointVec2, WeaponType, WeaponExpend, AttackQty, Direction, GroupAttack } ) - --- Bombing = { --- id = 'Bombing', --- params = { --- point = Vec2, --- weaponType = number, --- expend = enum AI.Task.WeaponExpend, --- attackQty = number, --- direction = Azimuth, --- groupAttack = boolean, --- } --- } - - local DCSTask - DCSTask = { id = 'Bombing', - params = { - point = PointVec2, - weaponType = WeaponType, - expend = WeaponExpend, - attackQty = AttackQty, - direction = Direction, - groupAttack = GroupAttack, - }, - }, - - self:T3( { DCSTask } ) - return DCSTask -end - ---- (AIR) Orbit at a specified position at a specified alititude during a specified duration with a specified speed. --- @param #GROUP self --- @param DCSTypes#Vec2 Point The point to hold the position. --- @param #number Altitude The altitude to hold the position. --- @param #number Speed The speed flying when holding the position. --- @return #GROUP self -function GROUP:TaskOrbitCircleAtVec2( Point, Altitude, Speed ) - self:F2( { self.GroupName, Point, Altitude, Speed } ) - - -- pattern = enum AI.Task.OribtPattern, - -- point = Vec2, - -- point2 = Vec2, - -- speed = Distance, - -- altitude = Distance - - local LandHeight = land.getHeight( Point ) - - self:T3( { LandHeight } ) - - local DCSTask = { id = 'Orbit', - params = { pattern = AI.Task.OrbitPattern.CIRCLE, - point = Point, - speed = Speed, - altitude = Altitude + LandHeight - } - } - - - -- local AITask = { id = 'ControlledTask', - -- params = { task = { id = 'Orbit', - -- params = { pattern = AI.Task.OrbitPattern.CIRCLE, - -- point = Point, - -- speed = Speed, - -- altitude = Altitude + LandHeight - -- } - -- }, - -- stopCondition = { duration = Duration - -- } - -- } - -- } - -- ) - - return DCSTask -end - ---- (AIR) Orbit at the current position of the first unit of the group at a specified alititude --- @param #GROUP self --- @param #number Altitude The altitude to hold the position. --- @param #number Speed The speed flying when holding the position. --- @return #GROUP self -function GROUP:TaskOrbitCircle( Altitude, Speed ) - self:F2( { self.GroupName, Altitude, Speed } ) - - local DCSGroup = self:GetDCSGroup() - - if DCSGroup then - local GroupPoint = self:GetPointVec2() - return self:TaskOrbitCircleAtVec2( GroupPoint, Altitude, Speed ) - end - - return nil -end - - - ---- (AIR) Hold position at the current position of the first unit of the group. --- @param #GROUP self --- @param #number Duration The maximum duration in seconds to hold the position. --- @return #GROUP self -function GROUP:TaskHoldPosition() - self:F2( { self.GroupName } ) - - return self:TaskOrbitCircle( 30, 10 ) -end - - - - ---- (AIR) Attacking the map object (building, structure, e.t.c). --- @param #GROUP self --- @param DCSTypes#Vec2 PointVec2 2D-coordinates of the point the map object is closest to. The distance between the point and the map object must not be greater than 2000 meters. Object id is not used here because Mission Editor doesn't support map object identificators. --- @param #number WeaponType (optional) Bitmask of weapon types those allowed to use. If parameter is not defined that means no limits on weapon usage. --- @param DCSTypes#AI.Task.WeaponExpend WeaponExpend (optional) Determines how much weapon will be released at each attack. If parameter is not defined the unit / group will choose expend on its own discretion. --- @param #number AttackQty (optional) This parameter limits maximal quantity of attack. The aicraft/group will not make more attack than allowed even if the target group not destroyed and the aicraft/group still have ammo. If not defined the aircraft/group will attack target until it will be destroyed or until the aircraft/group will run out of ammo. --- @param DCSTypes#Azimuth Direction (optional) Desired ingress direction from the target to the attacking aircraft. Group/aircraft will make its attacks from the direction. Of course if there is no way to attack from the direction due the terrain group/aircraft will choose another direction. --- @param #boolean GroupAttack (optional) Flag indicates that the target must be engaged by all aircrafts of the group. Has effect only if the task is assigned to a group, not to a single aircraft. --- @return DCSTask#Task The DCS task structure. -function GROUP:TaskAttackMapObject( PointVec2, WeaponType, WeaponExpend, AttackQty, Direction, GroupAttack ) - self:F2( { self.GroupName, PointVec2, WeaponType, WeaponExpend, AttackQty, Direction, GroupAttack } ) - --- AttackMapObject = { --- id = 'AttackMapObject', --- params = { --- point = Vec2, --- weaponType = number, --- expend = enum AI.Task.WeaponExpend, --- attackQty = number, --- direction = Azimuth, --- groupAttack = boolean, --- } --- } - - local DCSTask - DCSTask = { id = 'AttackMapObject', - params = { - point = PointVec2, - weaponType = WeaponType, - expend = WeaponExpend, - attackQty = AttackQty, - direction = Direction, - groupAttack = GroupAttack, - }, - }, - - self:T3( { DCSTask } ) - return DCSTask -end - - ---- (AIR) Delivering weapon on the runway. --- @param #GROUP self --- @param Airbase#AIRBASE Airbase Airbase to attack. --- @param #number WeaponType (optional) Bitmask of weapon types those allowed to use. If parameter is not defined that means no limits on weapon usage. --- @param DCSTypes#AI.Task.WeaponExpend WeaponExpend (optional) Determines how much weapon will be released at each attack. If parameter is not defined the unit / group will choose expend on its own discretion. --- @param #number AttackQty (optional) This parameter limits maximal quantity of attack. The aicraft/group will not make more attack than allowed even if the target group not destroyed and the aicraft/group still have ammo. If not defined the aircraft/group will attack target until it will be destroyed or until the aircraft/group will run out of ammo. --- @param DCSTypes#Azimuth Direction (optional) Desired ingress direction from the target to the attacking aircraft. Group/aircraft will make its attacks from the direction. Of course if there is no way to attack from the direction due the terrain group/aircraft will choose another direction. --- @param #boolean GroupAttack (optional) Flag indicates that the target must be engaged by all aircrafts of the group. Has effect only if the task is assigned to a group, not to a single aircraft. --- @return DCSTask#Task The DCS task structure. -function GROUP:TaskBombingRunway( Airbase, WeaponType, WeaponExpend, AttackQty, Direction, GroupAttack ) - self:F2( { self.GroupName, Airbase, WeaponType, WeaponExpend, AttackQty, Direction, GroupAttack } ) - --- BombingRunway = { --- id = 'BombingRunway', --- params = { --- runwayId = AirdromeId, --- weaponType = number, --- expend = enum AI.Task.WeaponExpend, --- attackQty = number, --- direction = Azimuth, --- groupAttack = boolean, --- } --- } - - local DCSTask - DCSTask = { id = 'BombingRunway', - params = { - point = Airbase:GetID(), - weaponType = WeaponType, - expend = WeaponExpend, - attackQty = AttackQty, - direction = Direction, - groupAttack = GroupAttack, - }, - }, - - self:T3( { DCSTask } ) - return DCSTask -end - - ---- (AIR) Refueling from the nearest tanker. No parameters. --- @param #GROUP self --- @return DCSTask#Task The DCS task structure. -function GROUP:TaskRefueling() - self:F2( { self.GroupName } ) - --- Refueling = { --- id = 'Refueling', --- params = {} --- } - - local DCSTask - DCSTask = { id = 'Refueling', - params = { - }, - }, - - self:T3( { DCSTask } ) - return DCSTask -end - - ---- (AIR HELICOPTER) Landing at the ground. For helicopters only. --- @param #GROUP self --- @param DCSTypes#Vec2 Point The point where to land. --- @param #number Duration The duration in seconds to stay on the ground. --- @return #GROUP self -function GROUP:TaskLandAtVec2( Point, Duration ) - self:F2( { self.GroupName, Point, Duration } ) - --- Land = { --- id= 'Land', --- params = { --- point = Vec2, --- durationFlag = boolean, --- duration = Time --- } --- } - - local DCSTask - if Duration and Duration > 0 then - DCSTask = { id = 'Land', - params = { - point = Point, - durationFlag = true, - duration = Duration, - }, - } - else - DCSTask = { id = 'Land', - params = { - point = Point, - durationFlag = false, - }, - } - end - - self:T3( DCSTask ) - return DCSTask -end - ---- (AIR) Land the group at a @{Zone#ZONE). --- @param #GROUP self --- @param Zone#ZONE Zone The zone where to land. --- @param #number Duration The duration in seconds to stay on the ground. --- @return #GROUP self -function GROUP:TaskLandAtZone( Zone, Duration, RandomPoint ) - self:F2( { self.GroupName, Zone, Duration, RandomPoint } ) - - local Point - if RandomPoint then - Point = Zone:GetRandomPointVec2() - else - Point = Zone:GetPointVec2() - end - - local DCSTask = self:TaskLandAtVec2( Point, Duration ) - - self:T3( DCSTask ) - return DCSTask -end - ---- (AIR) Following another airborne group. --- The unit / group will follow lead unit of another group, wingmens of both groups will continue following their leaders. --- If another group is on land the unit / group will orbit around. --- @param #GROUP self --- @param Group#GROUP FollowGroup The group to be followed. --- @param DCSTypes#Vec3 PointVec3 Position of the unit / lead unit of the group relative lead unit of another group in frame reference oriented by course of lead unit of another group. If another group is on land the unit / group will orbit around. --- @param #number LastWaypointIndex Detach waypoint of another group. Once reached the unit / group Follow task is finished. --- @return DCSTask#Task The DCS task structure. -function GROUP:TaskFollow( FollowGroup, PointVec3, LastWaypointIndex ) - self:F2( { self.GroupName, FollowGroup, PointVec3, LastWaypointIndex } ) - --- Follow = { --- id = 'Follow', --- params = { --- groupId = Group.ID, --- pos = Vec3, --- lastWptIndexFlag = boolean, --- lastWptIndex = number --- } --- } - - local LastWaypointIndexFlag = nil - if LastWaypointIndex then - LastWaypointIndexFlag = true - end - - local DCSTask - DCSTask = { id = 'Follow', - params = { - groupId = FollowGroup:GetID(), - pos = PointVec3, - lastWptIndexFlag = LastWaypointIndexFlag, - lastWptIndex = LastWaypointIndex, - }, - }, - - self:T3( { DCSTask } ) - return DCSTask -end - - ---- (AIR) Escort another airborne group. --- The unit / group will follow lead unit of another group, wingmens of both groups will continue following their leaders. --- The unit / group will also protect that group from threats of specified types. --- @param #GROUP self --- @param Group#GROUP EscortGroup The group to be escorted. --- @param DCSTypes#Vec3 PointVec3 Position of the unit / lead unit of the group relative lead unit of another group in frame reference oriented by course of lead unit of another group. If another group is on land the unit / group will orbit around. --- @param #number LastWaypointIndex Detach waypoint of another group. Once reached the unit / group Follow task is finished. --- @param #number EngagementDistanceMax Maximal distance from escorted group to threat. If the threat is already engaged by escort escort will disengage if the distance becomes greater than 1.5 * engagementDistMax. --- @param #list TargetTypes Array of AttributeName that is contains threat categories allowed to engage. --- @return DCSTask#Task The DCS task structure. -function GROUP:TaskEscort( FollowGroup, PointVec3, LastWaypointIndex, EngagementDistance, TargetTypes ) - self:F2( { self.GroupName, FollowGroup, PointVec3, LastWaypointIndex, EngagementDistance, TargetTypes } ) - --- Escort = { --- id = 'Escort', --- params = { --- groupId = Group.ID, --- pos = Vec3, --- lastWptIndexFlag = boolean, --- lastWptIndex = number, --- engagementDistMax = Distance, --- targetTypes = array of AttributeName, --- } --- } - - local LastWaypointIndexFlag = nil - if LastWaypointIndex then - LastWaypointIndexFlag = true - end - - local DCSTask - DCSTask = { id = 'Follow', - params = { - groupId = FollowGroup:GetID(), - pos = PointVec3, - lastWptIndexFlag = LastWaypointIndexFlag, - lastWptIndex = LastWaypointIndex, - engagementDistMax = EngagementDistance, - targetTypes = TargetTypes, - }, - }, - - self:T3( { DCSTask } ) - return DCSTask -end - - --- GROUND TASKS - ---- (GROUND) Fire at a VEC2 point until ammunition is finished. --- @param #GROUP self --- @param DCSTypes#Vec2 The point to fire at. --- @param DCSTypes#Distance Radius The radius of the zone to deploy the fire at. --- @return DCSTask#Task The DCS task structure. -function GROUP:TaskFireAtPoint( PointVec2, Radius ) - self:F2( { self.GroupName, PointVec2, Radius } ) - - -- FireAtPoint = { - -- id = 'FireAtPoint', - -- params = { - -- point = Vec2, - -- radius = Distance, - -- } - -- } - - local DCSTask - DCSTask = { id = 'FireAtPoint', - params = { - point = PointVec2, - radius = Radius, - } - } - - self:T3( { DCSTask } ) - return DCSTask -end - ---- (GROUND) Hold ground group from moving. --- @param #GROUP self --- @return DCSTask#Task The DCS task structure. -function GROUP:TaskHold() - self:F2( { self.GroupName } ) - --- Hold = { --- id = 'Hold', --- params = { --- } --- } - - local DCSTask - DCSTask = { id = 'Hold', - params = { - } - } - - self:T3( { DCSTask } ) - return DCSTask -end - --- TASKS FOR AIRBORNE AND GROUND UNITS/GROUPS - ---- (AIR + GROUND) The task makes the group/unit a FAC and orders the FAC to control the target (enemy ground group) destruction. --- The killer is player-controlled allied CAS-aircraft that is in contact with the FAC. --- If the task is assigned to the group lead unit will be a FAC. --- @param #GROUP self --- @param Group#GROUP AttackGroup Target GROUP. --- @param #number WeaponType Bitmask of weapon types those allowed to use. If parameter is not defined that means no limits on weapon usage. --- @param DCSTypes#AI.Task.Designation Designation (optional) Designation type. --- @param #boolean Datalink (optional) Allows to use datalink to send the target information to attack aircraft. Enabled by default. --- @return DCSTask#Task The DCS task structure. -function GROUP:TaskFAC_AttackGroup( AttackGroup, WeaponType, Designation, Datalink ) - self:F2( { self.GroupName, AttackGroup, WeaponType, Designation, Datalink } ) - --- FAC_AttackGroup = { --- id = 'FAC_AttackGroup', --- params = { --- groupId = Group.ID, --- weaponType = number, --- designation = enum AI.Task.Designation, --- datalink = boolean --- } --- } - - local DCSTask - DCSTask = { id = 'FAC_AttackGroup', - params = { - groupId = AttackGroup:GetID(), - weaponType = WeaponType, - designation = Designation, - datalink = Datalink, - } - } - - self:T3( { DCSTask } ) - return DCSTask -end - --- EN-ROUTE TASKS FOR AIRBORNE GROUPS - ---- (AIR) Engaging targets of defined types. --- @param #GROUP self --- @param DCSTypes#Distance Distance Maximal distance from the target to a route leg. If the target is on a greater distance it will be ignored. --- @param #list<#DCSTypes#AttributeName> TargetTypes Array of target categories allowed to engage. --- @param #number Priority All enroute tasks have the priority parameter. This is a number (less value - higher priority) that determines actions related to what task will be performed first. --- @return DCSTask#Task The DCS task structure. -function GROUP:EnRouteTaskEngageTargets( Distance, TargetTypes, Priority ) - self:F2( { self.GroupName, Distance, TargetTypes, Priority } ) - --- EngageTargets ={ --- id = 'EngageTargets', --- params = { --- maxDist = Distance, --- targetTypes = array of AttributeName, --- priority = number --- } --- } - - local DCSTask - DCSTask = { id = 'EngageTargets', - params = { - maxDist = Distance, - targetTypes = TargetTypes, - priority = Priority - } - } - - self:T3( { DCSTask } ) - return DCSTask -end - - ---- (AIR) Engaging a targets of defined types at circle-shaped zone. --- @param #GROUP self --- @param DCSTypes#Vec2 PointVec2 2D-coordinates of the zone. --- @param DCSTypes#Distance Radius Radius of the zone. --- @param #list<#DCSTypes#AttributeName> TargetTypes Array of target categories allowed to engage. --- @param #number Priority All en-route tasks have the priority parameter. This is a number (less value - higher priority) that determines actions related to what task will be performed first. --- @return DCSTask#Task The DCS task structure. -function GROUP:EnRouteTaskEngageTargets( PointVec2, Radius, TargetTypes, Priority ) - self:F2( { self.GroupName, PointVec2, Radius, TargetTypes, Priority } ) - --- EngageTargetsInZone = { --- id = 'EngageTargetsInZone', --- params = { --- point = Vec2, --- zoneRadius = Distance, --- targetTypes = array of AttributeName, --- priority = number --- } --- } - - local DCSTask - DCSTask = { id = 'EngageTargetsInZone', - params = { - point = PointVec2, - zoneRadius = Radius, - targetTypes = TargetTypes, - priority = Priority - } - } - - self:T3( { DCSTask } ) - return DCSTask -end - ---- (AIR) Engaging a group. The task does not assign the target group to the unit/group to attack now; it just allows the unit/group to engage the target group as well as other assigned targets. --- @param #GROUP self --- @param Group#GROUP AttackGroup The Group to be attacked. --- @param #number Priority All en-route tasks have the priority parameter. This is a number (less value - higher priority) that determines actions related to what task will be performed first. --- @param #number WeaponType (optional) Bitmask of weapon types those allowed to use. If parameter is not defined that means no limits on weapon usage. --- @param DCSTypes#AI.Task.WeaponExpend WeaponExpend (optional) Determines how much weapon will be released at each attack. If parameter is not defined the unit / group will choose expend on its own discretion. --- @param #number AttackQty (optional) This parameter limits maximal quantity of attack. The aicraft/group will not make more attack than allowed even if the target group not destroyed and the aicraft/group still have ammo. If not defined the aircraft/group will attack target until it will be destroyed or until the aircraft/group will run out of ammo. --- @param DCSTypes#Azimuth Direction (optional) Desired ingress direction from the target to the attacking aircraft. Group/aircraft will make its attacks from the direction. Of course if there is no way to attack from the direction due the terrain group/aircraft will choose another direction. --- @param DCSTypes#Distance Altitude (optional) Desired attack start altitude. Group/aircraft will make its attacks from the altitude. If the altitude is too low or too high to use weapon aircraft/group will choose closest altitude to the desired attack start altitude. If the desired altitude is defined group/aircraft will not attack from safe altitude. --- @param #boolean AttackQtyLimit (optional) The flag determines how to interpret attackQty parameter. If the flag is true then attackQty is a limit on maximal attack quantity for "AttackGroup" and "AttackUnit" tasks. If the flag is false then attackQty is a desired attack quantity for "Bombing" and "BombingRunway" tasks. --- @return DCSTask#Task The DCS task structure. -function GROUP:EnRouteTaskEngageGroup( AttackGroup, Priority, WeaponType, WeaponExpend, AttackQty, Direction, Altitude, AttackQtyLimit ) - self:F2( { self.GroupName, AttackGroup, Priority, WeaponType, WeaponExpend, AttackQty, Direction, Altitude, AttackQtyLimit } ) - - -- EngageGroup = { - -- id = 'EngageGroup ', - -- params = { - -- groupId = Group.ID, - -- weaponType = number, - -- expend = enum AI.Task.WeaponExpend, - -- attackQty = number, - -- directionEnabled = boolean, - -- direction = Azimuth, - -- altitudeEnabled = boolean, - -- altitude = Distance, - -- attackQtyLimit = boolean, - -- priority = number, - -- } - -- } - - local DirectionEnabled = nil - if Direction then - DirectionEnabled = true - end - - local AltitudeEnabled = nil - if Altitude then - AltitudeEnabled = true - end - - local DCSTask - DCSTask = { id = 'EngageGroup', - params = { - groupId = AttackGroup:GetID(), - weaponType = WeaponType, - expend = WeaponExpend, - attackQty = AttackQty, - directionEnabled = DirectionEnabled, - direction = Direction, - altitudeEnabled = AltitudeEnabled, - altitude = Altitude, - attackQtyLimit = AttackQtyLimit, - priority = Priority, - }, - }, - - self:T3( { DCSTask } ) - return DCSTask -end - - ---- (AIR) Attack the Unit. --- @param #GROUP self --- @param Unit#UNIT AttackUnit The UNIT. --- @param #number Priority All en-route tasks have the priority parameter. This is a number (less value - higher priority) that determines actions related to what task will be performed first. --- @param #number WeaponType (optional) Bitmask of weapon types those allowed to use. If parameter is not defined that means no limits on weapon usage. --- @param DCSTypes#AI.Task.WeaponExpend WeaponExpend (optional) Determines how much weapon will be released at each attack. If parameter is not defined the unit / group will choose expend on its own discretion. --- @param #number AttackQty (optional) This parameter limits maximal quantity of attack. The aicraft/group will not make more attack than allowed even if the target group not destroyed and the aicraft/group still have ammo. If not defined the aircraft/group will attack target until it will be destroyed or until the aircraft/group will run out of ammo. --- @param DCSTypes#Azimuth Direction (optional) Desired ingress direction from the target to the attacking aircraft. Group/aircraft will make its attacks from the direction. Of course if there is no way to attack from the direction due the terrain group/aircraft will choose another direction. --- @param #boolean AttackQtyLimit (optional) The flag determines how to interpret attackQty parameter. If the flag is true then attackQty is a limit on maximal attack quantity for "AttackGroup" and "AttackUnit" tasks. If the flag is false then attackQty is a desired attack quantity for "Bombing" and "BombingRunway" tasks. --- @param #boolean GroupAttack (optional) Flag indicates that the target must be engaged by all aircrafts of the group. Has effect only if the task is assigned to a group, not to a single aircraft. --- @return DCSTask#Task The DCS task structure. -function GROUP:EnRouteTaskEngageUnit( AttackUnit, Priority, WeaponType, WeaponExpend, AttackQty, Direction, AttackQtyLimit, GroupAttack ) - self:F2( { self.GroupName, AttackUnit, Priority, WeaponType, WeaponExpend, AttackQty, Direction, AttackQtyLimit, GroupAttack } ) - - -- EngageUnit = { - -- id = 'EngageUnit', - -- params = { - -- unitId = Unit.ID, - -- weaponType = number, - -- expend = enum AI.Task.WeaponExpend - -- attackQty = number, - -- direction = Azimuth, - -- attackQtyLimit = boolean, - -- groupAttack = boolean, - -- priority = number, - -- } - -- } - - local DCSTask - DCSTask = { id = 'EngageUnit', - params = { - unitId = AttackUnit:GetID(), - weaponType = WeaponType, - expend = WeaponExpend, - attackQty = AttackQty, - direction = Direction, - attackQtyLimit = AttackQtyLimit, - groupAttack = GroupAttack, - priority = Priority, - }, - }, - - self:T3( { DCSTask } ) - return DCSTask -end - - ---- (AIR) Aircraft will act as an AWACS for friendly units (will provide them with information about contacts). No parameters. --- @param #GROUP self --- @return DCSTask#Task The DCS task structure. -function GROUP:EnRouteTaskAWACS( ) - self:F2( { self.GroupName } ) - --- AWACS = { --- id = 'AWACS', --- params = { --- } --- } - - local DCSTask - DCSTask = { id = 'AWACS', - params = { - } - } - - self:T3( { DCSTask } ) - return DCSTask -end - - ---- (AIR) Aircraft will act as a tanker for friendly units. No parameters. --- @param #GROUP self --- @return DCSTask#Task The DCS task structure. -function GROUP:EnRouteTaskTanker( ) - self:F2( { self.GroupName } ) - --- Tanker = { --- id = 'Tanker', --- params = { --- } --- } - - local DCSTask - DCSTask = { id = 'Tanker', - params = { - } - } - - self:T3( { DCSTask } ) - return DCSTask -end - - --- En-route tasks for ground units/groups - ---- (GROUND) Ground unit (EW-radar) will act as an EWR for friendly units (will provide them with information about contacts). No parameters. --- @param #GROUP self --- @return DCSTask#Task The DCS task structure. -function GROUP:EnRouteTaskEWR( ) - self:F2( { self.GroupName } ) - --- EWR = { --- id = 'EWR', --- params = { --- } --- } - - local DCSTask - DCSTask = { id = 'EWR', - params = { - } - } - - self:T3( { DCSTask } ) - return DCSTask -end - - --- En-route tasks for airborne and ground units/groups - ---- (AIR + GROUND) The task makes the group/unit a FAC and lets the FAC to choose the target (enemy ground group) as well as other assigned targets. --- The killer is player-controlled allied CAS-aircraft that is in contact with the FAC. --- If the task is assigned to the group lead unit will be a FAC. --- @param #GROUP self --- @param Group#GROUP AttackGroup Target GROUP. --- @param #number Priority All en-route tasks have the priority parameter. This is a number (less value - higher priority) that determines actions related to what task will be performed first. --- @param #number WeaponType Bitmask of weapon types those allowed to use. If parameter is not defined that means no limits on weapon usage. --- @param DCSTypes#AI.Task.Designation Designation (optional) Designation type. --- @param #boolean Datalink (optional) Allows to use datalink to send the target information to attack aircraft. Enabled by default. --- @return DCSTask#Task The DCS task structure. -function GROUP:EnRouteTaskFAC_EngageGroup( AttackGroup, Priority, WeaponType, Designation, Datalink ) - self:F2( { self.GroupName, AttackGroup, WeaponType, Priority, Designation, Datalink } ) - --- FAC_EngageGroup = { --- id = 'FAC_EngageGroup', --- params = { --- groupId = Group.ID, --- weaponType = number, --- designation = enum AI.Task.Designation, --- datalink = boolean, --- priority = number, --- } --- } - - local DCSTask - DCSTask = { id = 'FAC_EngageGroup', - params = { - groupId = AttackGroup:GetID(), - weaponType = WeaponType, - designation = Designation, - datalink = Datalink, - priority = Priority, - } - } - - self:T3( { DCSTask } ) - return DCSTask -end - - ---- (AIR + GROUND) The task makes the group/unit a FAC and lets the FAC to choose a targets (enemy ground group) around as well as other assigned targets. --- The killer is player-controlled allied CAS-aircraft that is in contact with the FAC. --- If the task is assigned to the group lead unit will be a FAC. --- @param #GROUP self --- @param DCSTypes#Distance Radius The maximal distance from the FAC to a target. --- @param #number Priority All en-route tasks have the priority parameter. This is a number (less value - higher priority) that determines actions related to what task will be performed first. --- @return DCSTask#Task The DCS task structure. -function GROUP:EnRouteTaskFAC( Radius, Priority ) - self:F2( { self.GroupName, Radius, Priority } ) - --- FAC = { --- id = 'FAC', --- params = { --- radius = Distance, --- priority = number --- } --- } - - local DCSTask - DCSTask = { id = 'FAC', - params = { - radius = Radius, - priority = Priority - } - } - - self:T3( { DCSTask } ) - return DCSTask -end - - - - ---- Move the group to a Vec2 Point, wait for a defined duration and embark a group. --- @param #GROUP self --- @param DCSTypes#Vec2 Point The point where to wait. --- @param #number Duration The duration in seconds to wait. --- @param #GROUP EmbarkingGroup The group to be embarked. --- @return DCSTask#Task The DCS task structure -function GROUP:TaskEmbarkingAtVec2( Point, Duration, EmbarkingGroup ) - self:F2( { self.GroupName, Point, Duration, EmbarkingGroup.DCSGroup } ) - - local DCSTask - DCSTask = { id = 'Embarking', - params = { x = Point.x, - y = Point.y, - duration = Duration, - groupsForEmbarking = { EmbarkingGroup.GroupID }, - durationFlag = true, - distributionFlag = false, - distribution = {}, - } - } - - self:T3( { DCSTask } ) - return DCSTask -end - ---- Move to a defined Vec2 Point, and embark to a group when arrived within a defined Radius. --- @param #GROUP self --- @param DCSTypes#Vec2 Point The point where to wait. --- @param #number Radius The radius of the embarking zone around the Point. --- @return DCSTask#Task The DCS task structure. -function GROUP:TaskEmbarkToTransportAtVec2( Point, Radius ) - self:F2( { self.GroupName, Point, Radius } ) - - local DCSTask --DCSTask#Task - DCSTask = { id = 'EmbarkToTransport', - params = { x = Point.x, - y = Point.y, - zoneRadius = Radius, - } - } - - self:T3( { DCSTask } ) - return DCSTask -end - ---- Return a Misson task from a mission template. --- @param #GROUP self --- @param #table TaskMission A table containing the mission task. --- @return DCSTask#Task -function GROUP:TaskMission( TaskMission ) - self:F2( Points ) - - local DCSTask - DCSTask = { id = 'Mission', params = { TaskMission, }, } - - self:T3( { DCSTask } ) - return DCSTask -end - ---- Return a Misson task to follow a given route defined by Points. --- @param #GROUP self --- @param #table Points A table of route points. --- @return DCSTask#Task -function GROUP:TaskRoute( Points ) - self:F2( Points ) - - local DCSTask - DCSTask = { id = 'Mission', params = { route = { points = Points, }, }, } - - self:T3( { DCSTask } ) - return DCSTask -end - ---- Make the DCS Group to fly to a given point and hover. --- @param #GROUP self --- @param DCSTypes#Vec3 Point The destination point in Vec3 format. --- @param #number Speed The speed to travel. --- @return #GROUP self -function GROUP:TaskRouteToVec2( Point, Speed ) - self:F2( { Point, Speed } ) - - local GroupPoint = self:GetUnit( 1 ):GetPointVec2() - - local PointFrom = {} - PointFrom.x = GroupPoint.x - PointFrom.y = GroupPoint.y - PointFrom.type = "Turning Point" - PointFrom.action = "Turning Point" - PointFrom.speed = Speed - PointFrom.speed_locked = true - PointFrom.properties = { - ["vnav"] = 1, - ["scale"] = 0, - ["angle"] = 0, - ["vangle"] = 0, - ["steer"] = 2, - } - - - local PointTo = {} - PointTo.x = Point.x - PointTo.y = Point.y - PointTo.type = "Turning Point" - PointTo.action = "Fly Over Point" - PointTo.speed = Speed - PointTo.speed_locked = true - PointTo.properties = { - ["vnav"] = 1, - ["scale"] = 0, - ["angle"] = 0, - ["vangle"] = 0, - ["steer"] = 2, - } - - - local Points = { PointFrom, PointTo } - - self:T3( Points ) - - self:Route( Points ) - - return self -end - ---- Make the DCS Group to fly to a given point and hover. --- @param #GROUP self --- @param DCSTypes#Vec3 Point The destination point in Vec3 format. --- @param #number Speed The speed to travel. --- @return #GROUP self -function GROUP:TaskRouteToVec3( Point, Speed ) - self:F2( { Point, Speed } ) - - local GroupPoint = self:GetUnit( 1 ):GetPointVec3() - - local PointFrom = {} - PointFrom.x = GroupPoint.x - PointFrom.y = GroupPoint.z - PointFrom.alt = GroupPoint.y - PointFrom.alt_type = "BARO" - PointFrom.type = "Turning Point" - PointFrom.action = "Turning Point" - PointFrom.speed = Speed - PointFrom.speed_locked = true - PointFrom.properties = { - ["vnav"] = 1, - ["scale"] = 0, - ["angle"] = 0, - ["vangle"] = 0, - ["steer"] = 2, - } - - - local PointTo = {} - PointTo.x = Point.x - PointTo.y = Point.z - PointTo.alt = Point.y - PointTo.alt_type = "BARO" - PointTo.type = "Turning Point" - PointTo.action = "Fly Over Point" - PointTo.speed = Speed - PointTo.speed_locked = true - PointTo.properties = { - ["vnav"] = 1, - ["scale"] = 0, - ["angle"] = 0, - ["vangle"] = 0, - ["steer"] = 2, - } - - - local Points = { PointFrom, PointTo } - - self:T3( Points ) - - self:Route( Points ) - - return self -end - - - ---- Make the group to follow a given route. --- @param #GROUP self --- @param #table GoPoints A table of Route Points. --- @return #GROUP self -function GROUP:Route( GoPoints ) - self:F2( GoPoints ) - - local DCSGroup = self:GetDCSGroup() - - if DCSGroup then - local Points = routines.utils.deepCopy( GoPoints ) - local MissionTask = { id = 'Mission', params = { route = { points = Points, }, }, } - local Controller = self:_GetController() - --Controller.setTask( Controller, MissionTask ) - --routines.scheduleFunction( Controller.setTask, { Controller, MissionTask}, timer.getTime() + 1 ) - SCHEDULER:New( Controller, Controller.setTask, { MissionTask }, 1 ) - return self - end - - return nil -end - - - ---- Route the group to a given zone. --- The group final destination point can be randomized. --- A speed can be given in km/h. --- A given formation can be given. --- @param #GROUP self --- @param Zone#ZONE Zone The zone where to route to. --- @param #boolean Randomize Defines whether to target point gets randomized within the Zone. --- @param #number Speed The speed. --- @param Base#FORMATION Formation The formation string. -function GROUP:TaskRouteToZone( Zone, Randomize, Speed, Formation ) - self:F2( Zone ) - - local DCSGroup = self:GetDCSGroup() - - if DCSGroup then - - local GroupPoint = self:GetPointVec2() - - local PointFrom = {} - PointFrom.x = GroupPoint.x - PointFrom.y = GroupPoint.y - PointFrom.type = "Turning Point" - PointFrom.action = "Cone" - PointFrom.speed = 20 / 1.6 - - - local PointTo = {} - local ZonePoint - - if Randomize then - ZonePoint = Zone:GetRandomPointVec2() - else - ZonePoint = Zone:GetPointVec2() - end - - PointTo.x = ZonePoint.x - PointTo.y = ZonePoint.y - PointTo.type = "Turning Point" - - if Formation then - PointTo.action = Formation - else - PointTo.action = "Cone" - end - - if Speed then - PointTo.speed = Speed - else - PointTo.speed = 20 / 1.6 - end - - local Points = { PointFrom, PointTo } - - self:T3( Points ) - - self:Route( Points ) - - return self - end - - return nil -end - --- Commands - ---- Do Script command --- @param #GROUP self --- @param #string DoScript --- @return #DCSCommand -function GROUP:CommandDoScript( DoScript ) - - local DCSDoScript = { - id = "Script", - params = { - command = DoScript, - }, - } - - self:T3( DCSDoScript ) - return DCSDoScript -end - - ---- Return the mission template of the group. --- @param #GROUP self --- @return #table The MissionTemplate -function GROUP:GetTaskMission() - self:F2( self.GroupName ) - - return routines.utils.deepCopy( _DATABASE.Templates.Groups[self.GroupName].Template ) -end - ---- Return the mission route of the group. --- @param #GROUP self --- @return #table The mission route defined by points. -function GROUP:GetTaskRoute() - self:F2( self.GroupName ) - - return routines.utils.deepCopy( _DATABASE.Templates.Groups[self.GroupName].Template.route.points ) -end - ---- Return the route of a group by using the @{Database#DATABASE} class. --- @param #GROUP self --- @param #number Begin The route point from where the copy will start. The base route point is 0. --- @param #number End The route point where the copy will end. The End point is the last point - the End point. The last point has base 0. --- @param #boolean Randomize Randomization of the route, when true. --- @param #number Radius When randomization is on, the randomization is within the radius. -function GROUP:CopyRoute( Begin, End, Randomize, Radius ) - self:F2( { Begin, End } ) - - local Points = {} - - -- Could be a Spawned Group - local GroupName = string.match( self:GetName(), ".*#" ) - if GroupName then - GroupName = GroupName:sub( 1, -2 ) - else - GroupName = self:GetName() - end - - self:T3( { GroupName } ) - - local Template = _DATABASE.Templates.Groups[GroupName].Template - - if Template then - if not Begin then - Begin = 0 - end - if not End then - End = 0 - end - - for TPointID = Begin + 1, #Template.route.points - End do - if Template.route.points[TPointID] then - Points[#Points+1] = routines.utils.deepCopy( Template.route.points[TPointID] ) - if Randomize then - if not Radius then - Radius = 500 - end - Points[#Points].x = Points[#Points].x + math.random( Radius * -1, Radius ) - Points[#Points].y = Points[#Points].y + math.random( Radius * -1, Radius ) - end - end - end - return Points - end - - return nil -end - - -function GROUP:GetDetectedTargets() - self:F2( self.GroupName ) - - local DCSGroup = self:GetDCSGroup() - if DCSGroup then - return self:_GetController():getDetectedTargets() - end - - return nil -end - -function GROUP:IsTargetDetected( DCSObject ) - self:F2( self.GroupName ) - - local DCSGroup = self:GetDCSGroup() - if DCSGroup then - - local TargetIsDetected, TargetIsVisible, TargetLastTime, TargetKnowType, TargetKnowDistance, TargetLastPos, TargetLastVelocity - = self:_GetController().isTargetDetected( self:_GetController(), DCSObject, - Controller.Detection.VISUAL, - Controller.Detection.OPTIC, - Controller.Detection.RADAR, - Controller.Detection.IRST, - Controller.Detection.RWR, - Controller.Detection.DLINK - ) - return TargetIsDetected, TargetIsVisible, TargetLastTime, TargetKnowType, TargetKnowDistance, TargetLastPos, TargetLastVelocity - end - - return nil -end - --- Options - ---- Can the GROUP hold their weapons? --- @param #GROUP self --- @return #boolean -function GROUP:OptionROEHoldFirePossible() - self:F2( { self.GroupName } ) - - local DCSGroup = self:GetDCSGroup() - if DCSGroup then - if self:IsAir() or self:IsGround() or self:IsShip() then - return true - end - - return false - end - - return nil -end - ---- Holding weapons. --- @param Group#GROUP self --- @return Group#GROUP self -function GROUP:OptionROEHoldFire() - self:F2( { self.GroupName } ) - - local DCSGroup = self:GetDCSGroup() - if DCSGroup then - local Controller = self:_GetController() - - if self:IsAir() then - Controller:setOption( AI.Option.Air.id.ROE, AI.Option.Air.val.ROE.WEAPON_HOLD ) - elseif self:IsGround() then - Controller:setOption( AI.Option.Ground.id.ROE, AI.Option.Ground.val.ROE.WEAPON_HOLD ) - elseif self:IsShip() then - Controller:setOption( AI.Option.Naval.id.ROE, AI.Option.Naval.val.ROE.WEAPON_HOLD ) - end - - return self - end - - return nil -end - ---- Can the GROUP attack returning on enemy fire? --- @param #GROUP self --- @return #boolean -function GROUP:OptionROEReturnFirePossible() - self:F2( { self.GroupName } ) - - local DCSGroup = self:GetDCSGroup() - if DCSGroup then - if self:IsAir() or self:IsGround() or self:IsShip() then - return true - end - - return false - end - - return nil -end - ---- Return fire. --- @param #GROUP self --- @return #GROUP self -function GROUP:OptionROEReturnFire() - self:F2( { self.GroupName } ) - - local DCSGroup = self:GetDCSGroup() - if DCSGroup then - local Controller = self:_GetController() - - if self:IsAir() then - Controller:setOption( AI.Option.Air.id.ROE, AI.Option.Air.val.ROE.RETURN_FIRE ) - elseif self:IsGround() then - Controller:setOption( AI.Option.Ground.id.ROE, AI.Option.Ground.val.ROE.RETURN_FIRE ) - elseif self:IsShip() then - Controller:setOption( AI.Option.Naval.id.ROE, AI.Option.Naval.val.ROE.RETURN_FIRE ) - end - - return self - end - - return nil -end - ---- Can the GROUP attack designated targets? --- @param #GROUP self --- @return #boolean -function GROUP:OptionROEOpenFirePossible() - self:F2( { self.GroupName } ) - - local DCSGroup = self:GetDCSGroup() - if DCSGroup then - if self:IsAir() or self:IsGround() or self:IsShip() then - return true - end - - return false - end - - return nil -end - ---- Openfire. --- @param #GROUP self --- @return #GROUP self -function GROUP:OptionROEOpenFire() - self:F2( { self.GroupName } ) - - local DCSGroup = self:GetDCSGroup() - if DCSGroup then - local Controller = self:_GetController() - - if self:IsAir() then - Controller:setOption( AI.Option.Air.id.ROE, AI.Option.Air.val.ROE.OPEN_FIRE ) - elseif self:IsGround() then - Controller:setOption( AI.Option.Ground.id.ROE, AI.Option.Ground.val.ROE.OPEN_FIRE ) - elseif self:IsShip() then - Controller:setOption( AI.Option.Naval.id.ROE, AI.Option.Naval.val.ROE.OPEN_FIRE ) - end - - return self - end - - return nil -end - ---- Can the GROUP attack targets of opportunity? --- @param #GROUP self --- @return #boolean -function GROUP:OptionROEWeaponFreePossible() - self:F2( { self.GroupName } ) - - local DCSGroup = self:GetDCSGroup() - if DCSGroup then - if self:IsAir() then - return true - end - - return false - end - - return nil -end - ---- Weapon free. --- @param #GROUP self --- @return #GROUP self -function GROUP:OptionROEWeaponFree() - self:F2( { self.GroupName } ) - - local DCSGroup = self:GetDCSGroup() - if DCSGroup then - local Controller = self:_GetController() - - if self:IsAir() then - Controller:setOption( AI.Option.Air.id.ROE, AI.Option.Air.val.ROE.WEAPON_FREE ) - end - - return self - end - - return nil -end - ---- Can the GROUP ignore enemy fire? --- @param #GROUP self --- @return #boolean -function GROUP:OptionROTNoReactionPossible() - self:F2( { self.GroupName } ) - - local DCSGroup = self:GetDCSGroup() - if DCSGroup then - if self:IsAir() then - return true - end - - return false - end - - return nil -end - - ---- No evasion on enemy threats. --- @param #GROUP self --- @return #GROUP self -function GROUP:OptionROTNoReaction() - self:F2( { self.GroupName } ) - - local DCSGroup = self:GetDCSGroup() - if DCSGroup then - local Controller = self:_GetController() - - if self:IsAir() then - Controller:setOption( AI.Option.Air.id.REACTION_ON_THREAT, AI.Option.Air.val.REACTION_ON_THREAT.NO_REACTION ) - end - - return self - end - - return nil -end - ---- Can the GROUP evade using passive defenses? --- @param #GROUP self --- @return #boolean -function GROUP:OptionROTPassiveDefensePossible() - self:F2( { self.GroupName } ) - - local DCSGroup = self:GetDCSGroup() - if DCSGroup then - if self:IsAir() then - return true - end - - return false - end - - return nil -end - ---- Evasion passive defense. --- @param #GROUP self --- @return #GROUP self -function GROUP:OptionROTPassiveDefense() - self:F2( { self.GroupName } ) - - local DCSGroup = self:GetDCSGroup() - if DCSGroup then - local Controller = self:_GetController() - - if self:IsAir() then - Controller:setOption( AI.Option.Air.id.REACTION_ON_THREAT, AI.Option.Air.val.REACTION_ON_THREAT.PASSIVE_DEFENCE ) - end - - return self - end - - return nil -end - ---- Can the GROUP evade on enemy fire? --- @param #GROUP self --- @return #boolean -function GROUP:OptionROTEvadeFirePossible() - self:F2( { self.GroupName } ) - - local DCSGroup = self:GetDCSGroup() - if DCSGroup then - if self:IsAir() then - return true - end - - return false - end - - return nil -end - - ---- Evade on fire. --- @param #GROUP self --- @return #GROUP self -function GROUP:OptionROTEvadeFire() - self:F2( { self.GroupName } ) - - local DCSGroup = self:GetDCSGroup() - if DCSGroup then - local Controller = self:_GetController() - - if self:IsAir() then - Controller:setOption( AI.Option.Air.id.REACTION_ON_THREAT, AI.Option.Air.val.REACTION_ON_THREAT.EVADE_FIRE ) - end - - return self - end - - return nil -end - ---- Can the GROUP evade on fire using vertical manoeuvres? --- @param #GROUP self --- @return #boolean -function GROUP:OptionROTVerticalPossible() - self:F2( { self.GroupName } ) - - local DCSGroup = self:GetDCSGroup() - if DCSGroup then - if self:IsAir() then - return true - end - - return false - end - - return nil -end - - ---- Evade on fire using vertical manoeuvres. --- @param #GROUP self --- @return #GROUP self -function GROUP:OptionROTVertical() - self:F2( { self.GroupName } ) - - local DCSGroup = self:GetDCSGroup() - if DCSGroup then - local Controller = self:_GetController() - - if self:IsAir() then - Controller:setOption( AI.Option.Air.id.REACTION_ON_THREAT, AI.Option.Air.val.REACTION_ON_THREAT.BYPASS_AND_ESCAPE ) - end - - return self - end - - return nil -end - --- Message APIs - ---- Returns a message for a coalition or a client. --- @param #GROUP self --- @param #string Message The message text --- @param #Duration Duration The duration of the message. --- @return Message#MESSAGE -function GROUP:Message( Message, Duration ) - self:F2( { Message, Duration } ) - - local DCSGroup = self:GetDCSGroup() - if DCSGroup then - return MESSAGE:New( Message, self:GetCallsign() .. " (" .. self:GetTypeName() .. ")", Duration, self:GetClassNameAndID() ) - end - - return nil -end - ---- Send a message to all coalitions. --- The message will appear in the message area. The message will begin with the callsign of the group and the type of the first unit sending the message. --- @param #GROUP self --- @param #string Message The message text --- @param #Duration Duration The duration of the message. -function GROUP:MessageToAll( Message, Duration ) - self:F2( { Message, Duration } ) - - local DCSGroup = self:GetDCSGroup() - if DCSGroup then - self:Message( Message, Duration ):ToAll() - end - - return nil -end - ---- Send a message to the red coalition. --- The message will appear in the message area. The message will begin with the callsign of the group and the type of the first unit sending the message. --- @param #GROUP self --- @param #string Message The message text --- @param #Duration Duration The duration of the message. -function GROUP:MessageToRed( Message, Duration ) - self:F2( { Message, Duration } ) - - local DCSGroup = self:GetDCSGroup() - if DCSGroup then - self:Message( Message, Duration ):ToRed() - end - - return nil -end - ---- Send a message to the blue coalition. --- The message will appear in the message area. The message will begin with the callsign of the group and the type of the first unit sending the message. --- @param #GROUP self --- @param #string Message The message text --- @param #Duration Duration The duration of the message. -function GROUP:MessageToBlue( Message, Duration ) - self:F2( { Message, Duration } ) - - local DCSGroup = self:GetDCSGroup() - if DCSGroup then - self:Message( Message, Duration ):ToBlue() - end - - return nil -end - ---- Send a message to a client. --- The message will appear in the message area. The message will begin with the callsign of the group and the type of the first unit sending the message. --- @param #GROUP self --- @param #string Message The message text --- @param #Duration Duration The duration of the message. --- @param Client#CLIENT Client The client object receiving the message. -function GROUP:MessageToClient( Message, Duration, Client ) - self:F2( { Message, Duration } ) - - local DCSGroup = self:GetDCSGroup() - if DCSGroup then - self:Message( Message, Duration ):ToClient( Client ) - end - - return nil -end ---- UNIT Class --- --- @{UNIT} class --- ============== --- The @{UNIT} class is a wrapper class to handle the DCS Unit objects: --- --- * Support all DCS Unit APIs. --- * Enhance with Unit specific APIs not in the DCS Unit API set. --- * Handle local Unit Controller. --- * Manage the "state" of the DCS Unit. --- --- --- UNIT reference methods --- ====================== --- For each DCS Unit object alive within a running mission, a UNIT wrapper object (instance) will be created within the _@{DATABASE} object. --- This is done at the beginning of the mission (when the mission starts), and dynamically when new DCS Unit objects are spawned (using the @{SPAWN} class). --- --- The UNIT class **does not contain a :New()** method, rather it provides **:Find()** methods to retrieve the object reference --- using the DCS Unit or the DCS UnitName. --- --- Another thing to know is that UNIT objects do not "contain" the DCS Unit object. --- The UNIT methods will reference the DCS Unit object by name when it is needed during API execution. --- If the DCS Unit object does not exist or is nil, the UNIT methods will return nil and log an exception in the DCS.log file. --- --- The UNIT class provides the following functions to retrieve quickly the relevant UNIT instance: --- --- * @{#UNIT.Find}(): Find a UNIT instance from the _DATABASE object using a DCS Unit object. --- * @{#UNIT.FindByName}(): Find a UNIT instance from the _DATABASE object using a DCS Unit name. --- --- IMPORTANT: ONE SHOULD NEVER SANATIZE these UNIT OBJECT REFERENCES! (make the UNIT object references nil). --- --- DCS UNIT APIs --- ============= --- The DCS Unit APIs are used extensively within MOOSE. The UNIT class has for each DCS Unit API a corresponding method. --- To be able to distinguish easily in your code the difference between a UNIT API call and a DCS Unit API call, --- the first letter of the method is also capitalized. So, by example, the DCS Unit method @{DCSUnit#Unit.getName}() --- is implemented in the UNIT class as @{#UNIT.GetName}(). --- --- Additional UNIT APIs --- ==================== --- The UNIT class comes with additional methods. Find below a summary. --- --- Smoke, Flare Units --- ------------------ --- The UNIT class provides methods to smoke or flare units easily. --- The @{#UNIT.SmokeBlue}(), @{#UNIT.SmokeGreen}(),@{#UNIT.SmokeOrange}(), @{#UNIT.SmokeRed}(), @{#UNIT.SmokeRed}() methods --- will smoke the unit in the corresponding color. Note that smoking a unit is done at the current position of the DCS Unit. --- When the DCS Unit moves for whatever reason, the smoking will still continue! --- The @{#UNIT.FlareGreen}(), @{#UNIT.FlareRed}(), @{#UNIT.FlareWhite}(), @{#UNIT.FlareYellow}() --- methods will fire off a flare in the air with the corresponding color. Note that a flare is a one-off shot and its effect is of very short duration. --- --- Position, Point --- --------------- --- The UNIT class provides methods to obtain the current point or position of the DCS Unit. --- The @{#UNIT.GetPointVec2}(), @{#UNIT.GetPointVec3}() will obtain the current location of the DCS Unit in a Vec2 (2D) or a Vec3 (3D) vector respectively. --- If you want to obtain the complete 3D position including oriëntation and direction vectors, consult the @{#UNIT.GetPositionVec3}() method respectively. --- --- Alive --- ----- --- The @{#UNIT.IsAlive}(), @{#UNIT.IsActive}() methods determines if the DCS Unit is alive, meaning, it is existing and active. --- --- Test for other units in radius --- ------------------------------ --- One can test if another DCS Unit is within a given radius of the current DCS Unit, by using the @{#UNIT.OtherUnitInRadius}() method. --- --- More functions will be added --- ---------------------------- --- During the MOOSE development, more functions will be added. A complete list of the current functions is below. --- --- --- --- --- @module Unit --- @author FlightControl - -Include.File( "Routines" ) -Include.File( "Base" ) -Include.File( "Message" ) - ---- The UNIT class --- @type UNIT --- @extends Base#BASE --- @field #UNIT.FlareColor FlareColor --- @field #UNIT.SmokeColor SmokeColor -UNIT = { - ClassName="UNIT", - CategoryName = { - [Unit.Category.AIRPLANE] = "Airplane", - [Unit.Category.HELICOPTER] = "Helicoper", - [Unit.Category.GROUND_UNIT] = "Ground Unit", - [Unit.Category.SHIP] = "Ship", - [Unit.Category.STRUCTURE] = "Structure", - }, - FlareColor = { - Green = trigger.flareColor.Green, - Red = trigger.flareColor.Red, - White = trigger.flareColor.White, - Yellow = trigger.flareColor.Yellow - }, - SmokeColor = { - Green = trigger.smokeColor.Green, - Red = trigger.smokeColor.Red, - White = trigger.smokeColor.White, - Orange = trigger.smokeColor.Orange, - Blue = trigger.smokeColor.Blue - }, - } - ---- FlareColor --- @type UNIT.FlareColor --- @field Green --- @field Red --- @field White --- @field Yellow - ---- SmokeColor --- @type UNIT.SmokeColor --- @field Green --- @field Red --- @field White --- @field Orange --- @field Blue - --- Registration. - ---- Create a new UNIT from DCSUnit. --- @param #UNIT self --- @param DCSUnit#Unit DCSUnit --- @param Database#DATABASE Database --- @return Unit#UNIT -function UNIT:Register( UnitName ) - - local self = BASE:Inherit( self, BASE:New() ) - self:F2( UnitName ) - self.UnitName = UnitName - return self -end - --- Reference methods. - ---- Finds a UNIT from the _DATABASE using a DCSUnit object. --- @param #UNIT self --- @param DCSUnit#Unit DCSUnit An existing DCS Unit object reference. --- @return Unit#UNIT self -function UNIT:Find( DCSUnit ) - - local UnitName = DCSUnit:getName() - local UnitFound = _DATABASE:FindUnit( UnitName ) - return UnitFound -end - ---- Find a UNIT in the _DATABASE using the name of an existing DCS Unit. --- @param #UNIT self --- @param #string UnitName The Unit Name. --- @return Unit#UNIT self -function UNIT:FindByName( UnitName ) - - local UnitFound = _DATABASE:FindUnit( UnitName ) - return UnitFound -end - -function UNIT:GetDCSUnit() - local DCSUnit = Unit.getByName( self.UnitName ) - - if DCSUnit then - return DCSUnit - end - - return nil -end - ---- Returns coalition of the Unit. --- @param Unit#UNIT self --- @return DCSCoalitionObject#coalition.side The side of the coalition. --- @return #nil The DCS Unit is not existing or alive. -function UNIT:GetCoalition() - self:F2( self.UnitName ) - - local DCSUnit = self:GetDCSUnit() - - if DCSUnit then - local UnitCoalition = DCSUnit:getCoalition() - self:T3( UnitCoalition ) - return UnitCoalition - end - - return nil -end - ---- Returns country of the Unit. --- @param Unit#UNIT self --- @return DCScountry#country.id The country identifier. --- @return #nil The DCS Unit is not existing or alive. -function UNIT:GetCountry() - self:F2( self.UnitName ) - - local DCSUnit = self:GetDCSUnit() - - if DCSUnit then - local UnitCountry = DCSUnit:getCountry() - self:T3( UnitCountry ) - return UnitCountry - end - - return nil -end - - ---- Returns DCS Unit object name. --- The function provides access to non-activated units too. --- @param Unit#UNIT self --- @return #string The name of the DCS Unit. --- @return #nil The DCS Unit is not existing or alive. -function UNIT:GetName() - self:F2( self.UnitName ) - - local DCSUnit = self:GetDCSUnit() - - if DCSUnit then - local UnitName = self.UnitName - return UnitName - end - - return nil -end - - ---- Returns if the unit is alive. --- @param Unit#UNIT self --- @return #boolean true if Unit is alive. --- @return #nil The DCS Unit is not existing or alive. -function UNIT:IsAlive() - self:F2( self.UnitName ) - - local DCSUnit = self:GetDCSUnit() - - if DCSUnit then - local UnitIsAlive = DCSUnit:isExist() - return UnitIsAlive - end - - return false -end - ---- Returns if the unit is activated. --- @param Unit#UNIT self --- @return #boolean true if Unit is activated. --- @return #nil The DCS Unit is not existing or alive. -function UNIT:IsActive() - self:F2( self.UnitName ) - - local DCSUnit = self:GetDCSUnit() - - if DCSUnit then - - local UnitIsActive = DCSUnit:isActive() - return UnitIsActive - end - - return nil -end - ---- Returns name of the player that control the unit or nil if the unit is controlled by A.I. --- @param Unit#UNIT self --- @return #string Player Name --- @return #nil The DCS Unit is not existing or alive. -function UNIT:GetPlayerName() - self:F2( self.UnitName ) - - local DCSUnit = self:GetDCSUnit() - - if DCSUnit then - - local PlayerName = DCSUnit:getPlayerName() - if PlayerName == nil then - PlayerName = "" - end - return PlayerName - end - - return nil -end - ---- Returns the unit's unique identifier. --- @param Unit#UNIT self --- @return DCSUnit#Unit.ID Unit ID --- @return #nil The DCS Unit is not existing or alive. -function UNIT:GetID() - self:F2( self.UnitName ) - - local DCSUnit = self:GetDCSUnit() - - if DCSUnit then - local UnitID = DCSUnit:getID() - return UnitID - end - - return nil -end - ---- Returns the unit's number in the group. --- The number is the same number the unit has in ME. --- It may not be changed during the mission. --- If any unit in the group is destroyed, the numbers of another units will not be changed. --- @param Unit#UNIT self --- @return #number The Unit number. --- @return #nil The DCS Unit is not existing or alive. -function UNIT:GetNumber() - self:F2( self.UnitName ) - - local DCSUnit = self:GetDCSUnit() - - if DCSUnit then - local UnitNumber = DCSUnit:getNumber() - return UnitNumber - end - - return nil -end - ---- Returns the unit's group if it exist and nil otherwise. --- @param Unit#UNIT self --- @return Group#GROUP The Group of the Unit. --- @return #nil The DCS Unit is not existing or alive. -function UNIT:GetGroup() - self:F2( self.UnitName ) - - local DCSUnit = self:GetDCSUnit() - - if DCSUnit then - local UnitGroup = DCSUnit:getGroup() - return UnitGroup - end - - return nil -end - - ---- Returns the unit's callsign - the localized string. --- @param Unit#UNIT self --- @return #string The Callsign of the Unit. --- @return #nil The DCS Unit is not existing or alive. -function UNIT:GetCallSign() - self:F2( self.UnitName ) - - local DCSUnit = self:GetDCSUnit() - - if DCSUnit then - local UnitCallSign = DCSUnit:getCallsign() - return UnitCallSign - end - - return nil -end - ---- Returns the unit's health. Dead units has health <= 1.0. --- @param Unit#UNIT self --- @return #number The Unit's health value. --- @return #nil The DCS Unit is not existing or alive. -function UNIT:GetLife() - self:F2( self.UnitName ) - - local DCSUnit = self:GetDCSUnit() - - if DCSUnit then - local UnitLife = DCSUnit:getLife() - return UnitLife - end - - return nil -end - ---- Returns the Unit's initial health. --- @param Unit#UNIT self --- @return #number The Unit's initial health value. --- @return #nil The DCS Unit is not existing or alive. -function UNIT:GetLife0() - self:F2( self.UnitName ) - - local DCSUnit = self:GetDCSUnit() - - if DCSUnit then - local UnitLife0 = DCSUnit:getLife0() - return UnitLife0 - end - - return nil -end - ---- Returns relative amount of fuel (from 0.0 to 1.0) the unit has in its internal tanks. If there are additional fuel tanks the value may be greater than 1.0. --- @param Unit#UNIT self --- @return #number The relative amount of fuel (from 0.0 to 1.0). --- @return #nil The DCS Unit is not existing or alive. -function UNIT:GetFuel() - self:F2( self.UnitName ) - - local DCSUnit = self:GetDCSUnit() - - if DCSUnit then - local UnitFuel = DCSUnit:getFuel() - return UnitFuel - end - - return nil -end - ---- Returns the Unit's ammunition. --- @param Unit#UNIT self --- @return DCSUnit#Unit.Ammo --- @return #nil The DCS Unit is not existing or alive. -function UNIT:GetAmmo() - self:F2( self.UnitName ) - - local DCSUnit = self:GetDCSUnit() - - if DCSUnit then - local UnitAmmo = DCSUnit:getAmmo() - return UnitAmmo - end - - return nil -end - ---- Returns the unit sensors. --- @param Unit#UNIT self --- @return DCSUnit#Unit.Sensors --- @return #nil The DCS Unit is not existing or alive. -function UNIT:GetSensors() - self:F2( self.UnitName ) - - local DCSUnit = self:GetDCSUnit() - - if DCSUnit then - local UnitSensors = DCSUnit:getSensors() - return UnitSensors - end - - return nil -end - --- Need to add here a function per sensortype --- unit:hasSensors(Unit.SensorType.RADAR, Unit.RadarType.AS) - ---- Returns two values: --- --- * First value indicates if at least one of the unit's radar(s) is on. --- * Second value is the object of the radar's interest. Not nil only if at least one radar of the unit is tracking a target. --- @param Unit#UNIT self --- @return #boolean Indicates if at least one of the unit's radar(s) is on. --- @return DCSObject#Object The object of the radar's interest. Not nil only if at least one radar of the unit is tracking a target. --- @return #nil The DCS Unit is not existing or alive. -function UNIT:GetRadar() - self:F2( self.UnitName ) - - local DCSUnit = self:GetDCSUnit() - - if DCSUnit then - local UnitRadarOn, UnitRadarObject = DCSUnit:getRadar() - return UnitRadarOn, UnitRadarObject - end - - return nil, nil -end - --- Need to add here functions to check if radar is on and which object etc. - ---- Returns unit descriptor. Descriptor type depends on unit category. --- @param Unit#UNIT self --- @return DCSUnit#Unit.Desc The Unit descriptor. --- @return #nil The DCS Unit is not existing or alive. -function UNIT:GetDesc() - self:F2( self.UnitName ) - - local DCSUnit = self:GetDCSUnit() - - if DCSUnit then - local UnitDesc = DCSUnit:getDesc() - return UnitDesc - end - - return nil -end - - ---- Returns the type name of the DCS Unit. --- @param Unit#UNIT self --- @return #string The type name of the DCS Unit. --- @return #nil The DCS Unit is not existing or alive. -function UNIT:GetTypeName() - self:F2( self.UnitName ) - - local DCSUnit = self:GetDCSUnit() - - if DCSUnit then - local UnitTypeName = DCSUnit:getTypeName() - self:T3( UnitTypeName ) - return UnitTypeName - end - - return nil -end - - - ---- Returns the prefix name of the DCS Unit. A prefix name is a part of the name before a '#'-sign. --- DCS Units spawned with the @{SPAWN} class contain a '#'-sign to indicate the end of the (base) DCS Unit name. --- The spawn sequence number and unit number are contained within the name after the '#' sign. --- @param Unit#UNIT self --- @return #string The name of the DCS Unit. --- @return #nil The DCS Unit is not existing or alive. -function UNIT:GetPrefix() - self:F2( self.UnitName ) - - local DCSUnit = self:GetDCSUnit() - - if DCSUnit then - local UnitPrefix = string.match( self.UnitName, ".*#" ):sub( 1, -2 ) - self:T3( UnitPrefix ) - return UnitPrefix - end - - return nil -end - - - ---- Returns the @{DCSTypes#Vec2} vector indicating the point in 2D of the DCS Unit within the mission. --- @param Unit#UNIT self --- @return DCSTypes#Vec2 The 2D point vector of the DCS Unit. --- @return #nil The DCS Unit is not existing or alive. -function UNIT:GetPointVec2() - self:F2( self.UnitName ) - - local DCSUnit = self:GetDCSUnit() - - if DCSUnit then - local UnitPointVec3 = DCSUnit:getPosition().p - - local UnitPointVec2 = {} - UnitPointVec2.x = UnitPointVec3.x - UnitPointVec2.y = UnitPointVec3.z - - self:T3( UnitPointVec2 ) - return UnitPointVec2 - end - - return nil -end - - ---- Returns the @{DCSTypes#Vec3} vector indicating the point in 3D of the DCS Unit within the mission. --- @param Unit#UNIT self --- @return DCSTypes#Vec3 The 3D point vector of the DCS Unit. --- @return #nil The DCS Unit is not existing or alive. -function UNIT:GetPointVec3() - self:F2( self.UnitName ) - - local DCSUnit = self:GetDCSUnit() - - if DCSUnit then - local UnitPointVec3 = DCSUnit:getPosition().p - self:T3( UnitPointVec3 ) - return UnitPointVec3 - end - - return nil -end - ---- Returns the @{DCSTypes#Position3} position vectors indicating the point and direction vectors in 3D of the DCS Unit within the mission. --- @param Unit#UNIT self --- @return DCSTypes#Position The 3D position vectors of the DCS Unit. --- @return #nil The DCS Unit is not existing or alive. -function UNIT:GetPositionVec3() - self:F2( self.UnitName ) - - local DCSUnit = self:GetDCSUnit() - - if DCSUnit then - local UnitPosition = DCSUnit:getPosition() - self:T3( UnitPosition ) - return UnitPosition - end - - return nil -end - ---- Returns the DCS Unit velocity vector. --- @param Unit#UNIT self --- @return DCSTypes#Vec3 The velocity vector --- @return #nil The DCS Unit is not existing or alive. -function UNIT:GetVelocity() - self:F2( self.UnitName ) - - local DCSUnit = self:GetDCSUnit() - - if DCSUnit then - local UnitVelocityVec3 = DCSUnit:getVelocity() - self:T3( UnitVelocityVec3 ) - return UnitVelocityVec3 - end - - return nil -end - ---- Returns true if the DCS Unit is in the air. --- @param Unit#UNIT self --- @return #boolean true if in the air. --- @return #nil The DCS Unit is not existing or alive. -function UNIT:InAir() - self:F2( self.UnitName ) - - local DCSUnit = self:GetDCSUnit() - - if DCSUnit then - local UnitInAir = DCSUnit:inAir() - self:T3( UnitInAir ) - return UnitInAir - end - - return nil -end - ---- Returns the altitude of the DCS Unit. --- @param Unit#UNIT self --- @return DCSTypes#Distance The altitude of the DCS Unit. --- @return #nil The DCS Unit is not existing or alive. -function UNIT:GetAltitude() - self:F2() - - local DCSUnit = self:GetDCSUnit() - - if DCSUnit then - local UnitPointVec3 = DCSUnit:getPoint() --DCSTypes#Vec3 - return UnitPointVec3.y - end - - return nil -end - ---- Returns true if there is an **other** DCS Unit within a radius of the current 2D point of the DCS Unit. --- @param Unit#UNIT self --- @param Unit#UNIT AwaitUnit The other UNIT wrapper object. --- @param Radius The radius in meters with the DCS Unit in the centre. --- @return true If the other DCS Unit is within the radius of the 2D point of the DCS Unit. --- @return #nil The DCS Unit is not existing or alive. -function UNIT:OtherUnitInRadius( AwaitUnit, Radius ) - self:F2( { self.UnitName, AwaitUnit.UnitName, Radius } ) - - local DCSUnit = self:GetDCSUnit() - - if DCSUnit then - local UnitPos = self:GetPointVec3() - local AwaitUnitPos = AwaitUnit:GetPointVec3() - - if (((UnitPos.x - AwaitUnitPos.x)^2 + (UnitPos.z - AwaitUnitPos.z)^2)^0.5 <= Radius) then - self:T3( "true" ) - return true - else - self:T3( "false" ) - return false - end - end - - return nil -end - ---- Returns the DCS Unit category name as defined within the DCS Unit Descriptor. --- @param Unit#UNIT self --- @return #string The DCS Unit Category Name -function UNIT:GetCategoryName() - local DCSUnit = self:GetDCSUnit() - - if DCSUnit then - local UnitCategoryName = self.CategoryName[ self:GetDesc().category ] - return UnitCategoryName - end - - return nil -end - ---- Signal a flare at the position of the UNIT. --- @param #UNIT self -function UNIT:Flare( FlareColor ) - self:F2() - trigger.action.signalFlare( self:GetPointVec3(), FlareColor , 0 ) -end - ---- Signal a white flare at the position of the UNIT. --- @param #UNIT self -function UNIT:FlareWhite() - self:F2() - trigger.action.signalFlare( self:GetPointVec3(), trigger.flareColor.White , 0 ) -end - ---- Signal a yellow flare at the position of the UNIT. --- @param #UNIT self -function UNIT:FlareYellow() - self:F2() - trigger.action.signalFlare( self:GetPointVec3(), trigger.flareColor.Yellow , 0 ) -end - ---- Signal a green flare at the position of the UNIT. --- @param #UNIT self -function UNIT:FlareGreen() - self:F2() - trigger.action.signalFlare( self:GetPointVec3(), trigger.flareColor.Green , 0 ) -end - ---- Signal a red flare at the position of the UNIT. --- @param #UNIT self -function UNIT:FlareRed() - self:F2() - trigger.action.signalFlare( self:GetPointVec3(), trigger.flareColor.Red, 0 ) -end - ---- Smoke the UNIT. --- @param #UNIT self -function UNIT:Smoke( SmokeColor ) - self:F2() - trigger.action.smoke( self:GetPointVec3(), SmokeColor ) -end - ---- Smoke the UNIT Green. --- @param #UNIT self -function UNIT:SmokeGreen() - self:F2() - trigger.action.smoke( self:GetPointVec3(), trigger.smokeColor.Green ) -end - ---- Smoke the UNIT Red. --- @param #UNIT self -function UNIT:SmokeRed() - self:F2() - trigger.action.smoke( self:GetPointVec3(), trigger.smokeColor.Red ) -end - ---- Smoke the UNIT White. --- @param #UNIT self -function UNIT:SmokeWhite() - self:F2() - trigger.action.smoke( self:GetPointVec3(), trigger.smokeColor.White ) -end - ---- Smoke the UNIT Orange. --- @param #UNIT self -function UNIT:SmokeOrange() - self:F2() - trigger.action.smoke( self:GetPointVec3(), trigger.smokeColor.Orange ) -end - ---- Smoke the UNIT Blue. --- @param #UNIT self -function UNIT:SmokeBlue() - self:F2() - trigger.action.smoke( self:GetPointVec3(), trigger.smokeColor.Blue ) -end - --- Is methods - ---- Returns if the unit is of an air category. --- If the unit is a helicopter or a plane, then this method will return true, otherwise false. --- @param #UNIT self --- @return #boolean Air category evaluation result. -function UNIT:IsAir() - self:F2() - - local UnitDescriptor = self.DCSUnit:getDesc() - self:T3( { UnitDescriptor.category, Unit.Category.AIRPLANE, Unit.Category.HELICOPTER } ) - - local IsAirResult = ( UnitDescriptor.category == Unit.Category.AIRPLANE ) or ( UnitDescriptor.category == Unit.Category.HELICOPTER ) - - self:T3( IsAirResult ) - return IsAirResult -end - ---- ZONE Classes --- @module Zone - -Include.File( "Routines" ) -Include.File( "Base" ) -Include.File( "Message" ) - ---- The ZONE class --- @type ZONE --- @Extends Base#BASE -ZONE = { - ClassName="ZONE", - } - -function ZONE:New( ZoneName ) - local self = BASE:Inherit( self, BASE:New() ) - self:F( ZoneName ) - - local Zone = trigger.misc.getZone( ZoneName ) - - if not Zone then - error( "Zone " .. ZoneName .. " does not exist." ) - return nil - end - - self.Zone = Zone - self.ZoneName = ZoneName - - return self -end - -function ZONE:GetPointVec2() - self:F( self.ZoneName ) - - local Zone = trigger.misc.getZone( self.ZoneName ) - local Point = { x = Zone.point.x, y = Zone.point.z } - - self:T( { Zone, Point } ) - - return Point -end - -function ZONE:GetPointVec3( Height ) - self:F( self.ZoneName ) - - local Zone = trigger.misc.getZone( self.ZoneName ) - local Point = { x = Zone.point.x, y = land.getHeight( self:GetPointVec2() ) + Height, z = Zone.point.z } - - self:T( { Zone, Point } ) - - return Point -end - -function ZONE:GetRandomPointVec2() - self:F( self.ZoneName ) - - local Point = {} - - local Zone = trigger.misc.getZone( self.ZoneName ) - - local angle = math.random() * math.pi*2; - Point.x = Zone.point.x + math.cos( angle ) * math.random() * Zone.radius; - Point.y = Zone.point.z + math.sin( angle ) * math.random() * Zone.radius; - - self:T( { Zone, Point } ) - - return Point -end - -function ZONE:GetRadius() - self:F( self.ZoneName ) - - local Zone = trigger.misc.getZone( self.ZoneName ) - - self:T( { Zone } ) - - return Zone.radius -end - ---- The CLIENT models client units in multi player missions. --- --- @{#CLIENT} class --- ================ --- Clients are those **Units** defined within the Mission Editor that have the skillset defined as __Client__ or __Player__. --- Note that clients are NOT the same as Units, they are NOT necessarily alive. --- The @{CLIENT} class is a wrapper class to handle the DCS Unit objects that have the skillset defined as __Client__ or __Player__: --- --- * Wraps the DCS Unit objects with skill level set to Player or Client. --- * Support all DCS Unit APIs. --- * Enhance with Unit specific APIs not in the DCS Group API set. --- * When player joins Unit, execute alive init logic. --- * Handles messages to players. --- * Manage the "state" of the DCS Unit. --- --- Clients are being used by the @{MISSION} class to follow players and register their successes. --- --- CLIENT reference methods --- ======================= --- For each DCS Unit having skill level Player or Client, a CLIENT wrapper object (instance) will be created within the _@{DATABASE} object. --- This is done at the beginning of the mission (when the mission starts). --- --- The CLIENT class does not contain a :New() method, rather it provides :Find() methods to retrieve the object reference --- using the DCS Unit or the DCS UnitName. --- --- Another thing to know is that CLIENT objects do not "contain" the DCS Unit object. --- The CLIENT methods will reference the DCS Unit object by name when it is needed during API execution. --- If the DCS Unit object does not exist or is nil, the CLIENT methods will return nil and log an exception in the DCS.log file. --- --- The CLIENT class provides the following functions to retrieve quickly the relevant CLIENT instance: --- --- * @{#CLIENT.Find}(): Find a CLIENT instance from the _DATABASE object using a DCS Unit object. --- * @{#CLIENT.FindByName}(): Find a CLIENT instance from the _DATABASE object using a DCS Unit name. --- --- IMPORTANT: ONE SHOULD NEVER SANATIZE these CLIENT OBJECT REFERENCES! (make the CLIENT object references nil). --- --- @module Client --- @author FlightControl - -Include.File( "Routines" ) -Include.File( "Base" ) -Include.File( "Cargo" ) -Include.File( "Message" ) - - ---- The CLIENT class --- @type CLIENT --- @extends Unit#UNIT -CLIENT = { - ONBOARDSIDE = { - NONE = 0, - LEFT = 1, - RIGHT = 2, - BACK = 3, - FRONT = 4 - }, - ClassName = "CLIENT", - ClientName = nil, - ClientAlive = false, - ClientTransport = false, - ClientBriefingShown = false, - _Menus = {}, - _Tasks = {}, - Messages = { - } -} - - ---- Finds a CLIENT from the _DATABASE using the relevant DCS Unit. --- @param #CLIENT self --- @param #string ClientName Name of the DCS **Unit** as defined within the Mission Editor. --- @param #string ClientBriefing Text that describes the briefing of the mission when a Player logs into the Client. --- @return #CLIENT --- @usage --- -- Create new Clients. --- local Mission = MISSIONSCHEDULER.AddMission( 'Russia Transport Troops SA-6', 'Operational', 'Transport troops from the control center to one of the SA-6 SAM sites to activate their operation.', 'Russia' ) --- Mission:AddGoal( DeploySA6TroopsGoal ) --- --- Mission:AddClient( CLIENT:FindByName( 'RU MI-8MTV2*HOT-Deploy Troops 1' ):Transport() ) --- Mission:AddClient( CLIENT:FindByName( 'RU MI-8MTV2*RAMP-Deploy Troops 3' ):Transport() ) --- Mission:AddClient( CLIENT:FindByName( 'RU MI-8MTV2*HOT-Deploy Troops 2' ):Transport() ) --- Mission:AddClient( CLIENT:FindByName( 'RU MI-8MTV2*RAMP-Deploy Troops 4' ):Transport() ) -function CLIENT:Find( DCSUnit ) - local ClientName = DCSUnit:getName() - local ClientFound = _DATABASE:FindClient( ClientName ) - - if ClientFound then - ClientFound:F( ClientName ) - return ClientFound - end - - error( "CLIENT not found for: " .. ClientName ) -end - - ---- Finds a CLIENT from the _DATABASE using the relevant Client Unit Name. --- As an optional parameter, a briefing text can be given also. --- @param #CLIENT self --- @param #string ClientName Name of the DCS **Unit** as defined within the Mission Editor. --- @param #string ClientBriefing Text that describes the briefing of the mission when a Player logs into the Client. --- @return #CLIENT --- @usage --- -- Create new Clients. --- local Mission = MISSIONSCHEDULER.AddMission( 'Russia Transport Troops SA-6', 'Operational', 'Transport troops from the control center to one of the SA-6 SAM sites to activate their operation.', 'Russia' ) --- Mission:AddGoal( DeploySA6TroopsGoal ) --- --- Mission:AddClient( CLIENT:FindByName( 'RU MI-8MTV2*HOT-Deploy Troops 1' ):Transport() ) --- Mission:AddClient( CLIENT:FindByName( 'RU MI-8MTV2*RAMP-Deploy Troops 3' ):Transport() ) --- Mission:AddClient( CLIENT:FindByName( 'RU MI-8MTV2*HOT-Deploy Troops 2' ):Transport() ) --- Mission:AddClient( CLIENT:FindByName( 'RU MI-8MTV2*RAMP-Deploy Troops 4' ):Transport() ) -function CLIENT:FindByName( ClientName, ClientBriefing ) - local ClientFound = _DATABASE:FindClient( ClientName ) - - if ClientFound then - ClientFound:F( { ClientName, ClientBriefing } ) - ClientFound:AddBriefing( ClientBriefing ) - ClientFound.MessageSwitch = true - - return ClientFound - end - - error( "CLIENT not found for: " .. ClientName ) -end - -function CLIENT:Register( ClientName ) - local self = BASE:Inherit( self, UNIT:Register( ClientName ) ) - - self:F( ClientName ) - self.ClientName = ClientName - self.MessageSwitch = true - self.ClientAlive2 = false - - --self.AliveCheckScheduler = routines.scheduleFunction( self._AliveCheckScheduler, { self }, timer.getTime() + 1, 5 ) - self.AliveCheckScheduler = SCHEDULER:New( self, self._AliveCheckScheduler, {}, 1, 5 ) - - return self -end - - ---- Transport defines that the Client is a Transport. Transports show cargo. --- @param #CLIENT self --- @return #CLIENT -function CLIENT:Transport() - self:F() - - self.ClientTransport = true - return self -end - ---- AddBriefing adds a briefing to a CLIENT when a player joins a mission. --- @param #CLIENT self --- @param #string ClientBriefing is the text defining the Mission briefing. --- @return #CLIENT self -function CLIENT:AddBriefing( ClientBriefing ) - self:F( ClientBriefing ) - self.ClientBriefing = ClientBriefing - self.ClientBriefingShown = false - - return self -end - ---- Show the briefing of a CLIENT. --- @param #CLIENT self --- @return #CLIENT self -function CLIENT:ShowBriefing() - self:F( { self.ClientName, self.ClientBriefingShown } ) - - if not self.ClientBriefingShown then - self.ClientBriefingShown = true - local Briefing = "" - if self.ClientBriefing then - Briefing = Briefing .. self.ClientBriefing - end - Briefing = Briefing .. " Press [LEFT ALT]+[B] to view the complete mission briefing." - self:Message( Briefing, 60, self.ClientName .. '/ClientBriefing', "Briefing" ) - end - - return self -end - ---- Show the mission briefing of a MISSION to the CLIENT. --- @param #CLIENT self --- @param #string MissionBriefing --- @return #CLIENT self -function CLIENT:ShowMissionBriefing( MissionBriefing ) - self:F( { self.ClientName } ) - - if MissionBriefing then - self:Message( MissionBriefing, 60, self.ClientName .. '/MissionBriefing', "Mission Briefing" ) - end - - return self -end - - - ---- Resets a CLIENT. --- @param #CLIENT self --- @param #string ClientName Name of the Group as defined within the Mission Editor. The Group must have a Unit with the type Client. -function CLIENT:Reset( ClientName ) - self:F() - self._Menus = {} -end - --- Is Functions - ---- Checks if the CLIENT is a multi-seated UNIT. --- @param #CLIENT self --- @return #boolean true if multi-seated. -function CLIENT:IsMultiSeated() - self:F( self.ClientName ) - - local ClientMultiSeatedTypes = { - ["Mi-8MT"] = "Mi-8MT", - ["UH-1H"] = "UH-1H", - ["P-51B"] = "P-51B" - } - - if self:IsAlive() then - local ClientTypeName = self:GetClientGroupUnit():GetTypeName() - if ClientMultiSeatedTypes[ClientTypeName] then - return true - end - end - - return false -end - ---- Checks for a client alive event and calls a function on a continuous basis. --- @param #CLIENT self --- @param #function CallBack Function. --- @return #CLIENT -function CLIENT:Alive( CallBack, ... ) - self:F() - - self.ClientCallBack = CallBack - self.ClientParameters = arg - - return self -end - ---- @param #CLIENT self -function CLIENT:_AliveCheckScheduler() - self:F( { self.ClientName, self.ClientAlive2, self.ClientBriefingShown } ) - - if self:IsAlive() then -- Polymorphic call of UNIT - if self.ClientAlive2 == false then - self:ShowBriefing() - if self.ClientCallBack then - self:T("Calling Callback function") - self.ClientCallBack( self, unpack( self.ClientParameters ) ) - end - self.ClientAlive2 = true - end - else - if self.ClientAlive2 == true then - self.ClientAlive2 = false - end - end - - return true -end - ---- Return the DCSGroup of a Client. --- This function is modified to deal with a couple of bugs in DCS 1.5.3 --- @param #CLIENT self --- @return DCSGroup#Group -function CLIENT:GetDCSGroup() - self:F3() - --- local ClientData = Group.getByName( self.ClientName ) --- if ClientData and ClientData:isExist() then --- self:T( self.ClientName .. " : group found!" ) --- return ClientData --- else --- return nil --- end - - local ClientUnit = Unit.getByName( self.ClientName ) - - local CoalitionsData = { AlivePlayersRed = coalition.getPlayers( coalition.side.RED ), AlivePlayersBlue = coalition.getPlayers( coalition.side.BLUE ) } - for CoalitionId, CoalitionData in pairs( CoalitionsData ) do - self:T3( { "CoalitionData:", CoalitionData } ) - for UnitId, UnitData in pairs( CoalitionData ) do - self:T3( { "UnitData:", UnitData } ) - if UnitData and UnitData:isExist() then - - --self:E(self.ClientName) - if ClientUnit then - local ClientGroup = ClientUnit:getGroup() - if ClientGroup then - self:T3( "ClientGroup = " .. self.ClientName ) - if ClientGroup:isExist() and UnitData:getGroup():isExist() then - if ClientGroup:getID() == UnitData:getGroup():getID() then - self:T3( "Normal logic" ) - self:T3( self.ClientName .. " : group found!" ) - self.ClientGroupID = ClientGroup:getID() - self.ClientGroupName = ClientGroup:getName() - return ClientGroup - end - else - -- Now we need to resolve the bugs in DCS 1.5 ... - -- Consult the database for the units of the Client Group. (ClientGroup:getUnits() returns nil) - self:T3( "Bug 1.5 logic" ) - local ClientGroupTemplate = _DATABASE.Templates.Units[self.ClientName].GroupTemplate - self.ClientGroupID = ClientGroupTemplate.groupId - self.ClientGroupName = _DATABASE.Templates.Units[self.ClientName].GroupName - self:T3( self.ClientName .. " : group found in bug 1.5 resolvement logic!" ) - return ClientGroup - end - -- else - -- error( "Client " .. self.ClientName .. " not found!" ) - end - else - --self:E( { "Client not found!", self.ClientName } ) - end - end - end - end - - -- For non player clients - if ClientUnit then - local ClientGroup = ClientUnit:getGroup() - if ClientGroup then - self:T3( "ClientGroup = " .. self.ClientName ) - if ClientGroup:isExist() then - self:T3( "Normal logic" ) - self:T3( self.ClientName .. " : group found!" ) - return ClientGroup - end - end - end - - self.ClientGroupID = nil - self.ClientGroupUnit = nil - - return nil -end - - --- TODO: Check DCSTypes#Group.ID ---- Get the group ID of the client. --- @param #CLIENT self --- @return DCSTypes#Group.ID -function CLIENT:GetClientGroupID() - - local ClientGroup = self:GetDCSGroup() - - --self:E( self.ClientGroupID ) -- Determined in GetDCSGroup() - return self.ClientGroupID -end - - ---- Get the name of the group of the client. --- @param #CLIENT self --- @return #string -function CLIENT:GetClientGroupName() - - local ClientGroup = self:GetDCSGroup() - - self:T( self.ClientGroupName ) -- Determined in GetDCSGroup() - return self.ClientGroupName -end - ---- Returns the UNIT of the CLIENT. --- @param #CLIENT self --- @return Unit#UNIT -function CLIENT:GetClientGroupUnit() - self:F2() - - local ClientDCSUnit = Unit.getByName( self.ClientName ) - - self:T( self.ClientDCSUnit ) - if ClientDCSUnit and ClientDCSUnit:isExist() then - local ClientUnit = _DATABASE:FindUnit( self.ClientName ) - self:T2( ClientUnit ) - return ClientUnit - end -end - ---- Returns the DCSUnit of the CLIENT. --- @param #CLIENT self --- @return DCSTypes#Unit -function CLIENT:GetClientGroupDCSUnit() - self:F2() - - local ClientDCSUnit = Unit.getByName( self.ClientName ) - - if ClientDCSUnit and ClientDCSUnit:isExist() then - self:T2( ClientDCSUnit ) - return ClientDCSUnit - end -end - - ---- Evaluates if the CLIENT is a transport. --- @param #CLIENT self --- @return #boolean true is a transport. -function CLIENT:IsTransport() - self:F() - return self.ClientTransport -end - ---- Shows the @{Cargo#CARGO} contained within the CLIENT to the player as a message. --- The @{Cargo#CARGO} is shown using the @{Message#MESSAGE} distribution system. --- @param #CLIENT self -function CLIENT:ShowCargo() - self:F() - - local CargoMsg = "" - - for CargoName, Cargo in pairs( CARGOS ) do - if self == Cargo:IsLoadedInClient() then - CargoMsg = CargoMsg .. Cargo.CargoName .. " Type:" .. Cargo.CargoType .. " Weight: " .. Cargo.CargoWeight .. "\n" - end - end - - if CargoMsg == "" then - CargoMsg = "empty" - end - - self:Message( CargoMsg, 15, self.ClientName .. "/Cargo", "Co-Pilot: Cargo Status", 30 ) - -end - --- TODO (1) I urgently need to revise this. ---- A local function called by the DCS World Menu system to switch off messages. -function CLIENT.SwitchMessages( PrmTable ) - PrmTable[1].MessageSwitch = PrmTable[2] -end - ---- The main message driver for the CLIENT. --- This function displays various messages to the Player logged into the CLIENT through the DCS World Messaging system. --- @param #CLIENT self --- @param #string Message is the text describing the message. --- @param #number MessageDuration is the duration in seconds that the Message should be displayed. --- @param #string MessageId is a text identifying the Message in the MessageQueue. The Message system overwrites Messages with the same MessageId --- @param #string MessageCategory is the category of the message (the title). --- @param #number MessageInterval is the interval in seconds between the display of the @{Message#MESSAGE} when the CLIENT is in the air. -function CLIENT:Message( Message, MessageDuration, MessageId, MessageCategory, MessageInterval ) - self:F( { Message, MessageDuration, MessageId, MessageCategory, MessageInterval } ) - - if not self.MenuMessages then - if self:GetClientGroupID() then - self.MenuMessages = MENU_CLIENT:New( self, 'Messages' ) - self.MenuRouteMessageOn = MENU_CLIENT_COMMAND:New( self, 'Messages On', self.MenuMessages, CLIENT.SwitchMessages, { self, true } ) - self.MenuRouteMessageOff = MENU_CLIENT_COMMAND:New( self,'Messages Off', self.MenuMessages, CLIENT.SwitchMessages, { self, false } ) - end - end - - if self.MessageSwitch == true then - if MessageCategory == nil then - MessageCategory = "Messages" - end - if self.Messages[MessageId] == nil then - self.Messages[MessageId] = {} - self.Messages[MessageId].MessageId = MessageId - self.Messages[MessageId].MessageTime = timer.getTime() - self.Messages[MessageId].MessageDuration = MessageDuration - if MessageInterval == nil then - self.Messages[MessageId].MessageInterval = 600 - else - self.Messages[MessageId].MessageInterval = MessageInterval - end - MESSAGE:New( Message, MessageCategory, MessageDuration, MessageId ):ToClient( self ) - else - if self:GetClientGroupDCSUnit() and not self:GetClientGroupDCSUnit():inAir() then - if timer.getTime() - self.Messages[MessageId].MessageTime >= self.Messages[MessageId].MessageDuration + 10 then - MESSAGE:New( Message, MessageCategory, MessageDuration, MessageId ):ToClient( self ) - self.Messages[MessageId].MessageTime = timer.getTime() - end - else - if timer.getTime() - self.Messages[MessageId].MessageTime >= self.Messages[MessageId].MessageDuration + self.Messages[MessageId].MessageInterval then - MESSAGE:New( Message, MessageCategory, MessageDuration, MessageId ):ToClient( self ) - self.Messages[MessageId].MessageTime = timer.getTime() - end - end - end - end -end ---- Manage the mission database. --- --- @{#DATABASE} class --- ================== --- Mission designers can use the DATABASE class to refer to: --- --- * UNITS --- * GROUPS --- * players --- * alive players --- * CLIENTS --- * alive CLIENTS --- --- On top, for internal MOOSE administration purposes, the DATBASE administers the Unit and Gruop templates as defined within the Mission Editor. --- --- Moose will automatically create one instance of the DATABASE class into the **global** object _DATABASE. --- Moose refers to _DATABASE within the framework extensively, but you can also refer to the _DATABASE object within your missions if required. --- --- DATABASE iterators: --- =================== --- You can iterate the database with the available iterator methods. --- The iterator methods will walk the DATABASE set, and call for each element within the set a function that you provide. --- The following iterator methods are currently available within the DATABASE: --- --- * @{#DATABASE.ForEachUnit}: Calls a function for each @{UNIT} it finds within the DATABASE. --- * @{#DATABASE.ForEachGroup}: Calls a function for each @{GROUP} it finds within the DATABASE. --- * @{#DATABASE.ForEachPlayer}: Calls a function for each player it finds within the DATABASE. --- * @{#DATABASE.ForEachPlayerAlive}: Calls a function for each alive player it finds within the DATABASE. --- * @{#DATABASE.ForEachClient}: Calls a function for each @{CLIENT} it finds within the DATABASE. --- * @{#DATABASE.ForEachClientAlive}: Calls a function for each alive @{CLIENT} it finds within the DATABASE. --- --- @module Database --- @author FlightControl - -Include.File( "Routines" ) -Include.File( "Base" ) -Include.File( "Menu" ) -Include.File( "Group" ) -Include.File( "Unit" ) -Include.File( "Event" ) -Include.File( "Client" ) - - ---- DATABASE class --- @type DATABASE --- @extends Base#BASE -DATABASE = { - ClassName = "DATABASE", - Templates = { - Units = {}, - Groups = {}, - ClientsByName = {}, - ClientsByID = {}, - }, - DCSUnits = {}, - DCSGroups = {}, - UNITS = {}, - GROUPS = {}, - PLAYERS = {}, - PLAYERSALIVE = {}, - CLIENTS = {}, - CLIENTSALIVE = {}, - NavPoints = {}, -} - -local _DATABASECoalition = - { - [1] = "Red", - [2] = "Blue", - } - -local _DATABASECategory = - { - [Unit.Category.AIRPLANE] = "Plane", - [Unit.Category.HELICOPTER] = "Helicopter", - [Unit.Category.GROUND_UNIT] = "Vehicle", - [Unit.Category.SHIP] = "Ship", - [Unit.Category.STRUCTURE] = "Structure", - } - - ---- Creates a new DATABASE object, building a set of units belonging to a coalitions, categories, countries, types or with defined prefix names. --- @param #DATABASE self --- @return #DATABASE --- @usage --- -- Define a new DATABASE Object. This DBObject will contain a reference to all Group and Unit Templates defined within the ME and the DCSRTE. --- DBObject = DATABASE:New() -function DATABASE:New() - - -- Inherits from BASE - local self = BASE:Inherit( self, BASE:New() ) - - _EVENTDISPATCHER:OnBirth( self._EventOnBirth, self ) - _EVENTDISPATCHER:OnDead( self._EventOnDeadOrCrash, self ) - _EVENTDISPATCHER:OnCrash( self._EventOnDeadOrCrash, self ) - - - -- Follow alive players and clients - _EVENTDISPATCHER:OnPlayerEnterUnit( self._EventOnPlayerEnterUnit, self ) - _EVENTDISPATCHER:OnPlayerLeaveUnit( self._EventOnPlayerLeaveUnit, self ) - - self:_RegisterTemplates() - self:_RegisterDatabase() - self:_RegisterPlayers() - - return self -end - ---- Finds a Unit based on the Unit Name. --- @param #DATABASE self --- @param #string UnitName --- @return Unit#UNIT The found Unit. -function DATABASE:FindUnit( UnitName ) - - local UnitFound = self.UNITS[UnitName] - return UnitFound -end - - ---- Adds a Unit based on the Unit Name in the DATABASE. --- @param #DATABASE self -function DATABASE:AddUnit( DCSUnit, DCSUnitName ) - - self.DCSUnits[DCSUnitName] = DCSUnit - self.UNITS[DCSUnitName] = UNIT:Register( DCSUnitName ) -end - - ---- Deletes a Unit from the DATABASE based on the Unit Name. --- @param #DATABASE self -function DATABASE:DeleteUnit( DCSUnitName ) - - self.DCSUnits[DCSUnitName] = nil -end - - ---- Finds a CLIENT based on the ClientName. --- @param #DATABASE self --- @param #string ClientName --- @return Client#CLIENT The found CLIENT. -function DATABASE:FindClient( ClientName ) - - local ClientFound = self.CLIENTS[ClientName] - return ClientFound -end - - ---- Adds a CLIENT based on the ClientName in the DATABASE. --- @param #DATABASE self -function DATABASE:AddClient( ClientName ) - - self.CLIENTS[ClientName] = CLIENT:Register( ClientName ) - self:E( self.CLIENTS[ClientName]:GetClassNameAndID() ) -end - - ---- Finds a GROUP based on the GroupName. --- @param #DATABASE self --- @param #string GroupName --- @return Group#GROUP The found GROUP. -function DATABASE:FindGroup( GroupName ) - - local GroupFound = self.GROUPS[GroupName] - return GroupFound -end - - ---- Adds a GROUP based on the GroupName in the DATABASE. --- @param #DATABASE self -function DATABASE:AddGroup( DCSGroup, GroupName ) - - self.DCSGroups[GroupName] = DCSGroup - self.GROUPS[GroupName] = GROUP:Register( GroupName ) -end - ---- Adds a player based on the Player Name in the DATABASE. --- @param #DATABASE self -function DATABASE:AddPlayer( UnitName, PlayerName ) - - if PlayerName then - self:E( { "Add player for unit:", UnitName, PlayerName } ) - self.PLAYERS[PlayerName] = PlayerName - self.PLAYERSALIVE[PlayerName] = PlayerName - self.CLIENTSALIVE[PlayerName] = self:FindClient( UnitName ) - end -end - ---- Deletes a player from the DATABASE based on the Player Name. --- @param #DATABASE self -function DATABASE:DeletePlayer( PlayerName ) - - if PlayerName then - self:E( { "Clean player:", PlayerName } ) - self.PLAYERSALIVE[PlayerName] = nil - self.CLIENTSALIVE[PlayerName] = nil - end -end - - ---- Instantiate new Groups within the DCSRTE. --- This method expects EXACTLY the same structure as a structure within the ME, and needs 2 additional fields defined: --- SpawnCountryID, SpawnCategoryID --- This method is used by the SPAWN class. --- @param #DATABASE self --- @param #table SpawnTemplate --- @return #DATABASE self -function DATABASE:Spawn( SpawnTemplate ) - self:F2( SpawnTemplate.name ) - - self:T2( { SpawnTemplate.SpawnCountryID, SpawnTemplate.SpawnCategoryID } ) - - -- Copy the spawn variables of the template in temporary storage, nullify, and restore the spawn variables. - local SpawnCoalitionID = SpawnTemplate.SpawnCoalitionID - local SpawnCountryID = SpawnTemplate.SpawnCountryID - local SpawnCategoryID = SpawnTemplate.SpawnCategoryID - - -- Nullify - SpawnTemplate.SpawnCoalitionID = nil - SpawnTemplate.SpawnCountryID = nil - SpawnTemplate.SpawnCategoryID = nil - - self:_RegisterTemplate( SpawnTemplate ) - coalition.addGroup( SpawnCountryID, SpawnCategoryID, SpawnTemplate ) - - -- Restore - SpawnTemplate.SpawnCoalitionID = SpawnCoalitionID - SpawnTemplate.SpawnCountryID = SpawnCountryID - SpawnTemplate.SpawnCategoryID = SpawnCategoryID - - - local SpawnGroup = GROUP:Register( SpawnTemplate.name ) - return SpawnGroup -end - ---- Set a status to a Group within the Database, this to check crossing events for example. -function DATABASE:SetStatusGroup( GroupName, Status ) - self:F2( Status ) - - self.Templates.Groups[GroupName].Status = Status -end - ---- Get a status to a Group within the Database, this to check crossing events for example. -function DATABASE:GetStatusGroup( GroupName ) - self:F2( Status ) - - if self.Templates.Groups[GroupName] then - return self.Templates.Groups[GroupName].Status - else - return "" - end -end - - ---- Private method that registers new Group Templates within the DATABASE Object. --- @param #DATABASE self --- @param #table GroupTemplate --- @return #DATABASE self -function DATABASE:_RegisterTemplate( GroupTemplate ) - - local GroupTemplateName = env.getValueDictByKey(GroupTemplate.name) - - if not self.Templates.Groups[GroupTemplateName] then - self.Templates.Groups[GroupTemplateName] = {} - self.Templates.Groups[GroupTemplateName].Status = nil - end - - -- Delete the spans from the route, it is not needed and takes memory. - if GroupTemplate.route and GroupTemplate.route.spans then - GroupTemplate.route.spans = nil - end - - self.Templates.Groups[GroupTemplateName].GroupName = GroupTemplateName - self.Templates.Groups[GroupTemplateName].Template = GroupTemplate - self.Templates.Groups[GroupTemplateName].groupId = GroupTemplate.groupId - self.Templates.Groups[GroupTemplateName].UnitCount = #GroupTemplate.units - self.Templates.Groups[GroupTemplateName].Units = GroupTemplate.units - - self:T2( { "Group", self.Templates.Groups[GroupTemplateName].GroupName, self.Templates.Groups[GroupTemplateName].UnitCount } ) - - for unit_num, UnitTemplate in pairs( GroupTemplate.units ) do - - local UnitTemplateName = env.getValueDictByKey(UnitTemplate.name) - self.Templates.Units[UnitTemplateName] = {} - self.Templates.Units[UnitTemplateName].UnitName = UnitTemplateName - self.Templates.Units[UnitTemplateName].Template = UnitTemplate - self.Templates.Units[UnitTemplateName].GroupName = GroupTemplateName - self.Templates.Units[UnitTemplateName].GroupTemplate = GroupTemplate - self.Templates.Units[UnitTemplateName].GroupId = GroupTemplate.groupId - self:E( {"skill",UnitTemplate.skill}) - if UnitTemplate.skill and (UnitTemplate.skill == "Client" or UnitTemplate.skill == "Player") then - self.Templates.ClientsByName[UnitTemplateName] = UnitTemplate - self.Templates.ClientsByID[UnitTemplate.unitId] = UnitTemplate - end - self:E( { "Unit", self.Templates.Units[UnitTemplateName].UnitName } ) - end -end - - ---- Private method that registers all alive players in the mission. --- @param #DATABASE self --- @return #DATABASE self -function DATABASE:_RegisterPlayers() - - local CoalitionsData = { AlivePlayersRed = coalition.getPlayers( coalition.side.RED ), AlivePlayersBlue = coalition.getPlayers( coalition.side.BLUE ) } - for CoalitionId, CoalitionData in pairs( CoalitionsData ) do - for UnitId, UnitData in pairs( CoalitionData ) do - self:T3( { "UnitData:", UnitData } ) - if UnitData and UnitData:isExist() then - local UnitName = UnitData:getName() - local PlayerName = UnitData:getPlayerName() - if not self.PLAYERS[PlayerName] then - self:E( { "Add player for unit:", UnitName, PlayerName } ) - self:AddPlayer( UnitName, PlayerName ) - end - end - end - end - - return self -end - - ---- Private method that registers all datapoints within in the mission. --- @param #DATABASE self --- @return #DATABASE self -function DATABASE:_RegisterDatabase() - - local CoalitionsData = { GroupsRed = coalition.getGroups( coalition.side.RED ), GroupsBlue = coalition.getGroups( coalition.side.BLUE ) } - for CoalitionId, CoalitionData in pairs( CoalitionsData ) do - for DCSGroupId, DCSGroup in pairs( CoalitionData ) do - - if DCSGroup:isExist() then - local DCSGroupName = DCSGroup:getName() - - self:E( { "Register Group:", DCSGroup, DCSGroupName } ) - self:AddGroup( DCSGroup, DCSGroupName ) - - for DCSUnitId, DCSUnit in pairs( DCSGroup:getUnits() ) do - - local DCSUnitName = DCSUnit:getName() - self:E( { "Register Unit:", DCSUnit, DCSUnitName } ) - self:AddUnit( DCSUnit, DCSUnitName ) - end - else - self:E( { "Group does not exist: ", DCSGroup } ) - end - - end - end - - for ClientName, ClientTemplate in pairs( self.Templates.ClientsByName ) do - self:E( { "Adding Client:", ClientName } ) - self:AddClient( ClientName ) - end - - return self -end - ---- Events - ---- Handles the OnBirth event for the alive units set. --- @param #DATABASE self --- @param Event#EVENTDATA Event -function DATABASE:_EventOnBirth( Event ) - self:F2( { Event } ) - - if Event.IniDCSUnit then - self:AddUnit( Event.IniDCSUnit, Event.IniDCSUnitName ) - self:AddGroup( Event.IniDCSGroup, Event.IniDCSGroupName ) - self:_EventOnPlayerEnterUnit( Event ) - end -end - - ---- Handles the OnDead or OnCrash event for alive units set. --- @param #DATABASE self --- @param Event#EVENTDATA Event -function DATABASE:_EventOnDeadOrCrash( Event ) - self:F2( { Event } ) - - if Event.IniDCSUnit then - if self.DCSUnits[Event.IniDCSUnitName] then - self:DeleteUnit( Event.IniDCSUnitName ) - -- add logic to correctly remove a group once all units are destroyed... - end - end -end - - ---- Handles the OnPlayerEnterUnit event to fill the active players table (with the unit filter applied). --- @param #DATABASE self --- @param Event#EVENTDATA Event -function DATABASE:_EventOnPlayerEnterUnit( Event ) - self:F2( { Event } ) - - if Event.IniDCSUnit then - local PlayerName = Event.IniDCSUnit:getPlayerName() - if not self.PLAYERSALIVE[PlayerName] then - self:AddPlayer( Event.IniDCSUnitName, PlayerName ) - end - end -end - - ---- Handles the OnPlayerLeaveUnit event to clean the active players table. --- @param #DATABASE self --- @param Event#EVENTDATA Event -function DATABASE:_EventOnPlayerLeaveUnit( Event ) - self:F2( { Event } ) - - if Event.IniDCSUnit then - local PlayerName = Event.IniDCSUnit:getPlayerName() - if self.PLAYERSALIVE[PlayerName] then - self:DeletePlayer( PlayerName ) - end - end -end - ---- Iterators - ---- Iterate the DATABASE and call an iterator function for the given set, providing the Object for each element within the set and optional parameters. --- @param #DATABASE self --- @param #function IteratorFunction The function that will be called when there is an alive player in the database. --- @return #DATABASE self -function DATABASE:ForEach( IteratorFunction, arg, Set ) - self:F2( arg ) - - local function CoRoutine() - local Count = 0 - for ObjectID, Object in pairs( Set ) do - self:T2( Object ) - IteratorFunction( Object, unpack( arg ) ) - Count = Count + 1 - if Count % 10 == 0 then - coroutine.yield( false ) - end - end - return true - end - - local co = coroutine.create( CoRoutine ) - - local function Schedule() - - local status, res = coroutine.resume( co ) - self:T2( { status, res } ) - - if status == false then - error( res ) - end - if res == false then - return true -- resume next time the loop - end - - return false - end - - local Scheduler = SCHEDULER:New( self, Schedule, {}, 0.001, 0.001, 0 ) - - return self -end - - ---- Iterate the DATABASE and call an iterator function for each **alive** unit, providing the DCSUnit and optional parameters. --- @param #DATABASE self --- @param #function IteratorFunction The function that will be called when there is an alive unit in the database. The function needs to accept a DCSUnit parameter. --- @return #DATABASE self -function DATABASE:ForEachDCSUnit( IteratorFunction, ... ) - self:F2( arg ) - - self:ForEach( IteratorFunction, arg, self.DCSUnits ) - - return self -end - - ---- Iterate the DATABASE and call an iterator function for each **alive** UNIT, providing the UNIT and optional parameters. --- @param #DATABASE self --- @param #function IteratorFunction The function that will be called when there is an alive UNIT in the database. The function needs to accept a UNIT parameter. --- @return #DATABASE self -function DATABASE:ForEachUnit( IteratorFunction, ... ) - self:F2( arg ) - - self:ForEach( IteratorFunction, arg, self.UNITS ) - - return self -end - ---- Iterate the DATABASE and call an iterator function for each **alive** GROUP, providing the GROUP and optional parameters. --- @param #DATABASE self --- @param #function IteratorFunction The function that will be called when there is an alive GROUP in the database. The function needs to accept a GROUP parameter. --- @return #DATABASE self -function DATABASE:ForEachGroup( IteratorFunction, ... ) - self:F2( arg ) - - self:ForEach( IteratorFunction, arg, self.GROUPS ) - - return self -end - - ---- Iterate the DATABASE and call an iterator function for each player, providing the player name and optional parameters. --- @param #DATABASE self --- @param #function IteratorFunction The function that will be called when there is an player in the database. The function needs to accept the player name. --- @return #DATABASE self -function DATABASE:ForEachPlayer( IteratorFunction, ... ) - self:F2( arg ) - - self:ForEach( IteratorFunction, arg, self.PLAYERS ) - - return self -end - - ---- Iterate the DATABASE and call an iterator function for each **alive** player, providing the Unit of the player and optional parameters. --- @param #DATABASE self --- @param #function IteratorFunction The function that will be called when there is an alive player in the database. The function needs to accept a UNIT parameter. --- @return #DATABASE self -function DATABASE:ForEachPlayerAlive( IteratorFunction, ... ) - self:F2( arg ) - - self:ForEach( IteratorFunction, arg, self.PLAYERSALIVE ) - - return self -end - ---- Iterate the DATABASE and call an iterator function for each CLIENT, providing the CLIENT to the function and optional parameters. --- @param #DATABASE self --- @param #function IteratorFunction The function that will be called when there is an alive player in the database. The function needs to accept a CLIENT parameter. --- @return #DATABASE self -function DATABASE:ForEachClient( IteratorFunction, ... ) - self:F2( arg ) - - self:ForEach( IteratorFunction, arg, self.CLIENTS ) - - return self -end - ---- Iterate the DATABASE and call an iterator function for each **ALIVE** CLIENT, providing the CLIENT to the function and optional parameters. --- @param #DATABASE self --- @param #function IteratorFunction The function that will be called when there is an alive CLIENT in the database. The function needs to accept a CLIENT parameter. --- @return #DATABASE self -function DATABASE:ForEachClientAlive( IteratorFunction, ... ) - self:F2( arg ) - - self:ForEach( IteratorFunction, arg, self.CLIENTSALIVE ) - - return self -end - - -function DATABASE:_RegisterTemplates() - self:F2() - - self.Navpoints = {} - self.UNITS = {} - --Build routines.db.units and self.Navpoints - for coa_name, coa_data in pairs(env.mission.coalition) do - - if (coa_name == 'red' or coa_name == 'blue') and type(coa_data) == 'table' then - --self.Units[coa_name] = {} - - ---------------------------------------------- - -- build nav points DB - self.Navpoints[coa_name] = {} - if coa_data.nav_points then --navpoints - for nav_ind, nav_data in pairs(coa_data.nav_points) do - - if type(nav_data) == 'table' then - self.Navpoints[coa_name][nav_ind] = routines.utils.deepCopy(nav_data) - - self.Navpoints[coa_name][nav_ind]['name'] = nav_data.callsignStr -- name is a little bit more self-explanatory. - self.Navpoints[coa_name][nav_ind]['point'] = {} -- point is used by SSE, support it. - self.Navpoints[coa_name][nav_ind]['point']['x'] = nav_data.x - self.Navpoints[coa_name][nav_ind]['point']['y'] = 0 - self.Navpoints[coa_name][nav_ind]['point']['z'] = nav_data.y - end - end - end - ------------------------------------------------- - if coa_data.country then --there is a country table - for cntry_id, cntry_data in pairs(coa_data.country) do - - local countryName = string.lower(cntry_data.name) - --self.Units[coa_name][countryName] = {} - --self.Units[coa_name][countryName]["countryId"] = cntry_data.id - - if type(cntry_data) == 'table' then --just making sure - - for obj_type_name, obj_type_data in pairs(cntry_data) do - - if obj_type_name == "helicopter" or obj_type_name == "ship" or obj_type_name == "plane" or obj_type_name == "vehicle" or obj_type_name == "static" then --should be an unncessary check - - local category = obj_type_name - - if ((type(obj_type_data) == 'table') and obj_type_data.group and (type(obj_type_data.group) == 'table') and (#obj_type_data.group > 0)) then --there's a group! - - --self.Units[coa_name][countryName][category] = {} - - for group_num, GroupTemplate in pairs(obj_type_data.group) do - - if GroupTemplate and GroupTemplate.units and type(GroupTemplate.units) == 'table' then --making sure again- this is a valid group - self:_RegisterTemplate( GroupTemplate ) - end --if GroupTemplate and GroupTemplate.units then - end --for group_num, GroupTemplate in pairs(obj_type_data.group) do - end --if ((type(obj_type_data) == 'table') and obj_type_data.group and (type(obj_type_data.group) == 'table') and (#obj_type_data.group > 0)) then - end --if obj_type_name == "helicopter" or obj_type_name == "ship" or obj_type_name == "plane" or obj_type_name == "vehicle" or obj_type_name == "static" then - end --for obj_type_name, obj_type_data in pairs(cntry_data) do - end --if type(cntry_data) == 'table' then - end --for cntry_id, cntry_data in pairs(coa_data.country) do - end --if coa_data.country then --there is a country table - end --if coa_name == 'red' or coa_name == 'blue' and type(coa_data) == 'table' then - end --for coa_name, coa_data in pairs(mission.coalition) do - - return self -end - - - - ---- The main include file for the MOOSE system. - -Include.File( "Routines" ) -Include.File( "Base" ) -Include.File( "Database" ) -Include.File( "Event" ) - --- The order of the declarations is important here. Don't touch it. - ---- Declare the event dispatcher based on the EVENT class -_EVENTDISPATCHER = EVENT:New() -- #EVENT - ---- Declare the main database object, which is used internally by the MOOSE classes. -_DATABASE = DATABASE:New() -- Database#DATABASE - ---- Scoring system for MOOSE. --- This scoring class calculates the hits and kills that players make within a simulation session. --- Scoring is calculated using a defined algorithm. --- With a small change in MissionScripting.lua, the scoring can also be logged in a CSV file, that can then be uploaded --- to a database or a BI tool to publish the scoring results to the player community. --- @module Scoring --- @author FlightControl - - -Include.File( "Routines" ) -Include.File( "Base" ) -Include.File( "Menu" ) -Include.File( "Group" ) -Include.File( "Event" ) - - ---- The Scoring class --- @type SCORING --- @field Players A collection of the current players that have joined the game. --- @extends Base#BASE -SCORING = { - ClassName = "SCORING", - ClassID = 0, - Players = {}, -} - -local _SCORINGCoalition = - { - [1] = "Red", - [2] = "Blue", - } - -local _SCORINGCategory = - { - [Unit.Category.AIRPLANE] = "Plane", - [Unit.Category.HELICOPTER] = "Helicopter", - [Unit.Category.GROUND_UNIT] = "Vehicle", - [Unit.Category.SHIP] = "Ship", - [Unit.Category.STRUCTURE] = "Structure", - } - ---- Creates a new SCORING object to administer the scoring achieved by players. --- @param #SCORING self --- @param #string GameName The name of the game. This name is also logged in the CSV score file. --- @return #SCORING self --- @usage --- -- Define a new scoring object for the mission Gori Valley. --- ScoringObject = SCORING:New( "Gori Valley" ) -function SCORING:New( GameName ) - - -- Inherits from BASE - local self = BASE:Inherit( self, BASE:New() ) - - if GameName then - self.GameName = GameName - else - error( "A game name must be given to register the scoring results" ) - end - - - _EVENTDISPATCHER:OnDead( self._EventOnDeadOrCrash, self ) - _EVENTDISPATCHER:OnCrash( self._EventOnDeadOrCrash, self ) - _EVENTDISPATCHER:OnHit( self._EventOnHit, self ) - - --self.SchedulerId = routines.scheduleFunction( SCORING._FollowPlayersScheduled, { self }, 0, 5 ) - self.SchedulerId = SCHEDULER:New( self, self._FollowPlayersScheduled, {}, 0, 5 ) - - self:ScoreMenu() - - return self - -end - ---- Creates a score radio menu. Can be accessed using Radio -> F10. --- @param #SCORING self --- @return #SCORING self -function SCORING:ScoreMenu() - self.Menu = SUBMENU:New( 'Scoring' ) - self.AllScoresMenu = COMMANDMENU:New( 'Score All Active Players', self.Menu, SCORING.ReportScoreAll, self ) - --- = COMMANDMENU:New('Your Current Score', ReportScore, SCORING.ReportScorePlayer, self ) - return self -end - ---- Follows new players entering Clients within the DCSRTE. --- TODO: Need to see if i can catch this also with an event. It will eliminate the schedule ... -function SCORING:_FollowPlayersScheduled() - self:F3( "_FollowPlayersScheduled" ) - - local ClientUnit = 0 - local CoalitionsData = { AlivePlayersRed = coalition.getPlayers(coalition.side.RED), AlivePlayersBlue = coalition.getPlayers(coalition.side.BLUE) } - local unitId - local unitData - local AlivePlayerUnits = {} - - for CoalitionId, CoalitionData in pairs( CoalitionsData ) do - self:T3( { "_FollowPlayersScheduled", CoalitionData } ) - for UnitId, UnitData in pairs( CoalitionData ) do - self:_AddPlayerFromUnit( UnitData ) - end - end - - return true -end - - ---- Track DEAD or CRASH events for the scoring. --- @param #SCORING self --- @param Event#EVENTDATA Event -function SCORING:_EventOnDeadOrCrash( Event ) - self:F( { Event } ) - - local TargetUnit = nil - local TargetGroup = nil - local TargetUnitName = "" - local TargetGroupName = "" - local TargetPlayerName = "" - local TargetCoalition = nil - local TargetCategory = nil - local TargetType = nil - local TargetUnitCoalition = nil - local TargetUnitCategory = nil - local TargetUnitType = nil - - if Event.IniDCSUnit then - - TargetUnit = Event.IniDCSUnit - TargetUnitName = Event.IniDCSUnitName - TargetGroup = Event.IniDCSGroup - TargetGroupName = Event.IniDCSGroupName - TargetPlayerName = TargetUnit:getPlayerName() - - TargetCoalition = TargetUnit:getCoalition() - --TargetCategory = TargetUnit:getCategory() - TargetCategory = TargetUnit:getDesc().category -- Workaround - TargetType = TargetUnit:getTypeName() - - TargetUnitCoalition = _SCORINGCoalition[TargetCoalition] - TargetUnitCategory = _SCORINGCategory[TargetCategory] - TargetUnitType = TargetType - - self:T( { TargetUnitName, TargetGroupName, TargetPlayerName, TargetCoalition, TargetCategory, TargetType } ) - end - - for PlayerName, PlayerData in pairs( self.Players ) do - if PlayerData then -- This should normally not happen, but i'll test it anyway. - self:T( "Something got killed" ) - - -- Some variables - local InitUnitName = PlayerData.UnitName - local InitUnitType = PlayerData.UnitType - local InitCoalition = PlayerData.UnitCoalition - local InitCategory = PlayerData.UnitCategory - local InitUnitCoalition = _SCORINGCoalition[InitCoalition] - local InitUnitCategory = _SCORINGCategory[InitCategory] - - self:T( { InitUnitName, InitUnitType, InitUnitCoalition, InitCoalition, InitUnitCategory, InitCategory } ) - - -- What is he hitting? - if TargetCategory then - if PlayerData and PlayerData.Hit and PlayerData.Hit[TargetCategory] and PlayerData.Hit[TargetCategory][TargetUnitName] then -- Was there a hit for this unit for this player before registered??? - if not PlayerData.Kill[TargetCategory] then - PlayerData.Kill[TargetCategory] = {} - end - if not PlayerData.Kill[TargetCategory][TargetType] then - PlayerData.Kill[TargetCategory][TargetType] = {} - PlayerData.Kill[TargetCategory][TargetType].Score = 0 - PlayerData.Kill[TargetCategory][TargetType].ScoreKill = 0 - PlayerData.Kill[TargetCategory][TargetType].Penalty = 0 - PlayerData.Kill[TargetCategory][TargetType].PenaltyKill = 0 - end - - if InitCoalition == TargetCoalition then - PlayerData.Penalty = PlayerData.Penalty + 25 - PlayerData.Kill[TargetCategory][TargetType].Penalty = PlayerData.Kill[TargetCategory][TargetType].Penalty + 25 - PlayerData.Kill[TargetCategory][TargetType].PenaltyKill = PlayerData.Kill[TargetCategory][TargetType].PenaltyKill + 1 - MESSAGE:New( "Player '" .. PlayerName .. "' killed a friendly " .. TargetUnitCategory .. " ( " .. TargetType .. " ) " .. - PlayerData.Kill[TargetCategory][TargetType].PenaltyKill .. " times. Penalty: -" .. PlayerData.Kill[TargetCategory][TargetType].Penalty .. - ". Score Total:" .. PlayerData.Score - PlayerData.Penalty, - "", 5, "/PENALTY" .. PlayerName .. "/" .. InitUnitName ):ToAll() - self:ScoreCSV( PlayerName, "KILL_PENALTY", 1, -125, InitUnitName, InitUnitCoalition, InitUnitCategory, InitUnitType, TargetUnitName, TargetUnitCoalition, TargetUnitCategory, TargetUnitType ) - else - PlayerData.Score = PlayerData.Score + 10 - PlayerData.Kill[TargetCategory][TargetType].Score = PlayerData.Kill[TargetCategory][TargetType].Score + 10 - PlayerData.Kill[TargetCategory][TargetType].ScoreKill = PlayerData.Kill[TargetCategory][TargetType].ScoreKill + 1 - MESSAGE:New( "Player '" .. PlayerName .. "' killed an enemy " .. TargetUnitCategory .. " ( " .. TargetType .. " ) " .. - PlayerData.Kill[TargetCategory][TargetType].ScoreKill .. " times. Score: " .. PlayerData.Kill[TargetCategory][TargetType].Score .. - ". Score Total:" .. PlayerData.Score - PlayerData.Penalty, - "", 5, "/SCORE" .. PlayerName .. "/" .. InitUnitName ):ToAll() - self:ScoreCSV( PlayerName, "KILL_SCORE", 1, 10, InitUnitName, InitUnitCoalition, InitUnitCategory, InitUnitType, TargetUnitName, TargetUnitCoalition, TargetUnitCategory, TargetUnitType ) - end - end - end - end - end -end - - - ---- Add a new player entering a Unit. -function SCORING:_AddPlayerFromUnit( UnitData ) - self:F( UnitData ) - - if UnitData and UnitData:isExist() then - local UnitName = UnitData:getName() - local PlayerName = UnitData:getPlayerName() - local UnitDesc = UnitData:getDesc() - local UnitCategory = UnitDesc.category - local UnitCoalition = UnitData:getCoalition() - local UnitTypeName = UnitData:getTypeName() - - self:T( { PlayerName, UnitName, UnitCategory, UnitCoalition, UnitTypeName } ) - - if self.Players[PlayerName] == nil then -- I believe this is the place where a Player gets a life in a mission when he enters a unit ... - self.Players[PlayerName] = {} - self.Players[PlayerName].Hit = {} - self.Players[PlayerName].Kill = {} - self.Players[PlayerName].Mission = {} - - -- for CategoryID, CategoryName in pairs( SCORINGCategory ) do - -- self.Players[PlayerName].Hit[CategoryID] = {} - -- self.Players[PlayerName].Kill[CategoryID] = {} - -- end - self.Players[PlayerName].HitPlayers = {} - self.Players[PlayerName].HitUnits = {} - self.Players[PlayerName].Score = 0 - self.Players[PlayerName].Penalty = 0 - self.Players[PlayerName].PenaltyCoalition = 0 - self.Players[PlayerName].PenaltyWarning = 0 - end - - if not self.Players[PlayerName].UnitCoalition then - self.Players[PlayerName].UnitCoalition = UnitCoalition - else - if self.Players[PlayerName].UnitCoalition ~= UnitCoalition then - self.Players[PlayerName].Penalty = self.Players[PlayerName].Penalty + 50 - self.Players[PlayerName].PenaltyCoalition = self.Players[PlayerName].PenaltyCoalition + 1 - MESSAGE:New( "Player '" .. PlayerName .. "' changed coalition from " .. _SCORINGCoalition[self.Players[PlayerName].UnitCoalition] .. " to " .. _SCORINGCoalition[UnitCoalition] .. - "(changed " .. self.Players[PlayerName].PenaltyCoalition .. " times the coalition). 50 Penalty points added.", - "", - 2, - "/PENALTYCOALITION" .. PlayerName - ):ToAll() - self:ScoreCSV( PlayerName, "COALITION_PENALTY", 1, -50, self.Players[PlayerName].UnitName, _SCORINGCoalition[self.Players[PlayerName].UnitCoalition], _SCORINGCategory[self.Players[PlayerName].UnitCategory], self.Players[PlayerName].UnitType, - UnitName, _SCORINGCoalition[UnitCoalition], _SCORINGCategory[UnitCategory], UnitData:getTypeName() ) - end - end - self.Players[PlayerName].UnitName = UnitName - self.Players[PlayerName].UnitCoalition = UnitCoalition - self.Players[PlayerName].UnitCategory = UnitCategory - self.Players[PlayerName].UnitType = UnitTypeName - - if self.Players[PlayerName].Penalty > 100 then - if self.Players[PlayerName].PenaltyWarning < 1 then - MESSAGE:New( "Player '" .. PlayerName .. "': WARNING! If you continue to commit FRATRICIDE and have a PENALTY score higher than 150, you will be COURT MARTIALED and DISMISSED from this mission! \nYour total penalty is: " .. self.Players[PlayerName].Penalty, - "", - 30, - "/PENALTYCOALITION" .. PlayerName - ):ToAll() - self.Players[PlayerName].PenaltyWarning = self.Players[PlayerName].PenaltyWarning + 1 - end - end - - if self.Players[PlayerName].Penalty > 150 then - ClientGroup = GROUP:NewFromDCSUnit( UnitData ) - ClientGroup:Destroy() - MESSAGE:New( "Player '" .. PlayerName .. "' committed FRATRICIDE, he will be COURT MARTIALED and is DISMISSED from this mission!", - "", - 10, - "/PENALTYCOALITION" .. PlayerName - ):ToAll() - end - - end -end - - ---- Registers Scores the players completing a Mission Task. -function SCORING:_AddMissionTaskScore( PlayerUnit, MissionName, Score ) - self:F( { PlayerUnit, MissionName, Score } ) - - local PlayerName = PlayerUnit:getPlayerName() - - if not self.Players[PlayerName].Mission[MissionName] then - self.Players[PlayerName].Mission[MissionName] = {} - self.Players[PlayerName].Mission[MissionName].ScoreTask = 0 - self.Players[PlayerName].Mission[MissionName].ScoreMission = 0 - end - - self:T( PlayerName ) - self:T( self.Players[PlayerName].Mission[MissionName] ) - - self.Players[PlayerName].Score = self.Players[PlayerName].Score + Score - self.Players[PlayerName].Mission[MissionName].ScoreTask = self.Players[PlayerName].Mission[MissionName].ScoreTask + Score - - MESSAGE:New( "Player '" .. PlayerName .. "' has finished another Task in Mission '" .. MissionName .. "'. " .. - Score .. " Score points added.", - "", 20, "/SCORETASK" .. PlayerName ):ToAll() - - self:ScoreCSV( PlayerName, "TASK_" .. MissionName:gsub( ' ', '_' ), 1, Score, PlayerUnit:getName() ) -end - - ---- Registers Mission Scores for possible multiple players that contributed in the Mission. -function SCORING:_AddMissionScore( MissionName, Score ) - self:F( { MissionName, Score } ) - - for PlayerName, PlayerData in pairs( self.Players ) do - - if PlayerData.Mission[MissionName] then - PlayerData.Score = PlayerData.Score + Score - PlayerData.Mission[MissionName].ScoreMission = PlayerData.Mission[MissionName].ScoreMission + Score - MESSAGE:New( "Player '" .. PlayerName .. "' has finished Mission '" .. MissionName .. "'. " .. - Score .. " Score points added.", - "", 20, "/SCOREMISSION" .. PlayerName ):ToAll() - self:ScoreCSV( PlayerName, "MISSION_" .. MissionName:gsub( ' ', '_' ), 1, Score ) - end - end -end - ---- Handles the OnHit event for the scoring. --- @param #SCORING self --- @param Event#EVENTDATA Event -function SCORING:_EventOnHit( Event ) - self:F( { Event } ) - - local InitUnit = nil - local InitUnitName = "" - local InitGroup = nil - local InitGroupName = "" - local InitPlayerName = nil - - local InitCoalition = nil - local InitCategory = nil - local InitType = nil - local InitUnitCoalition = nil - local InitUnitCategory = nil - local InitUnitType = nil - - local TargetUnit = nil - local TargetUnitName = "" - local TargetGroup = nil - local TargetGroupName = "" - local TargetPlayerName = "" - - local TargetCoalition = nil - local TargetCategory = nil - local TargetType = nil - local TargetUnitCoalition = nil - local TargetUnitCategory = nil - local TargetUnitType = nil - - if Event.IniDCSUnit then - - InitUnit = Event.IniDCSUnit - InitUnitName = Event.IniDCSUnitName - InitGroup = Event.IniDCSGroup - InitGroupName = Event.IniDCSGroupName - InitPlayerName = InitUnit:getPlayerName() - - InitCoalition = InitUnit:getCoalition() - --TODO: Workaround Client DCS Bug - --InitCategory = InitUnit:getCategory() - InitCategory = InitUnit:getDesc().category - InitType = InitUnit:getTypeName() - - InitUnitCoalition = _SCORINGCoalition[InitCoalition] - InitUnitCategory = _SCORINGCategory[InitCategory] - InitUnitType = InitType - - self:T( { InitUnitName, InitGroupName, InitPlayerName, InitCoalition, InitCategory, InitType , InitUnitCoalition, InitUnitCategory, InitUnitType } ) - end - - - if Event.TgtDCSUnit then - - TargetUnit = Event.TgtDCSUnit - TargetUnitName = Event.TgtDCSUnitName - TargetGroup = Event.TgtDCSGroup - TargetGroupName = Event.TgtDCSGroupName - TargetPlayerName = TargetUnit:getPlayerName() - - TargetCoalition = TargetUnit:getCoalition() - --TODO: Workaround Client DCS Bug - --TargetCategory = TargetUnit:getCategory() - TargetCategory = TargetUnit:getDesc().category - TargetType = TargetUnit:getTypeName() - - TargetUnitCoalition = _SCORINGCoalition[TargetCoalition] - TargetUnitCategory = _SCORINGCategory[TargetCategory] - TargetUnitType = TargetType - - self:T( { TargetUnitName, TargetGroupName, TargetPlayerName, TargetCoalition, TargetCategory, TargetType, TargetUnitCoalition, TargetUnitCategory, TargetUnitType } ) - end - - if InitPlayerName ~= nil then -- It is a player that is hitting something - self:_AddPlayerFromUnit( InitUnit ) - if self.Players[InitPlayerName] then -- This should normally not happen, but i'll test it anyway. - if TargetPlayerName ~= nil then -- It is a player hitting another player ... - self:_AddPlayerFromUnit( TargetUnit ) - self.Players[InitPlayerName].HitPlayers = self.Players[InitPlayerName].HitPlayers + 1 - end - - self:T( "Hitting Something" ) - -- What is he hitting? - if TargetCategory then - if not self.Players[InitPlayerName].Hit[TargetCategory] then - self.Players[InitPlayerName].Hit[TargetCategory] = {} - end - if not self.Players[InitPlayerName].Hit[TargetCategory][TargetUnitName] then - self.Players[InitPlayerName].Hit[TargetCategory][TargetUnitName] = {} - self.Players[InitPlayerName].Hit[TargetCategory][TargetUnitName].Score = 0 - self.Players[InitPlayerName].Hit[TargetCategory][TargetUnitName].Penalty = 0 - self.Players[InitPlayerName].Hit[TargetCategory][TargetUnitName].ScoreHit = 0 - self.Players[InitPlayerName].Hit[TargetCategory][TargetUnitName].PenaltyHit = 0 - end - local Score = 0 - if InitCoalition == TargetCoalition then - self.Players[InitPlayerName].Penalty = self.Players[InitPlayerName].Penalty + 10 - self.Players[InitPlayerName].Hit[TargetCategory][TargetUnitName].Penalty = self.Players[InitPlayerName].Hit[TargetCategory][TargetUnitName].Penalty + 10 - self.Players[InitPlayerName].Hit[TargetCategory][TargetUnitName].PenaltyHit = self.Players[InitPlayerName].Hit[TargetCategory][TargetUnitName].PenaltyHit + 1 - MESSAGE:New( "Player '" .. InitPlayerName .. "' hit a friendly " .. TargetUnitCategory .. " ( " .. TargetType .. " ) " .. - self.Players[InitPlayerName].Hit[TargetCategory][TargetUnitName].PenaltyHit .. " times. Penalty: -" .. self.Players[InitPlayerName].Hit[TargetCategory][TargetUnitName].Penalty .. - ". Score Total:" .. self.Players[InitPlayerName].Score - self.Players[InitPlayerName].Penalty, - "", - 2, - "/PENALTY" .. InitPlayerName .. "/" .. InitUnitName - ):ToAll() - self:ScoreCSV( InitPlayerName, "HIT_PENALTY", 1, -25, InitUnitName, InitUnitCoalition, InitUnitCategory, InitUnitType, TargetUnitName, TargetUnitCoalition, TargetUnitCategory, TargetUnitType ) - else - self.Players[InitPlayerName].Score = self.Players[InitPlayerName].Score + 10 - self.Players[InitPlayerName].Hit[TargetCategory][TargetUnitName].Score = self.Players[InitPlayerName].Hit[TargetCategory][TargetUnitName].Score + 1 - self.Players[InitPlayerName].Hit[TargetCategory][TargetUnitName].ScoreHit = self.Players[InitPlayerName].Hit[TargetCategory][TargetUnitName].ScoreHit + 1 - MESSAGE:New( "Player '" .. InitPlayerName .. "' hit a target " .. TargetUnitCategory .. " ( " .. TargetType .. " ) " .. - self.Players[InitPlayerName].Hit[TargetCategory][TargetUnitName].ScoreHit .. " times. Score: " .. self.Players[InitPlayerName].Hit[TargetCategory][TargetUnitName].Score .. - ". Score Total:" .. self.Players[InitPlayerName].Score - self.Players[InitPlayerName].Penalty, - "", - 2, - "/SCORE" .. InitPlayerName .. "/" .. InitUnitName - ):ToAll() - self:ScoreCSV( InitPlayerName, "HIT_SCORE", 1, 1, InitUnitName, InitUnitCoalition, InitUnitCategory, InitUnitType, TargetUnitName, TargetUnitCoalition, TargetUnitCategory, TargetUnitType ) - end - end - end - elseif InitPlayerName == nil then -- It is an AI hitting a player??? - - end -end - - -function SCORING:ReportScoreAll() - - env.info( "Hello World " ) - - local ScoreMessage = "" - local PlayerMessage = "" - - self:T( "Score Report" ) - - for PlayerName, PlayerData in pairs( self.Players ) do - if PlayerData then -- This should normally not happen, but i'll test it anyway. - self:T( "Score Player: " .. PlayerName ) - - -- Some variables - local InitUnitCoalition = _SCORINGCoalition[PlayerData.UnitCoalition] - local InitUnitCategory = _SCORINGCategory[PlayerData.UnitCategory] - local InitUnitType = PlayerData.UnitType - local InitUnitName = PlayerData.UnitName - - local PlayerScore = 0 - local PlayerPenalty = 0 - - ScoreMessage = ":\n" - - local ScoreMessageHits = "" - - for CategoryID, CategoryName in pairs( _SCORINGCategory ) do - self:T( CategoryName ) - if PlayerData.Hit[CategoryID] then - local Score = 0 - local ScoreHit = 0 - local Penalty = 0 - local PenaltyHit = 0 - self:T( "Hit scores exist for player " .. PlayerName ) - for UnitName, UnitData in pairs( PlayerData.Hit[CategoryID] ) do - Score = Score + UnitData.Score - ScoreHit = ScoreHit + UnitData.ScoreHit - Penalty = Penalty + UnitData.Penalty - PenaltyHit = UnitData.PenaltyHit - end - local ScoreMessageHit = string.format( "%s:%d ", CategoryName, Score - Penalty ) - self:T( ScoreMessageHit ) - ScoreMessageHits = ScoreMessageHits .. ScoreMessageHit - PlayerScore = PlayerScore + Score - PlayerPenalty = PlayerPenalty + Penalty - else - --ScoreMessageHits = ScoreMessageHits .. string.format( "%s:%d ", string.format(CategoryName, 1, 1), 0 ) - end - end - if ScoreMessageHits ~= "" then - ScoreMessage = ScoreMessage .. " Hits: " .. ScoreMessageHits .. "\n" - end - - local ScoreMessageKills = "" - for CategoryID, CategoryName in pairs( _SCORINGCategory ) do - self:T( "Kill scores exist for player " .. PlayerName ) - if PlayerData.Kill[CategoryID] then - local Score = 0 - local ScoreKill = 0 - local Penalty = 0 - local PenaltyKill = 0 - - for UnitName, UnitData in pairs( PlayerData.Kill[CategoryID] ) do - Score = Score + UnitData.Score - ScoreKill = ScoreKill + UnitData.ScoreKill - Penalty = Penalty + UnitData.Penalty - PenaltyKill = PenaltyKill + UnitData.PenaltyKill - end - - local ScoreMessageKill = string.format( " %s:%d ", CategoryName, Score - Penalty ) - self:T( ScoreMessageKill ) - ScoreMessageKills = ScoreMessageKills .. ScoreMessageKill - - PlayerScore = PlayerScore + Score - PlayerPenalty = PlayerPenalty + Penalty - else - --ScoreMessageKills = ScoreMessageKills .. string.format( "%s:%d ", string.format(CategoryName, 1, 1), 0 ) - end - end - if ScoreMessageKills ~= "" then - ScoreMessage = ScoreMessage .. " Kills: " .. ScoreMessageKills .. "\n" - end - - local ScoreMessageCoalitionChangePenalties = "" - if PlayerData.PenaltyCoalition ~= 0 then - ScoreMessageCoalitionChangePenalties = ScoreMessageCoalitionChangePenalties .. string.format( " -%d (%d changed)", PlayerData.Penalty, PlayerData.PenaltyCoalition ) - PlayerPenalty = PlayerPenalty + PlayerData.Penalty - end - if ScoreMessageCoalitionChangePenalties ~= "" then - ScoreMessage = ScoreMessage .. " Coalition Penalties: " .. ScoreMessageCoalitionChangePenalties .. "\n" - end - - local ScoreMessageMission = "" - local ScoreMission = 0 - local ScoreTask = 0 - for MissionName, MissionData in pairs( PlayerData.Mission ) do - ScoreMission = ScoreMission + MissionData.ScoreMission - ScoreTask = ScoreTask + MissionData.ScoreTask - ScoreMessageMission = ScoreMessageMission .. "'" .. MissionName .. "'; " - end - PlayerScore = PlayerScore + ScoreMission + ScoreTask - - if ScoreMessageMission ~= "" then - ScoreMessage = ScoreMessage .. " Tasks: " .. ScoreTask .. " Mission: " .. ScoreMission .. " ( " .. ScoreMessageMission .. ")\n" - end - - PlayerMessage = PlayerMessage .. string.format( "Player '%s' Score:%d (%d Score -%d Penalties)%s", PlayerName, PlayerScore - PlayerPenalty, PlayerScore, PlayerPenalty, ScoreMessage ) - end - end - MESSAGE:New( PlayerMessage, "Player Scores", 30, "AllPlayerScores"):ToAll() -end - - -function SCORING:ReportScorePlayer() - - env.info( "Hello World " ) - - local ScoreMessage = "" - local PlayerMessage = "" - - self:T( "Score Report" ) - - for PlayerName, PlayerData in pairs( self.Players ) do - if PlayerData then -- This should normally not happen, but i'll test it anyway. - self:T( "Score Player: " .. PlayerName ) - - -- Some variables - local InitUnitCoalition = _SCORINGCoalition[PlayerData.UnitCoalition] - local InitUnitCategory = _SCORINGCategory[PlayerData.UnitCategory] - local InitUnitType = PlayerData.UnitType - local InitUnitName = PlayerData.UnitName - - local PlayerScore = 0 - local PlayerPenalty = 0 - - ScoreMessage = "" - - local ScoreMessageHits = "" - - for CategoryID, CategoryName in pairs( _SCORINGCategory ) do - self:T( CategoryName ) - if PlayerData.Hit[CategoryID] then - local Score = 0 - local ScoreHit = 0 - local Penalty = 0 - local PenaltyHit = 0 - self:T( "Hit scores exist for player " .. PlayerName ) - for UnitName, UnitData in pairs( PlayerData.Hit[CategoryID] ) do - Score = Score + UnitData.Score - ScoreHit = ScoreHit + UnitData.ScoreHit - Penalty = Penalty + UnitData.Penalty - PenaltyHit = UnitData.PenaltyHit - end - local ScoreMessageHit = string.format( "\n %s = %d score(%d;-%d) hits(#%d;#-%d)", CategoryName, Score - Penalty, Score, Penalty, ScoreHit, PenaltyHit ) - self:T( ScoreMessageHit ) - ScoreMessageHits = ScoreMessageHits .. ScoreMessageHit - PlayerScore = PlayerScore + Score - PlayerPenalty = PlayerPenalty + Penalty - else - --ScoreMessageHits = ScoreMessageHits .. string.format( "%s:%d ", string.format(CategoryName, 1, 1), 0 ) - end - end - if ScoreMessageHits ~= "" then - ScoreMessage = ScoreMessage .. "\n Hits: " .. ScoreMessageHits .. " " - end - - local ScoreMessageKills = "" - for CategoryID, CategoryName in pairs( _SCORINGCategory ) do - self:T( "Kill scores exist for player " .. PlayerName ) - if PlayerData.Kill[CategoryID] then - local Score = 0 - local ScoreKill = 0 - local Penalty = 0 - local PenaltyKill = 0 - - for UnitName, UnitData in pairs( PlayerData.Kill[CategoryID] ) do - Score = Score + UnitData.Score - ScoreKill = ScoreKill + UnitData.ScoreKill - Penalty = Penalty + UnitData.Penalty - PenaltyKill = PenaltyKill + UnitData.PenaltyKill - end - - local ScoreMessageKill = string.format( "\n %s = %d score(%d;-%d) hits(#%d;#-%d)", CategoryName, Score - Penalty, Score, Penalty, ScoreKill, PenaltyKill ) - self:T( ScoreMessageKill ) - ScoreMessageKills = ScoreMessageKills .. ScoreMessageKill - - PlayerScore = PlayerScore + Score - PlayerPenalty = PlayerPenalty + Penalty - else - --ScoreMessageKills = ScoreMessageKills .. string.format( "%s:%d ", string.format(CategoryName, 1, 1), 0 ) - end - end - if ScoreMessageKills ~= "" then - ScoreMessage = ScoreMessage .. "\n Kills: " .. ScoreMessageKills .. " " - end - - local ScoreMessageCoalitionChangePenalties = "" - if PlayerData.PenaltyCoalition ~= 0 then - ScoreMessageCoalitionChangePenalties = ScoreMessageCoalitionChangePenalties .. string.format( " -%d (%d changed)", PlayerData.Penalty, PlayerData.PenaltyCoalition ) - PlayerPenalty = PlayerPenalty + PlayerData.Penalty - end - if ScoreMessageCoalitionChangePenalties ~= "" then - ScoreMessage = ScoreMessage .. "\n Coalition: " .. ScoreMessageCoalitionChangePenalties .. " " - end - - local ScoreMessageMission = "" - local ScoreMission = 0 - local ScoreTask = 0 - for MissionName, MissionData in pairs( PlayerData.Mission ) do - ScoreMission = ScoreMission + MissionData.ScoreMission - ScoreTask = ScoreTask + MissionData.ScoreTask - ScoreMessageMission = ScoreMessageMission .. "'" .. MissionName .. "'; " - end - PlayerScore = PlayerScore + ScoreMission + ScoreTask - - if ScoreMessageMission ~= "" then - ScoreMessage = ScoreMessage .. "\n Tasks: " .. ScoreTask .. " Mission: " .. ScoreMission .. " ( " .. ScoreMessageMission .. ") " - end - - PlayerMessage = PlayerMessage .. string.format( "Player '%s' Score = %d ( %d Score, -%d Penalties ):%s", PlayerName, PlayerScore - PlayerPenalty, PlayerScore, PlayerPenalty, ScoreMessage ) - end - end - MESSAGE:New( PlayerMessage, "Player Scores", 30, "AllPlayerScores"):ToAll() - -end - - -function SCORING:SecondsToClock(sSeconds) - local nSeconds = sSeconds - if nSeconds == 0 then - --return nil; - return "00:00:00"; - else - nHours = string.format("%02.f", math.floor(nSeconds/3600)); - nMins = string.format("%02.f", math.floor(nSeconds/60 - (nHours*60))); - nSecs = string.format("%02.f", math.floor(nSeconds - nHours*3600 - nMins *60)); - return nHours..":"..nMins..":"..nSecs - end -end - ---- Opens a score CSV file to log the scores. --- @param #SCORING self --- @param #string ScoringCSV --- @return #SCORING self --- @usage --- -- Open a new CSV file to log the scores of the game Gori Valley. Let the name of the CSV file begin with "Player Scores". --- ScoringObject = SCORING:New( "Gori Valley" ) --- ScoringObject:OpenCSV( "Player Scores" ) -function SCORING:OpenCSV( ScoringCSV ) - self:F( ScoringCSV ) - - if lfs and io and os then - if ScoringCSV then - self.ScoringCSV = ScoringCSV - local fdir = lfs.writedir() .. [[Logs\]] .. self.ScoringCSV .. " " .. os.date( "%Y-%m-%d %H-%M-%S" ) .. ".csv" - - self.CSVFile, self.err = io.open( fdir, "w+" ) - if not self.CSVFile then - error( "Error: Cannot open CSV file in " .. lfs.writedir() ) - end - - self.CSVFile:write( '"GameName","RunTime","Time","PlayerName","ScoreType","PlayerUnitCoaltion","PlayerUnitCategory","PlayerUnitType","PlayerUnitName","TargetUnitCoalition","TargetUnitCategory","TargetUnitType","TargetUnitName","Times","Score"\n' ) - - self.RunTime = os.date("%y-%m-%d_%H-%M-%S") - else - error( "A string containing the CSV file name must be given." ) - end - else - self:E( "The MissionScripting.lua file has not been changed to allow lfs, io and os modules to be used..." ) - end - return self -end - - ---- Registers a score for a player. --- @param #SCORING self --- @param #string PlayerName The name of the player. --- @param #string ScoreType The type of the score. --- @param #string ScoreTimes The amount of scores achieved. --- @param #string ScoreAmount The score given. --- @param #string PlayerUnitName The unit name of the player. --- @param #string PlayerUnitCoalition The coalition of the player unit. --- @param #string PlayerUnitCategory The category of the player unit. --- @param #string PlayerUnitType The type of the player unit. --- @param #string TargetUnitName The name of the target unit. --- @param #string TargetUnitCoalition The coalition of the target unit. --- @param #string TargetUnitCategory The category of the target unit. --- @param #string TargetUnitType The type of the target unit. --- @return #SCORING self -function SCORING:ScoreCSV( PlayerName, ScoreType, ScoreTimes, ScoreAmount, PlayerUnitName, PlayerUnitCoalition, PlayerUnitCategory, PlayerUnitType, TargetUnitName, TargetUnitCoalition, TargetUnitCategory, TargetUnitType ) - --write statistic information to file - local ScoreTime = self:SecondsToClock( timer.getTime() ) - PlayerName = PlayerName:gsub( '"', '_' ) - - if PlayerUnitName and PlayerUnitName ~= '' then - local PlayerUnit = Unit.getByName( PlayerUnitName ) - - if PlayerUnit then - if not PlayerUnitCategory then - --PlayerUnitCategory = SCORINGCategory[PlayerUnit:getCategory()] - PlayerUnitCategory = _SCORINGCategory[PlayerUnit:getDesc().category] - end - - if not PlayerUnitCoalition then - PlayerUnitCoalition = _SCORINGCoalition[PlayerUnit:getCoalition()] - end - - if not PlayerUnitType then - PlayerUnitType = PlayerUnit:getTypeName() - end - else - PlayerUnitName = '' - PlayerUnitCategory = '' - PlayerUnitCoalition = '' - PlayerUnitType = '' - end - else - PlayerUnitName = '' - PlayerUnitCategory = '' - PlayerUnitCoalition = '' - PlayerUnitType = '' - end - - if not TargetUnitCoalition then - TargetUnitCoalition = '' - end - - if not TargetUnitCategory then - TargetUnitCategory = '' - end - - if not TargetUnitType then - TargetUnitType = '' - end - - if not TargetUnitName then - TargetUnitName = '' - end - - if lfs and io and os then - self.CSVFile:write( - '"' .. self.GameName .. '"' .. ',' .. - '"' .. self.RunTime .. '"' .. ',' .. - '' .. ScoreTime .. '' .. ',' .. - '"' .. PlayerName .. '"' .. ',' .. - '"' .. ScoreType .. '"' .. ',' .. - '"' .. PlayerUnitCoalition .. '"' .. ',' .. - '"' .. PlayerUnitCategory .. '"' .. ',' .. - '"' .. PlayerUnitType .. '"' .. ',' .. - '"' .. PlayerUnitName .. '"' .. ',' .. - '"' .. TargetUnitCoalition .. '"' .. ',' .. - '"' .. TargetUnitCategory .. '"' .. ',' .. - '"' .. TargetUnitType .. '"' .. ',' .. - '"' .. TargetUnitName .. '"' .. ',' .. - '' .. ScoreTimes .. '' .. ',' .. - '' .. ScoreAmount - ) - - self.CSVFile:write( "\n" ) - end -end - - -function SCORING:CloseCSV() - if lfs and io and os then - self.CSVFile:close() - end -end - ---- CARGO Classes --- @module CARGO - -Include.File( "Routines" ) -Include.File( "Base" ) -Include.File( "Message" ) -Include.File( "Scheduler" ) - - ---- Clients are those Groups defined within the Mission Editor that have the skillset defined as "Client" or "Player". --- These clients are defined within the Mission Orchestration Framework (MOF) - -CARGOS = {} - - -CARGO_ZONE = { - ClassName="CARGO_ZONE", - CargoZoneName = '', - CargoHostUnitName = '', - SIGNAL = { - TYPE = { - SMOKE = { ID = 1, TEXT = "smoke" }, - FLARE = { ID = 2, TEXT = "flare" } - }, - COLOR = { - GREEN = { ID = 1, TRIGGERCOLOR = trigger.smokeColor.Green, TEXT = "A green" }, - RED = { ID = 2, TRIGGERCOLOR = trigger.smokeColor.Red, TEXT = "A red" }, - WHITE = { ID = 3, TRIGGERCOLOR = trigger.smokeColor.White, TEXT = "A white" }, - ORANGE = { ID = 4, TRIGGERCOLOR = trigger.smokeColor.Orange, TEXT = "An orange" }, - BLUE = { ID = 5, TRIGGERCOLOR = trigger.smokeColor.Blue, TEXT = "A blue" }, - YELLOW = { ID = 6, TRIGGERCOLOR = trigger.flareColor.Yellow, TEXT = "A yellow" } - } - } -} - ---- Creates a new zone where cargo can be collected or deployed. --- The zone functionality is useful to smoke or indicate routes for cargo pickups or deployments. --- Provide the zone name as declared in the mission file into the CargoZoneName in the :New method. --- An optional parameter is the CargoHostName, which is a Group declared with Late Activation switched on in the mission file. --- The CargoHostName is the "host" of the cargo zone: --- --- * It will smoke the zone position when a client is approaching the zone. --- * Depending on the cargo type, it will assist in the delivery of the cargo by driving to and from the client. --- --- @param #CARGO_ZONE self --- @param #string CargoZoneName The name of the zone as declared within the mission editor. --- @param #string CargoHostName The name of the Group "hosting" the zone. The Group MUST NOT be a static, and must be a "mobile" unit. -function CARGO_ZONE:New( CargoZoneName, CargoHostName ) local self = BASE:Inherit( self, ZONE:New( CargoZoneName ) ) - self:F( { CargoZoneName, CargoHostName } ) - - self.CargoZoneName = CargoZoneName - self.SignalHeight = 2 - --self.CargoZone = trigger.misc.getZone( CargoZoneName ) - - - if CargoHostName then - self.CargoHostName = CargoHostName - end - - self:T( self.CargoZoneName ) - - return self -end - -function CARGO_ZONE:Spawn() - self:F( self.CargoHostName ) - - if self.CargoHostName then -- Only spawn a host in the zone when there is one given as a parameter in the New function. - if self.CargoHostSpawn then - local CargoHostGroup = self.CargoHostSpawn:GetGroupFromIndex() - if CargoHostGroup and CargoHostGroup:IsAlive() then - else - self.CargoHostSpawn:ReSpawn( 1 ) - end - else - self:T( "Initialize CargoHostSpawn" ) - self.CargoHostSpawn = SPAWN:New( self.CargoHostName ):Limit( 1, 1 ) - self.CargoHostSpawn:ReSpawn( 1 ) - end - end - - return self -end - -function CARGO_ZONE:GetHostUnit() - self:F( self ) - - if self.CargoHostName then - - -- A Host has been given, signal the host - local CargoHostGroup = self.CargoHostSpawn:GetGroupFromIndex() - local CargoHostUnit - if CargoHostGroup and CargoHostGroup:IsAlive() then - CargoHostUnit = CargoHostGroup:GetUnit(1) - else - CargoHostUnit = StaticObject.getByName( self.CargoHostName ) - end - - return CargoHostUnit - end - - return nil -end - -function CARGO_ZONE:ReportCargosToClient( Client, CargoType ) - self:F() - - local SignalUnit = self:GetHostUnit() - - if SignalUnit then - - local SignalUnitTypeName = SignalUnit:getTypeName() - - local HostMessage = "" - - local IsCargo = false - for CargoID, Cargo in pairs( CARGOS ) do - if Cargo.CargoType == Task.CargoType then - if Cargo:IsStatusNone() then - HostMessage = HostMessage .. " - " .. Cargo.CargoName .. " - " .. Cargo.CargoType .. " (" .. Cargo.Weight .. "kg)" .. "\n" - IsCargo = true - end - end - end - - if not IsCargo then - HostMessage = "No Cargo Available." - end - - Client:Message( HostMessage, 20, Mission.Name .. "/StageHosts." .. SignalUnitTypeName, SignalUnitTypeName .. ": Reporting Cargo", 10 ) - end -end - - -function CARGO_ZONE:Signal() - self:F() - - local Signalled = false - - if self.SignalType then - - if self.CargoHostName then - - -- A Host has been given, signal the host - - local SignalUnit = self:GetHostUnit() - - if SignalUnit then - - self:T( 'Signalling Unit' ) - local SignalVehiclePos = SignalUnit:GetPointVec3() - SignalVehiclePos.y = SignalVehiclePos.y + 2 - - if self.SignalType.ID == CARGO_ZONE.SIGNAL.TYPE.SMOKE.ID then - - trigger.action.smoke( SignalVehiclePos, self.SignalColor.TRIGGERCOLOR ) - Signalled = true - - elseif self.SignalType.ID == CARGO_ZONE.SIGNAL.TYPE.FLARE.ID then - - trigger.action.signalFlare( SignalVehiclePos, self.SignalColor.TRIGGERCOLOR , 0 ) - Signalled = false - - end - end - - else - - local ZonePointVec3 = self:GetPointVec3( self.SignalHeight ) -- Get the zone position + the landheight + 2 meters - - if self.SignalType.ID == CARGO_ZONE.SIGNAL.TYPE.SMOKE.ID then - - trigger.action.smoke( ZonePointVec3, self.SignalColor.TRIGGERCOLOR ) - Signalled = true - - elseif self.SignalType.ID == CARGO_ZONE.SIGNAL.TYPE.FLARE.ID then - trigger.action.signalFlare( ZonePointVec3, self.SignalColor.TRIGGERCOLOR, 0 ) - Signalled = false - - end - end - end - - return Signalled - -end - -function CARGO_ZONE:WhiteSmoke( SignalHeight ) - self:F() - - self.SignalType = CARGO_ZONE.SIGNAL.TYPE.SMOKE - self.SignalColor = CARGO_ZONE.SIGNAL.COLOR.WHITE - - if SignalHeight then - self.SignalHeight = SignalHeight - end - - return self -end - -function CARGO_ZONE:BlueSmoke( SignalHeight ) - self:F() - - self.SignalType = CARGO_ZONE.SIGNAL.TYPE.SMOKE - self.SignalColor = CARGO_ZONE.SIGNAL.COLOR.BLUE - - if SignalHeight then - self.SignalHeight = SignalHeight - end - - return self -end - -function CARGO_ZONE:RedSmoke( SignalHeight ) - self:F() - - self.SignalType = CARGO_ZONE.SIGNAL.TYPE.SMOKE - self.SignalColor = CARGO_ZONE.SIGNAL.COLOR.RED - - if SignalHeight then - self.SignalHeight = SignalHeight - end - - return self -end - -function CARGO_ZONE:OrangeSmoke( SignalHeight ) - self:F() - - self.SignalType = CARGO_ZONE.SIGNAL.TYPE.SMOKE - self.SignalColor = CARGO_ZONE.SIGNAL.COLOR.ORANGE - - if SignalHeight then - self.SignalHeight = SignalHeight - end - - return self -end - -function CARGO_ZONE:GreenSmoke( SignalHeight ) - self:F() - - self.SignalType = CARGO_ZONE.SIGNAL.TYPE.SMOKE - self.SignalColor = CARGO_ZONE.SIGNAL.COLOR.GREEN - - if SignalHeight then - self.SignalHeight = SignalHeight - end - - return self -end - - -function CARGO_ZONE:WhiteFlare( SignalHeight ) - self:F() - - self.SignalType = CARGO_ZONE.SIGNAL.TYPE.FLARE - self.SignalColor = CARGO_ZONE.SIGNAL.COLOR.WHITE - - if SignalHeight then - self.SignalHeight = SignalHeight - end - - return self -end - -function CARGO_ZONE:RedFlare( SignalHeight ) - self:F() - - self.SignalType = CARGO_ZONE.SIGNAL.TYPE.FLARE - self.SignalColor = CARGO_ZONE.SIGNAL.COLOR.RED - - if SignalHeight then - self.SignalHeight = SignalHeight - end - - return self -end - -function CARGO_ZONE:GreenFlare( SignalHeight ) - self:F() - - self.SignalType = CARGO_ZONE.SIGNAL.TYPE.FLARE - self.SignalColor = CARGO_ZONE.SIGNAL.COLOR.GREEN - - if SignalHeight then - self.SignalHeight = SignalHeight - end - - return self -end - -function CARGO_ZONE:YellowFlare( SignalHeight ) - self:F() - - self.SignalType = CARGO_ZONE.SIGNAL.TYPE.FLARE - self.SignalColor = CARGO_ZONE.SIGNAL.COLOR.YELLOW - - if SignalHeight then - self.SignalHeight = SignalHeight - end - - return self -end - - -function CARGO_ZONE:GetCargoHostUnit() - self:F( self ) - - if self.CargoHostSpawn then - local CargoHostGroup = self.CargoHostSpawn:GetGroupFromIndex(1) - if CargoHostGroup and CargoHostGroup:IsAlive() then - local CargoHostUnit = CargoHostGroup:GetUnit(1) - if CargoHostUnit and CargoHostUnit:IsAlive() then - return CargoHostUnit - end - end - end - - return nil -end - -function CARGO_ZONE:GetCargoZoneName() - self:F() - - return self.CargoZoneName -end - -CARGO = { - ClassName = "CARGO", - STATUS = { - NONE = 0, - LOADED = 1, - UNLOADED = 2, - LOADING = 3 - }, - CargoClient = nil -} - ---- Add Cargo to the mission... Cargo functionality needs to be reworked a bit, so this is still under construction. I need to make a CARGO Class... -function CARGO:New( CargoType, CargoName, CargoWeight ) local self = BASE:Inherit( self, BASE:New() ) - self:F( { CargoType, CargoName, CargoWeight } ) - - - self.CargoType = CargoType - self.CargoName = CargoName - self.CargoWeight = CargoWeight - - self:StatusNone() - - return self -end - -function CARGO:Spawn( Client ) - self:F() - - return self - -end - -function CARGO:IsNear( Client, LandingZone ) - self:F() - - local Near = true - - return Near - -end - - -function CARGO:IsLoadingToClient() - self:F() - - if self:IsStatusLoading() then - return self.CargoClient - end - - return nil - -end - - -function CARGO:IsLoadedInClient() - self:F() - - if self:IsStatusLoaded() then - return self.CargoClient - end - - return nil - -end - - -function CARGO:UnLoad( Client, TargetZoneName ) - self:F() - - self:StatusUnLoaded() - - return self -end - -function CARGO:OnBoard( Client, LandingZone ) - self:F() - - local Valid = true - - self.CargoClient = Client - local ClientUnit = Client:GetClientGroupDCSUnit() - - return Valid -end - -function CARGO:OnBoarded( Client, LandingZone ) - self:F() - - local OnBoarded = true - - return OnBoarded -end - -function CARGO:Load( Client ) - self:F() - - self:StatusLoaded( Client ) - - return self -end - -function CARGO:IsLandingRequired() - self:F() - return true -end - -function CARGO:IsSlingLoad() - self:F() - return false -end - - -function CARGO:StatusNone() - self:F() - - self.CargoClient = nil - self.CargoStatus = CARGO.STATUS.NONE - - return self -end - -function CARGO:StatusLoading( Client ) - self:F() - - self.CargoClient = Client - self.CargoStatus = CARGO.STATUS.LOADING - self:T( "Cargo " .. self.CargoName .. " loading to Client: " .. self.CargoClient:GetClientGroupName() ) - - return self -end - -function CARGO:StatusLoaded( Client ) - self:F() - - self.CargoClient = Client - self.CargoStatus = CARGO.STATUS.LOADED - self:T( "Cargo " .. self.CargoName .. " loaded in Client: " .. self.CargoClient:GetClientGroupName() ) - - return self -end - -function CARGO:StatusUnLoaded() - self:F() - - self.CargoClient = nil - self.CargoStatus = CARGO.STATUS.UNLOADED - - return self -end - - -function CARGO:IsStatusNone() - self:F() - - return self.CargoStatus == CARGO.STATUS.NONE -end - -function CARGO:IsStatusLoading() - self:F() - - return self.CargoStatus == CARGO.STATUS.LOADING -end - -function CARGO:IsStatusLoaded() - self:F() - - return self.CargoStatus == CARGO.STATUS.LOADED -end - -function CARGO:IsStatusUnLoaded() - self:F() - - return self.CargoStatus == CARGO.STATUS.UNLOADED -end - - -CARGO_GROUP = { - ClassName = "CARGO_GROUP" -} - - -function CARGO_GROUP:New( CargoType, CargoName, CargoWeight, CargoGroupTemplate, CargoZone ) local self = BASE:Inherit( self, CARGO:New( CargoType, CargoName, CargoWeight ) ) - self:F( { CargoType, CargoName, CargoWeight, CargoGroupTemplate, CargoZone } ) - - self.CargoSpawn = SPAWN:NewWithAlias( CargoGroupTemplate, CargoName ) - self.CargoZone = CargoZone - - CARGOS[self.CargoName] = self - - return self - -end - -function CARGO_GROUP:Spawn( Client ) - self:F( { Client } ) - - local SpawnCargo = true - - if self:IsStatusNone() then - local CargoGroup = Group.getByName( self.CargoName ) - if CargoGroup and CargoGroup:isExist() then - SpawnCargo = false - end - - elseif self:IsStatusLoading() then - - local Client = self:IsLoadingToClient() - if Client and Client:GetDCSGroup() then - SpawnCargo = false - else - local CargoGroup = Group.getByName( self.CargoName ) - if CargoGroup and CargoGroup:isExist() then - SpawnCargo = false - end - end - - elseif self:IsStatusLoaded() then - - local ClientLoaded = self:IsLoadedInClient() - -- Now test if another Client is alive (not this one), and it has the CARGO, then this cargo does not need to be initialized and spawned. - if ClientLoaded and ClientLoaded ~= Client then - local ClientGroup = Client:GetDCSGroup() - if ClientLoaded:GetClientGroupDCSUnit() and ClientLoaded:GetClientGroupDCSUnit():isExist() then - SpawnCargo = false - else - self:StatusNone() - end - else - -- Same Client, but now in initialize, so set back the status to None. - self:StatusNone() - end - - elseif self:IsStatusUnLoaded() then - - SpawnCargo = false - - end - - if SpawnCargo then - if self.CargoZone:GetCargoHostUnit() then - --- ReSpawn the Cargo from the CargoHost - self.CargoGroupName = self.CargoSpawn:SpawnFromUnit( self.CargoZone:GetCargoHostUnit(), 60, 30, 1 ):GetName() - else - --- ReSpawn the Cargo in the CargoZone without a host ... - self:T( self.CargoZone ) - self.CargoGroupName = self.CargoSpawn:SpawnInZone( self.CargoZone, true, 1 ):GetName() - end - self:StatusNone() - end - - self:T( { self.CargoGroupName, CARGOS[self.CargoName].CargoGroupName } ) - - return self -end - -function CARGO_GROUP:IsNear( Client, LandingZone ) - self:F() - - local Near = false - - if self.CargoGroupName then - local CargoGroup = Group.getByName( self.CargoGroupName ) - if routines.IsPartOfGroupInRadius( CargoGroup, Client:GetPositionVec3(), 250 ) then - Near = true - end - end - - return Near - -end - - -function CARGO_GROUP:OnBoard( Client, LandingZone, OnBoardSide ) - self:F() - - local Valid = true - - local ClientUnit = Client:GetClientGroupDCSUnit() - - local CarrierPos = ClientUnit:getPoint() - local CarrierPosMove = ClientUnit:getPoint() - local CarrierPosOnBoard = ClientUnit:getPoint() - - local CargoGroup = Group.getByName( self.CargoGroupName ) - - local CargoUnit = CargoGroup:getUnit(1) - local CargoPos = CargoUnit:getPoint() - - self.CargoInAir = CargoUnit:inAir() - - self:T( self.CargoInAir ) - - -- Only move the group to the carrier when the cargo is not in the air - -- (eg. cargo can be on a oil derrick, moving the cargo on the oil derrick will drop the cargo on the sea). - if not self.CargoInAir then - - local Points = {} - - self:T( 'CargoPos x = ' .. CargoPos.x .. " z = " .. CargoPos.z ) - self:T( 'CarrierPosMove x = ' .. CarrierPosMove.x .. " z = " .. CarrierPosMove.z ) - - Points[#Points+1] = routines.ground.buildWP( CargoPos, "Cone", 10 ) - - self:T( 'Points[1] x = ' .. Points[1].x .. " y = " .. Points[1].y ) - - if OnBoardSide == nil then - OnBoardSide = CLIENT.ONBOARDSIDE.NONE - end - - if OnBoardSide == CLIENT.ONBOARDSIDE.LEFT then - - self:T( "TransportCargoOnBoard: Onboarding LEFT" ) - CarrierPosMove.z = CarrierPosMove.z - 25 - CarrierPosOnBoard.z = CarrierPosOnBoard.z - 5 - Points[#Points+1] = routines.ground.buildWP( CarrierPosMove, "Cone", 10 ) - Points[#Points+1] = routines.ground.buildWP( CarrierPosOnBoard, "Cone", 10 ) - - elseif OnBoardSide == CLIENT.ONBOARDSIDE.RIGHT then - - self:T( "TransportCargoOnBoard: Onboarding RIGHT" ) - CarrierPosMove.z = CarrierPosMove.z + 25 - CarrierPosOnBoard.z = CarrierPosOnBoard.z + 5 - Points[#Points+1] = routines.ground.buildWP( CarrierPosMove, "Cone", 10 ) - Points[#Points+1] = routines.ground.buildWP( CarrierPosOnBoard, "Cone", 10 ) - - elseif OnBoardSide == CLIENT.ONBOARDSIDE.BACK then - - self:T( "TransportCargoOnBoard: Onboarding BACK" ) - CarrierPosMove.x = CarrierPosMove.x - 25 - CarrierPosOnBoard.x = CarrierPosOnBoard.x - 5 - Points[#Points+1] = routines.ground.buildWP( CarrierPosMove, "Cone", 10 ) - Points[#Points+1] = routines.ground.buildWP( CarrierPosOnBoard, "Cone", 10 ) - - elseif OnBoardSide == CLIENT.ONBOARDSIDE.FRONT then - - self:T( "TransportCargoOnBoard: Onboarding FRONT" ) - CarrierPosMove.x = CarrierPosMove.x + 25 - CarrierPosOnBoard.x = CarrierPosOnBoard.x + 5 - Points[#Points+1] = routines.ground.buildWP( CarrierPosMove, "Cone", 10 ) - Points[#Points+1] = routines.ground.buildWP( CarrierPosOnBoard, "Cone", 10 ) - - elseif OnBoardSide == CLIENT.ONBOARDSIDE.NONE then - - self:T( "TransportCargoOnBoard: Onboarding CENTRAL" ) - Points[#Points+1] = routines.ground.buildWP( CarrierPos, "Cone", 10 ) - - end - self:T( "TransportCargoOnBoard: Routing " .. self.CargoGroupName ) - - --routines.scheduleFunction( routines.goRoute, { self.CargoGroupName, Points}, timer.getTime() + 4 ) - SCHEDULER:New( self, routines.goRoute, { self.CargoGroupName, Points}, 4 ) - end - - self:StatusLoading( Client ) - - return Valid - -end - - -function CARGO_GROUP:OnBoarded( Client, LandingZone ) - self:F() - - local OnBoarded = false - - local CargoGroup = Group.getByName( self.CargoGroupName ) - - if not self.CargoInAir then - if routines.IsPartOfGroupInRadius( CargoGroup, Client:GetPositionVec3(), 25 ) then - CargoGroup:destroy() - self:StatusLoaded( Client ) - OnBoarded = true - end - else - CargoGroup:destroy() - self:StatusLoaded( Client ) - OnBoarded = true - end - - return OnBoarded -end - - -function CARGO_GROUP:UnLoad( Client, TargetZoneName ) - self:F() - - self:T( 'self.CargoName = ' .. self.CargoName ) - - local CargoGroup = self.CargoSpawn:SpawnFromUnit( Client:GetClientGroupUnit(), 60, 30 ) - - self.CargoGroupName = CargoGroup:GetName() - self:T( 'self.CargoGroupName = ' .. self.CargoGroupName ) - - CargoGroup:TaskRouteToZone( ZONE:New( TargetZoneName ), true ) - - self:StatusUnLoaded() - - return self -end - - -CARGO_PACKAGE = { - ClassName = "CARGO_PACKAGE" -} - - -function CARGO_PACKAGE:New( CargoType, CargoName, CargoWeight, CargoClient ) local self = BASE:Inherit( self, CARGO:New( CargoType, CargoName, CargoWeight ) ) - self:F( { CargoType, CargoName, CargoWeight, CargoClient } ) - - self.CargoClient = CargoClient - - CARGOS[self.CargoName] = self - - return self - -end - - -function CARGO_PACKAGE:Spawn( Client ) - self:F( { self, Client } ) - - -- this needs to be checked thoroughly - - local CargoClientGroup = self.CargoClient:GetDCSGroup() - if not CargoClientGroup then - if not self.CargoClientSpawn then - self.CargoClientSpawn = SPAWN:New( self.CargoClient:GetClientGroupName() ):Limit( 1, 1 ) - end - self.CargoClientSpawn:ReSpawn( 1 ) - end - - local SpawnCargo = true - - if self:IsStatusNone() then - - elseif self:IsStatusLoading() or self:IsStatusLoaded() then - - local CargoClientLoaded = self:IsLoadedInClient() - if CargoClientLoaded and CargoClientLoaded:GetDCSGroup() then - SpawnCargo = false - end - - elseif self:IsStatusUnLoaded() then - - SpawnCargo = false - - else - - end - - if SpawnCargo then - self:StatusLoaded( self.CargoClient ) - end - - return self -end - - -function CARGO_PACKAGE:IsNear( Client, LandingZone ) - self:F() - - local Near = false - - if self.CargoClient and self.CargoClient:GetDCSGroup() then - self:T( self.CargoClient.ClientName ) - self:T( 'Client Exists.' ) - - if routines.IsUnitInRadius( self.CargoClient:GetClientGroupDCSUnit(), Client:GetPositionVec3(), 150 ) then - Near = true - end - end - - return Near - -end - - -function CARGO_PACKAGE:OnBoard( Client, LandingZone, OnBoardSide ) - self:F() - - local Valid = true - - local ClientUnit = Client:GetClientGroupDCSUnit() - - local CarrierPos = ClientUnit:getPoint() - local CarrierPosMove = ClientUnit:getPoint() - local CarrierPosOnBoard = ClientUnit:getPoint() - local CarrierPosMoveAway = ClientUnit:getPoint() - - local CargoHostGroup = self.CargoClient:GetDCSGroup() - local CargoHostName = self.CargoClient:GetDCSGroup():getName() - - local CargoHostUnits = CargoHostGroup:getUnits() - local CargoPos = CargoHostUnits[1]:getPoint() - - local Points = {} - - self:T( 'CargoPos x = ' .. CargoPos.x .. " z = " .. CargoPos.z ) - self:T( 'CarrierPosMove x = ' .. CarrierPosMove.x .. " z = " .. CarrierPosMove.z ) - - Points[#Points+1] = routines.ground.buildWP( CargoPos, "Cone", 10 ) - - self:T( 'Points[1] x = ' .. Points[1].x .. " y = " .. Points[1].y ) - - if OnBoardSide == nil then - OnBoardSide = CLIENT.ONBOARDSIDE.NONE - end - - if OnBoardSide == CLIENT.ONBOARDSIDE.LEFT then - - self:T( "TransportCargoOnBoard: Onboarding LEFT" ) - CarrierPosMove.z = CarrierPosMove.z - 25 - CarrierPosOnBoard.z = CarrierPosOnBoard.z - 5 - CarrierPosMoveAway.z = CarrierPosMoveAway.z - 20 - Points[#Points+1] = routines.ground.buildWP( CarrierPosMove, "Cone", 10 ) - Points[#Points+1] = routines.ground.buildWP( CarrierPosOnBoard, "Cone", 10 ) - Points[#Points+1] = routines.ground.buildWP( CarrierPosMoveAway, "Cone", 10 ) - - elseif OnBoardSide == CLIENT.ONBOARDSIDE.RIGHT then - - self:T( "TransportCargoOnBoard: Onboarding RIGHT" ) - CarrierPosMove.z = CarrierPosMove.z + 25 - CarrierPosOnBoard.z = CarrierPosOnBoard.z + 5 - CarrierPosMoveAway.z = CarrierPosMoveAway.z + 20 - Points[#Points+1] = routines.ground.buildWP( CarrierPosMove, "Cone", 10 ) - Points[#Points+1] = routines.ground.buildWP( CarrierPosOnBoard, "Cone", 10 ) - Points[#Points+1] = routines.ground.buildWP( CarrierPosMoveAway, "Cone", 10 ) - - elseif OnBoardSide == CLIENT.ONBOARDSIDE.BACK then - - self:T( "TransportCargoOnBoard: Onboarding BACK" ) - CarrierPosMove.x = CarrierPosMove.x - 25 - CarrierPosOnBoard.x = CarrierPosOnBoard.x - 5 - CarrierPosMoveAway.x = CarrierPosMoveAway.x - 20 - Points[#Points+1] = routines.ground.buildWP( CarrierPosMove, "Cone", 10 ) - Points[#Points+1] = routines.ground.buildWP( CarrierPosOnBoard, "Cone", 10 ) - Points[#Points+1] = routines.ground.buildWP( CarrierPosMoveAway, "Cone", 10 ) - - elseif OnBoardSide == CLIENT.ONBOARDSIDE.FRONT then - - self:T( "TransportCargoOnBoard: Onboarding FRONT" ) - CarrierPosMove.x = CarrierPosMove.x + 25 - CarrierPosOnBoard.x = CarrierPosOnBoard.x + 5 - CarrierPosMoveAway.x = CarrierPosMoveAway.x + 20 - Points[#Points+1] = routines.ground.buildWP( CarrierPosMove, "Cone", 10 ) - Points[#Points+1] = routines.ground.buildWP( CarrierPosOnBoard, "Cone", 10 ) - Points[#Points+1] = routines.ground.buildWP( CarrierPosMoveAway, "Cone", 10 ) - - elseif OnBoardSide == CLIENT.ONBOARDSIDE.NONE then - - self:T( "TransportCargoOnBoard: Onboarding FRONT" ) - CarrierPosMove.x = CarrierPosMove.x + 25 - CarrierPosOnBoard.x = CarrierPosOnBoard.x + 5 - CarrierPosMoveAway.x = CarrierPosMoveAway.x + 20 - Points[#Points+1] = routines.ground.buildWP( CarrierPosMove, "Cone", 10 ) - Points[#Points+1] = routines.ground.buildWP( CarrierPosOnBoard, "Cone", 10 ) - Points[#Points+1] = routines.ground.buildWP( CarrierPosMoveAway, "Cone", 10 ) - - end - self:T( "Routing " .. CargoHostName ) - - --routines.scheduleFunction( routines.goRoute, { CargoHostName, Points}, timer.getTime() + 4 ) - SCHEDULER:New( self, routines.goRoute, { CargoHostName, Points }, 4 ) - - return Valid - -end - - -function CARGO_PACKAGE:OnBoarded( Client, LandingZone ) - self:F() - - local OnBoarded = false - - if self.CargoClient and self.CargoClient:GetDCSGroup() then - if routines.IsUnitInRadius( self.CargoClient:GetClientGroupDCSUnit(), self.CargoClient:GetPositionVec3(), 10 ) then - - -- Switch Cargo from self.CargoClient to Client ... Each cargo can have only one client. So assigning the new client for the cargo is enough. - self:StatusLoaded( Client ) - - -- All done, onboarded the Cargo to the new Client. - OnBoarded = true - end - end - - return OnBoarded -end - - -function CARGO_PACKAGE:UnLoad( Client, TargetZoneName ) - self:F() - - self:T( 'self.CargoName = ' .. self.CargoName ) - --self:T( 'self.CargoHostName = ' .. self.CargoHostName ) - - --self.CargoSpawn:FromCarrier( Client:GetDCSGroup(), TargetZoneName, self.CargoHostName ) - self:StatusUnLoaded() - - return Cargo -end - - -CARGO_SLINGLOAD = { - ClassName = "CARGO_SLINGLOAD" -} - - -function CARGO_SLINGLOAD:New( CargoType, CargoName, CargoWeight, CargoZone, CargoHostName, CargoCountryID ) - local self = BASE:Inherit( self, CARGO:New( CargoType, CargoName, CargoWeight ) ) - self:F( { CargoType, CargoName, CargoWeight, CargoZone, CargoHostName, CargoCountryID } ) - - self.CargoHostName = CargoHostName - - -- Cargo will be initialized around the CargoZone position. - self.CargoZone = CargoZone - - self.CargoCount = 0 - self.CargoStaticName = string.format( "%s#%03d", self.CargoName, self.CargoCount ) - - -- The country ID needs to be correctly set. - self.CargoCountryID = CargoCountryID - - CARGOS[self.CargoName] = self - - return self - -end - - -function CARGO_SLINGLOAD:IsLandingRequired() - self:F() - return false -end - - -function CARGO_SLINGLOAD:IsSlingLoad() - self:F() - return true -end - - -function CARGO_SLINGLOAD:Spawn( Client ) - self:F( { self, Client } ) - - local Zone = trigger.misc.getZone( self.CargoZone ) - - local ZonePos = {} - ZonePos.x = Zone.point.x + math.random( Zone.radius / 2 * -1, Zone.radius / 2 ) - ZonePos.y = Zone.point.z + math.random( Zone.radius / 2 * -1, Zone.radius / 2 ) - - self:T( "Cargo Location = " .. ZonePos.x .. ", " .. ZonePos.y ) - - --[[ - -- This does not work in 1.5.2. - CargoStatic = StaticObject.getByName( self.CargoName ) - if CargoStatic then - CargoStatic:destroy() - end - --]] - - CargoStatic = StaticObject.getByName( self.CargoStaticName ) - - if CargoStatic and CargoStatic:isExist() then - CargoStatic:destroy() - end - - -- I need to make every time a new cargo due to bugs in 1.5.2. - - self.CargoCount = self.CargoCount + 1 - self.CargoStaticName = string.format( "%s#%03d", self.CargoName, self.CargoCount ) - - local CargoTemplate = { - ["category"] = "Cargo", - ["shape_name"] = "ab-212_cargo", - ["type"] = "Cargo1", - ["x"] = ZonePos.x, - ["y"] = ZonePos.y, - ["mass"] = self.CargoWeight, - ["name"] = self.CargoStaticName, - ["canCargo"] = true, - ["heading"] = 0, - } - - coalition.addStaticObject( self.CargoCountryID, CargoTemplate ) - --- end - - return self -end - - -function CARGO_SLINGLOAD:IsNear( Client, LandingZone ) - self:F() - - local Near = false - - return Near -end - - -function CARGO_SLINGLOAD:IsInLandingZone( Client, LandingZone ) - self:F() - - local Near = false - - local CargoStaticUnit = StaticObject.getByName( self.CargoName ) - if CargoStaticUnit then - if routines.IsStaticInZones( CargoStaticUnit, LandingZone ) then - Near = true - end - end - - return Near -end - - -function CARGO_SLINGLOAD:OnBoard( Client, LandingZone, OnBoardSide ) - self:F() - - local Valid = true - - - return Valid -end - - -function CARGO_SLINGLOAD:OnBoarded( Client, LandingZone ) - self:F() - - local OnBoarded = false - - local CargoStaticUnit = StaticObject.getByName( self.CargoName ) - if CargoStaticUnit then - if not routines.IsStaticInZones( CargoStaticUnit, LandingZone ) then - OnBoarded = true - end - end - - return OnBoarded -end - - -function CARGO_SLINGLOAD:UnLoad( Client, TargetZoneName ) - self:F() - - self:T( 'self.CargoName = ' .. self.CargoName ) - self:T( 'self.CargoGroupName = ' .. self.CargoGroupName ) - - self:StatusUnLoaded() - - return Cargo -end ---- Message System to display Messages for Clients and Coalitions or All. --- Messages are grouped on the display panel per Category to improve readability for the players. --- Messages are shown on the display panel for an amount of seconds, and will then disappear. --- Messages are identified by an ID. The messages with the same ID belonging to the same category will be overwritten if they were still being displayed on the display panel. --- Messages are created with MESSAGE:@{New}(). --- Messages are sent to Clients with MESSAGE:@{ToClient}(). --- Messages are sent to Coalitions with MESSAGE:@{ToCoalition}(). --- Messages are sent to All Players with MESSAGE:@{ToAll}(). --- @module Message - -Include.File( "Base" ) - ---- The MESSAGE class --- @type MESSAGE -MESSAGE = { - ClassName = "MESSAGE", - MessageCategory = 0, - MessageID = 0, -} - - ---- Creates a new MESSAGE object. Note that these MESSAGE objects are not yet displayed on the display panel. You must use the functions @{ToClient} or @{ToCoalition} or @{ToAll} to send these Messages to the respective recipients. --- @param self --- @param #string MessageText is the text of the Message. --- @param #string MessageCategory is a string expressing the Category of the Message. Messages are grouped on the display panel per Category to improve readability. --- @param #number MessageDuration is a number in seconds of how long the MESSAGE should be shown on the display panel. --- @param #string MessageID is a string expressing the ID of the Message. --- @return #MESSAGE --- @usage --- -- Create a series of new Messages. --- -- MessageAll is meant to be sent to all players, for 25 seconds, and is classified as "Score". --- -- MessageRED is meant to be sent to the RED players only, for 10 seconds, and is classified as "End of Mission", with ID "Win". --- -- MessageClient1 is meant to be sent to a Client, for 25 seconds, and is classified as "Score", with ID "Score". --- -- MessageClient1 is meant to be sent to a Client, for 25 seconds, and is classified as "Score", with ID "Score". --- MessageAll = MESSAGE:New( "To all Players: BLUE has won! Each player of BLUE wins 50 points!", "End of Mission", 25, "Win" ) --- MessageRED = MESSAGE:New( "To the RED Players: You receive a penalty because you've killed one of your own units", "Penalty", 25, "Score" ) --- MessageClient1 = MESSAGE:New( "Congratulations, you've just hit a target", "Score", 25, "Score" ) --- MessageClient2 = MESSAGE:New( "Congratulations, you've just killed a target", "Score", 25, "Score" ) -function MESSAGE:New( MessageText, MessageCategory, MessageDuration, MessageID ) - local self = BASE:Inherit( self, BASE:New() ) - self:F( { MessageText, MessageCategory, MessageDuration, MessageID } ) - - -- When no messagecategory is given, we don't show it as a title... - if MessageCategory and MessageCategory ~= "" then - self.MessageCategory = MessageCategory .. ": " - else - self.MessageCategory = "" - end - - self.MessageDuration = MessageDuration - self.MessageID = MessageID - self.MessageTime = timer.getTime() - self.MessageText = MessageText - - self.MessageSent = false - self.MessageGroup = false - self.MessageCoalition = false - - return self -end - ---- Sends a MESSAGE to a Client Group. Note that the Group needs to be defined within the ME with the skillset "Client" or "Player". --- @param #MESSAGE self --- @param Client#CLIENT Client is the Group of the Client. --- @return #MESSAGE --- @usage --- -- Send the 2 messages created with the @{New} method to the Client Group. --- -- Note that the Message of MessageClient2 is overwriting the Message of MessageClient1. --- ClientGroup = Group.getByName( "ClientGroup" ) --- --- MessageClient1 = MESSAGE:New( "Congratulations, you've just hit a target", "Score", 25, "Score" ):ToClient( ClientGroup ) --- MessageClient2 = MESSAGE:New( "Congratulations, you've just killed a target", "Score", 25, "Score" ):ToClient( ClientGroup ) --- or --- MESSAGE:New( "Congratulations, you've just hit a target", "Score", 25, "Score" ):ToClient( ClientGroup ) --- MESSAGE:New( "Congratulations, you've just killed a target", "Score", 25, "Score" ):ToClient( ClientGroup ) --- or --- MessageClient1 = MESSAGE:New( "Congratulations, you've just hit a target", "Score", 25, "Score" ) --- MessageClient2 = MESSAGE:New( "Congratulations, you've just killed a target", "Score", 25, "Score" ) --- MessageClient1:ToClient( ClientGroup ) --- MessageClient2:ToClient( ClientGroup ) -function MESSAGE:ToClient( Client ) - self:F( Client ) - - if Client and Client:GetClientGroupID() then - - local ClientGroupID = Client:GetClientGroupID() - self:T( self.MessageCategory .. self.MessageText:gsub("\n$",""):gsub("\n$","") .. " / " .. self.MessageDuration ) - trigger.action.outTextForGroup( ClientGroupID, self.MessageCategory .. self.MessageText:gsub("\n$",""):gsub("\n$",""), self.MessageDuration ) - end - - return self -end - ---- Sends a MESSAGE to the Blue coalition. --- @param #MESSAGE self --- @return #MESSAGE --- @usage --- -- Send a message created with the @{New} method to the BLUE coalition. --- MessageBLUE = MESSAGE:New( "To the BLUE Players: You receive a penalty because you've killed one of your own units", "Penalty", 25, "Score" ):ToBlue() --- or --- MESSAGE:New( "To the BLUE Players: You receive a penalty because you've killed one of your own units", "Penalty", 25, "Score" ):ToBlue() --- or --- MessageBLUE = MESSAGE:New( "To the BLUE Players: You receive a penalty because you've killed one of your own units", "Penalty", 25, "Score" ) --- MessageBLUE:ToBlue() -function MESSAGE:ToBlue() - self:F() - - self:ToCoalition( coalition.side.BLUE ) - - return self -end - ---- Sends a MESSAGE to the Red Coalition. --- @param #MESSAGE self --- @return #MESSAGE --- @usage --- -- Send a message created with the @{New} method to the RED coalition. --- MessageRED = MESSAGE:New( "To the RED Players: You receive a penalty because you've killed one of your own units", "Penalty", 25, "Score" ):ToRed() --- or --- MESSAGE:New( "To the RED Players: You receive a penalty because you've killed one of your own units", "Penalty", 25, "Score" ):ToRed() --- or --- MessageRED = MESSAGE:New( "To the RED Players: You receive a penalty because you've killed one of your own units", "Penalty", 25, "Score" ) --- MessageRED:ToRed() -function MESSAGE:ToRed( ) - self:F() - - self:ToCoalition( coalition.side.RED ) - - return self -end - ---- Sends a MESSAGE to a Coalition. --- @param #MESSAGE self --- @param CoalitionSide needs to be filled out by the defined structure of the standard scripting engine @{coalition.side}. --- @return #MESSAGE --- @usage --- -- Send a message created with the @{New} method to the RED coalition. --- MessageRED = MESSAGE:New( "To the RED Players: You receive a penalty because you've killed one of your own units", "Penalty", 25, "Score" ):ToCoalition( coalition.side.RED ) --- or --- MESSAGE:New( "To the RED Players: You receive a penalty because you've killed one of your own units", "Penalty", 25, "Score" ):ToCoalition( coalition.side.RED ) --- or --- MessageRED = MESSAGE:New( "To the RED Players: You receive a penalty because you've killed one of your own units", "Penalty", 25, "Score" ) --- MessageRED:ToCoalition( coalition.side.RED ) -function MESSAGE:ToCoalition( CoalitionSide ) - self:F( CoalitionSide ) - - if CoalitionSide then - self:T( self.MessageCategory .. self.MessageText:gsub("\n$",""):gsub("\n$","") .. " / " .. self.MessageDuration ) - trigger.action.outTextForCoalition( CoalitionSide, self.MessageCategory .. self.MessageText:gsub("\n$",""):gsub("\n$",""), self.MessageDuration ) - end - - return self -end - ---- Sends a MESSAGE to all players. --- @param #MESSAGE self --- @return #MESSAGE --- @usage --- -- Send a message created to all players. --- MessageAll = MESSAGE:New( "To all Players: BLUE has won! Each player of BLUE wins 50 points!", "End of Mission", 25, "Win" ):ToAll() --- or --- MESSAGE:New( "To all Players: BLUE has won! Each player of BLUE wins 50 points!", "End of Mission", 25, "Win" ):ToAll() --- or --- MessageAll = MESSAGE:New( "To all Players: BLUE has won! Each player of BLUE wins 50 points!", "End of Mission", 25, "Win" ) --- MessageAll:ToAll() -function MESSAGE:ToAll() - self:F() - - self:ToCoalition( coalition.side.RED ) - self:ToCoalition( coalition.side.BLUE ) - - return self -end - - - ---- The MESSAGEQUEUE class --- @type MESSAGEQUEUE -MESSAGEQUEUE = { - ClientGroups = {}, - CoalitionSides = {} -} - -function MESSAGEQUEUE:New( RefreshInterval ) - local self = BASE:Inherit( self, BASE:New() ) - self:F( { RefreshInterval } ) - - self.RefreshInterval = RefreshInterval - - --self.DisplayFunction = routines.scheduleFunction( self._DisplayMessages, { self }, 0, RefreshInterval ) - self.DisplayFunction = SCHEDULER:New( self, self._DisplayMessages, {}, 0, RefreshInterval ) - - return self -end - ---- This function is called automatically by the MESSAGEQUEUE scheduler. -function MESSAGEQUEUE:_DisplayMessages() - - -- First we display all messages that a coalition needs to receive... Also those who are not in a client (CA module clients...). - for CoalitionSideID, CoalitionSideData in pairs( self.CoalitionSides ) do - for MessageID, MessageData in pairs( CoalitionSideData.Messages ) do - if MessageData.MessageSent == false then - --trigger.action.outTextForCoalition( CoalitionSideID, MessageData.MessageCategory .. '\n' .. MessageData.MessageText:gsub("\n$",""):gsub("\n$",""), MessageData.MessageDuration ) - MessageData.MessageSent = true - end - local MessageTimeLeft = ( MessageData.MessageTime + MessageData.MessageDuration ) - timer.getTime() - if MessageTimeLeft <= 0 then - MessageData = nil - end - end - end - - -- Then we send the messages for each individual client, but also to be included are those Coalition messages for the Clients who belong to a coalition. - -- Because the Client messages will overwrite the Coalition messages (for that Client). - for ClientGroupName, ClientGroupData in pairs( self.ClientGroups ) do - for MessageID, MessageData in pairs( ClientGroupData.Messages ) do - if MessageData.MessageGroup == false then - trigger.action.outTextForGroup( Group.getByName(ClientGroupName):getID(), MessageData.MessageCategory .. '\n' .. MessageData.MessageText:gsub("\n$",""):gsub("\n$",""), MessageData.MessageDuration ) - MessageData.MessageGroup = true - end - local MessageTimeLeft = ( MessageData.MessageTime + MessageData.MessageDuration ) - timer.getTime() - if MessageTimeLeft <= 0 then - MessageData = nil - end - end - - -- Now check if the Client also has messages that belong to the Coalition of the Client... - for CoalitionSideID, CoalitionSideData in pairs( self.CoalitionSides ) do - for MessageID, MessageData in pairs( CoalitionSideData.Messages ) do - local CoalitionGroup = Group.getByName( ClientGroupName ) - if CoalitionGroup and CoalitionGroup:getCoalition() == CoalitionSideID then - if MessageData.MessageCoalition == false then - trigger.action.outTextForGroup( Group.getByName(ClientGroupName):getID(), MessageData.MessageCategory .. '\n' .. MessageData.MessageText:gsub("\n$",""):gsub("\n$",""), MessageData.MessageDuration ) - MessageData.MessageCoalition = true - end - end - local MessageTimeLeft = ( MessageData.MessageTime + MessageData.MessageDuration ) - timer.getTime() - if MessageTimeLeft <= 0 then - MessageData = nil - end - end - end - end - - return true -end - ---- The _MessageQueue object is created when the MESSAGE class module is loaded. ---_MessageQueue = MESSAGEQUEUE:New( 0.5 ) - ---- Stages within a @{TASK} within a @{MISSION}. All of the STAGE functionality is considered internally administered and not to be used by any Mission designer. --- @module STAGE --- @author Flightcontrol - -Include.File( "Routines" ) -Include.File( "Base" ) -Include.File( "Mission" ) -Include.File( "Client" ) -Include.File( "Task" ) - ---- The STAGE class --- @type -STAGE = { - ClassName = "STAGE", - MSG = { ID = "None", TIME = 10 }, - FREQUENCY = { NONE = 0, ONCE = 1, REPEAT = -1 }, - - Name = "NoStage", - StageType = '', - WaitTime = 1, - Frequency = 1, - MessageCount = 0, - MessageInterval = 15, - MessageShown = {}, - MessageShow = false, - MessageFlash = false -} - - -function STAGE:New() - local self = BASE:Inherit( self, BASE:New() ) - self:F() - return self -end - -function STAGE:Execute( Mission, Client, Task ) - - local Valid = true - - return Valid -end - -function STAGE:Executing( Mission, Client, Task ) - -end - -function STAGE:Validate( Mission, Client, Task ) - local Valid = true - - return Valid -end - - -STAGEBRIEF = { - ClassName = "BRIEF", - MSG = { ID = "Brief", TIME = 1 }, - Name = "Brief", - StageBriefingTime = 0, - StageBriefingDuration = 1 -} - -function STAGEBRIEF:New() - local self = BASE:Inherit( self, STAGE:New() ) - self:F() - self.StageType = 'CLIENT' - return self -end - ---- Execute --- @param #STAGEBRIEF self --- @param Mission#MISSION Mission --- @param Client#CLIENT Client --- @param Task#TASK Task --- @return #boolean -function STAGEBRIEF:Execute( Mission, Client, Task ) - local Valid = BASE:Inherited(self):Execute( Mission, Client, Task ) - self:F() - Client:ShowMissionBriefing( Mission.MissionBriefing ) - self.StageBriefingTime = timer.getTime() - return Valid -end - -function STAGEBRIEF:Validate( Mission, Client, Task ) - local Valid = STAGE:Validate( Mission, Client, Task ) - self:T() - - if timer.getTime() - self.StageBriefingTime <= self.StageBriefingDuration then - return 0 - else - self.StageBriefingTime = timer.getTime() - return 1 - end - -end - - -STAGESTART = { - ClassName = "START", - MSG = { ID = "Start", TIME = 1 }, - Name = "Start", - StageStartTime = 0, - StageStartDuration = 1 -} - -function STAGESTART:New() - local self = BASE:Inherit( self, STAGE:New() ) - self:F() - self.StageType = 'CLIENT' - return self -end - -function STAGESTART:Execute( Mission, Client, Task ) - self:F() - local Valid = BASE:Inherited(self):Execute( Mission, Client, Task ) - if Task.TaskBriefing then - Client:Message( Task.TaskBriefing, 30, Mission.Name .. "/Stage", "Command" ) - else - Client:Message( 'Task ' .. Task.TaskNumber .. '.', 30, Mission.Name .. "/Stage", "Command" ) - end - self.StageStartTime = timer.getTime() - return Valid -end - -function STAGESTART:Validate( Mission, Client, Task ) - self:F() - local Valid = STAGE:Validate( Mission, Client, Task ) - - if timer.getTime() - self.StageStartTime <= self.StageStartDuration then - return 0 - else - self.StageStartTime = timer.getTime() - return 1 - end - - return 1 - -end - -STAGE_CARGO_LOAD = { - ClassName = "STAGE_CARGO_LOAD" -} - -function STAGE_CARGO_LOAD:New() - local self = BASE:Inherit( self, STAGE:New() ) - self:F() - self.StageType = 'CLIENT' - return self -end - -function STAGE_CARGO_LOAD:Execute( Mission, Client, Task ) - self:F() - local Valid = BASE:Inherited(self):Execute( Mission, Client, Task ) - - for LoadCargoID, LoadCargo in pairs( Task.Cargos.LoadCargos ) do - LoadCargo:Load( Client ) - end - - if Mission.MissionReportFlash and Client:IsTransport() then - Client:ShowCargo() - end - - return Valid -end - -function STAGE_CARGO_LOAD:Validate( Mission, Client, Task ) - self:F() - local Valid = STAGE:Validate( Mission, Client, Task ) - - return 1 -end - - -STAGE_CARGO_INIT = { - ClassName = "STAGE_CARGO_INIT" -} - -function STAGE_CARGO_INIT:New() - local self = BASE:Inherit( self, STAGE:New() ) - self:F() - self.StageType = 'CLIENT' - return self -end - -function STAGE_CARGO_INIT:Execute( Mission, Client, Task ) - self:F() - local Valid = BASE:Inherited(self):Execute( Mission, Client, Task ) - - for InitLandingZoneID, InitLandingZone in pairs( Task.LandingZones.LandingZones ) do - self:T( InitLandingZone ) - InitLandingZone:Spawn() - end - - - self:T( Task.Cargos.InitCargos ) - for InitCargoID, InitCargoData in pairs( Task.Cargos.InitCargos ) do - self:T( { InitCargoData } ) - InitCargoData:Spawn( Client ) - end - - return Valid -end - - -function STAGE_CARGO_INIT:Validate( Mission, Client, Task ) - self:F() - local Valid = STAGE:Validate( Mission, Client, Task ) - - return 1 -end - - - -STAGEROUTE = { - ClassName = "STAGEROUTE", - MSG = { ID = "Route", TIME = 5 }, - Frequency = STAGE.FREQUENCY.REPEAT, - Name = "Route" -} - -function STAGEROUTE:New() - local self = BASE:Inherit( self, STAGE:New() ) - self:F() - self.StageType = 'CLIENT' - self.MessageSwitch = true - return self -end - - ---- Execute the routing. --- @param #STAGEROUTE self --- @param Mission#MISSION Mission --- @param Client#CLIENT Client --- @param Task#TASK Task -function STAGEROUTE:Execute( Mission, Client, Task ) - self:F() - local Valid = BASE:Inherited(self):Execute( Mission, Client, Task ) - - local RouteMessage = "Fly to: " - self:T( Task.LandingZones ) - for LandingZoneID, LandingZoneName in pairs( Task.LandingZones.LandingZoneNames ) do - RouteMessage = RouteMessage .. "\n " .. LandingZoneName .. ' at ' .. routines.getBRStringZone( { zone = LandingZoneName, ref = Client:GetClientGroupDCSUnit():getPoint(), true, true } ) .. ' km.' - end - - if Client:IsMultiSeated() then - Client:Message( RouteMessage, self.MSG.TIME, Mission.Name .. "/StageRoute", "Co-Pilot", 20 ) - else - Client:Message( RouteMessage, self.MSG.TIME, Mission.Name .. "/StageRoute", "Command", 20 ) - end - - - if Mission.MissionReportFlash and Client:IsTransport() then - Client:ShowCargo() - end - - return Valid -end - -function STAGEROUTE:Validate( Mission, Client, Task ) - self:F() - local Valid = STAGE:Validate( Mission, Client, Task ) - - -- check if the Client is in the landing zone - self:T( Task.LandingZones.LandingZoneNames ) - Task.CurrentLandingZoneName = routines.IsUnitNearZonesRadius( Client:GetClientGroupDCSUnit(), Task.LandingZones.LandingZoneNames, 500 ) - - if Task.CurrentLandingZoneName then - - Task.CurrentLandingZone = Task.LandingZones.LandingZones[Task.CurrentLandingZoneName].CargoZone - Task.CurrentCargoZone = Task.LandingZones.LandingZones[Task.CurrentLandingZoneName] - - if Task.CurrentCargoZone then - if not Task.Signalled then - Task.Signalled = Task.CurrentCargoZone:Signal() - end - end - - self:T( 1 ) - return 1 - end - - self:T( 0 ) - return 0 -end - - - -STAGELANDING = { - ClassName = "STAGELANDING", - MSG = { ID = "Landing", TIME = 10 }, - Name = "Landing", - Signalled = false -} - -function STAGELANDING:New() - local self = BASE:Inherit( self, STAGE:New() ) - self:F() - self.StageType = 'CLIENT' - return self -end - ---- Execute the landing coordination. --- @param #STAGELANDING self --- @param Mission#MISSION Mission --- @param Client#CLIENT Client --- @param Task#TASK Task -function STAGELANDING:Execute( Mission, Client, Task ) - self:F() - - if Client:IsMultiSeated() then - Client:Message( "We have arrived at the landing zone.", self.MSG.TIME, Mission.Name .. "/StageArrived", "Co-Pilot", 10 ) - else - Client:Message( "You have arrived at the landing zone.", self.MSG.TIME, Mission.Name .. "/StageArrived", "Command", 10 ) - end - - Task.HostUnit = Task.CurrentCargoZone:GetHostUnit() - - self:T( { Task.HostUnit } ) - - if Task.HostUnit then - - Task.HostUnitName = Task.HostUnit:GetPrefix() - Task.HostUnitTypeName = Task.HostUnit:GetTypeName() - - local HostMessage = "" - Task.CargoNames = "" - - local IsFirst = true - - for CargoID, Cargo in pairs( CARGOS ) do - if Cargo.CargoType == Task.CargoType then - - if Cargo:IsLandingRequired() then - self:T( "Task for cargo " .. Cargo.CargoType .. " requires landing.") - Task.IsLandingRequired = true - end - - if Cargo:IsSlingLoad() then - self:T( "Task for cargo " .. Cargo.CargoType .. " is a slingload.") - Task.IsSlingLoad = true - end - - if IsFirst then - IsFirst = false - Task.CargoNames = Task.CargoNames .. Cargo.CargoName .. "( " .. Cargo.CargoWeight .. " )" - else - Task.CargoNames = Task.CargoNames .. "; " .. Cargo.CargoName .. "( " .. Cargo.CargoWeight .. " )" - end - end - end - - if Task.IsLandingRequired then - HostMessage = "Land the helicopter to " .. Task.TEXT[1] .. " " .. Task.CargoNames .. "." - else - HostMessage = "Use the Radio menu and F6 to find the cargo, then fly or land near the cargo and " .. Task.TEXT[1] .. " " .. Task.CargoNames .. "." - end - - local Host = "Command" - if Task.HostUnitName then - Host = Task.HostUnitName .. " (" .. Task.HostUnitTypeName .. ")" - else - if Client:IsMultiSeated() then - Host = "Co-Pilot" - end - end - - Client:Message( HostMessage, self.MSG.TIME, Mission.Name .. "/STAGELANDING.EXEC." .. Host, Host, 10 ) - - end -end - -function STAGELANDING:Validate( Mission, Client, Task ) - self:F() - - Task.CurrentLandingZoneName = routines.IsUnitNearZonesRadius( Client:GetClientGroupDCSUnit(), Task.LandingZones.LandingZoneNames, 500 ) - if Task.CurrentLandingZoneName then - - -- Client is in de landing zone. - self:T( Task.CurrentLandingZoneName ) - - Task.CurrentLandingZone = Task.LandingZones.LandingZones[Task.CurrentLandingZoneName].CargoZone - Task.CurrentCargoZone = Task.LandingZones.LandingZones[Task.CurrentLandingZoneName] - - if Task.CurrentCargoZone then - if not Task.Signalled then - Task.Signalled = Task.CurrentCargoZone:Signal() - end - end - else - if Task.CurrentLandingZone then - Task.CurrentLandingZone = nil - end - if Task.CurrentCargoZone then - Task.CurrentCargoZone = nil - end - Task.Signalled = false - Task:RemoveCargoMenus( Client ) - self:T( -1 ) - return -1 - end - - - local DCSUnitVelocityVec3 = Client:GetClientGroupDCSUnit():getVelocity() - local DCSUnitVelocity = ( DCSUnitVelocityVec3.x ^2 + DCSUnitVelocityVec3.y ^2 + DCSUnitVelocityVec3.z ^2 ) ^ 0.5 - - local DCSUnitPointVec3 = Client:GetClientGroupDCSUnit():getPoint() - local LandHeight = land.getHeight( { x = DCSUnitPointVec3.x, y = DCSUnitPointVec3.z } ) - local DCSUnitHeight = DCSUnitPointVec3.y - LandHeight - - self:T( { Task.IsLandingRequired, Client:GetClientGroupDCSUnit():inAir() } ) - if Task.IsLandingRequired and not Client:GetClientGroupDCSUnit():inAir() then - self:T( 1 ) - Task.IsInAirTestRequired = true - return 1 - end - - self:T( { DCSUnitVelocity, DCSUnitHeight, LandHeight, Task.CurrentCargoZone.SignalHeight } ) - if Task.IsLandingRequired and DCSUnitVelocity <= 0.05 and DCSUnitHeight <= Task.CurrentCargoZone.SignalHeight then - self:T( 1 ) - Task.IsInAirTestRequired = false - return 1 - end - - self:T( 0 ) - return 0 -end - -STAGELANDED = { - ClassName = "STAGELANDED", - MSG = { ID = "Land", TIME = 10 }, - Name = "Landed", - MenusAdded = false -} - -function STAGELANDED:New() - local self = BASE:Inherit( self, STAGE:New() ) - self:F() - self.StageType = 'CLIENT' - return self -end - -function STAGELANDED:Execute( Mission, Client, Task ) - self:F() - - if Task.IsLandingRequired then - - local Host = "Command" - if Task.HostUnitName then - Host = Task.HostUnitName .. " (" .. Task.HostUnitTypeName .. ")" - else - if Client:IsMultiSeated() then - Host = "Co-Pilot" - end - end - - Client:Message( 'You have landed within the landing zone. Use the radio menu (F10) to ' .. Task.TEXT[1] .. ' the ' .. Task.CargoType .. '.', - self.MSG.TIME, Mission.Name .. "/STAGELANDED.EXEC" .. Host, Host ) - - if not self.MenusAdded then - Task.Cargo = nil - Task:RemoveCargoMenus( Client ) - Task:AddCargoMenus( Client, CARGOS, 250 ) - end - end -end - - - -function STAGELANDED:Validate( Mission, Client, Task ) - self:F() - - if not routines.IsUnitNearZonesRadius( Client:GetClientGroupDCSUnit(), Task.CurrentLandingZoneName, 500 ) then - self:T( "Client is not anymore in the landing zone, go back to stage Route, and remove cargo menus." ) - Task.Signalled = false - Task:RemoveCargoMenus( Client ) - self:T( -2 ) - return -2 - end - - local DCSUnitVelocityVec3 = Client:GetClientGroupDCSUnit():getVelocity() - local DCSUnitVelocity = ( DCSUnitVelocityVec3.x ^2 + DCSUnitVelocityVec3.y ^2 + DCSUnitVelocityVec3.z ^2 ) ^ 0.5 - - local DCSUnitPointVec3 = Client:GetClientGroupDCSUnit():getPoint() - local LandHeight = land.getHeight( { x = DCSUnitPointVec3.x, y = DCSUnitPointVec3.z } ) - local DCSUnitHeight = DCSUnitPointVec3.y - LandHeight - - self:T( { Task.IsLandingRequired, Client:GetClientGroupDCSUnit():inAir() } ) - if Task.IsLandingRequired and Task.IsInAirTestRequired == true and Client:GetClientGroupDCSUnit():inAir() then - self:T( "Client went back in the air. Go back to stage Landing." ) - self:T( -1 ) - return -1 - end - - self:T( { DCSUnitVelocity, DCSUnitHeight, LandHeight, Task.CurrentCargoZone.SignalHeight } ) - if Task.IsLandingRequired and Task.IsInAirTestRequired == false and DCSUnitVelocity >= 2 and DCSUnitHeight >= Task.CurrentCargoZone.SignalHeight then - self:T( "It seems the Client went back in the air and over the boundary limits. Go back to stage Landing." ) - self:T( -1 ) - return -1 - end - - -- Wait until cargo is selected from the menu. - if Task.IsLandingRequired then - if not Task.Cargo then - self:T( 0 ) - return 0 - end - end - - self:T( 1 ) - return 1 -end - -STAGEUNLOAD = { - ClassName = "STAGEUNLOAD", - MSG = { ID = "Unload", TIME = 10 }, - Name = "Unload" -} - -function STAGEUNLOAD:New() - local self = BASE:Inherit( self, STAGE:New() ) - self:F() - self.StageType = 'CLIENT' - return self -end - ---- Coordinate UnLoading --- @param #STAGEUNLOAD self --- @param Mission#MISSION Mission --- @param Client#CLIENT Client --- @param Task#TASK Task -function STAGEUNLOAD:Execute( Mission, Client, Task ) - self:F() - - if Client:IsMultiSeated() then - Client:Message( 'The ' .. Task.CargoType .. ' are being ' .. Task.TEXT[2] .. ' within the landing zone. Wait until the helicopter is ' .. Task.TEXT[3] .. '.', - self.MSG.TIME, Mission.Name .. "/StageUnLoad", "Co-Pilot" ) - else - Client:Message( 'You are unloading the ' .. Task.CargoType .. ' ' .. Task.TEXT[2] .. ' within the landing zone. Wait until the helicopter is ' .. Task.TEXT[3] .. '.', - self.MSG.TIME, Mission.Name .. "/StageUnLoad", "Command" ) - end - Task:RemoveCargoMenus( Client ) -end - -function STAGEUNLOAD:Executing( Mission, Client, Task ) - self:F() - env.info( 'STAGEUNLOAD:Executing() Task.Cargo.CargoName = ' .. Task.Cargo.CargoName ) - - local TargetZoneName - - if Task.TargetZoneName then - TargetZoneName = Task.TargetZoneName - else - TargetZoneName = Task.CurrentLandingZoneName - end - - if Task.Cargo:UnLoad( Client, TargetZoneName ) then - Task.ExecuteStage = _TransportExecuteStage.SUCCESS - if Mission.MissionReportFlash then - Client:ShowCargo() - end - end -end - ---- Validate UnLoading --- @param #STAGEUNLOAD self --- @param Mission#MISSION Mission --- @param Client#CLIENT Client --- @param Task#TASK Task -function STAGEUNLOAD:Validate( Mission, Client, Task ) - self:F() - env.info( 'STAGEUNLOAD:Validate()' ) - - if routines.IsUnitNearZonesRadius( Client:GetClientGroupDCSUnit(), Task.CurrentLandingZoneName, 500 ) then - else - Task.ExecuteStage = _TransportExecuteStage.FAILED - Task:RemoveCargoMenus( Client ) - if Client:IsMultiSeated() then - Client:Message( 'The ' .. Task.CargoType .. " haven't been successfully " .. Task.TEXT[3] .. ' within the landing zone. Task and mission has failed.', - _TransportStageMsgTime.DONE, Mission.Name .. "/StageFailure", "Co-Pilot" ) - else - Client:Message( 'The ' .. Task.CargoType .. " haven't been successfully " .. Task.TEXT[3] .. ' within the landing zone. Task and mission has failed.', - _TransportStageMsgTime.DONE, Mission.Name .. "/StageFailure", "Command" ) - end - return 1 - end - - if not Client:GetClientGroupDCSUnit():inAir() then - else - Task.ExecuteStage = _TransportExecuteStage.FAILED - Task:RemoveCargoMenus( Client ) - if Client:IsMultiSeated() then - Client:Message( 'The ' .. Task.CargoType .. " haven't been successfully " .. Task.TEXT[3] .. ' within the landing zone. Task and mission has failed.', - _TransportStageMsgTime.DONE, Mission.Name .. "/StageFailure", "Co-Pilot" ) - else - Client:Message( 'The ' .. Task.CargoType .. " haven't been successfully " .. Task.TEXT[3] .. ' within the landing zone. Task and mission has failed.', - _TransportStageMsgTime.DONE, Mission.Name .. "/StageFailure", "Command" ) - end - return 1 - end - - if Task.ExecuteStage == _TransportExecuteStage.SUCCESS then - if Client:IsMultiSeated() then - Client:Message( 'The ' .. Task.CargoType .. ' have been sucessfully ' .. Task.TEXT[3] .. ' within the landing zone.', _TransportStageMsgTime.DONE, Mission.Name .. "/Stage", "Co-Pilot" ) - else - Client:Message( 'The ' .. Task.CargoType .. ' have been sucessfully ' .. Task.TEXT[3] .. ' within the landing zone.', _TransportStageMsgTime.DONE, Mission.Name .. "/Stage", "Command" ) - end - Task:RemoveCargoMenus( Client ) - Task.MissionTask:AddGoalCompletion( Task.MissionTask.GoalVerb, Task.CargoName, 1 ) -- We set the cargo as one more goal completed in the mission. - return 1 - end - - return 1 -end - -STAGELOAD = { - ClassName = "STAGELOAD", - MSG = { ID = "Load", TIME = 10 }, - Name = "Load" -} - -function STAGELOAD:New() - local self = BASE:Inherit( self, STAGE:New() ) - self:F() - self.StageType = 'CLIENT' - return self -end - -function STAGELOAD:Execute( Mission, Client, Task ) - self:F() - - if not Task.IsSlingLoad then - - local Host = "Command" - if Task.HostUnitName then - Host = Task.HostUnitName .. " (" .. Task.HostUnitTypeName .. ")" - else - if Client:IsMultiSeated() then - Host = "Co-Pilot" - end - end - - Client:Message( 'The ' .. Task.CargoType .. ' are being ' .. Task.TEXT[2] .. ' within the landing zone. Wait until the helicopter is ' .. Task.TEXT[3] .. '.', - _TransportStageMsgTime.EXECUTING, Mission.Name .. "/STAGELOAD.EXEC." .. Host, Host ) - - -- Route the cargo to the Carrier - - Task.Cargo:OnBoard( Client, Task.CurrentCargoZone, Task.OnBoardSide ) - Task.ExecuteStage = _TransportExecuteStage.EXECUTING - else - Task.ExecuteStage = _TransportExecuteStage.EXECUTING - end -end - -function STAGELOAD:Executing( Mission, Client, Task ) - self:F() - - -- If the Cargo is ready to be loaded, load it into the Client. - - local Host = "Command" - if Task.HostUnitName then - Host = Task.HostUnitName .. " (" .. Task.HostUnitTypeName .. ")" - else - if Client:IsMultiSeated() then - Host = "Co-Pilot" - end - end - - if not Task.IsSlingLoad then - self:T( Task.Cargo.CargoName) - - if Task.Cargo:OnBoarded( Client, Task.CurrentCargoZone ) then - - -- Load the Cargo onto the Client - Task.Cargo:Load( Client ) - - -- Message to the pilot that cargo has been loaded. - Client:Message( "The cargo " .. Task.Cargo.CargoName .. " has been loaded in our helicopter.", - 20, Mission.Name .. "/STAGELANDING.LOADING1." .. Host, Host ) - Task.ExecuteStage = _TransportExecuteStage.SUCCESS - - Client:ShowCargo() - end - else - Client:Message( "Hook the " .. Task.CargoNames .. " onto the helicopter " .. Task.TEXT[3] .. " within the landing zone.", - _TransportStageMsgTime.EXECUTING, Mission.Name .. "/STAGELOAD.LOADING.1." .. Host, Host , 10 ) - for CargoID, Cargo in pairs( CARGOS ) do - self:T( "Cargo.CargoName = " .. Cargo.CargoName ) - - if Cargo:IsSlingLoad() then - local CargoStatic = StaticObject.getByName( Cargo.CargoStaticName ) - if CargoStatic then - self:T( "Cargo is found in the DCS simulator.") - local CargoStaticPosition = CargoStatic:getPosition().p - self:T( "Cargo Position x = " .. CargoStaticPosition.x .. ", y = " .. CargoStaticPosition.y .. ", z = " .. CargoStaticPosition.z ) - local CargoStaticHeight = routines.GetUnitHeight( CargoStatic ) - if CargoStaticHeight > 5 then - self:T( "Cargo is airborne.") - Cargo:StatusLoaded() - Task.Cargo = Cargo - Client:Message( 'The Cargo has been successfully hooked onto the helicopter and is now being sling loaded. Fly outside the landing zone.', - self.MSG.TIME, Mission.Name .. "/STAGELANDING.LOADING.2." .. Host, Host ) - Task.ExecuteStage = _TransportExecuteStage.SUCCESS - break - end - else - self:T( "Cargo not found in the DCS simulator." ) - end - end - end - end - -end - -function STAGELOAD:Validate( Mission, Client, Task ) - self:F() - - self:T( "Task.CurrentLandingZoneName = " .. Task.CurrentLandingZoneName ) - - local Host = "Command" - if Task.HostUnitName then - Host = Task.HostUnitName .. " (" .. Task.HostUnitTypeName .. ")" - else - if Client:IsMultiSeated() then - Host = "Co-Pilot" - end - end - - if not Task.IsSlingLoad then - if not routines.IsUnitNearZonesRadius( Client:GetClientGroupDCSUnit(), Task.CurrentLandingZoneName, 500 ) then - Task:RemoveCargoMenus( Client ) - Task.ExecuteStage = _TransportExecuteStage.FAILED - Task.CargoName = nil - Client:Message( "The " .. Task.CargoType .. " loading has been aborted. You flew outside the pick-up zone while loading. ", - self.MSG.TIME, Mission.Name .. "/STAGELANDING.VALIDATE.1." .. Host, Host ) - self:T( -1 ) - return -1 - end - - local DCSUnitVelocityVec3 = Client:GetClientGroupDCSUnit():getVelocity() - local DCSUnitVelocity = ( DCSUnitVelocityVec3.x ^2 + DCSUnitVelocityVec3.y ^2 + DCSUnitVelocityVec3.z ^2 ) ^ 0.5 - - local DCSUnitPointVec3 = Client:GetClientGroupDCSUnit():getPoint() - local LandHeight = land.getHeight( { x = DCSUnitPointVec3.x, y = DCSUnitPointVec3.z } ) - local DCSUnitHeight = DCSUnitPointVec3.y - LandHeight - - self:T( { Task.IsLandingRequired, Client:GetClientGroupDCSUnit():inAir() } ) - if Task.IsLandingRequired and Task.IsInAirTestRequired == true and Client:GetClientGroupDCSUnit():inAir() then - Task:RemoveCargoMenus( Client ) - Task.ExecuteStage = _TransportExecuteStage.FAILED - Task.CargoName = nil - Client:Message( "The " .. Task.CargoType .. " loading has been aborted. Re-start the " .. Task.TEXT[3] .. " process. Don't fly outside the pick-up zone.", - self.MSG.TIME, Mission.Name .. "/STAGELANDING.VALIDATE.1." .. Host, Host ) - self:T( -1 ) - return -1 - end - - self:T( { DCSUnitVelocity, DCSUnitHeight, LandHeight, Task.CurrentCargoZone.SignalHeight } ) - if Task.IsLandingRequired and Task.IsInAirTestRequired == false and DCSUnitVelocity >= 2 and DCSUnitHeight >= Task.CurrentCargoZone.SignalHeight then - Task:RemoveCargoMenus( Client ) - Task.ExecuteStage = _TransportExecuteStage.FAILED - Task.CargoName = nil - Client:Message( "The " .. Task.CargoType .. " loading has been aborted. Re-start the " .. Task.TEXT[3] .. " process. Don't fly outside the pick-up zone.", - self.MSG.TIME, Mission.Name .. "/STAGELANDING.VALIDATE.1." .. Host, Host ) - self:T( -1 ) - return -1 - end - - if Task.ExecuteStage == _TransportExecuteStage.SUCCESS then - Task:RemoveCargoMenus( Client ) - Client:Message( "Good Job. The " .. Task.CargoType .. " has been sucessfully " .. Task.TEXT[3] .. " within the landing zone.", - self.MSG.TIME, Mission.Name .. "/STAGELANDING.VALIDATE.3." .. Host, Host ) - Task.MissionTask:AddGoalCompletion( Task.MissionTask.GoalVerb, Task.CargoName, 1 ) - self:T( 1 ) - return 1 - end - - else - if Task.ExecuteStage == _TransportExecuteStage.SUCCESS then - CargoStatic = StaticObject.getByName( Task.Cargo.CargoStaticName ) - if CargoStatic and not routines.IsStaticInZones( CargoStatic, Task.CurrentLandingZoneName ) then - Client:Message( "Good Job. The " .. Task.CargoType .. " has been sucessfully " .. Task.TEXT[3] .. " and flown outside of the landing zone.", - self.MSG.TIME, Mission.Name .. "/STAGELANDING.VALIDATE.4." .. Host, Host ) - Task.MissionTask:AddGoalCompletion( Task.MissionTask.GoalVerb, Task.Cargo.CargoName, 1 ) - self:T( 1 ) - return 1 - end - end - - end - - - self:T( 0 ) - return 0 -end - - -STAGEDONE = { - ClassName = "STAGEDONE", - MSG = { ID = "Done", TIME = 10 }, - Name = "Done" -} - -function STAGEDONE:New() - local self = BASE:Inherit( self, STAGE:New() ) - self:F() - self.StageType = 'AI' - return self -end - -function STAGEDONE:Execute( Mission, Client, Task ) - self:F() - -end - -function STAGEDONE:Validate( Mission, Client, Task ) - self:F() - - Task:Done() - - return 0 -end - -STAGEARRIVE = { - ClassName = "STAGEARRIVE", - MSG = { ID = "Arrive", TIME = 10 }, - Name = "Arrive" -} - -function STAGEARRIVE:New() - local self = BASE:Inherit( self, STAGE:New() ) - self:F() - self.StageType = 'CLIENT' - return self -end - - ---- Execute Arrival --- @param #STAGEARRIVE self --- @param Mission#MISSION Mission --- @param Client#CLIENT Client --- @param Task#TASK Task -function STAGEARRIVE:Execute( Mission, Client, Task ) - self:F() - - if Client:IsMultiSeated() then - Client:Message( 'We have arrived at ' .. Task.CurrentLandingZoneName .. ".", self.MSG.TIME, Mission.Name .. "/Stage", "Co-Pilot" ) - else - Client:Message( 'We have arrived at ' .. Task.CurrentLandingZoneName .. ".", self.MSG.TIME, Mission.Name .. "/Stage", "Command" ) - end - -end - -function STAGEARRIVE:Validate( Mission, Client, Task ) - self:F() - - Task.CurrentLandingZoneID = routines.IsUnitInZones( Client:GetClientGroupDCSUnit(), Task.LandingZones ) - if ( Task.CurrentLandingZoneID ) then - else - return -1 - end - - return 1 -end - -STAGEGROUPSDESTROYED = { - ClassName = "STAGEGROUPSDESTROYED", - DestroyGroupSize = -1, - Frequency = STAGE.FREQUENCY.REPEAT, - MSG = { ID = "DestroyGroup", TIME = 10 }, - Name = "GroupsDestroyed" -} - -function STAGEGROUPSDESTROYED:New() - local self = BASE:Inherit( self, STAGE:New() ) - self:F() - self.StageType = 'AI' - return self -end - ---function STAGEGROUPSDESTROYED:Execute( Mission, Client, Task ) --- --- Client:Message( 'Task: Still ' .. DestroyGroupSize .. " of " .. Task.DestroyGroupCount .. " " .. Task.DestroyGroupType .. " to be destroyed!", self.MSG.TIME, Mission.Name .. "/Stage" ) --- ---end - -function STAGEGROUPSDESTROYED:Validate( Mission, Client, Task ) - self:F() - - if Task.MissionTask:IsGoalReached() then - return 1 - else - return 0 - end -end - -function STAGEGROUPSDESTROYED:Execute( Mission, Client, Task ) - self:F() - self:T( { Task.ClassName, Task.Destroyed } ) - --env.info( 'Event Table Task = ' .. tostring(Task) ) - -end - - - - - - - - - - - - - ---[[ - _TransportStage: Defines the different stages of which of transport missions can be in. This table is internal and is used to control the sequence of messages, actions and flow. - - - _TransportStage.START - - _TransportStage.ROUTE - - _TransportStage.LAND - - _TransportStage.EXECUTE - - _TransportStage.DONE - - _TransportStage.REMOVE ---]] -_TransportStage = { - HOLD = "HOLD", - START = "START", - ROUTE = "ROUTE", - LANDING = "LANDING", - LANDED = "LANDED", - EXECUTING = "EXECUTING", - LOAD = "LOAD", - UNLOAD = "UNLOAD", - DONE = "DONE", - NEXT = "NEXT" -} - -_TransportStageMsgTime = { - HOLD = 10, - START = 60, - ROUTE = 5, - LANDING = 10, - LANDED = 30, - EXECUTING = 30, - LOAD = 30, - UNLOAD = 30, - DONE = 30, - NEXT = 0 -} - -_TransportStageTime = { - HOLD = 10, - START = 5, - ROUTE = 5, - LANDING = 1, - LANDED = 1, - EXECUTING = 5, - LOAD = 5, - UNLOAD = 5, - DONE = 1, - NEXT = 0 -} - -_TransportStageAction = { - REPEAT = -1, - NONE = 0, - ONCE = 1 -} ---- The TASK Classes define major end-to-end activities within a MISSION. The TASK Class is the Master Class to orchestrate these activities. From this class, many concrete TASK classes are inherited. --- @module TASK - -Include.File( "Routines" ) -Include.File( "Base" ) -Include.File( "Mission" ) -Include.File( "Client" ) -Include.File( "Stage" ) - ---- The TASK class --- @type TASK --- @extends Base#BASE -TASK = { - - -- Defines the different signal types with a Task. - SIGNAL = { - COLOR = { - RED = { ID = 1, COLOR = trigger.smokeColor.Red, TEXT = "A red" }, - GREEN = { ID = 2, COLOR = trigger.smokeColor.Green, TEXT = "A green" }, - BLUE = { ID = 3, COLOR = trigger.smokeColor.Blue, TEXT = "A blue" }, - WHITE = { ID = 4, COLOR = trigger.smokeColor.White, TEXT = "A white" }, - ORANGE = { ID = 5, COLOR = trigger.smokeColor.Orange, TEXT = "An orange" } - }, - TYPE = { - SMOKE = { ID = 1, TEXT = "smoke" }, - FLARE = { ID = 2, TEXT = "flare" } - } - }, - ClassName = "TASK", - Mission = {}, -- Owning mission of the Task - Name = '', - Stages = {}, - Stage = {}, - Cargos = { - InitCargos = {}, - LoadCargos = {} - }, - LandingZones = { - LandingZoneNames = {}, - LandingZones = {} - }, - ActiveStage = 0, - TaskDone = false, - TaskFailed = false, - GoalTasks = {} -} - ---- Instantiates a new TASK Base. Should never be used. Interface Class. --- @return TASK -function TASK:New() - local self = BASE:Inherit( self, BASE:New() ) - self:F() - - -- assign Task default values during construction - self.TaskBriefing = "Task: No Task." - self.Time = timer.getTime() - self.ExecuteStage = _TransportExecuteStage.NONE - - return self -end - -function TASK:SetStage( StageSequenceIncrement ) - self:F( { StageSequenceIncrement } ) - - local Valid = false - if StageSequenceIncrement ~= 0 then - self.ActiveStage = self.ActiveStage + StageSequenceIncrement - if 1 <= self.ActiveStage and self.ActiveStage <= #self.Stages then - self.Stage = self.Stages[self.ActiveStage] - self:T( { self.Stage.Name } ) - self.Frequency = self.Stage.Frequency - Valid = true - else - Valid = false - env.info( "TASK:SetStage() self.ActiveStage is smaller or larger than self.Stages array. self.ActiveStage = " .. self.ActiveStage ) - end - end - self.Time = timer.getTime() - return Valid -end - -function TASK:Init() - self:F() - self.ActiveStage = 0 - self:SetStage(1) - self.TaskDone = false - self.TaskFailed = false -end - - ---- Get progress of a TASK. --- @return string GoalsText -function TASK:GetGoalProgress() - self:F2() - - local GoalsText = "" - for GoalVerb, GoalVerbData in pairs( self.GoalTasks ) do - local Goals = self:GetGoalCompletion( GoalVerb ) - if Goals and Goals ~= "" then - Goals = '(' .. Goals .. ')' - else - Goals = '( - )' - end - GoalsText = GoalsText .. GoalVerb .. ': ' .. self:GetGoalCount(GoalVerb) .. ' goals ' .. Goals .. ' of ' .. self:GetGoalTotal(GoalVerb) .. ' goals completed (' .. self:GetGoalPercentage(GoalVerb) .. '%); ' - end - - if GoalsText == "" then - GoalsText = "( - )" - end - - return GoalsText -end - ---- Show progress of a TASK. --- @param MISSION Mission Group structure describing the Mission. --- @param CLIENT Client Group structure describing the Client. -function TASK:ShowGoalProgress( Mission, Client ) - self:F2() - - local GoalsText = "" - for GoalVerb, GoalVerbData in pairs( self.GoalTasks ) do - if Mission:IsCompleted() then - else - local Goals = self:GetGoalCompletion( GoalVerb ) - if Goals and Goals ~= "" then - else - Goals = "-" - end - GoalsText = GoalsText .. self:GetGoalProgress() - end - end - - if Mission.MissionReportFlash or Mission.MissionReportShow then - Client:Message( GoalsText, 10, "/TASKPROGRESS" .. self.ClassName, "Mission Command: Task Status", 30 ) - end -end - ---- Sets a TASK to status Done. -function TASK:Done() - self:F2() - self.TaskDone = true -end - ---- Returns if a TASK is done. --- @return bool -function TASK:IsDone() - self:F2( self.TaskDone ) - return self.TaskDone -end - ---- Sets a TASK to status failed. -function TASK:Failed() - self:F() - self.TaskFailed = true -end - ---- Returns if a TASk has failed. --- @return bool -function TASK:IsFailed() - self:F2( self.TaskFailed ) - return self.TaskFailed -end - -function TASK:Reset( Mission, Client ) - self:F2() - self.ExecuteStage = _TransportExecuteStage.NONE -end - ---- Returns the Goals of a TASK --- @return @table Goals -function TASK:GetGoals() - return self.GoalTasks -end - ---- Returns if a TASK has Goal(s). --- @param #TASK self --- @param #string GoalVerb is the name of the Goal of the TASK. --- @return bool -function TASK:Goal( GoalVerb ) - self:F2( { GoalVerb } ) - if not GoalVerb then - GoalVerb = self.GoalVerb - end - self:T2( {self.GoalTasks[GoalVerb] } ) - if self.GoalTasks[GoalVerb] and self.GoalTasks[GoalVerb].GoalTotal > 0 then - return true - else - return false - end -end - ---- Sets the total Goals to be achieved of the Goal Name --- @param number GoalTotal is the number of times the GoalVerb needs to be achieved. --- @param ?string GoalVerb is the name of the Goal of the TASK. If the GoalVerb is not given, then the default TASK Goals will be used. -function TASK:SetGoalTotal( GoalTotal, GoalVerb ) - self:F2( { GoalTotal, GoalVerb } ) - - if not GoalVerb then - GoalVerb = self.GoalVerb - end - self.GoalTasks[GoalVerb] = {} - self.GoalTasks[GoalVerb].Goals = {} - self.GoalTasks[GoalVerb].GoalTotal = GoalTotal - self.GoalTasks[GoalVerb].GoalCount = 0 - return self -end - ---- Gets the total of Goals to be achieved within the TASK of the GoalVerb. --- @param ?string GoalVerb is the name of the Goal of the TASK. If the GoalVerb is not given, then the default TASK Goals will be used. -function TASK:GetGoalTotal( GoalVerb ) - self:F2( { GoalVerb } ) - if not GoalVerb then - GoalVerb = self.GoalVerb - end - if self:Goal( GoalVerb ) then - return self.GoalTasks[GoalVerb].GoalTotal - else - return 0 - end -end - ---- Sets the total of Goals currently achieved within the TASK of the GoalVerb. --- @param number GoalCount is the total number of Goals achieved within the TASK. --- @param ?string GoalVerb is the name of the Goal of the TASK. If the GoalVerb is not given, then the default TASK Goals will be used. --- @return TASK -function TASK:SetGoalCount( GoalCount, GoalVerb ) - self:F2() - if not GoalVerb then - GoalVerb = self.GoalVerb - end - if self:Goal( GoalVerb) then - self.GoalTasks[GoalVerb].GoalCount = GoalCount - end - return self -end - ---- Increments the total of Goals currently achieved within the TASK of the GoalVerb, with the given GoalCountIncrease. --- @param number GoalCountIncrease is the number of new Goals achieved within the TASK. --- @param ?string GoalVerb is the name of the Goal of the TASK. If the GoalVerb is not given, then the default TASK Goals will be used. --- @return TASK -function TASK:IncreaseGoalCount( GoalCountIncrease, GoalVerb ) - self:F2( { GoalCountIncrease, GoalVerb } ) - if not GoalVerb then - GoalVerb = self.GoalVerb - end - if self:Goal( GoalVerb) then - self.GoalTasks[GoalVerb].GoalCount = self.GoalTasks[GoalVerb].GoalCount + GoalCountIncrease - end - return self -end - ---- Gets the total of Goals currently achieved within the TASK of the GoalVerb. --- @param ?string GoalVerb is the name of the Goal of the TASK. If the GoalVerb is not given, then the default TASK Goals will be used. --- @return TASK -function TASK:GetGoalCount( GoalVerb ) - self:F2() - if not GoalVerb then - GoalVerb = self.GoalVerb - end - if self:Goal( GoalVerb ) then - return self.GoalTasks[GoalVerb].GoalCount - else - return 0 - end -end - ---- Gets the percentage of Goals currently achieved within the TASK of the GoalVerb. --- @param ?string GoalVerb is the name of the Goal of the TASK. If the GoalVerb is not given, then the default TASK Goals will be used. --- @return TASK -function TASK:GetGoalPercentage( GoalVerb ) - self:F2() - if not GoalVerb then - GoalVerb = self.GoalVerb - end - if self:Goal( GoalVerb ) then - return math.floor( self:GetGoalCount( GoalVerb ) / self:GetGoalTotal( GoalVerb ) * 100 + .5 ) - else - return 100 - end -end - ---- Returns if all the Goals of the TASK were achieved. --- @return bool -function TASK:IsGoalReached() - self:F2() - - local GoalReached = true - - for GoalVerb, Goals in pairs( self.GoalTasks ) do - self:T2( { "GoalVerb", GoalVerb } ) - if self:Goal( GoalVerb ) then - local GoalToDo = self:GetGoalTotal( GoalVerb ) - self:GetGoalCount( GoalVerb ) - self:T2( "GoalToDo = " .. GoalToDo ) - if GoalToDo <= 0 then - else - GoalReached = false - break - end - else - break - end - end - - self:T( { GoalReached, self.GoalTasks } ) - return GoalReached -end - ---- Adds an Additional Goal for the TASK to be achieved. --- @param string GoalVerb is the name of the Goal of the TASK. --- @param string GoalTask is a text describing the Goal of the TASK to be achieved. --- @param number GoalIncrease is a number by which the Goal achievement is increasing. -function TASK:AddGoalCompletion( GoalVerb, GoalTask, GoalIncrease ) - self:F2( { GoalVerb, GoalTask, GoalIncrease } ) - - if self:Goal( GoalVerb ) then - self.GoalTasks[GoalVerb].Goals[#self.GoalTasks[GoalVerb].Goals+1] = GoalTask - self.GoalTasks[GoalVerb].GoalCount = self.GoalTasks[GoalVerb].GoalCount + GoalIncrease - end - return self -end - ---- Returns if the additional Goal for the TASK was completed. --- @param ?string GoalVerb is the name of the Goal of the TASK. If the GoalVerb is not given, then the default TASK Goals will be used. --- @return string Goals -function TASK:GetGoalCompletion( GoalVerb ) - self:F2( { GoalVerb } ) - - if self:Goal( GoalVerb ) then - local Goals = "" - for GoalID, GoalName in pairs( self.GoalTasks[GoalVerb].Goals ) do Goals = Goals .. GoalName .. " + " end - return Goals:gsub(" + $", ""), self.GoalTasks[GoalVerb].GoalCount - end -end - -function TASK.MenuAction( Parameter ) - Parameter.ReferenceTask.ExecuteStage = _TransportExecuteStage.EXECUTING - Parameter.ReferenceTask.Cargo = Parameter.CargoTask -end - -function TASK:StageExecute() - self:F() - - local Execute = false - - if self.Frequency == STAGE.FREQUENCY.REPEAT then - Execute = true - elseif self.Frequency == STAGE.FREQUENCY.NONE then - Execute = false - elseif self.Frequency >= 0 then - Execute = true - self.Frequency = self.Frequency - 1 - end - - return Execute - -end - ---- Work function to set signal events within a TASK. -function TASK:AddSignal( SignalUnitNames, SignalType, SignalColor, SignalHeight ) - self:F() - - local Valid = true - - if Valid then - if type( SignalUnitNames ) == "table" then - self.LandingZoneSignalUnitNames = SignalUnitNames - else - self.LandingZoneSignalUnitNames = { SignalUnitNames } - end - self.LandingZoneSignalType = SignalType - self.LandingZoneSignalColor = SignalColor - self.Signalled = false - if SignalHeight ~= nil then - self.LandingZoneSignalHeight = SignalHeight - else - self.LandingZoneSignalHeight = 0 - end - - if self.TaskBriefing then - self.TaskBriefing = self.TaskBriefing .. " " .. SignalColor.TEXT .. " " .. SignalType.TEXT .. " will be fired when entering the landing zone." - end - end - - return Valid -end - ---- When the CLIENT is approaching the landing zone, a RED SMOKE will be fired by an optional SignalUnitNames. --- @param table|string SignalUnitNames Name of the Group that will fire the signal. If this parameter is NIL, the signal will be fired from the center of the landing zone. --- @param number SignalHeight Altitude that the Signal should be fired... -function TASK:AddSmokeRed( SignalUnitNames, SignalHeight ) - self:F() - self:AddSignal( SignalUnitNames, TASK.SIGNAL.TYPE.SMOKE, TASK.SIGNAL.COLOR.RED, SignalHeight ) -end - ---- When the CLIENT is approaching the landing zone, a GREEN SMOKE will be fired by an optional SignalUnitNames. --- @param table|string SignalUnitNames Name of the Group that will fire the signal. If this parameter is NIL, the signal will be fired from the center of the landing zone. --- @param number SignalHeight Altitude that the Signal should be fired... -function TASK:AddSmokeGreen( SignalUnitNames, SignalHeight ) - self:F() - self:AddSignal( SignalUnitNames, TASK.SIGNAL.TYPE.SMOKE, TASK.SIGNAL.COLOR.GREEN, SignalHeight ) -end - ---- When the CLIENT is approaching the landing zone, a BLUE SMOKE will be fired by an optional SignalUnitNames. --- @param table|string SignalUnitNames Name of the Group that will fire the signal. If this parameter is NIL, the signal will be fired from the center of the landing zone. --- @param number SignalHeight Altitude that the Signal should be fired... -function TASK:AddSmokeBlue( SignalUnitNames, SignalHeight ) - self:F() - self:AddSignal( SignalUnitNames, TASK.SIGNAL.TYPE.SMOKE, TASK.SIGNAL.COLOR.BLUE, SignalHeight ) -end - ---- When the CLIENT is approaching the landing zone, a WHITE SMOKE will be fired by an optional SignalUnitNames. --- @param table|string SignalUnitNames Name of the Group that will fire the signal. If this parameter is NIL, the signal will be fired from the center of the landing zone. --- @param number SignalHeight Altitude that the Signal should be fired... -function TASK:AddSmokeWhite( SignalUnitNames, SignalHeight ) - self:F() - self:AddSignal( SignalUnitNames, TASK.SIGNAL.TYPE.SMOKE, TASK.SIGNAL.COLOR.WHITE, SignalHeight ) -end - ---- When the CLIENT is approaching the landing zone, an ORANGE SMOKE will be fired by an optional SignalUnitNames. --- @param table|string SignalUnitNames Name of the Group that will fire the signal. If this parameter is NIL, the signal will be fired from the center of the landing zone. --- @param number SignalHeight Altitude that the Signal should be fired... -function TASK:AddSmokeOrange( SignalUnitNames, SignalHeight ) - self:F() - self:AddSignal( SignalUnitNames, TASK.SIGNAL.TYPE.SMOKE, TASK.SIGNAL.COLOR.ORANGE, SignalHeight ) -end - ---- When the CLIENT is approaching the landing zone, a RED FLARE will be fired by an optional SignalUnitNames. --- @param table|string SignalUnitNames Name of the Group that will fire the signal. If this parameter is NIL, the signal will be fired from the center of the landing zone. --- @param number SignalHeight Altitude that the Signal should be fired... -function TASK:AddFlareRed( SignalUnitNames, SignalHeight ) - self:F() - self:AddSignal( SignalUnitNames, TASK.SIGNAL.TYPE.FLARE, TASK.SIGNAL.COLOR.RED, SignalHeight ) -end - ---- When the CLIENT is approaching the landing zone, a GREEN FLARE will be fired by an optional SignalUnitNames. --- @param table|string SignalUnitNames Name of the Group that will fire the signal. If this parameter is NIL, the signal will be fired from the center of the landing zone. --- @param number SignalHeight Altitude that the Signal should be fired... -function TASK:AddFlareGreen( SignalUnitNames, SignalHeight ) - self:F() - self:AddSignal( SignalUnitNames, TASK.SIGNAL.TYPE.FLARE, TASK.SIGNAL.COLOR.GREEN, SignalHeight ) -end - ---- When the CLIENT is approaching the landing zone, a BLUE FLARE will be fired by an optional SignalUnitNames. --- @param table|string SignalUnitNames Name of the Group that will fire the signal. If this parameter is NIL, the signal will be fired from the center of the landing zone. --- @param number SignalHeight Altitude that the Signal should be fired... -function TASK:AddFlareBlue( SignalUnitNames, SignalHeight ) - self:F() - self:AddSignal( SignalUnitNames, TASK.SIGNAL.TYPE.FLARE, TASK.SIGNAL.COLOR.BLUE, SignalHeight ) -end - ---- When the CLIENT is approaching the landing zone, a WHITE FLARE will be fired by an optional SignalUnitNames. --- @param table|string SignalUnitNames Name of the Group that will fire the signal. If this parameter is NIL, the signal will be fired from the center of the landing zone. --- @param number SignalHeight Altitude that the Signal should be fired... -function TASK:AddFlareWhite( SignalUnitNames, SignalHeight ) - self:F() - self:AddSignal( SignalUnitNames, TASK.SIGNAL.TYPE.FLARE, TASK.SIGNAL.COLOR.WHITE, SignalHeight ) -end - ---- When the CLIENT is approaching the landing zone, an ORANGE FLARE will be fired by an optional SignalUnitNames. --- @param table|string SignalUnitNames Name of the Group that will fire the signal. If this parameter is NIL, the signal will be fired from the center of the landing zone. --- @param number SignalHeight Altitude that the Signal should be fired... -function TASK:AddFlareOrange( SignalUnitNames, SignalHeight ) - self:F() - self:AddSignal( SignalUnitNames, TASK.SIGNAL.TYPE.FLARE, TASK.SIGNAL.COLOR.ORANGE, SignalHeight ) -end ---- A GOHOMETASK orchestrates the travel back to the home base, which is a specific zone defined within the ME. --- @module GOHOMETASK - -Include.File("Task") - ---- The GOHOMETASK class --- @type -GOHOMETASK = { - ClassName = "GOHOMETASK", -} - ---- Creates a new GOHOMETASK. --- @param table{string,...}|string LandingZones Table of Landing Zone names where Home(s) are located. --- @return GOHOMETASK -function GOHOMETASK:New( LandingZones ) - local self = BASE:Inherit( self, TASK:New() ) - self:F( { LandingZones } ) - local Valid = true - - Valid = routines.ValidateZone( LandingZones, "LandingZones", Valid ) - - if Valid then - self.Name = 'Fly Home' - self.TaskBriefing = "Task: Fly back to your home base. Your co-pilot will provide you with the directions (required flight angle in degrees) and the distance (in km) to your home base." - if type( LandingZones ) == "table" then - self.LandingZones = LandingZones - else - self.LandingZones = { LandingZones } - end - self.Stages = { STAGEBRIEF:New(), STAGESTART:New(), STAGEROUTE:New(), STAGEARRIVE:New(), STAGEDONE:New() } - self.SetStage( self, 1 ) - end - - return self -end ---- A DESTROYBASETASK will monitor the destruction of Groups and Units. This is a BASE class, other classes are derived from this class. --- @module DESTROYBASETASK --- @see DESTROYGROUPSTASK --- @see DESTROYUNITTYPESTASK --- @see DESTROY_RADARS_TASK - -Include.File("Task") - ---- The DESTROYBASETASK class --- @type DESTROYBASETASK -DESTROYBASETASK = { - ClassName = "DESTROYBASETASK", - Destroyed = 0, - GoalVerb = "Destroy", - DestroyPercentage = 100, -} - ---- Creates a new DESTROYBASETASK. --- @param #DESTROYBASETASK self --- @param #string DestroyGroupType Text describing the group to be destroyed. f.e. "Radar Installations", "Ships", "Vehicles", "Command Centers". --- @param #string DestroyUnitType Text describing the unit types to be destroyed. f.e. "SA-6", "Row Boats", "Tanks", "Tents". --- @param #list<#string> DestroyGroupPrefixes Table of Prefixes of the Groups to be destroyed before task is completed. --- @param #number DestroyPercentage defines the %-tage that needs to be destroyed to achieve mission success. eg. If in the Group there are 10 units, then a value of 75 would require 8 units to be destroyed from the Group to complete the @{TASK}. --- @return DESTROYBASETASK -function DESTROYBASETASK:New( DestroyGroupType, DestroyUnitType, DestroyGroupPrefixes, DestroyPercentage ) - local self = BASE:Inherit( self, TASK:New() ) - self:F() - - self.Name = 'Destroy' - self.Destroyed = 0 - self.DestroyGroupPrefixes = DestroyGroupPrefixes - self.DestroyGroupType = DestroyGroupType - self.DestroyUnitType = DestroyUnitType - if DestroyPercentage then - self.DestroyPercentage = DestroyPercentage - end - self.TaskBriefing = "Task: Destroy " .. DestroyGroupType .. "." - self.Stages = { STAGEBRIEF:New(), STAGESTART:New(), STAGEGROUPSDESTROYED:New(), STAGEDONE:New() } - self.SetStage( self, 1 ) - - return self -end - ---- Handle the S_EVENT_DEAD events to validate the destruction of units for the task monitoring. --- @param #DESTROYBASETASK self --- @param Event#EVENTDATA Event structure of MOOSE. -function DESTROYBASETASK:EventDead( Event ) - self:F( { Event } ) - - if Event.IniDCSUnit then - local DestroyUnit = Event.IniDCSUnit - local DestroyUnitName = Event.IniDCSUnitName - local DestroyGroup = Event.IniDCSGroup - local DestroyGroupName = Event.IniDCSGroupName - - --TODO: I need to fix here if 2 groups in the mission have a similar name with GroupPrefix equal, then i should differentiate for which group the goal was reached! - --I may need to test if for the goalverb that group goal was reached or something. Need to think about it a bit more ... - local UnitsDestroyed = 0 - for DestroyGroupPrefixID, DestroyGroupPrefix in pairs( self.DestroyGroupPrefixes ) do - self:T( DestroyGroupPrefix ) - if string.find( DestroyGroupName, DestroyGroupPrefix, 1, true ) then - self:T( BASE:Inherited(self).ClassName ) - UnitsDestroyed = self:ReportGoalProgress( DestroyGroup, DestroyUnit ) - self:T( UnitsDestroyed ) - end - end - - self:T( { UnitsDestroyed } ) - self:IncreaseGoalCount( UnitsDestroyed, self.GoalVerb ) - end - -end - ---- Validate task completeness of DESTROYBASETASK. --- @param DestroyGroup Group structure describing the group to be evaluated. --- @param DestroyUnit Unit structure describing the Unit to be evaluated. -function DESTROYBASETASK:ReportGoalProgress( DestroyGroup, DestroyUnit ) - self:F() - - return 0 -end ---- DESTROYGROUPSTASK --- @module DESTROYGROUPSTASK - -Include.File("DestroyBaseTask") - ---- The DESTROYGROUPSTASK class --- @type -DESTROYGROUPSTASK = { - ClassName = "DESTROYGROUPSTASK", - GoalVerb = "Destroy Groups", -} - ---- Creates a new DESTROYGROUPSTASK. --- @param #DESTROYGROUPSTASK self --- @param #string DestroyGroupType String describing the group to be destroyed. --- @param #string DestroyUnitType String describing the unit to be destroyed. --- @param #list<#string> DestroyGroupNames Table of string containing the name of the groups to be destroyed before task is completed. --- @param #number DestroyPercentage defines the %-tage that needs to be destroyed to achieve mission success. eg. If in the Group there are 10 units, then a value of 75 would require 8 units to be destroyed from the Group to complete the @{TASK}. ----@return DESTROYGROUPSTASK -function DESTROYGROUPSTASK:New( DestroyGroupType, DestroyUnitType, DestroyGroupNames, DestroyPercentage ) - local self = BASE:Inherit( self, DESTROYBASETASK:New( DestroyGroupType, DestroyUnitType, DestroyGroupNames, DestroyPercentage ) ) - self:F() - - self.Name = 'Destroy Groups' - self.GoalVerb = "Destroy " .. DestroyGroupType - - _EVENTDISPATCHER:OnDead( self.EventDead , self ) - _EVENTDISPATCHER:OnCrash( self.EventDead , self ) - - return self -end - ---- Report Goal Progress. --- @param #DESTROYGROUPSTASK self --- @param DCSGroup#Group DestroyGroup Group structure describing the group to be evaluated. --- @param DCSUnit#Unit DestroyUnit Unit structure describing the Unit to be evaluated. --- @return #number The DestroyCount reflecting the amount of units destroyed within the group. -function DESTROYGROUPSTASK:ReportGoalProgress( DestroyGroup, DestroyUnit ) - self:F( { DestroyGroup, DestroyUnit, self.DestroyPercentage } ) - - local DestroyGroupSize = DestroyGroup:getSize() - 1 -- When a DEAD event occurs, the getSize is still one larger than the destroyed unit. - local DestroyGroupInitialSize = DestroyGroup:getInitialSize() - self:T( { DestroyGroupSize, DestroyGroupInitialSize - ( DestroyGroupInitialSize * self.DestroyPercentage / 100 ) } ) - - local DestroyCount = 0 - if DestroyGroup then - if DestroyGroupSize <= DestroyGroupInitialSize - ( DestroyGroupInitialSize * self.DestroyPercentage / 100 ) then - DestroyCount = 1 - end - else - DestroyCount = 1 - end - - self:T( DestroyCount ) - - return DestroyCount -end ---- Task class to destroy radar installations. --- @module DESTROYRADARSTASK - -Include.File("DestroyBaseTask") - ---- The DESTROYRADARS class --- @type -DESTROYRADARSTASK = { - ClassName = "DESTROYRADARSTASK", - GoalVerb = "Destroy Radars" -} - ---- Creates a new DESTROYRADARSTASK. --- @param table{string,...} DestroyGroupNames Table of string containing the group names of which the radars are be destroyed. --- @return DESTROYRADARSTASK -function DESTROYRADARSTASK:New( DestroyGroupNames ) - local self = BASE:Inherit( self, DESTROYGROUPSTASK:New( 'radar installations', 'radars', DestroyGroupNames ) ) - self:F() - - self.Name = 'Destroy Radars' - - _EVENTDISPATCHER:OnDead( self.EventDead , self ) - - return self -end - ---- Report Goal Progress. --- @param Group DestroyGroup Group structure describing the group to be evaluated. --- @param Unit DestroyUnit Unit structure describing the Unit to be evaluated. -function DESTROYRADARSTASK:ReportGoalProgress( DestroyGroup, DestroyUnit ) - self:F( { DestroyGroup, DestroyUnit } ) - - local DestroyCount = 0 - if DestroyUnit and DestroyUnit:hasSensors( Unit.SensorType.RADAR, Unit.RadarType.AS ) then - if DestroyUnit and DestroyUnit:getLife() <= 1.0 then - self:T( 'Destroyed a radar' ) - DestroyCount = 1 - end - end - return DestroyCount -end ---- Set TASK to destroy certain unit types. --- @module DESTROYUNITTYPESTASK - -Include.File("DestroyBaseTask") - ---- The DESTROYUNITTYPESTASK class --- @type -DESTROYUNITTYPESTASK = { - ClassName = "DESTROYUNITTYPESTASK", - GoalVerb = "Destroy", -} - ---- Creates a new DESTROYUNITTYPESTASK. --- @param string DestroyGroupType String describing the group to be destroyed. f.e. "Radar Installations", "Fleet", "Batallion", "Command Centers". --- @param string DestroyUnitType String describing the unit to be destroyed. f.e. "radars", "ships", "tanks", "centers". --- @param table{string,...} DestroyGroupNames Table of string containing the group names of which the radars are be destroyed. --- @param string DestroyUnitTypes Table of string containing the type names of the units to achieve mission success. --- @return DESTROYUNITTYPESTASK -function DESTROYUNITTYPESTASK:New( DestroyGroupType, DestroyUnitType, DestroyGroupNames, DestroyUnitTypes ) - local self = BASE:Inherit( self, DESTROYBASETASK:New( DestroyGroupType, DestroyUnitType, DestroyGroupNames ) ) - self:F( { DestroyGroupType, DestroyUnitType, DestroyGroupNames, DestroyUnitTypes } ) - - if type(DestroyUnitTypes) == 'table' then - self.DestroyUnitTypes = DestroyUnitTypes - else - self.DestroyUnitTypes = { DestroyUnitTypes } - end - - self.Name = 'Destroy Unit Types' - self.GoalVerb = "Destroy " .. DestroyGroupType - - _EVENTDISPATCHER:OnDead( self.EventDead , self ) - - return self -end - ---- Report Goal Progress. --- @param Group DestroyGroup Group structure describing the group to be evaluated. --- @param Unit DestroyUnit Unit structure describing the Unit to be evaluated. -function DESTROYUNITTYPESTASK:ReportGoalProgress( DestroyGroup, DestroyUnit ) - self:F( { DestroyGroup, DestroyUnit } ) - - local DestroyCount = 0 - for UnitTypeID, UnitType in pairs( self.DestroyUnitTypes ) do - if DestroyUnit and DestroyUnit:getTypeName() == UnitType then - if DestroyUnit and DestroyUnit:getLife() <= 1.0 then - DestroyCount = DestroyCount + 1 - end - end - end - return DestroyCount -end ---- A PICKUPTASK orchestrates the loading of CARGO at a specific landing zone. --- @module PICKUPTASK --- @parent TASK - -Include.File("Task") -Include.File("Cargo") - ---- The PICKUPTASK class --- @type -PICKUPTASK = { - ClassName = "PICKUPTASK", - TEXT = { "Pick-Up", "picked-up", "loaded" }, - GoalVerb = "Pick-Up" -} - ---- Creates a new PICKUPTASK. --- @param table{string,...}|string LandingZones Table of Zone names where Cargo is to be loaded. --- @param CARGO_TYPE CargoType Type of the Cargo. The type must be of the following Enumeration:.. --- @param number OnBoardSide Reflects from which side the cargo Group will be on-boarded on the Carrier. -function PICKUPTASK:New( CargoType, OnBoardSide ) - local self = BASE:Inherit( self, TASK:New() ) - self:F() - - -- self holds the inherited instance of the PICKUPTASK Class to the BASE class. - - local Valid = true - - if Valid then - self.Name = 'Pickup Cargo' - self.TaskBriefing = "Task: Fly to the indicated landing zones and pickup " .. CargoType .. ". Your co-pilot will provide you with the directions (required flight angle in degrees) and the distance (in km) to the pickup zone." - self.CargoType = CargoType - self.GoalVerb = CargoType .. " " .. self.GoalVerb - self.OnBoardSide = OnBoardSide - self.IsLandingRequired = true -- required to decide whether the client needs to land or not - self.IsSlingLoad = false -- Indicates whether the cargo is a sling load cargo - self.Stages = { STAGE_CARGO_INIT:New(), STAGE_CARGO_LOAD:New(), STAGEBRIEF:New(), STAGESTART:New(), STAGEROUTE:New(), STAGELANDING:New(), STAGELANDED:New(), STAGELOAD:New(), STAGEDONE:New() } - self.SetStage( self, 1 ) - end - - return self -end - -function PICKUPTASK:FromZone( LandingZone ) - self:F() - - self.LandingZones.LandingZoneNames[LandingZone.CargoZoneName] = LandingZone.CargoZoneName - self.LandingZones.LandingZones[LandingZone.CargoZoneName] = LandingZone - - return self -end - -function PICKUPTASK:InitCargo( InitCargos ) - self:F( { InitCargos } ) - - if type( InitCargos ) == "table" then - self.Cargos.InitCargos = InitCargos - else - self.Cargos.InitCargos = { InitCargos } - end - - return self -end - -function PICKUPTASK:LoadCargo( LoadCargos ) - self:F( { LoadCargos } ) - - if type( LoadCargos ) == "table" then - self.Cargos.LoadCargos = LoadCargos - else - self.Cargos.LoadCargos = { LoadCargos } - end - - return self -end - -function PICKUPTASK:AddCargoMenus( Client, Cargos, TransportRadius ) - self:F() - - for CargoID, Cargo in pairs( Cargos ) do - - self:T( { Cargo.ClassName, Cargo.CargoName, Cargo.CargoType, Cargo:IsStatusNone(), Cargo:IsStatusLoaded(), Cargo:IsStatusLoading(), Cargo:IsStatusUnLoaded() } ) - - -- If the Cargo has no status, allow the menu option. - if Cargo:IsStatusNone() or ( Cargo:IsStatusLoading() and Client == Cargo:IsLoadingToClient() ) then - - local MenuAdd = false - if Cargo:IsNear( Client, self.CurrentCargoZone ) then - MenuAdd = true - end - - if MenuAdd then - if Client._Menus[Cargo.CargoType] == nil then - Client._Menus[Cargo.CargoType] = {} - end - - if not Client._Menus[Cargo.CargoType].PickupMenu then - Client._Menus[Cargo.CargoType].PickupMenu = missionCommands.addSubMenuForGroup( - Client:GetClientGroupID(), - self.TEXT[1] .. " " .. Cargo.CargoType, - nil - ) - self:T( 'Added PickupMenu: ' .. self.TEXT[1] .. " " .. Cargo.CargoType ) - end - - if Client._Menus[Cargo.CargoType].PickupSubMenus == nil then - Client._Menus[Cargo.CargoType].PickupSubMenus = {} - end - - Client._Menus[Cargo.CargoType].PickupSubMenus[ #Client._Menus[Cargo.CargoType].PickupSubMenus + 1 ] = missionCommands.addCommandForGroup( - Client:GetClientGroupID(), - Cargo.CargoName .. " ( " .. Cargo.CargoWeight .. "kg )", - Client._Menus[Cargo.CargoType].PickupMenu, - self.MenuAction, - { ReferenceTask = self, CargoTask = Cargo } - ) - self:T( 'Added PickupSubMenu' .. Cargo.CargoType .. ":" .. Cargo.CargoName .. " ( " .. Cargo.CargoWeight .. "kg )" ) - end - end - end - -end - -function PICKUPTASK:RemoveCargoMenus( Client ) - self:F() - - for MenuID, MenuData in pairs( Client._Menus ) do - for SubMenuID, SubMenuData in pairs( MenuData.PickupSubMenus ) do - missionCommands.removeItemForGroup( Client:GetClientGroupID(), SubMenuData ) - self:T( "Removed PickupSubMenu " ) - SubMenuData = nil - end - if MenuData.PickupMenu then - missionCommands.removeItemForGroup( Client:GetClientGroupID(), MenuData.PickupMenu ) - self:T( "Removed PickupMenu " ) - MenuData.PickupMenu = nil - end - end - - for CargoID, Cargo in pairs( CARGOS ) do - self:T( { Cargo.ClassName, Cargo.CargoName, Cargo.CargoType, Cargo:IsStatusNone(), Cargo:IsStatusLoaded(), Cargo:IsStatusLoading(), Cargo:IsStatusUnLoaded() } ) - if Cargo:IsStatusLoading() and Client == Cargo:IsLoadingToClient() then - Cargo:StatusNone() - end - end - -end - - - -function PICKUPTASK:HasFailed( ClientDead ) - self:F() - - local TaskHasFailed = self.TaskFailed - return TaskHasFailed -end - ---- A DEPLOYTASK orchestrates the deployment of CARGO within a specific landing zone. --- @module DEPLOYTASK - -Include.File( "Task" ) - ---- A DeployTask --- @type DEPLOYTASK -DEPLOYTASK = { - ClassName = "DEPLOYTASK", - TEXT = { "Deploy", "deployed", "unloaded" }, - GoalVerb = "Deployment" -} - - ---- Creates a new DEPLOYTASK object, which models the sequence of STAGEs to unload a cargo. --- @function [parent=#DEPLOYTASK] New --- @param #string CargoType Type of the Cargo. --- @return #DEPLOYTASK The created DeployTask -function DEPLOYTASK:New( CargoType ) - local self = BASE:Inherit( self, TASK:New() ) - self:F() - - local Valid = true - - if Valid then - self.Name = 'Deploy Cargo' - self.TaskBriefing = "Fly to one of the indicated landing zones and deploy " .. CargoType .. ". Your co-pilot will provide you with the directions (required flight angle in degrees) and the distance (in km) to the deployment zone." - self.CargoType = CargoType - self.GoalVerb = CargoType .. " " .. self.GoalVerb - self.Stages = { STAGE_CARGO_INIT:New(), STAGE_CARGO_LOAD:New(), STAGEBRIEF:New(), STAGESTART:New(), STAGEROUTE:New(), STAGELANDING:New(), STAGELANDED:New(), STAGEUNLOAD:New(), STAGEDONE:New() } - self.SetStage( self, 1 ) - end - - return self -end - -function DEPLOYTASK:ToZone( LandingZone ) - self:F() - - self.LandingZones.LandingZoneNames[LandingZone.CargoZoneName] = LandingZone.CargoZoneName - self.LandingZones.LandingZones[LandingZone.CargoZoneName] = LandingZone - - return self -end - - -function DEPLOYTASK:InitCargo( InitCargos ) - self:F( { InitCargos } ) - - if type( InitCargos ) == "table" then - self.Cargos.InitCargos = InitCargos - else - self.Cargos.InitCargos = { InitCargos } - end - - return self -end - - -function DEPLOYTASK:LoadCargo( LoadCargos ) - self:F( { LoadCargos } ) - - if type( LoadCargos ) == "table" then - self.Cargos.LoadCargos = LoadCargos - else - self.Cargos.LoadCargos = { LoadCargos } - end - - return self -end - - ---- When the cargo is unloaded, it will move to the target zone name. --- @param string TargetZoneName Name of the Zone to where the Cargo should move after unloading. -function DEPLOYTASK:SetCargoTargetZoneName( TargetZoneName ) - self:F() - - local Valid = true - - Valid = routines.ValidateString( TargetZoneName, "TargetZoneName", Valid ) - - if Valid then - self.TargetZoneName = TargetZoneName - end - - return Valid - -end - -function DEPLOYTASK:AddCargoMenus( Client, Cargos, TransportRadius ) - self:F() - - local ClientGroupID = Client:GetClientGroupID() - - self:T( ClientGroupID ) - - for CargoID, Cargo in pairs( Cargos ) do - - self:T( { Cargo.ClassName, Cargo.CargoName, Cargo.CargoType, Cargo.CargoWeight } ) - - if Cargo:IsStatusLoaded() and Client == Cargo:IsLoadedInClient() then - - if Client._Menus[Cargo.CargoType] == nil then - Client._Menus[Cargo.CargoType] = {} - end - - if not Client._Menus[Cargo.CargoType].DeployMenu then - Client._Menus[Cargo.CargoType].DeployMenu = missionCommands.addSubMenuForGroup( - ClientGroupID, - self.TEXT[1] .. " " .. Cargo.CargoType, - nil - ) - self:T( 'Added DeployMenu ' .. self.TEXT[1] ) - end - - if Client._Menus[Cargo.CargoType].DeploySubMenus == nil then - Client._Menus[Cargo.CargoType].DeploySubMenus = {} - end - - if Client._Menus[Cargo.CargoType].DeployMenu == nil then - self:T( 'deploymenu is nil' ) - end - - Client._Menus[Cargo.CargoType].DeploySubMenus[ #Client._Menus[Cargo.CargoType].DeploySubMenus + 1 ] = missionCommands.addCommandForGroup( - ClientGroupID, - Cargo.CargoName .. " ( " .. Cargo.CargoWeight .. "kg )", - Client._Menus[Cargo.CargoType].DeployMenu, - self.MenuAction, - { ReferenceTask = self, CargoTask = Cargo } - ) - self:T( 'Added DeploySubMenu ' .. Cargo.CargoType .. ":" .. Cargo.CargoName .. " ( " .. Cargo.CargoWeight .. "kg )" ) - end - end - -end - -function DEPLOYTASK:RemoveCargoMenus( Client ) - self:F() - - local ClientGroupID = Client:GetClientGroupID() - self:T( ClientGroupID ) - - for MenuID, MenuData in pairs( Client._Menus ) do - if MenuData.DeploySubMenus ~= nil then - for SubMenuID, SubMenuData in pairs( MenuData.DeploySubMenus ) do - missionCommands.removeItemForGroup( ClientGroupID, SubMenuData ) - self:T( "Removed DeploySubMenu " ) - SubMenuData = nil - end - end - if MenuData.DeployMenu then - missionCommands.removeItemForGroup( ClientGroupID, MenuData.DeployMenu ) - self:T( "Removed DeployMenu " ) - MenuData.DeployMenu = nil - end - end - -end ---- A NOTASK is a dummy activity... But it will show a Mission Briefing... --- @module NOTASK - -Include.File("Task") - ---- The NOTASK class --- @type -NOTASK = { - ClassName = "NOTASK", -} - ---- Creates a new NOTASK. -function NOTASK:New() - local self = BASE:Inherit( self, TASK:New() ) - self:F() - - local Valid = true - - if Valid then - self.Name = 'Nothing' - self.TaskBriefing = "Task: Execute your mission." - self.Stages = { STAGEBRIEF:New(), STAGESTART:New(), STAGEDONE:New() } - self.SetStage( self, 1 ) - end - - return self -end ---- A ROUTETASK orchestrates the travel to a specific zone defined within the ME. --- @module ROUTETASK - ---- The ROUTETASK class --- @type -ROUTETASK = { - ClassName = "ROUTETASK", - GoalVerb = "Route", -} - ---- Creates a new ROUTETASK. --- @param table{sring,...}|string LandingZones Table of Zone Names where the target is located. --- @param string TaskBriefing (optional) Defines a text describing the briefing of the task. --- @return ROUTETASK -function ROUTETASK:New( LandingZones, TaskBriefing ) - local self = BASE:Inherit( self, TASK:New() ) - self:F( { LandingZones, TaskBriefing } ) - - local Valid = true - - Valid = routines.ValidateZone( LandingZones, "LandingZones", Valid ) - - if Valid then - self.Name = 'Route To Zone' - if TaskBriefing then - self.TaskBriefing = TaskBriefing .. " Your co-pilot will provide you with the directions (required flight angle in degrees) and the distance (in km) to the target objective." - else - self.TaskBriefing = "Task: Fly to specified zone(s). Your co-pilot will provide you with the directions (required flight angle in degrees) and the distance (in km) to the target objective." - end - if type( LandingZones ) == "table" then - self.LandingZones = LandingZones - else - self.LandingZones = { LandingZones } - end - self.Stages = { STAGEBRIEF:New(), STAGESTART:New(), STAGEROUTE:New(), STAGEARRIVE:New(), STAGEDONE:New() } - self.SetStage( self, 1 ) - end - - return self -end - ---- A MISSION is the main owner of a Mission orchestration within MOOSE . The Mission framework orchestrates @{CLIENT}s, @{TASK}s, @{STAGE}s etc. --- A @{CLIENT} needs to be registered within the @{MISSION} through the function @{AddClient}. A @{TASK} needs to be registered within the @{MISSION} through the function @{AddTask}. --- @module Mission - -Include.File( "Routines" ) -Include.File( "Base" ) -Include.File( "Client" ) -Include.File( "Task" ) - ---- The MISSION class --- @type MISSION --- @extends Base#BASE --- @field #MISSION.Clients _Clients --- @field #string MissionBriefing -MISSION = { - ClassName = "MISSION", - Name = "", - MissionStatus = "PENDING", - _Clients = {}, - _Tasks = {}, - _ActiveTasks = {}, - GoalFunction = nil, - MissionReportTrigger = 0, - MissionProgressTrigger = 0, - MissionReportShow = false, - MissionReportFlash = false, - MissionTimeInterval = 0, - MissionCoalition = "", - SUCCESS = 1, - FAILED = 2, - REPEAT = 3, - _GoalTasks = {} -} - ---- @type MISSION.Clients --- @list - -function MISSION:Meta() - - local self = BASE:Inherit( self, BASE:New() ) - self:F() - - return self -end - ---- This is the main MISSION declaration method. Each Mission is like the master or a Mission orchestration between, Clients, Tasks, Stages etc. --- @param string MissionName is the name of the mission. This name will be used to reference the status of each mission by the players. --- @param string MissionPriority is a string indicating the "priority" of the Mission. f.e. "Primary", "Secondary" or "First", "Second". It is free format and up to the Mission designer to choose. There are no rules behind this field. --- @param string MissionBriefing is a string indicating the mission briefing to be shown when a player joins a @{CLIENT}. --- @param string MissionCoalition is a string indicating the coalition or party to which this mission belongs to. It is free format and can be chosen freely by the mission designer. Note that this field is not to be confused with the coalition concept of the ME. Examples of a Mission Coalition could be "NATO", "CCCP", "Intruders", "Terrorists"... --- @return MISSION --- @usage --- -- Declare a few missions. --- local Mission = MISSIONSCHEDULER.AddMission( 'Russia Transport Troops SA-6', 'Operational', 'Transport troops from the control center to one of the SA-6 SAM sites to activate their operation.', 'Russia' ) --- local Mission = MISSIONSCHEDULER.AddMission( 'Patriots', 'Primary', 'Our intelligence reports that 3 Patriot SAM defense batteries are located near Ruisi, Kvarhiti and Gori.', 'Russia' ) --- local Mission = MISSIONSCHEDULER.AddMission( 'Package Delivery', 'Operational', 'In order to be in full control of the situation, we need you to deliver a very important package at a secret location. Fly undetected through the NATO defenses and deliver the secret package. The secret agent is located at waypoint 4.', 'Russia' ) --- local Mission = MISSIONSCHEDULER.AddMission( 'Rescue General', 'Tactical', 'Our intelligence has received a remote signal behind Gori. We believe it is a very important Russian General that was captured by Georgia. Go out there and rescue him! Ensure you stay out of the battle zone, keep south. Waypoint 4 is the location of our Russian General.', 'Russia' ) --- local Mission = MISSIONSCHEDULER.AddMission( 'NATO Transport Troops', 'Operational', 'Transport 3 groups of air defense engineers from our barracks "Gold" and "Titan" to each patriot battery control center to activate our air defenses.', 'NATO' ) --- local Mission = MISSIONSCHEDULER.AddMission( 'SA-6 SAMs', 'Primary', 'Our intelligence reports that 3 SA-6 SAM defense batteries are located near Didmukha, Khetagurov and Berula. Eliminate the Russian SAMs.', 'NATO' ) --- local Mission = MISSIONSCHEDULER.AddMission( 'NATO Sling Load', 'Operational', 'Fly to the cargo pickup zone at Dzegvi or Kaspi, and sling the cargo to Soganlug airbase.', 'NATO' ) --- local Mission = MISSIONSCHEDULER.AddMission( 'Rescue secret agent', 'Tactical', 'In order to be in full control of the situation, we need you to rescue a secret agent from the woods behind enemy lines. Avoid the Russian defenses and rescue the agent. Keep south until Khasuri, and keep your eyes open for any SAM presence. The agent is located at waypoint 4 on your kneeboard.', 'NATO' ) -function MISSION:New( MissionName, MissionPriority, MissionBriefing, MissionCoalition ) - - self = MISSION:Meta() - self:T({ MissionName, MissionPriority, MissionBriefing, MissionCoalition }) - - local Valid = true - - Valid = routines.ValidateString( MissionName, "MissionName", Valid ) - Valid = routines.ValidateString( MissionPriority, "MissionPriority", Valid ) - Valid = routines.ValidateString( MissionBriefing, "MissionBriefing", Valid ) - Valid = routines.ValidateString( MissionCoalition, "MissionCoalition", Valid ) - - if Valid then - self.Name = MissionName - self.MissionPriority = MissionPriority - self.MissionBriefing = MissionBriefing - self.MissionCoalition = MissionCoalition - end - - return self -end - ---- Returns if a Mission has completed. --- @return bool -function MISSION:IsCompleted() - self:F() - return self.MissionStatus == "ACCOMPLISHED" -end - ---- Set a Mission to completed. -function MISSION:Completed() - self:F() - self.MissionStatus = "ACCOMPLISHED" - self:StatusToClients() -end - ---- Returns if a Mission is ongoing. --- treturn bool -function MISSION:IsOngoing() - self:F() - return self.MissionStatus == "ONGOING" -end - ---- Set a Mission to ongoing. -function MISSION:Ongoing() - self:F() - self.MissionStatus = "ONGOING" - --self:StatusToClients() -end - ---- Returns if a Mission is pending. --- treturn bool -function MISSION:IsPending() - self:F() - return self.MissionStatus == "PENDING" -end - ---- Set a Mission to pending. -function MISSION:Pending() - self:F() - self.MissionStatus = "PENDING" - self:StatusToClients() -end - ---- Returns if a Mission has failed. --- treturn bool -function MISSION:IsFailed() - self:F() - return self.MissionStatus == "FAILED" -end - ---- Set a Mission to failed. -function MISSION:Failed() - self:F() - self.MissionStatus = "FAILED" - self:StatusToClients() -end - ---- Send the status of the MISSION to all Clients. -function MISSION:StatusToClients() - self:F() - if self.MissionReportFlash then - for ClientID, Client in pairs( self._Clients ) do - Client:Message( self.MissionCoalition .. ' "' .. self.Name .. '": ' .. self.MissionStatus .. '! ( ' .. self.MissionPriority .. ' mission ) ', 10, self.Name .. '/Status', "Mission Command: Mission Status") - end - end -end - ---- Handles the reporting. After certain time intervals, a MISSION report MESSAGE will be shown to All Players. -function MISSION:ReportTrigger() - self:F() - - if self.MissionReportShow == true then - self.MissionReportShow = false - return true - else - if self.MissionReportFlash == true then - if timer.getTime() >= self.MissionReportTrigger then - self.MissionReportTrigger = timer.getTime() + self.MissionTimeInterval - return true - else - return false - end - else - return false - end - end -end - ---- Report the status of all MISSIONs to all active Clients. -function MISSION:ReportToAll() - self:F() - - local AlivePlayers = '' - for ClientID, Client in pairs( self._Clients ) do - if Client:GetDCSGroup() then - if Client:GetClientGroupDCSUnit() then - if Client:GetClientGroupDCSUnit():getLife() > 0.0 then - if AlivePlayers == '' then - AlivePlayers = ' Players: ' .. Client:GetClientGroupDCSUnit():getPlayerName() - else - AlivePlayers = AlivePlayers .. ' / ' .. Client:GetClientGroupDCSUnit():getPlayerName() - end - end - end - end - end - local Tasks = self:GetTasks() - local TaskText = "" - for TaskID, TaskData in pairs( Tasks ) do - TaskText = TaskText .. " - Task " .. TaskID .. ": " .. TaskData.Name .. ": " .. TaskData:GetGoalProgress() .. "\n" - end - MESSAGE:New( self.MissionCoalition .. ' "' .. self.Name .. '": ' .. self.MissionStatus .. ' ( ' .. self.MissionPriority .. ' mission )' .. AlivePlayers .. "\n" .. TaskText:gsub("\n$",""), "Mission Command: Mission Report", 10, self.Name .. '/Status'):ToAll() -end - - ---- Add a goal function to a MISSION. Goal functions are called when a @{TASK} within a mission has been completed. --- @param function GoalFunction is the function defined by the mission designer to evaluate whether a certain goal has been reached after a @{TASK} finishes within the @{MISSION}. A GoalFunction must accept 2 parameters: Mission, Client, which contains the current MISSION object and the current CLIENT object respectively. --- @usage --- PatriotActivation = { --- { "US SAM Patriot Zerti", false }, --- { "US SAM Patriot Zegduleti", false }, --- { "US SAM Patriot Gvleti", false } --- } --- --- function DeployPatriotTroopsGoal( Mission, Client ) --- --- --- -- Check if the cargo is all deployed for mission success. --- for CargoID, CargoData in pairs( Mission._Cargos ) do --- if Group.getByName( CargoData.CargoGroupName ) then --- CargoGroup = Group.getByName( CargoData.CargoGroupName ) --- if CargoGroup then --- -- Check if the cargo is ready to activate --- CurrentLandingZoneID = routines.IsUnitInZones( CargoGroup:getUnits()[1], Mission:GetTask( 2 ).LandingZones ) -- The second task is the Deploytask to measure mission success upon --- if CurrentLandingZoneID then --- if PatriotActivation[CurrentLandingZoneID][2] == false then --- -- Now check if this is a new Mission Task to be completed... --- trigger.action.setGroupAIOn( Group.getByName( PatriotActivation[CurrentLandingZoneID][1] ) ) --- PatriotActivation[CurrentLandingZoneID][2] = true --- MessageToBlue( "Mission Command: Message to all airborne units! The " .. PatriotActivation[CurrentLandingZoneID][1] .. " is armed. Our air defenses are now stronger.", 60, "BLUE/PatriotDefense" ) --- MessageToRed( "Mission Command: Our satellite systems are detecting additional NATO air defenses. To all airborne units: Take care!!!", 60, "RED/PatriotDefense" ) --- Mission:GetTask( 2 ):AddGoalCompletion( "Patriots activated", PatriotActivation[CurrentLandingZoneID][1], 1 ) -- Register Patriot activation as part of mission goal. --- end --- end --- end --- end --- end --- end --- --- local Mission = MISSIONSCHEDULER.AddMission( 'NATO Transport Troops', 'Operational', 'Transport 3 groups of air defense engineers from our barracks "Gold" and "Titan" to each patriot battery control center to activate our air defenses.', 'NATO' ) --- Mission:AddGoalFunction( DeployPatriotTroopsGoal ) -function MISSION:AddGoalFunction( GoalFunction ) - self:F() - self.GoalFunction = GoalFunction -end - ---- Register a new @{CLIENT} to participate within the mission. --- @param CLIENT Client is the @{CLIENT} object. The object must have been instantiated with @{CLIENT:New}. --- @return CLIENT --- @usage --- Add a number of Client objects to the Mission. --- Mission:AddClient( CLIENT:FindByName( 'US UH-1H*HOT-Deploy Troops 1', 'Transport 3 groups of air defense engineers from our barracks "Gold" and "Titan" to each patriot battery control center to activate our air defenses.' ):Transport() ) --- Mission:AddClient( CLIENT:FindByName( 'US UH-1H*RAMP-Deploy Troops 3', 'Transport 3 groups of air defense engineers from our barracks "Gold" and "Titan" to each patriot battery control center to activate our air defenses.' ):Transport() ) --- Mission:AddClient( CLIENT:FindByName( 'US UH-1H*HOT-Deploy Troops 2', 'Transport 3 groups of air defense engineers from our barracks "Gold" and "Titan" to each patriot battery control center to activate our air defenses.' ):Transport() ) --- Mission:AddClient( CLIENT:FindByName( 'US UH-1H*RAMP-Deploy Troops 4', 'Transport 3 groups of air defense engineers from our barracks "Gold" and "Titan" to each patriot battery control center to activate our air defenses.' ):Transport() ) -function MISSION:AddClient( Client ) - self:F( { Client } ) - - local Valid = true - - if Valid then - self._Clients[Client.ClientName] = Client - end - - return Client -end - ---- Find a @{CLIENT} object within the @{MISSION} by its ClientName. --- @param CLIENT ClientName is a string defining the Client Group as defined within the ME. --- @return CLIENT --- @usage --- -- Seach for Client "Bomber" within the Mission. --- local BomberClient = Mission:FindClient( "Bomber" ) -function MISSION:FindClient( ClientName ) - self:F( { self._Clients[ClientName] } ) - return self._Clients[ClientName] -end - - ---- Register a @{TASK} to be completed within the @{MISSION}. Note that there can be multiple @{TASK}s registered to be completed. Each TASK can be set a certain Goal. The MISSION will not be completed until all Goals are reached. --- @param TASK Task is the @{TASK} object. The object must have been instantiated with @{TASK:New} or any of its inherited @{TASK}s. --- @param number TaskNumber is the sequence number of the TASK within the MISSION. This number does have to be chronological. --- @return TASK --- @usage --- -- Define a few tasks for the Mission. --- PickupZones = { "NATO Gold Pickup Zone", "NATO Titan Pickup Zone" } --- PickupSignalUnits = { "NATO Gold Coordination Center", "NATO Titan Coordination Center" } --- --- -- Assign the Pickup Task --- local PickupTask = PICKUPTASK:New( PickupZones, CARGO_TYPE.ENGINEERS, CLIENT.ONBOARDSIDE.LEFT ) --- PickupTask:AddSmokeBlue( PickupSignalUnits ) --- PickupTask:SetGoalTotal( 3 ) --- Mission:AddTask( PickupTask, 1 ) --- --- -- Assign the Deploy Task --- local PatriotActivationZones = { "US Patriot Battery 1 Activation", "US Patriot Battery 2 Activation", "US Patriot Battery 3 Activation" } --- local PatriotActivationZonesSmokeUnits = { "US SAM Patriot - Battery 1 Control", "US SAM Patriot - Battery 2 Control", "US SAM Patriot - Battery 3 Control" } --- local DeployTask = DEPLOYTASK:New( PatriotActivationZones, CARGO_TYPE.ENGINEERS ) --- --DeployTask:SetCargoTargetZoneName( 'US Troops Attack ' .. math.random(2) ) --- DeployTask:AddSmokeBlue( PatriotActivationZonesSmokeUnits ) --- DeployTask:SetGoalTotal( 3 ) --- DeployTask:SetGoalTotal( 3, "Patriots activated" ) --- Mission:AddTask( DeployTask, 2 ) - -function MISSION:AddTask( Task, TaskNumber ) - self:F() - - self._Tasks[TaskNumber] = Task - self._Tasks[TaskNumber]:EnableEvents() - self._Tasks[TaskNumber].ID = TaskNumber - - return Task - end - ---- Get the TASK idenified by the TaskNumber from the Mission. This function is useful in GoalFunctions. --- @param number TaskNumber is the number of the @{TASK} within the @{MISSION}. --- @return TASK --- @usage --- -- Get Task 2 from the Mission. --- Task2 = Mission:GetTask( 2 ) - -function MISSION:GetTask( TaskNumber ) - self:F() - - local Valid = true - - local Task = nil - - if type(TaskNumber) ~= "number" then - Valid = false - end - - if Valid then - Task = self._Tasks[TaskNumber] - end - - return Task -end - ---- Get all the TASKs from the Mission. This function is useful in GoalFunctions. --- @return {TASK,...} Structure of TASKS with the @{TASK} number as the key. --- @usage --- -- Get Tasks from the Mission. --- Tasks = Mission:GetTasks() --- env.info( "Task 2 Completion = " .. Tasks[2]:GetGoalPercentage() .. "%" ) -function MISSION:GetTasks() - self:F() - - return self._Tasks -end - - ---[[ - _TransportExecuteStage: Defines the different stages of Transport unload/load execution. This table is internal and is used to control the validity of Transport load/unload timing. - - - _TransportExecuteStage.EXECUTING - - _TransportExecuteStage.SUCCESS - - _TransportExecuteStage.FAILED - ---]] -_TransportExecuteStage = { - NONE = 0, - EXECUTING = 1, - SUCCESS = 2, - FAILED = 3 -} - - ---- The MISSIONSCHEDULER is an OBJECT and is the main scheduler of ALL active MISSIONs registered within this scheduler. It's workings are considered internal and is automatically created when the Mission.lua file is included. --- @type MISSIONSCHEDULER --- @field #MISSIONSCHEDULER.MISSIONS Missions -MISSIONSCHEDULER = { - Missions = {}, - MissionCount = 0, - TimeIntervalCount = 0, - TimeIntervalShow = 150, - TimeSeconds = 14400, - TimeShow = 5 -} - ---- @type MISSIONSCHEDULER.MISSIONS --- @list <#MISSION> Mission - ---- This is the main MISSIONSCHEDULER Scheduler function. It is considered internal and is automatically created when the Mission.lua file is included. -function MISSIONSCHEDULER.Scheduler() - - - -- loop through the missions in the TransportTasks - for MissionName, MissionData in pairs( MISSIONSCHEDULER.Missions ) do - - local Mission = MissionData -- #MISSION - - if not Mission:IsCompleted() then - - -- This flag will monitor if for this mission, there are clients alive. If this flag is still false at the end of the loop, the mission status will be set to Pending (if not Failed or Completed). - local ClientsAlive = false - - for ClientID, ClientData in pairs( Mission._Clients ) do - - local Client = ClientData -- Client#CLIENT - - if Client:IsAlive() then - - -- There is at least one Client that is alive... So the Mission status is set to Ongoing. - ClientsAlive = true - - -- If this Client was not registered as Alive before: - -- 1. We register the Client as Alive. - -- 2. We initialize the Client Tasks and make a link to the original Mission Task. - -- 3. We initialize the Cargos. - -- 4. We flag the Mission as Ongoing. - if not Client.ClientAlive then - Client.ClientAlive = true - Client.ClientBriefingShown = false - for TaskNumber, Task in pairs( Mission._Tasks ) do - -- Note that this a deepCopy. Each client must have their own Tasks with own Stages!!! - Client._Tasks[TaskNumber] = routines.utils.deepCopy( Mission._Tasks[TaskNumber] ) - -- Each MissionTask must point to the original Mission. - Client._Tasks[TaskNumber].MissionTask = Mission._Tasks[TaskNumber] - Client._Tasks[TaskNumber].Cargos = Mission._Tasks[TaskNumber].Cargos - Client._Tasks[TaskNumber].LandingZones = Mission._Tasks[TaskNumber].LandingZones - end - - Mission:Ongoing() - end - - - -- For each Client, check for each Task the state and evolve the mission. - -- This flag will indicate if the Task of the Client is Complete. - local TaskComplete = false - - for TaskNumber, Task in pairs( Client._Tasks ) do - - if not Task.Stage then - Task:SetStage( 1 ) - end - - - local TransportTime = timer.getTime() - - if not Task:IsDone() then - - if Task:Goal() then - Task:ShowGoalProgress( Mission, Client ) - end - - --env.info( 'Scheduler: Mission = ' .. Mission.Name .. ' / Client = ' .. Client.ClientName .. ' / Task = ' .. Task.Name .. ' / Stage = ' .. Task.ActiveStage .. ' - ' .. Task.Stage.Name .. ' - ' .. Task.Stage.StageType ) - - -- Action - if Task:StageExecute() then - Task.Stage:Execute( Mission, Client, Task ) - end - - -- Wait until execution is finished - if Task.ExecuteStage == _TransportExecuteStage.EXECUTING then - Task.Stage:Executing( Mission, Client, Task ) - end - - -- Validate completion or reverse to earlier stage - if Task.Time + Task.Stage.WaitTime <= TransportTime then - Task:SetStage( Task.Stage:Validate( Mission, Client, Task ) ) - end - - if Task:IsDone() then - --env.info( 'Scheduler: Mission '.. Mission.Name .. ' Task ' .. Task.Name .. ' Stage ' .. Task.Stage.Name .. ' done. TaskComplete = ' .. string.format ( "%s", TaskComplete and "true" or "false" ) ) - TaskComplete = true -- when a task is not yet completed, a mission cannot be completed - - else - -- break only if this task is not yet done, so that future task are not yet activated. - TaskComplete = false -- when a task is not yet completed, a mission cannot be completed - --env.info( 'Scheduler: Mission "'.. Mission.Name .. '" Task "' .. Task.Name .. '" Stage "' .. Task.Stage.Name .. '" break. TaskComplete = ' .. string.format ( "%s", TaskComplete and "true" or "false" ) ) - break - end - - if TaskComplete then - - if Mission.GoalFunction ~= nil then - Mission.GoalFunction( Mission, Client ) - end - if MISSIONSCHEDULER.Scoring then - MISSIONSCHEDULER.Scoring:_AddMissionTaskScore( Client:GetClientGroupDCSUnit(), Mission.Name, 25 ) - end - --- if not Mission:IsCompleted() then --- end - end - end - end - - local MissionComplete = true - for TaskNumber, Task in pairs( Mission._Tasks ) do - if Task:Goal() then --- Task:ShowGoalProgress( Mission, Client ) - if Task:IsGoalReached() then - else - MissionComplete = false - end - else - MissionComplete = false -- If there is no goal, the mission should never be ended. The goal status will be set somewhere else. - end - end - - if MissionComplete then - Mission:Completed() - if MISSIONSCHEDULER.Scoring then - MISSIONSCHEDULER.Scoring:_AddMissionScore( Mission.Name, 100 ) - end - else - if TaskComplete then - -- Reset for new tasking of active client - Client.ClientAlive = false -- Reset the client tasks. - end - end - - - else - if Client.ClientAlive then - env.info( 'Scheduler: Client "' .. Client.ClientName .. '" is inactive.' ) - Client.ClientAlive = false - - -- This is tricky. If we sanitize Client._Tasks before sanitizing Client._Tasks[TaskNumber].MissionTask, then the original MissionTask will be sanitized, and will be lost within the garbage collector. - -- So first sanitize Client._Tasks[TaskNumber].MissionTask, after that, sanitize only the whole _Tasks structure... - --Client._Tasks[TaskNumber].MissionTask = nil - --Client._Tasks = nil - end - end - end - - -- If all Clients of this Mission are not activated, then the Mission status needs to be put back into Pending status. - -- But only if the Mission was Ongoing. In case the Mission is Completed or Failed, the Mission status may not be changed. In these cases, this will be the last run of this Mission in the Scheduler. - if ClientsAlive == false then - if Mission:IsOngoing() then - -- Mission status back to pending... - Mission:Pending() - end - end - end - - Mission:StatusToClients() - - if Mission:ReportTrigger() then - Mission:ReportToAll() - end - end - - return true -end - ---- Start the MISSIONSCHEDULER. -function MISSIONSCHEDULER.Start() - if MISSIONSCHEDULER ~= nil then - --MISSIONSCHEDULER.SchedulerId = routines.scheduleFunction( MISSIONSCHEDULER.Scheduler, { }, 0, 2 ) - MISSIONSCHEDULER.SchedulerId = SCHEDULER:New( nil, MISSIONSCHEDULER.Scheduler, { }, 0, 2 ) - end -end - ---- Stop the MISSIONSCHEDULER. -function MISSIONSCHEDULER.Stop() - if MISSIONSCHEDULER.SchedulerId then - routines.removeFunction(MISSIONSCHEDULER.SchedulerId) - MISSIONSCHEDULER.SchedulerId = nil - end -end - ---- This is the main MISSION declaration method. Each Mission is like the master or a Mission orchestration between, Clients, Tasks, Stages etc. --- @param Mission is the MISSION object instantiated by @{MISSION:New}. --- @return MISSION --- @usage --- -- Declare a mission. --- Mission = MISSION:New( 'Russia Transport Troops SA-6', --- 'Operational', --- 'Transport troops from the control center to one of the SA-6 SAM sites to activate their operation.', --- 'Russia' ) --- MISSIONSCHEDULER:AddMission( Mission ) -function MISSIONSCHEDULER.AddMission( Mission ) - MISSIONSCHEDULER.Missions[Mission.Name] = Mission - MISSIONSCHEDULER.MissionCount = MISSIONSCHEDULER.MissionCount + 1 - -- Add an overall AI Client for the AI tasks... This AI Client will facilitate the Events in the background for each Task. - --MissionAdd:AddClient( CLIENT:Register( 'AI' ) ) - - return Mission -end - ---- Remove a MISSION from the MISSIONSCHEDULER. --- @param MissionName is the name of the MISSION given at declaration using @{AddMission}. --- @usage --- -- Declare a mission. --- Mission = MISSION:New( 'Russia Transport Troops SA-6', --- 'Operational', --- 'Transport troops from the control center to one of the SA-6 SAM sites to activate their operation.', --- 'Russia' ) --- MISSIONSCHEDULER:AddMission( Mission ) --- --- -- Now remove the Mission. --- MISSIONSCHEDULER:RemoveMission( 'Russia Transport Troops SA-6' ) -function MISSIONSCHEDULER.RemoveMission( MissionName ) - MISSIONSCHEDULER.Missions[MissionName] = nil - MISSIONSCHEDULER.MissionCount = MISSIONSCHEDULER.MissionCount - 1 -end - ---- Find a MISSION within the MISSIONSCHEDULER. --- @param MissionName is the name of the MISSION given at declaration using @{AddMission}. --- @return MISSION --- @usage --- -- Declare a mission. --- Mission = MISSION:New( 'Russia Transport Troops SA-6', --- 'Operational', --- 'Transport troops from the control center to one of the SA-6 SAM sites to activate their operation.', --- 'Russia' ) --- MISSIONSCHEDULER:AddMission( Mission ) --- --- -- Now find the Mission. --- MissionFind = MISSIONSCHEDULER:FindMission( 'Russia Transport Troops SA-6' ) -function MISSIONSCHEDULER.FindMission( MissionName ) - return MISSIONSCHEDULER.Missions[MissionName] -end - --- Internal function used by the MISSIONSCHEDULER menu. -function MISSIONSCHEDULER.ReportMissionsShow( ) - for MissionName, Mission in pairs( MISSIONSCHEDULER.Missions ) do - Mission.MissionReportShow = true - Mission.MissionReportFlash = false - end -end - --- Internal function used by the MISSIONSCHEDULER menu. -function MISSIONSCHEDULER.ReportMissionsFlash( TimeInterval ) - local Count = 0 - for MissionName, Mission in pairs( MISSIONSCHEDULER.Missions ) do - Mission.MissionReportShow = false - Mission.MissionReportFlash = true - Mission.MissionReportTrigger = timer.getTime() + Count * TimeInterval - Mission.MissionTimeInterval = MISSIONSCHEDULER.MissionCount * TimeInterval - env.info( "TimeInterval = " .. Mission.MissionTimeInterval ) - Count = Count + 1 - end -end - --- Internal function used by the MISSIONSCHEDULER menu. -function MISSIONSCHEDULER.ReportMissionsHide( Prm ) - for MissionName, Mission in pairs( MISSIONSCHEDULER.Missions ) do - Mission.MissionReportShow = false - Mission.MissionReportFlash = false - end -end - ---- Enables a MENU option in the communications menu under F10 to control the status of the active missions. --- This function should be called only once when starting the MISSIONSCHEDULER. -function MISSIONSCHEDULER.ReportMenu() - local ReportMenu = SUBMENU:New( 'Status' ) - local ReportMenuShow = COMMANDMENU:New( 'Show Report Missions', ReportMenu, MISSIONSCHEDULER.ReportMissionsShow, 0 ) - local ReportMenuFlash = COMMANDMENU:New('Flash Report Missions', ReportMenu, MISSIONSCHEDULER.ReportMissionsFlash, 120 ) - local ReportMenuHide = COMMANDMENU:New( 'Hide Report Missions', ReportMenu, MISSIONSCHEDULER.ReportMissionsHide, 0 ) -end - ---- Show the remaining mission time. -function MISSIONSCHEDULER:TimeShow() - self.TimeIntervalCount = self.TimeIntervalCount + 1 - if self.TimeIntervalCount >= self.TimeTriggerShow then - local TimeMsg = string.format("%00d", ( self.TimeSeconds / 60 ) - ( timer.getTime() / 60 )) .. ' minutes left until mission reload.' - MESSAGE:New( TimeMsg, "Mission time", self.TimeShow, '/TimeMsg' ):ToAll() - self.TimeIntervalCount = 0 - end -end - -function MISSIONSCHEDULER:Time( TimeSeconds, TimeIntervalShow, TimeShow ) - - self.TimeIntervalCount = 0 - self.TimeSeconds = TimeSeconds - self.TimeIntervalShow = TimeIntervalShow - self.TimeShow = TimeShow -end - ---- Adds a mission scoring to the game. -function MISSIONSCHEDULER:Scoring( Scoring ) - - self.Scoring = Scoring -end - ---- The CLEANUP class keeps an area clean of crashing or colliding airplanes. It also prevents airplanes from firing within this area. --- @module CleanUp --- @author Flightcontrol - -Include.File( "Routines" ) -Include.File( "Base" ) -Include.File( "Mission" ) -Include.File( "Client" ) -Include.File( "Task" ) - ---- The CLEANUP class. --- @type CLEANUP --- @extends Base#BASE -CLEANUP = { - ClassName = "CLEANUP", - ZoneNames = {}, - TimeInterval = 300, - CleanUpList = {}, -} - ---- Creates the main object which is handling the cleaning of the debris within the given Zone Names. --- @param #CLEANUP self --- @param #table ZoneNames Is a table of zone names where the debris should be cleaned. Also a single string can be passed with one zone name. --- @param #number TimeInterval The interval in seconds when the clean activity takes place. The default is 300 seconds, thus every 5 minutes. --- @return #CLEANUP --- @usage --- -- Clean these Zones. --- CleanUpAirports = CLEANUP:New( { 'CLEAN Tbilisi', 'CLEAN Kutaisi' }, 150 ) --- or --- CleanUpTbilisi = CLEANUP:New( 'CLEAN Tbilisi', 150 ) --- CleanUpKutaisi = CLEANUP:New( 'CLEAN Kutaisi', 600 ) -function CLEANUP:New( ZoneNames, TimeInterval ) local self = BASE:Inherit( self, BASE:New() ) - self:F( { ZoneNames, TimeInterval } ) - - if type( ZoneNames ) == 'table' then - self.ZoneNames = ZoneNames - else - self.ZoneNames = { ZoneNames } - end - if TimeInterval then - self.TimeInterval = TimeInterval - end - - _EVENTDISPATCHER:OnBirth( self._OnEventBirth, self ) - - --self.CleanUpScheduler = routines.scheduleFunction( self._CleanUpScheduler, { self }, timer.getTime() + 1, TimeInterval ) - self.CleanUpScheduler = SCHEDULER:New( self, self._CleanUpScheduler, {}, 1, TimeInterval ) - - return self -end - - ---- Destroys a group from the simulator, but checks first if it is still existing! --- @param #CLEANUP self --- @param DCSGroup#Group GroupObject The object to be destroyed. --- @param #string CleanUpGroupName The groupname... -function CLEANUP:_DestroyGroup( GroupObject, CleanUpGroupName ) - self:F( { GroupObject, CleanUpGroupName } ) - - if GroupObject then -- and GroupObject:isExist() then - --MESSAGE:New( "Destroy Group " .. CleanUpGroupName, CleanUpGroupName, 1, CleanUpGroupName ):ToAll() - trigger.action.deactivateGroup(GroupObject) - self:T( { "GroupObject Destroyed", GroupObject } ) - end -end - ---- Destroys a @{DCSUnit#Unit} from the simulator, but checks first if it is still existing! --- @param #CLEANUP self --- @param DCSUnit#Unit CleanUpUnit The object to be destroyed. --- @param #string CleanUpUnitName The Unit name ... -function CLEANUP:_DestroyUnit( CleanUpUnit, CleanUpUnitName ) - self:F( { CleanUpUnit, CleanUpUnitName } ) - - if CleanUpUnit then - --MESSAGE:New( "Destroy " .. CleanUpUnitName, CleanUpUnitName, 1, CleanUpUnitName ):ToAll() - local CleanUpGroup = Unit.getGroup(CleanUpUnit) - -- TODO Client bug in 1.5.3 - if CleanUpGroup and CleanUpGroup:isExist() then - local CleanUpGroupUnits = CleanUpGroup:getUnits() - if #CleanUpGroupUnits == 1 then - local CleanUpGroupName = CleanUpGroup:getName() - --self:CreateEventCrash( timer.getTime(), CleanUpUnit ) - CleanUpGroup:destroy() - self:T( { "Destroyed Group:", CleanUpGroupName } ) - else - CleanUpUnit:destroy() - self:T( { "Destroyed Unit:", CleanUpUnitName } ) - end - self.CleanUpList[CleanUpUnitName] = nil -- Cleaning from the list - CleanUpUnit = nil - end - end -end - --- TODO check DCSTypes#Weapon ---- Destroys a missile from the simulator, but checks first if it is still existing! --- @param #CLEANUP self --- @param DCSTypes#Weapon MissileObject -function CLEANUP:_DestroyMissile( MissileObject ) - self:F( { MissileObject } ) - - if MissileObject and MissileObject:isExist() then - MissileObject:destroy() - self:T( "MissileObject Destroyed") - end -end - -function CLEANUP:_OnEventBirth( Event ) - self:F( { Event } ) - - self.CleanUpList[Event.IniDCSUnitName] = {} - self.CleanUpList[Event.IniDCSUnitName].CleanUpUnit = Event.IniDCSUnit - self.CleanUpList[Event.IniDCSUnitName].CleanUpGroup = Event.IniDCSGroup - self.CleanUpList[Event.IniDCSUnitName].CleanUpGroupName = Event.IniDCSGroupName - self.CleanUpList[Event.IniDCSUnitName].CleanUpUnitName = Event.IniDCSUnitName - - _EVENTDISPATCHER:OnEngineShutDownForUnit( Event.IniDCSUnitName, self._EventAddForCleanUp, self ) - _EVENTDISPATCHER:OnEngineStartUpForUnit( Event.IniDCSUnitName, self._EventAddForCleanUp, self ) - _EVENTDISPATCHER:OnHitForUnit( Event.IniDCSUnitName, self._EventAddForCleanUp, self ) - _EVENTDISPATCHER:OnPilotDeadForUnit( Event.IniDCSUnitName, self._EventCrash, self ) - _EVENTDISPATCHER:OnDeadForUnit( Event.IniDCSUnitName, self._EventCrash, self ) - _EVENTDISPATCHER:OnCrashForUnit( Event.IniDCSUnitName, self._EventCrash, self ) - _EVENTDISPATCHER:OnShotForUnit( Event.IniDCSUnitName, self._EventShot, self ) - - --self:AddEvent( world.event.S_EVENT_ENGINE_SHUTDOWN, self._EventAddForCleanUp ) - --self:AddEvent( world.event.S_EVENT_ENGINE_STARTUP, self._EventAddForCleanUp ) --- self:AddEvent( world.event.S_EVENT_HIT, self._EventAddForCleanUp ) -- , self._EventHitCleanUp ) --- self:AddEvent( world.event.S_EVENT_CRASH, self._EventCrash ) -- , self._EventHitCleanUp ) --- --self:AddEvent( world.event.S_EVENT_DEAD, self._EventCrash ) --- self:AddEvent( world.event.S_EVENT_SHOT, self._EventShot ) --- --- self:EnableEvents() - - -end - ---- Detects if a crash event occurs. --- Crashed units go into a CleanUpList for removal. --- @param #CLEANUP self --- @param DCSTypes#Event event -function CLEANUP:_EventCrash( Event ) - self:F( { Event } ) - - --TODO: This stuff is not working due to a DCS bug. Burning units cannot be destroyed. - --MESSAGE:New( "Crash ", "Crash", 10, "Crash" ):ToAll() - -- self:T("before getGroup") - -- local _grp = Unit.getGroup(event.initiator)-- Identify the group that fired - -- self:T("after getGroup") - -- _grp:destroy() - -- self:T("after deactivateGroup") - -- event.initiator:destroy() - - self.CleanUpList[Event.IniDCSUnitName] = {} - self.CleanUpList[Event.IniDCSUnitName].CleanUpUnit = Event.IniDCSUnit - self.CleanUpList[Event.IniDCSUnitName].CleanUpGroup = Event.IniDCSGroup - self.CleanUpList[Event.IniDCSUnitName].CleanUpGroupName = Event.IniDCSGroupName - self.CleanUpList[Event.IniDCSUnitName].CleanUpUnitName = Event.IniDCSUnitName - -end - ---- Detects if a unit shoots a missile. --- If this occurs within one of the zones, then the weapon used must be destroyed. --- @param #CLEANUP self --- @param DCSTypes#Event event -function CLEANUP:_EventShot( Event ) - self:F( { Event } ) - - -- Test if the missile was fired within one of the CLEANUP.ZoneNames. - local CurrentLandingZoneID = 0 - CurrentLandingZoneID = routines.IsUnitInZones( Event.IniDCSUnit, self.ZoneNames ) - if ( CurrentLandingZoneID ) then - -- Okay, the missile was fired within the CLEANUP.ZoneNames, destroy the fired weapon. - --_SEADmissile:destroy() - --routines.scheduleFunction( CLEANUP._DestroyMissile, { self, Event.Weapon }, timer.getTime() + 0.1) - SCHEDULER:New( self, CLEANUP._DestroyMissile, { Event.Weapon }, 0.1 ) - end -end - - ---- Detects if the Unit has an S_EVENT_HIT within the given ZoneNames. If this is the case, destroy the unit. --- @param #CLEANUP self --- @param DCSTypes#Event event -function CLEANUP:_EventHitCleanUp( Event ) - self:F( { Event } ) - - if Event.IniDCSUnit then - if routines.IsUnitInZones( Event.IniDCSUnit, self.ZoneNames ) ~= nil then - self:T( { "Life: ", Event.IniDCSUnitName, ' = ', Event.IniDCSUnit:getLife(), "/", Event.IniDCSUnit:getLife0() } ) - if Event.IniDCSUnit:getLife() < Event.IniDCSUnit:getLife0() then - self:T( "CleanUp: Destroy: " .. Event.IniDCSUnitName ) - --routines.scheduleFunction( CLEANUP._DestroyUnit, { self, Event.IniDCSUnit }, timer.getTime() + 0.1) - SCHEDULER:New( self, CLEANUP._DestroyUnit, { Event.IniDCSUnit }, 0.1 ) - end - end - end - - if Event.TgtDCSUnit then - if routines.IsUnitInZones( Event.TgtDCSUnit, self.ZoneNames ) ~= nil then - self:T( { "Life: ", Event.TgtDCSUnitName, ' = ', Event.TgtDCSUnit:getLife(), "/", Event.TgtDCSUnit:getLife0() } ) - if Event.TgtDCSUnit:getLife() < Event.TgtDCSUnit:getLife0() then - self:T( "CleanUp: Destroy: " .. Event.TgtDCSUnitName ) - --routines.scheduleFunction( CLEANUP._DestroyUnit, { self, Event.TgtDCSUnit }, timer.getTime() + 0.1 ) - SCHEDULER:New( self, CLEANUP._DestroyUnit, { Event.TgtDCSUnit }, 0.1 ) - end - end - end -end - ---- Add the @{DCSUnit#Unit} to the CleanUpList for CleanUp. -function CLEANUP:_AddForCleanUp( CleanUpUnit, CleanUpUnitName ) - self:F( { CleanUpUnit, CleanUpUnitName } ) - - self.CleanUpList[CleanUpUnitName] = {} - self.CleanUpList[CleanUpUnitName].CleanUpUnit = CleanUpUnit - self.CleanUpList[CleanUpUnitName].CleanUpUnitName = CleanUpUnitName - self.CleanUpList[CleanUpUnitName].CleanUpGroup = Unit.getGroup(CleanUpUnit) - self.CleanUpList[CleanUpUnitName].CleanUpGroupName = Unit.getGroup(CleanUpUnit):getName() - self.CleanUpList[CleanUpUnitName].CleanUpTime = timer.getTime() - self.CleanUpList[CleanUpUnitName].CleanUpMoved = false - - self:T( { "CleanUp: Add to CleanUpList: ", Unit.getGroup(CleanUpUnit):getName(), CleanUpUnitName } ) - -end - ---- Detects if the Unit has an S_EVENT_ENGINE_SHUTDOWN or an S_EVENT_HIT within the given ZoneNames. If this is the case, add the Group to the CLEANUP List. --- @param #CLEANUP self --- @param DCSTypes#Event event -function CLEANUP:_EventAddForCleanUp( Event ) - - if Event.IniDCSUnit then - if self.CleanUpList[Event.IniDCSUnitName] == nil then - if routines.IsUnitInZones( Event.IniDCSUnit, self.ZoneNames ) ~= nil then - self:_AddForCleanUp( Event.IniDCSUnit, Event.IniDCSUnitName ) - end - end - end - - if Event.TgtDCSUnit then - if self.CleanUpList[Event.TgtDCSUnitName] == nil then - if routines.IsUnitInZones( Event.TgtDCSUnit, self.ZoneNames ) ~= nil then - self:_AddForCleanUp( Event.TgtDCSUnit, Event.TgtDCSUnitName ) - end - end - end - -end - -local CleanUpSurfaceTypeText = { - "LAND", - "SHALLOW_WATER", - "WATER", - "ROAD", - "RUNWAY" - } - ---- At the defined time interval, CleanUp the Groups within the CleanUpList. --- @param #CLEANUP self -function CLEANUP:_CleanUpScheduler() - self:F( { "CleanUp Scheduler" } ) - - local CleanUpCount = 0 - for CleanUpUnitName, UnitData in pairs( self.CleanUpList ) do - CleanUpCount = CleanUpCount + 1 - - self:T( { CleanUpUnitName, UnitData } ) - local CleanUpUnit = Unit.getByName(UnitData.CleanUpUnitName) - local CleanUpGroupName = UnitData.CleanUpGroupName - local CleanUpUnitName = UnitData.CleanUpUnitName - if CleanUpUnit then - self:T( { "CleanUp Scheduler", "Checking:", CleanUpUnitName } ) - if _DATABASE:GetStatusGroup( CleanUpGroupName ) ~= "ReSpawn" then - local CleanUpUnitVec3 = CleanUpUnit:getPoint() - --self:T( CleanUpUnitVec3 ) - local CleanUpUnitVec2 = {} - CleanUpUnitVec2.x = CleanUpUnitVec3.x - CleanUpUnitVec2.y = CleanUpUnitVec3.z - --self:T( CleanUpUnitVec2 ) - local CleanUpSurfaceType = land.getSurfaceType(CleanUpUnitVec2) - --self:T( CleanUpSurfaceType ) - --MESSAGE:New( "Surface " .. CleanUpUnitName .. " = " .. CleanUpSurfaceTypeText[CleanUpSurfaceType], CleanUpUnitName, 10, CleanUpUnitName ):ToAll() - - if CleanUpUnit and CleanUpUnit:getLife() <= CleanUpUnit:getLife0() * 0.95 then - if CleanUpSurfaceType == land.SurfaceType.RUNWAY then - if CleanUpUnit:inAir() then - local CleanUpLandHeight = land.getHeight(CleanUpUnitVec2) - local CleanUpUnitHeight = CleanUpUnitVec3.y - CleanUpLandHeight - self:T( { "CleanUp Scheduler", "Height = " .. CleanUpUnitHeight } ) - if CleanUpUnitHeight < 30 then - self:T( { "CleanUp Scheduler", "Destroy " .. CleanUpUnitName .. " because below safe height and damaged." } ) - self:_DestroyUnit(CleanUpUnit, CleanUpUnitName) - end - else - self:T( { "CleanUp Scheduler", "Destroy " .. CleanUpUnitName .. " because on runway and damaged." } ) - self:_DestroyUnit(CleanUpUnit, CleanUpUnitName) - end - end - end - -- Clean Units which are waiting for a very long time in the CleanUpZone. - if CleanUpUnit then - local CleanUpUnitVelocity = CleanUpUnit:getVelocity() - local CleanUpUnitVelocityTotal = math.abs(CleanUpUnitVelocity.x) + math.abs(CleanUpUnitVelocity.y) + math.abs(CleanUpUnitVelocity.z) - if CleanUpUnitVelocityTotal < 1 then - if UnitData.CleanUpMoved then - if UnitData.CleanUpTime + 180 <= timer.getTime() then - self:T( { "CleanUp Scheduler", "Destroy due to not moving anymore " .. CleanUpUnitName } ) - self:_DestroyUnit(CleanUpUnit, CleanUpUnitName) - end - end - else - UnitData.CleanUpTime = timer.getTime() - UnitData.CleanUpMoved = true - --MESSAGE:New( "Moved " .. CleanUpUnitName, CleanUpUnitName, 10, CleanUpUnitName ):ToAll() - end - end - - else - -- Do nothing ... - self.CleanUpList[CleanUpUnitName] = nil -- Not anymore in the DCSRTE - end - else - self:T( "CleanUp: Group " .. CleanUpUnitName .. " cannot be found in DCS RTE, removing ..." ) - self.CleanUpList[CleanUpUnitName] = nil -- Not anymore in the DCSRTE - end - end - self:T(CleanUpCount) - - return true -end - ---- Dynamic spawning of groups (and units). --- --- @{#SPAWN} class --- =============== --- The @{#SPAWN} class allows to spawn dynamically new groups, based on pre-defined initialization settings, modifying the behaviour when groups are spawned. --- For each group to be spawned, within the mission editor, a group has to be created with the "late activation flag" set. We call this group the *"Spawn Template"* of the SPAWN object. --- A reference to this Spawn Template needs to be provided when constructing the SPAWN object, by indicating the name of the group within the mission editor in the constructor methods. --- --- Within the SPAWN object, there is an internal index that keeps track of which group from the internal group list was spawned. --- When new groups get spawned by using the SPAWN functions (see below), it will be validated whether the Limits (@{#SPAWN.Limit}) of the SPAWN object are not reached. --- When all is valid, a new group will be created by the spawning methods, and the internal index will be increased with 1. --- --- Regarding the name of new spawned groups, a _SpawnPrefix_ will be assigned for each new group created. --- If you want to have the Spawn Template name to be used as the _SpawnPrefix_ name, use the @{#SPAWN.New} constructor. --- However, when the @{#SPAWN.NewWithAlias} constructor was used, the Alias name will define the _SpawnPrefix_ name. --- Groups will follow the following naming structure when spawned at run-time: --- --- 1. Spawned groups will have the name _SpawnPrefix_#ggg, where ggg is a counter from 0 to 999. --- 2. Spawned units will have the name _SpawnPrefix_#ggg-uu, where uu is a counter from 0 to 99 for each new spawned unit belonging to the group. --- --- Some additional notes that need to be remembered: --- --- * Templates are actually groups defined within the mission editor, with the flag "Late Activation" set. As such, these groups are never used within the mission, but are used by the @{#SPAWN} module. --- * It is important to defined BEFORE you spawn new groups, a proper initialization of the SPAWN instance is done with the options you want to use. --- * When designing a mission, NEVER name groups using a "#" within the name of the group Spawn Template(s), or the SPAWN module logic won't work anymore. --- --- SPAWN construction methods: --- =========================== --- Create a new SPAWN object with the @{#SPAWN.New} or the @{#SPAWN.NewWithAlias} methods: --- --- * @{#SPAWN.New}: Creates a new SPAWN object taking the name of the group that functions as the Template. --- --- It is important to understand how the SPAWN class works internally. The SPAWN object created will contain internally a list of groups that will be spawned and that are already spawned. --- The initialization functions will modify this list of groups so that when a group gets spawned, ALL information is already prepared when spawning. This is done for performance reasons. --- So in principle, the group list will contain all parameters and configurations after initialization, and when groups get actually spawned, this spawning can be done quickly and efficient. --- --- SPAWN initialization methods: --- ============================= --- A spawn object will behave differently based on the usage of initialization methods: --- --- * @{#SPAWN.Limit}: Limits the amount of groups that can be alive at the same time and that can be dynamically spawned. --- * @{#SPAWN.RandomizeRoute}: Randomize the routes of spawned groups. --- * @{#SPAWN.RandomizeTemplate}: Randomize the group templates so that when a new group is spawned, a random group template is selected from one of the templates defined. --- * @{#SPAWN.Uncontrolled}: Spawn plane groups uncontrolled. --- * @{#SPAWN.Array}: Make groups visible before they are actually activated, and order these groups like a batallion in an array. --- * @{#SPAWN.InitRepeat}: Re-spawn groups when they land at the home base. Similar functions are @{#SPAWN.InitRepeatOnLanding} and @{#SPAWN.InitRepeatOnEngineShutDown}. --- --- SPAWN spawning methods: --- ======================= --- Groups can be spawned at different times and methods: --- --- * @{#SPAWN.Spawn}: Spawn one new group based on the last spawned index. --- * @{#SPAWN.ReSpawn}: Re-spawn a group based on a given index. --- * @{#SPAWN.SpawnScheduled}: Spawn groups at scheduled but randomized intervals. You can use @{#SPAWN.SpawnScheduleStart} and @{#SPAWN.SpawnScheduleStop} to start and stop the schedule respectively. --- * @{#SPAWN.SpawnFromUnit}: Spawn a new group taking the position of a @{UNIT}. --- * @{#SPAWN.SpawnInZone}: Spawn a new group in a @{ZONE}. --- --- Note that @{#SPAWN.Spawn} and @{#SPAWN.ReSpawn} return a @{GROUP#GROUP.New} object, that contains a reference to the DCSGroup object. --- You can use the @{GROUP} object to do further actions with the DCSGroup. --- --- SPAWN object cleaning: --- ========================= --- Sometimes, it will occur during a mission run-time, that ground or especially air objects get damaged, and will while being damged stop their activities, while remaining alive. --- In such cases, the SPAWN object will just sit there and wait until that group gets destroyed, but most of the time it won't, --- and it may occur that no new groups are or can be spawned as limits are reached. --- To prevent this, a @{#SPAWN.CleanUp} initialization method has been defined that will silently monitor the status of each spawned group. --- Once a group has a velocity = 0, and has been waiting for a defined interval, that group will be cleaned or removed from run-time. --- There is a catch however :-) If a damaged group has returned to an airbase within the coalition, that group will not be considered as "lost"... --- In such a case, when the inactive group is cleaned, a new group will Re-spawned automatically. --- This models AI that has succesfully returned to their airbase, to restart their combat activities. --- Check the @{#SPAWN.CleanUp} for further info. --- --- ==== --- @module Spawn --- @author FlightControl - -Include.File( "Routines" ) -Include.File( "Base" ) -Include.File( "Database" ) -Include.File( "Group" ) -Include.File( "Zone" ) -Include.File( "Event" ) -Include.File( "Scheduler" ) - ---- SPAWN Class --- @type SPAWN --- @extends Base#BASE --- @field ClassName --- @field #string SpawnTemplatePrefix --- @field #string SpawnAliasPrefix -SPAWN = { - ClassName = "SPAWN", - SpawnTemplatePrefix = nil, - SpawnAliasPrefix = nil, -} - - - ---- Creates the main object to spawn a GROUP defined in the DCS ME. --- @param #SPAWN self --- @param #string SpawnTemplatePrefix is the name of the Group in the ME that defines the Template. Each new group will have the name starting with SpawnTemplatePrefix. --- @return #SPAWN --- @usage --- -- NATO helicopters engaging in the battle field. --- Spawn_BE_KA50 = SPAWN:New( 'BE KA-50@RAMP-Ground Defense' ) --- @usage local Plane = SPAWN:New( "Plane" ) -- Creates a new local variable that can initiate new planes with the name "Plane#ddd" using the template "Plane" as defined within the ME. -function SPAWN:New( SpawnTemplatePrefix ) - local self = BASE:Inherit( self, BASE:New() ) - self:F( { SpawnTemplatePrefix } ) - - local TemplateGroup = Group.getByName( SpawnTemplatePrefix ) - if TemplateGroup then - self.SpawnTemplatePrefix = SpawnTemplatePrefix - self.SpawnIndex = 0 - self.SpawnCount = 0 -- The internal counter of the amount of spawning the has happened since SpawnStart. - self.AliveUnits = 0 -- Contains the counter how many units are currently alive - self.SpawnIsScheduled = false -- Reflects if the spawning for this SpawnTemplatePrefix is going to be scheduled or not. - self.SpawnTemplate = self._GetTemplate( self, SpawnTemplatePrefix ) -- Contains the template structure for a Group Spawn from the Mission Editor. Note that this group must have lateActivation always on!!! - self.Repeat = false -- Don't repeat the group from Take-Off till Landing and back Take-Off by ReSpawning. - self.UnControlled = false -- When working in UnControlled mode, all planes are Spawned in UnControlled mode before the scheduler starts. - self.SpawnMaxUnitsAlive = 0 -- The maximum amount of groups that can be alive of SpawnTemplatePrefix at the same time. - self.SpawnMaxGroups = 0 -- The maximum amount of groups that can be spawned. - self.SpawnRandomize = false -- Sets the randomization flag of new Spawned units to false. - self.SpawnVisible = false -- Flag that indicates if all the Groups of the SpawnGroup need to be visible when Spawned. - - self.SpawnGroups = {} -- Array containing the descriptions of each Group to be Spawned. - else - error( "SPAWN:New: There is no group declared in the mission editor with SpawnTemplatePrefix = '" .. SpawnTemplatePrefix .. "'" ) - end - - return self -end - ---- Creates a new SPAWN instance to create new groups based on the defined template and using a new alias for each new group. --- @param #SPAWN self --- @param #string SpawnTemplatePrefix is the name of the Group in the ME that defines the Template. --- @param #string SpawnAliasPrefix is the name that will be given to the Group at runtime. --- @return #SPAWN --- @usage --- -- NATO helicopters engaging in the battle field. --- Spawn_BE_KA50 = SPAWN:NewWithAlias( 'BE KA-50@RAMP-Ground Defense', 'Helicopter Attacking a City' ) --- @usage local PlaneWithAlias = SPAWN:NewWithAlias( "Plane", "Bomber" ) -- Creates a new local variable that can instantiate new planes with the name "Bomber#ddd" using the template "Plane" as defined within the ME. -function SPAWN:NewWithAlias( SpawnTemplatePrefix, SpawnAliasPrefix ) - local self = BASE:Inherit( self, BASE:New() ) - self:F( { SpawnTemplatePrefix, SpawnAliasPrefix } ) - - local TemplateGroup = Group.getByName( SpawnTemplatePrefix ) - if TemplateGroup then - self.SpawnTemplatePrefix = SpawnTemplatePrefix - self.SpawnAliasPrefix = SpawnAliasPrefix - self.SpawnIndex = 0 - self.SpawnCount = 0 -- The internal counter of the amount of spawning the has happened since SpawnStart. - self.AliveUnits = 0 -- Contains the counter how many units are currently alive - self.SpawnIsScheduled = false -- Reflects if the spawning for this SpawnTemplatePrefix is going to be scheduled or not. - self.SpawnTemplate = self._GetTemplate( self, SpawnTemplatePrefix ) -- Contains the template structure for a Group Spawn from the Mission Editor. Note that this group must have lateActivation always on!!! - self.Repeat = false -- Don't repeat the group from Take-Off till Landing and back Take-Off by ReSpawning. - self.UnControlled = false -- When working in UnControlled mode, all planes are Spawned in UnControlled mode before the scheduler starts. - self.SpawnMaxUnitsAlive = 0 -- The maximum amount of groups that can be alive of SpawnTemplatePrefix at the same time. - self.SpawnMaxGroups = 0 -- The maximum amount of groups that can be spawned. - self.SpawnRandomize = false -- Sets the randomization flag of new Spawned units to false. - self.SpawnVisible = false -- Flag that indicates if all the Groups of the SpawnGroup need to be visible when Spawned. - - self.SpawnGroups = {} -- Array containing the descriptions of each Group to be Spawned. - else - error( "SPAWN:New: There is no group declared in the mission editor with SpawnTemplatePrefix = '" .. SpawnTemplatePrefix .. "'" ) - end - - return self -end - - ---- Limits the Maximum amount of Units that can be alive at the same time, and the maximum amount of groups that can be spawned. --- Note that this method is exceptionally important to balance the performance of the mission. Depending on the machine etc, a mission can only process a maximum amount of units. --- If the time interval must be short, but there should not be more Units or Groups alive than a maximum amount of units, then this function should be used... --- When a @{#SPAWN.New} is executed and the limit of the amount of units alive is reached, then no new spawn will happen of the group, until some of these units of the spawn object will be destroyed. --- @param #SPAWN self --- @param #number SpawnMaxUnitsAlive The maximum amount of units that can be alive at runtime. --- @param #number SpawnMaxGroups The maximum amount of groups that can be spawned. When the limit is reached, then no more actual spawns will happen of the group. --- This parameter is useful to define a maximum amount of airplanes, ground troops, helicopters, ships etc within a supply area. --- This parameter accepts the value 0, which defines that there are no maximum group limits, but there are limits on the maximum of units that can be alive at the same time. --- @return #SPAWN self --- @usage --- -- NATO helicopters engaging in the battle field. --- -- This helicopter group consists of one Unit. So, this group will SPAWN maximum 2 groups simultaneously within the DCSRTE. --- -- There will be maximum 24 groups spawned during the whole mission lifetime. --- Spawn_BE_KA50 = SPAWN:New( 'BE KA-50@RAMP-Ground Defense' ):Limit( 2, 24 ) -function SPAWN:Limit( SpawnMaxUnitsAlive, SpawnMaxGroups ) - self:F( { self.SpawnTemplatePrefix, SpawnMaxUnitsAlive, SpawnMaxGroups } ) - - self.SpawnMaxUnitsAlive = SpawnMaxUnitsAlive -- The maximum amount of groups that can be alive of SpawnTemplatePrefix at the same time. - self.SpawnMaxGroups = SpawnMaxGroups -- The maximum amount of groups that can be spawned. - - for SpawnGroupID = 1, self.SpawnMaxGroups do - self:_InitializeSpawnGroups( SpawnGroupID ) - end - - return self -end - - ---- Randomizes the defined route of the SpawnTemplatePrefix group in the ME. This is very useful to define extra variation of the behaviour of groups. --- @param #SPAWN self --- @param #number SpawnStartPoint is the waypoint where the randomization begins. --- Note that the StartPoint = 0 equaling the point where the group is spawned. --- @param #number SpawnEndPoint is the waypoint where the randomization ends counting backwards. --- This parameter is useful to avoid randomization to end at a waypoint earlier than the last waypoint on the route. --- @param #number SpawnRadius is the radius in meters in which the randomization of the new waypoints, with the original waypoint of the original template located in the middle ... --- @return #SPAWN --- @usage --- -- NATO helicopters engaging in the battle field. --- -- The KA-50 has waypoints Start point ( =0 or SP ), 1, 2, 3, 4, End point (= 5 or DP). --- -- Waypoints 2 and 3 will only be randomized. The others will remain on their original position with each new spawn of the helicopter. --- -- The randomization of waypoint 2 and 3 will take place within a radius of 2000 meters. --- Spawn_BE_KA50 = SPAWN:New( 'BE KA-50@RAMP-Ground Defense' ):RandomizeRoute( 2, 2, 2000 ) -function SPAWN:RandomizeRoute( SpawnStartPoint, SpawnEndPoint, SpawnRadius ) - self:F( { self.SpawnTemplatePrefix, SpawnStartPoint, SpawnEndPoint, SpawnRadius } ) - - self.SpawnRandomizeRoute = true - self.SpawnRandomizeRouteStartPoint = SpawnStartPoint - self.SpawnRandomizeRouteEndPoint = SpawnEndPoint - self.SpawnRandomizeRouteRadius = SpawnRadius - - for GroupID = 1, self.SpawnMaxGroups do - self:_RandomizeRoute( GroupID ) - end - - return self -end - - ---- This function is rather complicated to understand. But I'll try to explain. --- This function becomes useful when you need to spawn groups with random templates of groups defined within the mission editor, --- but they will all follow the same Template route and have the same prefix name. --- In other words, this method randomizes between a defined set of groups the template to be used for each new spawn of a group. --- @param #SPAWN self --- @param #string SpawnTemplatePrefixTable A table with the names of the groups defined within the mission editor, from which one will be choosen when a new group will be spawned. --- @return #SPAWN --- @usage --- -- NATO Tank Platoons invading Gori. --- -- Choose between 13 different 'US Tank Platoon' configurations for each new SPAWN the Group to be spawned for the --- -- 'US Tank Platoon Left', 'US Tank Platoon Middle' and 'US Tank Platoon Right' SpawnTemplatePrefixes. --- -- Each new SPAWN will randomize the route, with a defined time interval of 200 seconds with 40% time variation (randomization) and --- -- with a limit set of maximum 12 Units alive simulteneously and 150 Groups to be spawned during the whole mission. --- Spawn_US_Platoon = { 'US Tank Platoon 1', 'US Tank Platoon 2', 'US Tank Platoon 3', 'US Tank Platoon 4', 'US Tank Platoon 5', --- 'US Tank Platoon 6', 'US Tank Platoon 7', 'US Tank Platoon 8', 'US Tank Platoon 9', 'US Tank Platoon 10', --- 'US Tank Platoon 11', 'US Tank Platoon 12', 'US Tank Platoon 13' } --- Spawn_US_Platoon_Left = SPAWN:New( 'US Tank Platoon Left' ):Limit( 12, 150 ):Schedule( 200, 0.4 ):RandomizeTemplate( Spawn_US_Platoon ):RandomizeRoute( 3, 3, 2000 ) --- Spawn_US_Platoon_Middle = SPAWN:New( 'US Tank Platoon Middle' ):Limit( 12, 150 ):Schedule( 200, 0.4 ):RandomizeTemplate( Spawn_US_Platoon ):RandomizeRoute( 3, 3, 2000 ) --- Spawn_US_Platoon_Right = SPAWN:New( 'US Tank Platoon Right' ):Limit( 12, 150 ):Schedule( 200, 0.4 ):RandomizeTemplate( Spawn_US_Platoon ):RandomizeRoute( 3, 3, 2000 ) -function SPAWN:RandomizeTemplate( SpawnTemplatePrefixTable ) - self:F( { self.SpawnTemplatePrefix, SpawnTemplatePrefixTable } ) - - self.SpawnTemplatePrefixTable = SpawnTemplatePrefixTable - self.SpawnRandomizeTemplate = true - - for SpawnGroupID = 1, self.SpawnMaxGroups do - self:_RandomizeTemplate( SpawnGroupID ) - end - - return self -end - - - - - ---- For planes and helicopters, when these groups go home and land on their home airbases and farps, they normally would taxi to the parking spot, shut-down their engines and wait forever until the Group is removed by the runtime environment. --- This function is used to re-spawn automatically (so no extra call is needed anymore) the same group after it has landed. --- This will enable a spawned group to be re-spawned after it lands, until it is destroyed... --- Note: When the group is respawned, it will re-spawn from the original airbase where it took off. --- So ensure that the routes for groups that respawn, always return to the original airbase, or players may get confused ... --- @param #SPAWN self --- @return #SPAWN self --- @usage --- -- RU Su-34 - AI Ship Attack --- -- Re-SPAWN the Group(s) after each landing and Engine Shut-Down automatically. --- SpawnRU_SU34 = SPAWN:New( 'TF1 RU Su-34 Krymsk@AI - Attack Ships' ):Schedule( 2, 3, 1800, 0.4 ):SpawnUncontrolled():RandomizeRoute( 1, 1, 3000 ):RepeatOnEngineShutDown() -function SPAWN:InitRepeat() - self:F( { self.SpawnTemplatePrefix, self.SpawnIndex } ) - - self.Repeat = true - self.RepeatOnEngineShutDown = false - self.RepeatOnLanding = true - - return self -end - ---- Respawn group after landing. --- @param #SPAWN self --- @return #SPAWN self -function SPAWN:InitRepeatOnLanding() - self:F( { self.SpawnTemplatePrefix } ) - - self:InitRepeat() - self.RepeatOnEngineShutDown = false - self.RepeatOnLanding = true - - return self -end - - ---- Respawn after landing when its engines have shut down. --- @param #SPAWN self --- @return #SPAWN self -function SPAWN:InitRepeatOnEngineShutDown() - self:F( { self.SpawnTemplatePrefix } ) - - self:InitRepeat() - self.RepeatOnEngineShutDown = true - self.RepeatOnLanding = false - - return self -end - - ---- CleanUp groups when they are still alive, but inactive. --- When groups are still alive and have become inactive due to damage and are unable to contribute anything, then this group will be removed at defined intervals in seconds. --- @param #SPAWN self --- @param #string SpawnCleanUpInterval The interval to check for inactive groups within seconds. --- @return #SPAWN self --- @usage Spawn_Helicopter:CleanUp( 20 ) -- CleanUp the spawning of the helicopters every 20 seconds when they become inactive. -function SPAWN:CleanUp( SpawnCleanUpInterval ) - self:F( { self.SpawnTemplatePrefix, SpawnCleanUpInterval } ) - - self.SpawnCleanUpInterval = SpawnCleanUpInterval - self.SpawnCleanUpTimeStamps = {} - --self.CleanUpFunction = routines.scheduleFunction( self._SpawnCleanUpScheduler, { self }, timer.getTime() + 1, SpawnCleanUpInterval ) - self.CleanUpScheduler = SCHEDULER:New( self, self._SpawnCleanUpScheduler, {}, 1, SpawnCleanUpInterval, 0.2 ) - return self -end - - - ---- Makes the groups visible before start (like a batallion). --- The method will take the position of the group as the first position in the array. --- @param #SPAWN self --- @param #number SpawnAngle The angle in degrees how the groups and each unit of the group will be positioned. --- @param #number SpawnWidth The amount of Groups that will be positioned on the X axis. --- @param #number SpawnDeltaX The space between each Group on the X-axis. --- @param #number SpawnDeltaY The space between each Group on the Y-axis. --- @return #SPAWN self --- @usage --- -- Define an array of Groups. --- Spawn_BE_Ground = SPAWN:New( 'BE Ground' ):Limit( 2, 24 ):Visible( 90, "Diamond", 10, 100, 50 ) -function SPAWN:Array( SpawnAngle, SpawnWidth, SpawnDeltaX, SpawnDeltaY ) - self:F( { self.SpawnTemplatePrefix, SpawnAngle, SpawnWidth, SpawnDeltaX, SpawnDeltaY } ) - - self.SpawnVisible = true -- When the first Spawn executes, all the Groups need to be made visible before start. - - local SpawnX = 0 - local SpawnY = 0 - local SpawnXIndex = 0 - local SpawnYIndex = 0 - - for SpawnGroupID = 1, self.SpawnMaxGroups do - self:T( { SpawnX, SpawnY, SpawnXIndex, SpawnYIndex } ) - - self.SpawnGroups[SpawnGroupID].Visible = true - self.SpawnGroups[SpawnGroupID].Spawned = false - - SpawnXIndex = SpawnXIndex + 1 - if SpawnWidth and SpawnWidth ~= 0 then - if SpawnXIndex >= SpawnWidth then - SpawnXIndex = 0 - SpawnYIndex = SpawnYIndex + 1 - end - end - - local SpawnRootX = self.SpawnGroups[SpawnGroupID].SpawnTemplate.x - local SpawnRootY = self.SpawnGroups[SpawnGroupID].SpawnTemplate.y - - self:_TranslateRotate( SpawnGroupID, SpawnRootX, SpawnRootY, SpawnX, SpawnY, SpawnAngle ) - - self.SpawnGroups[SpawnGroupID].SpawnTemplate.lateActivation = true - self.SpawnGroups[SpawnGroupID].SpawnTemplate.visible = true - - self.SpawnGroups[SpawnGroupID].Visible = true - - _EVENTDISPATCHER:OnBirthForTemplate( self.SpawnGroups[SpawnGroupID].SpawnTemplate, self._OnBirth, self ) - _EVENTDISPATCHER:OnCrashForTemplate( self.SpawnGroups[SpawnGroupID].SpawnTemplate, self._OnDeadOrCrash, self ) - _EVENTDISPATCHER:OnDeadForTemplate( self.SpawnGroups[SpawnGroupID].SpawnTemplate, self._OnDeadOrCrash, self ) - - if self.Repeat then - _EVENTDISPATCHER:OnTakeOffForTemplate( self.SpawnGroups[SpawnGroupID].SpawnTemplate, self._OnTakeOff, self ) - _EVENTDISPATCHER:OnLandForTemplate( self.SpawnGroups[SpawnGroupID].SpawnTemplate, self._OnLand, self ) - end - if self.RepeatOnEngineShutDown then - _EVENTDISPATCHER:OnEngineShutDownForTemplate( self.SpawnGroups[SpawnGroupID].SpawnTemplate, self._OnEngineShutDown, self ) - end - - self.SpawnGroups[SpawnGroupID].Group = _DATABASE:Spawn( self.SpawnGroups[SpawnGroupID].SpawnTemplate ) - - SpawnX = SpawnXIndex * SpawnDeltaX - SpawnY = SpawnYIndex * SpawnDeltaY - end - - return self -end - - - ---- Will spawn a group based on the internal index. --- Note: Uses @{DATABASE} module defined in MOOSE. --- @param #SPAWN self --- @return Group#GROUP The group that was spawned. You can use this group for further actions. -function SPAWN:Spawn() - self:F( { self.SpawnTemplatePrefix, self.SpawnIndex } ) - - return self:SpawnWithIndex( self.SpawnIndex + 1 ) -end - ---- Will re-spawn a group based on a given index. --- Note: Uses @{DATABASE} module defined in MOOSE. --- @param #SPAWN self --- @param #string SpawnIndex The index of the group to be spawned. --- @return Group#GROUP The group that was spawned. You can use this group for further actions. -function SPAWN:ReSpawn( SpawnIndex ) - self:F( { self.SpawnTemplatePrefix, SpawnIndex } ) - - if not SpawnIndex then - SpawnIndex = 1 - end - --- TODO: This logic makes DCS crash and i don't know why (yet). - local SpawnGroup = self:GetGroupFromIndex( SpawnIndex ) - if SpawnGroup then - local SpawnDCSGroup = SpawnGroup:GetDCSGroup() - if SpawnDCSGroup then - SpawnGroup:Destroy() - end - end - - return self:SpawnWithIndex( SpawnIndex ) -end - ---- Will spawn a group with a specified index number. --- Uses @{DATABASE} global object defined in MOOSE. --- @param #SPAWN self --- @return Group#GROUP The group that was spawned. You can use this group for further actions. -function SPAWN:SpawnWithIndex( SpawnIndex ) - self:F( { self.SpawnTemplatePrefix, SpawnIndex, self.SpawnMaxGroups } ) - - if self:_GetSpawnIndex( SpawnIndex ) then - - if self.SpawnGroups[self.SpawnIndex].Visible then - self.SpawnGroups[self.SpawnIndex].Group:Activate() - else - self:T( self.SpawnGroups[self.SpawnIndex].SpawnTemplate ) - _EVENTDISPATCHER:OnBirthForTemplate( self.SpawnGroups[self.SpawnIndex].SpawnTemplate, self._OnBirth, self ) - _EVENTDISPATCHER:OnCrashForTemplate( self.SpawnGroups[self.SpawnIndex].SpawnTemplate, self._OnDeadOrCrash, self ) - _EVENTDISPATCHER:OnDeadForTemplate( self.SpawnGroups[self.SpawnIndex].SpawnTemplate, self._OnDeadOrCrash, self ) - - if self.Repeat then - _EVENTDISPATCHER:OnTakeOffForTemplate( self.SpawnGroups[self.SpawnIndex].SpawnTemplate, self._OnTakeOff, self ) - _EVENTDISPATCHER:OnLandForTemplate( self.SpawnGroups[self.SpawnIndex].SpawnTemplate, self._OnLand, self ) - end - if self.RepeatOnEngineShutDown then - _EVENTDISPATCHER:OnEngineShutDownForTemplate( self.SpawnGroups[self.SpawnIndex].SpawnTemplate, self._OnEngineShutDown, self ) - end - - self:T( self.SpawnGroups[self.SpawnIndex].SpawnTemplate ) - - self.SpawnGroups[self.SpawnIndex].Group = _DATABASE:Spawn( self.SpawnGroups[self.SpawnIndex].SpawnTemplate ) - - -- If there is a SpawnFunction hook defined, call it. - if self.SpawnFunctionHook then - self.SpawnFunctionHook( self.SpawnGroups[self.SpawnIndex].Group, unpack( self.SpawnFunctionArguments ) ) - end - -- TODO: Need to fix this by putting an "R" in the name of the group when the group repeats. - --if self.Repeat then - -- _DATABASE:SetStatusGroup( SpawnTemplate.name, "ReSpawn" ) - --end - end - - self.SpawnGroups[self.SpawnIndex].Spawned = true - return self.SpawnGroups[self.SpawnIndex].Group - else - --self:E( { self.SpawnTemplatePrefix, "No more Groups to Spawn:", SpawnIndex, self.SpawnMaxGroups } ) - end - - return nil -end - ---- Spawns new groups at varying time intervals. --- This is useful if you want to have continuity within your missions of certain (AI) groups to be present (alive) within your missions. --- @param #SPAWN self --- @param #number SpawnTime The time interval defined in seconds between each new spawn of new groups. --- @param #number SpawnTimeVariation The variation to be applied on the defined time interval between each new spawn. --- The variation is a number between 0 and 1, representing the %-tage of variation to be applied on the time interval. --- @return #SPAWN self --- @usage --- -- NATO helicopters engaging in the battle field. --- -- The time interval is set to SPAWN new helicopters between each 600 seconds, with a time variation of 50%. --- -- The time variation in this case will be between 450 seconds and 750 seconds. --- -- This is calculated as follows: --- -- Low limit: 600 * ( 1 - 0.5 / 2 ) = 450 --- -- High limit: 600 * ( 1 + 0.5 / 2 ) = 750 --- -- Between these two values, a random amount of seconds will be choosen for each new spawn of the helicopters. --- Spawn_BE_KA50 = SPAWN:New( 'BE KA-50@RAMP-Ground Defense' ):Schedule( 600, 0.5 ) -function SPAWN:SpawnScheduled( SpawnTime, SpawnTimeVariation ) - self:F( { SpawnTime, SpawnTimeVariation } ) - - if SpawnTime ~= nil and SpawnTimeVariation ~= nil then - self.SpawnScheduler = SCHEDULER:New( self, self._Scheduler, {}, 1, SpawnTime, SpawnTimeVariation ) - end - - return self -end - ---- Will re-start the spawning scheduler. --- Note: This function is only required to be called when the schedule was stopped. -function SPAWN:SpawnScheduleStart() - self:F( { self.SpawnTemplatePrefix } ) - - self.SpawnScheduler:Start() -end - ---- Will stop the scheduled spawning scheduler. -function SPAWN:SpawnScheduleStop() - self:F( { self.SpawnTemplatePrefix } ) - - self.SpawnScheduler:Stop() -end - - ---- Allows to place a CallFunction hook when a new group spawns. --- The provided function will be called when a new group is spawned, including its given parameters. --- The first parameter of the SpawnFunction is the @{Group#GROUP} that was spawned. --- @param #SPAWN self --- @param #function SpawnFunctionHook The function to be called when a group spawns. --- @param SpawnFunctionArguments A random amount of arguments to be provided to the function when the group spawns. --- @return #SPAWN -function SPAWN:SpawnFunction( SpawnFunctionHook, ... ) - self:F( SpawnFunction ) - - self.SpawnFunctionHook = SpawnFunctionHook - self.SpawnFunctionArguments = {} - if arg then - self.SpawnFunctionArguments = arg - end - - return self -end - - - - ---- Will spawn a group from a hosting unit. This function is mostly advisable to be used if you want to simulate spawning from air units, like helicopters, which are dropping infantry into a defined Landing Zone. --- Note that each point in the route assigned to the spawning group is reset to the point of the spawn. --- You can use the returned group to further define the route to be followed. --- @param #SPAWN self --- @param Unit#UNIT HostUnit The air or ground unit dropping or unloading the group. --- @param #number OuterRadius The outer radius in meters where the new group will be spawned. --- @param #number InnerRadius The inner radius in meters where the new group will NOT be spawned. --- @param #number SpawnIndex (Optional) The index which group to spawn within the given zone. --- @return Group#GROUP that was spawned. --- @return #nil Nothing was spawned. -function SPAWN:SpawnFromUnit( HostUnit, OuterRadius, InnerRadius, SpawnIndex ) - self:F( { self.SpawnTemplatePrefix, HostUnit, OuterRadius, InnerRadius, SpawnIndex } ) - - if HostUnit and HostUnit:IsAlive() then -- and HostUnit:getUnit(1):inAir() == false then - - if SpawnIndex then - else - SpawnIndex = self.SpawnIndex + 1 - end - - if self:_GetSpawnIndex( SpawnIndex ) then - - local SpawnTemplate = self.SpawnGroups[self.SpawnIndex].SpawnTemplate - - if SpawnTemplate then - - local UnitPoint = HostUnit:GetPointVec2() - - self:T( { "Current point of ", self.SpawnTemplatePrefix, UnitPoint } ) - - --for PointID, Point in pairs( SpawnTemplate.route.points ) do - --Point.x = UnitPoint.x - --Point.y = UnitPoint.y - --Point.alt = nil - --Point.alt_type = nil - --end - - SpawnTemplate.route.points[1].x = UnitPoint.x - SpawnTemplate.route.points[1].y = UnitPoint.y - - if not InnerRadius then - InnerRadius = 10 - end - - if not OuterRadius then - OuterRadius = 50 - end - - -- Apply SpawnFormation - for UnitID = 1, #SpawnTemplate.units do - if InnerRadius == 0 then - SpawnTemplate.units[UnitID].x = UnitPoint.x - SpawnTemplate.units[UnitID].y = UnitPoint.y - else - local CirclePos = routines.getRandPointInCircle( UnitPoint, OuterRadius, InnerRadius ) - SpawnTemplate.units[UnitID].x = CirclePos.x - SpawnTemplate.units[UnitID].y = CirclePos.y - end - self:T( 'SpawnTemplate.units['..UnitID..'].x = ' .. SpawnTemplate.units[UnitID].x .. ', SpawnTemplate.units['..UnitID..'].y = ' .. SpawnTemplate.units[UnitID].y ) - end - - local SpawnPos = routines.getRandPointInCircle( UnitPoint, OuterRadius, InnerRadius ) - local Point = {} - Point.type = "Turning Point" - Point.x = SpawnPos.x - Point.y = SpawnPos.y - Point.action = "Cone" - Point.speed = 5 - - table.insert( SpawnTemplate.route.points, 2, Point ) - - return self:SpawnWithIndex( self.SpawnIndex ) - end - end - end - - return nil -end - ---- Will spawn a Group within a given @{Zone#ZONE}. --- Once the group is spawned within the zone, it will continue on its route. --- The first waypoint (where the group is spawned) is replaced with the zone coordinates. --- @param #SPAWN self --- @param Zone#ZONE Zone The zone where the group is to be spawned. --- @param #number ZoneRandomize (Optional) Set to true if you want to randomize the starting point in the zone. --- @param #number SpawnIndex (Optional) The index which group to spawn within the given zone. --- @return Group#GROUP that was spawned. --- @return #nil when nothing was spawned. -function SPAWN:SpawnInZone( Zone, ZoneRandomize, SpawnIndex ) - self:F( { self.SpawnTemplatePrefix, Zone, ZoneRandomize, SpawnIndex } ) - - if Zone then - - if SpawnIndex then - else - SpawnIndex = self.SpawnIndex + 1 - end - - if self:_GetSpawnIndex( SpawnIndex ) then - - local SpawnTemplate = self.SpawnGroups[self.SpawnIndex].SpawnTemplate - - if SpawnTemplate then - - local ZonePoint - - if ZoneRandomize == true then - ZonePoint = Zone:GetRandomPointVec2() - else - ZonePoint = Zone:GetPointVec2() - end - - SpawnTemplate.route.points[1].x = ZonePoint.x - SpawnTemplate.route.points[1].y = ZonePoint.y - - -- Apply SpawnFormation - for UnitID = 1, #SpawnTemplate.units do - local ZonePointUnit = Zone:GetRandomPointVec2() - SpawnTemplate.units[UnitID].x = ZonePointUnit.x - SpawnTemplate.units[UnitID].y = ZonePointUnit.y - self:T( 'SpawnTemplate.units['..UnitID..'].x = ' .. SpawnTemplate.units[UnitID].x .. ', SpawnTemplate.units['..UnitID..'].y = ' .. SpawnTemplate.units[UnitID].y ) - end - - return self:SpawnWithIndex( self.SpawnIndex ) - end - end - end - - return nil -end - - - - ---- Will spawn a plane group in uncontrolled mode... --- This will be similar to the uncontrolled flag setting in the ME. --- @return #SPAWN self -function SPAWN:UnControlled() - self:F( { self.SpawnTemplatePrefix } ) - - self.SpawnUnControlled = true - - for SpawnGroupID = 1, self.SpawnMaxGroups do - self.SpawnGroups[SpawnGroupID].UnControlled = true - end - - return self -end - - - ---- Will return the SpawnGroupName either with with a specific count number or without any count. --- @param #SPAWN self --- @param #number SpawnIndex Is the number of the Group that is to be spawned. --- @return #string SpawnGroupName -function SPAWN:SpawnGroupName( SpawnIndex ) - self:F( { self.SpawnTemplatePrefix, SpawnIndex } ) - - local SpawnPrefix = self.SpawnTemplatePrefix - if self.SpawnAliasPrefix then - SpawnPrefix = self.SpawnAliasPrefix - end - - if SpawnIndex then - local SpawnName = string.format( '%s#%03d', SpawnPrefix, SpawnIndex ) - self:T( SpawnName ) - return SpawnName - else - self:T( SpawnPrefix ) - return SpawnPrefix - end - -end - ---- Find the first alive group. --- @param #SPAWN self --- @param #number SpawnCursor A number holding the index from where to find the first group from. --- @return Group#GROUP, #number The group found, the new index where the group was found. --- @return #nil, #nil When no group is found, #nil is returned. -function SPAWN:GetFirstAliveGroup( SpawnCursor ) - self:F( { self.SpawnTemplatePrefix, self.SpawnAliasPrefix, SpawnCursor } ) - - for SpawnIndex = 1, self.SpawnCount do - local SpawnGroup = self:GetGroupFromIndex( SpawnIndex ) - if SpawnGroup and SpawnGroup:IsAlive() then - SpawnCursor = SpawnIndex - return SpawnGroup, SpawnCursor - end - end - - return nil, nil -end - - ---- Find the next alive group. --- @param #SPAWN self --- @param #number SpawnCursor A number holding the last found previous index. --- @return Group#GROUP, #number The group found, the new index where the group was found. --- @return #nil, #nil When no group is found, #nil is returned. -function SPAWN:GetNextAliveGroup( SpawnCursor ) - self:F( { self.SpawnTemplatePrefix, self.SpawnAliasPrefix, SpawnCursor } ) - - SpawnCursor = SpawnCursor + 1 - for SpawnIndex = SpawnCursor, self.SpawnCount do - local SpawnGroup = self:GetGroupFromIndex( SpawnIndex ) - if SpawnGroup and SpawnGroup:IsAlive() then - SpawnCursor = SpawnIndex - return SpawnGroup, SpawnCursor - end - end - - return nil, nil -end - ---- Find the last alive group during runtime. -function SPAWN:GetLastAliveGroup() - self:F( { self.SpawnTemplatePrefixself.SpawnAliasPrefix } ) - - self.SpawnIndex = self:_GetLastIndex() - for SpawnIndex = self.SpawnIndex, 1, -1 do - local SpawnGroup = self:GetGroupFromIndex( SpawnIndex ) - if SpawnGroup and SpawnGroup:IsAlive() then - self.SpawnIndex = SpawnIndex - return SpawnGroup - end - end - - self.SpawnIndex = nil - return nil -end - - - ---- Get the group from an index. --- Returns the group from the SpawnGroups list. --- If no index is given, it will return the first group in the list. --- @param #SPAWN self --- @param #number SpawnIndex The index of the group to return. --- @return Group#GROUP -function SPAWN:GetGroupFromIndex( SpawnIndex ) - self:F( { self.SpawnTemplatePrefix, self.SpawnAliasPrefix, SpawnIndex } ) - - if not SpawnIndex then - SpawnIndex = 1 - end - - if self.SpawnGroups and self.SpawnGroups[SpawnIndex] then - local SpawnGroup = self.SpawnGroups[SpawnIndex].Group - return SpawnGroup - else - return nil - end -end - ---- Get the group index from a DCSUnit. --- The method will search for a #-mark, and will return the index behind the #-mark of the DCSUnit. --- It will return nil of no prefix was found. --- @param #SPAWN self --- @param DCSUnit The DCS unit to be searched. --- @return #string The prefix --- @return #nil Nothing found -function SPAWN:_GetGroupIndexFromDCSUnit( DCSUnit ) - self:F( { self.SpawnTemplatePrefix, self.SpawnAliasPrefix, DCSUnit } ) - - if DCSUnit and DCSUnit:getName() then - local IndexString = string.match( DCSUnit:getName(), "#.*-" ):sub( 2, -2 ) - self:T( IndexString ) - - if IndexString then - local Index = tonumber( IndexString ) - self:T( { "Index:", IndexString, Index } ) - return Index - end - end - - return nil -end - ---- Return the prefix of a DCSUnit. --- The method will search for a #-mark, and will return the text before the #-mark. --- It will return nil of no prefix was found. --- @param #SPAWN self --- @param DCSUnit The DCS unit to be searched. --- @return #string The prefix --- @return #nil Nothing found -function SPAWN:_GetPrefixFromDCSUnit( DCSUnit ) - self:F( { self.SpawnTemplatePrefix, self.SpawnAliasPrefix, DCSUnit } ) - - if DCSUnit and DCSUnit:getName() then - local SpawnPrefix = string.match( DCSUnit:getName(), ".*#" ) - if SpawnPrefix then - SpawnPrefix = SpawnPrefix:sub( 1, -2 ) - end - self:T( SpawnPrefix ) - return SpawnPrefix - end - - return nil -end - ---- Return the group within the SpawnGroups collection with input a DCSUnit. -function SPAWN:_GetGroupFromDCSUnit( DCSUnit ) - self:F( { self.SpawnTemplatePrefix, self.SpawnAliasPrefix, DCSUnit } ) - - if DCSUnit then - local SpawnPrefix = self:_GetPrefixFromDCSUnit( DCSUnit ) - - if self.SpawnTemplatePrefix == SpawnPrefix or ( self.SpawnAliasPrefix and self.SpawnAliasPrefix == SpawnPrefix ) then - local SpawnGroupIndex = self:_GetGroupIndexFromDCSUnit( DCSUnit ) - local SpawnGroup = self.SpawnGroups[SpawnGroupIndex].Group - self:T( SpawnGroup ) - return SpawnGroup - end - end - - return nil -end - - ---- Get the index from a given group. --- The function will search the name of the group for a #, and will return the number behind the #-mark. -function SPAWN:GetSpawnIndexFromGroup( SpawnGroup ) - self:F( { self.SpawnTemplatePrefix, self.SpawnAliasPrefix, SpawnGroup } ) - - local IndexString = string.match( SpawnGroup:GetName(), "#.*$" ):sub( 2 ) - local Index = tonumber( IndexString ) - - self:T( IndexString, Index ) - return Index - -end - ---- Return the last maximum index that can be used. -function SPAWN:_GetLastIndex() - self:F( { self.SpawnTemplatePrefix, self.SpawnAliasPrefix } ) - - return self.SpawnMaxGroups -end - ---- Initalize the SpawnGroups collection. -function SPAWN:_InitializeSpawnGroups( SpawnIndex ) - self:F( { self.SpawnTemplatePrefix, self.SpawnAliasPrefix, SpawnIndex } ) - - if not self.SpawnGroups[SpawnIndex] then - self.SpawnGroups[SpawnIndex] = {} - self.SpawnGroups[SpawnIndex].Visible = false - self.SpawnGroups[SpawnIndex].Spawned = false - self.SpawnGroups[SpawnIndex].UnControlled = false - self.SpawnGroups[SpawnIndex].SpawnTime = 0 - - self.SpawnGroups[SpawnIndex].SpawnTemplatePrefix = self.SpawnTemplatePrefix - self.SpawnGroups[SpawnIndex].SpawnTemplate = self:_Prepare( self.SpawnGroups[SpawnIndex].SpawnTemplatePrefix, SpawnIndex ) - end - - self:_RandomizeTemplate( SpawnIndex ) - self:_RandomizeRoute( SpawnIndex ) - --self:_TranslateRotate( SpawnIndex ) - - return self.SpawnGroups[SpawnIndex] -end - - - ---- Gets the CategoryID of the Group with the given SpawnPrefix -function SPAWN:_GetGroupCategoryID( SpawnPrefix ) - local TemplateGroup = Group.getByName( SpawnPrefix ) - - if TemplateGroup then - return TemplateGroup:getCategory() - else - return nil - end -end - ---- Gets the CoalitionID of the Group with the given SpawnPrefix -function SPAWN:_GetGroupCoalitionID( SpawnPrefix ) - local TemplateGroup = Group.getByName( SpawnPrefix ) - - if TemplateGroup then - return TemplateGroup:getCoalition() - else - return nil - end -end - ---- Gets the CountryID of the Group with the given SpawnPrefix -function SPAWN:_GetGroupCountryID( SpawnPrefix ) - self:F( { self.SpawnTemplatePrefix, self.SpawnAliasPrefix, SpawnPrefix } ) - - local TemplateGroup = Group.getByName( SpawnPrefix ) - - if TemplateGroup then - local TemplateUnits = TemplateGroup:getUnits() - return TemplateUnits[1]:getCountry() - else - return nil - end -end - ---- Gets the Group Template from the ME environment definition. --- This method used the @{DATABASE} object, which contains ALL initial and new spawned object in MOOSE. --- @param #SPAWN self --- @param #string SpawnTemplatePrefix --- @return @SPAWN self -function SPAWN:_GetTemplate( SpawnTemplatePrefix ) - self:F( { self.SpawnTemplatePrefix, self.SpawnAliasPrefix, SpawnTemplatePrefix } ) - - local SpawnTemplate = nil - - SpawnTemplate = routines.utils.deepCopy( _DATABASE.Templates.Groups[SpawnTemplatePrefix].Template ) - - if SpawnTemplate == nil then - error( 'No Template returned for SpawnTemplatePrefix = ' .. SpawnTemplatePrefix ) - end - - SpawnTemplate.SpawnCoalitionID = self:_GetGroupCoalitionID( SpawnTemplatePrefix ) - SpawnTemplate.SpawnCategoryID = self:_GetGroupCategoryID( SpawnTemplatePrefix ) - SpawnTemplate.SpawnCountryID = self:_GetGroupCountryID( SpawnTemplatePrefix ) - - self:T( { SpawnTemplate } ) - return SpawnTemplate -end - ---- Prepares the new Group Template. --- @param #SPAWN self --- @param #string SpawnTemplatePrefix --- @param #number SpawnIndex --- @return #SPAWN self -function SPAWN:_Prepare( SpawnTemplatePrefix, SpawnIndex ) - self:F( { self.SpawnTemplatePrefix, self.SpawnAliasPrefix } ) - - local SpawnTemplate = self:_GetTemplate( SpawnTemplatePrefix ) - SpawnTemplate.name = self:SpawnGroupName( SpawnIndex ) - - SpawnTemplate.groupId = nil - SpawnTemplate.lateActivation = false - - if SpawnTemplate.SpawnCategoryID == Group.Category.GROUND then - self:T( "For ground units, visible needs to be false..." ) - SpawnTemplate.visible = false - end - - if SpawnTemplate.SpawnCategoryID == Group.Category.HELICOPTER or SpawnTemplate.SpawnCategoryID == Group.Category.AIRPLANE then - SpawnTemplate.uncontrolled = false - end - - for UnitID = 1, #SpawnTemplate.units do - SpawnTemplate.units[UnitID].name = string.format( SpawnTemplate.name .. '-%02d', UnitID ) - SpawnTemplate.units[UnitID].unitId = nil - SpawnTemplate.units[UnitID].x = SpawnTemplate.route.points[1].x - SpawnTemplate.units[UnitID].y = SpawnTemplate.route.points[1].y - end - - self:T( { "Template:", SpawnTemplate } ) - return SpawnTemplate - -end - ---- Private method randomizing the routes. --- @param #SPAWN self --- @param #number SpawnIndex The index of the group to be spawned. --- @return #SPAWN -function SPAWN:_RandomizeRoute( SpawnIndex ) - self:F( { self.SpawnTemplatePrefix, SpawnIndex, self.SpawnRandomizeRoute, self.SpawnRandomizeRouteStartPoint, self.SpawnRandomizeRouteEndPoint, self.SpawnRandomizeRouteRadius } ) - - if self.SpawnRandomizeRoute then - local SpawnTemplate = self.SpawnGroups[SpawnIndex].SpawnTemplate - local RouteCount = #SpawnTemplate.route.points - - for t = self.SpawnRandomizeRouteStartPoint + 1, ( RouteCount - self.SpawnRandomizeRouteEndPoint ) do - SpawnTemplate.route.points[t].x = SpawnTemplate.route.points[t].x + math.random( self.SpawnRandomizeRouteRadius * -1, self.SpawnRandomizeRouteRadius ) - SpawnTemplate.route.points[t].y = SpawnTemplate.route.points[t].y + math.random( self.SpawnRandomizeRouteRadius * -1, self.SpawnRandomizeRouteRadius ) - -- TODO: manage altitude for airborne units ... - SpawnTemplate.route.points[t].alt = nil - --SpawnGroup.route.points[t].alt_type = nil - self:T( 'SpawnTemplate.route.points[' .. t .. '].x = ' .. SpawnTemplate.route.points[t].x .. ', SpawnTemplate.route.points[' .. t .. '].y = ' .. SpawnTemplate.route.points[t].y ) - end - end - - return self -end - ---- Private method that randomizes the template of the group. --- @param #SPAWN self --- @param #number SpawnIndex --- @return #SPAWN self -function SPAWN:_RandomizeTemplate( SpawnIndex ) - self:F( { self.SpawnTemplatePrefix, SpawnIndex } ) - - if self.SpawnRandomizeTemplate then - self.SpawnGroups[SpawnIndex].SpawnTemplatePrefix = self.SpawnTemplatePrefixTable[ math.random( 1, #self.SpawnTemplatePrefixTable ) ] - self.SpawnGroups[SpawnIndex].SpawnTemplate = self:_Prepare( self.SpawnGroups[SpawnIndex].SpawnTemplatePrefix, SpawnIndex ) - self.SpawnGroups[SpawnIndex].SpawnTemplate.route = routines.utils.deepCopy( self.SpawnTemplate.route ) - self.SpawnGroups[SpawnIndex].SpawnTemplate.x = self.SpawnTemplate.x - self.SpawnGroups[SpawnIndex].SpawnTemplate.y = self.SpawnTemplate.y - self.SpawnGroups[SpawnIndex].SpawnTemplate.start_time = self.SpawnTemplate.start_time - for UnitID = 1, #self.SpawnGroups[SpawnIndex].SpawnTemplate.units do - self.SpawnGroups[SpawnIndex].SpawnTemplate.units[UnitID].heading = self.SpawnTemplate.units[1].heading - end - end - - self:_RandomizeRoute( SpawnIndex ) - - return self -end - -function SPAWN:_TranslateRotate( SpawnIndex, SpawnRootX, SpawnRootY, SpawnX, SpawnY, SpawnAngle ) - self:F( { self.SpawnTemplatePrefix, SpawnIndex, SpawnRootX, SpawnRootY, SpawnX, SpawnY, SpawnAngle } ) - - -- Translate - local TranslatedX = SpawnX - local TranslatedY = SpawnY - - -- Rotate - -- From Wikipedia: https://en.wikipedia.org/wiki/Rotation_matrix#Common_rotations - -- x' = x \cos \theta - y \sin \theta\ - -- y' = x \sin \theta + y \cos \theta\ - local RotatedX = - TranslatedX * math.cos( math.rad( SpawnAngle ) ) - + TranslatedY * math.sin( math.rad( SpawnAngle ) ) - local RotatedY = TranslatedX * math.sin( math.rad( SpawnAngle ) ) - + TranslatedY * math.cos( math.rad( SpawnAngle ) ) - - -- Assign - self.SpawnGroups[SpawnIndex].SpawnTemplate.x = SpawnRootX - RotatedX - self.SpawnGroups[SpawnIndex].SpawnTemplate.y = SpawnRootY + RotatedY - - - local SpawnUnitCount = table.getn( self.SpawnGroups[SpawnIndex].SpawnTemplate.units ) - for u = 1, SpawnUnitCount do - - -- Translate - local TranslatedX = SpawnX - local TranslatedY = SpawnY - 10 * ( u - 1 ) - - -- Rotate - local RotatedX = - TranslatedX * math.cos( math.rad( SpawnAngle ) ) - + TranslatedY * math.sin( math.rad( SpawnAngle ) ) - local RotatedY = TranslatedX * math.sin( math.rad( SpawnAngle ) ) - + TranslatedY * math.cos( math.rad( SpawnAngle ) ) - - -- Assign - self.SpawnGroups[SpawnIndex].SpawnTemplate.units[u].x = SpawnRootX - RotatedX - self.SpawnGroups[SpawnIndex].SpawnTemplate.units[u].y = SpawnRootY + RotatedY - self.SpawnGroups[SpawnIndex].SpawnTemplate.units[u].heading = self.SpawnGroups[SpawnIndex].SpawnTemplate.units[u].heading + math.rad( SpawnAngle ) - end - - return self -end - ---- Get the next index of the groups to be spawned. This function is complicated, as it is used at several spaces. -function SPAWN:_GetSpawnIndex( SpawnIndex ) - self:F( { self.SpawnTemplatePrefix, SpawnIndex, self.SpawnMaxGroups, self.SpawnMaxUnitsAlive, self.AliveUnits, #self.SpawnTemplate.units } ) - - - if ( self.SpawnMaxGroups == 0 ) or ( SpawnIndex <= self.SpawnMaxGroups ) then - if ( self.SpawnMaxUnitsAlive == 0 ) or ( self.AliveUnits < self.SpawnMaxUnitsAlive * #self.SpawnTemplate.units ) or self.UnControlled then - if SpawnIndex and SpawnIndex >= self.SpawnCount + 1 then - self.SpawnCount = self.SpawnCount + 1 - SpawnIndex = self.SpawnCount - end - self.SpawnIndex = SpawnIndex - if not self.SpawnGroups[self.SpawnIndex] then - self:_InitializeSpawnGroups( self.SpawnIndex ) - end - else - return nil - end - else - return nil - end - - return self.SpawnIndex -end - - --- TODO Need to delete this... _DATABASE does this now ... -function SPAWN:_OnBirth( event ) - - if timer.getTime0() < timer.getAbsTime() then -- dont need to add units spawned in at the start of the mission if mist is loaded in init line - if event.initiator and event.initiator:getName() then - local EventPrefix = self:_GetPrefixFromDCSUnit( event.initiator ) - if EventPrefix == self.SpawnTemplatePrefix or ( self.SpawnAliasPrefix and EventPrefix == self.SpawnAliasPrefix ) then - self:T( { "Birth event: " .. event.initiator:getName(), event } ) - --MessageToAll( "Mission command: unit " .. SpawnTemplatePrefix .. " spawned." , 5, EventPrefix .. '/Event') - self.AliveUnits = self.AliveUnits + 1 - self:T( "Alive Units: " .. self.AliveUnits ) - end - end - end - -end - ---- Obscolete --- @todo Need to delete this... _DATABASE does this now ... -function SPAWN:_OnDeadOrCrash( event ) - self:F( self.SpawnTemplatePrefix, event ) - - if event.initiator and event.initiator:getName() then - local EventPrefix = self:_GetPrefixFromDCSUnit( event.initiator ) - if EventPrefix == self.SpawnTemplatePrefix or ( self.SpawnAliasPrefix and EventPrefix == self.SpawnAliasPrefix ) then - self:T( { "Dead event: " .. event.initiator:getName(), event } ) --- local DestroyedUnit = Unit.getByName( EventPrefix ) --- if DestroyedUnit and DestroyedUnit.getLife() <= 1.0 then - --MessageToAll( "Mission command: unit " .. SpawnTemplatePrefix .. " crashed." , 5, EventPrefix .. '/Event') - self.AliveUnits = self.AliveUnits - 1 - self:T( "Alive Units: " .. self.AliveUnits ) --- end - end - end -end - ---- Will detect AIR Units taking off... When the event takes place, the spawned Group is registered as airborne... --- This is needed to ensure that Re-SPAWNing only is done for landed AIR Groups. --- @todo Need to test for AIR Groups only... -function SPAWN:_OnTakeOff( event ) - self:F( self.SpawnTemplatePrefix, event ) - - if event.initiator and event.initiator:getName() then - local SpawnGroup = self:_GetGroupFromDCSUnit( event.initiator ) - if SpawnGroup then - self:T( { "TakeOff event: " .. event.initiator:getName(), event } ) - self:T( "self.Landed = false" ) - self.Landed = false - end - end -end - ---- Will detect AIR Units landing... When the event takes place, the spawned Group is registered as landed. --- This is needed to ensure that Re-SPAWNing is only done for landed AIR Groups. --- @todo Need to test for AIR Groups only... -function SPAWN:_OnLand( event ) - self:F( self.SpawnTemplatePrefix, event ) - - local SpawnUnit = event.initiator - if SpawnUnit and SpawnUnit:isExist() and Object.getCategory(SpawnUnit) == Object.Category.UNIT then - local SpawnGroup = self:_GetGroupFromDCSUnit( SpawnUnit ) - if SpawnGroup then - self:T( { "Landed event:" .. SpawnUnit:getName(), event } ) - self.Landed = true - self:T( "self.Landed = true" ) - if self.Landed and self.RepeatOnLanding then - local SpawnGroupIndex = self:GetSpawnIndexFromGroup( SpawnGroup ) - self:T( { "Landed:", "ReSpawn:", SpawnGroup:GetName(), SpawnGroupIndex } ) - self:ReSpawn( SpawnGroupIndex ) - end - end - end -end - ---- Will detect AIR Units shutting down their engines ... --- When the event takes place, and the method @{RepeatOnEngineShutDown} was called, the spawned Group will Re-SPAWN. --- But only when the Unit was registered to have landed. --- @param #SPAWN self --- @see _OnTakeOff --- @see _OnLand --- @todo Need to test for AIR Groups only... -function SPAWN:_OnEngineShutDown( event ) - self:F( self.SpawnTemplatePrefix, event ) - - local SpawnUnit = event.initiator - if SpawnUnit and SpawnUnit:isExist() and Object.getCategory(SpawnUnit) == Object.Category.UNIT then - local SpawnGroup = self:_GetGroupFromDCSUnit( SpawnUnit ) - if SpawnGroup then - self:T( { "EngineShutDown event: " .. SpawnUnit:getName(), event } ) - if self.Landed and self.RepeatOnEngineShutDown then - local SpawnGroupIndex = self:GetSpawnIndexFromGroup( SpawnGroup ) - self:T( { "EngineShutDown: ", "ReSpawn:", SpawnGroup:GetName(), SpawnGroupIndex } ) - self:ReSpawn( SpawnGroupIndex ) - end - end - end -end - ---- This function is called automatically by the Spawning scheduler. --- It is the internal worker method SPAWNing new Groups on the defined time intervals. -function SPAWN:_Scheduler() - self:F( { "_Scheduler", self.SpawnTemplatePrefix, self.SpawnAliasPrefix, self.SpawnIndex, self.SpawnMaxGroups, self.SpawnMaxUnitsAlive } ) - - -- Validate if there are still groups left in the batch... - self:Spawn() - - return true -end - -function SPAWN:_SpawnCleanUpScheduler() - self:F( { "CleanUp Scheduler:", self.SpawnTemplatePrefix } ) - - local SpawnCursor - local SpawnGroup, SpawnCursor = self:GetFirstAliveGroup( SpawnCursor ) - - self:T( { "CleanUp Scheduler:", SpawnGroup } ) - - while SpawnGroup do - - if SpawnGroup:AllOnGround() and SpawnGroup:GetMaxVelocity() < 1 then - if not self.SpawnCleanUpTimeStamps[SpawnGroup:GetName()] then - self.SpawnCleanUpTimeStamps[SpawnGroup:GetName()] = timer.getTime() - else - if self.SpawnCleanUpTimeStamps[SpawnGroup:GetName()] + self.SpawnCleanUpInterval < timer.getTime() then - self:T( { "CleanUp Scheduler:", "Cleaning:", SpawnGroup } ) - SpawnGroup:Destroy() - end - end - else - self.SpawnCleanUpTimeStamps[SpawnGroup:GetName()] = nil - end - - SpawnGroup, SpawnCursor = self:GetNextAliveGroup( SpawnCursor ) - - self:T( { "CleanUp Scheduler:", SpawnGroup } ) - - end - - return true -- Repeat - -end ---- Limit the simultaneous movement of Groups within a running Mission. --- This module is defined to improve the performance in missions, and to bring additional realism for GROUND vehicles. --- Performance: If in a DCSRTE there are a lot of moving GROUND units, then in a multi player mission, this WILL create lag if --- the main DCS execution core of your CPU is fully utilized. So, this class will limit the amount of simultaneous moving GROUND units --- on defined intervals (currently every minute). --- @module MOVEMENT - -Include.File( "Routines" ) - ---- the MOVEMENT class --- @type -MOVEMENT = { - ClassName = "MOVEMENT", -} - ---- Creates the main object which is handling the GROUND forces movement. --- @param table{string,...}|string MovePrefixes is a table of the Prefixes (names) of the GROUND Groups that need to be controlled by the MOVEMENT Object. --- @param number MoveMaximum is a number that defines the maximum amount of GROUND Units to be moving during one minute. --- @return MOVEMENT --- @usage --- -- Limit the amount of simultaneous moving units on the ground to prevent lag. --- Movement_US_Platoons = MOVEMENT:New( { 'US Tank Platoon Left', 'US Tank Platoon Middle', 'US Tank Platoon Right', 'US CH-47D Troops' }, 15 ) - -function MOVEMENT:New( MovePrefixes, MoveMaximum ) - local self = BASE:Inherit( self, BASE:New() ) - self:F( { MovePrefixes, MoveMaximum } ) - - if type( MovePrefixes ) == 'table' then - self.MovePrefixes = MovePrefixes - else - self.MovePrefixes = { MovePrefixes } - end - self.MoveCount = 0 -- The internal counter of the amount of Moveing the has happened since MoveStart. - self.MoveMaximum = MoveMaximum -- Contains the Maximum amount of units that are allowed to move... - self.AliveUnits = 0 -- Contains the counter how many units are currently alive - self.MoveUnits = {} -- Reflects if the Moving for this MovePrefixes is going to be scheduled or not. - - _EVENTDISPATCHER:OnBirth( self.OnBirth, self ) - --- self:AddEvent( world.event.S_EVENT_BIRTH, self.OnBirth ) --- --- self:EnableEvents() - - self:ScheduleStart() - - return self -end - ---- Call this function to start the MOVEMENT scheduling. -function MOVEMENT:ScheduleStart() - self:F() - --self.MoveFunction = routines.scheduleFunction( self._Scheduler, { self }, timer.getTime() + 1, 120 ) - self.MoveFunction = SCHEDULER:New( self, self._Scheduler, {}, 1, 120 ) -end - ---- Call this function to stop the MOVEMENT scheduling. --- @todo need to implement it ... Forgot. -function MOVEMENT:ScheduleStop() - self:F() - -end - ---- Captures the birth events when new Units were spawned. --- @todo This method should become obsolete. The new @{DATABASE} class will handle the collection administration. -function MOVEMENT:OnBirth( Event ) - self:F( { Event } ) - - if timer.getTime0() < timer.getAbsTime() then -- dont need to add units spawned in at the start of the mission if mist is loaded in init line - if Event.IniDCSUnit then - self:T( "Birth object : " .. Event.IniDCSUnitName ) - if Event.IniDCSGroup and Event.IniDCSGroup:isExist() then - for MovePrefixID, MovePrefix in pairs( self.MovePrefixes ) do - if string.find( Event.IniDCSUnitName, MovePrefix, 1, true ) then - self.AliveUnits = self.AliveUnits + 1 - self.MoveUnits[Event.IniDCSUnitName] = Event.IniDCSGroupName - self:T( self.AliveUnits ) - end - end - end - end - _EVENTDISPATCHER:OnCrashForUnit( Event.IniDCSUnitName, self.OnDeadOrCrash, self ) - _EVENTDISPATCHER:OnDeadForUnit( Event.IniDCSUnitName, self.OnDeadOrCrash, self ) - end - -end - ---- Captures the Dead or Crash events when Units crash or are destroyed. --- @todo This method should become obsolete. The new @{DATABASE} class will handle the collection administration. -function MOVEMENT:OnDeadOrCrash( Event ) - self:F( { Event } ) - - if Event.IniDCSUnit then - self:T( "Dead object : " .. Event.IniDCSUnitName ) - for MovePrefixID, MovePrefix in pairs( self.MovePrefixes ) do - if string.find( Event.IniDCSUnitName, MovePrefix, 1, true ) then - self.AliveUnits = self.AliveUnits - 1 - self.MoveUnits[Event.IniDCSUnitName] = nil - self:T( self.AliveUnits ) - end - end - end -end - ---- This function is called automatically by the MOVEMENT scheduler. A new function is scheduled when MoveScheduled is true. -function MOVEMENT:_Scheduler() - self:F( { self.MovePrefixes, self.MoveMaximum, self.AliveUnits, self.MovementGroups } ) - - if self.AliveUnits > 0 then - local MoveProbability = ( self.MoveMaximum * 100 ) / self.AliveUnits - self:T( 'Move Probability = ' .. MoveProbability ) - - for MovementUnitName, MovementGroupName in pairs( self.MoveUnits ) do - local MovementGroup = Group.getByName( MovementGroupName ) - if MovementGroup and MovementGroup:isExist() then - local MoveOrStop = math.random( 1, 100 ) - self:T( 'MoveOrStop = ' .. MoveOrStop ) - if MoveOrStop <= MoveProbability then - self:T( 'Group continues moving = ' .. MovementGroupName ) - trigger.action.groupContinueMoving( MovementGroup ) - else - self:T( 'Group stops moving = ' .. MovementGroupName ) - trigger.action.groupStopMoving( MovementGroup ) - end - else - self.MoveUnits[MovementUnitName] = nil - end - end - end - return true -end ---- Provides defensive behaviour to a set of SAM sites within a running Mission. --- @module Sead --- @author to be searched on the forum --- @author (co) Flightcontrol (Modified and enriched with functionality) - -Include.File( "Routines" ) -Include.File( "Event" ) -Include.File( "Base" ) -Include.File( "Mission" ) -Include.File( "Client" ) -Include.File( "Task" ) - ---- The SEAD class --- @type SEAD --- @extends Base#BASE -SEAD = { - ClassName = "SEAD", - TargetSkill = { - Average = { Evade = 50, DelayOff = { 10, 25 }, DelayOn = { 10, 30 } } , - Good = { Evade = 30, DelayOff = { 8, 20 }, DelayOn = { 20, 40 } } , - High = { Evade = 15, DelayOff = { 5, 17 }, DelayOn = { 30, 50 } } , - Excellent = { Evade = 10, DelayOff = { 3, 10 }, DelayOn = { 30, 60 } } - }, - SEADGroupPrefixes = {} -} - ---- Creates the main object which is handling defensive actions for SA sites or moving SA vehicles. --- When an anti radiation missile is fired (KH-58, KH-31P, KH-31A, KH-25MPU, HARM missiles), the SA will shut down their radars and will take evasive actions... --- Chances are big that the missile will miss. --- @param table{string,...}|string SEADGroupPrefixes which is a table of Prefixes of the SA Groups in the DCSRTE on which evasive actions need to be taken. --- @return SEAD --- @usage --- -- CCCP SEAD Defenses --- -- Defends the Russian SA installations from SEAD attacks. --- SEAD_RU_SAM_Defenses = SEAD:New( { 'RU SA-6 Kub', 'RU SA-6 Defenses', 'RU MI-26 Troops', 'RU Attack Gori' } ) -function SEAD:New( SEADGroupPrefixes ) - local self = BASE:Inherit( self, BASE:New() ) - self:F( SEADGroupPrefixes ) - if type( SEADGroupPrefixes ) == 'table' then - for SEADGroupPrefixID, SEADGroupPrefix in pairs( SEADGroupPrefixes ) do - self.SEADGroupPrefixes[SEADGroupPrefix] = SEADGroupPrefix - end - else - self.SEADGroupNames[SEADGroupPrefixes] = SEADGroupPrefixes - end - _EVENTDISPATCHER:OnShot( self.EventShot, self ) - - return self -end - ---- Detects if an SA site was shot with an anti radiation missile. In this case, take evasive actions based on the skill level set within the ME. --- @see SEAD -function SEAD:EventShot( Event ) - self:F( { Event } ) - - local SEADUnit = Event.IniDCSUnit - local SEADUnitName = Event.IniDCSUnitName - local SEADWeapon = Event.Weapon -- Identify the weapon fired - local SEADWeaponName = Event.WeaponName -- return weapon type - --trigger.action.outText( string.format("Alerte, depart missile " ..string.format(SEADWeaponName)), 20) --debug message - -- Start of the 2nd loop - self:T( "Missile Launched = " .. SEADWeaponName ) - if SEADWeaponName == "KH-58" or SEADWeaponName == "KH-25MPU" or SEADWeaponName == "AGM-88" or SEADWeaponName == "KH-31A" or SEADWeaponName == "KH-31P" then -- Check if the missile is a SEAD - local _evade = math.random (1,100) -- random number for chance of evading action - local _targetMim = Event.Weapon:getTarget() -- Identify target - local _targetMimname = Unit.getName(_targetMim) - local _targetMimgroup = Unit.getGroup(Weapon.getTarget(SEADWeapon)) - local _targetMimgroupName = _targetMimgroup:getName() - local _targetMimcont= _targetMimgroup:getController() - local _targetskill = _DATABASE.Templates.Units[_targetMimname].Template.skill - self:T( self.SEADGroupPrefixes ) - self:T( _targetMimgroupName ) - local SEADGroupFound = false - for SEADGroupPrefixID, SEADGroupPrefix in pairs( self.SEADGroupPrefixes ) do - if string.find( _targetMimgroupName, SEADGroupPrefix, 1, true ) then - SEADGroupFound = true - self:T( 'Group Found' ) - break - end - end - if SEADGroupFound == true then - if _targetskill == "Random" then -- when skill is random, choose a skill - local Skills = { "Average", "Good", "High", "Excellent" } - _targetskill = Skills[ math.random(1,4) ] - end - self:T( _targetskill ) -- debug message for skill check - if self.TargetSkill[_targetskill] then - if (_evade > self.TargetSkill[_targetskill].Evade) then - self:T( string.format("Evading, target skill " ..string.format(_targetskill)) ) --debug message - local _targetMim = Weapon.getTarget(SEADWeapon) - local _targetMimname = Unit.getName(_targetMim) - local _targetMimgroup = Unit.getGroup(Weapon.getTarget(SEADWeapon)) - local _targetMimcont= _targetMimgroup:getController() - routines.groupRandomDistSelf(_targetMimgroup,300,'Diamond',250,20) -- move randomly - local SuppressedGroups1 = {} -- unit suppressed radar off for a random time - local function SuppressionEnd1(id) - id.ctrl:setOption(AI.Option.Ground.id.ALARM_STATE,AI.Option.Ground.val.ALARM_STATE.GREEN) - SuppressedGroups1[id.groupName] = nil - end - local id = { - groupName = _targetMimgroup, - ctrl = _targetMimcont - } - local delay1 = math.random(self.TargetSkill[_targetskill].DelayOff[1], self.TargetSkill[_targetskill].DelayOff[2]) - if SuppressedGroups1[id.groupName] == nil then - SuppressedGroups1[id.groupName] = { - SuppressionEndTime1 = timer.getTime() + delay1, - SuppressionEndN1 = SuppressionEndCounter1 --Store instance of SuppressionEnd() scheduled function - } - Controller.setOption(_targetMimcont, AI.Option.Ground.id.ALARM_STATE,AI.Option.Ground.val.ALARM_STATE.GREEN) - timer.scheduleFunction(SuppressionEnd1, id, SuppressedGroups1[id.groupName].SuppressionEndTime1) --Schedule the SuppressionEnd() function - --trigger.action.outText( string.format("Radar Off " ..string.format(delay1)), 20) - end - - local SuppressedGroups = {} - local function SuppressionEnd(id) - id.ctrl:setOption(AI.Option.Ground.id.ALARM_STATE,AI.Option.Ground.val.ALARM_STATE.RED) - SuppressedGroups[id.groupName] = nil - end - local id = { - groupName = _targetMimgroup, - ctrl = _targetMimcont - } - local delay = math.random(self.TargetSkill[_targetskill].DelayOn[1], self.TargetSkill[_targetskill].DelayOn[2]) - if SuppressedGroups[id.groupName] == nil then - SuppressedGroups[id.groupName] = { - SuppressionEndTime = timer.getTime() + delay, - SuppressionEndN = SuppressionEndCounter --Store instance of SuppressionEnd() scheduled function - } - timer.scheduleFunction(SuppressionEnd, id, SuppressedGroups[id.groupName].SuppressionEndTime) --Schedule the SuppressionEnd() function - --trigger.action.outText( string.format("Radar On " ..string.format(delay)), 20) - end - end - end - end - end -end ---- Taking the lead of AI escorting your flight. --- --- @{#ESCORT} class --- ================ --- The @{#ESCORT} class allows you to interact with escorting AI on your flight and take the lead. --- Each escorting group can be commanded with a whole set of radio commands (radio menu in your flight, and then F10). --- --- The radio commands will vary according the category of the group. The richest set of commands are with Helicopters and AirPlanes. --- Ships and Ground troops will have a more limited set, but they can provide support through the bombing of targets designated by the other escorts. --- --- RADIO MENUs that can be created: --- ================================ --- Find a summary below of the current available commands: --- --- Navigation ...: --- --------------- --- Escort group navigation functions: --- --- * **"Join-Up and Follow at x meters":** The escort group fill follow you at about x meters, and they will follow you. --- * **"Flare":** Provides menu commands to let the escort group shoot a flare in the air in a color. --- * **"Smoke":** Provides menu commands to let the escort group smoke the air in a color. Note that smoking is only available for ground and naval troops. --- --- Hold position ...: --- ------------------ --- Escort group navigation functions: --- --- * **"At current location":** Stops the escort group and they will hover 30 meters above the ground at the position they stopped. --- * **"At client location":** Stops the escort group and they will hover 30 meters above the ground at the position they stopped. --- --- Report targets ...: --- ------------------- --- Report targets will make the escort group to report any target that it identifies within a 8km range. Any detected target can be attacked using the 4. Attack nearby targets function. (see below). --- --- * **"Report now":** Will report the current detected targets. --- * **"Report targets on":** Will make the escort group to report detected targets and will fill the "Attack nearby targets" menu list. --- * **"Report targets off":** Will stop detecting targets. --- --- Scan targets ...: --- ----------------- --- Menu items to pop-up the escort group for target scanning. After scanning, the escort group will resume with the mission or defined task. --- --- * **"Scan targets 30 seconds":** Scan 30 seconds for targets. --- * **"Scan targets 60 seconds":** Scan 60 seconds for targets. --- --- Attack targets ...: --- ------------------- --- This menu item will list all detected targets within a 15km range. Depending on the level of detection (known/unknown) and visuality, the targets type will also be listed. --- --- Request assistance from ...: --- ---------------------------- --- This menu item will list all detected targets within a 15km range, as with the menu item **Attack Targets**. --- This menu item allows to request attack support from other escorts supporting the current client group. --- eg. the function allows a player to request support from the Ship escort to attack a target identified by the Plane escort with its Tomahawk missiles. --- eg. the function allows a player to request support from other Planes escorting to bomb the unit with illumination missiles or bombs, so that the main plane escort can attack the area. --- --- ROE ...: --- -------- --- Sets the Rules of Engagement (ROE) of the escort group when in flight. --- --- * **"Hold Fire":** The escort group will hold fire. --- * **"Return Fire":** The escort group will return fire. --- * **"Open Fire":** The escort group will open fire on designated targets. --- * **"Weapon Free":** The escort group will engage with any target. --- --- Evasion ...: --- ------------ --- Will define the evasion techniques that the escort group will perform during flight or combat. --- --- * **"Fight until death":** The escort group will have no reaction to threats. --- * **"Use flares, chaff and jammers":** The escort group will use passive defense using flares and jammers. No evasive manoeuvres are executed. --- * **"Evade enemy fire":** The rescort group will evade enemy fire before firing. --- * **"Go below radar and evade fire":** The escort group will perform evasive vertical manoeuvres. --- --- Resume Mission ...: --- ------------------- --- Escort groups can have their own mission. This menu item will allow the escort group to resume their Mission from a given waypoint. --- Note that this is really fantastic, as you now have the dynamic of taking control of the escort groups, and allowing them to resume their path or mission. --- --- ESCORT construction methods. --- ============================ --- Create a new SPAWN object with the @{#ESCORT.New} method: --- --- * @{#ESCORT.New}: Creates a new ESCORT object from a @{Group#GROUP} for a @{Client#CLIENT}, with an optional briefing text. --- --- ESCORT initialization methods. --- ============================== --- The following menus are created within the RADIO MENU of an active unit hosted by a player: --- --- * @{#ESCORT.MenuFollowAt}: Creates a menu to make the escort follow the client. --- * @{#ESCORT.MenuHoldAtEscortPosition}: Creates a menu to hold the escort at its current position. --- * @{#ESCORT.MenuHoldAtLeaderPosition}: Creates a menu to hold the escort at the client position. --- * @{#ESCORT.MenuScanForTargets}: Creates a menu so that the escort scans targets. --- * @{#ESCORT.MenuFlare}: Creates a menu to disperse flares. --- * @{#ESCORT.MenuSmoke}: Creates a menu to disparse smoke. --- * @{#ESCORT.MenuReportTargets}: Creates a menu so that the escort reports targets. --- * @{#ESCORT.MenuReportPosition}: Creates a menu so that the escort reports its current position from bullseye. --- * @{#ESCORT.MenuAssistedAttack: Creates a menu so that the escort supportes assisted attack from other escorts with the client. --- * @{#ESCORT.MenuROE: Creates a menu structure to set the rules of engagement of the escort. --- * @{#ESCORT.MenuEvasion: Creates a menu structure to set the evasion techniques when the escort is under threat. --- * @{#ESCORT.MenuResumeMission}: Creates a menu structure so that the escort can resume from a waypoint. --- --- @module Escort --- @author FlightControl - -Include.File( "Routines" ) -Include.File( "Base" ) -Include.File( "Database" ) -Include.File( "Group" ) -Include.File( "Zone" ) - ---- --- @type ESCORT --- @extends Base#BASE --- @field Client#CLIENT EscortClient --- @field Group#GROUP EscortGroup --- @field #string EscortName --- @field #ESCORT.MODE EscortMode The mode the escort is in. --- @field #number FollowScheduler The id of the _FollowScheduler function. --- @field #boolean ReportTargets If true, nearby targets are reported. --- @Field DCSTypes#AI.Option.Air.val.ROE OptionROE Which ROE is set to the EscortGroup. --- @field DCSTypes#AI.Option.Air.val.REACTION_ON_THREAT OptionReactionOnThreat Which REACTION_ON_THREAT is set to the EscortGroup. --- @field Menu#MENU_CLIENT EscortMenuResumeMission -ESCORT = { - ClassName = "ESCORT", - EscortName = nil, -- The Escort Name - EscortClient = nil, - EscortGroup = nil, - EscortMode = nil, - MODE = { - FOLLOW = 1, - MISSION = 2, - }, - Targets = {}, -- The identified targets - FollowScheduler = nil, - ReportTargets = true, - OptionROE = AI.Option.Air.val.ROE.OPEN_FIRE, - OptionReactionOnThreat = AI.Option.Air.val.REACTION_ON_THREAT.ALLOW_ABORT_MISSION, - TaskPoints = {} -} - ---- ESCORT.Mode class --- @type ESCORT.MODE --- @field #number FOLLOW --- @field #number MISSION - ---- MENUPARAM type --- @type MENUPARAM --- @field #ESCORT ParamSelf --- @field #Distance ParamDistance --- @field #function ParamFunction --- @field #string ParamMessage - ---- ESCORT class constructor for an AI group --- @param #ESCORT self --- @param Client#CLIENT EscortClient The client escorted by the EscortGroup. --- @param Group#GROUP EscortGroup The group AI escorting the EscortClient. --- @param #string EscortName Name of the escort. --- @return #ESCORT self -function ESCORT:New( EscortClient, EscortGroup, EscortName, EscortBriefing ) - local self = BASE:Inherit( self, BASE:New() ) - self:F( { EscortClient, EscortGroup, EscortName } ) - - self.EscortClient = EscortClient -- Client#CLIENT - self.EscortGroup = EscortGroup -- Group#GROUP - self.EscortName = EscortName - self.EscortBriefing = EscortBriefing - - self:T( EscortGroup:GetClassNameAndID() ) - - -- Set EscortGroup known at EscortClient. - if not self.EscortClient._EscortGroups then - self.EscortClient._EscortGroups = {} - end - - if not self.EscortClient._EscortGroups[EscortGroup:GetName()] then - self.EscortClient._EscortGroups[EscortGroup:GetName()] = {} - self.EscortClient._EscortGroups[EscortGroup:GetName()].EscortGroup = self.EscortGroup - self.EscortClient._EscortGroups[EscortGroup:GetName()].EscortName = self.EscortName - self.EscortClient._EscortGroups[EscortGroup:GetName()].Targets = {} - self.EscortMode = ESCORT.MODE.FOLLOW - end - - - self.EscortMenu = MENU_CLIENT:New( self.EscortClient, self.EscortName ) - - self.EscortGroup:WayPointInitialize(1) - - self.EscortGroup:OptionROTVertical() - self.EscortGroup:OptionROEOpenFire() - - EscortGroup:MessageToClient( EscortGroup:GetCategoryName() .. " '" .. EscortName .. "' (" .. EscortGroup:GetCallsign() .. ") reporting! " .. - "We're escorting your flight. " .. - "Use the Radio Menu and F10 and use the options under + " .. EscortName .. "\n", - 60, EscortClient - ) - - return self -end - - ---- Defines the default menus --- @param #ESCORT self --- @return #ESCORT -function ESCORT:Menus() - self:F() - - self:MenuFollowAt( 100 ) - self:MenuFollowAt( 200 ) - self:MenuFollowAt( 300 ) - self:MenuFollowAt( 400 ) - - self:MenuScanForTargets( 100, 60 ) - - self:MenuHoldAtEscortPosition( 30 ) - self:MenuHoldAtLeaderPosition( 30 ) - - self:MenuFlare() - self:MenuSmoke() - - self:MenuReportTargets( 60 ) - self:MenuAssistedAttack() - self:MenuROE() - self:MenuEvasion() - self:MenuResumeMission() - - return self -end - - - ---- Defines a menu slot to let the escort Join and Follow you at a certain distance. --- This menu will appear under **Navigation**. --- @param #ESCORT self --- @param DCSTypes#Distance Distance The distance in meters that the escort needs to follow the client. --- @return #ESCORT -function ESCORT:MenuFollowAt( Distance ) - self:F(Distance) - - if self.EscortGroup:IsAir() then - if not self.EscortMenuReportNavigation then - self.EscortMenuReportNavigation = MENU_CLIENT:New( self.EscortClient, "Navigation", self.EscortMenu ) - end - - if not self.EscortMenuJoinUpAndFollow then - self.EscortMenuJoinUpAndFollow = {} - end - - self.EscortMenuJoinUpAndFollow[#self.EscortMenuJoinUpAndFollow+1] = MENU_CLIENT_COMMAND:New( self.EscortClient, "Join-Up and Follow at " .. Distance, self.EscortMenuReportNavigation, ESCORT._JoinUpAndFollow, { ParamSelf = self, ParamDistance = Distance } ) - - self.EscortMode = ESCORT.MODE.FOLLOW - end - - return self -end - ---- Defines a menu slot to let the escort hold at their current position and stay low with a specified height during a specified time in seconds. --- This menu will appear under **Hold position**. --- @param #ESCORT self --- @param DCSTypes#Distance Height Optional parameter that sets the height in meters to let the escort orbit at the current location. The default value is 30 meters. --- @param DCSTypes#Time Seconds Optional parameter that lets the escort orbit at the current position for a specified time. (not implemented yet). The default value is 0 seconds, meaning, that the escort will orbit forever until a sequent command is given. --- @param #string MenuTextFormat Optional parameter that shows the menu option text. The text string is formatted, and should contain two %d tokens in the string. The first for the Height, the second for the Time (if given). If no text is given, the default text will be displayed. --- @return #ESCORT --- TODO: Implement Seconds parameter. Challenge is to first develop the "continue from last activity" function. -function ESCORT:MenuHoldAtEscortPosition( Height, Seconds, MenuTextFormat ) - self:F( { Height, Seconds, MenuTextFormat } ) - - if self.EscortGroup:IsAir() then - - if not self.EscortMenuHold then - self.EscortMenuHold = MENU_CLIENT:New( self.EscortClient, "Hold position", self.EscortMenu ) - end - - if not Height then - Height = 30 - end - - if not Seconds then - Seconds = 0 - end - - local MenuText = "" - if not MenuTextFormat then - if Seconds == 0 then - MenuText = string.format( "Hold at %d meter", Height ) - else - MenuText = string.format( "Hold at %d meter for %d seconds", Height, Seconds ) - end - else - if Seconds == 0 then - MenuText = string.format( MenuTextFormat, Height ) - else - MenuText = string.format( MenuTextFormat, Height, Seconds ) - end - end - - if not self.EscortMenuHoldPosition then - self.EscortMenuHoldPosition = {} - end - - self.EscortMenuHoldPosition[#self.EscortMenuHoldPosition+1] = MENU_CLIENT_COMMAND - :New( - self.EscortClient, - MenuText, - self.EscortMenuHold, - ESCORT._HoldPosition, - { ParamSelf = self, - ParamOrbitGroup = self.EscortGroup, - ParamHeight = Height, - ParamSeconds = Seconds - } - ) - end - - return self -end - - ---- Defines a menu slot to let the escort hold at the client position and stay low with a specified height during a specified time in seconds. --- This menu will appear under **Navigation**. --- @param #ESCORT self --- @param DCSTypes#Distance Height Optional parameter that sets the height in meters to let the escort orbit at the current location. The default value is 30 meters. --- @param DCSTypes#Time Seconds Optional parameter that lets the escort orbit at the current position for a specified time. (not implemented yet). The default value is 0 seconds, meaning, that the escort will orbit forever until a sequent command is given. --- @param #string MenuTextFormat Optional parameter that shows the menu option text. The text string is formatted, and should contain one or two %d tokens in the string. The first for the Height, the second for the Time (if given). If no text is given, the default text will be displayed. --- @return #ESCORT --- TODO: Implement Seconds parameter. Challenge is to first develop the "continue from last activity" function. -function ESCORT:MenuHoldAtLeaderPosition( Height, Seconds, MenuTextFormat ) - self:F( { Height, Seconds, MenuTextFormat } ) - - if self.EscortGroup:IsAir() then - - if not self.EscortMenuHold then - self.EscortMenuHold = MENU_CLIENT:New( self.EscortClient, "Hold position", self.EscortMenu ) - end - - if not Height then - Height = 30 - end - - if not Seconds then - Seconds = 0 - end - - local MenuText = "" - if not MenuTextFormat then - if Seconds == 0 then - MenuText = string.format( "Rejoin and hold at %d meter", Height ) - else - MenuText = string.format( "Rejoin and hold at %d meter for %d seconds", Height, Seconds ) - end - else - if Seconds == 0 then - MenuText = string.format( MenuTextFormat, Height ) - else - MenuText = string.format( MenuTextFormat, Height, Seconds ) - end - end - - if not self.EscortMenuHoldAtLeaderPosition then - self.EscortMenuHoldAtLeaderPosition = {} - end - - self.EscortMenuHoldAtLeaderPosition[#self.EscortMenuHoldAtLeaderPosition+1] = MENU_CLIENT_COMMAND - :New( - self.EscortClient, - MenuText, - self.EscortMenuHold, - ESCORT._HoldPosition, - { ParamSelf = self, - ParamOrbitGroup = self.EscortClient, - ParamHeight = Height, - ParamSeconds = Seconds - } - ) - end - - return self -end - ---- Defines a menu slot to let the escort scan for targets at a certain height for a certain time in seconds. --- This menu will appear under **Scan targets**. --- @param #ESCORT self --- @param DCSTypes#Distance Height Optional parameter that sets the height in meters to let the escort orbit at the current location. The default value is 30 meters. --- @param DCSTypes#Time Seconds Optional parameter that lets the escort orbit at the current position for a specified time. (not implemented yet). The default value is 0 seconds, meaning, that the escort will orbit forever until a sequent command is given. --- @param #string MenuTextFormat Optional parameter that shows the menu option text. The text string is formatted, and should contain one or two %d tokens in the string. The first for the Height, the second for the Time (if given). If no text is given, the default text will be displayed. --- @return #ESCORT -function ESCORT:MenuScanForTargets( Height, Seconds, MenuTextFormat ) - self:F( { Height, Seconds, MenuTextFormat } ) - - if self.EscortGroup:IsAir() then - if not self.EscortMenuScan then - self.EscortMenuScan = MENU_CLIENT:New( self.EscortClient, "Scan for targets", self.EscortMenu ) - end - - if not Height then - Height = 100 - end - - if not Seconds then - Seconds = 30 - end - - local MenuText = "" - if not MenuTextFormat then - if Seconds == 0 then - MenuText = string.format( "At %d meter", Height ) - else - MenuText = string.format( "At %d meter for %d seconds", Height, Seconds ) - end - else - if Seconds == 0 then - MenuText = string.format( MenuTextFormat, Height ) - else - MenuText = string.format( MenuTextFormat, Height, Seconds ) - end - end - - if not self.EscortMenuScanForTargets then - self.EscortMenuScanForTargets = {} - end - - self.EscortMenuScanForTargets[#self.EscortMenuScanForTargets+1] = MENU_CLIENT_COMMAND - :New( - self.EscortClient, - MenuText, - self.EscortMenuScan, - ESCORT._ScanTargets, - { ParamSelf = self, - ParamScanDuration = 30 - } - ) - end - - return self -end - - - ---- Defines a menu slot to let the escort disperse a flare in a certain color. --- This menu will appear under **Navigation**. --- The flare will be fired from the first unit in the group. --- @param #ESCORT self --- @param #string MenuTextFormat Optional parameter that shows the menu option text. If no text is given, the default text will be displayed. --- @return #ESCORT -function ESCORT:MenuFlare( MenuTextFormat ) - self:F() - - if not self.EscortMenuReportNavigation then - self.EscortMenuReportNavigation = MENU_CLIENT:New( self.EscortClient, "Navigation", self.EscortMenu ) - end - - local MenuText = "" - if not MenuTextFormat then - MenuText = "Flare" - else - MenuText = MenuTextFormat - end - - if not self.EscortMenuFlare then - self.EscortMenuFlare = MENU_CLIENT:New( self.EscortClient, MenuText, self.EscortMenuReportNavigation, ESCORT._Flare, { ParamSelf = self } ) - self.EscortMenuFlareGreen = MENU_CLIENT_COMMAND:New( self.EscortClient, "Release green flare", self.EscortMenuFlare, ESCORT._Flare, { ParamSelf = self, ParamColor = UNIT.FlareColor.Green, ParamMessage = "Released a green flare!" } ) - self.EscortMenuFlareRed = MENU_CLIENT_COMMAND:New( self.EscortClient, "Release red flare", self.EscortMenuFlare, ESCORT._Flare, { ParamSelf = self, ParamColor = UNIT.FlareColor.Red, ParamMessage = "Released a red flare!" } ) - self.EscortMenuFlareWhite = MENU_CLIENT_COMMAND:New( self.EscortClient, "Release white flare", self.EscortMenuFlare, ESCORT._Flare, { ParamSelf = self, ParamColor = UNIT.FlareColor.White, ParamMessage = "Released a white flare!" } ) - self.EscortMenuFlareYellow = MENU_CLIENT_COMMAND:New( self.EscortClient, "Release yellow flare", self.EscortMenuFlare, ESCORT._Flare, { ParamSelf = self, ParamColor = UNIT.FlareColor.Yellow, ParamMessage = "Released a yellow flare!" } ) - end - - return self -end - ---- Defines a menu slot to let the escort disperse a smoke in a certain color. --- This menu will appear under **Navigation**. --- Note that smoke menu options will only be displayed for ships and ground units. Not for air units. --- The smoke will be fired from the first unit in the group. --- @param #ESCORT self --- @param #string MenuTextFormat Optional parameter that shows the menu option text. If no text is given, the default text will be displayed. --- @return #ESCORT -function ESCORT:MenuSmoke( MenuTextFormat ) - self:F() - - if not self.EscortGroup:IsAir() then - if not self.EscortMenuReportNavigation then - self.EscortMenuReportNavigation = MENU_CLIENT:New( self.EscortClient, "Navigation", self.EscortMenu ) - end - - local MenuText = "" - if not MenuTextFormat then - MenuText = "Smoke" - else - MenuText = MenuTextFormat - end - - if not self.EscortMenuSmoke then - self.EscortMenuSmoke = MENU_CLIENT:New( self.EscortClient, "Smoke", self.EscortMenuReportNavigation, ESCORT._Smoke, { ParamSelf = self } ) - self.EscortMenuSmokeGreen = MENU_CLIENT_COMMAND:New( self.EscortClient, "Release green smoke", self.EscortMenuSmoke, ESCORT._Smoke, { ParamSelf = self, ParamColor = UNIT.SmokeColor.Green, ParamMessage = "Releasing green smoke!" } ) - self.EscortMenuSmokeRed = MENU_CLIENT_COMMAND:New( self.EscortClient, "Release red smoke", self.EscortMenuSmoke, ESCORT._Smoke, { ParamSelf = self, ParamColor = UNIT.SmokeColor.Red, ParamMessage = "Releasing red smoke!" } ) - self.EscortMenuSmokeWhite = MENU_CLIENT_COMMAND:New( self.EscortClient, "Release white smoke", self.EscortMenuSmoke, ESCORT._Smoke, { ParamSelf = self, ParamColor = UNIT.SmokeColor.White, ParamMessage = "Releasing white smoke!" } ) - self.EscortMenuSmokeOrange = MENU_CLIENT_COMMAND:New( self.EscortClient, "Release orange smoke", self.EscortMenuSmoke, ESCORT._Smoke, { ParamSelf = self, ParamColor = UNIT.SmokeColor.Orange, ParamMessage = "Releasing orange smoke!" } ) - self.EscortMenuSmokeBlue = MENU_CLIENT_COMMAND:New( self.EscortClient, "Release blue smoke", self.EscortMenuSmoke, ESCORT._Smoke, { ParamSelf = self, ParamColor = UNIT.SmokeColor.Blue, ParamMessage = "Releasing blue smoke!" } ) - end - end - - return self -end - ---- Defines a menu slot to let the escort report their current detected targets with a specified time interval in seconds. --- This menu will appear under **Report targets**. --- Note that if a report targets menu is not specified, no targets will be detected by the escort, and the attack and assisted attack menus will not be displayed. --- @param #ESCORT self --- @param DCSTypes#Time Seconds Optional parameter that lets the escort report their current detected targets after specified time interval in seconds. The default time is 30 seconds. --- @return #ESCORT -function ESCORT:MenuReportTargets( Seconds ) - self:F( { Seconds } ) - - if not self.EscortMenuReportNearbyTargets then - self.EscortMenuReportNearbyTargets = MENU_CLIENT:New( self.EscortClient, "Report targets", self.EscortMenu ) - end - - if not Seconds then - Seconds = 30 - end - - -- Report Targets - self.EscortMenuReportNearbyTargetsNow = MENU_CLIENT_COMMAND:New( self.EscortClient, "Report targets now!", self.EscortMenuReportNearbyTargets, ESCORT._ReportNearbyTargetsNow, { ParamSelf = self } ) - self.EscortMenuReportNearbyTargetsOn = MENU_CLIENT_COMMAND:New( self.EscortClient, "Report targets on", self.EscortMenuReportNearbyTargets, ESCORT._SwitchReportNearbyTargets, { ParamSelf = self, ParamReportTargets = true } ) - self.EscortMenuReportNearbyTargetsOff = MENU_CLIENT_COMMAND:New( self.EscortClient, "Report targets off", self.EscortMenuReportNearbyTargets, ESCORT._SwitchReportNearbyTargets, { ParamSelf = self, ParamReportTargets = false, } ) - - -- Attack Targets - self.EscortMenuAttackNearbyTargets = MENU_CLIENT:New( self.EscortClient, "Attack targets", self.EscortMenu ) - - - --self.ReportTargetsScheduler = routines.scheduleFunction( self._ReportTargetsScheduler, { self }, timer.getTime() + 1, Seconds ) - self.ReportTargetsScheduler = SCHEDULER:New( self, self._ReportTargetsScheduler, {}, 1, Seconds ) - - return self -end - ---- Defines a menu slot to let the escort attack its detected targets using assisted attack from another escort joined also with the client. --- This menu will appear under **Request assistance from**. --- Note that this method needs to be preceded with the method MenuReportTargets. --- @param #ESCORT self --- @return #ESCORT -function ESCORT:MenuAssistedAttack() - self:F() - - -- Request assistance from other escorts. - -- This is very useful to let f.e. an escorting ship attack a target detected by an escorting plane... - self.EscortMenuTargetAssistance = MENU_CLIENT:New( self.EscortClient, "Request assistance from", self.EscortMenu ) - - return self -end - ---- Defines a menu to let the escort set its rules of engagement. --- All rules of engagement will appear under the menu **ROE**. --- @param #ESCORT self --- @return #ESCORT -function ESCORT:MenuROE( MenuTextFormat ) - self:F( MenuTextFormat ) - - if not self.EscortMenuROE then - -- Rules of Engagement - self.EscortMenuROE = MENU_CLIENT:New( self.EscortClient, "ROE", self.EscortMenu ) - if self.EscortGroup:OptionROEHoldFirePossible() then - self.EscortMenuROEHoldFire = MENU_CLIENT_COMMAND:New( self.EscortClient, "Hold Fire", self.EscortMenuROE, ESCORT._ROE, { ParamSelf = self, ParamFunction = self.EscortGroup:OptionROEHoldFire(), ParamMessage = "Holding weapons!" } ) - end - if self.EscortGroup:OptionROEReturnFirePossible() then - self.EscortMenuROEReturnFire = MENU_CLIENT_COMMAND:New( self.EscortClient, "Return Fire", self.EscortMenuROE, ESCORT._ROE, { ParamSelf = self, ParamFunction = self.EscortGroup:OptionROEReturnFire(), ParamMessage = "Returning fire!" } ) - end - if self.EscortGroup:OptionROEOpenFirePossible() then - self.EscortMenuROEOpenFire = MENU_CLIENT_COMMAND:New( self.EscortClient, "Open Fire", self.EscortMenuROE, ESCORT._ROE, { ParamSelf = self, ParamFunction = self.EscortGroup:OptionROEOpenFire(), ParamMessage = "Opening fire on designated targets!!" } ) - end - if self.EscortGroup:OptionROEWeaponFreePossible() then - self.EscortMenuROEWeaponFree = MENU_CLIENT_COMMAND:New( self.EscortClient, "Weapon Free", self.EscortMenuROE, ESCORT._ROE, { ParamSelf = self, ParamFunction = self.EscortGroup:OptionROEWeaponFree(), ParamMessage = "Opening fire on targets of opportunity!" } ) - end - end - - return self -end - - ---- Defines a menu to let the escort set its evasion when under threat. --- All rules of engagement will appear under the menu **Evasion**. --- @param #ESCORT self --- @return #ESCORT -function ESCORT:MenuEvasion( MenuTextFormat ) - self:F( MenuTextFormat ) - - if self.EscortGroup:IsAir() then - if not self.EscortMenuEvasion then - -- Reaction to Threats - self.EscortMenuEvasion = MENU_CLIENT:New( self.EscortClient, "Evasion", self.EscortMenu ) - if self.EscortGroup:OptionROTNoReactionPossible() then - self.EscortMenuEvasionNoReaction = MENU_CLIENT_COMMAND:New( self.EscortClient, "Fight until death", self.EscortMenuEvasion, ESCORT._ROT, { ParamSelf = self, ParamFunction = self.EscortGroup:OptionROTNoReaction(), ParamMessage = "Fighting until death!" } ) - end - if self.EscortGroup:OptionROTPassiveDefensePossible() then - self.EscortMenuEvasionPassiveDefense = MENU_CLIENT_COMMAND:New( self.EscortClient, "Use flares, chaff and jammers", self.EscortMenuEvasion, ESCORT._ROT, { ParamSelf = self, ParamFunction = self.EscortGroup:OptionROTPassiveDefense(), ParamMessage = "Defending using jammers, chaff and flares!" } ) - end - if self.EscortGroup:OptionROTEvadeFirePossible() then - self.EscortMenuEvasionEvadeFire = MENU_CLIENT_COMMAND:New( self.EscortClient, "Evade enemy fire", self.EscortMenuEvasion, ESCORT._ROT, { ParamSelf = self, ParamFunction = self.EscortGroup:OptionROTEvadeFire(), ParamMessage = "Evading on enemy fire!" } ) - end - if self.EscortGroup:OptionROTVerticalPossible() then - self.EscortMenuOptionEvasionVertical = MENU_CLIENT_COMMAND:New( self.EscortClient, "Go below radar and evade fire", self.EscortMenuEvasion, ESCORT._ROT, { ParamSelf = self, ParamFunction = self.EscortGroup:OptionROTVertical(), ParamMessage = "Evading on enemy fire with vertical manoeuvres!" } ) - end - end - end - - return self -end - ---- Defines a menu to let the escort resume its mission from a waypoint on its route. --- All rules of engagement will appear under the menu **Resume mission from**. --- @param #ESCORT self --- @return #ESCORT -function ESCORT:MenuResumeMission() - self:F() - - if not self.EscortMenuResumeMission then - -- Mission Resume Menu Root - self.EscortMenuResumeMission = MENU_CLIENT:New( self.EscortClient, "Resume mission from", self.EscortMenu ) - end - - return self -end - - ---- @param #MENUPARAM MenuParam -function ESCORT._HoldPosition( MenuParam ) - - local self = MenuParam.ParamSelf - local EscortGroup = self.EscortGroup - local EscortClient = self.EscortClient - - local OrbitGroup = MenuParam.ParamOrbitGroup -- Group#GROUP - local OrbitUnit = OrbitGroup:GetUnit(1) -- Unit#UNIT - local OrbitHeight = MenuParam.ParamHeight - local OrbitSeconds = MenuParam.ParamSeconds -- Not implemented yet - - routines.removeFunction( self.FollowScheduler ) - - local PointFrom = {} - local GroupPoint = EscortGroup:GetUnit(1):GetPointVec3() - PointFrom = {} - PointFrom.x = GroupPoint.x - PointFrom.y = GroupPoint.z - PointFrom.speed = 250 - PointFrom.type = AI.Task.WaypointType.TURNING_POINT - PointFrom.alt = GroupPoint.y - PointFrom.alt_type = AI.Task.AltitudeType.BARO - - local OrbitPoint = OrbitUnit:GetPointVec2() - local PointTo = {} - PointTo.x = OrbitPoint.x - PointTo.y = OrbitPoint.y - PointTo.speed = 250 - PointTo.type = AI.Task.WaypointType.TURNING_POINT - PointTo.alt = OrbitHeight - PointTo.alt_type = AI.Task.AltitudeType.BARO - PointTo.task = EscortGroup:TaskOrbitCircleAtVec2( OrbitPoint, OrbitHeight, 0 ) - - local Points = { PointFrom, PointTo } - - EscortGroup:OptionROEHoldFire() - EscortGroup:OptionROTPassiveDefense() - - EscortGroup:SetTask( EscortGroup:TaskRoute( Points ) ) - EscortGroup:MessageToClient( "Orbiting at location.", 10, EscortClient ) -end - ---- @param #MENUPARAM MenuParam -function ESCORT._JoinUpAndFollow( MenuParam ) - - local self = MenuParam.ParamSelf - local EscortGroup = self.EscortGroup - local EscortClient = self.EscortClient - - self.Distance = MenuParam.ParamDistance - - self:JoinUpAndFollow( EscortGroup, EscortClient, self.Distance ) -end - ---- JoinsUp and Follows a CLIENT. --- @param Escort#ESCORT self --- @param Group#GROUP EscortGroup --- @param Client#CLIENT EscortClient --- @param DCSTypes#Distance Distance -function ESCORT:JoinUpAndFollow( EscortGroup, EscortClient, Distance ) - self:F( { EscortGroup, EscortClient, Distance } ) - - if self.FollowScheduler then - routines.removeFunction( self.FollowScheduler ) - end - - EscortGroup:OptionROEHoldFire() - EscortGroup:OptionROTPassiveDefense() - - self.EscortMode = ESCORT.MODE.FOLLOW - - self.CT1 = 0 - self.GT1 = 0 - --self.FollowScheduler = routines.scheduleFunction( self._FollowScheduler, { self, Distance }, timer.getTime() + 1, .5 ) - self.FollowScheduler = SCHEDULER:New( self, self._FollowScheduler, { Distance }, 1, .5, .1 ) - EscortGroup:MessageToClient( "Rejoining and Following at " .. Distance .. "!", 30, EscortClient ) -end - ---- @param #MENUPARAM MenuParam -function ESCORT._Flare( MenuParam ) - - local self = MenuParam.ParamSelf - local EscortGroup = self.EscortGroup - local EscortClient = self.EscortClient - - local Color = MenuParam.ParamColor - local Message = MenuParam.ParamMessage - - EscortGroup:GetUnit(1):Flare( Color ) - EscortGroup:MessageToClient( Message, 10, EscortClient ) -end - ---- @param #MENUPARAM MenuParam -function ESCORT._Smoke( MenuParam ) - - local self = MenuParam.ParamSelf - local EscortGroup = self.EscortGroup - local EscortClient = self.EscortClient - - local Color = MenuParam.ParamColor - local Message = MenuParam.ParamMessage - - EscortGroup:GetUnit(1):Smoke( Color ) - EscortGroup:MessageToClient( Message, 10, EscortClient ) -end - - ---- @param #MENUPARAM MenuParam -function ESCORT._ReportNearbyTargetsNow( MenuParam ) - - local self = MenuParam.ParamSelf - local EscortGroup = self.EscortGroup - local EscortClient = self.EscortClient - - self:_ReportTargetsScheduler() - -end - -function ESCORT._SwitchReportNearbyTargets( MenuParam ) - - local self = MenuParam.ParamSelf - local EscortGroup = self.EscortGroup - local EscortClient = self.EscortClient - - self.ReportTargets = MenuParam.ParamReportTargets - - if self.ReportTargets then - if not self.ReportTargetsScheduler then - --self.ReportTargetsScheduler = routines.scheduleFunction( self._ReportTargetsScheduler, { self }, timer.getTime() + 1, 30 ) - self.ReportTargetsScheduler = SCHEDULER:New( self, self._ReportTargetsScheduler, {}, 1, 30 ) - end - else - routines.removeFunction( self.ReportTargetsScheduler ) - self.ReportTargetsScheduler = nil - end -end - ---- @param #MENUPARAM MenuParam -function ESCORT._ScanTargets( MenuParam ) - - local self = MenuParam.ParamSelf - local EscortGroup = self.EscortGroup - local EscortClient = self.EscortClient - - local ScanDuration = MenuParam.ParamScanDuration - - if self.FollowScheduler then - routines.removeFunction( self.FollowScheduler ) - end - - self:T( { "FollowScheduler after removefunction: ", self.FollowScheduler } ) - - if EscortGroup:IsHelicopter() then - SCHEDULER:New( EscortGroup, EscortGroup.PushTask, - { EscortGroup:TaskControlled( - EscortGroup:TaskOrbitCircle( 200, 20 ), - EscortGroup:TaskCondition( nil, nil, nil, nil, ScanDuration, nil ) - ) - }, - 1 - ) - elseif EscortGroup:IsAirPlane() then - SCHEDULER:New( EscortGroup, EscortGroup.PushTask, - { EscortGroup:TaskControlled( - EscortGroup:TaskOrbitCircle( 1000, 500 ), - EscortGroup:TaskCondition( nil, nil, nil, nil, ScanDuration, nil ) - ) - }, - 1 - ) - end - - EscortGroup:MessageToClient( "Scanning targets for " .. ScanDuration .. " seconds.", ScanDuration, EscortClient ) - - if self.EscortMode == ESCORT.MODE.FOLLOW then - --self.FollowScheduler = routines.scheduleFunction( self._FollowScheduler, { self, Distance }, timer.getTime() + ScanDuration, 1 ) - self.FollowScheduler:Start() - end - -end - -function _Resume( EscortGroup ) - env.info( '_Resume' ) - - local Escort = EscortGroup.Escort -- #ESCORT - env.info( "EscortMode = " .. Escort.EscortMode ) - if Escort.EscortMode == ESCORT.MODE.FOLLOW then - Escort:JoinUpAndFollow( EscortGroup, Escort.EscortClient, Escort.Distance ) - end - -end - ---- @param #MENUPARAM MenuParam -function ESCORT._AttackTarget( MenuParam ) - - local self = MenuParam.ParamSelf - local EscortGroup = self.EscortGroup - local EscortClient = self.EscortClient - local AttackUnit = MenuParam.ParamUnit -- Unit#UNIT - - if self.FollowScheduler then - routines.removeFunction( self.FollowScheduler ) - end - - self:T( AttackUnit ) - - if EscortGroup:IsAir() then - EscortGroup:OptionROEOpenFire() - EscortGroup:OptionROTPassiveDefense() - EscortGroup.Escort = self -- Need to do this trick to get the reference for the escort in the _Resume function. --- routines.scheduleFunction( --- EscortGroup.PushTask, --- { EscortGroup, --- EscortGroup:TaskCombo( --- { EscortGroup:TaskAttackUnit( AttackUnit ), --- EscortGroup:TaskFunction( 1, 2, "_Resume", {"''"} ) --- } --- ) --- }, timer.getTime() + 10 --- ) - SCHEDULER:New( EscortGroup, - EscortGroup.PushTask, - { EscortGroup:TaskCombo( - { EscortGroup:TaskAttackUnit( AttackUnit ), - EscortGroup:TaskFunction( 1, 2, "_Resume", {"''"} ) - } - ) - }, 10 - ) - else --- routines.scheduleFunction( --- EscortGroup.PushTask, --- { EscortGroup, --- EscortGroup:TaskCombo( --- { EscortGroup:TaskFireAtPoint( AttackUnit:GetPointVec2(), 50 ) --- } --- ) --- }, timer.getTime() + 10 --- ) - SCHEDULER:New( EscortGroup, - EscortGroup.PushTask, - { EscortGroup:TaskCombo( - { EscortGroup:TaskFireAtPoint( AttackUnit:GetPointVec2(), 50 ) - } - ) - }, 10 - ) - end - EscortGroup:MessageToClient( "Engaging Designated Unit!", 10, EscortClient ) - - -end - ---- @param #MENUPARAM MenuParam -function ESCORT._AssistTarget( MenuParam ) - - local self = MenuParam.ParamSelf - local EscortGroup = self.EscortGroup - local EscortClient = self.EscortClient - local EscortGroupAttack = MenuParam.ParamEscortGroup - local AttackUnit = MenuParam.ParamUnit -- Unit#UNIT - - if self.FollowScheduler then - routines.removeFunction( self.FollowScheduler ) - end - - - self:T( AttackUnit ) - - if EscortGroupAttack:IsAir() then - EscortGroupAttack:OptionROEOpenFire() - EscortGroupAttack:OptionROTVertical() --- routines.scheduleFunction( --- EscortGroupAttack.PushTask, --- { EscortGroupAttack, --- EscortGroupAttack:TaskCombo( --- { EscortGroupAttack:TaskAttackUnit( AttackUnit ), --- EscortGroupAttack:TaskOrbitCircle( 500, 350 ) --- } --- ) --- }, timer.getTime() + 10 --- ) - SCHDULER:New( EscortGroupAttack, - EscortGroupAttack.PushTask, - { EscortGroupAttack:TaskCombo( - { EscortGroupAttack:TaskAttackUnit( AttackUnit ), - EscortGroupAttack:TaskOrbitCircle( 500, 350 ) - } - ) - }, 10 - ) - else --- routines.scheduleFunction( --- EscortGroupAttack.PushTask, --- { EscortGroupAttack, --- EscortGroupAttack:TaskCombo( --- { EscortGroupAttack:TaskFireAtPoint( AttackUnit:GetPointVec2(), 50 ) --- } --- ) --- }, timer.getTime() + 10 --- ) - SCHEDULER:New( EscortGroupAttack, - EscortGroupAttack.PushTask, - { EscortGroupAttack:TaskCombo( - { EscortGroupAttack:TaskFireAtPoint( AttackUnit:GetPointVec2(), 50 ) - } - ) - }, 10 - ) - end - EscortGroupAttack:MessageToClient( "Assisting with the destroying the enemy unit!", 10, EscortClient ) - -end - ---- @param #MENUPARAM MenuParam -function ESCORT._ROE( MenuParam ) - - local self = MenuParam.ParamSelf - local EscortGroup = self.EscortGroup - local EscortClient = self.EscortClient - - local EscortROEFunction = MenuParam.ParamFunction - local EscortROEMessage = MenuParam.ParamMessage - - pcall( function() EscortROEFunction() end ) - EscortGroup:MessageToClient( EscortROEMessage, 10, EscortClient ) -end - ---- @param #MENUPARAM MenuParam -function ESCORT._ROT( MenuParam ) - - local self = MenuParam.ParamSelf - local EscortGroup = self.EscortGroup - local EscortClient = self.EscortClient - - local EscortROTFunction = MenuParam.ParamFunction - local EscortROTMessage = MenuParam.ParamMessage - - pcall( function() EscortROTFunction() end ) - EscortGroup:MessageToClient( EscortROTMessage, 10, EscortClient ) -end - ---- @param #MENUPARAM MenuParam -function ESCORT._ResumeMission( MenuParam ) - - local self = MenuParam.ParamSelf - local EscortGroup = self.EscortGroup - local EscortClient = self.EscortClient - - local WayPoint = MenuParam.ParamWayPoint - - routines.removeFunction( self.FollowScheduler ) - self.FollowScheduler = nil - - local WayPoints = EscortGroup:GetTaskRoute() - self:T( WayPoint, WayPoints ) - - for WayPointIgnore = 1, WayPoint do - table.remove( WayPoints, 1 ) - end - - --routines.scheduleFunction( EscortGroup.SetTask, {EscortGroup, EscortGroup:TaskRoute( WayPoints ) }, timer.getTime() + 1 ) - SCHEDULER:New( EscortGroup, EscortGroup.SetTask, { EscortGroup:TaskRoute( WayPoints ) }, 1 ) - - EscortGroup:MessageToClient( "Resuming mission from waypoint " .. WayPoint .. ".", 10, EscortClient ) -end - ---- Registers the waypoints --- @param #ESCORT self --- @return #table -function ESCORT:RegisterRoute() - self:F() - - local EscortGroup = self.EscortGroup -- Group#GROUP - - local TaskPoints = EscortGroup:GetTaskRoute() - - self:T( TaskPoints ) - - return TaskPoints -end - ---- @param Escort#ESCORT self -function ESCORT:_FollowScheduler( FollowDistance ) - self:F( { FollowDistance }) - - if self.EscortGroup:IsAlive() and self.EscortClient:IsAlive() then - - local ClientUnit = self.EscortClient:GetClientGroupUnit() - local GroupUnit = self.EscortGroup:GetUnit( 1 ) - - if self.CT1 == 0 and self.GT1 == 0 then - self.CV1 = ClientUnit:GetPointVec3() - self.CT1 = timer.getTime() - self.GV1 = GroupUnit:GetPointVec3() - self.GT1 = timer.getTime() - else - local CT1 = self.CT1 - local CT2 = timer.getTime() - local CV1 = self.CV1 - local CV2 = ClientUnit:GetPointVec3() - self.CT1 = CT2 - self.CV1 = CV2 - - local CD = ( ( CV2.x - CV1.x )^2 + ( CV2.y - CV1.y )^2 + ( CV2.z - CV1.z )^2 ) ^ 0.5 - local CT = CT2 - CT1 - - local CS = ( 3600 / CT ) * ( CD / 1000 ) - - self:T2( { "Client:", CS, CD, CT, CV2, CV1, CT2, CT1 } ) - - local GT1 = self.GT1 - local GT2 = timer.getTime() - local GV1 = self.GV1 - local GV2 = GroupUnit:GetPointVec3() - self.GT1 = GT2 - self.GV1 = GV2 - - local GD = ( ( GV2.x - GV1.x )^2 + ( GV2.y - GV1.y )^2 + ( GV2.z - GV1.z )^2 ) ^ 0.5 - local GT = GT2 - GT1 - - local GS = ( 3600 / GT ) * ( GD / 1000 ) - - self:T2( { "Group:", GS, GD, GT, GV2, GV1, GT2, GT1 } ) - - -- Calculate the group direction vector - local GV = { x = GV2.x - CV2.x, y = GV2.y - CV2.y, z = GV2.z - CV2.z } - - -- Calculate GH2, GH2 with the same height as CV2. - local GH2 = { x = GV2.x, y = CV2.y, z = GV2.z } - - -- Calculate the angle of GV to the orthonormal plane - local alpha = math.atan2( GV.z, GV.x ) - - -- Now we calculate the intersecting vector between the circle around CV2 with radius FollowDistance and GH2. - -- From the GeoGebra model: CVI = (x(CV2) + FollowDistance cos(alpha), y(GH2) + FollowDistance sin(alpha), z(CV2)) - local CVI = { x = CV2.x + FollowDistance * math.cos(alpha), - y = GH2.y, - z = CV2.z + FollowDistance * math.sin(alpha), - } - - -- Calculate the direction vector DV of the escort group. We use CVI as the base and CV2 as the direction. - local DV = { x = CV2.x - CVI.x, y = CV2.y - CVI.y, z = CV2.z - CVI.z } - - -- We now calculate the unary direction vector DVu, so that we can multiply DVu with the speed, which is expressed in meters / s. - -- We need to calculate this vector to predict the point the escort group needs to fly to according its speed. - -- The distance of the destination point should be far enough not to have the aircraft starting to swipe left to right... - local DVu = { x = DV.x / FollowDistance, y = DV.y / FollowDistance, z = DV.z / FollowDistance } - - -- Now we can calculate the group destination vector GDV. - local GDV = { x = DVu.x * CS * 8 + CVI.x, y = CVI.y, z = DVu.z * CS * 8 + CVI.z } - - --trigger.action.smoke( GDV, trigger.smokeColor.Red ) - self:T2( { "CV2:", CV2 } ) - self:T2( { "CVI:", CVI } ) - self:T2( { "GDV:", GDV } ) - - -- Measure distance between client and group - local CatchUpDistance = ( ( GDV.x - GV2.x )^2 + ( GDV.y - GV2.y )^2 + ( GDV.z - GV2.z )^2 ) ^ 0.5 - - -- The calculation of the Speed would simulate that the group would take 30 seconds to overcome - -- the requested Distance). - local Time = 10 - local CatchUpSpeed = ( CatchUpDistance - ( CS * 8.4 ) ) / Time - - local Speed = CS + CatchUpSpeed - if Speed < 0 then - Speed = 0 - end - - self:T( { "Client Speed, Escort Speed, Speed, FlyDistance, Time:", CS, GS, Speed, Distance, Time } ) - - -- Now route the escort to the desired point with the desired speed. - self.EscortGroup:TaskRouteToVec3( GDV, Speed / 3.6 ) -- DCS models speed in Mps (Miles per second) - end - return true - end - - return false -end - - ---- Report Targets Scheduler. --- @param #ESCORT self -function ESCORT:_ReportTargetsScheduler() - self:F( self.EscortGroup:GetName() ) - - if self.EscortGroup:IsAlive() and self.EscortClient:IsAlive() then - local EscortGroupName = self.EscortGroup:GetName() - local EscortTargets = self.EscortGroup:GetDetectedTargets() - - local ClientEscortTargets = self.EscortClient._EscortGroups[EscortGroupName].Targets - - local EscortTargetMessages = "" - for EscortTargetID, EscortTarget in pairs( EscortTargets ) do - local EscortObject = EscortTarget.object - self:T( EscortObject ) - if EscortObject and EscortObject:isExist() and EscortObject.id_ < 50000000 then - - local EscortTargetUnit = UNIT:Find( EscortObject ) - local EscortTargetUnitName = EscortTargetUnit:GetName() - - - - -- local EscortTargetIsDetected, - -- EscortTargetIsVisible, - -- EscortTargetLastTime, - -- EscortTargetKnowType, - -- EscortTargetKnowDistance, - -- EscortTargetLastPos, - -- EscortTargetLastVelocity - -- = self.EscortGroup:IsTargetDetected( EscortObject ) - -- - -- self:T( { EscortTargetIsDetected, - -- EscortTargetIsVisible, - -- EscortTargetLastTime, - -- EscortTargetKnowType, - -- EscortTargetKnowDistance, - -- EscortTargetLastPos, - -- EscortTargetLastVelocity } ) - - - local EscortTargetUnitPositionVec3 = EscortTargetUnit:GetPointVec3() - local EscortPositionVec3 = self.EscortGroup:GetPointVec3() - local Distance = ( ( EscortTargetUnitPositionVec3.x - EscortPositionVec3.x )^2 + - ( EscortTargetUnitPositionVec3.y - EscortPositionVec3.y )^2 + - ( EscortTargetUnitPositionVec3.z - EscortPositionVec3.z )^2 - ) ^ 0.5 / 1000 - - self:T( { self.EscortGroup:GetName(), EscortTargetUnit:GetName(), Distance, EscortTarget } ) - - if Distance <= 15 then - - if not ClientEscortTargets[EscortTargetUnitName] then - ClientEscortTargets[EscortTargetUnitName] = {} - end - ClientEscortTargets[EscortTargetUnitName].AttackUnit = EscortTargetUnit - ClientEscortTargets[EscortTargetUnitName].visible = EscortTarget.visible - ClientEscortTargets[EscortTargetUnitName].type = EscortTarget.type - ClientEscortTargets[EscortTargetUnitName].distance = EscortTarget.distance - else - if ClientEscortTargets[EscortTargetUnitName] then - ClientEscortTargets[EscortTargetUnitName] = nil - end - end - end - end - - self:T( { "Sorting Targets Table:", ClientEscortTargets } ) - table.sort( ClientEscortTargets, function( a, b ) return a.Distance < b.Distance end ) - self:T( { "Sorted Targets Table:", ClientEscortTargets } ) - - -- Remove the sub menus of the Attack menu of the Escort for the EscortGroup. - self.EscortMenuAttackNearbyTargets:RemoveSubMenus() - - if self.EscortMenuTargetAssistance then - self.EscortMenuTargetAssistance:RemoveSubMenus() - end - - --for MenuIndex = 1, #self.EscortMenuAttackTargets do - -- self:T( { "Remove Menu:", self.EscortMenuAttackTargets[MenuIndex] } ) - -- self.EscortMenuAttackTargets[MenuIndex] = self.EscortMenuAttackTargets[MenuIndex]:Remove() - --end - - - if ClientEscortTargets then - for ClientEscortTargetUnitName, ClientEscortTargetData in pairs( ClientEscortTargets ) do - - for ClientEscortGroupName, EscortGroupData in pairs( self.EscortClient._EscortGroups ) do - - if ClientEscortTargetData and ClientEscortTargetData.AttackUnit:IsAlive() then - - local EscortTargetMessage = "" - local EscortTargetCategoryName = ClientEscortTargetData.AttackUnit:GetCategoryName() - local EscortTargetCategoryType = ClientEscortTargetData.AttackUnit:GetTypeName() - if ClientEscortTargetData.type then - EscortTargetMessage = EscortTargetMessage .. EscortTargetCategoryName .. " (" .. EscortTargetCategoryType .. ") at " - else - EscortTargetMessage = EscortTargetMessage .. "Unknown target at " - end - - local EscortTargetUnitPositionVec3 = ClientEscortTargetData.AttackUnit:GetPointVec3() - local EscortPositionVec3 = self.EscortGroup:GetPointVec3() - local Distance = ( ( EscortTargetUnitPositionVec3.x - EscortPositionVec3.x )^2 + - ( EscortTargetUnitPositionVec3.y - EscortPositionVec3.y )^2 + - ( EscortTargetUnitPositionVec3.z - EscortPositionVec3.z )^2 - ) ^ 0.5 / 1000 - - self:T( { self.EscortGroup:GetName(), ClientEscortTargetData.AttackUnit:GetName(), Distance, ClientEscortTargetData.AttackUnit } ) - if ClientEscortTargetData.visible == false then - EscortTargetMessage = EscortTargetMessage .. string.format( "%.2f", Distance ) .. " estimated km" - else - EscortTargetMessage = EscortTargetMessage .. string.format( "%.2f", Distance ) .. " km" - end - - if ClientEscortTargetData.visible then - EscortTargetMessage = EscortTargetMessage .. ", visual" - end - - if ClientEscortGroupName == EscortGroupName then - - MENU_CLIENT_COMMAND:New( self.EscortClient, - EscortTargetMessage, - self.EscortMenuAttackNearbyTargets, - ESCORT._AttackTarget, - { ParamSelf = self, - ParamUnit = ClientEscortTargetData.AttackUnit - } - ) - EscortTargetMessages = EscortTargetMessages .. "\n - " .. EscortTargetMessage - else - if self.EscortMenuTargetAssistance then - local MenuTargetAssistance = MENU_CLIENT:New( self.EscortClient, EscortGroupData.EscortName, self.EscortMenuTargetAssistance ) - MENU_CLIENT_COMMAND:New( self.EscortClient, - EscortTargetMessage, - MenuTargetAssistance, - ESCORT._AssistTarget, - { ParamSelf = self, - ParamEscortGroup = EscortGroupData.EscortGroup, - ParamUnit = ClientEscortTargetData.AttackUnit - } - ) - end - end - else - ClientEscortTargetData = nil - end - end - end - - if EscortTargetMessages ~= "" and self.ReportTargets == true then - self.EscortGroup:MessageToClient( "Detected targets within 15 km range:" .. EscortTargetMessages:gsub("\n$",""), 20, self.EscortClient ) - else - self.EscortGroup:MessageToClient( "No targets detected!", 20, self.EscortClient ) - end - end - - if self.EscortMenuResumeMission then - self.EscortMenuResumeMission:RemoveSubMenus() - - -- if self.EscortMenuResumeWayPoints then - -- for MenuIndex = 1, #self.EscortMenuResumeWayPoints do - -- self:T( { "Remove Menu:", self.EscortMenuResumeWayPoints[MenuIndex] } ) - -- self.EscortMenuResumeWayPoints[MenuIndex] = self.EscortMenuResumeWayPoints[MenuIndex]:Remove() - -- end - -- end - - local TaskPoints = self:RegisterRoute() - for WayPointID, WayPoint in pairs( TaskPoints ) do - local EscortPositionVec3 = self.EscortGroup:GetPointVec3() - local Distance = ( ( WayPoint.x - EscortPositionVec3.x )^2 + - ( WayPoint.y - EscortPositionVec3.z )^2 - ) ^ 0.5 / 1000 - MENU_CLIENT_COMMAND:New( self.EscortClient, "Waypoint " .. WayPointID .. " at " .. string.format( "%.2f", Distance ).. "km", self.EscortMenuResumeMission, ESCORT._ResumeMission, { ParamSelf = self, ParamWayPoint = WayPointID } ) - end - end - return true - end - - return false -end ---- Provides missile training functions. --- --- @{#MISSILETRAINER} class --- ======================== --- The @{#MISSILETRAINER} class uses the DCS world messaging system to be alerted of any missiles fired, and when a missile would hit your aircraft, --- the class will destroy the missile within a certain range, to avoid damage to your aircraft. --- It suports the following functionality: --- --- * Track the missiles fired at you and other players, providing bearing and range information of the missiles towards the airplanes. --- * Provide alerts of missile launches, including detailed information of the units launching, including bearing, range … --- * Provide alerts when a missile would have killed your aircraft. --- * Provide alerts when the missile self destructs. --- * Enable / Disable and Configure the Missile Trainer using the various menu options. --- --- When running a mission where MISSILETRAINER is used, the following radio menu structure ( 'Radio Menu' -> 'Other (F10)' -> 'MissileTrainer' ) options are available for the players: --- --- * **Messages**: Menu to configure all messages. --- * **Messages On**: Show all messages. --- * **Messages Off**: Disable all messages. --- * **Tracking**: Menu to configure missile tracking messages. --- * **To All**: Shows missile tracking messages to all players. --- * **To Target**: Shows missile tracking messages only to the player where the missile is targetted at. --- * **Tracking On**: Show missile tracking messages. --- * **Tracking Off**: Disable missile tracking messages. --- * **Frequency Increase**: Increases the missile tracking message frequency with one second. --- * **Frequency Decrease**: Decreases the missile tracking message frequency with one second. --- * **Alerts**: Menu to configure alert messages. --- * **To All**: Shows alert messages to all players. --- * **To Target**: Shows alert messages only to the player where the missile is (was) targetted at. --- * **Hits On**: Show missile hit alert messages. --- * **Hits Off**: Disable missile hit alert messages. --- * **Launches On**: Show missile launch messages. --- * **Launches Off**: Disable missile launch messages. --- * **Details**: Menu to configure message details. --- * **Range On**: Shows range information when a missile is fired to a target. --- * **Range Off**: Disable range information when a missile is fired to a target. --- * **Bearing On**: Shows bearing information when a missile is fired to a target. --- * **Bearing Off**: Disable bearing information when a missile is fired to a target. --- * **Distance**: Menu to configure the distance when a missile needs to be destroyed when near to a player, during tracking. This will improve/influence hit calculation accuracy, but has the risk of damaging the aircraft when the missile reaches the aircraft before the distance is measured. --- * **50 meter**: Destroys the missile when the distance to the aircraft is below or equal to 50 meter. --- * **100 meter**: Destroys the missile when the distance to the aircraft is below or equal to 100 meter. --- * **150 meter**: Destroys the missile when the distance to the aircraft is below or equal to 150 meter. --- * **200 meter**: Destroys the missile when the distance to the aircraft is below or equal to 200 meter. --- --- --- MISSILETRAINER construction methods: --- ==================================== --- Create a new MISSILETRAINER object with the @{#MISSILETRAINER.New} method: --- --- * @{#MISSILETRAINER.New}: Creates a new MISSILETRAINER object taking the maximum distance to your aircraft to evaluate when a missile needs to be destroyed. --- --- MISSILETRAINER will collect each unit declared in the mission with a skill level "Client" and "Player", and will monitor the missiles shot at those. --- --- MISSILETRAINER initialization methods: --- ====================================== --- A MISSILETRAINER object will behave differently based on the usage of initialization methods: --- --- * @{#MISSILETRAINER.InitMessagesOnOff}: Sets by default the display of any message to be ON or OFF. --- * @{#MISSILETRAINER.InitTrackingToAll}: Sets by default the missile tracking report for all players or only for those missiles targetted to you. --- * @{#MISSILETRAINER.InitTrackingOnOff}: Sets by default the display of missile tracking report to be ON or OFF. --- * @{#MISSILETRAINER.InitTrackingFrequency}: Increases, decreases the missile tracking message display frequency with the provided time interval in seconds. --- * @{#MISSILETRAINER.InitAlertsToAll}: Sets by default the display of alerts to be shown to all players or only to you. --- * @{#MISSILETRAINER.InitAlertsHitsOnOff}: Sets by default the display of hit alerts ON or OFF. --- * @{#MISSILETRAINER.InitAlertsLaunchesOnOff}: Sets by default the display of launch alerts ON or OFF. --- * @{#MISSILETRAINER.InitRangeOnOff}: Sets by default the display of range information of missiles ON of OFF. --- * @{#MISSILETRAINER.InitBearingOnOff}: Sets by default the display of bearing information of missiles ON of OFF. --- * @{#MISSILETRAINER.InitMenusOnOff}: Allows to configure the options through the radio menu. --- --- @module MissileTrainer --- @author FlightControl - - -Include.File( "Client" ) -Include.File( "Scheduler" ) - ---- The MISSILETRAINER class --- @type MISSILETRAINER --- @extends Base#BASE -MISSILETRAINER = { - ClassName = "MISSILETRAINER", -} - ---- Creates the main object which is handling missile tracking. --- When a missile is fired a SCHEDULER is set off that follows the missile. When near a certain a client player, the missile will be destroyed. --- @param #MISSILETRAINER self --- @param #number Distance The distance in meters when a tracked missile needs to be destroyed when close to a player. --- @param #string Briefing (Optional) Will show a text to the players when starting their mission. Can be used for briefing purposes. --- @return #MISSILETRAINER -function MISSILETRAINER:New( Distance, Briefing ) - local self = BASE:Inherit( self, BASE:New() ) - self:F( Distance ) - - if Briefing then - self.Briefing = Briefing - end - - self.Schedulers = {} - self.SchedulerID = 0 - - self.MessageInterval = 2 - self.MessageLastTime = timer.getTime() - - self.Distance = Distance / 1000 - - _EVENTDISPATCHER:OnShot( self._EventShot, self ) - - self.DB = DATABASE:New():FilterStart() - self.DBClients = self.DB.Clients - self.DBUnits = self.DB.Units - - for ClientID, Client in pairs( self.DBClients ) do - - local function _Alive( Client ) - - if self.Briefing then - Client:Message( self.Briefing, 15, "HELLO WORLD", "Trainer" ) - end - - if self.MenusOnOff == true then - Client:Message( "Use the 'Radio Menu' -> 'Other (F10)' -> 'Missile Trainer' menu options to change the Missile Trainer settings (for all players).", 15, "MENU", "Trainer" ) - - Client.MainMenu = MENU_CLIENT:New( Client, "Missile Trainer", nil ) -- Menu#MENU_CLIENT - - Client.MenuMessages = MENU_CLIENT:New( Client, "Messages", Client.MainMenu ) - Client.MenuOn = MENU_CLIENT_COMMAND:New( Client, "Messages On", Client.MenuMessages, self._MenuMessages, { MenuSelf = self, MessagesOnOff = true } ) - Client.MenuOff = MENU_CLIENT_COMMAND:New( Client, "Messages Off", Client.MenuMessages, self._MenuMessages, { MenuSelf = self, MessagesOnOff = false } ) - - Client.MenuTracking = MENU_CLIENT:New( Client, "Tracking", Client.MainMenu ) - Client.MenuTrackingToAll = MENU_CLIENT_COMMAND:New( Client, "To All", Client.MenuTracking, self._MenuMessages, { MenuSelf = self, TrackingToAll = true } ) - Client.MenuTrackingToTarget = MENU_CLIENT_COMMAND:New( Client, "To Target", Client.MenuTracking, self._MenuMessages, { MenuSelf = self, TrackingToAll = false } ) - Client.MenuTrackOn = MENU_CLIENT_COMMAND:New( Client, "Tracking On", Client.MenuTracking, self._MenuMessages, { MenuSelf = self, TrackingOnOff = true } ) - Client.MenuTrackOff = MENU_CLIENT_COMMAND:New( Client, "Tracking Off", Client.MenuTracking, self._MenuMessages, { MenuSelf = self, TrackingOnOff = false } ) - Client.MenuTrackIncrease = MENU_CLIENT_COMMAND:New( Client, "Frequency Increase", Client.MenuTracking, self._MenuMessages, { MenuSelf = self, TrackingFrequency = -1 } ) - Client.MenuTrackDecrease = MENU_CLIENT_COMMAND:New( Client, "Frequency Decrease", Client.MenuTracking, self._MenuMessages, { MenuSelf = self, TrackingFrequency = 1 } ) - - Client.MenuAlerts = MENU_CLIENT:New( Client, "Alerts", Client.MainMenu ) - Client.MenuAlertsToAll = MENU_CLIENT_COMMAND:New( Client, "To All", Client.MenuAlerts, self._MenuMessages, { MenuSelf = self, AlertsToAll = true } ) - Client.MenuAlertsToTarget = MENU_CLIENT_COMMAND:New( Client, "To Target", Client.MenuAlerts, self._MenuMessages, { MenuSelf = self, AlertsToAll = false } ) - Client.MenuHitsOn = MENU_CLIENT_COMMAND:New( Client, "Hits On", Client.MenuAlerts, self._MenuMessages, { MenuSelf = self, AlertsHitsOnOff = true } ) - Client.MenuHitsOff = MENU_CLIENT_COMMAND:New( Client, "Hits Off", Client.MenuAlerts, self._MenuMessages, { MenuSelf = self, AlertsHitsOnOff = false } ) - Client.MenuLaunchesOn = MENU_CLIENT_COMMAND:New( Client, "Launches On", Client.MenuAlerts, self._MenuMessages, { MenuSelf = self, AlertsLaunchesOnOff = true } ) - Client.MenuLaunchesOff = MENU_CLIENT_COMMAND:New( Client, "Launches Off", Client.MenuAlerts, self._MenuMessages, { MenuSelf = self, AlertsLaunchesOnOff = false } ) - - Client.MenuDetails = MENU_CLIENT:New( Client, "Details", Client.MainMenu ) - Client.MenuDetailsDistanceOn = MENU_CLIENT_COMMAND:New( Client, "Range On", Client.MenuDetails, self._MenuMessages, { MenuSelf = self, DetailsRangeOnOff = true } ) - Client.MenuDetailsDistanceOff = MENU_CLIENT_COMMAND:New( Client, "Range Off", Client.MenuDetails, self._MenuMessages, { MenuSelf = self, DetailsRangeOnOff = false } ) - Client.MenuDetailsBearingOn = MENU_CLIENT_COMMAND:New( Client, "Bearing On", Client.MenuDetails, self._MenuMessages, { MenuSelf = self, DetailsBearingOnOff = true } ) - Client.MenuDetailsBearingOff = MENU_CLIENT_COMMAND:New( Client, "Bearing Off", Client.MenuDetails, self._MenuMessages, { MenuSelf = self, DetailsBearingOnOff = false } ) - - Client.MenuDistance = MENU_CLIENT:New( Client, "Set distance to plane", Client.MainMenu ) - Client.MenuDistance50 = MENU_CLIENT_COMMAND:New( Client, "50 meter", Client.MenuDistance, self._MenuMessages, { MenuSelf = self, Distance = 50 / 1000 } ) - Client.MenuDistance100 = MENU_CLIENT_COMMAND:New( Client, "100 meter", Client.MenuDistance, self._MenuMessages, { MenuSelf = self, Distance = 100 / 1000 } ) - Client.MenuDistance150 = MENU_CLIENT_COMMAND:New( Client, "150 meter", Client.MenuDistance, self._MenuMessages, { MenuSelf = self, Distance = 150 / 1000 } ) - Client.MenuDistance200 = MENU_CLIENT_COMMAND:New( Client, "200 meter", Client.MenuDistance, self._MenuMessages, { MenuSelf = self, Distance = 200 / 1000 } ) - else - if Client.MainMenu then - Client.MainMenu:Remove() - end - end - - - local ClientID = Client:GetID() - self:T( ClientID ) - if not self.TrackingMissiles[ClientID] then - self.TrackingMissiles[ClientID] = {} - end - self.TrackingMissiles[ClientID].Client = Client - if not self.TrackingMissiles[ClientID].MissileData then - self.TrackingMissiles[ClientID].MissileData = {} - end - end - - Client:Alive( _Alive ) - - end - --- self.DB:ForEachClient( --- --- @param Client#CLIENT Client --- function( Client ) --- --- ... actions ... --- --- end --- ) - - self.MessagesOnOff = true - - self.TrackingToAll = false - self.TrackingOnOff = true - self.TrackingFrequency = 3 - - self.AlertsToAll = true - self.AlertsHitsOnOff = true - self.AlertsLaunchesOnOff = true - - self.DetailsRangeOnOff = true - self.DetailsBearingOnOff = true - - self.MenusOnOff = true - - self.TrackingMissiles = {} - - self.TrackingScheduler = SCHEDULER:New( self, self._TrackMissiles, {}, 0.5, 0.05, 0 ) - - return self -end - --- Initialization methods. - - ---- Sets by default the display of any message to be ON or OFF. --- @param #MISSILETRAINER self --- @param #boolean MessagesOnOff true or false --- @return #MISSILETRAINER self -function MISSILETRAINER:InitMessagesOnOff( MessagesOnOff ) - self:F( MessagesOnOff ) - - self.MessagesOnOff = MessagesOnOff - if self.MessagesOnOff == true then - MESSAGE:New( "Messages ON", "Menu", 15, "ID" ):ToAll() - else - MESSAGE:New( "Messages OFF", "Menu", 15, "ID" ):ToAll() - end - - return self -end - ---- Sets by default the missile tracking report for all players or only for those missiles targetted to you. --- @param #MISSILETRAINER self --- @param #boolean TrackingToAll true or false --- @return #MISSILETRAINER self -function MISSILETRAINER:InitTrackingToAll( TrackingToAll ) - self:F( TrackingToAll ) - - self.TrackingToAll = TrackingToAll - if self.TrackingToAll == true then - MESSAGE:New( "Missile tracking to all players ON", "Menu", 15, "ID" ):ToAll() - else - MESSAGE:New( "Missile tracking to all players OFF", "Menu", 15, "ID" ):ToAll() - end - - return self -end - ---- Sets by default the display of missile tracking report to be ON or OFF. --- @param #MISSILETRAINER self --- @param #boolean TrackingOnOff true or false --- @return #MISSILETRAINER self -function MISSILETRAINER:InitTrackingOnOff( TrackingOnOff ) - self:F( TrackingOnOff ) - - self.TrackingOnOff = TrackingOnOff - if self.TrackingOnOff == true then - MESSAGE:New( "Missile tracking ON", "Menu", 15, "ID" ):ToAll() - else - MESSAGE:New( "Missile tracking OFF", "Menu", 15, "ID" ):ToAll() - end - - return self -end - ---- Increases, decreases the missile tracking message display frequency with the provided time interval in seconds. --- The default frequency is a 3 second interval, so the Tracking Frequency parameter specifies the increase or decrease from the default 3 seconds or the last frequency update. --- @param #MISSILETRAINER self --- @param #number TrackingFrequency Provide a negative or positive value in seconds to incraese or decrease the display frequency. --- @return #MISSILETRAINER self -function MISSILETRAINER:InitTrackingFrequency( TrackingFrequency ) - self:F( TrackingFrequency ) - - self.TrackingFrequency = self.TrackingFrequency + TrackingFrequency - if self.TrackingFrequency < 0.5 then - self.TrackingFrequency = 0.5 - end - if self.TrackingFrequency then - MESSAGE:New( "Missile tracking frequency is " .. self.TrackingFrequency .. " seconds.", "Menu", 15, "ID" ):ToAll() - end - - return self -end - ---- Sets by default the display of alerts to be shown to all players or only to you. --- @param #MISSILETRAINER self --- @param #boolean AlertsToAll true or false --- @return #MISSILETRAINER self -function MISSILETRAINER:InitAlertsToAll( AlertsToAll ) - self:F( AlertsToAll ) - - self.AlertsToAll = AlertsToAll - if self.AlertsToAll == true then - MESSAGE:New( "Alerts to all players ON", "Menu", 15, "ID" ):ToAll() - else - MESSAGE:New( "Alerts to all players OFF", "Menu", 15, "ID" ):ToAll() - end - - return self -end - ---- Sets by default the display of hit alerts ON or OFF. --- @param #MISSILETRAINER self --- @param #boolean AlertsHitsOnOff true or false --- @return #MISSILETRAINER self -function MISSILETRAINER:InitAlertsHitsOnOff( AlertsHitsOnOff ) - self:F( AlertsHitsOnOff ) - - self.AlertsHitsOnOff = AlertsHitsOnOff - if self.AlertsHitsOnOff == true then - MESSAGE:New( "Alerts Hits ON", "Menu", 15, "ID" ):ToAll() - else - MESSAGE:New( "Alerts Hits OFF", "Menu", 15, "ID" ):ToAll() - end - - return self -end - ---- Sets by default the display of launch alerts ON or OFF. --- @param #MISSILETRAINER self --- @param #boolean AlertsLaunchesOnOff true or false --- @return #MISSILETRAINER self -function MISSILETRAINER:InitAlertsLaunchesOnOff( AlertsLaunchesOnOff ) - self:F( AlertsLaunchesOnOff ) - - self.AlertsLaunchesOnOff = AlertsLaunchesOnOff - if self.AlertsLaunchesOnOff == true then - MESSAGE:New( "Alerts Launches ON", "Menu", 15, "ID" ):ToAll() - else - MESSAGE:New( "Alerts Launches OFF", "Menu", 15, "ID" ):ToAll() - end - - return self -end - ---- Sets by default the display of range information of missiles ON of OFF. --- @param #MISSILETRAINER self --- @param #boolean DetailsRangeOnOff true or false --- @return #MISSILETRAINER self -function MISSILETRAINER:InitRangeOnOff( DetailsRangeOnOff ) - self:F( DetailsRangeOnOff ) - - self.DetailsRangeOnOff = DetailsRangeOnOff - if self.DetailsRangeOnOff == true then - MESSAGE:New( "Range display ON", "Menu", 15, "ID" ):ToAll() - else - MESSAGE:New( "Range display OFF", "Menu", 15, "ID" ):ToAll() - end - - return self -end - ---- Sets by default the display of bearing information of missiles ON of OFF. --- @param #MISSILETRAINER self --- @param #boolean DetailsBearingOnOff true or false --- @return #MISSILETRAINER self -function MISSILETRAINER:InitBearingOnOff( DetailsBearingOnOff ) - self:F( DetailsBearingOnOff ) - - self.DetailsBearingOnOff = DetailsBearingOnOff - if self.DetailsBearingOnOff == true then - MESSAGE:New( "Bearing display OFF", "Menu", 15, "ID" ):ToAll() - else - MESSAGE:New( "Bearing display OFF", "Menu", 15, "ID" ):ToAll() - end - - return self -end - ---- Enables / Disables the menus. --- @param #MISSILETRAINER self --- @param #boolean MenusOnOff true or false --- @return #MISSILETRAINER self -function MISSILETRAINER:InitMenusOnOff( MenusOnOff ) - self:F( MenusOnOff ) - - self.MenusOnOff = MenusOnOff - if self.MenusOnOff == true then - MESSAGE:New( "Menus are ENABLED (only when a player rejoins a slot)", "Menu", 15, "ID" ):ToAll() - else - MESSAGE:New( "Menus are DISABLED", "Menu", 15, "ID" ):ToAll() - end - - return self -end - - --- Menu functions - -function MISSILETRAINER._MenuMessages( MenuParameters ) - - local self = MenuParameters.MenuSelf - - if MenuParameters.MessagesOnOff ~= nil then - self:InitMessagesOnOff( MenuParameters.MessagesOnOff ) - end - - if MenuParameters.TrackingToAll ~= nil then - self:InitTrackingToAll( MenuParameters.TrackingToAll ) - end - - if MenuParameters.TrackingOnOff ~= nil then - self:InitTrackingOnOff( MenuParameters.TrackingOnOff ) - end - - if MenuParameters.TrackingFrequency ~= nil then - self:InitTrackingFrequency( MenuParameters.TrackingFrequency ) - end - - if MenuParameters.AlertsToAll ~= nil then - self:InitAlertsToAll( MenuParameters.AlertsToAll ) - end - - if MenuParameters.AlertsHitsOnOff ~= nil then - self:InitAlertsHitsOnOff( MenuParameters.AlertsHitsOnOff ) - end - - if MenuParameters.AlertsLaunchesOnOff ~= nil then - self:InitAlertsLaunchesOnOff( MenuParameters.AlertsLaunchesOnOff ) - end - - if MenuParameters.DetailsRangeOnOff ~= nil then - self:InitRangeOnOff( MenuParameters.DetailsRangeOnOff ) - end - - if MenuParameters.DetailsBearingOnOff ~= nil then - self:InitBearingOnOff( MenuParameters.DetailsBearingOnOff ) - end - - if MenuParameters.Distance ~= nil then - self.Distance = MenuParameters.Distance - MESSAGE:New( "Hit detection distance set to " .. self.Distance .. " meters", "Menu", 15, "ID" ):ToAll() - end - -end - ---- Detects if an SA site was shot with an anti radiation missile. In this case, take evasive actions based on the skill level set within the ME. --- @param #MISSILETRAINER self --- @param Event#EVENTDATA Event -function MISSILETRAINER:_EventShot( Event ) - self:F( { Event } ) - - local TrainerSourceDCSUnit = Event.IniDCSUnit - local TrainerSourceDCSUnitName = Event.IniDCSUnitName - local TrainerWeapon = Event.Weapon -- Identify the weapon fired - local TrainerWeaponName = Event.WeaponName -- return weapon type - - self:T( "Missile Launched = " .. TrainerWeaponName ) - - local TrainerTargetDCSUnit = TrainerWeapon:getTarget() -- Identify target - local TrainerTargetDCSUnitName = Unit.getName( TrainerTargetDCSUnit ) - local TrainerTargetSkill = _DATABASE.Templates.Units[TrainerTargetDCSUnitName].Template.skill - - self:T(TrainerTargetDCSUnitName ) - - local Client = self.DBClients[TrainerTargetDCSUnitName] - if Client then - - local TrainerSourceUnit = UNIT:Find( TrainerSourceDCSUnit ) - local TrainerTargetUnit = UNIT:Find( TrainerTargetDCSUnit ) - - if self.MessagesOnOff == true and self.AlertsLaunchesOnOff == true then - - local Message = MESSAGE:New( - string.format( "%s launched a %s", - TrainerSourceUnit:GetTypeName(), - TrainerWeaponName - ) .. self:_AddRange( Client, TrainerWeapon ) .. self:_AddBearing( Client, TrainerWeapon ),"Launch Alert", 5, "ID" ) - - if self.AlertsToAll then - Message:ToAll() - else - Message:ToClient( Client ) - end - end - - local ClientID = Client:GetID() - local MissileData = {} - MissileData.TrainerSourceUnit = TrainerSourceUnit - MissileData.TrainerWeapon = TrainerWeapon - MissileData.TrainerTargetUnit = TrainerTargetUnit - MissileData.TrainerWeaponTypeName = TrainerWeapon:getTypeName() - MissileData.TrainerWeaponLaunched = true - table.insert( self.TrackingMissiles[ClientID].MissileData, MissileData ) - --self:T( self.TrackingMissiles ) - end -end - -function MISSILETRAINER:_AddRange( Client, TrainerWeapon ) - - local RangeText = "" - - if self.DetailsRangeOnOff then - - local PositionMissile = TrainerWeapon:getPoint() - local PositionTarget = Client:GetPointVec3() - - local Range = ( ( PositionMissile.x - PositionTarget.x )^2 + - ( PositionMissile.y - PositionTarget.y )^2 + - ( PositionMissile.z - PositionTarget.z )^2 - ) ^ 0.5 / 1000 - - RangeText = string.format( ", at %4.2fkm", Range ) - end - - return RangeText -end - -function MISSILETRAINER:_AddBearing( Client, TrainerWeapon ) - - local BearingText = "" - - if self.DetailsBearingOnOff then - - local PositionMissile = TrainerWeapon:getPoint() - local PositionTarget = Client:GetPointVec3() - - self:T2( { PositionTarget, PositionMissile }) - - local DirectionVector = { x = PositionMissile.x - PositionTarget.x, y = PositionMissile.y - PositionTarget.y, z = PositionMissile.z - PositionTarget.z } - local DirectionRadians = math.atan2( DirectionVector.z, DirectionVector.x ) - --DirectionRadians = DirectionRadians + routines.getNorthCorrection( PositionTarget ) - if DirectionRadians < 0 then - DirectionRadians = DirectionRadians + 2 * math.pi - end - local DirectionDegrees = DirectionRadians * 180 / math.pi - - BearingText = string.format( ", %d degrees", DirectionDegrees ) - end - - return BearingText -end - - -function MISSILETRAINER:_TrackMissiles() - self:F2() - - - local ShowMessages = false - if self.MessagesOnOff and self.MessageLastTime + self.TrackingFrequency <= timer.getTime() then - self.MessageLastTime = timer.getTime() - ShowMessages = true - end - - -- ALERTS PART - - -- Loop for all Player Clients to check the alerts and deletion of missiles. - for ClientDataID, ClientData in pairs( self.TrackingMissiles ) do - - local Client = ClientData.Client - self:T2( { Client:GetName() } ) - - for MissileDataID, MissileData in pairs( ClientData.MissileData ) do - self:T3( MissileDataID ) - - local TrainerSourceUnit = MissileData.TrainerSourceUnit - local TrainerWeapon = MissileData.TrainerWeapon - local TrainerTargetUnit = MissileData.TrainerTargetUnit - local TrainerWeaponTypeName = MissileData.TrainerWeaponTypeName - local TrainerWeaponLaunched = MissileData.TrainerWeaponLaunched - - if Client and Client:IsAlive() and TrainerSourceUnit and TrainerSourceUnit:IsAlive() and TrainerWeapon and TrainerWeapon:isExist() and TrainerTargetUnit and TrainerTargetUnit:IsAlive() then - local PositionMissile = TrainerWeapon:getPosition().p - local PositionTarget = Client:GetPointVec3() - - local Distance = ( ( PositionMissile.x - PositionTarget.x )^2 + - ( PositionMissile.y - PositionTarget.y )^2 + - ( PositionMissile.z - PositionTarget.z )^2 - ) ^ 0.5 / 1000 - - if Distance <= self.Distance then - -- Hit alert - TrainerWeapon:destroy() - if self.MessagesOnOff == true and self.AlertsHitsOnOff == true then - - self:T( "killed" ) - - local Message = MESSAGE:New( - string.format( "%s launched by %s killed %s", - TrainerWeapon:getTypeName(), - TrainerSourceUnit:GetTypeName(), - TrainerTargetUnit:GetPlayerName() - ),"Hit Alert", 15, "ID" ) - - if self.AlertsToAll == true then - Message:ToAll() - else - Message:ToClient( Client ) - end - - MissileData = nil - table.remove( ClientData.MissileData, MissileDataID ) - self:T(ClientData.MissileData) - end - end - else - if not ( TrainerWeapon and TrainerWeapon:isExist() ) then - if self.MessagesOnOff == true and self.AlertsLaunchesOnOff == true then - -- Weapon does not exist anymore. Delete from Table - local Message = MESSAGE:New( - string.format( "%s launched by %s self destructed!", - TrainerWeaponTypeName, - TrainerSourceUnit:GetTypeName() - ),"Tracking", 5, "ID" ) - - if self.AlertsToAll == true then - Message:ToAll() - else - Message:ToClient( Client ) - end - end - MissileData = nil - table.remove( ClientData.MissileData, MissileDataID ) - self:T( ClientData.MissileData ) - end - end - end - end - - if ShowMessages == true and self.MessagesOnOff == true and self.TrackingOnOff == true then -- Only do this when tracking information needs to be displayed. - - -- TRACKING PART - - -- For the current client, the missile range and bearing details are displayed To the Player Client. - -- For the other clients, the missile range and bearing details are displayed To the other Player Clients. - -- To achieve this, a cross loop is done for each Player Client <-> Other Player Client missile information. - - -- Main Player Client loop - for ClientDataID, ClientData in pairs( self.TrackingMissiles ) do - - local Client = ClientData.Client - self:T2( { Client:GetName() } ) - - - ClientData.MessageToClient = "" - ClientData.MessageToAll = "" - - -- Other Players Client loop - for TrackingDataID, TrackingData in pairs( self.TrackingMissiles ) do - - for MissileDataID, MissileData in pairs( TrackingData.MissileData ) do - self:T3( MissileDataID ) - - local TrainerSourceUnit = MissileData.TrainerSourceUnit - local TrainerWeapon = MissileData.TrainerWeapon - local TrainerTargetUnit = MissileData.TrainerTargetUnit - local TrainerWeaponTypeName = MissileData.TrainerWeaponTypeName - local TrainerWeaponLaunched = MissileData.TrainerWeaponLaunched - - if Client and Client:IsAlive() and TrainerSourceUnit and TrainerSourceUnit:IsAlive() and TrainerWeapon and TrainerWeapon:isExist() and TrainerTargetUnit and TrainerTargetUnit:IsAlive() then - - if ShowMessages == true then - local TrackingTo - TrackingTo = string.format( " -> %s", - TrainerWeaponTypeName - ) - - if ClientDataID == TrackingDataID then - if ClientData.MessageToClient == "" then - ClientData.MessageToClient = "Missiles to You:\n" - end - ClientData.MessageToClient = ClientData.MessageToClient .. TrackingTo .. self:_AddRange( ClientData.Client, TrainerWeapon ) .. self:_AddBearing( ClientData.Client, TrainerWeapon ) .. "\n" - else - if self.TrackingToAll == true then - if ClientData.MessageToAll == "" then - ClientData.MessageToAll = "Missiles to other Players:\n" - end - ClientData.MessageToAll = ClientData.MessageToAll .. TrackingTo .. self:_AddRange( ClientData.Client, TrainerWeapon ) .. self:_AddBearing( ClientData.Client, TrainerWeapon ) .. " ( " .. TrainerTargetUnit:GetPlayerName() .. " )\n" - end - end - end - end - end - end - - -- Once the Player Client and the Other Player Client tracking messages are prepared, show them. - if ClientData.MessageToClient ~= "" or ClientData.MessageToAll ~= "" then - local Message = MESSAGE:New( ClientData.MessageToClient .. ClientData.MessageToAll, "Tracking", 1, "ID" ):ToClient( Client ) - end - end - end - - return true -end -env.info( '*** MOOSE INCLUDE END *** ' ) +env.info("Loaded MOOSE Include Engine")env.info( '*** MOOSE INCLUDE END *** ' ) diff --git a/Moose Mission Setup/Moose.lua b/Moose Mission Setup/Moose.lua index 07c019def..dc9f9f58b 100644 --- a/Moose Mission Setup/Moose.lua +++ b/Moose Mission Setup/Moose.lua @@ -1,5 +1,6 @@ -env.info( '*** MOOSE STATIC INCLUDE START *** ' ) -env.info( 'Moose Generation Timestamp: 20160602_1448' ) +env.info( '*** MOOSE DYNAMIC INCLUDE START *** ' ) +env.info( 'Moose Generation Timestamp: 20160604_1716' ) + local base = _G env.info("Loading MOOSE " .. base.timer.getAbsTime() ) @@ -11,9 +12,27 @@ Include.Path = function() end Include.File = function( IncludeFile ) + if not Include.Files[ IncludeFile ] then + Include.Files[IncludeFile] = IncludeFile + env.info( "Include:" .. IncludeFile .. " from " .. Include.ProgramPath ) + local f = assert( base.loadfile( Include.ProgramPath .. IncludeFile .. ".lua" ) ) + if f == nil then + env.info( "Include:" .. IncludeFile .. " from " .. Include.MissionPath ) + local f = assert( base.loadfile( Include.MissionPath .. IncludeFile .. ".lua" ) ) + if f == nil then + error ("Could not load MOOSE file " .. IncludeFile .. ".lua" ) + else + env.info( "Include:" .. IncludeFile .. " loaded from " .. Include.MissionPath ) + return f() + end + else + env.info( "Include:" .. IncludeFile .. " loaded from " .. Include.ProgramPath ) + return f() + end + end end -Include.ProgramPath = "Scripts/Moose/Moose/" +Include.ProgramPath = "Scripts/Moose/" Include.MissionPath = Include.Path() env.info( "Include.ProgramPath = " .. Include.ProgramPath) @@ -23,17311 +42,4 @@ Include.Files = {} Include.File( "Moose" ) -env.info("Loaded MOOSE Include Engine") ---- Various routines --- @module routines --- @author Flightcontrol - ---Include.File( "Trace" ) ---Include.File( "Message" ) - - -env.setErrorMessageBoxEnabled(false) - ---- Extract of MIST functions. --- @author Grimes - -routines = {} - - --- don't change these -routines.majorVersion = 3 -routines.minorVersion = 3 -routines.build = 22 - ------------------------------------------------------------------------------------------------------------------ - ----------------------------------------------------------------------------------------------- --- Utils- conversion, Lua utils, etc. -routines.utils = {} - ---from http://lua-users.org/wiki/CopyTable -routines.utils.deepCopy = function(object) - local lookup_table = {} - local function _copy(object) - if type(object) ~= "table" then - return object - elseif lookup_table[object] then - return lookup_table[object] - end - local new_table = {} - lookup_table[object] = new_table - for index, value in pairs(object) do - new_table[_copy(index)] = _copy(value) - end - return setmetatable(new_table, getmetatable(object)) - end - local objectreturn = _copy(object) - return objectreturn -end - - --- porting in Slmod's serialize_slmod2 -routines.utils.oneLineSerialize = function(tbl) -- serialization of a table all on a single line, no comments, made to replace old get_table_string function - - lookup_table = {} - - local function _Serialize( tbl ) - - if type(tbl) == 'table' then --function only works for tables! - - if lookup_table[tbl] then - return lookup_table[object] - end - - local tbl_str = {} - - lookup_table[tbl] = tbl_str - - tbl_str[#tbl_str + 1] = '{' - - for ind,val in pairs(tbl) do -- serialize its fields - local ind_str = {} - if type(ind) == "number" then - ind_str[#ind_str + 1] = '[' - ind_str[#ind_str + 1] = tostring(ind) - ind_str[#ind_str + 1] = ']=' - else --must be a string - ind_str[#ind_str + 1] = '[' - ind_str[#ind_str + 1] = routines.utils.basicSerialize(ind) - ind_str[#ind_str + 1] = ']=' - end - - local val_str = {} - if ((type(val) == 'number') or (type(val) == 'boolean')) then - val_str[#val_str + 1] = tostring(val) - val_str[#val_str + 1] = ',' - tbl_str[#tbl_str + 1] = table.concat(ind_str) - tbl_str[#tbl_str + 1] = table.concat(val_str) - elseif type(val) == 'string' then - val_str[#val_str + 1] = routines.utils.basicSerialize(val) - val_str[#val_str + 1] = ',' - tbl_str[#tbl_str + 1] = table.concat(ind_str) - tbl_str[#tbl_str + 1] = table.concat(val_str) - elseif type(val) == 'nil' then -- won't ever happen, right? - val_str[#val_str + 1] = 'nil,' - tbl_str[#tbl_str + 1] = table.concat(ind_str) - tbl_str[#tbl_str + 1] = table.concat(val_str) - elseif type(val) == 'table' then - if ind == "__index" then - -- tbl_str[#tbl_str + 1] = "__index" - -- tbl_str[#tbl_str + 1] = ',' --I think this is right, I just added it - else - - val_str[#val_str + 1] = _Serialize(val) - val_str[#val_str + 1] = ',' --I think this is right, I just added it - tbl_str[#tbl_str + 1] = table.concat(ind_str) - tbl_str[#tbl_str + 1] = table.concat(val_str) - end - elseif type(val) == 'function' then - -- tbl_str[#tbl_str + 1] = "function " .. tostring(ind) - -- tbl_str[#tbl_str + 1] = ',' --I think this is right, I just added it - else --- env.info('unable to serialize value type ' .. routines.utils.basicSerialize(type(val)) .. ' at index ' .. tostring(ind)) --- env.info( debug.traceback() ) - end - - end - tbl_str[#tbl_str + 1] = '}' - return table.concat(tbl_str) - else - return tostring(tbl) - end - end - - local objectreturn = _Serialize(tbl) - return objectreturn -end - ---porting in Slmod's "safestring" basic serialize -routines.utils.basicSerialize = function(s) - if s == nil then - return "\"\"" - else - if ((type(s) == 'number') or (type(s) == 'boolean') or (type(s) == 'function') or (type(s) == 'table') or (type(s) == 'userdata') ) then - return tostring(s) - elseif type(s) == 'string' then - s = string.format('%q', s) - return s - end - end -end - - -routines.utils.toDegree = function(angle) - return angle*180/math.pi -end - -routines.utils.toRadian = function(angle) - return angle*math.pi/180 -end - -routines.utils.metersToNM = function(meters) - return meters/1852 -end - -routines.utils.metersToFeet = function(meters) - return meters/0.3048 -end - -routines.utils.NMToMeters = function(NM) - return NM*1852 -end - -routines.utils.feetToMeters = function(feet) - return feet*0.3048 -end - -routines.utils.mpsToKnots = function(mps) - return mps*3600/1852 -end - -routines.utils.mpsToKmph = function(mps) - return mps*3.6 -end - -routines.utils.knotsToMps = function(knots) - return knots*1852/3600 -end - -routines.utils.kmphToMps = function(kmph) - return kmph/3.6 -end - -function routines.utils.makeVec2(Vec3) - if Vec3.z then - return {x = Vec3.x, y = Vec3.z} - else - return {x = Vec3.x, y = Vec3.y} -- it was actually already vec2. - end -end - -function routines.utils.makeVec3(Vec2, y) - if not Vec2.z then - if not y then - y = 0 - end - return {x = Vec2.x, y = y, z = Vec2.y} - else - return {x = Vec2.x, y = Vec2.y, z = Vec2.z} -- it was already Vec3, actually. - end -end - -function routines.utils.makeVec3GL(Vec2, offset) - local adj = offset or 0 - - if not Vec2.z then - return {x = Vec2.x, y = (land.getHeight(Vec2) + adj), z = Vec2.y} - else - return {x = Vec2.x, y = (land.getHeight({x = Vec2.x, y = Vec2.z}) + adj), z = Vec2.z} - end -end - -routines.utils.zoneToVec3 = function(zone) - local new = {} - if type(zone) == 'table' and zone.point then - new.x = zone.point.x - new.y = zone.point.y - new.z = zone.point.z - return new - elseif type(zone) == 'string' then - zone = trigger.misc.getZone(zone) - if zone then - new.x = zone.point.x - new.y = zone.point.y - new.z = zone.point.z - return new - end - end -end - --- gets heading-error corrected direction from point along vector vec. -function routines.utils.getDir(vec, point) - local dir = math.atan2(vec.z, vec.x) - dir = dir + routines.getNorthCorrection(point) - if dir < 0 then - dir = dir + 2*math.pi -- put dir in range of 0 to 2*pi - end - return dir -end - --- gets distance in meters between two points (2 dimensional) -function routines.utils.get2DDist(point1, point2) - point1 = routines.utils.makeVec3(point1) - point2 = routines.utils.makeVec3(point2) - return routines.vec.mag({x = point1.x - point2.x, y = 0, z = point1.z - point2.z}) -end - --- gets distance in meters between two points (3 dimensional) -function routines.utils.get3DDist(point1, point2) - return routines.vec.mag({x = point1.x - point2.x, y = point1.y - point2.y, z = point1.z - point2.z}) -end - - - --- From http://lua-users.org/wiki/SimpleRound --- use negative idp for rounding ahead of decimal place, positive for rounding after decimal place -routines.utils.round = function(num, idp) - local mult = 10^(idp or 0) - return math.floor(num * mult + 0.5) / mult -end - --- porting in Slmod's dostring -routines.utils.dostring = function(s) - local f, err = loadstring(s) - if f then - return true, f() - else - return false, err - end -end - - ---3D Vector manipulation -routines.vec = {} - -routines.vec.add = function(vec1, vec2) - return {x = vec1.x + vec2.x, y = vec1.y + vec2.y, z = vec1.z + vec2.z} -end - -routines.vec.sub = function(vec1, vec2) - return {x = vec1.x - vec2.x, y = vec1.y - vec2.y, z = vec1.z - vec2.z} -end - -routines.vec.scalarMult = function(vec, mult) - return {x = vec.x*mult, y = vec.y*mult, z = vec.z*mult} -end - -routines.vec.scalar_mult = routines.vec.scalarMult - -routines.vec.dp = function(vec1, vec2) - return vec1.x*vec2.x + vec1.y*vec2.y + vec1.z*vec2.z -end - -routines.vec.cp = function(vec1, vec2) - return { x = vec1.y*vec2.z - vec1.z*vec2.y, y = vec1.z*vec2.x - vec1.x*vec2.z, z = vec1.x*vec2.y - vec1.y*vec2.x} -end - -routines.vec.mag = function(vec) - return (vec.x^2 + vec.y^2 + vec.z^2)^0.5 -end - -routines.vec.getUnitVec = function(vec) - local mag = routines.vec.mag(vec) - return { x = vec.x/mag, y = vec.y/mag, z = vec.z/mag } -end - -routines.vec.rotateVec2 = function(vec2, theta) - return { x = vec2.x*math.cos(theta) - vec2.y*math.sin(theta), y = vec2.x*math.sin(theta) + vec2.y*math.cos(theta)} -end ---------------------------------------------------------------------------------------------------------------------------- - - - - --- acc- the accuracy of each easting/northing. 0, 1, 2, 3, 4, or 5. -routines.tostringMGRS = function(MGRS, acc) - if acc == 0 then - return MGRS.UTMZone .. ' ' .. MGRS.MGRSDigraph - else - return MGRS.UTMZone .. ' ' .. MGRS.MGRSDigraph .. ' ' .. string.format('%0' .. acc .. 'd', routines.utils.round(MGRS.Easting/(10^(5-acc)), 0)) - .. ' ' .. string.format('%0' .. acc .. 'd', routines.utils.round(MGRS.Northing/(10^(5-acc)), 0)) - end -end - ---[[acc: -in DM: decimal point of minutes. -In DMS: decimal point of seconds. -position after the decimal of the least significant digit: -So: -42.32 - acc of 2. -]] -routines.tostringLL = function(lat, lon, acc, DMS) - - local latHemi, lonHemi - if lat > 0 then - latHemi = 'N' - else - latHemi = 'S' - end - - if lon > 0 then - lonHemi = 'E' - else - lonHemi = 'W' - end - - lat = math.abs(lat) - lon = math.abs(lon) - - local latDeg = math.floor(lat) - local latMin = (lat - latDeg)*60 - - local lonDeg = math.floor(lon) - local lonMin = (lon - lonDeg)*60 - - if DMS then -- degrees, minutes, and seconds. - local oldLatMin = latMin - latMin = math.floor(latMin) - local latSec = routines.utils.round((oldLatMin - latMin)*60, acc) - - local oldLonMin = lonMin - lonMin = math.floor(lonMin) - local lonSec = routines.utils.round((oldLonMin - lonMin)*60, acc) - - if latSec == 60 then - latSec = 0 - latMin = latMin + 1 - end - - if lonSec == 60 then - lonSec = 0 - lonMin = lonMin + 1 - end - - local secFrmtStr -- create the formatting string for the seconds place - if acc <= 0 then -- no decimal place. - secFrmtStr = '%02d' - else - local width = 3 + acc -- 01.310 - that's a width of 6, for example. - secFrmtStr = '%0' .. width .. '.' .. acc .. 'f' - end - - return string.format('%02d', latDeg) .. ' ' .. string.format('%02d', latMin) .. '\' ' .. string.format(secFrmtStr, latSec) .. '"' .. latHemi .. ' ' - .. string.format('%02d', lonDeg) .. ' ' .. string.format('%02d', lonMin) .. '\' ' .. string.format(secFrmtStr, lonSec) .. '"' .. lonHemi - - else -- degrees, decimal minutes. - latMin = routines.utils.round(latMin, acc) - lonMin = routines.utils.round(lonMin, acc) - - if latMin == 60 then - latMin = 0 - latDeg = latDeg + 1 - end - - if lonMin == 60 then - lonMin = 0 - lonDeg = lonDeg + 1 - end - - local minFrmtStr -- create the formatting string for the minutes place - if acc <= 0 then -- no decimal place. - minFrmtStr = '%02d' - else - local width = 3 + acc -- 01.310 - that's a width of 6, for example. - minFrmtStr = '%0' .. width .. '.' .. acc .. 'f' - end - - return string.format('%02d', latDeg) .. ' ' .. string.format(minFrmtStr, latMin) .. '\'' .. latHemi .. ' ' - .. string.format('%02d', lonDeg) .. ' ' .. string.format(minFrmtStr, lonMin) .. '\'' .. lonHemi - - end -end - ---[[ required: az - radian - required: dist - meters - optional: alt - meters (set to false or nil if you don't want to use it). - optional: metric - set true to get dist and alt in km and m. - precision will always be nearest degree and NM or km.]] -routines.tostringBR = function(az, dist, alt, metric) - az = routines.utils.round(routines.utils.toDegree(az), 0) - - if metric then - dist = routines.utils.round(dist/1000, 2) - else - dist = routines.utils.round(routines.utils.metersToNM(dist), 2) - end - - local s = string.format('%03d', az) .. ' for ' .. dist - - if alt then - if metric then - s = s .. ' at ' .. routines.utils.round(alt, 0) - else - s = s .. ' at ' .. routines.utils.round(routines.utils.metersToFeet(alt), 0) - end - end - return s -end - -routines.getNorthCorrection = function(point) --gets the correction needed for true north - if not point.z then --Vec2; convert to Vec3 - point.z = point.y - point.y = 0 - end - local lat, lon = coord.LOtoLL(point) - local north_posit = coord.LLtoLO(lat + 1, lon) - return math.atan2(north_posit.z - point.z, north_posit.x - point.x) -end - - --- the main area -do - -- THE MAIN FUNCTION -- Accessed 100 times/sec. - routines.main = function() - timer.scheduleFunction(routines.main, {}, timer.getTime() + 2) --reschedule first in case of Lua error - ---------------------------------------------------------------------------------------------------------- - --area to add new stuff in - - routines.do_scheduled_functions() - end -- end of routines.main - - timer.scheduleFunction(routines.main, {}, timer.getTime() + 2) - -end - - -do - local idNum = 0 - - --Simplified event handler - routines.addEventHandler = function(f) --id is optional! - local handler = {} - idNum = idNum + 1 - handler.id = idNum - handler.f = f - handler.onEvent = function(self, event) - self.f(event) - end - world.addEventHandler(handler) - end - - routines.removeEventHandler = function(id) - for key, handler in pairs(world.eventHandlers) do - if handler.id and handler.id == id then - world.eventHandlers[key] = nil - return true - end - end - return false - end -end - --- need to return a Vec3 or Vec2? -function routines.getRandPointInCircle(point, radius, innerRadius) - local theta = 2*math.pi*math.random() - local rad = math.random() + math.random() - if rad > 1 then - rad = 2 - rad - end - - local radMult - if innerRadius and innerRadius <= radius then - radMult = (radius - innerRadius)*rad + innerRadius - else - radMult = radius*rad - end - - if not point.z then --might as well work with vec2/3 - point.z = point.y - end - - local rndCoord - if radius > 0 then - rndCoord = {x = math.cos(theta)*radMult + point.x, y = math.sin(theta)*radMult + point.z} - else - rndCoord = {x = point.x, y = point.z} - end - return rndCoord -end - -routines.goRoute = function(group, path) - local misTask = { - id = 'Mission', - params = { - route = { - points = routines.utils.deepCopy(path), - }, - }, - } - if type(group) == 'string' then - group = Group.getByName(group) - end - local groupCon = group:getController() - if groupCon then - groupCon:setTask(misTask) - return true - end - - Controller.setTask(groupCon, misTask) - return false -end - - --- Useful atomic functions from mist, ported. - -routines.ground = {} -routines.fixedWing = {} -routines.heli = {} - -routines.ground.buildWP = function(point, overRideForm, overRideSpeed) - - local wp = {} - wp.x = point.x - - if point.z then - wp.y = point.z - else - wp.y = point.y - end - local form, speed - - if point.speed and not overRideSpeed then - wp.speed = point.speed - elseif type(overRideSpeed) == 'number' then - wp.speed = overRideSpeed - else - wp.speed = routines.utils.kmphToMps(20) - end - - if point.form and not overRideForm then - form = point.form - else - form = overRideForm - end - - if not form then - wp.action = 'Cone' - else - form = string.lower(form) - if form == 'off_road' or form == 'off road' then - wp.action = 'Off Road' - elseif form == 'on_road' or form == 'on road' then - wp.action = 'On Road' - elseif form == 'rank' or form == 'line_abrest' or form == 'line abrest' or form == 'lineabrest'then - wp.action = 'Rank' - elseif form == 'cone' then - wp.action = 'Cone' - elseif form == 'diamond' then - wp.action = 'Diamond' - elseif form == 'vee' then - wp.action = 'Vee' - elseif form == 'echelon_left' or form == 'echelon left' or form == 'echelonl' then - wp.action = 'EchelonL' - elseif form == 'echelon_right' or form == 'echelon right' or form == 'echelonr' then - wp.action = 'EchelonR' - else - wp.action = 'Cone' -- if nothing matched - end - end - - wp.type = 'Turning Point' - - return wp - -end - -routines.fixedWing.buildWP = function(point, WPtype, speed, alt, altType) - - local wp = {} - wp.x = point.x - - if point.z then - wp.y = point.z - else - wp.y = point.y - end - - if alt and type(alt) == 'number' then - wp.alt = alt - else - wp.alt = 2000 - end - - if altType then - altType = string.lower(altType) - if altType == 'radio' or 'agl' then - wp.alt_type = 'RADIO' - elseif altType == 'baro' or 'asl' then - wp.alt_type = 'BARO' - end - else - wp.alt_type = 'RADIO' - end - - if point.speed then - speed = point.speed - end - - if point.type then - WPtype = point.type - end - - if not speed then - wp.speed = routines.utils.kmphToMps(500) - else - wp.speed = speed - end - - if not WPtype then - wp.action = 'Turning Point' - else - WPtype = string.lower(WPtype) - if WPtype == 'flyover' or WPtype == 'fly over' or WPtype == 'fly_over' then - wp.action = 'Fly Over Point' - elseif WPtype == 'turningpoint' or WPtype == 'turning point' or WPtype == 'turning_point' then - wp.action = 'Turning Point' - else - wp.action = 'Turning Point' - end - end - - wp.type = 'Turning Point' - return wp -end - -routines.heli.buildWP = function(point, WPtype, speed, alt, altType) - - local wp = {} - wp.x = point.x - - if point.z then - wp.y = point.z - else - wp.y = point.y - end - - if alt and type(alt) == 'number' then - wp.alt = alt - else - wp.alt = 500 - end - - if altType then - altType = string.lower(altType) - if altType == 'radio' or 'agl' then - wp.alt_type = 'RADIO' - elseif altType == 'baro' or 'asl' then - wp.alt_type = 'BARO' - end - else - wp.alt_type = 'RADIO' - end - - if point.speed then - speed = point.speed - end - - if point.type then - WPtype = point.type - end - - if not speed then - wp.speed = routines.utils.kmphToMps(200) - else - wp.speed = speed - end - - if not WPtype then - wp.action = 'Turning Point' - else - WPtype = string.lower(WPtype) - if WPtype == 'flyover' or WPtype == 'fly over' or WPtype == 'fly_over' then - wp.action = 'Fly Over Point' - elseif WPtype == 'turningpoint' or WPtype == 'turning point' or WPtype == 'turning_point' then - wp.action = 'Turning Point' - else - wp.action = 'Turning Point' - end - end - - wp.type = 'Turning Point' - return wp -end - -routines.groupToRandomPoint = function(vars) - local group = vars.group --Required - local point = vars.point --required - local radius = vars.radius or 0 - local innerRadius = vars.innerRadius - local form = vars.form or 'Cone' - local heading = vars.heading or math.random()*2*math.pi - local headingDegrees = vars.headingDegrees - local speed = vars.speed or routines.utils.kmphToMps(20) - - - local useRoads - if not vars.disableRoads then - useRoads = true - else - useRoads = false - end - - local path = {} - - if headingDegrees then - heading = headingDegrees*math.pi/180 - end - - if heading >= 2*math.pi then - heading = heading - 2*math.pi - end - - local rndCoord = routines.getRandPointInCircle(point, radius, innerRadius) - - local offset = {} - local posStart = routines.getLeadPos(group) - - offset.x = routines.utils.round(math.sin(heading - (math.pi/2)) * 50 + rndCoord.x, 3) - offset.z = routines.utils.round(math.cos(heading + (math.pi/2)) * 50 + rndCoord.y, 3) - path[#path + 1] = routines.ground.buildWP(posStart, form, speed) - - - if useRoads == true and ((point.x - posStart.x)^2 + (point.z - posStart.z)^2)^0.5 > radius * 1.3 then - path[#path + 1] = routines.ground.buildWP({['x'] = posStart.x + 11, ['z'] = posStart.z + 11}, 'off_road', speed) - path[#path + 1] = routines.ground.buildWP(posStart, 'on_road', speed) - path[#path + 1] = routines.ground.buildWP(offset, 'on_road', speed) - else - path[#path + 1] = routines.ground.buildWP({['x'] = posStart.x + 25, ['z'] = posStart.z + 25}, form, speed) - end - - path[#path + 1] = routines.ground.buildWP(offset, form, speed) - path[#path + 1] = routines.ground.buildWP(rndCoord, form, speed) - - routines.goRoute(group, path) - - return -end - -routines.groupRandomDistSelf = function(gpData, dist, form, heading, speed) - local pos = routines.getLeadPos(gpData) - local fakeZone = {} - fakeZone.radius = dist or math.random(300, 1000) - fakeZone.point = {x = pos.x, y, pos.y, z = pos.z} - routines.groupToRandomZone(gpData, fakeZone, form, heading, speed) - - return -end - -routines.groupToRandomZone = function(gpData, zone, form, heading, speed) - if type(gpData) == 'string' then - gpData = Group.getByName(gpData) - end - - if type(zone) == 'string' then - zone = trigger.misc.getZone(zone) - elseif type(zone) == 'table' and not zone.radius then - zone = trigger.misc.getZone(zone[math.random(1, #zone)]) - end - - if speed then - speed = routines.utils.kmphToMps(speed) - end - - local vars = {} - vars.group = gpData - vars.radius = zone.radius - vars.form = form - vars.headingDegrees = heading - vars.speed = speed - vars.point = routines.utils.zoneToVec3(zone) - - routines.groupToRandomPoint(vars) - - return -end - -routines.isTerrainValid = function(coord, terrainTypes) -- vec2/3 and enum or table of acceptable terrain types - if coord.z then - coord.y = coord.z - end - local typeConverted = {} - - if type(terrainTypes) == 'string' then -- if its a string it does this check - for constId, constData in pairs(land.SurfaceType) do - if string.lower(constId) == string.lower(terrainTypes) or string.lower(constData) == string.lower(terrainTypes) then - table.insert(typeConverted, constId) - end - end - elseif type(terrainTypes) == 'table' then -- if its a table it does this check - for typeId, typeData in pairs(terrainTypes) do - for constId, constData in pairs(land.SurfaceType) do - if string.lower(constId) == string.lower(typeData) or string.lower(constData) == string.lower(typeId) then - table.insert(typeConverted, constId) - end - end - end - end - for validIndex, validData in pairs(typeConverted) do - if land.getSurfaceType(coord) == land.SurfaceType[validData] then - return true - end - end - return false -end - -routines.groupToPoint = function(gpData, point, form, heading, speed, useRoads) - if type(point) == 'string' then - point = trigger.misc.getZone(point) - end - if speed then - speed = routines.utils.kmphToMps(speed) - end - - local vars = {} - vars.group = gpData - vars.form = form - vars.headingDegrees = heading - vars.speed = speed - vars.disableRoads = useRoads - vars.point = routines.utils.zoneToVec3(point) - routines.groupToRandomPoint(vars) - - return -end - - -routines.getLeadPos = function(group) - if type(group) == 'string' then -- group name - group = Group.getByName(group) - end - - local units = group:getUnits() - - local leader = units[1] - if not leader then -- SHOULD be good, but if there is a bug, this code future-proofs it then. - local lowestInd = math.huge - for ind, unit in pairs(units) do - if ind < lowestInd then - lowestInd = ind - leader = unit - end - end - end - if leader and Unit.isExist(leader) then -- maybe a little too paranoid now... - return leader:getPosition().p - end -end - ---[[ vars for routines.getMGRSString: -vars.units - table of unit names (NOT unitNameTable- maybe this should change). -vars.acc - integer between 0 and 5, inclusive -]] -routines.getMGRSString = function(vars) - local units = vars.units - local acc = vars.acc or 5 - local avgPos = routines.getAvgPos(units) - if avgPos then - return routines.tostringMGRS(coord.LLtoMGRS(coord.LOtoLL(avgPos)), acc) - end -end - ---[[ vars for routines.getLLString -vars.units - table of unit names (NOT unitNameTable- maybe this should change). -vars.acc - integer, number of numbers after decimal place -vars.DMS - if true, output in degrees, minutes, seconds. Otherwise, output in degrees, minutes. - - -]] -routines.getLLString = function(vars) - local units = vars.units - local acc = vars.acc or 3 - local DMS = vars.DMS - local avgPos = routines.getAvgPos(units) - if avgPos then - local lat, lon = coord.LOtoLL(avgPos) - return routines.tostringLL(lat, lon, acc, DMS) - end -end - ---[[ -vars.zone - table of a zone name. -vars.ref - vec3 ref point, maybe overload for vec2 as well? -vars.alt - boolean, if used, includes altitude in string -vars.metric - boolean, gives distance in km instead of NM. -]] -routines.getBRStringZone = function(vars) - local zone = trigger.misc.getZone( vars.zone ) - local ref = routines.utils.makeVec3(vars.ref, 0) -- turn it into Vec3 if it is not already. - local alt = vars.alt - local metric = vars.metric - if zone then - local vec = {x = zone.point.x - ref.x, y = zone.point.y - ref.y, z = zone.point.z - ref.z} - local dir = routines.utils.getDir(vec, ref) - local dist = routines.utils.get2DDist(zone.point, ref) - if alt then - alt = zone.y - end - return routines.tostringBR(dir, dist, alt, metric) - else - env.info( 'routines.getBRStringZone: error: zone is nil' ) - end -end - ---[[ -vars.units- table of unit names (NOT unitNameTable- maybe this should change). -vars.ref - vec3 ref point, maybe overload for vec2 as well? -vars.alt - boolean, if used, includes altitude in string -vars.metric - boolean, gives distance in km instead of NM. -]] -routines.getBRString = function(vars) - local units = vars.units - local ref = routines.utils.makeVec3(vars.ref, 0) -- turn it into Vec3 if it is not already. - local alt = vars.alt - local metric = vars.metric - local avgPos = routines.getAvgPos(units) - if avgPos then - local vec = {x = avgPos.x - ref.x, y = avgPos.y - ref.y, z = avgPos.z - ref.z} - local dir = routines.utils.getDir(vec, ref) - local dist = routines.utils.get2DDist(avgPos, ref) - if alt then - alt = avgPos.y - end - return routines.tostringBR(dir, dist, alt, metric) - end -end - - --- Returns the Vec3 coordinates of the average position of the concentration of units most in the heading direction. ---[[ vars for routines.getLeadingPos: -vars.units - table of unit names -vars.heading - direction -vars.radius - number -vars.headingDegrees - boolean, switches heading to degrees -]] -routines.getLeadingPos = function(vars) - local units = vars.units - local heading = vars.heading - local radius = vars.radius - if vars.headingDegrees then - heading = routines.utils.toRadian(vars.headingDegrees) - end - - local unitPosTbl = {} - for i = 1, #units do - local unit = Unit.getByName(units[i]) - if unit and unit:isExist() then - unitPosTbl[#unitPosTbl + 1] = unit:getPosition().p - end - end - if #unitPosTbl > 0 then -- one more more units found. - -- first, find the unit most in the heading direction - local maxPos = -math.huge - - local maxPosInd -- maxPos - the furthest in direction defined by heading; maxPosInd = - for i = 1, #unitPosTbl do - local rotatedVec2 = routines.vec.rotateVec2(routines.utils.makeVec2(unitPosTbl[i]), heading) - if (not maxPos) or maxPos < rotatedVec2.x then - maxPos = rotatedVec2.x - maxPosInd = i - end - end - - --now, get all the units around this unit... - local avgPos - if radius then - local maxUnitPos = unitPosTbl[maxPosInd] - local avgx, avgy, avgz, totNum = 0, 0, 0, 0 - for i = 1, #unitPosTbl do - if routines.utils.get2DDist(maxUnitPos, unitPosTbl[i]) <= radius then - avgx = avgx + unitPosTbl[i].x - avgy = avgy + unitPosTbl[i].y - avgz = avgz + unitPosTbl[i].z - totNum = totNum + 1 - end - end - avgPos = { x = avgx/totNum, y = avgy/totNum, z = avgz/totNum} - else - avgPos = unitPosTbl[maxPosInd] - end - - return avgPos - end -end - - ---[[ vars for routines.getLeadingMGRSString: -vars.units - table of unit names -vars.heading - direction -vars.radius - number -vars.headingDegrees - boolean, switches heading to degrees -vars.acc - number, 0 to 5. -]] -routines.getLeadingMGRSString = function(vars) - local pos = routines.getLeadingPos(vars) - if pos then - local acc = vars.acc or 5 - return routines.tostringMGRS(coord.LLtoMGRS(coord.LOtoLL(pos)), acc) - end -end - ---[[ vars for routines.getLeadingLLString: -vars.units - table of unit names -vars.heading - direction, number -vars.radius - number -vars.headingDegrees - boolean, switches heading to degrees -vars.acc - number of digits after decimal point (can be negative) -vars.DMS - boolean, true if you want DMS. -]] -routines.getLeadingLLString = function(vars) - local pos = routines.getLeadingPos(vars) - if pos then - local acc = vars.acc or 3 - local DMS = vars.DMS - local lat, lon = coord.LOtoLL(pos) - return routines.tostringLL(lat, lon, acc, DMS) - end -end - - - ---[[ vars for routines.getLeadingBRString: -vars.units - table of unit names -vars.heading - direction, number -vars.radius - number -vars.headingDegrees - boolean, switches heading to degrees -vars.metric - boolean, if true, use km instead of NM. -vars.alt - boolean, if true, include altitude. -vars.ref - vec3/vec2 reference point. -]] -routines.getLeadingBRString = function(vars) - local pos = routines.getLeadingPos(vars) - if pos then - local ref = vars.ref - local alt = vars.alt - local metric = vars.metric - - local vec = {x = pos.x - ref.x, y = pos.y - ref.y, z = pos.z - ref.z} - local dir = routines.utils.getDir(vec, ref) - local dist = routines.utils.get2DDist(pos, ref) - if alt then - alt = pos.y - end - return routines.tostringBR(dir, dist, alt, metric) - end -end - ---[[ vars for routines.message.add - vars.text = 'Hello World' - vars.displayTime = 20 - vars.msgFor = {coa = {'red'}, countries = {'Ukraine', 'Georgia'}, unitTypes = {'A-10C'}} - -]] - ---[[ vars for routines.msgMGRS -vars.units - table of unit names (NOT unitNameTable- maybe this should change). -vars.acc - integer between 0 and 5, inclusive -vars.text - text in the message -vars.displayTime - self explanatory -vars.msgFor - scope -]] -routines.msgMGRS = function(vars) - local units = vars.units - local acc = vars.acc - local text = vars.text - local displayTime = vars.displayTime - local msgFor = vars.msgFor - - local s = routines.getMGRSString{units = units, acc = acc} - local newText - if string.find(text, '%%s') then -- look for %s - newText = string.format(text, s) -- insert the coordinates into the message - else -- else, just append to the end. - newText = text .. s - end - - routines.message.add{ - text = newText, - displayTime = displayTime, - msgFor = msgFor - } -end - ---[[ vars for routines.msgLL -vars.units - table of unit names (NOT unitNameTable- maybe this should change) (Yes). -vars.acc - integer, number of numbers after decimal place -vars.DMS - if true, output in degrees, minutes, seconds. Otherwise, output in degrees, minutes. -vars.text - text in the message -vars.displayTime - self explanatory -vars.msgFor - scope -]] -routines.msgLL = function(vars) - local units = vars.units -- technically, I don't really need to do this, but it helps readability. - local acc = vars.acc - local DMS = vars.DMS - local text = vars.text - local displayTime = vars.displayTime - local msgFor = vars.msgFor - - local s = routines.getLLString{units = units, acc = acc, DMS = DMS} - local newText - if string.find(text, '%%s') then -- look for %s - newText = string.format(text, s) -- insert the coordinates into the message - else -- else, just append to the end. - newText = text .. s - end - - routines.message.add{ - text = newText, - displayTime = displayTime, - msgFor = msgFor - } - -end - - ---[[ -vars.units- table of unit names (NOT unitNameTable- maybe this should change). -vars.ref - vec3 ref point, maybe overload for vec2 as well? -vars.alt - boolean, if used, includes altitude in string -vars.metric - boolean, gives distance in km instead of NM. -vars.text - text of the message -vars.displayTime -vars.msgFor - scope -]] -routines.msgBR = function(vars) - local units = vars.units -- technically, I don't really need to do this, but it helps readability. - local ref = vars.ref -- vec2/vec3 will be handled in routines.getBRString - local alt = vars.alt - local metric = vars.metric - local text = vars.text - local displayTime = vars.displayTime - local msgFor = vars.msgFor - - local s = routines.getBRString{units = units, ref = ref, alt = alt, metric = metric} - local newText - if string.find(text, '%%s') then -- look for %s - newText = string.format(text, s) -- insert the coordinates into the message - else -- else, just append to the end. - newText = text .. s - end - - routines.message.add{ - text = newText, - displayTime = displayTime, - msgFor = msgFor - } - -end - - --------------------------------------------------------------------------------------------- --- basically, just sub-types of routines.msgBR... saves folks the work of getting the ref point. ---[[ -vars.units- table of unit names (NOT unitNameTable- maybe this should change). -vars.ref - string red, blue -vars.alt - boolean, if used, includes altitude in string -vars.metric - boolean, gives distance in km instead of NM. -vars.text - text of the message -vars.displayTime -vars.msgFor - scope -]] -routines.msgBullseye = function(vars) - if string.lower(vars.ref) == 'red' then - vars.ref = routines.DBs.missionData.bullseye.red - routines.msgBR(vars) - elseif string.lower(vars.ref) == 'blue' then - vars.ref = routines.DBs.missionData.bullseye.blue - routines.msgBR(vars) - end -end - ---[[ -vars.units- table of unit names (NOT unitNameTable- maybe this should change). -vars.ref - unit name of reference point -vars.alt - boolean, if used, includes altitude in string -vars.metric - boolean, gives distance in km instead of NM. -vars.text - text of the message -vars.displayTime -vars.msgFor - scope -]] - -routines.msgBRA = function(vars) - if Unit.getByName(vars.ref) then - vars.ref = Unit.getByName(vars.ref):getPosition().p - if not vars.alt then - vars.alt = true - end - routines.msgBR(vars) - end -end --------------------------------------------------------------------------------------------- - ---[[ vars for routines.msgLeadingMGRS: -vars.units - table of unit names -vars.heading - direction -vars.radius - number -vars.headingDegrees - boolean, switches heading to degrees (optional) -vars.acc - number, 0 to 5. -vars.text - text of the message -vars.displayTime -vars.msgFor - scope -]] -routines.msgLeadingMGRS = function(vars) - local units = vars.units -- technically, I don't really need to do this, but it helps readability. - local heading = vars.heading - local radius = vars.radius - local headingDegrees = vars.headingDegrees - local acc = vars.acc - local text = vars.text - local displayTime = vars.displayTime - local msgFor = vars.msgFor - - local s = routines.getLeadingMGRSString{units = units, heading = heading, radius = radius, headingDegrees = headingDegrees, acc = acc} - local newText - if string.find(text, '%%s') then -- look for %s - newText = string.format(text, s) -- insert the coordinates into the message - else -- else, just append to the end. - newText = text .. s - end - - routines.message.add{ - text = newText, - displayTime = displayTime, - msgFor = msgFor - } - - -end ---[[ vars for routines.msgLeadingLL: -vars.units - table of unit names -vars.heading - direction, number -vars.radius - number -vars.headingDegrees - boolean, switches heading to degrees (optional) -vars.acc - number of digits after decimal point (can be negative) -vars.DMS - boolean, true if you want DMS. (optional) -vars.text - text of the message -vars.displayTime -vars.msgFor - scope -]] -routines.msgLeadingLL = function(vars) - local units = vars.units -- technically, I don't really need to do this, but it helps readability. - local heading = vars.heading - local radius = vars.radius - local headingDegrees = vars.headingDegrees - local acc = vars.acc - local DMS = vars.DMS - local text = vars.text - local displayTime = vars.displayTime - local msgFor = vars.msgFor - - local s = routines.getLeadingLLString{units = units, heading = heading, radius = radius, headingDegrees = headingDegrees, acc = acc, DMS = DMS} - local newText - if string.find(text, '%%s') then -- look for %s - newText = string.format(text, s) -- insert the coordinates into the message - else -- else, just append to the end. - newText = text .. s - end - - routines.message.add{ - text = newText, - displayTime = displayTime, - msgFor = msgFor - } - -end - ---[[ -vars.units - table of unit names -vars.heading - direction, number -vars.radius - number -vars.headingDegrees - boolean, switches heading to degrees (optional) -vars.metric - boolean, if true, use km instead of NM. (optional) -vars.alt - boolean, if true, include altitude. (optional) -vars.ref - vec3/vec2 reference point. -vars.text - text of the message -vars.displayTime -vars.msgFor - scope -]] -routines.msgLeadingBR = function(vars) - local units = vars.units -- technically, I don't really need to do this, but it helps readability. - local heading = vars.heading - local radius = vars.radius - local headingDegrees = vars.headingDegrees - local metric = vars.metric - local alt = vars.alt - local ref = vars.ref -- vec2/vec3 will be handled in routines.getBRString - local text = vars.text - local displayTime = vars.displayTime - local msgFor = vars.msgFor - - local s = routines.getLeadingBRString{units = units, heading = heading, radius = radius, headingDegrees = headingDegrees, metric = metric, alt = alt, ref = ref} - local newText - if string.find(text, '%%s') then -- look for %s - newText = string.format(text, s) -- insert the coordinates into the message - else -- else, just append to the end. - newText = text .. s - end - - routines.message.add{ - text = newText, - displayTime = displayTime, - msgFor = msgFor - } -end - - -function spairs(t, order) - -- collect the keys - local keys = {} - for k in pairs(t) do keys[#keys+1] = k end - - -- if order function given, sort by it by passing the table and keys a, b, - -- otherwise just sort the keys - if order then - table.sort(keys, function(a,b) return order(t, a, b) end) - else - table.sort(keys) - end - - -- return the iterator function - local i = 0 - return function() - i = i + 1 - if keys[i] then - return keys[i], t[keys[i]] - end - end -end - - -function routines.IsPartOfGroupInZones( CargoGroup, LandingZones ) ---trace.f() - - local CurrentZoneID = nil - - if CargoGroup then - local CargoUnits = CargoGroup:getUnits() - for CargoUnitID, CargoUnit in pairs( CargoUnits ) do - if CargoUnit and CargoUnit:getLife() >= 1.0 then - CurrentZoneID = routines.IsUnitInZones( CargoUnit, LandingZones ) - if CurrentZoneID then - break - end - end - end - end - ---trace.r( "", "", { CurrentZoneID } ) - return CurrentZoneID -end - - - -function routines.IsUnitInZones( TransportUnit, LandingZones ) ---trace.f("", "routines.IsUnitInZones" ) - - local TransportZoneResult = nil - local TransportZonePos = nil - local TransportZone = nil - - -- fill-up some local variables to support further calculations to determine location of units within the zone. - if TransportUnit then - local TransportUnitPos = TransportUnit:getPosition().p - if type( LandingZones ) == "table" then - for LandingZoneID, LandingZoneName in pairs( LandingZones ) do - TransportZone = trigger.misc.getZone( LandingZoneName ) - if TransportZone then - TransportZonePos = {radius = TransportZone.radius, x = TransportZone.point.x, y = TransportZone.point.y, z = TransportZone.point.z} - if ((( TransportUnitPos.x - TransportZonePos.x)^2 + (TransportUnitPos.z - TransportZonePos.z)^2)^0.5 <= TransportZonePos.radius) then - TransportZoneResult = LandingZoneID - break - end - end - end - else - TransportZone = trigger.misc.getZone( LandingZones ) - TransportZonePos = {radius = TransportZone.radius, x = TransportZone.point.x, y = TransportZone.point.y, z = TransportZone.point.z} - if ((( TransportUnitPos.x - TransportZonePos.x)^2 + (TransportUnitPos.z - TransportZonePos.z)^2)^0.5 <= TransportZonePos.radius) then - TransportZoneResult = 1 - end - end - if TransportZoneResult then - --trace.i( "routines", "TransportZone:" .. TransportZoneResult ) - else - --trace.i( "routines", "TransportZone:nil logic" ) - end - return TransportZoneResult - else - --trace.i( "routines", "TransportZone:nil hard" ) - return nil - end -end - -function routines.IsUnitNearZonesRadius( TransportUnit, LandingZones, ZoneRadius ) ---trace.f("", "routines.IsUnitInZones" ) - - local TransportZoneResult = nil - local TransportZonePos = nil - local TransportZone = nil - - -- fill-up some local variables to support further calculations to determine location of units within the zone. - if TransportUnit then - local TransportUnitPos = TransportUnit:getPosition().p - if type( LandingZones ) == "table" then - for LandingZoneID, LandingZoneName in pairs( LandingZones ) do - TransportZone = trigger.misc.getZone( LandingZoneName ) - if TransportZone then - TransportZonePos = {radius = TransportZone.radius, x = TransportZone.point.x, y = TransportZone.point.y, z = TransportZone.point.z} - if ((( TransportUnitPos.x - TransportZonePos.x)^2 + (TransportUnitPos.z - TransportZonePos.z)^2)^0.5 <= ZoneRadius ) then - TransportZoneResult = LandingZoneID - break - end - end - end - else - TransportZone = trigger.misc.getZone( LandingZones ) - TransportZonePos = {radius = TransportZone.radius, x = TransportZone.point.x, y = TransportZone.point.y, z = TransportZone.point.z} - if ((( TransportUnitPos.x - TransportZonePos.x)^2 + (TransportUnitPos.z - TransportZonePos.z)^2)^0.5 <= ZoneRadius ) then - TransportZoneResult = 1 - end - end - if TransportZoneResult then - --trace.i( "routines", "TransportZone:" .. TransportZoneResult ) - else - --trace.i( "routines", "TransportZone:nil logic" ) - end - return TransportZoneResult - else - --trace.i( "routines", "TransportZone:nil hard" ) - return nil - end -end - - -function routines.IsStaticInZones( TransportStatic, LandingZones ) ---trace.f() - - local TransportZoneResult = nil - local TransportZonePos = nil - local TransportZone = nil - - -- fill-up some local variables to support further calculations to determine location of units within the zone. - local TransportStaticPos = TransportStatic:getPosition().p - if type( LandingZones ) == "table" then - for LandingZoneID, LandingZoneName in pairs( LandingZones ) do - TransportZone = trigger.misc.getZone( LandingZoneName ) - if TransportZone then - TransportZonePos = {radius = TransportZone.radius, x = TransportZone.point.x, y = TransportZone.point.y, z = TransportZone.point.z} - if ((( TransportStaticPos.x - TransportZonePos.x)^2 + (TransportStaticPos.z - TransportZonePos.z)^2)^0.5 <= TransportZonePos.radius) then - TransportZoneResult = LandingZoneID - break - end - end - end - else - TransportZone = trigger.misc.getZone( LandingZones ) - TransportZonePos = {radius = TransportZone.radius, x = TransportZone.point.x, y = TransportZone.point.y, z = TransportZone.point.z} - if ((( TransportStaticPos.x - TransportZonePos.x)^2 + (TransportStaticPos.z - TransportZonePos.z)^2)^0.5 <= TransportZonePos.radius) then - TransportZoneResult = 1 - end - end - ---trace.r( "", "", { TransportZoneResult } ) - return TransportZoneResult -end - - -function routines.IsUnitInRadius( CargoUnit, ReferencePosition, Radius ) ---trace.f() - - local Valid = true - - -- fill-up some local variables to support further calculations to determine location of units within the zone. - local CargoPos = CargoUnit:getPosition().p - local ReferenceP = ReferencePosition.p - - if (((CargoPos.x - ReferenceP.x)^2 + (CargoPos.z - ReferenceP.z)^2)^0.5 <= Radius) then - else - Valid = false - end - - return Valid -end - -function routines.IsPartOfGroupInRadius( CargoGroup, ReferencePosition, Radius ) ---trace.f() - - local Valid = true - - Valid = routines.ValidateGroup( CargoGroup, "CargoGroup", Valid ) - - -- fill-up some local variables to support further calculations to determine location of units within the zone - local CargoUnits = CargoGroup:getUnits() - for CargoUnitId, CargoUnit in pairs( CargoUnits ) do - local CargoUnitPos = CargoUnit:getPosition().p --- env.info( 'routines.IsPartOfGroupInRadius: CargoUnitPos.x = ' .. CargoUnitPos.x .. ' CargoUnitPos.z = ' .. CargoUnitPos.z ) - local ReferenceP = ReferencePosition.p --- env.info( 'routines.IsPartOfGroupInRadius: ReferenceGroupPos.x = ' .. ReferenceGroupPos.x .. ' ReferenceGroupPos.z = ' .. ReferenceGroupPos.z ) - - if ((( CargoUnitPos.x - ReferenceP.x)^2 + (CargoUnitPos.z - ReferenceP.z)^2)^0.5 <= Radius) then - else - Valid = false - break - end - end - - return Valid -end - - -function routines.ValidateString( Variable, VariableName, Valid ) ---trace.f() - - if type( Variable ) == "string" then - if Variable == "" then - error( "routines.ValidateString: error: " .. VariableName .. " must be filled out!" ) - Valid = false - end - else - error( "routines.ValidateString: error: " .. VariableName .. " is not a string." ) - Valid = false - end - ---trace.r( "", "", { Valid } ) - return Valid -end - -function routines.ValidateNumber( Variable, VariableName, Valid ) ---trace.f() - - if type( Variable ) == "number" then - else - error( "routines.ValidateNumber: error: " .. VariableName .. " is not a number." ) - Valid = false - end - ---trace.r( "", "", { Valid } ) - return Valid - -end - -function routines.ValidateGroup( Variable, VariableName, Valid ) ---trace.f() - - if Variable == nil then - error( "routines.ValidateGroup: error: " .. VariableName .. " is a nil value!" ) - Valid = false - end - ---trace.r( "", "", { Valid } ) - return Valid -end - -function routines.ValidateZone( LandingZones, VariableName, Valid ) ---trace.f() - - if LandingZones == nil then - error( "routines.ValidateGroup: error: " .. VariableName .. " is a nil value!" ) - Valid = false - end - - if type( LandingZones ) == "table" then - for LandingZoneID, LandingZoneName in pairs( LandingZones ) do - if trigger.misc.getZone( LandingZoneName ) == nil then - error( "routines.ValidateGroup: error: Zone " .. LandingZoneName .. " does not exist!" ) - Valid = false - break - end - end - else - if trigger.misc.getZone( LandingZones ) == nil then - error( "routines.ValidateGroup: error: Zone " .. LandingZones .. " does not exist!" ) - Valid = false - end - end - ---trace.r( "", "", { Valid } ) - return Valid -end - -function routines.ValidateEnumeration( Variable, VariableName, Enum, Valid ) ---trace.f() - - local ValidVariable = false - - for EnumId, EnumData in pairs( Enum ) do - if Variable == EnumData then - ValidVariable = true - break - end - end - - if ValidVariable then - else - error( 'TransportValidateEnum: " .. VariableName .. " is not a valid type.' .. Variable ) - Valid = false - end - ---trace.r( "", "", { Valid } ) - return Valid -end - -function routines.getGroupRoute(groupIdent, task) -- same as getGroupPoints but returns speed and formation type along with vec2 of point} - -- refactor to search by groupId and allow groupId and groupName as inputs - local gpId = groupIdent - if type(groupIdent) == 'string' and not tonumber(groupIdent) then - gpId = _DATABASE.Templates.Groups[groupIdent].groupId - end - - for coa_name, coa_data in pairs(env.mission.coalition) do - if (coa_name == 'red' or coa_name == 'blue') and type(coa_data) == 'table' then - if coa_data.country then --there is a country table - for cntry_id, cntry_data in pairs(coa_data.country) do - for obj_type_name, obj_type_data in pairs(cntry_data) do - if obj_type_name == "helicopter" or obj_type_name == "ship" or obj_type_name == "plane" or obj_type_name == "vehicle" then -- only these types have points - if ((type(obj_type_data) == 'table') and obj_type_data.group and (type(obj_type_data.group) == 'table') and (#obj_type_data.group > 0)) then --there's a group! - for group_num, group_data in pairs(obj_type_data.group) do - if group_data and group_data.groupId == gpId then -- this is the group we are looking for - if group_data.route and group_data.route.points and #group_data.route.points > 0 then - local points = {} - - for point_num, point in pairs(group_data.route.points) do - local routeData = {} - if not point.point then - routeData.x = point.x - routeData.y = point.y - else - routeData.point = point.point --it's possible that the ME could move to the point = Vec2 notation. - end - routeData.form = point.action - routeData.speed = point.speed - routeData.alt = point.alt - routeData.alt_type = point.alt_type - routeData.airdromeId = point.airdromeId - routeData.helipadId = point.helipadId - routeData.type = point.type - routeData.action = point.action - if task then - routeData.task = point.task - end - points[point_num] = routeData - end - - return points - end - return - end --if group_data and group_data.name and group_data.name == 'groupname' - end --for group_num, group_data in pairs(obj_type_data.group) do - end --if ((type(obj_type_data) == 'table') and obj_type_data.group and (type(obj_type_data.group) == 'table') and (#obj_type_data.group > 0)) then - end --if obj_type_name == "helicopter" or obj_type_name == "ship" or obj_type_name == "plane" or obj_type_name == "vehicle" or obj_type_name == "static" then - end --for obj_type_name, obj_type_data in pairs(cntry_data) do - end --for cntry_id, cntry_data in pairs(coa_data.country) do - end --if coa_data.country then --there is a country table - end --if coa_name == 'red' or coa_name == 'blue' and type(coa_data) == 'table' then - end --for coa_name, coa_data in pairs(mission.coalition) do -end - -routines.ground.patrolRoute = function(vars) - - - local tempRoute = {} - local useRoute = {} - local gpData = vars.gpData - if type(gpData) == 'string' then - gpData = Group.getByName(gpData) - end - - local useGroupRoute - if not vars.useGroupRoute then - useGroupRoute = vars.gpData - else - useGroupRoute = vars.useGroupRoute - end - local routeProvided = false - if not vars.route then - if useGroupRoute then - tempRoute = routines.getGroupRoute(useGroupRoute) - end - else - useRoute = vars.route - local posStart = routines.getLeadPos(gpData) - useRoute[1] = routines.ground.buildWP(posStart, useRoute[1].action, useRoute[1].speed) - routeProvided = true - end - - - local overRideSpeed = vars.speed or 'default' - local pType = vars.pType - local offRoadForm = vars.offRoadForm or 'default' - local onRoadForm = vars.onRoadForm or 'default' - - if routeProvided == false and #tempRoute > 0 then - local posStart = routines.getLeadPos(gpData) - - - useRoute[#useRoute + 1] = routines.ground.buildWP(posStart, offRoadForm, overRideSpeed) - for i = 1, #tempRoute do - local tempForm = tempRoute[i].action - local tempSpeed = tempRoute[i].speed - - if offRoadForm == 'default' then - tempForm = tempRoute[i].action - end - if onRoadForm == 'default' then - onRoadForm = 'On Road' - end - if (string.lower(tempRoute[i].action) == 'on road' or string.lower(tempRoute[i].action) == 'onroad' or string.lower(tempRoute[i].action) == 'on_road') then - tempForm = onRoadForm - else - tempForm = offRoadForm - end - - if type(overRideSpeed) == 'number' then - tempSpeed = overRideSpeed - end - - - useRoute[#useRoute + 1] = routines.ground.buildWP(tempRoute[i], tempForm, tempSpeed) - end - - if pType and string.lower(pType) == 'doubleback' then - local curRoute = routines.utils.deepCopy(useRoute) - for i = #curRoute, 2, -1 do - useRoute[#useRoute + 1] = routines.ground.buildWP(curRoute[i], curRoute[i].action, curRoute[i].speed) - end - end - - useRoute[1].action = useRoute[#useRoute].action -- make it so the first WP matches the last WP - end - - local cTask3 = {} - local newPatrol = {} - newPatrol.route = useRoute - newPatrol.gpData = gpData:getName() - cTask3[#cTask3 + 1] = 'routines.ground.patrolRoute(' - cTask3[#cTask3 + 1] = routines.utils.oneLineSerialize(newPatrol) - cTask3[#cTask3 + 1] = ')' - cTask3 = table.concat(cTask3) - local tempTask = { - id = 'WrappedAction', - params = { - action = { - id = 'Script', - params = { - command = cTask3, - - }, - }, - }, - } - - - useRoute[#useRoute].task = tempTask - routines.goRoute(gpData, useRoute) - - return -end - -routines.ground.patrol = function(gpData, pType, form, speed) - local vars = {} - - if type(gpData) == 'table' and gpData:getName() then - gpData = gpData:getName() - end - - vars.useGroupRoute = gpData - vars.gpData = gpData - vars.pType = pType - vars.offRoadForm = form - vars.speed = speed - - routines.ground.patrolRoute(vars) - - return -end - -function routines.GetUnitHeight( CheckUnit ) ---trace.f( "routines" ) - - local UnitPoint = CheckUnit:getPoint() - local UnitPosition = { x = UnitPoint.x, y = UnitPoint.z } - local UnitHeight = UnitPoint.y - - local LandHeight = land.getHeight( UnitPosition ) - - --env.info(( 'CarrierHeight: LandHeight = ' .. LandHeight .. ' CarrierHeight = ' .. CarrierHeight )) - - --trace.f( "routines", "Unit Height = " .. UnitHeight - LandHeight ) - - return UnitHeight - LandHeight - -end - - - -Su34Status = { status = {} } -boardMsgRed = { statusMsg = "" } -boardMsgAll = { timeMsg = "" } -SpawnSettings = {} -Su34MenuPath = {} -Su34Menus = 0 - - -function Su34AttackCarlVinson(groupName) ---trace.menu("", "Su34AttackCarlVinson") - local groupSu34 = Group.getByName( groupName ) - local controllerSu34 = groupSu34.getController(groupSu34) - local groupCarlVinson = Group.getByName("US Carl Vinson #001") - controllerSu34.setOption( controllerSu34, AI.Option.Air.id.ROE, AI.Option.Air.val.ROE.OPEN_FIRE ) - controllerSu34.setOption( controllerSu34, AI.Option.Air.id.REACTION_ON_THREAT, AI.Option.Air.val.REACTION_ON_THREAT.EVADE_FIRE ) - if groupCarlVinson ~= nil then - controllerSu34.pushTask(controllerSu34,{id = 'AttackGroup', params = { groupId = groupCarlVinson:getID(), expend = AI.Task.WeaponExpend.ALL, attackQtyLimit = true}}) - end - Su34Status.status[groupName] = 1 - MessageToRed( string.format('%s: ',groupName) .. 'Attacking carrier Carl Vinson. ', 10, 'RedStatus' .. groupName ) -end - -function Su34AttackWest(groupName) ---trace.f("","Su34AttackWest") - local groupSu34 = Group.getByName( groupName ) - local controllerSu34 = groupSu34.getController(groupSu34) - local groupShipWest1 = Group.getByName("US Ship West #001") - local groupShipWest2 = Group.getByName("US Ship West #002") - controllerSu34.setOption( controllerSu34, AI.Option.Air.id.ROE, AI.Option.Air.val.ROE.OPEN_FIRE ) - controllerSu34.setOption( controllerSu34, AI.Option.Air.id.REACTION_ON_THREAT, AI.Option.Air.val.REACTION_ON_THREAT.EVADE_FIRE ) - if groupShipWest1 ~= nil then - controllerSu34.pushTask(controllerSu34,{id = 'AttackGroup', params = { groupId = groupShipWest1:getID(), expend = AI.Task.WeaponExpend.ALL, attackQtyLimit = true}}) - end - if groupShipWest2 ~= nil then - controllerSu34.pushTask(controllerSu34,{id = 'AttackGroup', params = { groupId = groupShipWest2:getID(), expend = AI.Task.WeaponExpend.ALL, attackQtyLimit = true}}) - end - Su34Status.status[groupName] = 2 - MessageToRed( string.format('%s: ',groupName) .. 'Attacking invading ships in the west. ', 10, 'RedStatus' .. groupName ) -end - -function Su34AttackNorth(groupName) ---trace.menu("","Su34AttackNorth") - local groupSu34 = Group.getByName( groupName ) - local controllerSu34 = groupSu34.getController(groupSu34) - local groupShipNorth1 = Group.getByName("US Ship North #001") - local groupShipNorth2 = Group.getByName("US Ship North #002") - local groupShipNorth3 = Group.getByName("US Ship North #003") - controllerSu34.setOption( controllerSu34, AI.Option.Air.id.ROE, AI.Option.Air.val.ROE.OPEN_FIRE ) - controllerSu34.setOption( controllerSu34, AI.Option.Air.id.REACTION_ON_THREAT, AI.Option.Air.val.REACTION_ON_THREAT.EVADE_FIRE ) - if groupShipNorth1 ~= nil then - controllerSu34.pushTask(controllerSu34,{id = 'AttackGroup', params = { groupId = groupShipNorth1:getID(), expend = AI.Task.WeaponExpend.ALL, attackQtyLimit = false}}) - end - if groupShipNorth2 ~= nil then - controllerSu34.pushTask(controllerSu34,{id = 'AttackGroup', params = { groupId = groupShipNorth2:getID(), expend = AI.Task.WeaponExpend.ALL, attackQtyLimit = false}}) - end - if groupShipNorth3 ~= nil then - controllerSu34.pushTask(controllerSu34,{id = 'AttackGroup', params = { groupId = groupShipNorth3:getID(), expend = AI.Task.WeaponExpend.ALL, attackQtyLimit = false}}) - end - Su34Status.status[groupName] = 3 - MessageToRed( string.format('%s: ',groupName) .. 'Attacking invading ships in the north. ', 10, 'RedStatus' .. groupName ) -end - -function Su34Orbit(groupName) ---trace.menu("","Su34Orbit") - local groupSu34 = Group.getByName( groupName ) - local controllerSu34 = groupSu34:getController() - controllerSu34.setOption( controllerSu34, AI.Option.Air.id.ROE, AI.Option.Air.val.ROE.WEAPON_HOLD ) - controllerSu34.setOption( controllerSu34, AI.Option.Air.id.REACTION_ON_THREAT, AI.Option.Air.val.REACTION_ON_THREAT.EVADE_FIRE ) - controllerSu34:pushTask( {id = 'ControlledTask', params = { task = { id = 'Orbit', params = { pattern = AI.Task.OrbitPattern.RACE_TRACK } }, stopCondition = { duration = 600 } } } ) - Su34Status.status[groupName] = 4 - MessageToRed( string.format('%s: ',groupName) .. 'In orbit and awaiting further instructions. ', 10, 'RedStatus' .. groupName ) -end - -function Su34TakeOff(groupName) ---trace.menu("","Su34TakeOff") - local groupSu34 = Group.getByName( groupName ) - local controllerSu34 = groupSu34:getController() - controllerSu34.setOption( controllerSu34, AI.Option.Air.id.ROE, AI.Option.Air.val.ROE.WEAPON_HOLD ) - controllerSu34.setOption( controllerSu34, AI.Option.Air.id.REACTION_ON_THREAT, AI.Option.Air.val.REACTION_ON_THREAT.BYPASS_AND_ESCAPE ) - Su34Status.status[groupName] = 8 - MessageToRed( string.format('%s: ',groupName) .. 'Take-Off. ', 10, 'RedStatus' .. groupName ) -end - -function Su34Hold(groupName) ---trace.menu("","Su34Hold") - local groupSu34 = Group.getByName( groupName ) - local controllerSu34 = groupSu34:getController() - controllerSu34.setOption( controllerSu34, AI.Option.Air.id.ROE, AI.Option.Air.val.ROE.WEAPON_HOLD ) - controllerSu34.setOption( controllerSu34, AI.Option.Air.id.REACTION_ON_THREAT, AI.Option.Air.val.REACTION_ON_THREAT.BYPASS_AND_ESCAPE ) - Su34Status.status[groupName] = 5 - MessageToRed( string.format('%s: ',groupName) .. 'Holding Weapons. ', 10, 'RedStatus' .. groupName ) -end - -function Su34RTB(groupName) ---trace.menu("","Su34RTB") - Su34Status.status[groupName] = 6 - MessageToRed( string.format('%s: ',groupName) .. 'Return to Krasnodar. ', 10, 'RedStatus' .. groupName ) -end - -function Su34Destroyed(groupName) ---trace.menu("","Su34Destroyed") - Su34Status.status[groupName] = 7 - MessageToRed( string.format('%s: ',groupName) .. 'Destroyed. ', 30, 'RedStatus' .. groupName ) -end - -function GroupAlive( groupName ) ---trace.menu("","GroupAlive") - local groupTest = Group.getByName( groupName ) - - local groupExists = false - - if groupTest then - groupExists = groupTest:isExist() - end - - --trace.r( "", "", { groupExists } ) - return groupExists -end - -function Su34IsDead() ---trace.f() - -end - -function Su34OverviewStatus() ---trace.menu("","Su34OverviewStatus") - local msg = "" - local currentStatus = 0 - local Exists = false - - for groupName, currentStatus in pairs(Su34Status.status) do - - env.info(('Su34 Overview Status: GroupName = ' .. groupName )) - Alive = GroupAlive( groupName ) - - if Alive then - if currentStatus == 1 then - msg = msg .. string.format("%s: ",groupName) - msg = msg .. "Attacking carrier Carl Vinson. " - elseif currentStatus == 2 then - msg = msg .. string.format("%s: ",groupName) - msg = msg .. "Attacking supporting ships in the west. " - elseif currentStatus == 3 then - msg = msg .. string.format("%s: ",groupName) - msg = msg .. "Attacking invading ships in the north. " - elseif currentStatus == 4 then - msg = msg .. string.format("%s: ",groupName) - msg = msg .. "In orbit and awaiting further instructions. " - elseif currentStatus == 5 then - msg = msg .. string.format("%s: ",groupName) - msg = msg .. "Holding Weapons. " - elseif currentStatus == 6 then - msg = msg .. string.format("%s: ",groupName) - msg = msg .. "Return to Krasnodar. " - elseif currentStatus == 7 then - msg = msg .. string.format("%s: ",groupName) - msg = msg .. "Destroyed. " - elseif currentStatus == 8 then - msg = msg .. string.format("%s: ",groupName) - msg = msg .. "Take-Off. " - end - else - if currentStatus == 7 then - msg = msg .. string.format("%s: ",groupName) - msg = msg .. "Destroyed. " - else - Su34Destroyed(groupName) - end - end - end - - boardMsgRed.statusMsg = msg -end - - -function UpdateBoardMsg() ---trace.f() - Su34OverviewStatus() - MessageToRed( boardMsgRed.statusMsg, 15, 'RedStatus' ) -end - -function MusicReset( flg ) ---trace.f() - trigger.action.setUserFlag(95,flg) -end - -function PlaneActivate(groupNameFormat, flg) ---trace.f() - local groupName = groupNameFormat .. string.format("#%03d", trigger.misc.getUserFlag(flg)) - --trigger.action.outText(groupName,10) - trigger.action.activateGroup(Group.getByName(groupName)) -end - -function Su34Menu(groupName) ---trace.f() - - --env.info(( 'Su34Menu(' .. groupName .. ')' )) - local groupSu34 = Group.getByName( groupName ) - - if Su34Status.status[groupName] == 1 or - Su34Status.status[groupName] == 2 or - Su34Status.status[groupName] == 3 or - Su34Status.status[groupName] == 4 or - Su34Status.status[groupName] == 5 then - if Su34MenuPath[groupName] == nil then - if planeMenuPath == nil then - planeMenuPath = missionCommands.addSubMenuForCoalition( - coalition.side.RED, - "SU-34 anti-ship flights", - nil - ) - end - Su34MenuPath[groupName] = missionCommands.addSubMenuForCoalition( - coalition.side.RED, - "Flight " .. groupName, - planeMenuPath - ) - - missionCommands.addCommandForCoalition( - coalition.side.RED, - "Attack carrier Carl Vinson", - Su34MenuPath[groupName], - Su34AttackCarlVinson, - groupName - ) - - missionCommands.addCommandForCoalition( - coalition.side.RED, - "Attack ships in the west", - Su34MenuPath[groupName], - Su34AttackWest, - groupName - ) - - missionCommands.addCommandForCoalition( - coalition.side.RED, - "Attack ships in the north", - Su34MenuPath[groupName], - Su34AttackNorth, - groupName - ) - - missionCommands.addCommandForCoalition( - coalition.side.RED, - "Hold position and await instructions", - Su34MenuPath[groupName], - Su34Orbit, - groupName - ) - - missionCommands.addCommandForCoalition( - coalition.side.RED, - "Report status", - Su34MenuPath[groupName], - Su34OverviewStatus - ) - end - else - if Su34MenuPath[groupName] then - missionCommands.removeItemForCoalition(coalition.side.RED, Su34MenuPath[groupName]) - end - end -end - ---- Obsolete function, but kept to rework in framework. - -function ChooseInfantry ( TeleportPrefixTable, TeleportMax ) ---trace.f("Spawn") - --env.info(( 'ChooseInfantry: ' )) - - TeleportPrefixTableCount = #TeleportPrefixTable - TeleportPrefixTableIndex = math.random( 1, TeleportPrefixTableCount ) - - --env.info(( 'ChooseInfantry: TeleportPrefixTableIndex = ' .. TeleportPrefixTableIndex .. ' TeleportPrefixTableCount = ' .. TeleportPrefixTableCount .. ' TeleportMax = ' .. TeleportMax )) - - local TeleportFound = false - local TeleportLoop = true - local Index = TeleportPrefixTableIndex - local TeleportPrefix = '' - - while TeleportLoop do - TeleportPrefix = TeleportPrefixTable[Index] - if SpawnSettings[TeleportPrefix] then - if SpawnSettings[TeleportPrefix]['SpawnCount'] - 1 < TeleportMax then - SpawnSettings[TeleportPrefix]['SpawnCount'] = SpawnSettings[TeleportPrefix]['SpawnCount'] + 1 - TeleportFound = true - else - TeleportFound = false - end - else - SpawnSettings[TeleportPrefix] = {} - SpawnSettings[TeleportPrefix]['SpawnCount'] = 0 - TeleportFound = true - end - if TeleportFound then - TeleportLoop = false - else - if Index < TeleportPrefixTableCount then - Index = Index + 1 - else - TeleportLoop = false - end - end - --env.info(( 'ChooseInfantry: Loop 1 - TeleportPrefix = ' .. TeleportPrefix .. ' Index = ' .. Index )) - end - - if TeleportFound == false then - TeleportLoop = true - Index = 1 - while TeleportLoop do - TeleportPrefix = TeleportPrefixTable[Index] - if SpawnSettings[TeleportPrefix] then - if SpawnSettings[TeleportPrefix]['SpawnCount'] - 1 < TeleportMax then - SpawnSettings[TeleportPrefix]['SpawnCount'] = SpawnSettings[TeleportPrefix]['SpawnCount'] + 1 - TeleportFound = true - else - TeleportFound = false - end - else - SpawnSettings[TeleportPrefix] = {} - SpawnSettings[TeleportPrefix]['SpawnCount'] = 0 - TeleportFound = true - end - if TeleportFound then - TeleportLoop = false - else - if Index < TeleportPrefixTableIndex then - Index = Index + 1 - else - TeleportLoop = false - end - end - --env.info(( 'ChooseInfantry: Loop 2 - TeleportPrefix = ' .. TeleportPrefix .. ' Index = ' .. Index )) - end - end - - local TeleportGroupName = '' - if TeleportFound == true then - TeleportGroupName = TeleportPrefix .. string.format("#%03d", SpawnSettings[TeleportPrefix]['SpawnCount'] ) - else - TeleportGroupName = '' - end - - --env.info(('ChooseInfantry: TeleportGroupName = ' .. TeleportGroupName )) - --env.info(('ChooseInfantry: return')) - - return TeleportGroupName -end - -SpawnedInfantry = 0 - -function LandCarrier ( CarrierGroup, LandingZonePrefix ) ---trace.f() - --env.info(( 'LandCarrier: ' )) - --env.info(( 'LandCarrier: CarrierGroup = ' .. CarrierGroup:getName() )) - --env.info(( 'LandCarrier: LandingZone = ' .. LandingZonePrefix )) - - local controllerGroup = CarrierGroup:getController() - - local LandingZone = trigger.misc.getZone(LandingZonePrefix) - local LandingZonePos = {} - LandingZonePos.x = LandingZone.point.x + math.random(LandingZone.radius * -1, LandingZone.radius) - LandingZonePos.y = LandingZone.point.z + math.random(LandingZone.radius * -1, LandingZone.radius) - - controllerGroup:pushTask( { id = 'Land', params = { point = LandingZonePos, durationFlag = true, duration = 10 } } ) - - --env.info(( 'LandCarrier: end' )) -end - -EscortCount = 0 -function EscortCarrier ( CarrierGroup, EscortPrefix, EscortLastWayPoint, EscortEngagementDistanceMax, EscortTargetTypes ) ---trace.f() - --env.info(( 'EscortCarrier: ' )) - --env.info(( 'EscortCarrier: CarrierGroup = ' .. CarrierGroup:getName() )) - --env.info(( 'EscortCarrier: EscortPrefix = ' .. EscortPrefix )) - - local CarrierName = CarrierGroup:getName() - - local EscortMission = {} - local CarrierMission = {} - - local EscortMission = SpawnMissionGroup( EscortPrefix ) - local CarrierMission = SpawnMissionGroup( CarrierGroup:getName() ) - - if EscortMission ~= nil and CarrierMission ~= nil then - - EscortCount = EscortCount + 1 - EscortMissionName = string.format( EscortPrefix .. '#Escort %s', CarrierName ) - EscortMission.name = EscortMissionName - EscortMission.groupId = nil - EscortMission.lateActivation = false - EscortMission.taskSelected = false - - local EscortUnits = #EscortMission.units - for u = 1, EscortUnits do - EscortMission.units[u].name = string.format( EscortPrefix .. '#Escort %s %02d', CarrierName, u ) - EscortMission.units[u].unitId = nil - end - - - EscortMission.route.points[1].task = { id = "ComboTask", - params = - { - tasks = - { - [1] = - { - enabled = true, - auto = false, - id = "Escort", - number = 1, - params = - { - lastWptIndexFlagChangedManually = false, - groupId = CarrierGroup:getID(), - lastWptIndex = nil, - lastWptIndexFlag = false, - engagementDistMax = EscortEngagementDistanceMax, - targetTypes = EscortTargetTypes, - pos = - { - y = 20, - x = 20, - z = 0, - } -- end of ["pos"] - } -- end of ["params"] - } -- end of [1] - } -- end of ["tasks"] - } -- end of ["params"] - } -- end of ["task"] - - SpawnGroupAdd( EscortPrefix, EscortMission ) - - end -end - -function SendMessageToCarrier( CarrierGroup, CarrierMessage ) ---trace.f() - - if CarrierGroup ~= nil then - MessageToGroup( CarrierGroup, CarrierMessage, 30, 'Carrier/' .. CarrierGroup:getName() ) - end - -end - -function MessageToGroup( MsgGroup, MsgText, MsgTime, MsgName ) ---trace.f() - - if type(MsgGroup) == 'string' then - --env.info( 'MessageToGroup: Converted MsgGroup string "' .. MsgGroup .. '" into a Group structure.' ) - MsgGroup = Group.getByName( MsgGroup ) - end - - if MsgGroup ~= nil then - local MsgTable = {} - MsgTable.text = MsgText - MsgTable.displayTime = MsgTime - MsgTable.msgFor = { units = { MsgGroup:getUnits()[1]:getName() } } - MsgTable.name = MsgName - --routines.message.add( MsgTable ) - --env.info(('MessageToGroup: Message sent to ' .. MsgGroup:getUnits()[1]:getName() .. ' -> ' .. MsgText )) - end -end - -function MessageToUnit( UnitName, MsgText, MsgTime, MsgName ) ---trace.f() - - if UnitName ~= nil then - local MsgTable = {} - MsgTable.text = MsgText - MsgTable.displayTime = MsgTime - MsgTable.msgFor = { units = { UnitName } } - MsgTable.name = MsgName - --routines.message.add( MsgTable ) - end -end - -function MessageToAll( MsgText, MsgTime, MsgName ) ---trace.f() - - MESSAGE:New( MsgText, "Message", MsgTime, MsgName ):ToCoalition( coalition.side.RED ):ToCoalition( coalition.side.BLUE ) -end - -function MessageToRed( MsgText, MsgTime, MsgName ) ---trace.f() - - MESSAGE:New( MsgText, "To Red Coalition", MsgTime, MsgName ):ToCoalition( coalition.side.RED ) -end - -function MessageToBlue( MsgText, MsgTime, MsgName ) ---trace.f() - - MESSAGE:New( MsgText, "To Blue Coalition", MsgTime, MsgName ):ToCoalition( coalition.side.RED ) -end - -function getCarrierHeight( CarrierGroup ) ---trace.f() - - if CarrierGroup ~= nil then - if table.getn(CarrierGroup:getUnits()) == 1 then - local CarrierUnit = CarrierGroup:getUnits()[1] - local CurrentPoint = CarrierUnit:getPoint() - - local CurrentPosition = { x = CurrentPoint.x, y = CurrentPoint.z } - local CarrierHeight = CurrentPoint.y - - local LandHeight = land.getHeight( CurrentPosition ) - - --env.info(( 'CarrierHeight: LandHeight = ' .. LandHeight .. ' CarrierHeight = ' .. CarrierHeight )) - - return CarrierHeight - LandHeight - else - return 999999 - end - else - return 999999 - end - -end - -function GetUnitHeight( CheckUnit ) ---trace.f() - - local UnitPoint = CheckUnit:getPoint() - local UnitPosition = { x = CurrentPoint.x, y = CurrentPoint.z } - local UnitHeight = CurrentPoint.y - - local LandHeight = land.getHeight( CurrentPosition ) - - --env.info(( 'CarrierHeight: LandHeight = ' .. LandHeight .. ' CarrierHeight = ' .. CarrierHeight )) - - return UnitHeight - LandHeight - -end - - -_MusicTable = {} -_MusicTable.Files = {} -_MusicTable.Queue = {} -_MusicTable.FileCnt = 0 - - -function MusicRegister( SndRef, SndFile, SndTime ) ---trace.f() - - env.info(( 'MusicRegister: SndRef = ' .. SndRef )) - env.info(( 'MusicRegister: SndFile = ' .. SndFile )) - env.info(( 'MusicRegister: SndTime = ' .. SndTime )) - - - _MusicTable.FileCnt = _MusicTable.FileCnt + 1 - - _MusicTable.Files[_MusicTable.FileCnt] = {} - _MusicTable.Files[_MusicTable.FileCnt].Ref = SndRef - _MusicTable.Files[_MusicTable.FileCnt].File = SndFile - _MusicTable.Files[_MusicTable.FileCnt].Time = SndTime - - if not _MusicTable.Function then - _MusicTable.Function = routines.scheduleFunction( MusicScheduler, { }, timer.getTime() + 10, 10) - end - -end - -function MusicToPlayer( SndRef, PlayerName, SndContinue ) ---trace.f() - - --env.info(( 'MusicToPlayer: SndRef = ' .. SndRef )) - - local PlayerUnits = AlivePlayerUnits() - for PlayerUnitIdx, PlayerUnit in pairs(PlayerUnits) do - local PlayerUnitName = PlayerUnit:getPlayerName() - --env.info(( 'MusicToPlayer: PlayerUnitName = ' .. PlayerUnitName )) - if PlayerName == PlayerUnitName then - PlayerGroup = PlayerUnit:getGroup() - if PlayerGroup then - --env.info(( 'MusicToPlayer: PlayerGroup = ' .. PlayerGroup:getName() )) - MusicToGroup( SndRef, PlayerGroup, SndContinue ) - end - break - end - end - - --env.info(( 'MusicToPlayer: end' )) - -end - -function MusicToGroup( SndRef, SndGroup, SndContinue ) ---trace.f() - - --env.info(( 'MusicToGroup: SndRef = ' .. SndRef )) - - if SndGroup ~= nil then - if _MusicTable and _MusicTable.FileCnt > 0 then - if SndGroup:isExist() then - if MusicCanStart(SndGroup:getUnit(1):getPlayerName()) then - --env.info(( 'MusicToGroup: OK for Sound.' )) - local SndIdx = 0 - if SndRef == '' then - --env.info(( 'MusicToGroup: SndRef as empty. Queueing at random.' )) - SndIdx = math.random( 1, _MusicTable.FileCnt ) - else - for SndIdx = 1, _MusicTable.FileCnt do - if _MusicTable.Files[SndIdx].Ref == SndRef then - break - end - end - end - --env.info(( 'MusicToGroup: SndIdx = ' .. SndIdx )) - --env.info(( 'MusicToGroup: Queueing Music ' .. _MusicTable.Files[SndIdx].File .. ' for Group ' .. SndGroup:getID() )) - trigger.action.outSoundForGroup( SndGroup:getID(), _MusicTable.Files[SndIdx].File ) - MessageToGroup( SndGroup, 'Playing ' .. _MusicTable.Files[SndIdx].File, 15, 'Music-' .. SndGroup:getUnit(1):getPlayerName() ) - - local SndQueueRef = SndGroup:getUnit(1):getPlayerName() - if _MusicTable.Queue[SndQueueRef] == nil then - _MusicTable.Queue[SndQueueRef] = {} - end - _MusicTable.Queue[SndQueueRef].Start = timer.getTime() - _MusicTable.Queue[SndQueueRef].PlayerName = SndGroup:getUnit(1):getPlayerName() - _MusicTable.Queue[SndQueueRef].Group = SndGroup - _MusicTable.Queue[SndQueueRef].ID = SndGroup:getID() - _MusicTable.Queue[SndQueueRef].Ref = SndIdx - _MusicTable.Queue[SndQueueRef].Continue = SndContinue - _MusicTable.Queue[SndQueueRef].Type = Group - end - end - end - end -end - -function MusicCanStart(PlayerName) ---trace.f() - - --env.info(( 'MusicCanStart:' )) - - local MusicOut = false - - if _MusicTable['Queue'] ~= nil and _MusicTable.FileCnt > 0 then - --env.info(( 'MusicCanStart: PlayerName = ' .. PlayerName )) - local PlayerFound = false - local MusicStart = 0 - local MusicTime = 0 - for SndQueueIdx, SndQueue in pairs( _MusicTable.Queue ) do - if SndQueue.PlayerName == PlayerName then - PlayerFound = true - MusicStart = SndQueue.Start - MusicTime = _MusicTable.Files[SndQueue.Ref].Time - break - end - end - if PlayerFound then - --env.info(( 'MusicCanStart: MusicStart = ' .. MusicStart )) - --env.info(( 'MusicCanStart: MusicTime = ' .. MusicTime )) - --env.info(( 'MusicCanStart: timer.getTime() = ' .. timer.getTime() )) - - if MusicStart + MusicTime <= timer.getTime() then - MusicOut = true - end - else - MusicOut = true - end - end - - if MusicOut then - --env.info(( 'MusicCanStart: true' )) - else - --env.info(( 'MusicCanStart: false' )) - end - - return MusicOut -end - -function MusicScheduler() ---trace.scheduled("", "MusicScheduler") - - --env.info(( 'MusicScheduler:' )) - if _MusicTable['Queue'] ~= nil and _MusicTable.FileCnt > 0 then - --env.info(( 'MusicScheduler: Walking Sound Queue.')) - for SndQueueIdx, SndQueue in pairs( _MusicTable.Queue ) do - if SndQueue.Continue then - if MusicCanStart(SndQueue.PlayerName) then - --env.info(('MusicScheduler: MusicToGroup')) - MusicToPlayer( '', SndQueue.PlayerName, true ) - end - end - end - end - -end - - -env.info(( 'Init: Scripts Loaded v1.1' )) - ---- BASE classes. --- --- @{#BASE} class --- ============== --- The @{#BASE} class is the super class for most of the classes defined within MOOSE. --- --- It handles: --- --- * The construction and inheritance of child classes. --- * The tracing of objects during mission execution within the DCS.log file (under saved games folder). --- --- Note: Normally you would not use the BASE class unless you are extending the MOOSE framework with new classes. --- --- BASE Trace functionality --- ======================== --- The BASE class contains trace methods to trace progress within a mission execution of a certain object. --- Note that these trace methods are inherited by each MOOSE class interiting BASE. --- As such, each object created from derived class from BASE can use the tracing functions to trace its execution. --- --- Trace a function call --- --------------------- --- There are basically 3 types of tracing methods available within BASE: --- --- * @{#BASE.F}: Trace the beginning of a function and its given parameters. --- * @{#BASE.T}: Trace further logic within a function giving optional variables or parameters. --- * @{#BASE.E}: Trace an execption within a function giving optional variables or parameters. An exception will always be traced. --- --- Tracing levels --- -------------- --- There are 3 tracing levels within MOOSE. --- These tracing levels were defined to avoid bulks of tracing to be generated by lots of objects. --- --- As such, the F and T methods have additional variants to trace level 2 and 3 respectively: --- --- * @{#BASE.F2}: Trace the beginning of a function and its given parameters with tracing level 2. --- * @{#BASE.F3}: Trace the beginning of a function and its given parameters with tracing level 3. --- * @{#BASE.T2}: Trace further logic within a function giving optional variables or parameters with tracing level 2. --- * @{#BASE.T3}: Trace further logic within a function giving optional variables or parameters with tracing level 3. --- --- BASE Inheritance support --- ======================== --- The following methods are available to support inheritance: --- --- * @{#BASE.Inherit}: Inherits from a class. --- * @{#BASE.Inherited}: Returns the parent class from the class. --- --- Future --- ====== --- Further methods may be added to BASE whenever there is a need to make "overall" functions available within MOOSE. --- --- ==== --- --- @module Base --- @author FlightControl - -Include.File( "Routines" ) - -local _TraceOn = true -local _TraceLevel = 1 -local _TraceClass = { - --DATABASE = true, - --SEAD = true, - --DESTROYBASETASK = true, - --MOVEMENT = true, - --SPAWN = true, - --STAGE = true, - --ZONE = true, - --GROUP = true, - --UNIT = true, - --CLIENT = true, - --CARGO = true, - --CARGO_GROUP = true, - --CARGO_PACKAGE = true, - --CARGO_SLINGLOAD = true, - --CARGO_ZONE = true, - --CLEANUP = true, - --MENU_CLIENT = true, - --MENU_CLIENT_COMMAND = true, - --ESCORT = true, - } -local _TraceClassMethod = {} - ---- The BASE Class --- @type BASE --- @field ClassName The name of the class. --- @field ClassID The ID number of the class. -BASE = { - ClassName = "BASE", - ClassID = 0, - Events = {} -} - ---- The Formation Class --- @type FORMATION --- @field Cone A cone formation. -FORMATION = { - Cone = "Cone" -} - - - ---- The base constructor. This is the top top class of all classed defined within the MOOSE. --- Any new class needs to be derived from this class for proper inheritance. --- @param #BASE self --- @return #BASE The new instance of the BASE class. --- @usage --- function TASK:New() --- --- local self = BASE:Inherit( self, BASE:New() ) --- --- -- assign Task default values during construction --- self.TaskBriefing = "Task: No Task." --- self.Time = timer.getTime() --- self.ExecuteStage = _TransportExecuteStage.NONE --- --- return self --- end --- @todo need to investigate if the deepCopy is really needed... Don't think so. -function BASE:New() - local Child = routines.utils.deepCopy( self ) - local Parent = {} - setmetatable( Child, Parent ) - Child.__index = Child - self.ClassID = self.ClassID + 1 - Child.ClassID = self.ClassID - --Child.AddEvent( Child, S_EVENT_BIRTH, Child.EventBirth ) - return Child -end - ---- This is the worker method to inherit from a parent class. --- @param #BASE self --- @param Child is the Child class that inherits. --- @param #BASE Parent is the Parent class that the Child inherits from. --- @return #BASE Child -function BASE:Inherit( Child, Parent ) - local Child = routines.utils.deepCopy( Child ) - local Parent = routines.utils.deepCopy( Parent ) - if Child ~= nil then - setmetatable( Child, Parent ) - Child.__index = Child - end - --Child.ClassName = Child.ClassName .. '.' .. Child.ClassID - self:T( 'Inherited from ' .. Parent.ClassName ) - return Child -end - ---- This is the worker method to retrieve the Parent class. --- @param #BASE self --- @param #BASE Child is the Child class from which the Parent class needs to be retrieved. --- @return #BASE -function BASE:Inherited( Child ) - local Parent = getmetatable( Child ) --- env.info('Inherited class of ' .. Child.ClassName .. ' is ' .. Parent.ClassName ) - return Parent -end - ---- Get the ClassName + ClassID of the class instance. --- The ClassName + ClassID is formatted as '%s#%09d'. --- @param #BASE self --- @return #string The ClassName + ClassID of the class instance. -function BASE:GetClassNameAndID() - return string.format( '%s#%09d', self:GetClassName(), self:GetClassID() ) -end - ---- Get the ClassName of the class instance. --- @param #BASE self --- @return #string The ClassName of the class instance. -function BASE:GetClassName() - return self.ClassName -end - ---- Get the ClassID of the class instance. --- @param #BASE self --- @return #string The ClassID of the class instance. -function BASE:GetClassID() - return self.ClassID -end - ---- Set a new listener for the class. --- @param self --- @param DCSTypes#Event Event --- @param #function EventFunction --- @return #BASE -function BASE:AddEvent( Event, EventFunction ) - self:F( Event ) - - self.Events[#self.Events+1] = {} - self.Events[#self.Events].Event = Event - self.Events[#self.Events].EventFunction = EventFunction - self.Events[#self.Events].EventEnabled = false - - return self -end - ---- Returns the event dispatcher --- @param #BASE self --- @return Event#EVENT -function BASE:Event() - - return _EVENTDISPATCHER -end - - - - - ---- Enable the event listeners for the class. --- @param #BASE self --- @return #BASE -function BASE:EnableEvents() - self:F( #self.Events ) - - for EventID, Event in pairs( self.Events ) do - Event.Self = self - Event.EventEnabled = true - end - self.Events.Handler = world.addEventHandler( self ) - - return self -end - - ---- Disable the event listeners for the class. --- @param #BASE self --- @return #BASE -function BASE:DisableEvents() - self:F() - - world.removeEventHandler( self ) - for EventID, Event in pairs( self.Events ) do - Event.Self = nil - Event.EventEnabled = false - end - - return self -end - - -local BaseEventCodes = { - "S_EVENT_SHOT", - "S_EVENT_HIT", - "S_EVENT_TAKEOFF", - "S_EVENT_LAND", - "S_EVENT_CRASH", - "S_EVENT_EJECTION", - "S_EVENT_REFUELING", - "S_EVENT_DEAD", - "S_EVENT_PILOT_DEAD", - "S_EVENT_BASE_CAPTURED", - "S_EVENT_MISSION_START", - "S_EVENT_MISSION_END", - "S_EVENT_TOOK_CONTROL", - "S_EVENT_REFUELING_STOP", - "S_EVENT_BIRTH", - "S_EVENT_HUMAN_FAILURE", - "S_EVENT_ENGINE_STARTUP", - "S_EVENT_ENGINE_SHUTDOWN", - "S_EVENT_PLAYER_ENTER_UNIT", - "S_EVENT_PLAYER_LEAVE_UNIT", - "S_EVENT_PLAYER_COMMENT", - "S_EVENT_SHOOTING_START", - "S_EVENT_SHOOTING_END", - "S_EVENT_MAX", -} - ---onEvent( {[1]="S_EVENT_BIRTH",[2]={["subPlace"]=5,["time"]=0,["initiator"]={["id_"]=16884480,},["place"]={["id_"]=5000040,},["id"]=15,["IniUnitName"]="US F-15C@RAMP-Air Support Mountains#001-01",},} --- Event = { --- id = enum world.event, --- time = Time, --- initiator = Unit, --- target = Unit, --- place = Unit, --- subPlace = enum world.BirthPlace, --- weapon = Weapon --- } - ---- Creation of a Birth Event. --- @param #BASE self --- @param DCSTypes#Time EventTime The time stamp of the event. --- @param DCSObject#Object Initiator The initiating object of the event. --- @param #string IniUnitName The initiating unit name. --- @param place --- @param subplace -function BASE:CreateEventBirth( EventTime, Initiator, IniUnitName, place, subplace ) - self:F( { EventTime, Initiator, IniUnitName, place, subplace } ) - - local Event = { - id = world.event.S_EVENT_BIRTH, - time = EventTime, - initiator = Initiator, - IniUnitName = IniUnitName, - place = place, - subplace = subplace - } - - world.onEvent( Event ) -end - ---- Creation of a Crash Event. --- @param #BASE self --- @param DCSTypes#Time EventTime The time stamp of the event. --- @param DCSObject#Object Initiator The initiating object of the event. -function BASE:CreateEventCrash( EventTime, Initiator ) - self:F( { EventTime, Initiator } ) - - local Event = { - id = world.event.S_EVENT_CRASH, - time = EventTime, - initiator = Initiator, - } - - world.onEvent( Event ) -end - --- TODO: Complete DCSTypes#Event structure. ---- The main event handling function... This function captures all events generated for the class. --- @param #BASE self --- @param DCSTypes#Event event -function BASE:onEvent(event) - --self:F( { BaseEventCodes[event.id], event } ) - - if self then - for EventID, EventObject in pairs( self.Events ) do - if EventObject.EventEnabled then - --env.info( 'onEvent Table EventObject.Self = ' .. tostring(EventObject.Self) ) - --env.info( 'onEvent event.id = ' .. tostring(event.id) ) - --env.info( 'onEvent EventObject.Event = ' .. tostring(EventObject.Event) ) - if event.id == EventObject.Event then - if self == EventObject.Self then - if event.initiator and event.initiator:isExist() then - event.IniUnitName = event.initiator:getName() - end - if event.target and event.target:isExist() then - event.TgtUnitName = event.target:getName() - end - --self:T( { BaseEventCodes[event.id], event } ) - --EventObject.EventFunction( self, event ) - end - end - end - end - end -end - --- Trace section - --- Log a trace (only shown when trace is on) --- TODO: Make trace function using variable parameters. - ---- Set trace level --- @param #BASE self --- @param #number Level -function BASE:TraceLevel( Level ) - _TraceLevel = Level - self:E( "Tracing level " .. Level ) -end - ---- Set tracing for a class --- @param #BASE self --- @param #string Class -function BASE:TraceClass( Class ) - _TraceClass[Class] = true - _TraceClassMethod[Class] = {} - self:E( "Tracing class " .. Class ) -end - ---- Set tracing for a specific method of class --- @param #BASE self --- @param #string Class --- @param #string Method -function BASE:TraceClassMethod( Class, Method ) - if not _TraceClassMethod[Class] then - _TraceClassMethod[Class] = {} - _TraceClassMethod[Class].Method = {} - end - _TraceClassMethod[Class].Method[Method] = true - self:E( "Tracing method " .. Method .. " of class " .. Class ) -end - ---- Trace a function call. Must be at the beginning of the function logic. --- @param #BASE self --- @param Arguments A #table or any field. -function BASE:F( Arguments ) - - if _TraceOn and ( _TraceClass[self.ClassName] or _TraceClassMethod[self.ClassName] ) then - - local DebugInfoCurrent = debug.getinfo( 2, "nl" ) - local DebugInfoFrom = debug.getinfo( 3, "l" ) - - local Function = "function" - if DebugInfoCurrent.name then - Function = DebugInfoCurrent.name - end - - if _TraceClass[self.ClassName] or _TraceClassMethod[self.ClassName].Method[Function] then - local LineCurrent = DebugInfoCurrent.currentline - local LineFrom = 0 - if DebugInfoFrom then - LineFrom = DebugInfoFrom.currentline - end - env.info( string.format( "%6d(%6d)/%1s:%20s%05d.%s(%s)" , LineCurrent, LineFrom, "F", self.ClassName, self.ClassID, Function, routines.utils.oneLineSerialize( Arguments ) ) ) - end - end -end - ---- Trace a function call level 2. Must be at the beginning of the function logic. --- @param #BASE self --- @param Arguments A #table or any field. -function BASE:F2( Arguments ) - - if _TraceLevel >= 2 then - self:F( Arguments ) - end - -end - ---- Trace a function call level 3. Must be at the beginning of the function logic. --- @param #BASE self --- @param Arguments A #table or any field. -function BASE:F3( Arguments ) - - if _TraceLevel >= 3 then - self:F( Arguments ) - end - -end - ---- Trace a function logic. Can be anywhere within the function logic. --- @param #BASE self --- @param Arguments A #table or any field. -function BASE:T( Arguments ) - - if _TraceOn and ( _TraceClass[self.ClassName] or _TraceClassMethod[self.ClassName] ) then - - local DebugInfoCurrent = debug.getinfo( 2, "nl" ) - local DebugInfoFrom = debug.getinfo( 3, "l" ) - - local Function = "function" - if DebugInfoCurrent.name then - Function = DebugInfoCurrent.name - end - - if _TraceClass[self.ClassName] or _TraceClassMethod[self.ClassName].Method[Function] then - local LineCurrent = DebugInfoCurrent.currentline - local LineFrom = 0 - if DebugInfoFrom then - LineFrom = DebugInfoFrom.currentline - end - env.info( string.format( "%6d(%6d)/%1s:%20s%05d.%s" , LineCurrent, LineFrom, "T", self.ClassName, self.ClassID, routines.utils.oneLineSerialize( Arguments ) ) ) - end - end -end - ---- Trace a function logic level 2. Can be anywhere within the function logic. --- @param #BASE self --- @param Arguments A #table or any field. -function BASE:T2( Arguments ) - - if _TraceLevel >= 2 then - self:T( Arguments ) - end - -end - ---- Trace a function logic level 3. Can be anywhere within the function logic. --- @param #BASE self --- @param Arguments A #table or any field. -function BASE:T3( Arguments ) - - if _TraceLevel >= 3 then - self:T( Arguments ) - end - -end - ---- Log an exception which will be traced always. Can be anywhere within the function logic. --- @param #BASE self --- @param Arguments A #table or any field. -function BASE:E( Arguments ) - - local DebugInfoCurrent = debug.getinfo( 2, "nl" ) - local DebugInfoFrom = debug.getinfo( 3, "l" ) - - local Function = "function" - if DebugInfoCurrent.name then - Function = DebugInfoCurrent.name - end - - local LineCurrent = DebugInfoCurrent.currentline - local LineFrom = -1 - if DebugInfoFrom then - LineFrom = DebugInfoFrom.currentline - end - - env.info( string.format( "%6d(%6d)/%1s:%20s%05d.%s(%s)" , LineCurrent, LineFrom, "E", self.ClassName, self.ClassID, Function, routines.utils.oneLineSerialize( Arguments ) ) ) -end - - - ---- Models time events calling event handing functions. --- --- @{SCHEDULER} class --- =================== --- The @{SCHEDULER} class models time events calling given event handling functions. --- --- SCHEDULER constructor --- ===================== --- The SCHEDULER class is quite easy to use: --- --- * @{#SCHEDULER.New}: Setup a new scheduler and start it with the specified parameters. --- --- SCHEDULER timer methods --- ======================= --- The SCHEDULER can be stopped and restarted with the following methods: --- --- * @{#SCHEDULER.Start}: (Re-)Start the scheduler. --- * @{#SCHEDULER.Start}: Stop the scheduler. --- --- @module Scheduler --- @author FlightControl - -Include.File( "Routines" ) -Include.File( "Base" ) - - ---- The SCHEDULER class --- @type SCHEDULER --- @extends Base#BASE -SCHEDULER = { - ClassName = "SCHEDULER", -} - - ---- Constructor. --- @param #SCHEDULER self --- @param #table TimeEventObject Specified for which Moose object the timer is setup. If a value of nil is provided, a scheduler will be setup without an object reference. --- @param #function TimeEventFunction The event function to be called when a timer event occurs. The event function needs to accept the parameters specified in TimeEventFunctionArguments. --- @param #table TimeEventFunctionArguments Optional arguments that can be given as part of scheduler. The arguments need to be given as a table { param1, param 2, ... }. --- @param #number StartSeconds Specifies the amount of seconds that will be waited before the scheduling is started, and the event function is called. --- @param #number RepeatSecondsInterval Specifies the interval in seconds when the scheduler will call the event function. --- @param #number RandomizationFactor Specifies a randomization factor between 0 and 1 to randomize the RepeatSecondsInterval. --- @param #number StopSeconds Specifies the amount of seconds when the scheduler will be stopped. --- @return #SCHEDULER self -function SCHEDULER:New( TimeEventObject, TimeEventFunction, TimeEventFunctionArguments, StartSeconds, RepeatSecondsInterval, RandomizationFactor, StopSeconds ) - local self = BASE:Inherit( self, BASE:New() ) - self:F2( { TimeEventObject, TimeEventFunction, TimeEventFunctionArguments, StartSeconds, RepeatSecondsInterval, RandomizationFactor, StopSeconds } ) - - self.TimeEventObject = TimeEventObject - self.TimeEventFunction = TimeEventFunction - self.TimeEventFunctionArguments = TimeEventFunctionArguments - self.StartSeconds = StartSeconds - - if RepeatSecondsInterval then - self.RepeatSecondsInterval = RepeatSecondsInterval - else - self.RepeatSecondsInterval = 0 - end - - if RandomizationFactor then - self.RandomizationFactor = RandomizationFactor - else - self.RandomizationFactor = 0 - end - - if StopSeconds then - self.StopSeconds = StopSeconds - end - - self.Repeat = false - - self.StartTime = timer.getTime() - - self:Start() - - return self -end - ---- (Re-)Starts the scheduler. --- @param #SCHEDULER self --- @return #SCHEDULER self -function SCHEDULER:Start() - self:F2( self.TimeEventObject ) - - self.Repeat = true - timer.scheduleFunction( self._Scheduler, self, timer.getTime() + self.StartSeconds + .01 ) - - return self -end - ---- Stops the scheduler. --- @param #SCHEDULER self --- @return #SCHEDULER self -function SCHEDULER:Stop() - self:F2( self.TimeEventObject ) - - self.Repeat = false - - return self -end - --- Private Functions - -function SCHEDULER:_Scheduler() - self:F2( self.TimeEventFunctionArguments ) - - local ErrorHandler = function( errmsg ) - - env.info( "Error in SCHEDULER function:" .. errmsg ) - env.info( debug.traceback() ) - - return errmsg - end - - local Status, Result - if self.TimeEventObject then - Status, Result = xpcall( function() return self.TimeEventFunction( self.TimeEventObject, unpack( self.TimeEventFunctionArguments ) ) end, ErrorHandler ) - else - Status, Result = xpcall( function() return self.TimeEventFunction( unpack( self.TimeEventFunctionArguments ) ) end, ErrorHandler ) - end - - self:T( { Status, Result } ) - - if Status and Status == true and Result and Result == true then - if self.Repeat and ( not self.StopSeconds or ( self.StopSeconds and timer.getTime() <= self.StartTime + self.StopSeconds ) ) then - timer.scheduleFunction( - self._Scheduler, - self, - timer.getTime() + self.RepeatSecondsInterval + math.random( - ( self.RandomizationFactor * self.RepeatSecondsInterval / 2 ), ( self.RandomizationFactor * self.RepeatSecondsInterval / 2 ) ) + 0.01 - ) - end - end - -end - - - - - - - - ---- The EVENT class models an efficient event handling process between other classes and its units, weapons. --- @module Event --- @author FlightControl - -Include.File( "Routines" ) -Include.File( "Base" ) - ---- The EVENT structure --- @type EVENT --- @field #EVENT.Events Events -EVENT = { - ClassName = "EVENT", - ClassID = 0, -} - -local _EVENTCODES = { - "S_EVENT_SHOT", - "S_EVENT_HIT", - "S_EVENT_TAKEOFF", - "S_EVENT_LAND", - "S_EVENT_CRASH", - "S_EVENT_EJECTION", - "S_EVENT_REFUELING", - "S_EVENT_DEAD", - "S_EVENT_PILOT_DEAD", - "S_EVENT_BASE_CAPTURED", - "S_EVENT_MISSION_START", - "S_EVENT_MISSION_END", - "S_EVENT_TOOK_CONTROL", - "S_EVENT_REFUELING_STOP", - "S_EVENT_BIRTH", - "S_EVENT_HUMAN_FAILURE", - "S_EVENT_ENGINE_STARTUP", - "S_EVENT_ENGINE_SHUTDOWN", - "S_EVENT_PLAYER_ENTER_UNIT", - "S_EVENT_PLAYER_LEAVE_UNIT", - "S_EVENT_PLAYER_COMMENT", - "S_EVENT_SHOOTING_START", - "S_EVENT_SHOOTING_END", - "S_EVENT_MAX", -} - ---- The Event structure --- @type EVENTDATA --- @field id --- @field initiator --- @field target --- @field weapon --- @field IniDCSUnit --- @field IniDCSUnitName --- @field IniDCSGroup --- @field IniDCSGroupName --- @field TgtDCSUnit --- @field TgtDCSUnitName --- @field TgtDCSGroup --- @field TgtDCSGroupName --- @field Weapon --- @field WeaponName --- @field WeaponTgtDCSUnit - ---- The Events structure --- @type EVENT.Events --- @field #number IniUnit - -function EVENT:New() - local self = BASE:Inherit( self, BASE:New() ) - self:F2() - self.EventHandler = world.addEventHandler( self ) - return self -end - -function EVENT:EventText( EventID ) - - local EventText = _EVENTCODES[EventID] - - return EventText -end - - ---- Initializes the Events structure for the event --- @param #EVENT self --- @param DCSWorld#world.event EventID --- @param #string EventClass --- @return #EVENT.Events -function EVENT:Init( EventID, EventClass ) - self:F3( { _EVENTCODES[EventID], EventClass } ) - if not self.Events[EventID] then - self.Events[EventID] = {} - end - if not self.Events[EventID][EventClass] then - self.Events[EventID][EventClass] = {} - end - return self.Events[EventID][EventClass] -end - - ---- Create an OnDead event handler for a group --- @param #EVENT self --- @param #table EventTemplate --- @param #function EventFunction The function to be called when the event occurs for the unit. --- @param EventSelf The self instance of the class for which the event is. --- @param #function OnEventFunction --- @return #EVENT -function EVENT:OnEventForTemplate( EventTemplate, EventFunction, EventSelf, OnEventFunction ) - self:F2( EventTemplate.name ) - - for EventUnitID, EventUnit in pairs( EventTemplate.units ) do - OnEventFunction( self, EventUnit.name, EventFunction, EventSelf ) - end - return self -end - ---- Set a new listener for an S_EVENT_X event independent from a unit or a weapon. --- @param #EVENT self --- @param #function EventFunction The function to be called when the event occurs for the unit. --- @param Base#BASE EventSelf The self instance of the class for which the event is. --- @param EventID --- @return #EVENT -function EVENT:OnEventGeneric( EventFunction, EventSelf, EventID ) - self:F2( { EventID } ) - - local Event = self:Init( EventID, EventSelf:GetClassNameAndID() ) - Event.EventFunction = EventFunction - Event.EventSelf = EventSelf - return self -end - - ---- Set a new listener for an S_EVENT_X event --- @param #EVENT self --- @param #string EventDCSUnitName --- @param #function EventFunction The function to be called when the event occurs for the unit. --- @param Base#BASE EventSelf The self instance of the class for which the event is. --- @param EventID --- @return #EVENT -function EVENT:OnEventForUnit( EventDCSUnitName, EventFunction, EventSelf, EventID ) - self:F2( EventDCSUnitName ) - - local Event = self:Init( EventID, EventSelf:GetClassNameAndID() ) - if not Event.IniUnit then - Event.IniUnit = {} - end - Event.IniUnit[EventDCSUnitName] = {} - Event.IniUnit[EventDCSUnitName].EventFunction = EventFunction - Event.IniUnit[EventDCSUnitName].EventSelf = EventSelf - return self -end - - ---- Create an OnBirth event handler for a group --- @param #EVENT self --- @param Group#GROUP EventGroup --- @param #function EventFunction The function to be called when the event occurs for the unit. --- @param EventSelf The self instance of the class for which the event is. --- @return #EVENT -function EVENT:OnBirthForTemplate( EventTemplate, EventFunction, EventSelf ) - self:F2( EventTemplate.name ) - - self:OnEventForTemplate( EventTemplate, EventFunction, EventSelf, self.OnBirthForUnit ) - - return self -end - ---- Set a new listener for an S_EVENT_BIRTH event, and registers the unit born. --- @param #EVENT self --- @param #function EventFunction The function to be called when the event occurs for the unit. --- @param Base#BASE EventSelf --- @return #EVENT -function EVENT:OnBirth( EventFunction, EventSelf ) - self:F2() - - self:OnEventGeneric( EventFunction, EventSelf, world.event.S_EVENT_BIRTH ) - - return self -end - ---- Set a new listener for an S_EVENT_BIRTH event. --- @param #EVENT self --- @param #string EventDCSUnitName The id of the unit for the event to be handled. --- @param #function EventFunction The function to be called when the event occurs for the unit. --- @param Base#BASE EventSelf --- @return #EVENT -function EVENT:OnBirthForUnit( EventDCSUnitName, EventFunction, EventSelf ) - self:F2( EventDCSUnitName ) - - self:OnEventForUnit( EventDCSUnitName, EventFunction, EventSelf, world.event.S_EVENT_BIRTH ) - - return self -end - ---- Create an OnCrash event handler for a group --- @param #EVENT self --- @param Group#GROUP EventGroup --- @param #function EventFunction The function to be called when the event occurs for the unit. --- @param EventSelf The self instance of the class for which the event is. --- @return #EVENT -function EVENT:OnCrashForTemplate( EventTemplate, EventFunction, EventSelf ) - self:F2( EventTemplate.name ) - - self:OnEventForTemplate( EventTemplate, EventFunction, EventSelf, self.OnCrashForUnit ) - - return self -end - ---- Set a new listener for an S_EVENT_CRASH event. --- @param #EVENT self --- @param #function EventFunction The function to be called when the event occurs for the unit. --- @param Base#BASE EventSelf --- @return #EVENT -function EVENT:OnCrash( EventFunction, EventSelf ) - self:F2() - - self:OnEventGeneric( EventFunction, EventSelf, world.event.S_EVENT_CRASH ) - - return self -end - ---- Set a new listener for an S_EVENT_CRASH event. --- @param #EVENT self --- @param #string EventDCSUnitName --- @param #function EventFunction The function to be called when the event occurs for the unit. --- @param Base#BASE EventSelf The self instance of the class for which the event is. --- @return #EVENT -function EVENT:OnCrashForUnit( EventDCSUnitName, EventFunction, EventSelf ) - self:F2( EventDCSUnitName ) - - self:OnEventForUnit( EventDCSUnitName, EventFunction, EventSelf, world.event.S_EVENT_CRASH ) - - return self -end - ---- Create an OnDead event handler for a group --- @param #EVENT self --- @param Group#GROUP EventGroup --- @param #function EventFunction The function to be called when the event occurs for the unit. --- @param EventSelf The self instance of the class for which the event is. --- @return #EVENT -function EVENT:OnDeadForTemplate( EventTemplate, EventFunction, EventSelf ) - self:F2( EventTemplate.name ) - - self:OnEventForTemplate( EventTemplate, EventFunction, EventSelf, self.OnDeadForUnit ) - - return self -end - ---- Set a new listener for an S_EVENT_DEAD event. --- @param #EVENT self --- @param #function EventFunction The function to be called when the event occurs for the unit. --- @param Base#BASE EventSelf --- @return #EVENT -function EVENT:OnDead( EventFunction, EventSelf ) - self:F2() - - self:OnEventGeneric( EventFunction, EventSelf, world.event.S_EVENT_DEAD ) - - return self -end - - ---- Set a new listener for an S_EVENT_DEAD event. --- @param #EVENT self --- @param #string EventDCSUnitName --- @param #function EventFunction The function to be called when the event occurs for the unit. --- @param Base#BASE EventSelf The self instance of the class for which the event is. --- @return #EVENT -function EVENT:OnDeadForUnit( EventDCSUnitName, EventFunction, EventSelf ) - self:F2( EventDCSUnitName ) - - self:OnEventForUnit( EventDCSUnitName, EventFunction, EventSelf, world.event.S_EVENT_DEAD ) - - return self -end - ---- Set a new listener for an S_EVENT_PILOT_DEAD event. --- @param #EVENT self --- @param #string EventDCSUnitName --- @param #function EventFunction The function to be called when the event occurs for the unit. --- @param Base#BASE EventSelf The self instance of the class for which the event is. --- @return #EVENT -function EVENT:OnPilotDeadForUnit( EventDCSUnitName, EventFunction, EventSelf ) - self:F2( EventDCSUnitName ) - - self:OnEventForUnit( EventDCSUnitName, EventFunction, EventSelf, world.event.S_EVENT_PILOT_DEAD ) - - return self -end - ---- Create an OnDead event handler for a group --- @param #EVENT self --- @param #table EventTemplate --- @param #function EventFunction The function to be called when the event occurs for the unit. --- @param EventSelf The self instance of the class for which the event is. --- @return #EVENT -function EVENT:OnLandForTemplate( EventTemplate, EventFunction, EventSelf ) - self:F2( EventTemplate.name ) - - self:OnEventForTemplate( EventTemplate, EventFunction, EventSelf, self.OnLandForUnit ) - - return self -end - ---- Set a new listener for an S_EVENT_LAND event. --- @param #EVENT self --- @param #string EventDCSUnitName --- @param #function EventFunction The function to be called when the event occurs for the unit. --- @param Base#BASE EventSelf The self instance of the class for which the event is. --- @return #EVENT -function EVENT:OnLandForUnit( EventDCSUnitName, EventFunction, EventSelf ) - self:F2( EventDCSUnitName ) - - self:OnEventForUnit( EventDCSUnitName, EventFunction, EventSelf, world.event.S_EVENT_LAND ) - - return self -end - ---- Create an OnDead event handler for a group --- @param #EVENT self --- @param #table EventTemplate --- @param #function EventFunction The function to be called when the event occurs for the unit. --- @param EventSelf The self instance of the class for which the event is. --- @return #EVENT -function EVENT:OnTakeOffForTemplate( EventTemplate, EventFunction, EventSelf ) - self:F2( EventTemplate.name ) - - self:OnEventForTemplate( EventTemplate, EventFunction, EventSelf, self.OnTakeOffForUnit ) - - return self -end - ---- Set a new listener for an S_EVENT_TAKEOFF event. --- @param #EVENT self --- @param #string EventDCSUnitName --- @param #function EventFunction The function to be called when the event occurs for the unit. --- @param Base#BASE EventSelf The self instance of the class for which the event is. --- @return #EVENT -function EVENT:OnTakeOffForUnit( EventDCSUnitName, EventFunction, EventSelf ) - self:F2( EventDCSUnitName ) - - self:OnEventForUnit( EventDCSUnitName, EventFunction, EventSelf, world.event.S_EVENT_TAKEOFF ) - - return self -end - ---- Create an OnDead event handler for a group --- @param #EVENT self --- @param #table EventTemplate --- @param #function EventFunction The function to be called when the event occurs for the unit. --- @param EventSelf The self instance of the class for which the event is. --- @return #EVENT -function EVENT:OnEngineShutDownForTemplate( EventTemplate, EventFunction, EventSelf ) - self:F2( EventTemplate.name ) - - self:OnEventForTemplate( EventTemplate, EventFunction, EventSelf, self.OnEngineShutDownForUnit ) - - return self -end - ---- Set a new listener for an S_EVENT_ENGINE_SHUTDOWN event. --- @param #EVENT self --- @param #string EventDCSUnitName --- @param #function EventFunction The function to be called when the event occurs for the unit. --- @param Base#BASE EventSelf The self instance of the class for which the event is. --- @return #EVENT -function EVENT:OnEngineShutDownForUnit( EventDCSUnitName, EventFunction, EventSelf ) - self:F2( EventDCSUnitName ) - - self:OnEventForUnit( EventDCSUnitName, EventFunction, EventSelf, world.event.S_EVENT_ENGINE_SHUTDOWN ) - - return self -end - ---- Set a new listener for an S_EVENT_ENGINE_STARTUP event. --- @param #EVENT self --- @param #string EventDCSUnitName --- @param #function EventFunction The function to be called when the event occurs for the unit. --- @param Base#BASE EventSelf The self instance of the class for which the event is. --- @return #EVENT -function EVENT:OnEngineStartUpForUnit( EventDCSUnitName, EventFunction, EventSelf ) - self:F2( EventDCSUnitName ) - - self:OnEventForUnit( EventDCSUnitName, EventFunction, EventSelf, world.event.S_EVENT_ENGINE_STARTUP ) - - return self -end - ---- Set a new listener for an S_EVENT_SHOT event. --- @param #EVENT self --- @param #function EventFunction The function to be called when the event occurs for the unit. --- @param Base#BASE EventSelf The self instance of the class for which the event is. --- @return #EVENT -function EVENT:OnShot( EventFunction, EventSelf ) - self:F2() - - self:OnEventGeneric( EventFunction, EventSelf, world.event.S_EVENT_SHOT ) - - return self -end - ---- Set a new listener for an S_EVENT_SHOT event for a unit. --- @param #EVENT self --- @param #string EventDCSUnitName --- @param #function EventFunction The function to be called when the event occurs for the unit. --- @param Base#BASE EventSelf The self instance of the class for which the event is. --- @return #EVENT -function EVENT:OnShotForUnit( EventDCSUnitName, EventFunction, EventSelf ) - self:F2( EventDCSUnitName ) - - self:OnEventForUnit( EventDCSUnitName, EventFunction, EventSelf, world.event.S_EVENT_SHOT ) - - return self -end - ---- Set a new listener for an S_EVENT_HIT event. --- @param #EVENT self --- @param #function EventFunction The function to be called when the event occurs for the unit. --- @param Base#BASE EventSelf The self instance of the class for which the event is. --- @return #EVENT -function EVENT:OnHit( EventFunction, EventSelf ) - self:F2() - - self:OnEventGeneric( EventFunction, EventSelf, world.event.S_EVENT_HIT ) - - return self -end - ---- Set a new listener for an S_EVENT_HIT event. --- @param #EVENT self --- @param #string EventDCSUnitName --- @param #function EventFunction The function to be called when the event occurs for the unit. --- @param Base#BASE EventSelf The self instance of the class for which the event is. --- @return #EVENT -function EVENT:OnHitForUnit( EventDCSUnitName, EventFunction, EventSelf ) - self:F2( EventDCSUnitName ) - - self:OnEventForUnit( EventDCSUnitName, EventFunction, EventSelf, world.event.S_EVENT_HIT ) - - return self -end - ---- Set a new listener for an S_EVENT_PLAYER_ENTER_UNIT event. --- @param #EVENT self --- @param #function EventFunction The function to be called when the event occurs for the unit. --- @param Base#BASE EventSelf The self instance of the class for which the event is. --- @return #EVENT -function EVENT:OnPlayerEnterUnit( EventFunction, EventSelf ) - self:F2() - - self:OnEventGeneric( EventFunction, EventSelf, world.event.S_EVENT_PLAYER_ENTER_UNIT ) - - return self -end - ---- Set a new listener for an S_EVENT_PLAYER_LEAVE_UNIT event. --- @param #EVENT self --- @param #function EventFunction The function to be called when the event occurs for the unit. --- @param Base#BASE EventSelf The self instance of the class for which the event is. --- @return #EVENT -function EVENT:OnPlayerLeaveUnit( EventFunction, EventSelf ) - self:F2() - - self:OnEventGeneric( EventFunction, EventSelf, world.event.S_EVENT_PLAYER_LEAVE_UNIT ) - - return self -end - - - -function EVENT:onEvent( Event ) - self:F2( { _EVENTCODES[Event.id], Event } ) - - if self and self.Events and self.Events[Event.id] then - if Event.initiator and Event.initiator:getCategory() == Object.Category.UNIT then - Event.IniDCSUnit = Event.initiator - Event.IniDCSGroup = Event.IniDCSUnit:getGroup() - Event.IniDCSUnitName = Event.IniDCSUnit:getName() - Event.IniDCSGroupName = "" - if Event.IniDCSGroup and Event.IniDCSGroup:isExist() then - Event.IniDCSGroupName = Event.IniDCSGroup:getName() - end - end - if Event.target then - if Event.target and Event.target:getCategory() == Object.Category.UNIT then - Event.TgtDCSUnit = Event.target - Event.TgtDCSGroup = Event.TgtDCSUnit:getGroup() - Event.TgtDCSUnitName = Event.TgtDCSUnit:getName() - Event.TgtDCSGroupName = "" - if Event.TgtDCSGroup and Event.TgtDCSGroup:isExist() then - Event.TgtDCSGroupName = Event.TgtDCSGroup:getName() - end - end - end - if Event.weapon then - Event.Weapon = Event.weapon - Event.WeaponName = Event.Weapon:getTypeName() - --Event.WeaponTgtDCSUnit = Event.Weapon:getTarget() - end - self:E( { _EVENTCODES[Event.id], Event } ) - for ClassName, EventData in pairs( self.Events[Event.id] ) do - if Event.IniDCSUnitName and EventData.IniUnit and EventData.IniUnit[Event.IniDCSUnitName] then - self:T2( { "Calling event function for class ", ClassName, " unit ", Event.IniDCSUnitName } ) - EventData.IniUnit[Event.IniDCSUnitName].EventFunction( EventData.IniUnit[Event.IniDCSUnitName].EventSelf, Event ) - else - if Event.IniDCSUnit and not EventData.IniUnit then - self:T2( { "Calling event function for class ", ClassName } ) - EventData.EventFunction( EventData.EventSelf, Event ) - end - end - end - end -end - ---- Encapsulation of DCS World Menu system in a set of MENU classes. --- @module Menu - -Include.File( "Routines" ) -Include.File( "Base" ) - ---- The MENU class --- @type MENU --- @extends Base#BASE -MENU = { - ClassName = "MENU", - MenuPath = nil, - MenuText = "", - MenuParentPath = nil -} - ---- -function MENU:New( MenuText, MenuParentPath ) - - -- Arrange meta tables - local Child = BASE:Inherit( self, BASE:New() ) - - Child.MenuPath = nil - Child.MenuText = MenuText - Child.MenuParentPath = MenuParentPath - return Child -end - ---- The COMMANDMENU class --- @type COMMANDMENU --- @extends Menu#MENU -COMMANDMENU = { - ClassName = "COMMANDMENU", - CommandMenuFunction = nil, - CommandMenuArgument = nil -} - -function COMMANDMENU:New( MenuText, ParentMenu, CommandMenuFunction, CommandMenuArgument ) - - -- Arrange meta tables - - local MenuParentPath = nil - if ParentMenu ~= nil then - MenuParentPath = ParentMenu.MenuPath - end - - local Child = BASE:Inherit( self, MENU:New( MenuText, MenuParentPath ) ) - - Child.MenuPath = missionCommands.addCommand( MenuText, MenuParentPath, CommandMenuFunction, CommandMenuArgument ) - Child.CommandMenuFunction = CommandMenuFunction - Child.CommandMenuArgument = CommandMenuArgument - return Child -end - ---- The SUBMENU class --- @type SUBMENU --- @extends Menu#MENU -SUBMENU = { - ClassName = "SUBMENU" -} - -function SUBMENU:New( MenuText, ParentMenu ) - - -- Arrange meta tables - local MenuParentPath = nil - if ParentMenu ~= nil then - MenuParentPath = ParentMenu.MenuPath - end - - local Child = BASE:Inherit( self, MENU:New( MenuText, MenuParentPath ) ) - - Child.MenuPath = missionCommands.addSubMenu( MenuText, MenuParentPath ) - return Child -end - --- This local variable is used to cache the menus registered under clients. --- Menus don't dissapear when clients are destroyed and restarted. --- So every menu for a client created must be tracked so that program logic accidentally does not create --- the same menus twice during initialization logic. --- These menu classes are handling this logic with this variable. -local _MENUCLIENTS = {} - ---- The MENU_CLIENT class --- @type MENU_CLIENT --- @extends Menu#MENU -MENU_CLIENT = { - ClassName = "MENU_CLIENT" -} - ---- Creates a new menu item for a group --- @param self --- @param Client#CLIENT MenuClient The Client owning the menu. --- @param #string MenuText The text for the menu. --- @param #table ParentMenu The parent menu. --- @return #MENU_CLIENT self -function MENU_CLIENT:New( MenuClient, MenuText, ParentMenu ) - - -- Arrange meta tables - local MenuParentPath = {} - if ParentMenu ~= nil then - MenuParentPath = ParentMenu.MenuPath - end - - local self = BASE:Inherit( self, MENU:New( MenuText, MenuParentPath ) ) - self:F( { MenuClient, MenuText, ParentMenu } ) - - self.MenuClient = MenuClient - self.MenuClientGroupID = MenuClient:GetClientGroupID() - self.MenuParentPath = MenuParentPath - self.MenuText = MenuText - self.ParentMenu = ParentMenu - - self.Menus = {} - - if not _MENUCLIENTS[self.MenuClientGroupID] then - _MENUCLIENTS[self.MenuClientGroupID] = {} - end - - local MenuPath = _MENUCLIENTS[self.MenuClientGroupID] - - self:T( { MenuClient:GetClientGroupName(), MenuPath[table.concat(MenuParentPath)], MenuParentPath, MenuText } ) - - local MenuPathID = table.concat(MenuParentPath) .. "/" .. MenuText - if MenuPath[MenuPathID] then - missionCommands.removeItemForGroup( self.MenuClient:GetClientGroupID(), MenuPath[MenuPathID] ) - end - - self.MenuPath = missionCommands.addSubMenuForGroup( self.MenuClient:GetClientGroupID(), MenuText, MenuParentPath ) - MenuPath[MenuPathID] = self.MenuPath - - self:T( { MenuClient:GetClientGroupName(), self.MenuPath } ) - - if ParentMenu and ParentMenu.Menus then - ParentMenu.Menus[self.MenuPath] = self - end - return self -end - ---- Removes the sub menus recursively of this MENU_CLIENT. --- @param #MENU_CLIENT self --- @return #MENU_CLIENT self -function MENU_CLIENT:RemoveSubMenus() - self:F( self.MenuPath ) - - for MenuID, Menu in pairs( self.Menus ) do - Menu:Remove() - end - -end - ---- Removes the sub menus recursively of this MENU_CLIENT. --- @param #MENU_CLIENT self --- @return #MENU_CLIENT self -function MENU_CLIENT:Remove() - self:F( self.MenuPath ) - - self:RemoveSubMenus() - - if not _MENUCLIENTS[self.MenuClientGroupID] then - _MENUCLIENTS[self.MenuClientGroupID] = {} - end - - local MenuPath = _MENUCLIENTS[self.MenuClientGroupID] - - if MenuPath[table.concat(self.MenuParentPath) .. "/" .. self.MenuText] then - MenuPath[table.concat(self.MenuParentPath) .. "/" .. self.MenuText] = nil - end - - missionCommands.removeItemForGroup( self.MenuClient:GetClientGroupID(), self.MenuPath ) - self.ParentMenu.Menus[self.MenuPath] = nil - return nil -end - - ---- The MENU_CLIENT_COMMAND class --- @type MENU_CLIENT_COMMAND --- @extends Menu#MENU -MENU_CLIENT_COMMAND = { - ClassName = "MENU_CLIENT_COMMAND" -} - ---- Creates a new radio command item for a group --- @param self --- @param Client#CLIENT MenuClient The Client owning the menu. --- @param MenuText The text for the menu. --- @param ParentMenu The parent menu. --- @param CommandMenuFunction A function that is called when the menu key is pressed. --- @param CommandMenuArgument An argument for the function. --- @return Menu#MENU_CLIENT_COMMAND self -function MENU_CLIENT_COMMAND:New( MenuClient, MenuText, ParentMenu, CommandMenuFunction, CommandMenuArgument ) - - -- Arrange meta tables - - local MenuParentPath = {} - if ParentMenu ~= nil then - MenuParentPath = ParentMenu.MenuPath - end - - local self = BASE:Inherit( self, MENU:New( MenuText, MenuParentPath ) ) - - self.MenuClient = MenuClient - self.MenuClientGroupID = MenuClient:GetClientGroupID() - self.MenuParentPath = MenuParentPath - self.MenuText = MenuText - self.ParentMenu = ParentMenu - - if not _MENUCLIENTS[self.MenuClientGroupID] then - _MENUCLIENTS[self.MenuClientGroupID] = {} - end - - local MenuPath = _MENUCLIENTS[self.MenuClientGroupID] - - self:T( { MenuClient:GetClientGroupName(), MenuPath[table.concat(MenuParentPath)], MenuParentPath, MenuText, CommandMenuFunction, CommandMenuArgument } ) - - local MenuPathID = table.concat(MenuParentPath) .. "/" .. MenuText - if MenuPath[MenuPathID] then - missionCommands.removeItemForGroup( self.MenuClient:GetClientGroupID(), MenuPath[MenuPathID] ) - end - - self.MenuPath = missionCommands.addCommandForGroup( self.MenuClient:GetClientGroupID(), MenuText, MenuParentPath, CommandMenuFunction, CommandMenuArgument ) - MenuPath[MenuPathID] = self.MenuPath - - self.CommandMenuFunction = CommandMenuFunction - self.CommandMenuArgument = CommandMenuArgument - - ParentMenu.Menus[self.MenuPath] = self - - return self -end - -function MENU_CLIENT_COMMAND:Remove() - self:F( self.MenuPath ) - - if not _MENUCLIENTS[self.MenuClientGroupID] then - _MENUCLIENTS[self.MenuClientGroupID] = {} - end - - local MenuPath = _MENUCLIENTS[self.MenuClientGroupID] - - if MenuPath[table.concat(self.MenuParentPath) .. "/" .. self.MenuText] then - MenuPath[table.concat(self.MenuParentPath) .. "/" .. self.MenuText] = nil - end - - missionCommands.removeItemForGroup( self.MenuClient:GetClientGroupID(), self.MenuPath ) - self.ParentMenu.Menus[self.MenuPath] = nil - return nil -end - - ---- The MENU_COALITION class --- @type MENU_COALITION --- @extends Menu#MENU -MENU_COALITION = { - ClassName = "MENU_COALITION" -} - ---- Creates a new coalition menu item --- @param #MENU_COALITION self --- @param DCSCoalition#coalition.side MenuCoalition The coalition owning the menu. --- @param #string MenuText The text for the menu. --- @param #table ParentMenu The parent menu. --- @return #MENU_COALITION self -function MENU_COALITION:New( MenuCoalition, MenuText, ParentMenu ) - - -- Arrange meta tables - local MenuParentPath = {} - if ParentMenu ~= nil then - MenuParentPath = ParentMenu.MenuPath - end - - local self = BASE:Inherit( self, MENU:New( MenuText, MenuParentPath ) ) - self:F( { MenuCoalition, MenuText, ParentMenu } ) - - self.MenuCoalition = MenuCoalition - self.MenuParentPath = MenuParentPath - self.MenuText = MenuText - self.ParentMenu = ParentMenu - - self.Menus = {} - - self:T( { MenuParentPath, MenuText } ) - - self.MenuPath = missionCommands.addSubMenuForCoalition( self.MenuCoalition, MenuText, MenuParentPath ) - - self:T( { self.MenuPath } ) - - if ParentMenu and ParentMenu.Menus then - ParentMenu.Menus[self.MenuPath] = self - end - return self -end - ---- Removes the sub menus recursively of this MENU_COALITION. --- @param #MENU_COALITION self --- @return #MENU_COALITION self -function MENU_COALITION:RemoveSubMenus() - self:F( self.MenuPath ) - - for MenuID, Menu in pairs( self.Menus ) do - Menu:Remove() - end - -end - ---- Removes the sub menus recursively of this MENU_COALITION. --- @param #MENU_COALITION self --- @return #MENU_COALITION self -function MENU_COALITION:Remove() - self:F( self.MenuPath ) - - self:RemoveSubMenus() - missionCommands.removeItemForCoalition( self.MenuCoalition, self.MenuPath ) - self.ParentMenu.Menus[self.MenuPath] = nil - - return nil -end - - ---- The MENU_COALITION_COMMAND class --- @type MENU_COALITION_COMMAND --- @extends Menu#MENU -MENU_COALITION_COMMAND = { - ClassName = "MENU_COALITION_COMMAND" -} - ---- Creates a new radio command item for a group --- @param #MENU_COALITION_COMMAND self --- @param DCSCoalition#coalition.side MenuCoalition The coalition owning the menu. --- @param MenuText The text for the menu. --- @param ParentMenu The parent menu. --- @param CommandMenuFunction A function that is called when the menu key is pressed. --- @param CommandMenuArgument An argument for the function. --- @return #MENU_COALITION_COMMAND self -function MENU_COALITION_COMMAND:New( MenuCoalition, MenuText, ParentMenu, CommandMenuFunction, CommandMenuArgument ) - - -- Arrange meta tables - - local MenuParentPath = {} - if ParentMenu ~= nil then - MenuParentPath = ParentMenu.MenuPath - end - - local self = BASE:Inherit( self, MENU:New( MenuText, MenuParentPath ) ) - - self.MenuCoalition = MenuCoalition - self.MenuParentPath = MenuParentPath - self.MenuText = MenuText - self.ParentMenu = ParentMenu - - self:T( { MenuParentPath, MenuText, CommandMenuFunction, CommandMenuArgument } ) - - self.MenuPath = missionCommands.addCommandForCoalition( self.MenuCoalition, MenuText, MenuParentPath, CommandMenuFunction, CommandMenuArgument ) - - self.CommandMenuFunction = CommandMenuFunction - self.CommandMenuArgument = CommandMenuArgument - - ParentMenu.Menus[self.MenuPath] = self - - return self -end - ---- Removes a radio command item for a coalition --- @param #MENU_COALITION_COMMAND self --- @return #MENU_COALITION_COMMAND self -function MENU_COALITION_COMMAND:Remove() - self:F( self.MenuPath ) - - missionCommands.removeItemForCoalition( self.MenuCoalition, self.MenuPath ) - self.ParentMenu.Menus[self.MenuPath] = nil - return nil -end ---- GROUP class. --- --- @{GROUP} class --- ============== --- The @{GROUP} class is a wrapper class to handle the DCS Group objects: --- --- * Support all DCS Group APIs. --- * Enhance with Group specific APIs not in the DCS Group API set. --- * Handle local Group Controller. --- * Manage the "state" of the DCS Group. --- --- --- GROUP reference methods --- ======================= --- For each DCS Group object alive within a running mission, a GROUP wrapper object (instance) will be created within the _@{DATABASE} object. --- This is done at the beginning of the mission (when the mission starts), and dynamically when new DCS Group objects are spawned (using the @{SPAWN} class). --- --- The GROUP class does not contain a :New() method, rather it provides :Find() methods to retrieve the object reference --- using the DCS Group or the DCS GroupName. --- --- Another thing to know is that GROUP objects do not "contain" the DCS Group object. --- The GROUP methods will reference the DCS Group object by name when it is needed during API execution. --- If the DCS Group object does not exist or is nil, the GROUP methods will return nil and log an exception in the DCS.log file. --- --- The GROUP class provides the following functions to retrieve quickly the relevant GROUP instance: --- --- * @{#GROUP.Find}(): Find a GROUP instance from the _DATABASE object using a DCS Group object. --- * @{#GROUP.FindByName}(): Find a GROUP instance from the _DATABASE object using a DCS Group name. --- --- IMPORTANT: ONE SHOULD NEVER SANATIZE these GROUP OBJECT REFERENCES! (make the GROUP object references nil). --- @module Group --- @author FlightControl - -Include.File( "Routines" ) -Include.File( "Base" ) -Include.File( "Message" ) -Include.File( "Unit" ) - ---- The GROUP class --- @type GROUP --- @extends Base#BASE --- @field DCSGroup#Group DCSGroup The DCS group class. --- @field #string GroupName The name of the group. -GROUP = { - ClassName = "GROUP", - GroupName = "", - GroupID = 0, - Controller = nil, - DCSGroup = nil, - WayPointFunctions = {}, -} - ---- A DCSGroup --- @type DCSGroup --- @field id_ The ID of the group in DCS - ---- Create a new GROUP from a DCSGroup --- @param #GROUP self --- @param DCSGroup#Group GroupName The DCS Group name --- @return #GROUP self -function GROUP:Register( GroupName ) - local self = BASE:Inherit( self, BASE:New() ) - self:F2( GroupName ) - self.GroupName = GroupName - return self -end - --- Reference methods. - ---- Find the GROUP wrapper class instance using the DCS Group. --- @param #GROUP self --- @param DCSGroup#Group DCSGroup The DCS Group. --- @return #GROUP The GROUP. -function GROUP:Find( DCSGroup ) - - local GroupName = DCSGroup:getName() -- Group#GROUP - local GroupFound = _DATABASE:FindGroup( GroupName ) - return GroupFound -end - ---- Find the created GROUP using the DCS Group Name. --- @param #GROUP self --- @param #string GroupName The DCS Group Name. --- @return #GROUP The GROUP. -function GROUP:FindByName( GroupName ) - - local GroupFound = _DATABASE:FindGroup( GroupName ) - return GroupFound -end - --- DCS Group methods support. - ---- Returns the DCS Group. --- @param #GROUP self --- @return DCSGroup#Group The DCS Group. -function GROUP:GetDCSGroup() - local DCSGroup = Group.getByName( self.GroupName ) - - if DCSGroup then - return DCSGroup - end - - return nil -end - - ---- Returns if the DCS Group is alive. --- When the group exists at run-time, this method will return true, otherwise false. --- @param #GROUP self --- @return #boolean true if the DCS Group is alive. -function GROUP:IsAlive() - self:F2( self.GroupName ) - - local DCSGroup = self:GetDCSGroup() - - if DCSGroup then - local GroupIsAlive = DCSGroup:isExist() - self:T3( GroupIsAlive ) - return GroupIsAlive - end - - return nil -end - ---- Destroys the DCS Group and all of its DCS Units. --- Note that this destroy method also raises a destroy event at run-time. --- So all event listeners will catch the destroy event of this DCS Group. --- @param #GROUP self -function GROUP:Destroy() - self:F2( self.GroupName ) - - local DCSGroup = self:GetDCSGroup() - - if DCSGroup then - for Index, UnitData in pairs( DCSGroup:getUnits() ) do - self:CreateEventCrash( timer.getTime(), UnitData ) - end - DCSGroup:destroy() - DCSGroup = nil - end - - return nil -end - ---- Returns category of the DCS Group. --- @param #GROUP self --- @return DCSGroup#Group.Category The category ID -function GROUP:GetCategory() - self:F2( self.GroupName ) - - local DCSGroup = self:GetDCSGroup() - if DCSGroup then - local GroupCategory = DCSGroup:getCategory() - self:T3( GroupCategory ) - return GroupCategory - end - - return nil -end - ---- Returns the category name of the DCS Group. --- @param #GROUP self --- @return #string Category name = Helicopter, Airplane, Ground Unit, Ship -function GROUP:GetCategoryName() - self:F2( self.GroupName ) - - local DCSGroup = self:GetDCSGroup() - if DCSGroup then - local CategoryNames = { - [Group.Category.AIRPLANE] = "Airplane", - [Group.Category.HELICOPTER] = "Helicopter", - [Group.Category.GROUND] = "Ground Unit", - [Group.Category.SHIP] = "Ship", - } - local GroupCategory = DCSGroup:getCategory() - self:T3( GroupCategory ) - - return CategoryNames[GroupCategory] - end - - return nil -end - - ---- Returns the coalition of the DCS Group. --- @param #GROUP self --- @return DCSCoalitionObject#coalition.side The coalition side of the DCS Group. -function GROUP:GetCoalition() - self:F2( self.GroupName ) - - local DCSGroup = self:GetDCSGroup() - if DCSGroup then - local GroupCoalition = DCSGroup:getCoalition() - self:T3( GroupCoalition ) - return GroupCoalition - end - - return nil -end - ---- Returns the country of the DCS Group. --- @param #GROUP self --- @return DCScountry#country.id The country identifier. --- @return #nil The DCS Group is not existing or alive. -function GROUP:GetCountry() - self:F2( self.GroupName ) - - local DCSGroup = self:GetDCSGroup() - if DCSGroup then - local GroupCountry = DCSGroup:getUnit(1):getCountry() - self:T3( GroupCountry ) - return GroupCountry - end - - return nil -end - ---- Returns the name of the DCS Group. --- @param #GROUP self --- @return #string The DCS Group name. -function GROUP:GetName() - self:F2( self.GroupName ) - - local DCSGroup = self:GetDCSGroup() - - if DCSGroup then - local GroupName = DCSGroup:getName() - self:T3( GroupName ) - return GroupName - end - - return nil -end - ---- Returns the DCS Group identifier. --- @param #GROUP self --- @return #number The identifier of the DCS Group. -function GROUP:GetID() - self:F2( self.GroupName ) - - local DCSGroup = self:GetDCSGroup() - - if DCSGroup then - local GroupID = DCSGroup:getID() - self:T3( GroupID ) - return GroupID - end - - return nil -end - ---- Returns the UNIT wrapper class with number UnitNumber. --- If the underlying DCS Unit does not exist, the method will return nil. . --- @param #GROUP self --- @param #number UnitNumber The number of the UNIT wrapper class to be returned. --- @return Unit#UNIT The UNIT wrapper class. -function GROUP:GetUnit( UnitNumber ) - self:F2( { self.GroupName, UnitNumber } ) - - local DCSGroup = self:GetDCSGroup() - - if DCSGroup then - local UnitFound = UNIT:Find( DCSGroup:getUnit( UnitNumber ) ) - self:T3( UnitFound.UnitName ) - self:T2( UnitFound ) - return UnitFound - end - - return nil -end - ---- Returns the DCS Unit with number UnitNumber. --- If the underlying DCS Unit does not exist, the method will return nil. . --- @param #GROUP self --- @param #number UnitNumber The number of the DCS Unit to be returned. --- @return DCSUnit#Unit The DCS Unit. -function GROUP:GetDCSUnit( UnitNumber ) - self:F2( { self.GroupName, UnitNumber } ) - - local DCSGroup = self:GetDCSGroup() - - if DCSGroup then - local DCSUnitFound = DCSGroup:getUnit( UnitNumber ) - self:T3( DCSUnitFound ) - return DCSUnitFound - end - - return nil -end - ---- Returns current size of the DCS Group. --- If some of the DCS Units of the DCS Group are destroyed the size of the DCS Group is changed. --- @param #GROUP self --- @return #number The DCS Group size. -function GROUP:GetSize() - self:F2( { self.GroupName } ) - local DCSGroup = self:GetDCSGroup() - - if DCSGroup then - local GroupSize = DCSGroup:getSize() - self:T3( GroupSize ) - return GroupSize - end - - return nil -end - ---- ---- Returns the initial size of the DCS Group. --- If some of the DCS Units of the DCS Group are destroyed, the initial size of the DCS Group is unchanged. --- @param #GROUP self --- @return #number The DCS Group initial size. -function GROUP:GetInitialSize() - self:F2( { self.GroupName } ) - local DCSGroup = self:GetDCSGroup() - - if DCSGroup then - local GroupInitialSize = DCSGroup:getInitialSize() - self:T3( GroupInitialSize ) - return GroupInitialSize - end - - return nil -end - ---- Returns the UNITs wrappers of the DCS Units of the DCS Group. --- @param #GROUP self --- @return #table The UNITs wrappers. -function GROUP:GetUnits() - self:F2( { self.GroupName } ) - local DCSGroup = self:GetDCSGroup() - - if DCSGroup then - local DCSUnits = DCSGroup:getUnits() - local Units = {} - for Index, UnitData in pairs( DCSUnits ) do - Units[#Units+1] = UNIT:Find( UnitData ) - end - self:T3( Units ) - return Units - end - - return nil -end - - ---- Returns the DCS Units of the DCS Group. --- @param #GROUP self --- @return #table The DCS Units. -function GROUP:GetDCSUnits() - self:F2( { self.GroupName } ) - local DCSGroup = self:GetDCSGroup() - - if DCSGroup then - local DCSUnits = DCSGroup:getUnits() - self:T3( DCSUnits ) - return DCSUnits - end - - return nil -end - ---- Get the controller for the GROUP. --- @param #GROUP self --- @return DCSController#Controller -function GROUP:_GetController() - self:F2( { self.GroupName } ) - local DCSGroup = self:GetDCSGroup() - - if DCSGroup then - local GroupController = DCSGroup:getController() - self:T3( GroupController ) - return GroupController - end - - return nil -end - - ---- Retrieve the group mission and allow to place function hooks within the mission waypoint plan. --- Use the method @{Group#GROUP:WayPointFunction} to define the hook functions for specific waypoints. --- Use the method @{Group@GROUP:WayPointExecute) to start the execution of the new mission plan. --- Note that when WayPointInitialize is called, the Mission of the group is RESTARTED! --- @param #GROUP self --- @return #GROUP -function GROUP:WayPointInitialize() - - self.WayPoints = self:GetTaskRoute() - - return self -end - - ---- Registers a waypoint function that will be executed when the group moves over the WayPoint. --- @param #GROUP self --- @param #number WayPoint The waypoint number. Note that the start waypoint on the route is WayPoint 1! --- @param #number WayPointIndex When defining multiple WayPoint functions for one WayPoint, use WayPointIndex to set the sequence of actions. --- @param #function WayPointFunction The waypoint function to be called when the group moves over the waypoint. The waypoint function takes variable parameters. --- @return #GROUP -function GROUP:WayPointFunction( WayPoint, WayPointIndex, WayPointFunction, ... ) - self:F2( { WayPoint, WayPointIndex, WayPointFunction } ) - - table.insert( self.WayPoints[WayPoint].task.params.tasks, WayPointIndex ) - self.WayPoints[WayPoint].task.params.tasks[WayPointIndex] = self:TaskFunction( WayPoint, WayPointIndex, WayPointFunction, arg ) - return self -end - - -function GROUP:TaskFunction( WayPoint, WayPointIndex, FunctionString, FunctionArguments ) - - local DCSTask - - local DCSScript = {} - DCSScript[#DCSScript+1] = "local MissionGroup = GROUP:Find( ... ) " - - if FunctionArguments.n > 0 then - DCSScript[#DCSScript+1] = FunctionString .. "( MissionGroup, " .. table.concat( FunctionArguments, "," ) .. ")" - else - DCSScript[#DCSScript+1] = FunctionString .. "( MissionGroup )" - end - - DCSTask = self:TaskWrappedAction( - self:CommandDoScript( - table.concat( DCSScript ) - ), WayPointIndex - ) - - self:T3( DCSTask ) - - return DCSTask - -end - - - ---- Executes the WayPoint plan. --- The function gets a WayPoint parameter, that you can use to restart the mission at a specific WayPoint. --- Note that when the WayPoint parameter is used, the new start mission waypoint of the group will be 1! --- @param #GROUP self --- @param #number WayPoint The WayPoint from where to execute the mission. --- @param #WaitTime The amount seconds to wait before initiating the mission. --- @return #GROUP -function GROUP:WayPointExecute( WayPoint, WaitTime ) - - if not WayPoint then - WayPoint = 1 - end - - -- When starting the mission from a certain point, the TaskPoints need to be deleted before the given WayPoint. - for TaskPointID = 1, WayPoint - 1 do - table.remove( self.WayPoints, 1 ) - end - - self:T3( self.WayPoints ) - - self:SetTask( self:TaskRoute( self.WayPoints ), WaitTime ) - - return self -end - - ---- Activates a GROUP. --- @param #GROUP self -function GROUP:Activate() - self:F2( { self.GroupName } ) - trigger.action.activateGroup( self:GetDCSGroup() ) - return self:GetDCSGroup() -end - - ---- Gets the type name of the group. --- @param #GROUP self --- @return #string The type name of the group. -function GROUP:GetTypeName() - self:F2( self.GroupName ) - - local DCSGroup = self:GetDCSGroup() - - if DCSGroup then - local GroupTypeName = DCSGroup:getUnit(1):getTypeName() - self:T3( GroupTypeName ) - return( GroupTypeName ) - end - - return nil -end - ---- Gets the CallSign of the first DCS Unit of the DCS Group. --- @param #GROUP self --- @return #string The CallSign of the first DCS Unit of the DCS Group. -function GROUP:GetCallsign() - self:F2( self.GroupName ) - - local DCSGroup = self:GetDCSGroup() - - if DCSGroup then - local GroupCallSign = DCSGroup:getUnit(1):getCallsign() - self:T3( GroupCallSign ) - return GroupCallSign - end - - return nil -end - ---- Returns the current point (Vec2 vector) of the first DCS Unit in the DCS Group. --- @return DCSTypes#Vec2 Current Vec2 point of the first DCS Unit of the DCS Group. -function GROUP:GetPointVec2() - self:F2( self.GroupName ) - - local GroupPointVec2 = self:GetUnit(1):GetPointVec2() - self:T3( GroupPointVec2 ) - return GroupPointVec2 -end - ---- Returns the current point (Vec3 vector) of the first DCS Unit in the DCS Group. --- @return DCSTypes#Vec3 Current Vec3 point of the first DCS Unit of the DCS Group. -function GROUP:GetPointVec3() - self:F2( self.GroupName ) - - local GroupPointVec3 = self:GetUnit(1):GetPointVec3() - self:T3( GroupPointVec3 ) - return GroupPointVec3 -end - - - --- Is Functions - ---- Returns if the group is of an air category. --- If the group is a helicopter or a plane, then this method will return true, otherwise false. --- @param #GROUP self --- @return #boolean Air category evaluation result. -function GROUP:IsAir() - self:F2( self.GroupName ) - - local DCSGroup = self:GetDCSGroup() - - if DCSGroup then - local IsAirResult = DCSGroup:getCategory() == Group.Category.AIRPLANE or DCSGroup:getCategory() == Group.Category.HELICOPTER - self:T3( IsAirResult ) - return IsAirResult - end - - return nil -end - ---- Returns if the DCS Group contains Helicopters. --- @param #GROUP self --- @return #boolean true if DCS Group contains Helicopters. -function GROUP:IsHelicopter() - self:F2( self.GroupName ) - - local DCSGroup = self:GetDCSGroup() - - if DCSGroup then - local GroupCategory = DCSGroup:getCategory() - self:T2( GroupCategory ) - return GroupCategory == Group.Category.HELICOPTER - end - - return nil -end - ---- Returns if the DCS Group contains AirPlanes. --- @param #GROUP self --- @return #boolean true if DCS Group contains AirPlanes. -function GROUP:IsAirPlane() - self:F2() - - local DCSGroup = self:GetDCSGroup() - - if DCSGroup then - local GroupCategory = DCSGroup:getCategory() - self:T2( GroupCategory ) - return GroupCategory == Group.Category.AIRPLANE - end - - return nil -end - ---- Returns if the DCS Group contains Ground troops. --- @param #GROUP self --- @return #boolean true if DCS Group contains Ground troops. -function GROUP:IsGround() - self:F2() - - local DCSGroup = self:GetDCSGroup() - - if DCSGroup then - local GroupCategory = DCSGroup:getCategory() - self:T2( GroupCategory ) - return GroupCategory == Group.Category.GROUND - end - - return nil -end - ---- Returns if the DCS Group contains Ships. --- @param #GROUP self --- @return #boolean true if DCS Group contains Ships. -function GROUP:IsShip() - self:F2() - - local DCSGroup = self:GetDCSGroup() - - if DCSGroup then - local GroupCategory = DCSGroup:getCategory() - self:T2( GroupCategory ) - return GroupCategory == Group.Category.SHIP - end - - return nil -end - ---- Returns if all units of the group are on the ground or landed. --- If all units of this group are on the ground, this function will return true, otherwise false. --- @param #GROUP self --- @return #boolean All units on the ground result. -function GROUP:AllOnGround() - self:F2() - - local DCSGroup = self:GetDCSGroup() - - if DCSGroup then - local AllOnGroundResult = true - - for Index, UnitData in pairs( DCSGroup:getUnits() ) do - if UnitData:inAir() then - AllOnGroundResult = false - end - end - - self:T3( AllOnGroundResult ) - return AllOnGroundResult - end - - return nil -end - ---- Returns the current maximum velocity of the group. --- Each unit within the group gets evaluated, and the maximum velocity (= the unit which is going the fastest) is returned. --- @param #GROUP self --- @return #number Maximum velocity found. -function GROUP:GetMaxVelocity() - self:F2() - - local DCSGroup = self:GetDCSGroup() - - if DCSGroup then - local MaxVelocity = 0 - - for Index, UnitData in pairs( DCSGroup:getUnits() ) do - - local Velocity = UnitData:getVelocity() - local VelocityTotal = math.abs( Velocity.x ) + math.abs( Velocity.y ) + math.abs( Velocity.z ) - - if VelocityTotal < MaxVelocity then - MaxVelocity = VelocityTotal - end - end - - return MaxVelocity - end - - return nil -end - ---- Returns the current minimum height of the group. --- Each unit within the group gets evaluated, and the minimum height (= the unit which is the lowest elevated) is returned. --- @param #GROUP self --- @return #number Minimum height found. -function GROUP:GetMinHeight() - self:F2() - -end - ---- Returns the current maximum height of the group. --- Each unit within the group gets evaluated, and the maximum height (= the unit which is the highest elevated) is returned. --- @param #GROUP self --- @return #number Maximum height found. -function GROUP:GetMaxHeight() - self:F2() - -end - --- Tasks - ---- Popping current Task from the group. --- @param #GROUP self --- @return Group#GROUP self -function GROUP:PopCurrentTask() - self:F2() - - local DCSGroup = self:GetDCSGroup() - - if DCSGroup then - local Controller = self:_GetController() - Controller:popTask() - return self - end - - return nil -end - ---- Pushing Task on the queue from the group. --- @param #GROUP self --- @return Group#GROUP self -function GROUP:PushTask( DCSTask, WaitTime ) - self:F2() - - local DCSGroup = self:GetDCSGroup() - - if DCSGroup then - local Controller = self:_GetController() - - -- When a group SPAWNs, it takes about a second to get the group in the simulator. Setting tasks to unspawned groups provides unexpected results. - -- Therefore we schedule the functions to set the mission and options for the Group. - -- Controller:pushTask( DCSTask ) - - if WaitTime then - --routines.scheduleFunction( Controller.pushTask, { Controller, DCSTask }, timer.getTime() + WaitTime ) - SCHEDULER:New( Controller, Controller.pushTask, { DCSTask }, WaitTime ) - else - Controller:pushTask( DCSTask ) - end - - return self - end - - return nil -end - ---- Clearing the Task Queue and Setting the Task on the queue from the group. --- @param #GROUP self --- @return Group#GROUP self -function GROUP:SetTask( DCSTask, WaitTime ) - self:F2( { DCSTask } ) - - local DCSGroup = self:GetDCSGroup() - - if DCSGroup then - - local Controller = self:_GetController() - - -- When a group SPAWNs, it takes about a second to get the group in the simulator. Setting tasks to unspawned groups provides unexpected results. - -- Therefore we schedule the functions to set the mission and options for the Group. - -- Controller.setTask( Controller, DCSTask ) - - if not WaitTime then - WaitTime = 1 - end - --routines.scheduleFunction( Controller.setTask, { Controller, DCSTask }, timer.getTime() + WaitTime ) - SCHEDULER:New( Controller, Controller.setTask, { DCSTask }, WaitTime ) - - return self - end - - return nil -end - - ---- Return a condition section for a controlled task --- @param #GROUP self --- @param DCSTime#Time time --- @param #string userFlag --- @param #boolean userFlagValue --- @param #string condition --- @param DCSTime#Time duration --- @param #number lastWayPoint --- return DCSTask#Task -function GROUP:TaskCondition( time, userFlag, userFlagValue, condition, duration, lastWayPoint ) - self:F2( { time, userFlag, userFlagValue, condition, duration, lastWayPoint } ) - - local DCSStopCondition = {} - DCSStopCondition.time = time - DCSStopCondition.userFlag = userFlag - DCSStopCondition.userFlagValue = userFlagValue - DCSStopCondition.condition = condition - DCSStopCondition.duration = duration - DCSStopCondition.lastWayPoint = lastWayPoint - - self:T3( { DCSStopCondition } ) - return DCSStopCondition -end - ---- Return a Controlled Task taking a Task and a TaskCondition --- @param #GROUP self --- @param DCSTask#Task DCSTask --- @param #DCSStopCondition DCSStopCondition --- @return DCSTask#Task -function GROUP:TaskControlled( DCSTask, DCSStopCondition ) - self:F2( { DCSTask, DCSStopCondition } ) - - local DCSTaskControlled - - DCSTaskControlled = { - id = 'ControlledTask', - params = { - task = DCSTask, - stopCondition = DCSStopCondition - } - } - - self:T3( { DCSTaskControlled } ) - return DCSTaskControlled -end - ---- Return a Combo Task taking an array of Tasks --- @param #GROUP self --- @param #list DCSTasks --- @return DCSTask#Task -function GROUP:TaskCombo( DCSTasks ) - self:F2( { DCSTasks } ) - - local DCSTaskCombo - - DCSTaskCombo = { - id = 'ComboTask', - params = { - tasks = DCSTasks - } - } - - self:T3( { DCSTaskCombo } ) - return DCSTaskCombo -end - ---- Return a WrappedAction Task taking a Command --- @param #GROUP self --- @param DCSCommand#Command DCSCommand --- @return DCSTask#Task -function GROUP:TaskWrappedAction( DCSCommand, Index ) - self:F2( { DCSCommand } ) - - local DCSTaskWrappedAction - - DCSTaskWrappedAction = { - id = "WrappedAction", - enabled = true, - number = Index, - auto = false, - params = { - action = DCSCommand, - }, - } - - self:T3( { DCSTaskWrappedAction } ) - return DCSTaskWrappedAction -end - ---- Executes a command action --- @param #GROUP self --- @param DCSCommand#Command DCSCommand --- @return #GROUP self -function GROUP:SetCommand( DCSCommand ) - self:F2( DCSCommand ) - - local DCSGroup = self:GetDCSGroup() - - if DCSGroup then - local Controller = self:_GetController() - Controller:setCommand( DCSCommand ) - return self - end - - return nil -end - ---- Perform a switch waypoint command --- @param #GROUP self --- @param #number FromWayPoint --- @param #number ToWayPoint --- @return DCSTask#Task -function GROUP:CommandSwitchWayPoint( FromWayPoint, ToWayPoint, Index ) - self:F2( { FromWayPoint, ToWayPoint, Index } ) - - local CommandSwitchWayPoint = { - id = 'SwitchWaypoint', - params = { - fromWaypointIndex = FromWayPoint, - goToWaypointIndex = ToWayPoint, - }, - } - - self:T3( { CommandSwitchWayPoint } ) - return CommandSwitchWayPoint -end - - --- TASKS FOR AIR GROUPS - - ---- (AIR) Attack a Group. --- @param #GROUP self --- @param Group#GROUP AttackGroup The Group to be attacked. --- @param #number WeaponType (optional) Bitmask of weapon types those allowed to use. If parameter is not defined that means no limits on weapon usage. --- @param DCSTypes#AI.Task.WeaponExpend WeaponExpend (optional) Determines how much weapon will be released at each attack. If parameter is not defined the unit / group will choose expend on its own discretion. --- @param #number AttackQty (optional) This parameter limits maximal quantity of attack. The aicraft/group will not make more attack than allowed even if the target group not destroyed and the aicraft/group still have ammo. If not defined the aircraft/group will attack target until it will be destroyed or until the aircraft/group will run out of ammo. --- @param DCSTypes#Azimuth Direction (optional) Desired ingress direction from the target to the attacking aircraft. Group/aircraft will make its attacks from the direction. Of course if there is no way to attack from the direction due the terrain group/aircraft will choose another direction. --- @param DCSTypes#Distance Altitude (optional) Desired attack start altitude. Group/aircraft will make its attacks from the altitude. If the altitude is too low or too high to use weapon aircraft/group will choose closest altitude to the desired attack start altitude. If the desired altitude is defined group/aircraft will not attack from safe altitude. --- @param #boolean AttackQtyLimit (optional) The flag determines how to interpret attackQty parameter. If the flag is true then attackQty is a limit on maximal attack quantity for "AttackGroup" and "AttackUnit" tasks. If the flag is false then attackQty is a desired attack quantity for "Bombing" and "BombingRunway" tasks. --- @return DCSTask#Task The DCS task structure. -function GROUP:TaskAttackGroup( AttackGroup, WeaponType, WeaponExpend, AttackQty, Direction, Altitude, AttackQtyLimit ) - self:F2( { self.GroupName, AttackGroup, WeaponType, WeaponExpend, AttackQty, Direction, Altitude, AttackQtyLimit } ) - - -- AttackGroup = { - -- id = 'AttackGroup', - -- params = { - -- groupId = Group.ID, - -- weaponType = number, - -- expend = enum AI.Task.WeaponExpend, - -- attackQty = number, - -- directionEnabled = boolean, - -- direction = Azimuth, - -- altitudeEnabled = boolean, - -- altitude = Distance, - -- attackQtyLimit = boolean, - -- } - -- } - - local DirectionEnabled = nil - if Direction then - DirectionEnabled = true - end - - local AltitudeEnabled = nil - if Altitude then - AltitudeEnabled = true - end - - local DCSTask - DCSTask = { id = 'AttackGroup', - params = { - groupId = AttackGroup:GetID(), - weaponType = WeaponType, - expend = WeaponExpend, - attackQty = AttackQty, - directionEnabled = DirectionEnabled, - direction = Direction, - altitudeEnabled = AltitudeEnabled, - altitude = Altitude, - attackQtyLimit = AttackQtyLimit, - }, - }, - - self:T3( { DCSTask } ) - return DCSTask -end - - ---- (AIR) Attack the Unit. --- @param #GROUP self --- @param Unit#UNIT AttackUnit The unit. --- @param #number WeaponType (optional) Bitmask of weapon types those allowed to use. If parameter is not defined that means no limits on weapon usage. --- @param DCSTypes#AI.Task.WeaponExpend WeaponExpend (optional) Determines how much weapon will be released at each attack. If parameter is not defined the unit / group will choose expend on its own discretion. --- @param #number AttackQty (optional) This parameter limits maximal quantity of attack. The aicraft/group will not make more attack than allowed even if the target group not destroyed and the aicraft/group still have ammo. If not defined the aircraft/group will attack target until it will be destroyed or until the aircraft/group will run out of ammo. --- @param DCSTypes#Azimuth Direction (optional) Desired ingress direction from the target to the attacking aircraft. Group/aircraft will make its attacks from the direction. Of course if there is no way to attack from the direction due the terrain group/aircraft will choose another direction. --- @param #boolean AttackQtyLimit (optional) The flag determines how to interpret attackQty parameter. If the flag is true then attackQty is a limit on maximal attack quantity for "AttackGroup" and "AttackUnit" tasks. If the flag is false then attackQty is a desired attack quantity for "Bombing" and "BombingRunway" tasks. --- @param #boolean GroupAttack (optional) Flag indicates that the target must be engaged by all aircrafts of the group. Has effect only if the task is assigned to a group, not to a single aircraft. --- @return DCSTask#Task The DCS task structure. -function GROUP:TaskAttackUnit( AttackUnit, WeaponType, WeaponExpend, AttackQty, Direction, AttackQtyLimit, GroupAttack ) - self:F2( { self.GroupName, AttackUnit, WeaponType, WeaponExpend, AttackQty, Direction, AttackQtyLimit, GroupAttack } ) - - -- AttackUnit = { - -- id = 'AttackUnit', - -- params = { - -- unitId = Unit.ID, - -- weaponType = number, - -- expend = enum AI.Task.WeaponExpend - -- attackQty = number, - -- direction = Azimuth, - -- attackQtyLimit = boolean, - -- groupAttack = boolean, - -- } - -- } - - local DCSTask - DCSTask = { id = 'AttackUnit', - params = { - unitId = AttackUnit:GetID(), - weaponType = WeaponType, - expend = WeaponExpend, - attackQty = AttackQty, - direction = Direction, - attackQtyLimit = AttackQtyLimit, - groupAttack = GroupAttack, - }, - }, - - self:T3( { DCSTask } ) - return DCSTask -end - - ---- (AIR) Delivering weapon at the point on the ground. --- @param #GROUP self --- @param DCSTypes#Vec2 PointVec2 2D-coordinates of the point to deliver weapon at. --- @param #number WeaponType (optional) Bitmask of weapon types those allowed to use. If parameter is not defined that means no limits on weapon usage. --- @param DCSTypes#AI.Task.WeaponExpend WeaponExpend (optional) Determines how much weapon will be released at each attack. If parameter is not defined the unit / group will choose expend on its own discretion. --- @param #number AttackQty (optional) Desired quantity of passes. The parameter is not the same in AttackGroup and AttackUnit tasks. --- @param DCSTypes#Azimuth Direction (optional) Desired ingress direction from the target to the attacking aircraft. Group/aircraft will make its attacks from the direction. Of course if there is no way to attack from the direction due the terrain group/aircraft will choose another direction. --- @param #boolean GroupAttack (optional) Flag indicates that the target must be engaged by all aircrafts of the group. Has effect only if the task is assigned to a group, not to a single aircraft. --- @return DCSTask#Task The DCS task structure. -function GROUP:TaskBombing( PointVec2, WeaponType, WeaponExpend, AttackQty, Direction, GroupAttack ) - self:F2( { self.GroupName, PointVec2, WeaponType, WeaponExpend, AttackQty, Direction, GroupAttack } ) - --- Bombing = { --- id = 'Bombing', --- params = { --- point = Vec2, --- weaponType = number, --- expend = enum AI.Task.WeaponExpend, --- attackQty = number, --- direction = Azimuth, --- groupAttack = boolean, --- } --- } - - local DCSTask - DCSTask = { id = 'Bombing', - params = { - point = PointVec2, - weaponType = WeaponType, - expend = WeaponExpend, - attackQty = AttackQty, - direction = Direction, - groupAttack = GroupAttack, - }, - }, - - self:T3( { DCSTask } ) - return DCSTask -end - ---- (AIR) Orbit at a specified position at a specified alititude during a specified duration with a specified speed. --- @param #GROUP self --- @param DCSTypes#Vec2 Point The point to hold the position. --- @param #number Altitude The altitude to hold the position. --- @param #number Speed The speed flying when holding the position. --- @return #GROUP self -function GROUP:TaskOrbitCircleAtVec2( Point, Altitude, Speed ) - self:F2( { self.GroupName, Point, Altitude, Speed } ) - - -- pattern = enum AI.Task.OribtPattern, - -- point = Vec2, - -- point2 = Vec2, - -- speed = Distance, - -- altitude = Distance - - local LandHeight = land.getHeight( Point ) - - self:T3( { LandHeight } ) - - local DCSTask = { id = 'Orbit', - params = { pattern = AI.Task.OrbitPattern.CIRCLE, - point = Point, - speed = Speed, - altitude = Altitude + LandHeight - } - } - - - -- local AITask = { id = 'ControlledTask', - -- params = { task = { id = 'Orbit', - -- params = { pattern = AI.Task.OrbitPattern.CIRCLE, - -- point = Point, - -- speed = Speed, - -- altitude = Altitude + LandHeight - -- } - -- }, - -- stopCondition = { duration = Duration - -- } - -- } - -- } - -- ) - - return DCSTask -end - ---- (AIR) Orbit at the current position of the first unit of the group at a specified alititude --- @param #GROUP self --- @param #number Altitude The altitude to hold the position. --- @param #number Speed The speed flying when holding the position. --- @return #GROUP self -function GROUP:TaskOrbitCircle( Altitude, Speed ) - self:F2( { self.GroupName, Altitude, Speed } ) - - local DCSGroup = self:GetDCSGroup() - - if DCSGroup then - local GroupPoint = self:GetPointVec2() - return self:TaskOrbitCircleAtVec2( GroupPoint, Altitude, Speed ) - end - - return nil -end - - - ---- (AIR) Hold position at the current position of the first unit of the group. --- @param #GROUP self --- @param #number Duration The maximum duration in seconds to hold the position. --- @return #GROUP self -function GROUP:TaskHoldPosition() - self:F2( { self.GroupName } ) - - return self:TaskOrbitCircle( 30, 10 ) -end - - - - ---- (AIR) Attacking the map object (building, structure, e.t.c). --- @param #GROUP self --- @param DCSTypes#Vec2 PointVec2 2D-coordinates of the point the map object is closest to. The distance between the point and the map object must not be greater than 2000 meters. Object id is not used here because Mission Editor doesn't support map object identificators. --- @param #number WeaponType (optional) Bitmask of weapon types those allowed to use. If parameter is not defined that means no limits on weapon usage. --- @param DCSTypes#AI.Task.WeaponExpend WeaponExpend (optional) Determines how much weapon will be released at each attack. If parameter is not defined the unit / group will choose expend on its own discretion. --- @param #number AttackQty (optional) This parameter limits maximal quantity of attack. The aicraft/group will not make more attack than allowed even if the target group not destroyed and the aicraft/group still have ammo. If not defined the aircraft/group will attack target until it will be destroyed or until the aircraft/group will run out of ammo. --- @param DCSTypes#Azimuth Direction (optional) Desired ingress direction from the target to the attacking aircraft. Group/aircraft will make its attacks from the direction. Of course if there is no way to attack from the direction due the terrain group/aircraft will choose another direction. --- @param #boolean GroupAttack (optional) Flag indicates that the target must be engaged by all aircrafts of the group. Has effect only if the task is assigned to a group, not to a single aircraft. --- @return DCSTask#Task The DCS task structure. -function GROUP:TaskAttackMapObject( PointVec2, WeaponType, WeaponExpend, AttackQty, Direction, GroupAttack ) - self:F2( { self.GroupName, PointVec2, WeaponType, WeaponExpend, AttackQty, Direction, GroupAttack } ) - --- AttackMapObject = { --- id = 'AttackMapObject', --- params = { --- point = Vec2, --- weaponType = number, --- expend = enum AI.Task.WeaponExpend, --- attackQty = number, --- direction = Azimuth, --- groupAttack = boolean, --- } --- } - - local DCSTask - DCSTask = { id = 'AttackMapObject', - params = { - point = PointVec2, - weaponType = WeaponType, - expend = WeaponExpend, - attackQty = AttackQty, - direction = Direction, - groupAttack = GroupAttack, - }, - }, - - self:T3( { DCSTask } ) - return DCSTask -end - - ---- (AIR) Delivering weapon on the runway. --- @param #GROUP self --- @param Airbase#AIRBASE Airbase Airbase to attack. --- @param #number WeaponType (optional) Bitmask of weapon types those allowed to use. If parameter is not defined that means no limits on weapon usage. --- @param DCSTypes#AI.Task.WeaponExpend WeaponExpend (optional) Determines how much weapon will be released at each attack. If parameter is not defined the unit / group will choose expend on its own discretion. --- @param #number AttackQty (optional) This parameter limits maximal quantity of attack. The aicraft/group will not make more attack than allowed even if the target group not destroyed and the aicraft/group still have ammo. If not defined the aircraft/group will attack target until it will be destroyed or until the aircraft/group will run out of ammo. --- @param DCSTypes#Azimuth Direction (optional) Desired ingress direction from the target to the attacking aircraft. Group/aircraft will make its attacks from the direction. Of course if there is no way to attack from the direction due the terrain group/aircraft will choose another direction. --- @param #boolean GroupAttack (optional) Flag indicates that the target must be engaged by all aircrafts of the group. Has effect only if the task is assigned to a group, not to a single aircraft. --- @return DCSTask#Task The DCS task structure. -function GROUP:TaskBombingRunway( Airbase, WeaponType, WeaponExpend, AttackQty, Direction, GroupAttack ) - self:F2( { self.GroupName, Airbase, WeaponType, WeaponExpend, AttackQty, Direction, GroupAttack } ) - --- BombingRunway = { --- id = 'BombingRunway', --- params = { --- runwayId = AirdromeId, --- weaponType = number, --- expend = enum AI.Task.WeaponExpend, --- attackQty = number, --- direction = Azimuth, --- groupAttack = boolean, --- } --- } - - local DCSTask - DCSTask = { id = 'BombingRunway', - params = { - point = Airbase:GetID(), - weaponType = WeaponType, - expend = WeaponExpend, - attackQty = AttackQty, - direction = Direction, - groupAttack = GroupAttack, - }, - }, - - self:T3( { DCSTask } ) - return DCSTask -end - - ---- (AIR) Refueling from the nearest tanker. No parameters. --- @param #GROUP self --- @return DCSTask#Task The DCS task structure. -function GROUP:TaskRefueling() - self:F2( { self.GroupName } ) - --- Refueling = { --- id = 'Refueling', --- params = {} --- } - - local DCSTask - DCSTask = { id = 'Refueling', - params = { - }, - }, - - self:T3( { DCSTask } ) - return DCSTask -end - - ---- (AIR HELICOPTER) Landing at the ground. For helicopters only. --- @param #GROUP self --- @param DCSTypes#Vec2 Point The point where to land. --- @param #number Duration The duration in seconds to stay on the ground. --- @return #GROUP self -function GROUP:TaskLandAtVec2( Point, Duration ) - self:F2( { self.GroupName, Point, Duration } ) - --- Land = { --- id= 'Land', --- params = { --- point = Vec2, --- durationFlag = boolean, --- duration = Time --- } --- } - - local DCSTask - if Duration and Duration > 0 then - DCSTask = { id = 'Land', - params = { - point = Point, - durationFlag = true, - duration = Duration, - }, - } - else - DCSTask = { id = 'Land', - params = { - point = Point, - durationFlag = false, - }, - } - end - - self:T3( DCSTask ) - return DCSTask -end - ---- (AIR) Land the group at a @{Zone#ZONE). --- @param #GROUP self --- @param Zone#ZONE Zone The zone where to land. --- @param #number Duration The duration in seconds to stay on the ground. --- @return #GROUP self -function GROUP:TaskLandAtZone( Zone, Duration, RandomPoint ) - self:F2( { self.GroupName, Zone, Duration, RandomPoint } ) - - local Point - if RandomPoint then - Point = Zone:GetRandomPointVec2() - else - Point = Zone:GetPointVec2() - end - - local DCSTask = self:TaskLandAtVec2( Point, Duration ) - - self:T3( DCSTask ) - return DCSTask -end - ---- (AIR) Following another airborne group. --- The unit / group will follow lead unit of another group, wingmens of both groups will continue following their leaders. --- If another group is on land the unit / group will orbit around. --- @param #GROUP self --- @param Group#GROUP FollowGroup The group to be followed. --- @param DCSTypes#Vec3 PointVec3 Position of the unit / lead unit of the group relative lead unit of another group in frame reference oriented by course of lead unit of another group. If another group is on land the unit / group will orbit around. --- @param #number LastWaypointIndex Detach waypoint of another group. Once reached the unit / group Follow task is finished. --- @return DCSTask#Task The DCS task structure. -function GROUP:TaskFollow( FollowGroup, PointVec3, LastWaypointIndex ) - self:F2( { self.GroupName, FollowGroup, PointVec3, LastWaypointIndex } ) - --- Follow = { --- id = 'Follow', --- params = { --- groupId = Group.ID, --- pos = Vec3, --- lastWptIndexFlag = boolean, --- lastWptIndex = number --- } --- } - - local LastWaypointIndexFlag = nil - if LastWaypointIndex then - LastWaypointIndexFlag = true - end - - local DCSTask - DCSTask = { id = 'Follow', - params = { - groupId = FollowGroup:GetID(), - pos = PointVec3, - lastWptIndexFlag = LastWaypointIndexFlag, - lastWptIndex = LastWaypointIndex, - }, - }, - - self:T3( { DCSTask } ) - return DCSTask -end - - ---- (AIR) Escort another airborne group. --- The unit / group will follow lead unit of another group, wingmens of both groups will continue following their leaders. --- The unit / group will also protect that group from threats of specified types. --- @param #GROUP self --- @param Group#GROUP EscortGroup The group to be escorted. --- @param DCSTypes#Vec3 PointVec3 Position of the unit / lead unit of the group relative lead unit of another group in frame reference oriented by course of lead unit of another group. If another group is on land the unit / group will orbit around. --- @param #number LastWaypointIndex Detach waypoint of another group. Once reached the unit / group Follow task is finished. --- @param #number EngagementDistanceMax Maximal distance from escorted group to threat. If the threat is already engaged by escort escort will disengage if the distance becomes greater than 1.5 * engagementDistMax. --- @param #list TargetTypes Array of AttributeName that is contains threat categories allowed to engage. --- @return DCSTask#Task The DCS task structure. -function GROUP:TaskEscort( FollowGroup, PointVec3, LastWaypointIndex, EngagementDistance, TargetTypes ) - self:F2( { self.GroupName, FollowGroup, PointVec3, LastWaypointIndex, EngagementDistance, TargetTypes } ) - --- Escort = { --- id = 'Escort', --- params = { --- groupId = Group.ID, --- pos = Vec3, --- lastWptIndexFlag = boolean, --- lastWptIndex = number, --- engagementDistMax = Distance, --- targetTypes = array of AttributeName, --- } --- } - - local LastWaypointIndexFlag = nil - if LastWaypointIndex then - LastWaypointIndexFlag = true - end - - local DCSTask - DCSTask = { id = 'Follow', - params = { - groupId = FollowGroup:GetID(), - pos = PointVec3, - lastWptIndexFlag = LastWaypointIndexFlag, - lastWptIndex = LastWaypointIndex, - engagementDistMax = EngagementDistance, - targetTypes = TargetTypes, - }, - }, - - self:T3( { DCSTask } ) - return DCSTask -end - - --- GROUND TASKS - ---- (GROUND) Fire at a VEC2 point until ammunition is finished. --- @param #GROUP self --- @param DCSTypes#Vec2 The point to fire at. --- @param DCSTypes#Distance Radius The radius of the zone to deploy the fire at. --- @return DCSTask#Task The DCS task structure. -function GROUP:TaskFireAtPoint( PointVec2, Radius ) - self:F2( { self.GroupName, PointVec2, Radius } ) - - -- FireAtPoint = { - -- id = 'FireAtPoint', - -- params = { - -- point = Vec2, - -- radius = Distance, - -- } - -- } - - local DCSTask - DCSTask = { id = 'FireAtPoint', - params = { - point = PointVec2, - radius = Radius, - } - } - - self:T3( { DCSTask } ) - return DCSTask -end - ---- (GROUND) Hold ground group from moving. --- @param #GROUP self --- @return DCSTask#Task The DCS task structure. -function GROUP:TaskHold() - self:F2( { self.GroupName } ) - --- Hold = { --- id = 'Hold', --- params = { --- } --- } - - local DCSTask - DCSTask = { id = 'Hold', - params = { - } - } - - self:T3( { DCSTask } ) - return DCSTask -end - --- TASKS FOR AIRBORNE AND GROUND UNITS/GROUPS - ---- (AIR + GROUND) The task makes the group/unit a FAC and orders the FAC to control the target (enemy ground group) destruction. --- The killer is player-controlled allied CAS-aircraft that is in contact with the FAC. --- If the task is assigned to the group lead unit will be a FAC. --- @param #GROUP self --- @param Group#GROUP AttackGroup Target GROUP. --- @param #number WeaponType Bitmask of weapon types those allowed to use. If parameter is not defined that means no limits on weapon usage. --- @param DCSTypes#AI.Task.Designation Designation (optional) Designation type. --- @param #boolean Datalink (optional) Allows to use datalink to send the target information to attack aircraft. Enabled by default. --- @return DCSTask#Task The DCS task structure. -function GROUP:TaskFAC_AttackGroup( AttackGroup, WeaponType, Designation, Datalink ) - self:F2( { self.GroupName, AttackGroup, WeaponType, Designation, Datalink } ) - --- FAC_AttackGroup = { --- id = 'FAC_AttackGroup', --- params = { --- groupId = Group.ID, --- weaponType = number, --- designation = enum AI.Task.Designation, --- datalink = boolean --- } --- } - - local DCSTask - DCSTask = { id = 'FAC_AttackGroup', - params = { - groupId = AttackGroup:GetID(), - weaponType = WeaponType, - designation = Designation, - datalink = Datalink, - } - } - - self:T3( { DCSTask } ) - return DCSTask -end - --- EN-ROUTE TASKS FOR AIRBORNE GROUPS - ---- (AIR) Engaging targets of defined types. --- @param #GROUP self --- @param DCSTypes#Distance Distance Maximal distance from the target to a route leg. If the target is on a greater distance it will be ignored. --- @param #list<#DCSTypes#AttributeName> TargetTypes Array of target categories allowed to engage. --- @param #number Priority All enroute tasks have the priority parameter. This is a number (less value - higher priority) that determines actions related to what task will be performed first. --- @return DCSTask#Task The DCS task structure. -function GROUP:EnRouteTaskEngageTargets( Distance, TargetTypes, Priority ) - self:F2( { self.GroupName, Distance, TargetTypes, Priority } ) - --- EngageTargets ={ --- id = 'EngageTargets', --- params = { --- maxDist = Distance, --- targetTypes = array of AttributeName, --- priority = number --- } --- } - - local DCSTask - DCSTask = { id = 'EngageTargets', - params = { - maxDist = Distance, - targetTypes = TargetTypes, - priority = Priority - } - } - - self:T3( { DCSTask } ) - return DCSTask -end - - ---- (AIR) Engaging a targets of defined types at circle-shaped zone. --- @param #GROUP self --- @param DCSTypes#Vec2 PointVec2 2D-coordinates of the zone. --- @param DCSTypes#Distance Radius Radius of the zone. --- @param #list<#DCSTypes#AttributeName> TargetTypes Array of target categories allowed to engage. --- @param #number Priority All en-route tasks have the priority parameter. This is a number (less value - higher priority) that determines actions related to what task will be performed first. --- @return DCSTask#Task The DCS task structure. -function GROUP:EnRouteTaskEngageTargets( PointVec2, Radius, TargetTypes, Priority ) - self:F2( { self.GroupName, PointVec2, Radius, TargetTypes, Priority } ) - --- EngageTargetsInZone = { --- id = 'EngageTargetsInZone', --- params = { --- point = Vec2, --- zoneRadius = Distance, --- targetTypes = array of AttributeName, --- priority = number --- } --- } - - local DCSTask - DCSTask = { id = 'EngageTargetsInZone', - params = { - point = PointVec2, - zoneRadius = Radius, - targetTypes = TargetTypes, - priority = Priority - } - } - - self:T3( { DCSTask } ) - return DCSTask -end - ---- (AIR) Engaging a group. The task does not assign the target group to the unit/group to attack now; it just allows the unit/group to engage the target group as well as other assigned targets. --- @param #GROUP self --- @param Group#GROUP AttackGroup The Group to be attacked. --- @param #number Priority All en-route tasks have the priority parameter. This is a number (less value - higher priority) that determines actions related to what task will be performed first. --- @param #number WeaponType (optional) Bitmask of weapon types those allowed to use. If parameter is not defined that means no limits on weapon usage. --- @param DCSTypes#AI.Task.WeaponExpend WeaponExpend (optional) Determines how much weapon will be released at each attack. If parameter is not defined the unit / group will choose expend on its own discretion. --- @param #number AttackQty (optional) This parameter limits maximal quantity of attack. The aicraft/group will not make more attack than allowed even if the target group not destroyed and the aicraft/group still have ammo. If not defined the aircraft/group will attack target until it will be destroyed or until the aircraft/group will run out of ammo. --- @param DCSTypes#Azimuth Direction (optional) Desired ingress direction from the target to the attacking aircraft. Group/aircraft will make its attacks from the direction. Of course if there is no way to attack from the direction due the terrain group/aircraft will choose another direction. --- @param DCSTypes#Distance Altitude (optional) Desired attack start altitude. Group/aircraft will make its attacks from the altitude. If the altitude is too low or too high to use weapon aircraft/group will choose closest altitude to the desired attack start altitude. If the desired altitude is defined group/aircraft will not attack from safe altitude. --- @param #boolean AttackQtyLimit (optional) The flag determines how to interpret attackQty parameter. If the flag is true then attackQty is a limit on maximal attack quantity for "AttackGroup" and "AttackUnit" tasks. If the flag is false then attackQty is a desired attack quantity for "Bombing" and "BombingRunway" tasks. --- @return DCSTask#Task The DCS task structure. -function GROUP:EnRouteTaskEngageGroup( AttackGroup, Priority, WeaponType, WeaponExpend, AttackQty, Direction, Altitude, AttackQtyLimit ) - self:F2( { self.GroupName, AttackGroup, Priority, WeaponType, WeaponExpend, AttackQty, Direction, Altitude, AttackQtyLimit } ) - - -- EngageGroup = { - -- id = 'EngageGroup ', - -- params = { - -- groupId = Group.ID, - -- weaponType = number, - -- expend = enum AI.Task.WeaponExpend, - -- attackQty = number, - -- directionEnabled = boolean, - -- direction = Azimuth, - -- altitudeEnabled = boolean, - -- altitude = Distance, - -- attackQtyLimit = boolean, - -- priority = number, - -- } - -- } - - local DirectionEnabled = nil - if Direction then - DirectionEnabled = true - end - - local AltitudeEnabled = nil - if Altitude then - AltitudeEnabled = true - end - - local DCSTask - DCSTask = { id = 'EngageGroup', - params = { - groupId = AttackGroup:GetID(), - weaponType = WeaponType, - expend = WeaponExpend, - attackQty = AttackQty, - directionEnabled = DirectionEnabled, - direction = Direction, - altitudeEnabled = AltitudeEnabled, - altitude = Altitude, - attackQtyLimit = AttackQtyLimit, - priority = Priority, - }, - }, - - self:T3( { DCSTask } ) - return DCSTask -end - - ---- (AIR) Attack the Unit. --- @param #GROUP self --- @param Unit#UNIT AttackUnit The UNIT. --- @param #number Priority All en-route tasks have the priority parameter. This is a number (less value - higher priority) that determines actions related to what task will be performed first. --- @param #number WeaponType (optional) Bitmask of weapon types those allowed to use. If parameter is not defined that means no limits on weapon usage. --- @param DCSTypes#AI.Task.WeaponExpend WeaponExpend (optional) Determines how much weapon will be released at each attack. If parameter is not defined the unit / group will choose expend on its own discretion. --- @param #number AttackQty (optional) This parameter limits maximal quantity of attack. The aicraft/group will not make more attack than allowed even if the target group not destroyed and the aicraft/group still have ammo. If not defined the aircraft/group will attack target until it will be destroyed or until the aircraft/group will run out of ammo. --- @param DCSTypes#Azimuth Direction (optional) Desired ingress direction from the target to the attacking aircraft. Group/aircraft will make its attacks from the direction. Of course if there is no way to attack from the direction due the terrain group/aircraft will choose another direction. --- @param #boolean AttackQtyLimit (optional) The flag determines how to interpret attackQty parameter. If the flag is true then attackQty is a limit on maximal attack quantity for "AttackGroup" and "AttackUnit" tasks. If the flag is false then attackQty is a desired attack quantity for "Bombing" and "BombingRunway" tasks. --- @param #boolean GroupAttack (optional) Flag indicates that the target must be engaged by all aircrafts of the group. Has effect only if the task is assigned to a group, not to a single aircraft. --- @return DCSTask#Task The DCS task structure. -function GROUP:EnRouteTaskEngageUnit( AttackUnit, Priority, WeaponType, WeaponExpend, AttackQty, Direction, AttackQtyLimit, GroupAttack ) - self:F2( { self.GroupName, AttackUnit, Priority, WeaponType, WeaponExpend, AttackQty, Direction, AttackQtyLimit, GroupAttack } ) - - -- EngageUnit = { - -- id = 'EngageUnit', - -- params = { - -- unitId = Unit.ID, - -- weaponType = number, - -- expend = enum AI.Task.WeaponExpend - -- attackQty = number, - -- direction = Azimuth, - -- attackQtyLimit = boolean, - -- groupAttack = boolean, - -- priority = number, - -- } - -- } - - local DCSTask - DCSTask = { id = 'EngageUnit', - params = { - unitId = AttackUnit:GetID(), - weaponType = WeaponType, - expend = WeaponExpend, - attackQty = AttackQty, - direction = Direction, - attackQtyLimit = AttackQtyLimit, - groupAttack = GroupAttack, - priority = Priority, - }, - }, - - self:T3( { DCSTask } ) - return DCSTask -end - - ---- (AIR) Aircraft will act as an AWACS for friendly units (will provide them with information about contacts). No parameters. --- @param #GROUP self --- @return DCSTask#Task The DCS task structure. -function GROUP:EnRouteTaskAWACS( ) - self:F2( { self.GroupName } ) - --- AWACS = { --- id = 'AWACS', --- params = { --- } --- } - - local DCSTask - DCSTask = { id = 'AWACS', - params = { - } - } - - self:T3( { DCSTask } ) - return DCSTask -end - - ---- (AIR) Aircraft will act as a tanker for friendly units. No parameters. --- @param #GROUP self --- @return DCSTask#Task The DCS task structure. -function GROUP:EnRouteTaskTanker( ) - self:F2( { self.GroupName } ) - --- Tanker = { --- id = 'Tanker', --- params = { --- } --- } - - local DCSTask - DCSTask = { id = 'Tanker', - params = { - } - } - - self:T3( { DCSTask } ) - return DCSTask -end - - --- En-route tasks for ground units/groups - ---- (GROUND) Ground unit (EW-radar) will act as an EWR for friendly units (will provide them with information about contacts). No parameters. --- @param #GROUP self --- @return DCSTask#Task The DCS task structure. -function GROUP:EnRouteTaskEWR( ) - self:F2( { self.GroupName } ) - --- EWR = { --- id = 'EWR', --- params = { --- } --- } - - local DCSTask - DCSTask = { id = 'EWR', - params = { - } - } - - self:T3( { DCSTask } ) - return DCSTask -end - - --- En-route tasks for airborne and ground units/groups - ---- (AIR + GROUND) The task makes the group/unit a FAC and lets the FAC to choose the target (enemy ground group) as well as other assigned targets. --- The killer is player-controlled allied CAS-aircraft that is in contact with the FAC. --- If the task is assigned to the group lead unit will be a FAC. --- @param #GROUP self --- @param Group#GROUP AttackGroup Target GROUP. --- @param #number Priority All en-route tasks have the priority parameter. This is a number (less value - higher priority) that determines actions related to what task will be performed first. --- @param #number WeaponType Bitmask of weapon types those allowed to use. If parameter is not defined that means no limits on weapon usage. --- @param DCSTypes#AI.Task.Designation Designation (optional) Designation type. --- @param #boolean Datalink (optional) Allows to use datalink to send the target information to attack aircraft. Enabled by default. --- @return DCSTask#Task The DCS task structure. -function GROUP:EnRouteTaskFAC_EngageGroup( AttackGroup, Priority, WeaponType, Designation, Datalink ) - self:F2( { self.GroupName, AttackGroup, WeaponType, Priority, Designation, Datalink } ) - --- FAC_EngageGroup = { --- id = 'FAC_EngageGroup', --- params = { --- groupId = Group.ID, --- weaponType = number, --- designation = enum AI.Task.Designation, --- datalink = boolean, --- priority = number, --- } --- } - - local DCSTask - DCSTask = { id = 'FAC_EngageGroup', - params = { - groupId = AttackGroup:GetID(), - weaponType = WeaponType, - designation = Designation, - datalink = Datalink, - priority = Priority, - } - } - - self:T3( { DCSTask } ) - return DCSTask -end - - ---- (AIR + GROUND) The task makes the group/unit a FAC and lets the FAC to choose a targets (enemy ground group) around as well as other assigned targets. --- The killer is player-controlled allied CAS-aircraft that is in contact with the FAC. --- If the task is assigned to the group lead unit will be a FAC. --- @param #GROUP self --- @param DCSTypes#Distance Radius The maximal distance from the FAC to a target. --- @param #number Priority All en-route tasks have the priority parameter. This is a number (less value - higher priority) that determines actions related to what task will be performed first. --- @return DCSTask#Task The DCS task structure. -function GROUP:EnRouteTaskFAC( Radius, Priority ) - self:F2( { self.GroupName, Radius, Priority } ) - --- FAC = { --- id = 'FAC', --- params = { --- radius = Distance, --- priority = number --- } --- } - - local DCSTask - DCSTask = { id = 'FAC', - params = { - radius = Radius, - priority = Priority - } - } - - self:T3( { DCSTask } ) - return DCSTask -end - - - - ---- Move the group to a Vec2 Point, wait for a defined duration and embark a group. --- @param #GROUP self --- @param DCSTypes#Vec2 Point The point where to wait. --- @param #number Duration The duration in seconds to wait. --- @param #GROUP EmbarkingGroup The group to be embarked. --- @return DCSTask#Task The DCS task structure -function GROUP:TaskEmbarkingAtVec2( Point, Duration, EmbarkingGroup ) - self:F2( { self.GroupName, Point, Duration, EmbarkingGroup.DCSGroup } ) - - local DCSTask - DCSTask = { id = 'Embarking', - params = { x = Point.x, - y = Point.y, - duration = Duration, - groupsForEmbarking = { EmbarkingGroup.GroupID }, - durationFlag = true, - distributionFlag = false, - distribution = {}, - } - } - - self:T3( { DCSTask } ) - return DCSTask -end - ---- Move to a defined Vec2 Point, and embark to a group when arrived within a defined Radius. --- @param #GROUP self --- @param DCSTypes#Vec2 Point The point where to wait. --- @param #number Radius The radius of the embarking zone around the Point. --- @return DCSTask#Task The DCS task structure. -function GROUP:TaskEmbarkToTransportAtVec2( Point, Radius ) - self:F2( { self.GroupName, Point, Radius } ) - - local DCSTask --DCSTask#Task - DCSTask = { id = 'EmbarkToTransport', - params = { x = Point.x, - y = Point.y, - zoneRadius = Radius, - } - } - - self:T3( { DCSTask } ) - return DCSTask -end - ---- Return a Misson task from a mission template. --- @param #GROUP self --- @param #table TaskMission A table containing the mission task. --- @return DCSTask#Task -function GROUP:TaskMission( TaskMission ) - self:F2( Points ) - - local DCSTask - DCSTask = { id = 'Mission', params = { TaskMission, }, } - - self:T3( { DCSTask } ) - return DCSTask -end - ---- Return a Misson task to follow a given route defined by Points. --- @param #GROUP self --- @param #table Points A table of route points. --- @return DCSTask#Task -function GROUP:TaskRoute( Points ) - self:F2( Points ) - - local DCSTask - DCSTask = { id = 'Mission', params = { route = { points = Points, }, }, } - - self:T3( { DCSTask } ) - return DCSTask -end - ---- Make the DCS Group to fly to a given point and hover. --- @param #GROUP self --- @param DCSTypes#Vec3 Point The destination point in Vec3 format. --- @param #number Speed The speed to travel. --- @return #GROUP self -function GROUP:TaskRouteToVec2( Point, Speed ) - self:F2( { Point, Speed } ) - - local GroupPoint = self:GetUnit( 1 ):GetPointVec2() - - local PointFrom = {} - PointFrom.x = GroupPoint.x - PointFrom.y = GroupPoint.y - PointFrom.type = "Turning Point" - PointFrom.action = "Turning Point" - PointFrom.speed = Speed - PointFrom.speed_locked = true - PointFrom.properties = { - ["vnav"] = 1, - ["scale"] = 0, - ["angle"] = 0, - ["vangle"] = 0, - ["steer"] = 2, - } - - - local PointTo = {} - PointTo.x = Point.x - PointTo.y = Point.y - PointTo.type = "Turning Point" - PointTo.action = "Fly Over Point" - PointTo.speed = Speed - PointTo.speed_locked = true - PointTo.properties = { - ["vnav"] = 1, - ["scale"] = 0, - ["angle"] = 0, - ["vangle"] = 0, - ["steer"] = 2, - } - - - local Points = { PointFrom, PointTo } - - self:T3( Points ) - - self:Route( Points ) - - return self -end - ---- Make the DCS Group to fly to a given point and hover. --- @param #GROUP self --- @param DCSTypes#Vec3 Point The destination point in Vec3 format. --- @param #number Speed The speed to travel. --- @return #GROUP self -function GROUP:TaskRouteToVec3( Point, Speed ) - self:F2( { Point, Speed } ) - - local GroupPoint = self:GetUnit( 1 ):GetPointVec3() - - local PointFrom = {} - PointFrom.x = GroupPoint.x - PointFrom.y = GroupPoint.z - PointFrom.alt = GroupPoint.y - PointFrom.alt_type = "BARO" - PointFrom.type = "Turning Point" - PointFrom.action = "Turning Point" - PointFrom.speed = Speed - PointFrom.speed_locked = true - PointFrom.properties = { - ["vnav"] = 1, - ["scale"] = 0, - ["angle"] = 0, - ["vangle"] = 0, - ["steer"] = 2, - } - - - local PointTo = {} - PointTo.x = Point.x - PointTo.y = Point.z - PointTo.alt = Point.y - PointTo.alt_type = "BARO" - PointTo.type = "Turning Point" - PointTo.action = "Fly Over Point" - PointTo.speed = Speed - PointTo.speed_locked = true - PointTo.properties = { - ["vnav"] = 1, - ["scale"] = 0, - ["angle"] = 0, - ["vangle"] = 0, - ["steer"] = 2, - } - - - local Points = { PointFrom, PointTo } - - self:T3( Points ) - - self:Route( Points ) - - return self -end - - - ---- Make the group to follow a given route. --- @param #GROUP self --- @param #table GoPoints A table of Route Points. --- @return #GROUP self -function GROUP:Route( GoPoints ) - self:F2( GoPoints ) - - local DCSGroup = self:GetDCSGroup() - - if DCSGroup then - local Points = routines.utils.deepCopy( GoPoints ) - local MissionTask = { id = 'Mission', params = { route = { points = Points, }, }, } - local Controller = self:_GetController() - --Controller.setTask( Controller, MissionTask ) - --routines.scheduleFunction( Controller.setTask, { Controller, MissionTask}, timer.getTime() + 1 ) - SCHEDULER:New( Controller, Controller.setTask, { MissionTask }, 1 ) - return self - end - - return nil -end - - - ---- Route the group to a given zone. --- The group final destination point can be randomized. --- A speed can be given in km/h. --- A given formation can be given. --- @param #GROUP self --- @param Zone#ZONE Zone The zone where to route to. --- @param #boolean Randomize Defines whether to target point gets randomized within the Zone. --- @param #number Speed The speed. --- @param Base#FORMATION Formation The formation string. -function GROUP:TaskRouteToZone( Zone, Randomize, Speed, Formation ) - self:F2( Zone ) - - local DCSGroup = self:GetDCSGroup() - - if DCSGroup then - - local GroupPoint = self:GetPointVec2() - - local PointFrom = {} - PointFrom.x = GroupPoint.x - PointFrom.y = GroupPoint.y - PointFrom.type = "Turning Point" - PointFrom.action = "Cone" - PointFrom.speed = 20 / 1.6 - - - local PointTo = {} - local ZonePoint - - if Randomize then - ZonePoint = Zone:GetRandomPointVec2() - else - ZonePoint = Zone:GetPointVec2() - end - - PointTo.x = ZonePoint.x - PointTo.y = ZonePoint.y - PointTo.type = "Turning Point" - - if Formation then - PointTo.action = Formation - else - PointTo.action = "Cone" - end - - if Speed then - PointTo.speed = Speed - else - PointTo.speed = 20 / 1.6 - end - - local Points = { PointFrom, PointTo } - - self:T3( Points ) - - self:Route( Points ) - - return self - end - - return nil -end - --- Commands - ---- Do Script command --- @param #GROUP self --- @param #string DoScript --- @return #DCSCommand -function GROUP:CommandDoScript( DoScript ) - - local DCSDoScript = { - id = "Script", - params = { - command = DoScript, - }, - } - - self:T3( DCSDoScript ) - return DCSDoScript -end - - ---- Return the mission template of the group. --- @param #GROUP self --- @return #table The MissionTemplate -function GROUP:GetTaskMission() - self:F2( self.GroupName ) - - return routines.utils.deepCopy( _DATABASE.Templates.Groups[self.GroupName].Template ) -end - ---- Return the mission route of the group. --- @param #GROUP self --- @return #table The mission route defined by points. -function GROUP:GetTaskRoute() - self:F2( self.GroupName ) - - return routines.utils.deepCopy( _DATABASE.Templates.Groups[self.GroupName].Template.route.points ) -end - ---- Return the route of a group by using the @{Database#DATABASE} class. --- @param #GROUP self --- @param #number Begin The route point from where the copy will start. The base route point is 0. --- @param #number End The route point where the copy will end. The End point is the last point - the End point. The last point has base 0. --- @param #boolean Randomize Randomization of the route, when true. --- @param #number Radius When randomization is on, the randomization is within the radius. -function GROUP:CopyRoute( Begin, End, Randomize, Radius ) - self:F2( { Begin, End } ) - - local Points = {} - - -- Could be a Spawned Group - local GroupName = string.match( self:GetName(), ".*#" ) - if GroupName then - GroupName = GroupName:sub( 1, -2 ) - else - GroupName = self:GetName() - end - - self:T3( { GroupName } ) - - local Template = _DATABASE.Templates.Groups[GroupName].Template - - if Template then - if not Begin then - Begin = 0 - end - if not End then - End = 0 - end - - for TPointID = Begin + 1, #Template.route.points - End do - if Template.route.points[TPointID] then - Points[#Points+1] = routines.utils.deepCopy( Template.route.points[TPointID] ) - if Randomize then - if not Radius then - Radius = 500 - end - Points[#Points].x = Points[#Points].x + math.random( Radius * -1, Radius ) - Points[#Points].y = Points[#Points].y + math.random( Radius * -1, Radius ) - end - end - end - return Points - end - - return nil -end - - -function GROUP:GetDetectedTargets() - self:F2( self.GroupName ) - - local DCSGroup = self:GetDCSGroup() - if DCSGroup then - return self:_GetController():getDetectedTargets() - end - - return nil -end - -function GROUP:IsTargetDetected( DCSObject ) - self:F2( self.GroupName ) - - local DCSGroup = self:GetDCSGroup() - if DCSGroup then - - local TargetIsDetected, TargetIsVisible, TargetLastTime, TargetKnowType, TargetKnowDistance, TargetLastPos, TargetLastVelocity - = self:_GetController().isTargetDetected( self:_GetController(), DCSObject, - Controller.Detection.VISUAL, - Controller.Detection.OPTIC, - Controller.Detection.RADAR, - Controller.Detection.IRST, - Controller.Detection.RWR, - Controller.Detection.DLINK - ) - return TargetIsDetected, TargetIsVisible, TargetLastTime, TargetKnowType, TargetKnowDistance, TargetLastPos, TargetLastVelocity - end - - return nil -end - --- Options - ---- Can the GROUP hold their weapons? --- @param #GROUP self --- @return #boolean -function GROUP:OptionROEHoldFirePossible() - self:F2( { self.GroupName } ) - - local DCSGroup = self:GetDCSGroup() - if DCSGroup then - if self:IsAir() or self:IsGround() or self:IsShip() then - return true - end - - return false - end - - return nil -end - ---- Holding weapons. --- @param Group#GROUP self --- @return Group#GROUP self -function GROUP:OptionROEHoldFire() - self:F2( { self.GroupName } ) - - local DCSGroup = self:GetDCSGroup() - if DCSGroup then - local Controller = self:_GetController() - - if self:IsAir() then - Controller:setOption( AI.Option.Air.id.ROE, AI.Option.Air.val.ROE.WEAPON_HOLD ) - elseif self:IsGround() then - Controller:setOption( AI.Option.Ground.id.ROE, AI.Option.Ground.val.ROE.WEAPON_HOLD ) - elseif self:IsShip() then - Controller:setOption( AI.Option.Naval.id.ROE, AI.Option.Naval.val.ROE.WEAPON_HOLD ) - end - - return self - end - - return nil -end - ---- Can the GROUP attack returning on enemy fire? --- @param #GROUP self --- @return #boolean -function GROUP:OptionROEReturnFirePossible() - self:F2( { self.GroupName } ) - - local DCSGroup = self:GetDCSGroup() - if DCSGroup then - if self:IsAir() or self:IsGround() or self:IsShip() then - return true - end - - return false - end - - return nil -end - ---- Return fire. --- @param #GROUP self --- @return #GROUP self -function GROUP:OptionROEReturnFire() - self:F2( { self.GroupName } ) - - local DCSGroup = self:GetDCSGroup() - if DCSGroup then - local Controller = self:_GetController() - - if self:IsAir() then - Controller:setOption( AI.Option.Air.id.ROE, AI.Option.Air.val.ROE.RETURN_FIRE ) - elseif self:IsGround() then - Controller:setOption( AI.Option.Ground.id.ROE, AI.Option.Ground.val.ROE.RETURN_FIRE ) - elseif self:IsShip() then - Controller:setOption( AI.Option.Naval.id.ROE, AI.Option.Naval.val.ROE.RETURN_FIRE ) - end - - return self - end - - return nil -end - ---- Can the GROUP attack designated targets? --- @param #GROUP self --- @return #boolean -function GROUP:OptionROEOpenFirePossible() - self:F2( { self.GroupName } ) - - local DCSGroup = self:GetDCSGroup() - if DCSGroup then - if self:IsAir() or self:IsGround() or self:IsShip() then - return true - end - - return false - end - - return nil -end - ---- Openfire. --- @param #GROUP self --- @return #GROUP self -function GROUP:OptionROEOpenFire() - self:F2( { self.GroupName } ) - - local DCSGroup = self:GetDCSGroup() - if DCSGroup then - local Controller = self:_GetController() - - if self:IsAir() then - Controller:setOption( AI.Option.Air.id.ROE, AI.Option.Air.val.ROE.OPEN_FIRE ) - elseif self:IsGround() then - Controller:setOption( AI.Option.Ground.id.ROE, AI.Option.Ground.val.ROE.OPEN_FIRE ) - elseif self:IsShip() then - Controller:setOption( AI.Option.Naval.id.ROE, AI.Option.Naval.val.ROE.OPEN_FIRE ) - end - - return self - end - - return nil -end - ---- Can the GROUP attack targets of opportunity? --- @param #GROUP self --- @return #boolean -function GROUP:OptionROEWeaponFreePossible() - self:F2( { self.GroupName } ) - - local DCSGroup = self:GetDCSGroup() - if DCSGroup then - if self:IsAir() then - return true - end - - return false - end - - return nil -end - ---- Weapon free. --- @param #GROUP self --- @return #GROUP self -function GROUP:OptionROEWeaponFree() - self:F2( { self.GroupName } ) - - local DCSGroup = self:GetDCSGroup() - if DCSGroup then - local Controller = self:_GetController() - - if self:IsAir() then - Controller:setOption( AI.Option.Air.id.ROE, AI.Option.Air.val.ROE.WEAPON_FREE ) - end - - return self - end - - return nil -end - ---- Can the GROUP ignore enemy fire? --- @param #GROUP self --- @return #boolean -function GROUP:OptionROTNoReactionPossible() - self:F2( { self.GroupName } ) - - local DCSGroup = self:GetDCSGroup() - if DCSGroup then - if self:IsAir() then - return true - end - - return false - end - - return nil -end - - ---- No evasion on enemy threats. --- @param #GROUP self --- @return #GROUP self -function GROUP:OptionROTNoReaction() - self:F2( { self.GroupName } ) - - local DCSGroup = self:GetDCSGroup() - if DCSGroup then - local Controller = self:_GetController() - - if self:IsAir() then - Controller:setOption( AI.Option.Air.id.REACTION_ON_THREAT, AI.Option.Air.val.REACTION_ON_THREAT.NO_REACTION ) - end - - return self - end - - return nil -end - ---- Can the GROUP evade using passive defenses? --- @param #GROUP self --- @return #boolean -function GROUP:OptionROTPassiveDefensePossible() - self:F2( { self.GroupName } ) - - local DCSGroup = self:GetDCSGroup() - if DCSGroup then - if self:IsAir() then - return true - end - - return false - end - - return nil -end - ---- Evasion passive defense. --- @param #GROUP self --- @return #GROUP self -function GROUP:OptionROTPassiveDefense() - self:F2( { self.GroupName } ) - - local DCSGroup = self:GetDCSGroup() - if DCSGroup then - local Controller = self:_GetController() - - if self:IsAir() then - Controller:setOption( AI.Option.Air.id.REACTION_ON_THREAT, AI.Option.Air.val.REACTION_ON_THREAT.PASSIVE_DEFENCE ) - end - - return self - end - - return nil -end - ---- Can the GROUP evade on enemy fire? --- @param #GROUP self --- @return #boolean -function GROUP:OptionROTEvadeFirePossible() - self:F2( { self.GroupName } ) - - local DCSGroup = self:GetDCSGroup() - if DCSGroup then - if self:IsAir() then - return true - end - - return false - end - - return nil -end - - ---- Evade on fire. --- @param #GROUP self --- @return #GROUP self -function GROUP:OptionROTEvadeFire() - self:F2( { self.GroupName } ) - - local DCSGroup = self:GetDCSGroup() - if DCSGroup then - local Controller = self:_GetController() - - if self:IsAir() then - Controller:setOption( AI.Option.Air.id.REACTION_ON_THREAT, AI.Option.Air.val.REACTION_ON_THREAT.EVADE_FIRE ) - end - - return self - end - - return nil -end - ---- Can the GROUP evade on fire using vertical manoeuvres? --- @param #GROUP self --- @return #boolean -function GROUP:OptionROTVerticalPossible() - self:F2( { self.GroupName } ) - - local DCSGroup = self:GetDCSGroup() - if DCSGroup then - if self:IsAir() then - return true - end - - return false - end - - return nil -end - - ---- Evade on fire using vertical manoeuvres. --- @param #GROUP self --- @return #GROUP self -function GROUP:OptionROTVertical() - self:F2( { self.GroupName } ) - - local DCSGroup = self:GetDCSGroup() - if DCSGroup then - local Controller = self:_GetController() - - if self:IsAir() then - Controller:setOption( AI.Option.Air.id.REACTION_ON_THREAT, AI.Option.Air.val.REACTION_ON_THREAT.BYPASS_AND_ESCAPE ) - end - - return self - end - - return nil -end - --- Message APIs - ---- Returns a message for a coalition or a client. --- @param #GROUP self --- @param #string Message The message text --- @param #Duration Duration The duration of the message. --- @return Message#MESSAGE -function GROUP:Message( Message, Duration ) - self:F2( { Message, Duration } ) - - local DCSGroup = self:GetDCSGroup() - if DCSGroup then - return MESSAGE:New( Message, self:GetCallsign() .. " (" .. self:GetTypeName() .. ")", Duration, self:GetClassNameAndID() ) - end - - return nil -end - ---- Send a message to all coalitions. --- The message will appear in the message area. The message will begin with the callsign of the group and the type of the first unit sending the message. --- @param #GROUP self --- @param #string Message The message text --- @param #Duration Duration The duration of the message. -function GROUP:MessageToAll( Message, Duration ) - self:F2( { Message, Duration } ) - - local DCSGroup = self:GetDCSGroup() - if DCSGroup then - self:Message( Message, Duration ):ToAll() - end - - return nil -end - ---- Send a message to the red coalition. --- The message will appear in the message area. The message will begin with the callsign of the group and the type of the first unit sending the message. --- @param #GROUP self --- @param #string Message The message text --- @param #Duration Duration The duration of the message. -function GROUP:MessageToRed( Message, Duration ) - self:F2( { Message, Duration } ) - - local DCSGroup = self:GetDCSGroup() - if DCSGroup then - self:Message( Message, Duration ):ToRed() - end - - return nil -end - ---- Send a message to the blue coalition. --- The message will appear in the message area. The message will begin with the callsign of the group and the type of the first unit sending the message. --- @param #GROUP self --- @param #string Message The message text --- @param #Duration Duration The duration of the message. -function GROUP:MessageToBlue( Message, Duration ) - self:F2( { Message, Duration } ) - - local DCSGroup = self:GetDCSGroup() - if DCSGroup then - self:Message( Message, Duration ):ToBlue() - end - - return nil -end - ---- Send a message to a client. --- The message will appear in the message area. The message will begin with the callsign of the group and the type of the first unit sending the message. --- @param #GROUP self --- @param #string Message The message text --- @param #Duration Duration The duration of the message. --- @param Client#CLIENT Client The client object receiving the message. -function GROUP:MessageToClient( Message, Duration, Client ) - self:F2( { Message, Duration } ) - - local DCSGroup = self:GetDCSGroup() - if DCSGroup then - self:Message( Message, Duration ):ToClient( Client ) - end - - return nil -end ---- UNIT Class --- --- @{UNIT} class --- ============== --- The @{UNIT} class is a wrapper class to handle the DCS Unit objects: --- --- * Support all DCS Unit APIs. --- * Enhance with Unit specific APIs not in the DCS Unit API set. --- * Handle local Unit Controller. --- * Manage the "state" of the DCS Unit. --- --- --- UNIT reference methods --- ====================== --- For each DCS Unit object alive within a running mission, a UNIT wrapper object (instance) will be created within the _@{DATABASE} object. --- This is done at the beginning of the mission (when the mission starts), and dynamically when new DCS Unit objects are spawned (using the @{SPAWN} class). --- --- The UNIT class **does not contain a :New()** method, rather it provides **:Find()** methods to retrieve the object reference --- using the DCS Unit or the DCS UnitName. --- --- Another thing to know is that UNIT objects do not "contain" the DCS Unit object. --- The UNIT methods will reference the DCS Unit object by name when it is needed during API execution. --- If the DCS Unit object does not exist or is nil, the UNIT methods will return nil and log an exception in the DCS.log file. --- --- The UNIT class provides the following functions to retrieve quickly the relevant UNIT instance: --- --- * @{#UNIT.Find}(): Find a UNIT instance from the _DATABASE object using a DCS Unit object. --- * @{#UNIT.FindByName}(): Find a UNIT instance from the _DATABASE object using a DCS Unit name. --- --- IMPORTANT: ONE SHOULD NEVER SANATIZE these UNIT OBJECT REFERENCES! (make the UNIT object references nil). --- --- DCS UNIT APIs --- ============= --- The DCS Unit APIs are used extensively within MOOSE. The UNIT class has for each DCS Unit API a corresponding method. --- To be able to distinguish easily in your code the difference between a UNIT API call and a DCS Unit API call, --- the first letter of the method is also capitalized. So, by example, the DCS Unit method @{DCSUnit#Unit.getName}() --- is implemented in the UNIT class as @{#UNIT.GetName}(). --- --- Additional UNIT APIs --- ==================== --- The UNIT class comes with additional methods. Find below a summary. --- --- Smoke, Flare Units --- ------------------ --- The UNIT class provides methods to smoke or flare units easily. --- The @{#UNIT.SmokeBlue}(), @{#UNIT.SmokeGreen}(),@{#UNIT.SmokeOrange}(), @{#UNIT.SmokeRed}(), @{#UNIT.SmokeRed}() methods --- will smoke the unit in the corresponding color. Note that smoking a unit is done at the current position of the DCS Unit. --- When the DCS Unit moves for whatever reason, the smoking will still continue! --- The @{#UNIT.FlareGreen}(), @{#UNIT.FlareRed}(), @{#UNIT.FlareWhite}(), @{#UNIT.FlareYellow}() --- methods will fire off a flare in the air with the corresponding color. Note that a flare is a one-off shot and its effect is of very short duration. --- --- Position, Point --- --------------- --- The UNIT class provides methods to obtain the current point or position of the DCS Unit. --- The @{#UNIT.GetPointVec2}(), @{#UNIT.GetPointVec3}() will obtain the current location of the DCS Unit in a Vec2 (2D) or a Vec3 (3D) vector respectively. --- If you want to obtain the complete 3D position including oriëntation and direction vectors, consult the @{#UNIT.GetPositionVec3}() method respectively. --- --- Alive --- ----- --- The @{#UNIT.IsAlive}(), @{#UNIT.IsActive}() methods determines if the DCS Unit is alive, meaning, it is existing and active. --- --- Test for other units in radius --- ------------------------------ --- One can test if another DCS Unit is within a given radius of the current DCS Unit, by using the @{#UNIT.OtherUnitInRadius}() method. --- --- More functions will be added --- ---------------------------- --- During the MOOSE development, more functions will be added. A complete list of the current functions is below. --- --- --- --- --- @module Unit --- @author FlightControl - -Include.File( "Routines" ) -Include.File( "Base" ) -Include.File( "Message" ) - ---- The UNIT class --- @type UNIT --- @extends Base#BASE --- @field #UNIT.FlareColor FlareColor --- @field #UNIT.SmokeColor SmokeColor -UNIT = { - ClassName="UNIT", - CategoryName = { - [Unit.Category.AIRPLANE] = "Airplane", - [Unit.Category.HELICOPTER] = "Helicoper", - [Unit.Category.GROUND_UNIT] = "Ground Unit", - [Unit.Category.SHIP] = "Ship", - [Unit.Category.STRUCTURE] = "Structure", - }, - FlareColor = { - Green = trigger.flareColor.Green, - Red = trigger.flareColor.Red, - White = trigger.flareColor.White, - Yellow = trigger.flareColor.Yellow - }, - SmokeColor = { - Green = trigger.smokeColor.Green, - Red = trigger.smokeColor.Red, - White = trigger.smokeColor.White, - Orange = trigger.smokeColor.Orange, - Blue = trigger.smokeColor.Blue - }, - } - ---- FlareColor --- @type UNIT.FlareColor --- @field Green --- @field Red --- @field White --- @field Yellow - ---- SmokeColor --- @type UNIT.SmokeColor --- @field Green --- @field Red --- @field White --- @field Orange --- @field Blue - --- Registration. - ---- Create a new UNIT from DCSUnit. --- @param #UNIT self --- @param DCSUnit#Unit DCSUnit --- @param Database#DATABASE Database --- @return Unit#UNIT -function UNIT:Register( UnitName ) - - local self = BASE:Inherit( self, BASE:New() ) - self:F2( UnitName ) - self.UnitName = UnitName - return self -end - --- Reference methods. - ---- Finds a UNIT from the _DATABASE using a DCSUnit object. --- @param #UNIT self --- @param DCSUnit#Unit DCSUnit An existing DCS Unit object reference. --- @return Unit#UNIT self -function UNIT:Find( DCSUnit ) - - local UnitName = DCSUnit:getName() - local UnitFound = _DATABASE:FindUnit( UnitName ) - return UnitFound -end - ---- Find a UNIT in the _DATABASE using the name of an existing DCS Unit. --- @param #UNIT self --- @param #string UnitName The Unit Name. --- @return Unit#UNIT self -function UNIT:FindByName( UnitName ) - - local UnitFound = _DATABASE:FindUnit( UnitName ) - return UnitFound -end - -function UNIT:GetDCSUnit() - local DCSUnit = Unit.getByName( self.UnitName ) - - if DCSUnit then - return DCSUnit - end - - return nil -end - ---- Returns coalition of the Unit. --- @param Unit#UNIT self --- @return DCSCoalitionObject#coalition.side The side of the coalition. --- @return #nil The DCS Unit is not existing or alive. -function UNIT:GetCoalition() - self:F2( self.UnitName ) - - local DCSUnit = self:GetDCSUnit() - - if DCSUnit then - local UnitCoalition = DCSUnit:getCoalition() - self:T3( UnitCoalition ) - return UnitCoalition - end - - return nil -end - ---- Returns country of the Unit. --- @param Unit#UNIT self --- @return DCScountry#country.id The country identifier. --- @return #nil The DCS Unit is not existing or alive. -function UNIT:GetCountry() - self:F2( self.UnitName ) - - local DCSUnit = self:GetDCSUnit() - - if DCSUnit then - local UnitCountry = DCSUnit:getCountry() - self:T3( UnitCountry ) - return UnitCountry - end - - return nil -end - - ---- Returns DCS Unit object name. --- The function provides access to non-activated units too. --- @param Unit#UNIT self --- @return #string The name of the DCS Unit. --- @return #nil The DCS Unit is not existing or alive. -function UNIT:GetName() - self:F2( self.UnitName ) - - local DCSUnit = self:GetDCSUnit() - - if DCSUnit then - local UnitName = self.UnitName - return UnitName - end - - return nil -end - - ---- Returns if the unit is alive. --- @param Unit#UNIT self --- @return #boolean true if Unit is alive. --- @return #nil The DCS Unit is not existing or alive. -function UNIT:IsAlive() - self:F2( self.UnitName ) - - local DCSUnit = self:GetDCSUnit() - - if DCSUnit then - local UnitIsAlive = DCSUnit:isExist() - return UnitIsAlive - end - - return false -end - ---- Returns if the unit is activated. --- @param Unit#UNIT self --- @return #boolean true if Unit is activated. --- @return #nil The DCS Unit is not existing or alive. -function UNIT:IsActive() - self:F2( self.UnitName ) - - local DCSUnit = self:GetDCSUnit() - - if DCSUnit then - - local UnitIsActive = DCSUnit:isActive() - return UnitIsActive - end - - return nil -end - ---- Returns name of the player that control the unit or nil if the unit is controlled by A.I. --- @param Unit#UNIT self --- @return #string Player Name --- @return #nil The DCS Unit is not existing or alive. -function UNIT:GetPlayerName() - self:F2( self.UnitName ) - - local DCSUnit = self:GetDCSUnit() - - if DCSUnit then - - local PlayerName = DCSUnit:getPlayerName() - if PlayerName == nil then - PlayerName = "" - end - return PlayerName - end - - return nil -end - ---- Returns the unit's unique identifier. --- @param Unit#UNIT self --- @return DCSUnit#Unit.ID Unit ID --- @return #nil The DCS Unit is not existing or alive. -function UNIT:GetID() - self:F2( self.UnitName ) - - local DCSUnit = self:GetDCSUnit() - - if DCSUnit then - local UnitID = DCSUnit:getID() - return UnitID - end - - return nil -end - ---- Returns the unit's number in the group. --- The number is the same number the unit has in ME. --- It may not be changed during the mission. --- If any unit in the group is destroyed, the numbers of another units will not be changed. --- @param Unit#UNIT self --- @return #number The Unit number. --- @return #nil The DCS Unit is not existing or alive. -function UNIT:GetNumber() - self:F2( self.UnitName ) - - local DCSUnit = self:GetDCSUnit() - - if DCSUnit then - local UnitNumber = DCSUnit:getNumber() - return UnitNumber - end - - return nil -end - ---- Returns the unit's group if it exist and nil otherwise. --- @param Unit#UNIT self --- @return Group#GROUP The Group of the Unit. --- @return #nil The DCS Unit is not existing or alive. -function UNIT:GetGroup() - self:F2( self.UnitName ) - - local DCSUnit = self:GetDCSUnit() - - if DCSUnit then - local UnitGroup = DCSUnit:getGroup() - return UnitGroup - end - - return nil -end - - ---- Returns the unit's callsign - the localized string. --- @param Unit#UNIT self --- @return #string The Callsign of the Unit. --- @return #nil The DCS Unit is not existing or alive. -function UNIT:GetCallSign() - self:F2( self.UnitName ) - - local DCSUnit = self:GetDCSUnit() - - if DCSUnit then - local UnitCallSign = DCSUnit:getCallsign() - return UnitCallSign - end - - return nil -end - ---- Returns the unit's health. Dead units has health <= 1.0. --- @param Unit#UNIT self --- @return #number The Unit's health value. --- @return #nil The DCS Unit is not existing or alive. -function UNIT:GetLife() - self:F2( self.UnitName ) - - local DCSUnit = self:GetDCSUnit() - - if DCSUnit then - local UnitLife = DCSUnit:getLife() - return UnitLife - end - - return nil -end - ---- Returns the Unit's initial health. --- @param Unit#UNIT self --- @return #number The Unit's initial health value. --- @return #nil The DCS Unit is not existing or alive. -function UNIT:GetLife0() - self:F2( self.UnitName ) - - local DCSUnit = self:GetDCSUnit() - - if DCSUnit then - local UnitLife0 = DCSUnit:getLife0() - return UnitLife0 - end - - return nil -end - ---- Returns relative amount of fuel (from 0.0 to 1.0) the unit has in its internal tanks. If there are additional fuel tanks the value may be greater than 1.0. --- @param Unit#UNIT self --- @return #number The relative amount of fuel (from 0.0 to 1.0). --- @return #nil The DCS Unit is not existing or alive. -function UNIT:GetFuel() - self:F2( self.UnitName ) - - local DCSUnit = self:GetDCSUnit() - - if DCSUnit then - local UnitFuel = DCSUnit:getFuel() - return UnitFuel - end - - return nil -end - ---- Returns the Unit's ammunition. --- @param Unit#UNIT self --- @return DCSUnit#Unit.Ammo --- @return #nil The DCS Unit is not existing or alive. -function UNIT:GetAmmo() - self:F2( self.UnitName ) - - local DCSUnit = self:GetDCSUnit() - - if DCSUnit then - local UnitAmmo = DCSUnit:getAmmo() - return UnitAmmo - end - - return nil -end - ---- Returns the unit sensors. --- @param Unit#UNIT self --- @return DCSUnit#Unit.Sensors --- @return #nil The DCS Unit is not existing or alive. -function UNIT:GetSensors() - self:F2( self.UnitName ) - - local DCSUnit = self:GetDCSUnit() - - if DCSUnit then - local UnitSensors = DCSUnit:getSensors() - return UnitSensors - end - - return nil -end - --- Need to add here a function per sensortype --- unit:hasSensors(Unit.SensorType.RADAR, Unit.RadarType.AS) - ---- Returns two values: --- --- * First value indicates if at least one of the unit's radar(s) is on. --- * Second value is the object of the radar's interest. Not nil only if at least one radar of the unit is tracking a target. --- @param Unit#UNIT self --- @return #boolean Indicates if at least one of the unit's radar(s) is on. --- @return DCSObject#Object The object of the radar's interest. Not nil only if at least one radar of the unit is tracking a target. --- @return #nil The DCS Unit is not existing or alive. -function UNIT:GetRadar() - self:F2( self.UnitName ) - - local DCSUnit = self:GetDCSUnit() - - if DCSUnit then - local UnitRadarOn, UnitRadarObject = DCSUnit:getRadar() - return UnitRadarOn, UnitRadarObject - end - - return nil, nil -end - --- Need to add here functions to check if radar is on and which object etc. - ---- Returns unit descriptor. Descriptor type depends on unit category. --- @param Unit#UNIT self --- @return DCSUnit#Unit.Desc The Unit descriptor. --- @return #nil The DCS Unit is not existing or alive. -function UNIT:GetDesc() - self:F2( self.UnitName ) - - local DCSUnit = self:GetDCSUnit() - - if DCSUnit then - local UnitDesc = DCSUnit:getDesc() - return UnitDesc - end - - return nil -end - - ---- Returns the type name of the DCS Unit. --- @param Unit#UNIT self --- @return #string The type name of the DCS Unit. --- @return #nil The DCS Unit is not existing or alive. -function UNIT:GetTypeName() - self:F2( self.UnitName ) - - local DCSUnit = self:GetDCSUnit() - - if DCSUnit then - local UnitTypeName = DCSUnit:getTypeName() - self:T3( UnitTypeName ) - return UnitTypeName - end - - return nil -end - - - ---- Returns the prefix name of the DCS Unit. A prefix name is a part of the name before a '#'-sign. --- DCS Units spawned with the @{SPAWN} class contain a '#'-sign to indicate the end of the (base) DCS Unit name. --- The spawn sequence number and unit number are contained within the name after the '#' sign. --- @param Unit#UNIT self --- @return #string The name of the DCS Unit. --- @return #nil The DCS Unit is not existing or alive. -function UNIT:GetPrefix() - self:F2( self.UnitName ) - - local DCSUnit = self:GetDCSUnit() - - if DCSUnit then - local UnitPrefix = string.match( self.UnitName, ".*#" ):sub( 1, -2 ) - self:T3( UnitPrefix ) - return UnitPrefix - end - - return nil -end - - - ---- Returns the @{DCSTypes#Vec2} vector indicating the point in 2D of the DCS Unit within the mission. --- @param Unit#UNIT self --- @return DCSTypes#Vec2 The 2D point vector of the DCS Unit. --- @return #nil The DCS Unit is not existing or alive. -function UNIT:GetPointVec2() - self:F2( self.UnitName ) - - local DCSUnit = self:GetDCSUnit() - - if DCSUnit then - local UnitPointVec3 = DCSUnit:getPosition().p - - local UnitPointVec2 = {} - UnitPointVec2.x = UnitPointVec3.x - UnitPointVec2.y = UnitPointVec3.z - - self:T3( UnitPointVec2 ) - return UnitPointVec2 - end - - return nil -end - - ---- Returns the @{DCSTypes#Vec3} vector indicating the point in 3D of the DCS Unit within the mission. --- @param Unit#UNIT self --- @return DCSTypes#Vec3 The 3D point vector of the DCS Unit. --- @return #nil The DCS Unit is not existing or alive. -function UNIT:GetPointVec3() - self:F2( self.UnitName ) - - local DCSUnit = self:GetDCSUnit() - - if DCSUnit then - local UnitPointVec3 = DCSUnit:getPosition().p - self:T3( UnitPointVec3 ) - return UnitPointVec3 - end - - return nil -end - ---- Returns the @{DCSTypes#Position3} position vectors indicating the point and direction vectors in 3D of the DCS Unit within the mission. --- @param Unit#UNIT self --- @return DCSTypes#Position The 3D position vectors of the DCS Unit. --- @return #nil The DCS Unit is not existing or alive. -function UNIT:GetPositionVec3() - self:F2( self.UnitName ) - - local DCSUnit = self:GetDCSUnit() - - if DCSUnit then - local UnitPosition = DCSUnit:getPosition() - self:T3( UnitPosition ) - return UnitPosition - end - - return nil -end - ---- Returns the DCS Unit velocity vector. --- @param Unit#UNIT self --- @return DCSTypes#Vec3 The velocity vector --- @return #nil The DCS Unit is not existing or alive. -function UNIT:GetVelocity() - self:F2( self.UnitName ) - - local DCSUnit = self:GetDCSUnit() - - if DCSUnit then - local UnitVelocityVec3 = DCSUnit:getVelocity() - self:T3( UnitVelocityVec3 ) - return UnitVelocityVec3 - end - - return nil -end - ---- Returns true if the DCS Unit is in the air. --- @param Unit#UNIT self --- @return #boolean true if in the air. --- @return #nil The DCS Unit is not existing or alive. -function UNIT:InAir() - self:F2( self.UnitName ) - - local DCSUnit = self:GetDCSUnit() - - if DCSUnit then - local UnitInAir = DCSUnit:inAir() - self:T3( UnitInAir ) - return UnitInAir - end - - return nil -end - ---- Returns the altitude of the DCS Unit. --- @param Unit#UNIT self --- @return DCSTypes#Distance The altitude of the DCS Unit. --- @return #nil The DCS Unit is not existing or alive. -function UNIT:GetAltitude() - self:F2() - - local DCSUnit = self:GetDCSUnit() - - if DCSUnit then - local UnitPointVec3 = DCSUnit:getPoint() --DCSTypes#Vec3 - return UnitPointVec3.y - end - - return nil -end - ---- Returns true if there is an **other** DCS Unit within a radius of the current 2D point of the DCS Unit. --- @param Unit#UNIT self --- @param Unit#UNIT AwaitUnit The other UNIT wrapper object. --- @param Radius The radius in meters with the DCS Unit in the centre. --- @return true If the other DCS Unit is within the radius of the 2D point of the DCS Unit. --- @return #nil The DCS Unit is not existing or alive. -function UNIT:OtherUnitInRadius( AwaitUnit, Radius ) - self:F2( { self.UnitName, AwaitUnit.UnitName, Radius } ) - - local DCSUnit = self:GetDCSUnit() - - if DCSUnit then - local UnitPos = self:GetPointVec3() - local AwaitUnitPos = AwaitUnit:GetPointVec3() - - if (((UnitPos.x - AwaitUnitPos.x)^2 + (UnitPos.z - AwaitUnitPos.z)^2)^0.5 <= Radius) then - self:T3( "true" ) - return true - else - self:T3( "false" ) - return false - end - end - - return nil -end - ---- Returns the DCS Unit category name as defined within the DCS Unit Descriptor. --- @param Unit#UNIT self --- @return #string The DCS Unit Category Name -function UNIT:GetCategoryName() - local DCSUnit = self:GetDCSUnit() - - if DCSUnit then - local UnitCategoryName = self.CategoryName[ self:GetDesc().category ] - return UnitCategoryName - end - - return nil -end - ---- Signal a flare at the position of the UNIT. --- @param #UNIT self -function UNIT:Flare( FlareColor ) - self:F2() - trigger.action.signalFlare( self:GetPointVec3(), FlareColor , 0 ) -end - ---- Signal a white flare at the position of the UNIT. --- @param #UNIT self -function UNIT:FlareWhite() - self:F2() - trigger.action.signalFlare( self:GetPointVec3(), trigger.flareColor.White , 0 ) -end - ---- Signal a yellow flare at the position of the UNIT. --- @param #UNIT self -function UNIT:FlareYellow() - self:F2() - trigger.action.signalFlare( self:GetPointVec3(), trigger.flareColor.Yellow , 0 ) -end - ---- Signal a green flare at the position of the UNIT. --- @param #UNIT self -function UNIT:FlareGreen() - self:F2() - trigger.action.signalFlare( self:GetPointVec3(), trigger.flareColor.Green , 0 ) -end - ---- Signal a red flare at the position of the UNIT. --- @param #UNIT self -function UNIT:FlareRed() - self:F2() - trigger.action.signalFlare( self:GetPointVec3(), trigger.flareColor.Red, 0 ) -end - ---- Smoke the UNIT. --- @param #UNIT self -function UNIT:Smoke( SmokeColor ) - self:F2() - trigger.action.smoke( self:GetPointVec3(), SmokeColor ) -end - ---- Smoke the UNIT Green. --- @param #UNIT self -function UNIT:SmokeGreen() - self:F2() - trigger.action.smoke( self:GetPointVec3(), trigger.smokeColor.Green ) -end - ---- Smoke the UNIT Red. --- @param #UNIT self -function UNIT:SmokeRed() - self:F2() - trigger.action.smoke( self:GetPointVec3(), trigger.smokeColor.Red ) -end - ---- Smoke the UNIT White. --- @param #UNIT self -function UNIT:SmokeWhite() - self:F2() - trigger.action.smoke( self:GetPointVec3(), trigger.smokeColor.White ) -end - ---- Smoke the UNIT Orange. --- @param #UNIT self -function UNIT:SmokeOrange() - self:F2() - trigger.action.smoke( self:GetPointVec3(), trigger.smokeColor.Orange ) -end - ---- Smoke the UNIT Blue. --- @param #UNIT self -function UNIT:SmokeBlue() - self:F2() - trigger.action.smoke( self:GetPointVec3(), trigger.smokeColor.Blue ) -end - --- Is methods - ---- Returns if the unit is of an air category. --- If the unit is a helicopter or a plane, then this method will return true, otherwise false. --- @param #UNIT self --- @return #boolean Air category evaluation result. -function UNIT:IsAir() - self:F2() - - local UnitDescriptor = self.DCSUnit:getDesc() - self:T3( { UnitDescriptor.category, Unit.Category.AIRPLANE, Unit.Category.HELICOPTER } ) - - local IsAirResult = ( UnitDescriptor.category == Unit.Category.AIRPLANE ) or ( UnitDescriptor.category == Unit.Category.HELICOPTER ) - - self:T3( IsAirResult ) - return IsAirResult -end - ---- ZONE Classes --- @module Zone - -Include.File( "Routines" ) -Include.File( "Base" ) -Include.File( "Message" ) - ---- The ZONE class --- @type ZONE --- @Extends Base#BASE -ZONE = { - ClassName="ZONE", - } - -function ZONE:New( ZoneName ) - local self = BASE:Inherit( self, BASE:New() ) - self:F( ZoneName ) - - local Zone = trigger.misc.getZone( ZoneName ) - - if not Zone then - error( "Zone " .. ZoneName .. " does not exist." ) - return nil - end - - self.Zone = Zone - self.ZoneName = ZoneName - - return self -end - -function ZONE:GetPointVec2() - self:F( self.ZoneName ) - - local Zone = trigger.misc.getZone( self.ZoneName ) - local Point = { x = Zone.point.x, y = Zone.point.z } - - self:T( { Zone, Point } ) - - return Point -end - -function ZONE:GetPointVec3( Height ) - self:F( self.ZoneName ) - - local Zone = trigger.misc.getZone( self.ZoneName ) - local Point = { x = Zone.point.x, y = land.getHeight( self:GetPointVec2() ) + Height, z = Zone.point.z } - - self:T( { Zone, Point } ) - - return Point -end - -function ZONE:GetRandomPointVec2() - self:F( self.ZoneName ) - - local Point = {} - - local Zone = trigger.misc.getZone( self.ZoneName ) - - local angle = math.random() * math.pi*2; - Point.x = Zone.point.x + math.cos( angle ) * math.random() * Zone.radius; - Point.y = Zone.point.z + math.sin( angle ) * math.random() * Zone.radius; - - self:T( { Zone, Point } ) - - return Point -end - -function ZONE:GetRadius() - self:F( self.ZoneName ) - - local Zone = trigger.misc.getZone( self.ZoneName ) - - self:T( { Zone } ) - - return Zone.radius -end - ---- The CLIENT models client units in multi player missions. --- --- @{#CLIENT} class --- ================ --- Clients are those **Units** defined within the Mission Editor that have the skillset defined as __Client__ or __Player__. --- Note that clients are NOT the same as Units, they are NOT necessarily alive. --- The @{CLIENT} class is a wrapper class to handle the DCS Unit objects that have the skillset defined as __Client__ or __Player__: --- --- * Wraps the DCS Unit objects with skill level set to Player or Client. --- * Support all DCS Unit APIs. --- * Enhance with Unit specific APIs not in the DCS Group API set. --- * When player joins Unit, execute alive init logic. --- * Handles messages to players. --- * Manage the "state" of the DCS Unit. --- --- Clients are being used by the @{MISSION} class to follow players and register their successes. --- --- CLIENT reference methods --- ======================= --- For each DCS Unit having skill level Player or Client, a CLIENT wrapper object (instance) will be created within the _@{DATABASE} object. --- This is done at the beginning of the mission (when the mission starts). --- --- The CLIENT class does not contain a :New() method, rather it provides :Find() methods to retrieve the object reference --- using the DCS Unit or the DCS UnitName. --- --- Another thing to know is that CLIENT objects do not "contain" the DCS Unit object. --- The CLIENT methods will reference the DCS Unit object by name when it is needed during API execution. --- If the DCS Unit object does not exist or is nil, the CLIENT methods will return nil and log an exception in the DCS.log file. --- --- The CLIENT class provides the following functions to retrieve quickly the relevant CLIENT instance: --- --- * @{#CLIENT.Find}(): Find a CLIENT instance from the _DATABASE object using a DCS Unit object. --- * @{#CLIENT.FindByName}(): Find a CLIENT instance from the _DATABASE object using a DCS Unit name. --- --- IMPORTANT: ONE SHOULD NEVER SANATIZE these CLIENT OBJECT REFERENCES! (make the CLIENT object references nil). --- --- @module Client --- @author FlightControl - -Include.File( "Routines" ) -Include.File( "Base" ) -Include.File( "Cargo" ) -Include.File( "Message" ) - - ---- The CLIENT class --- @type CLIENT --- @extends Unit#UNIT -CLIENT = { - ONBOARDSIDE = { - NONE = 0, - LEFT = 1, - RIGHT = 2, - BACK = 3, - FRONT = 4 - }, - ClassName = "CLIENT", - ClientName = nil, - ClientAlive = false, - ClientTransport = false, - ClientBriefingShown = false, - _Menus = {}, - _Tasks = {}, - Messages = { - } -} - - ---- Finds a CLIENT from the _DATABASE using the relevant DCS Unit. --- @param #CLIENT self --- @param #string ClientName Name of the DCS **Unit** as defined within the Mission Editor. --- @param #string ClientBriefing Text that describes the briefing of the mission when a Player logs into the Client. --- @return #CLIENT --- @usage --- -- Create new Clients. --- local Mission = MISSIONSCHEDULER.AddMission( 'Russia Transport Troops SA-6', 'Operational', 'Transport troops from the control center to one of the SA-6 SAM sites to activate their operation.', 'Russia' ) --- Mission:AddGoal( DeploySA6TroopsGoal ) --- --- Mission:AddClient( CLIENT:FindByName( 'RU MI-8MTV2*HOT-Deploy Troops 1' ):Transport() ) --- Mission:AddClient( CLIENT:FindByName( 'RU MI-8MTV2*RAMP-Deploy Troops 3' ):Transport() ) --- Mission:AddClient( CLIENT:FindByName( 'RU MI-8MTV2*HOT-Deploy Troops 2' ):Transport() ) --- Mission:AddClient( CLIENT:FindByName( 'RU MI-8MTV2*RAMP-Deploy Troops 4' ):Transport() ) -function CLIENT:Find( DCSUnit ) - local ClientName = DCSUnit:getName() - local ClientFound = _DATABASE:FindClient( ClientName ) - - if ClientFound then - ClientFound:F( ClientName ) - return ClientFound - end - - error( "CLIENT not found for: " .. ClientName ) -end - - ---- Finds a CLIENT from the _DATABASE using the relevant Client Unit Name. --- As an optional parameter, a briefing text can be given also. --- @param #CLIENT self --- @param #string ClientName Name of the DCS **Unit** as defined within the Mission Editor. --- @param #string ClientBriefing Text that describes the briefing of the mission when a Player logs into the Client. --- @return #CLIENT --- @usage --- -- Create new Clients. --- local Mission = MISSIONSCHEDULER.AddMission( 'Russia Transport Troops SA-6', 'Operational', 'Transport troops from the control center to one of the SA-6 SAM sites to activate their operation.', 'Russia' ) --- Mission:AddGoal( DeploySA6TroopsGoal ) --- --- Mission:AddClient( CLIENT:FindByName( 'RU MI-8MTV2*HOT-Deploy Troops 1' ):Transport() ) --- Mission:AddClient( CLIENT:FindByName( 'RU MI-8MTV2*RAMP-Deploy Troops 3' ):Transport() ) --- Mission:AddClient( CLIENT:FindByName( 'RU MI-8MTV2*HOT-Deploy Troops 2' ):Transport() ) --- Mission:AddClient( CLIENT:FindByName( 'RU MI-8MTV2*RAMP-Deploy Troops 4' ):Transport() ) -function CLIENT:FindByName( ClientName, ClientBriefing ) - local ClientFound = _DATABASE:FindClient( ClientName ) - - if ClientFound then - ClientFound:F( { ClientName, ClientBriefing } ) - ClientFound:AddBriefing( ClientBriefing ) - ClientFound.MessageSwitch = true - - return ClientFound - end - - error( "CLIENT not found for: " .. ClientName ) -end - -function CLIENT:Register( ClientName ) - local self = BASE:Inherit( self, UNIT:Register( ClientName ) ) - - self:F( ClientName ) - self.ClientName = ClientName - self.MessageSwitch = true - self.ClientAlive2 = false - - --self.AliveCheckScheduler = routines.scheduleFunction( self._AliveCheckScheduler, { self }, timer.getTime() + 1, 5 ) - self.AliveCheckScheduler = SCHEDULER:New( self, self._AliveCheckScheduler, {}, 1, 5 ) - - return self -end - - ---- Transport defines that the Client is a Transport. Transports show cargo. --- @param #CLIENT self --- @return #CLIENT -function CLIENT:Transport() - self:F() - - self.ClientTransport = true - return self -end - ---- AddBriefing adds a briefing to a CLIENT when a player joins a mission. --- @param #CLIENT self --- @param #string ClientBriefing is the text defining the Mission briefing. --- @return #CLIENT self -function CLIENT:AddBriefing( ClientBriefing ) - self:F( ClientBriefing ) - self.ClientBriefing = ClientBriefing - self.ClientBriefingShown = false - - return self -end - ---- Show the briefing of a CLIENT. --- @param #CLIENT self --- @return #CLIENT self -function CLIENT:ShowBriefing() - self:F( { self.ClientName, self.ClientBriefingShown } ) - - if not self.ClientBriefingShown then - self.ClientBriefingShown = true - local Briefing = "" - if self.ClientBriefing then - Briefing = Briefing .. self.ClientBriefing - end - Briefing = Briefing .. " Press [LEFT ALT]+[B] to view the complete mission briefing." - self:Message( Briefing, 60, self.ClientName .. '/ClientBriefing', "Briefing" ) - end - - return self -end - ---- Show the mission briefing of a MISSION to the CLIENT. --- @param #CLIENT self --- @param #string MissionBriefing --- @return #CLIENT self -function CLIENT:ShowMissionBriefing( MissionBriefing ) - self:F( { self.ClientName } ) - - if MissionBriefing then - self:Message( MissionBriefing, 60, self.ClientName .. '/MissionBriefing', "Mission Briefing" ) - end - - return self -end - - - ---- Resets a CLIENT. --- @param #CLIENT self --- @param #string ClientName Name of the Group as defined within the Mission Editor. The Group must have a Unit with the type Client. -function CLIENT:Reset( ClientName ) - self:F() - self._Menus = {} -end - --- Is Functions - ---- Checks if the CLIENT is a multi-seated UNIT. --- @param #CLIENT self --- @return #boolean true if multi-seated. -function CLIENT:IsMultiSeated() - self:F( self.ClientName ) - - local ClientMultiSeatedTypes = { - ["Mi-8MT"] = "Mi-8MT", - ["UH-1H"] = "UH-1H", - ["P-51B"] = "P-51B" - } - - if self:IsAlive() then - local ClientTypeName = self:GetClientGroupUnit():GetTypeName() - if ClientMultiSeatedTypes[ClientTypeName] then - return true - end - end - - return false -end - ---- Checks for a client alive event and calls a function on a continuous basis. --- @param #CLIENT self --- @param #function CallBack Function. --- @return #CLIENT -function CLIENT:Alive( CallBack, ... ) - self:F() - - self.ClientCallBack = CallBack - self.ClientParameters = arg - - return self -end - ---- @param #CLIENT self -function CLIENT:_AliveCheckScheduler() - self:F( { self.ClientName, self.ClientAlive2, self.ClientBriefingShown } ) - - if self:IsAlive() then -- Polymorphic call of UNIT - if self.ClientAlive2 == false then - self:ShowBriefing() - if self.ClientCallBack then - self:T("Calling Callback function") - self.ClientCallBack( self, unpack( self.ClientParameters ) ) - end - self.ClientAlive2 = true - end - else - if self.ClientAlive2 == true then - self.ClientAlive2 = false - end - end - - return true -end - ---- Return the DCSGroup of a Client. --- This function is modified to deal with a couple of bugs in DCS 1.5.3 --- @param #CLIENT self --- @return DCSGroup#Group -function CLIENT:GetDCSGroup() - self:F3() - --- local ClientData = Group.getByName( self.ClientName ) --- if ClientData and ClientData:isExist() then --- self:T( self.ClientName .. " : group found!" ) --- return ClientData --- else --- return nil --- end - - local ClientUnit = Unit.getByName( self.ClientName ) - - local CoalitionsData = { AlivePlayersRed = coalition.getPlayers( coalition.side.RED ), AlivePlayersBlue = coalition.getPlayers( coalition.side.BLUE ) } - for CoalitionId, CoalitionData in pairs( CoalitionsData ) do - self:T3( { "CoalitionData:", CoalitionData } ) - for UnitId, UnitData in pairs( CoalitionData ) do - self:T3( { "UnitData:", UnitData } ) - if UnitData and UnitData:isExist() then - - --self:E(self.ClientName) - if ClientUnit then - local ClientGroup = ClientUnit:getGroup() - if ClientGroup then - self:T3( "ClientGroup = " .. self.ClientName ) - if ClientGroup:isExist() and UnitData:getGroup():isExist() then - if ClientGroup:getID() == UnitData:getGroup():getID() then - self:T3( "Normal logic" ) - self:T3( self.ClientName .. " : group found!" ) - self.ClientGroupID = ClientGroup:getID() - self.ClientGroupName = ClientGroup:getName() - return ClientGroup - end - else - -- Now we need to resolve the bugs in DCS 1.5 ... - -- Consult the database for the units of the Client Group. (ClientGroup:getUnits() returns nil) - self:T3( "Bug 1.5 logic" ) - local ClientGroupTemplate = _DATABASE.Templates.Units[self.ClientName].GroupTemplate - self.ClientGroupID = ClientGroupTemplate.groupId - self.ClientGroupName = _DATABASE.Templates.Units[self.ClientName].GroupName - self:T3( self.ClientName .. " : group found in bug 1.5 resolvement logic!" ) - return ClientGroup - end - -- else - -- error( "Client " .. self.ClientName .. " not found!" ) - end - else - --self:E( { "Client not found!", self.ClientName } ) - end - end - end - end - - -- For non player clients - if ClientUnit then - local ClientGroup = ClientUnit:getGroup() - if ClientGroup then - self:T3( "ClientGroup = " .. self.ClientName ) - if ClientGroup:isExist() then - self:T3( "Normal logic" ) - self:T3( self.ClientName .. " : group found!" ) - return ClientGroup - end - end - end - - self.ClientGroupID = nil - self.ClientGroupUnit = nil - - return nil -end - - --- TODO: Check DCSTypes#Group.ID ---- Get the group ID of the client. --- @param #CLIENT self --- @return DCSTypes#Group.ID -function CLIENT:GetClientGroupID() - - local ClientGroup = self:GetDCSGroup() - - --self:E( self.ClientGroupID ) -- Determined in GetDCSGroup() - return self.ClientGroupID -end - - ---- Get the name of the group of the client. --- @param #CLIENT self --- @return #string -function CLIENT:GetClientGroupName() - - local ClientGroup = self:GetDCSGroup() - - self:T( self.ClientGroupName ) -- Determined in GetDCSGroup() - return self.ClientGroupName -end - ---- Returns the UNIT of the CLIENT. --- @param #CLIENT self --- @return Unit#UNIT -function CLIENT:GetClientGroupUnit() - self:F2() - - local ClientDCSUnit = Unit.getByName( self.ClientName ) - - self:T( self.ClientDCSUnit ) - if ClientDCSUnit and ClientDCSUnit:isExist() then - local ClientUnit = _DATABASE:FindUnit( self.ClientName ) - self:T2( ClientUnit ) - return ClientUnit - end -end - ---- Returns the DCSUnit of the CLIENT. --- @param #CLIENT self --- @return DCSTypes#Unit -function CLIENT:GetClientGroupDCSUnit() - self:F2() - - local ClientDCSUnit = Unit.getByName( self.ClientName ) - - if ClientDCSUnit and ClientDCSUnit:isExist() then - self:T2( ClientDCSUnit ) - return ClientDCSUnit - end -end - - ---- Evaluates if the CLIENT is a transport. --- @param #CLIENT self --- @return #boolean true is a transport. -function CLIENT:IsTransport() - self:F() - return self.ClientTransport -end - ---- Shows the @{Cargo#CARGO} contained within the CLIENT to the player as a message. --- The @{Cargo#CARGO} is shown using the @{Message#MESSAGE} distribution system. --- @param #CLIENT self -function CLIENT:ShowCargo() - self:F() - - local CargoMsg = "" - - for CargoName, Cargo in pairs( CARGOS ) do - if self == Cargo:IsLoadedInClient() then - CargoMsg = CargoMsg .. Cargo.CargoName .. " Type:" .. Cargo.CargoType .. " Weight: " .. Cargo.CargoWeight .. "\n" - end - end - - if CargoMsg == "" then - CargoMsg = "empty" - end - - self:Message( CargoMsg, 15, self.ClientName .. "/Cargo", "Co-Pilot: Cargo Status", 30 ) - -end - --- TODO (1) I urgently need to revise this. ---- A local function called by the DCS World Menu system to switch off messages. -function CLIENT.SwitchMessages( PrmTable ) - PrmTable[1].MessageSwitch = PrmTable[2] -end - ---- The main message driver for the CLIENT. --- This function displays various messages to the Player logged into the CLIENT through the DCS World Messaging system. --- @param #CLIENT self --- @param #string Message is the text describing the message. --- @param #number MessageDuration is the duration in seconds that the Message should be displayed. --- @param #string MessageId is a text identifying the Message in the MessageQueue. The Message system overwrites Messages with the same MessageId --- @param #string MessageCategory is the category of the message (the title). --- @param #number MessageInterval is the interval in seconds between the display of the @{Message#MESSAGE} when the CLIENT is in the air. -function CLIENT:Message( Message, MessageDuration, MessageId, MessageCategory, MessageInterval ) - self:F( { Message, MessageDuration, MessageId, MessageCategory, MessageInterval } ) - - if not self.MenuMessages then - if self:GetClientGroupID() then - self.MenuMessages = MENU_CLIENT:New( self, 'Messages' ) - self.MenuRouteMessageOn = MENU_CLIENT_COMMAND:New( self, 'Messages On', self.MenuMessages, CLIENT.SwitchMessages, { self, true } ) - self.MenuRouteMessageOff = MENU_CLIENT_COMMAND:New( self,'Messages Off', self.MenuMessages, CLIENT.SwitchMessages, { self, false } ) - end - end - - if self.MessageSwitch == true then - if MessageCategory == nil then - MessageCategory = "Messages" - end - if self.Messages[MessageId] == nil then - self.Messages[MessageId] = {} - self.Messages[MessageId].MessageId = MessageId - self.Messages[MessageId].MessageTime = timer.getTime() - self.Messages[MessageId].MessageDuration = MessageDuration - if MessageInterval == nil then - self.Messages[MessageId].MessageInterval = 600 - else - self.Messages[MessageId].MessageInterval = MessageInterval - end - MESSAGE:New( Message, MessageCategory, MessageDuration, MessageId ):ToClient( self ) - else - if self:GetClientGroupDCSUnit() and not self:GetClientGroupDCSUnit():inAir() then - if timer.getTime() - self.Messages[MessageId].MessageTime >= self.Messages[MessageId].MessageDuration + 10 then - MESSAGE:New( Message, MessageCategory, MessageDuration, MessageId ):ToClient( self ) - self.Messages[MessageId].MessageTime = timer.getTime() - end - else - if timer.getTime() - self.Messages[MessageId].MessageTime >= self.Messages[MessageId].MessageDuration + self.Messages[MessageId].MessageInterval then - MESSAGE:New( Message, MessageCategory, MessageDuration, MessageId ):ToClient( self ) - self.Messages[MessageId].MessageTime = timer.getTime() - end - end - end - end -end ---- Manage the mission database. --- --- @{#DATABASE} class --- ================== --- Mission designers can use the DATABASE class to refer to: --- --- * UNITS --- * GROUPS --- * players --- * alive players --- * CLIENTS --- * alive CLIENTS --- --- On top, for internal MOOSE administration purposes, the DATBASE administers the Unit and Gruop templates as defined within the Mission Editor. --- --- Moose will automatically create one instance of the DATABASE class into the **global** object _DATABASE. --- Moose refers to _DATABASE within the framework extensively, but you can also refer to the _DATABASE object within your missions if required. --- --- DATABASE iterators: --- =================== --- You can iterate the database with the available iterator methods. --- The iterator methods will walk the DATABASE set, and call for each element within the set a function that you provide. --- The following iterator methods are currently available within the DATABASE: --- --- * @{#DATABASE.ForEachUnit}: Calls a function for each @{UNIT} it finds within the DATABASE. --- * @{#DATABASE.ForEachGroup}: Calls a function for each @{GROUP} it finds within the DATABASE. --- * @{#DATABASE.ForEachPlayer}: Calls a function for each player it finds within the DATABASE. --- * @{#DATABASE.ForEachPlayerAlive}: Calls a function for each alive player it finds within the DATABASE. --- * @{#DATABASE.ForEachClient}: Calls a function for each @{CLIENT} it finds within the DATABASE. --- * @{#DATABASE.ForEachClientAlive}: Calls a function for each alive @{CLIENT} it finds within the DATABASE. --- --- @module Database --- @author FlightControl - -Include.File( "Routines" ) -Include.File( "Base" ) -Include.File( "Menu" ) -Include.File( "Group" ) -Include.File( "Unit" ) -Include.File( "Event" ) -Include.File( "Client" ) - - ---- DATABASE class --- @type DATABASE --- @extends Base#BASE -DATABASE = { - ClassName = "DATABASE", - Templates = { - Units = {}, - Groups = {}, - ClientsByName = {}, - ClientsByID = {}, - }, - DCSUnits = {}, - DCSGroups = {}, - UNITS = {}, - GROUPS = {}, - PLAYERS = {}, - PLAYERSALIVE = {}, - CLIENTS = {}, - CLIENTSALIVE = {}, - NavPoints = {}, -} - -local _DATABASECoalition = - { - [1] = "Red", - [2] = "Blue", - } - -local _DATABASECategory = - { - [Unit.Category.AIRPLANE] = "Plane", - [Unit.Category.HELICOPTER] = "Helicopter", - [Unit.Category.GROUND_UNIT] = "Vehicle", - [Unit.Category.SHIP] = "Ship", - [Unit.Category.STRUCTURE] = "Structure", - } - - ---- Creates a new DATABASE object, building a set of units belonging to a coalitions, categories, countries, types or with defined prefix names. --- @param #DATABASE self --- @return #DATABASE --- @usage --- -- Define a new DATABASE Object. This DBObject will contain a reference to all Group and Unit Templates defined within the ME and the DCSRTE. --- DBObject = DATABASE:New() -function DATABASE:New() - - -- Inherits from BASE - local self = BASE:Inherit( self, BASE:New() ) - - _EVENTDISPATCHER:OnBirth( self._EventOnBirth, self ) - _EVENTDISPATCHER:OnDead( self._EventOnDeadOrCrash, self ) - _EVENTDISPATCHER:OnCrash( self._EventOnDeadOrCrash, self ) - - - -- Follow alive players and clients - _EVENTDISPATCHER:OnPlayerEnterUnit( self._EventOnPlayerEnterUnit, self ) - _EVENTDISPATCHER:OnPlayerLeaveUnit( self._EventOnPlayerLeaveUnit, self ) - - self:_RegisterTemplates() - self:_RegisterDatabase() - self:_RegisterPlayers() - - return self -end - ---- Finds a Unit based on the Unit Name. --- @param #DATABASE self --- @param #string UnitName --- @return Unit#UNIT The found Unit. -function DATABASE:FindUnit( UnitName ) - - local UnitFound = self.UNITS[UnitName] - return UnitFound -end - - ---- Adds a Unit based on the Unit Name in the DATABASE. --- @param #DATABASE self -function DATABASE:AddUnit( DCSUnit, DCSUnitName ) - - self.DCSUnits[DCSUnitName] = DCSUnit - self.UNITS[DCSUnitName] = UNIT:Register( DCSUnitName ) -end - - ---- Deletes a Unit from the DATABASE based on the Unit Name. --- @param #DATABASE self -function DATABASE:DeleteUnit( DCSUnitName ) - - self.DCSUnits[DCSUnitName] = nil -end - - ---- Finds a CLIENT based on the ClientName. --- @param #DATABASE self --- @param #string ClientName --- @return Client#CLIENT The found CLIENT. -function DATABASE:FindClient( ClientName ) - - local ClientFound = self.CLIENTS[ClientName] - return ClientFound -end - - ---- Adds a CLIENT based on the ClientName in the DATABASE. --- @param #DATABASE self -function DATABASE:AddClient( ClientName ) - - self.CLIENTS[ClientName] = CLIENT:Register( ClientName ) - self:E( self.CLIENTS[ClientName]:GetClassNameAndID() ) -end - - ---- Finds a GROUP based on the GroupName. --- @param #DATABASE self --- @param #string GroupName --- @return Group#GROUP The found GROUP. -function DATABASE:FindGroup( GroupName ) - - local GroupFound = self.GROUPS[GroupName] - return GroupFound -end - - ---- Adds a GROUP based on the GroupName in the DATABASE. --- @param #DATABASE self -function DATABASE:AddGroup( DCSGroup, GroupName ) - - self.DCSGroups[GroupName] = DCSGroup - self.GROUPS[GroupName] = GROUP:Register( GroupName ) -end - ---- Adds a player based on the Player Name in the DATABASE. --- @param #DATABASE self -function DATABASE:AddPlayer( UnitName, PlayerName ) - - if PlayerName then - self:E( { "Add player for unit:", UnitName, PlayerName } ) - self.PLAYERS[PlayerName] = PlayerName - self.PLAYERSALIVE[PlayerName] = PlayerName - self.CLIENTSALIVE[PlayerName] = self:FindClient( UnitName ) - end -end - ---- Deletes a player from the DATABASE based on the Player Name. --- @param #DATABASE self -function DATABASE:DeletePlayer( PlayerName ) - - if PlayerName then - self:E( { "Clean player:", PlayerName } ) - self.PLAYERSALIVE[PlayerName] = nil - self.CLIENTSALIVE[PlayerName] = nil - end -end - - ---- Instantiate new Groups within the DCSRTE. --- This method expects EXACTLY the same structure as a structure within the ME, and needs 2 additional fields defined: --- SpawnCountryID, SpawnCategoryID --- This method is used by the SPAWN class. --- @param #DATABASE self --- @param #table SpawnTemplate --- @return #DATABASE self -function DATABASE:Spawn( SpawnTemplate ) - self:F2( SpawnTemplate.name ) - - self:T2( { SpawnTemplate.SpawnCountryID, SpawnTemplate.SpawnCategoryID } ) - - -- Copy the spawn variables of the template in temporary storage, nullify, and restore the spawn variables. - local SpawnCoalitionID = SpawnTemplate.SpawnCoalitionID - local SpawnCountryID = SpawnTemplate.SpawnCountryID - local SpawnCategoryID = SpawnTemplate.SpawnCategoryID - - -- Nullify - SpawnTemplate.SpawnCoalitionID = nil - SpawnTemplate.SpawnCountryID = nil - SpawnTemplate.SpawnCategoryID = nil - - self:_RegisterTemplate( SpawnTemplate ) - coalition.addGroup( SpawnCountryID, SpawnCategoryID, SpawnTemplate ) - - -- Restore - SpawnTemplate.SpawnCoalitionID = SpawnCoalitionID - SpawnTemplate.SpawnCountryID = SpawnCountryID - SpawnTemplate.SpawnCategoryID = SpawnCategoryID - - - local SpawnGroup = GROUP:Register( SpawnTemplate.name ) - return SpawnGroup -end - ---- Set a status to a Group within the Database, this to check crossing events for example. -function DATABASE:SetStatusGroup( GroupName, Status ) - self:F2( Status ) - - self.Templates.Groups[GroupName].Status = Status -end - ---- Get a status to a Group within the Database, this to check crossing events for example. -function DATABASE:GetStatusGroup( GroupName ) - self:F2( Status ) - - if self.Templates.Groups[GroupName] then - return self.Templates.Groups[GroupName].Status - else - return "" - end -end - - ---- Private method that registers new Group Templates within the DATABASE Object. --- @param #DATABASE self --- @param #table GroupTemplate --- @return #DATABASE self -function DATABASE:_RegisterTemplate( GroupTemplate ) - - local GroupTemplateName = env.getValueDictByKey(GroupTemplate.name) - - if not self.Templates.Groups[GroupTemplateName] then - self.Templates.Groups[GroupTemplateName] = {} - self.Templates.Groups[GroupTemplateName].Status = nil - end - - -- Delete the spans from the route, it is not needed and takes memory. - if GroupTemplate.route and GroupTemplate.route.spans then - GroupTemplate.route.spans = nil - end - - self.Templates.Groups[GroupTemplateName].GroupName = GroupTemplateName - self.Templates.Groups[GroupTemplateName].Template = GroupTemplate - self.Templates.Groups[GroupTemplateName].groupId = GroupTemplate.groupId - self.Templates.Groups[GroupTemplateName].UnitCount = #GroupTemplate.units - self.Templates.Groups[GroupTemplateName].Units = GroupTemplate.units - - self:T2( { "Group", self.Templates.Groups[GroupTemplateName].GroupName, self.Templates.Groups[GroupTemplateName].UnitCount } ) - - for unit_num, UnitTemplate in pairs( GroupTemplate.units ) do - - local UnitTemplateName = env.getValueDictByKey(UnitTemplate.name) - self.Templates.Units[UnitTemplateName] = {} - self.Templates.Units[UnitTemplateName].UnitName = UnitTemplateName - self.Templates.Units[UnitTemplateName].Template = UnitTemplate - self.Templates.Units[UnitTemplateName].GroupName = GroupTemplateName - self.Templates.Units[UnitTemplateName].GroupTemplate = GroupTemplate - self.Templates.Units[UnitTemplateName].GroupId = GroupTemplate.groupId - self:E( {"skill",UnitTemplate.skill}) - if UnitTemplate.skill and (UnitTemplate.skill == "Client" or UnitTemplate.skill == "Player") then - self.Templates.ClientsByName[UnitTemplateName] = UnitTemplate - self.Templates.ClientsByID[UnitTemplate.unitId] = UnitTemplate - end - self:E( { "Unit", self.Templates.Units[UnitTemplateName].UnitName } ) - end -end - - ---- Private method that registers all alive players in the mission. --- @param #DATABASE self --- @return #DATABASE self -function DATABASE:_RegisterPlayers() - - local CoalitionsData = { AlivePlayersRed = coalition.getPlayers( coalition.side.RED ), AlivePlayersBlue = coalition.getPlayers( coalition.side.BLUE ) } - for CoalitionId, CoalitionData in pairs( CoalitionsData ) do - for UnitId, UnitData in pairs( CoalitionData ) do - self:T3( { "UnitData:", UnitData } ) - if UnitData and UnitData:isExist() then - local UnitName = UnitData:getName() - local PlayerName = UnitData:getPlayerName() - if not self.PLAYERS[PlayerName] then - self:E( { "Add player for unit:", UnitName, PlayerName } ) - self:AddPlayer( UnitName, PlayerName ) - end - end - end - end - - return self -end - - ---- Private method that registers all datapoints within in the mission. --- @param #DATABASE self --- @return #DATABASE self -function DATABASE:_RegisterDatabase() - - local CoalitionsData = { GroupsRed = coalition.getGroups( coalition.side.RED ), GroupsBlue = coalition.getGroups( coalition.side.BLUE ) } - for CoalitionId, CoalitionData in pairs( CoalitionsData ) do - for DCSGroupId, DCSGroup in pairs( CoalitionData ) do - - if DCSGroup:isExist() then - local DCSGroupName = DCSGroup:getName() - - self:E( { "Register Group:", DCSGroup, DCSGroupName } ) - self:AddGroup( DCSGroup, DCSGroupName ) - - for DCSUnitId, DCSUnit in pairs( DCSGroup:getUnits() ) do - - local DCSUnitName = DCSUnit:getName() - self:E( { "Register Unit:", DCSUnit, DCSUnitName } ) - self:AddUnit( DCSUnit, DCSUnitName ) - end - else - self:E( { "Group does not exist: ", DCSGroup } ) - end - - end - end - - for ClientName, ClientTemplate in pairs( self.Templates.ClientsByName ) do - self:E( { "Adding Client:", ClientName } ) - self:AddClient( ClientName ) - end - - return self -end - ---- Events - ---- Handles the OnBirth event for the alive units set. --- @param #DATABASE self --- @param Event#EVENTDATA Event -function DATABASE:_EventOnBirth( Event ) - self:F2( { Event } ) - - if Event.IniDCSUnit then - self:AddUnit( Event.IniDCSUnit, Event.IniDCSUnitName ) - self:AddGroup( Event.IniDCSGroup, Event.IniDCSGroupName ) - self:_EventOnPlayerEnterUnit( Event ) - end -end - - ---- Handles the OnDead or OnCrash event for alive units set. --- @param #DATABASE self --- @param Event#EVENTDATA Event -function DATABASE:_EventOnDeadOrCrash( Event ) - self:F2( { Event } ) - - if Event.IniDCSUnit then - if self.DCSUnits[Event.IniDCSUnitName] then - self:DeleteUnit( Event.IniDCSUnitName ) - -- add logic to correctly remove a group once all units are destroyed... - end - end -end - - ---- Handles the OnPlayerEnterUnit event to fill the active players table (with the unit filter applied). --- @param #DATABASE self --- @param Event#EVENTDATA Event -function DATABASE:_EventOnPlayerEnterUnit( Event ) - self:F2( { Event } ) - - if Event.IniDCSUnit then - local PlayerName = Event.IniDCSUnit:getPlayerName() - if not self.PLAYERSALIVE[PlayerName] then - self:AddPlayer( Event.IniDCSUnitName, PlayerName ) - end - end -end - - ---- Handles the OnPlayerLeaveUnit event to clean the active players table. --- @param #DATABASE self --- @param Event#EVENTDATA Event -function DATABASE:_EventOnPlayerLeaveUnit( Event ) - self:F2( { Event } ) - - if Event.IniDCSUnit then - local PlayerName = Event.IniDCSUnit:getPlayerName() - if self.PLAYERSALIVE[PlayerName] then - self:DeletePlayer( PlayerName ) - end - end -end - ---- Iterators - ---- Iterate the DATABASE and call an iterator function for the given set, providing the Object for each element within the set and optional parameters. --- @param #DATABASE self --- @param #function IteratorFunction The function that will be called when there is an alive player in the database. --- @return #DATABASE self -function DATABASE:ForEach( IteratorFunction, arg, Set ) - self:F2( arg ) - - local function CoRoutine() - local Count = 0 - for ObjectID, Object in pairs( Set ) do - self:T2( Object ) - IteratorFunction( Object, unpack( arg ) ) - Count = Count + 1 - if Count % 10 == 0 then - coroutine.yield( false ) - end - end - return true - end - - local co = coroutine.create( CoRoutine ) - - local function Schedule() - - local status, res = coroutine.resume( co ) - self:T2( { status, res } ) - - if status == false then - error( res ) - end - if res == false then - return true -- resume next time the loop - end - - return false - end - - local Scheduler = SCHEDULER:New( self, Schedule, {}, 0.001, 0.001, 0 ) - - return self -end - - ---- Iterate the DATABASE and call an iterator function for each **alive** unit, providing the DCSUnit and optional parameters. --- @param #DATABASE self --- @param #function IteratorFunction The function that will be called when there is an alive unit in the database. The function needs to accept a DCSUnit parameter. --- @return #DATABASE self -function DATABASE:ForEachDCSUnit( IteratorFunction, ... ) - self:F2( arg ) - - self:ForEach( IteratorFunction, arg, self.DCSUnits ) - - return self -end - - ---- Iterate the DATABASE and call an iterator function for each **alive** UNIT, providing the UNIT and optional parameters. --- @param #DATABASE self --- @param #function IteratorFunction The function that will be called when there is an alive UNIT in the database. The function needs to accept a UNIT parameter. --- @return #DATABASE self -function DATABASE:ForEachUnit( IteratorFunction, ... ) - self:F2( arg ) - - self:ForEach( IteratorFunction, arg, self.UNITS ) - - return self -end - ---- Iterate the DATABASE and call an iterator function for each **alive** GROUP, providing the GROUP and optional parameters. --- @param #DATABASE self --- @param #function IteratorFunction The function that will be called when there is an alive GROUP in the database. The function needs to accept a GROUP parameter. --- @return #DATABASE self -function DATABASE:ForEachGroup( IteratorFunction, ... ) - self:F2( arg ) - - self:ForEach( IteratorFunction, arg, self.GROUPS ) - - return self -end - - ---- Iterate the DATABASE and call an iterator function for each player, providing the player name and optional parameters. --- @param #DATABASE self --- @param #function IteratorFunction The function that will be called when there is an player in the database. The function needs to accept the player name. --- @return #DATABASE self -function DATABASE:ForEachPlayer( IteratorFunction, ... ) - self:F2( arg ) - - self:ForEach( IteratorFunction, arg, self.PLAYERS ) - - return self -end - - ---- Iterate the DATABASE and call an iterator function for each **alive** player, providing the Unit of the player and optional parameters. --- @param #DATABASE self --- @param #function IteratorFunction The function that will be called when there is an alive player in the database. The function needs to accept a UNIT parameter. --- @return #DATABASE self -function DATABASE:ForEachPlayerAlive( IteratorFunction, ... ) - self:F2( arg ) - - self:ForEach( IteratorFunction, arg, self.PLAYERSALIVE ) - - return self -end - ---- Iterate the DATABASE and call an iterator function for each CLIENT, providing the CLIENT to the function and optional parameters. --- @param #DATABASE self --- @param #function IteratorFunction The function that will be called when there is an alive player in the database. The function needs to accept a CLIENT parameter. --- @return #DATABASE self -function DATABASE:ForEachClient( IteratorFunction, ... ) - self:F2( arg ) - - self:ForEach( IteratorFunction, arg, self.CLIENTS ) - - return self -end - ---- Iterate the DATABASE and call an iterator function for each **ALIVE** CLIENT, providing the CLIENT to the function and optional parameters. --- @param #DATABASE self --- @param #function IteratorFunction The function that will be called when there is an alive CLIENT in the database. The function needs to accept a CLIENT parameter. --- @return #DATABASE self -function DATABASE:ForEachClientAlive( IteratorFunction, ... ) - self:F2( arg ) - - self:ForEach( IteratorFunction, arg, self.CLIENTSALIVE ) - - return self -end - - -function DATABASE:_RegisterTemplates() - self:F2() - - self.Navpoints = {} - self.UNITS = {} - --Build routines.db.units and self.Navpoints - for coa_name, coa_data in pairs(env.mission.coalition) do - - if (coa_name == 'red' or coa_name == 'blue') and type(coa_data) == 'table' then - --self.Units[coa_name] = {} - - ---------------------------------------------- - -- build nav points DB - self.Navpoints[coa_name] = {} - if coa_data.nav_points then --navpoints - for nav_ind, nav_data in pairs(coa_data.nav_points) do - - if type(nav_data) == 'table' then - self.Navpoints[coa_name][nav_ind] = routines.utils.deepCopy(nav_data) - - self.Navpoints[coa_name][nav_ind]['name'] = nav_data.callsignStr -- name is a little bit more self-explanatory. - self.Navpoints[coa_name][nav_ind]['point'] = {} -- point is used by SSE, support it. - self.Navpoints[coa_name][nav_ind]['point']['x'] = nav_data.x - self.Navpoints[coa_name][nav_ind]['point']['y'] = 0 - self.Navpoints[coa_name][nav_ind]['point']['z'] = nav_data.y - end - end - end - ------------------------------------------------- - if coa_data.country then --there is a country table - for cntry_id, cntry_data in pairs(coa_data.country) do - - local countryName = string.lower(cntry_data.name) - --self.Units[coa_name][countryName] = {} - --self.Units[coa_name][countryName]["countryId"] = cntry_data.id - - if type(cntry_data) == 'table' then --just making sure - - for obj_type_name, obj_type_data in pairs(cntry_data) do - - if obj_type_name == "helicopter" or obj_type_name == "ship" or obj_type_name == "plane" or obj_type_name == "vehicle" or obj_type_name == "static" then --should be an unncessary check - - local category = obj_type_name - - if ((type(obj_type_data) == 'table') and obj_type_data.group and (type(obj_type_data.group) == 'table') and (#obj_type_data.group > 0)) then --there's a group! - - --self.Units[coa_name][countryName][category] = {} - - for group_num, GroupTemplate in pairs(obj_type_data.group) do - - if GroupTemplate and GroupTemplate.units and type(GroupTemplate.units) == 'table' then --making sure again- this is a valid group - self:_RegisterTemplate( GroupTemplate ) - end --if GroupTemplate and GroupTemplate.units then - end --for group_num, GroupTemplate in pairs(obj_type_data.group) do - end --if ((type(obj_type_data) == 'table') and obj_type_data.group and (type(obj_type_data.group) == 'table') and (#obj_type_data.group > 0)) then - end --if obj_type_name == "helicopter" or obj_type_name == "ship" or obj_type_name == "plane" or obj_type_name == "vehicle" or obj_type_name == "static" then - end --for obj_type_name, obj_type_data in pairs(cntry_data) do - end --if type(cntry_data) == 'table' then - end --for cntry_id, cntry_data in pairs(coa_data.country) do - end --if coa_data.country then --there is a country table - end --if coa_name == 'red' or coa_name == 'blue' and type(coa_data) == 'table' then - end --for coa_name, coa_data in pairs(mission.coalition) do - - return self -end - - - - ---- The main include file for the MOOSE system. - -Include.File( "Routines" ) -Include.File( "Base" ) -Include.File( "Database" ) -Include.File( "Event" ) - --- The order of the declarations is important here. Don't touch it. - ---- Declare the event dispatcher based on the EVENT class -_EVENTDISPATCHER = EVENT:New() -- #EVENT - ---- Declare the main database object, which is used internally by the MOOSE classes. -_DATABASE = DATABASE:New() -- Database#DATABASE - ---- Scoring system for MOOSE. --- This scoring class calculates the hits and kills that players make within a simulation session. --- Scoring is calculated using a defined algorithm. --- With a small change in MissionScripting.lua, the scoring can also be logged in a CSV file, that can then be uploaded --- to a database or a BI tool to publish the scoring results to the player community. --- @module Scoring --- @author FlightControl - - -Include.File( "Routines" ) -Include.File( "Base" ) -Include.File( "Menu" ) -Include.File( "Group" ) -Include.File( "Event" ) - - ---- The Scoring class --- @type SCORING --- @field Players A collection of the current players that have joined the game. --- @extends Base#BASE -SCORING = { - ClassName = "SCORING", - ClassID = 0, - Players = {}, -} - -local _SCORINGCoalition = - { - [1] = "Red", - [2] = "Blue", - } - -local _SCORINGCategory = - { - [Unit.Category.AIRPLANE] = "Plane", - [Unit.Category.HELICOPTER] = "Helicopter", - [Unit.Category.GROUND_UNIT] = "Vehicle", - [Unit.Category.SHIP] = "Ship", - [Unit.Category.STRUCTURE] = "Structure", - } - ---- Creates a new SCORING object to administer the scoring achieved by players. --- @param #SCORING self --- @param #string GameName The name of the game. This name is also logged in the CSV score file. --- @return #SCORING self --- @usage --- -- Define a new scoring object for the mission Gori Valley. --- ScoringObject = SCORING:New( "Gori Valley" ) -function SCORING:New( GameName ) - - -- Inherits from BASE - local self = BASE:Inherit( self, BASE:New() ) - - if GameName then - self.GameName = GameName - else - error( "A game name must be given to register the scoring results" ) - end - - - _EVENTDISPATCHER:OnDead( self._EventOnDeadOrCrash, self ) - _EVENTDISPATCHER:OnCrash( self._EventOnDeadOrCrash, self ) - _EVENTDISPATCHER:OnHit( self._EventOnHit, self ) - - --self.SchedulerId = routines.scheduleFunction( SCORING._FollowPlayersScheduled, { self }, 0, 5 ) - self.SchedulerId = SCHEDULER:New( self, self._FollowPlayersScheduled, {}, 0, 5 ) - - self:ScoreMenu() - - return self - -end - ---- Creates a score radio menu. Can be accessed using Radio -> F10. --- @param #SCORING self --- @return #SCORING self -function SCORING:ScoreMenu() - self.Menu = SUBMENU:New( 'Scoring' ) - self.AllScoresMenu = COMMANDMENU:New( 'Score All Active Players', self.Menu, SCORING.ReportScoreAll, self ) - --- = COMMANDMENU:New('Your Current Score', ReportScore, SCORING.ReportScorePlayer, self ) - return self -end - ---- Follows new players entering Clients within the DCSRTE. --- TODO: Need to see if i can catch this also with an event. It will eliminate the schedule ... -function SCORING:_FollowPlayersScheduled() - self:F3( "_FollowPlayersScheduled" ) - - local ClientUnit = 0 - local CoalitionsData = { AlivePlayersRed = coalition.getPlayers(coalition.side.RED), AlivePlayersBlue = coalition.getPlayers(coalition.side.BLUE) } - local unitId - local unitData - local AlivePlayerUnits = {} - - for CoalitionId, CoalitionData in pairs( CoalitionsData ) do - self:T3( { "_FollowPlayersScheduled", CoalitionData } ) - for UnitId, UnitData in pairs( CoalitionData ) do - self:_AddPlayerFromUnit( UnitData ) - end - end - - return true -end - - ---- Track DEAD or CRASH events for the scoring. --- @param #SCORING self --- @param Event#EVENTDATA Event -function SCORING:_EventOnDeadOrCrash( Event ) - self:F( { Event } ) - - local TargetUnit = nil - local TargetGroup = nil - local TargetUnitName = "" - local TargetGroupName = "" - local TargetPlayerName = "" - local TargetCoalition = nil - local TargetCategory = nil - local TargetType = nil - local TargetUnitCoalition = nil - local TargetUnitCategory = nil - local TargetUnitType = nil - - if Event.IniDCSUnit then - - TargetUnit = Event.IniDCSUnit - TargetUnitName = Event.IniDCSUnitName - TargetGroup = Event.IniDCSGroup - TargetGroupName = Event.IniDCSGroupName - TargetPlayerName = TargetUnit:getPlayerName() - - TargetCoalition = TargetUnit:getCoalition() - --TargetCategory = TargetUnit:getCategory() - TargetCategory = TargetUnit:getDesc().category -- Workaround - TargetType = TargetUnit:getTypeName() - - TargetUnitCoalition = _SCORINGCoalition[TargetCoalition] - TargetUnitCategory = _SCORINGCategory[TargetCategory] - TargetUnitType = TargetType - - self:T( { TargetUnitName, TargetGroupName, TargetPlayerName, TargetCoalition, TargetCategory, TargetType } ) - end - - for PlayerName, PlayerData in pairs( self.Players ) do - if PlayerData then -- This should normally not happen, but i'll test it anyway. - self:T( "Something got killed" ) - - -- Some variables - local InitUnitName = PlayerData.UnitName - local InitUnitType = PlayerData.UnitType - local InitCoalition = PlayerData.UnitCoalition - local InitCategory = PlayerData.UnitCategory - local InitUnitCoalition = _SCORINGCoalition[InitCoalition] - local InitUnitCategory = _SCORINGCategory[InitCategory] - - self:T( { InitUnitName, InitUnitType, InitUnitCoalition, InitCoalition, InitUnitCategory, InitCategory } ) - - -- What is he hitting? - if TargetCategory then - if PlayerData and PlayerData.Hit and PlayerData.Hit[TargetCategory] and PlayerData.Hit[TargetCategory][TargetUnitName] then -- Was there a hit for this unit for this player before registered??? - if not PlayerData.Kill[TargetCategory] then - PlayerData.Kill[TargetCategory] = {} - end - if not PlayerData.Kill[TargetCategory][TargetType] then - PlayerData.Kill[TargetCategory][TargetType] = {} - PlayerData.Kill[TargetCategory][TargetType].Score = 0 - PlayerData.Kill[TargetCategory][TargetType].ScoreKill = 0 - PlayerData.Kill[TargetCategory][TargetType].Penalty = 0 - PlayerData.Kill[TargetCategory][TargetType].PenaltyKill = 0 - end - - if InitCoalition == TargetCoalition then - PlayerData.Penalty = PlayerData.Penalty + 25 - PlayerData.Kill[TargetCategory][TargetType].Penalty = PlayerData.Kill[TargetCategory][TargetType].Penalty + 25 - PlayerData.Kill[TargetCategory][TargetType].PenaltyKill = PlayerData.Kill[TargetCategory][TargetType].PenaltyKill + 1 - MESSAGE:New( "Player '" .. PlayerName .. "' killed a friendly " .. TargetUnitCategory .. " ( " .. TargetType .. " ) " .. - PlayerData.Kill[TargetCategory][TargetType].PenaltyKill .. " times. Penalty: -" .. PlayerData.Kill[TargetCategory][TargetType].Penalty .. - ". Score Total:" .. PlayerData.Score - PlayerData.Penalty, - "", 5, "/PENALTY" .. PlayerName .. "/" .. InitUnitName ):ToAll() - self:ScoreCSV( PlayerName, "KILL_PENALTY", 1, -125, InitUnitName, InitUnitCoalition, InitUnitCategory, InitUnitType, TargetUnitName, TargetUnitCoalition, TargetUnitCategory, TargetUnitType ) - else - PlayerData.Score = PlayerData.Score + 10 - PlayerData.Kill[TargetCategory][TargetType].Score = PlayerData.Kill[TargetCategory][TargetType].Score + 10 - PlayerData.Kill[TargetCategory][TargetType].ScoreKill = PlayerData.Kill[TargetCategory][TargetType].ScoreKill + 1 - MESSAGE:New( "Player '" .. PlayerName .. "' killed an enemy " .. TargetUnitCategory .. " ( " .. TargetType .. " ) " .. - PlayerData.Kill[TargetCategory][TargetType].ScoreKill .. " times. Score: " .. PlayerData.Kill[TargetCategory][TargetType].Score .. - ". Score Total:" .. PlayerData.Score - PlayerData.Penalty, - "", 5, "/SCORE" .. PlayerName .. "/" .. InitUnitName ):ToAll() - self:ScoreCSV( PlayerName, "KILL_SCORE", 1, 10, InitUnitName, InitUnitCoalition, InitUnitCategory, InitUnitType, TargetUnitName, TargetUnitCoalition, TargetUnitCategory, TargetUnitType ) - end - end - end - end - end -end - - - ---- Add a new player entering a Unit. -function SCORING:_AddPlayerFromUnit( UnitData ) - self:F( UnitData ) - - if UnitData and UnitData:isExist() then - local UnitName = UnitData:getName() - local PlayerName = UnitData:getPlayerName() - local UnitDesc = UnitData:getDesc() - local UnitCategory = UnitDesc.category - local UnitCoalition = UnitData:getCoalition() - local UnitTypeName = UnitData:getTypeName() - - self:T( { PlayerName, UnitName, UnitCategory, UnitCoalition, UnitTypeName } ) - - if self.Players[PlayerName] == nil then -- I believe this is the place where a Player gets a life in a mission when he enters a unit ... - self.Players[PlayerName] = {} - self.Players[PlayerName].Hit = {} - self.Players[PlayerName].Kill = {} - self.Players[PlayerName].Mission = {} - - -- for CategoryID, CategoryName in pairs( SCORINGCategory ) do - -- self.Players[PlayerName].Hit[CategoryID] = {} - -- self.Players[PlayerName].Kill[CategoryID] = {} - -- end - self.Players[PlayerName].HitPlayers = {} - self.Players[PlayerName].HitUnits = {} - self.Players[PlayerName].Score = 0 - self.Players[PlayerName].Penalty = 0 - self.Players[PlayerName].PenaltyCoalition = 0 - self.Players[PlayerName].PenaltyWarning = 0 - end - - if not self.Players[PlayerName].UnitCoalition then - self.Players[PlayerName].UnitCoalition = UnitCoalition - else - if self.Players[PlayerName].UnitCoalition ~= UnitCoalition then - self.Players[PlayerName].Penalty = self.Players[PlayerName].Penalty + 50 - self.Players[PlayerName].PenaltyCoalition = self.Players[PlayerName].PenaltyCoalition + 1 - MESSAGE:New( "Player '" .. PlayerName .. "' changed coalition from " .. _SCORINGCoalition[self.Players[PlayerName].UnitCoalition] .. " to " .. _SCORINGCoalition[UnitCoalition] .. - "(changed " .. self.Players[PlayerName].PenaltyCoalition .. " times the coalition). 50 Penalty points added.", - "", - 2, - "/PENALTYCOALITION" .. PlayerName - ):ToAll() - self:ScoreCSV( PlayerName, "COALITION_PENALTY", 1, -50, self.Players[PlayerName].UnitName, _SCORINGCoalition[self.Players[PlayerName].UnitCoalition], _SCORINGCategory[self.Players[PlayerName].UnitCategory], self.Players[PlayerName].UnitType, - UnitName, _SCORINGCoalition[UnitCoalition], _SCORINGCategory[UnitCategory], UnitData:getTypeName() ) - end - end - self.Players[PlayerName].UnitName = UnitName - self.Players[PlayerName].UnitCoalition = UnitCoalition - self.Players[PlayerName].UnitCategory = UnitCategory - self.Players[PlayerName].UnitType = UnitTypeName - - if self.Players[PlayerName].Penalty > 100 then - if self.Players[PlayerName].PenaltyWarning < 1 then - MESSAGE:New( "Player '" .. PlayerName .. "': WARNING! If you continue to commit FRATRICIDE and have a PENALTY score higher than 150, you will be COURT MARTIALED and DISMISSED from this mission! \nYour total penalty is: " .. self.Players[PlayerName].Penalty, - "", - 30, - "/PENALTYCOALITION" .. PlayerName - ):ToAll() - self.Players[PlayerName].PenaltyWarning = self.Players[PlayerName].PenaltyWarning + 1 - end - end - - if self.Players[PlayerName].Penalty > 150 then - ClientGroup = GROUP:NewFromDCSUnit( UnitData ) - ClientGroup:Destroy() - MESSAGE:New( "Player '" .. PlayerName .. "' committed FRATRICIDE, he will be COURT MARTIALED and is DISMISSED from this mission!", - "", - 10, - "/PENALTYCOALITION" .. PlayerName - ):ToAll() - end - - end -end - - ---- Registers Scores the players completing a Mission Task. -function SCORING:_AddMissionTaskScore( PlayerUnit, MissionName, Score ) - self:F( { PlayerUnit, MissionName, Score } ) - - local PlayerName = PlayerUnit:getPlayerName() - - if not self.Players[PlayerName].Mission[MissionName] then - self.Players[PlayerName].Mission[MissionName] = {} - self.Players[PlayerName].Mission[MissionName].ScoreTask = 0 - self.Players[PlayerName].Mission[MissionName].ScoreMission = 0 - end - - self:T( PlayerName ) - self:T( self.Players[PlayerName].Mission[MissionName] ) - - self.Players[PlayerName].Score = self.Players[PlayerName].Score + Score - self.Players[PlayerName].Mission[MissionName].ScoreTask = self.Players[PlayerName].Mission[MissionName].ScoreTask + Score - - MESSAGE:New( "Player '" .. PlayerName .. "' has finished another Task in Mission '" .. MissionName .. "'. " .. - Score .. " Score points added.", - "", 20, "/SCORETASK" .. PlayerName ):ToAll() - - self:ScoreCSV( PlayerName, "TASK_" .. MissionName:gsub( ' ', '_' ), 1, Score, PlayerUnit:getName() ) -end - - ---- Registers Mission Scores for possible multiple players that contributed in the Mission. -function SCORING:_AddMissionScore( MissionName, Score ) - self:F( { MissionName, Score } ) - - for PlayerName, PlayerData in pairs( self.Players ) do - - if PlayerData.Mission[MissionName] then - PlayerData.Score = PlayerData.Score + Score - PlayerData.Mission[MissionName].ScoreMission = PlayerData.Mission[MissionName].ScoreMission + Score - MESSAGE:New( "Player '" .. PlayerName .. "' has finished Mission '" .. MissionName .. "'. " .. - Score .. " Score points added.", - "", 20, "/SCOREMISSION" .. PlayerName ):ToAll() - self:ScoreCSV( PlayerName, "MISSION_" .. MissionName:gsub( ' ', '_' ), 1, Score ) - end - end -end - ---- Handles the OnHit event for the scoring. --- @param #SCORING self --- @param Event#EVENTDATA Event -function SCORING:_EventOnHit( Event ) - self:F( { Event } ) - - local InitUnit = nil - local InitUnitName = "" - local InitGroup = nil - local InitGroupName = "" - local InitPlayerName = nil - - local InitCoalition = nil - local InitCategory = nil - local InitType = nil - local InitUnitCoalition = nil - local InitUnitCategory = nil - local InitUnitType = nil - - local TargetUnit = nil - local TargetUnitName = "" - local TargetGroup = nil - local TargetGroupName = "" - local TargetPlayerName = "" - - local TargetCoalition = nil - local TargetCategory = nil - local TargetType = nil - local TargetUnitCoalition = nil - local TargetUnitCategory = nil - local TargetUnitType = nil - - if Event.IniDCSUnit then - - InitUnit = Event.IniDCSUnit - InitUnitName = Event.IniDCSUnitName - InitGroup = Event.IniDCSGroup - InitGroupName = Event.IniDCSGroupName - InitPlayerName = InitUnit:getPlayerName() - - InitCoalition = InitUnit:getCoalition() - --TODO: Workaround Client DCS Bug - --InitCategory = InitUnit:getCategory() - InitCategory = InitUnit:getDesc().category - InitType = InitUnit:getTypeName() - - InitUnitCoalition = _SCORINGCoalition[InitCoalition] - InitUnitCategory = _SCORINGCategory[InitCategory] - InitUnitType = InitType - - self:T( { InitUnitName, InitGroupName, InitPlayerName, InitCoalition, InitCategory, InitType , InitUnitCoalition, InitUnitCategory, InitUnitType } ) - end - - - if Event.TgtDCSUnit then - - TargetUnit = Event.TgtDCSUnit - TargetUnitName = Event.TgtDCSUnitName - TargetGroup = Event.TgtDCSGroup - TargetGroupName = Event.TgtDCSGroupName - TargetPlayerName = TargetUnit:getPlayerName() - - TargetCoalition = TargetUnit:getCoalition() - --TODO: Workaround Client DCS Bug - --TargetCategory = TargetUnit:getCategory() - TargetCategory = TargetUnit:getDesc().category - TargetType = TargetUnit:getTypeName() - - TargetUnitCoalition = _SCORINGCoalition[TargetCoalition] - TargetUnitCategory = _SCORINGCategory[TargetCategory] - TargetUnitType = TargetType - - self:T( { TargetUnitName, TargetGroupName, TargetPlayerName, TargetCoalition, TargetCategory, TargetType, TargetUnitCoalition, TargetUnitCategory, TargetUnitType } ) - end - - if InitPlayerName ~= nil then -- It is a player that is hitting something - self:_AddPlayerFromUnit( InitUnit ) - if self.Players[InitPlayerName] then -- This should normally not happen, but i'll test it anyway. - if TargetPlayerName ~= nil then -- It is a player hitting another player ... - self:_AddPlayerFromUnit( TargetUnit ) - self.Players[InitPlayerName].HitPlayers = self.Players[InitPlayerName].HitPlayers + 1 - end - - self:T( "Hitting Something" ) - -- What is he hitting? - if TargetCategory then - if not self.Players[InitPlayerName].Hit[TargetCategory] then - self.Players[InitPlayerName].Hit[TargetCategory] = {} - end - if not self.Players[InitPlayerName].Hit[TargetCategory][TargetUnitName] then - self.Players[InitPlayerName].Hit[TargetCategory][TargetUnitName] = {} - self.Players[InitPlayerName].Hit[TargetCategory][TargetUnitName].Score = 0 - self.Players[InitPlayerName].Hit[TargetCategory][TargetUnitName].Penalty = 0 - self.Players[InitPlayerName].Hit[TargetCategory][TargetUnitName].ScoreHit = 0 - self.Players[InitPlayerName].Hit[TargetCategory][TargetUnitName].PenaltyHit = 0 - end - local Score = 0 - if InitCoalition == TargetCoalition then - self.Players[InitPlayerName].Penalty = self.Players[InitPlayerName].Penalty + 10 - self.Players[InitPlayerName].Hit[TargetCategory][TargetUnitName].Penalty = self.Players[InitPlayerName].Hit[TargetCategory][TargetUnitName].Penalty + 10 - self.Players[InitPlayerName].Hit[TargetCategory][TargetUnitName].PenaltyHit = self.Players[InitPlayerName].Hit[TargetCategory][TargetUnitName].PenaltyHit + 1 - MESSAGE:New( "Player '" .. InitPlayerName .. "' hit a friendly " .. TargetUnitCategory .. " ( " .. TargetType .. " ) " .. - self.Players[InitPlayerName].Hit[TargetCategory][TargetUnitName].PenaltyHit .. " times. Penalty: -" .. self.Players[InitPlayerName].Hit[TargetCategory][TargetUnitName].Penalty .. - ". Score Total:" .. self.Players[InitPlayerName].Score - self.Players[InitPlayerName].Penalty, - "", - 2, - "/PENALTY" .. InitPlayerName .. "/" .. InitUnitName - ):ToAll() - self:ScoreCSV( InitPlayerName, "HIT_PENALTY", 1, -25, InitUnitName, InitUnitCoalition, InitUnitCategory, InitUnitType, TargetUnitName, TargetUnitCoalition, TargetUnitCategory, TargetUnitType ) - else - self.Players[InitPlayerName].Score = self.Players[InitPlayerName].Score + 10 - self.Players[InitPlayerName].Hit[TargetCategory][TargetUnitName].Score = self.Players[InitPlayerName].Hit[TargetCategory][TargetUnitName].Score + 1 - self.Players[InitPlayerName].Hit[TargetCategory][TargetUnitName].ScoreHit = self.Players[InitPlayerName].Hit[TargetCategory][TargetUnitName].ScoreHit + 1 - MESSAGE:New( "Player '" .. InitPlayerName .. "' hit a target " .. TargetUnitCategory .. " ( " .. TargetType .. " ) " .. - self.Players[InitPlayerName].Hit[TargetCategory][TargetUnitName].ScoreHit .. " times. Score: " .. self.Players[InitPlayerName].Hit[TargetCategory][TargetUnitName].Score .. - ". Score Total:" .. self.Players[InitPlayerName].Score - self.Players[InitPlayerName].Penalty, - "", - 2, - "/SCORE" .. InitPlayerName .. "/" .. InitUnitName - ):ToAll() - self:ScoreCSV( InitPlayerName, "HIT_SCORE", 1, 1, InitUnitName, InitUnitCoalition, InitUnitCategory, InitUnitType, TargetUnitName, TargetUnitCoalition, TargetUnitCategory, TargetUnitType ) - end - end - end - elseif InitPlayerName == nil then -- It is an AI hitting a player??? - - end -end - - -function SCORING:ReportScoreAll() - - env.info( "Hello World " ) - - local ScoreMessage = "" - local PlayerMessage = "" - - self:T( "Score Report" ) - - for PlayerName, PlayerData in pairs( self.Players ) do - if PlayerData then -- This should normally not happen, but i'll test it anyway. - self:T( "Score Player: " .. PlayerName ) - - -- Some variables - local InitUnitCoalition = _SCORINGCoalition[PlayerData.UnitCoalition] - local InitUnitCategory = _SCORINGCategory[PlayerData.UnitCategory] - local InitUnitType = PlayerData.UnitType - local InitUnitName = PlayerData.UnitName - - local PlayerScore = 0 - local PlayerPenalty = 0 - - ScoreMessage = ":\n" - - local ScoreMessageHits = "" - - for CategoryID, CategoryName in pairs( _SCORINGCategory ) do - self:T( CategoryName ) - if PlayerData.Hit[CategoryID] then - local Score = 0 - local ScoreHit = 0 - local Penalty = 0 - local PenaltyHit = 0 - self:T( "Hit scores exist for player " .. PlayerName ) - for UnitName, UnitData in pairs( PlayerData.Hit[CategoryID] ) do - Score = Score + UnitData.Score - ScoreHit = ScoreHit + UnitData.ScoreHit - Penalty = Penalty + UnitData.Penalty - PenaltyHit = UnitData.PenaltyHit - end - local ScoreMessageHit = string.format( "%s:%d ", CategoryName, Score - Penalty ) - self:T( ScoreMessageHit ) - ScoreMessageHits = ScoreMessageHits .. ScoreMessageHit - PlayerScore = PlayerScore + Score - PlayerPenalty = PlayerPenalty + Penalty - else - --ScoreMessageHits = ScoreMessageHits .. string.format( "%s:%d ", string.format(CategoryName, 1, 1), 0 ) - end - end - if ScoreMessageHits ~= "" then - ScoreMessage = ScoreMessage .. " Hits: " .. ScoreMessageHits .. "\n" - end - - local ScoreMessageKills = "" - for CategoryID, CategoryName in pairs( _SCORINGCategory ) do - self:T( "Kill scores exist for player " .. PlayerName ) - if PlayerData.Kill[CategoryID] then - local Score = 0 - local ScoreKill = 0 - local Penalty = 0 - local PenaltyKill = 0 - - for UnitName, UnitData in pairs( PlayerData.Kill[CategoryID] ) do - Score = Score + UnitData.Score - ScoreKill = ScoreKill + UnitData.ScoreKill - Penalty = Penalty + UnitData.Penalty - PenaltyKill = PenaltyKill + UnitData.PenaltyKill - end - - local ScoreMessageKill = string.format( " %s:%d ", CategoryName, Score - Penalty ) - self:T( ScoreMessageKill ) - ScoreMessageKills = ScoreMessageKills .. ScoreMessageKill - - PlayerScore = PlayerScore + Score - PlayerPenalty = PlayerPenalty + Penalty - else - --ScoreMessageKills = ScoreMessageKills .. string.format( "%s:%d ", string.format(CategoryName, 1, 1), 0 ) - end - end - if ScoreMessageKills ~= "" then - ScoreMessage = ScoreMessage .. " Kills: " .. ScoreMessageKills .. "\n" - end - - local ScoreMessageCoalitionChangePenalties = "" - if PlayerData.PenaltyCoalition ~= 0 then - ScoreMessageCoalitionChangePenalties = ScoreMessageCoalitionChangePenalties .. string.format( " -%d (%d changed)", PlayerData.Penalty, PlayerData.PenaltyCoalition ) - PlayerPenalty = PlayerPenalty + PlayerData.Penalty - end - if ScoreMessageCoalitionChangePenalties ~= "" then - ScoreMessage = ScoreMessage .. " Coalition Penalties: " .. ScoreMessageCoalitionChangePenalties .. "\n" - end - - local ScoreMessageMission = "" - local ScoreMission = 0 - local ScoreTask = 0 - for MissionName, MissionData in pairs( PlayerData.Mission ) do - ScoreMission = ScoreMission + MissionData.ScoreMission - ScoreTask = ScoreTask + MissionData.ScoreTask - ScoreMessageMission = ScoreMessageMission .. "'" .. MissionName .. "'; " - end - PlayerScore = PlayerScore + ScoreMission + ScoreTask - - if ScoreMessageMission ~= "" then - ScoreMessage = ScoreMessage .. " Tasks: " .. ScoreTask .. " Mission: " .. ScoreMission .. " ( " .. ScoreMessageMission .. ")\n" - end - - PlayerMessage = PlayerMessage .. string.format( "Player '%s' Score:%d (%d Score -%d Penalties)%s", PlayerName, PlayerScore - PlayerPenalty, PlayerScore, PlayerPenalty, ScoreMessage ) - end - end - MESSAGE:New( PlayerMessage, "Player Scores", 30, "AllPlayerScores"):ToAll() -end - - -function SCORING:ReportScorePlayer() - - env.info( "Hello World " ) - - local ScoreMessage = "" - local PlayerMessage = "" - - self:T( "Score Report" ) - - for PlayerName, PlayerData in pairs( self.Players ) do - if PlayerData then -- This should normally not happen, but i'll test it anyway. - self:T( "Score Player: " .. PlayerName ) - - -- Some variables - local InitUnitCoalition = _SCORINGCoalition[PlayerData.UnitCoalition] - local InitUnitCategory = _SCORINGCategory[PlayerData.UnitCategory] - local InitUnitType = PlayerData.UnitType - local InitUnitName = PlayerData.UnitName - - local PlayerScore = 0 - local PlayerPenalty = 0 - - ScoreMessage = "" - - local ScoreMessageHits = "" - - for CategoryID, CategoryName in pairs( _SCORINGCategory ) do - self:T( CategoryName ) - if PlayerData.Hit[CategoryID] then - local Score = 0 - local ScoreHit = 0 - local Penalty = 0 - local PenaltyHit = 0 - self:T( "Hit scores exist for player " .. PlayerName ) - for UnitName, UnitData in pairs( PlayerData.Hit[CategoryID] ) do - Score = Score + UnitData.Score - ScoreHit = ScoreHit + UnitData.ScoreHit - Penalty = Penalty + UnitData.Penalty - PenaltyHit = UnitData.PenaltyHit - end - local ScoreMessageHit = string.format( "\n %s = %d score(%d;-%d) hits(#%d;#-%d)", CategoryName, Score - Penalty, Score, Penalty, ScoreHit, PenaltyHit ) - self:T( ScoreMessageHit ) - ScoreMessageHits = ScoreMessageHits .. ScoreMessageHit - PlayerScore = PlayerScore + Score - PlayerPenalty = PlayerPenalty + Penalty - else - --ScoreMessageHits = ScoreMessageHits .. string.format( "%s:%d ", string.format(CategoryName, 1, 1), 0 ) - end - end - if ScoreMessageHits ~= "" then - ScoreMessage = ScoreMessage .. "\n Hits: " .. ScoreMessageHits .. " " - end - - local ScoreMessageKills = "" - for CategoryID, CategoryName in pairs( _SCORINGCategory ) do - self:T( "Kill scores exist for player " .. PlayerName ) - if PlayerData.Kill[CategoryID] then - local Score = 0 - local ScoreKill = 0 - local Penalty = 0 - local PenaltyKill = 0 - - for UnitName, UnitData in pairs( PlayerData.Kill[CategoryID] ) do - Score = Score + UnitData.Score - ScoreKill = ScoreKill + UnitData.ScoreKill - Penalty = Penalty + UnitData.Penalty - PenaltyKill = PenaltyKill + UnitData.PenaltyKill - end - - local ScoreMessageKill = string.format( "\n %s = %d score(%d;-%d) hits(#%d;#-%d)", CategoryName, Score - Penalty, Score, Penalty, ScoreKill, PenaltyKill ) - self:T( ScoreMessageKill ) - ScoreMessageKills = ScoreMessageKills .. ScoreMessageKill - - PlayerScore = PlayerScore + Score - PlayerPenalty = PlayerPenalty + Penalty - else - --ScoreMessageKills = ScoreMessageKills .. string.format( "%s:%d ", string.format(CategoryName, 1, 1), 0 ) - end - end - if ScoreMessageKills ~= "" then - ScoreMessage = ScoreMessage .. "\n Kills: " .. ScoreMessageKills .. " " - end - - local ScoreMessageCoalitionChangePenalties = "" - if PlayerData.PenaltyCoalition ~= 0 then - ScoreMessageCoalitionChangePenalties = ScoreMessageCoalitionChangePenalties .. string.format( " -%d (%d changed)", PlayerData.Penalty, PlayerData.PenaltyCoalition ) - PlayerPenalty = PlayerPenalty + PlayerData.Penalty - end - if ScoreMessageCoalitionChangePenalties ~= "" then - ScoreMessage = ScoreMessage .. "\n Coalition: " .. ScoreMessageCoalitionChangePenalties .. " " - end - - local ScoreMessageMission = "" - local ScoreMission = 0 - local ScoreTask = 0 - for MissionName, MissionData in pairs( PlayerData.Mission ) do - ScoreMission = ScoreMission + MissionData.ScoreMission - ScoreTask = ScoreTask + MissionData.ScoreTask - ScoreMessageMission = ScoreMessageMission .. "'" .. MissionName .. "'; " - end - PlayerScore = PlayerScore + ScoreMission + ScoreTask - - if ScoreMessageMission ~= "" then - ScoreMessage = ScoreMessage .. "\n Tasks: " .. ScoreTask .. " Mission: " .. ScoreMission .. " ( " .. ScoreMessageMission .. ") " - end - - PlayerMessage = PlayerMessage .. string.format( "Player '%s' Score = %d ( %d Score, -%d Penalties ):%s", PlayerName, PlayerScore - PlayerPenalty, PlayerScore, PlayerPenalty, ScoreMessage ) - end - end - MESSAGE:New( PlayerMessage, "Player Scores", 30, "AllPlayerScores"):ToAll() - -end - - -function SCORING:SecondsToClock(sSeconds) - local nSeconds = sSeconds - if nSeconds == 0 then - --return nil; - return "00:00:00"; - else - nHours = string.format("%02.f", math.floor(nSeconds/3600)); - nMins = string.format("%02.f", math.floor(nSeconds/60 - (nHours*60))); - nSecs = string.format("%02.f", math.floor(nSeconds - nHours*3600 - nMins *60)); - return nHours..":"..nMins..":"..nSecs - end -end - ---- Opens a score CSV file to log the scores. --- @param #SCORING self --- @param #string ScoringCSV --- @return #SCORING self --- @usage --- -- Open a new CSV file to log the scores of the game Gori Valley. Let the name of the CSV file begin with "Player Scores". --- ScoringObject = SCORING:New( "Gori Valley" ) --- ScoringObject:OpenCSV( "Player Scores" ) -function SCORING:OpenCSV( ScoringCSV ) - self:F( ScoringCSV ) - - if lfs and io and os then - if ScoringCSV then - self.ScoringCSV = ScoringCSV - local fdir = lfs.writedir() .. [[Logs\]] .. self.ScoringCSV .. " " .. os.date( "%Y-%m-%d %H-%M-%S" ) .. ".csv" - - self.CSVFile, self.err = io.open( fdir, "w+" ) - if not self.CSVFile then - error( "Error: Cannot open CSV file in " .. lfs.writedir() ) - end - - self.CSVFile:write( '"GameName","RunTime","Time","PlayerName","ScoreType","PlayerUnitCoaltion","PlayerUnitCategory","PlayerUnitType","PlayerUnitName","TargetUnitCoalition","TargetUnitCategory","TargetUnitType","TargetUnitName","Times","Score"\n' ) - - self.RunTime = os.date("%y-%m-%d_%H-%M-%S") - else - error( "A string containing the CSV file name must be given." ) - end - else - self:E( "The MissionScripting.lua file has not been changed to allow lfs, io and os modules to be used..." ) - end - return self -end - - ---- Registers a score for a player. --- @param #SCORING self --- @param #string PlayerName The name of the player. --- @param #string ScoreType The type of the score. --- @param #string ScoreTimes The amount of scores achieved. --- @param #string ScoreAmount The score given. --- @param #string PlayerUnitName The unit name of the player. --- @param #string PlayerUnitCoalition The coalition of the player unit. --- @param #string PlayerUnitCategory The category of the player unit. --- @param #string PlayerUnitType The type of the player unit. --- @param #string TargetUnitName The name of the target unit. --- @param #string TargetUnitCoalition The coalition of the target unit. --- @param #string TargetUnitCategory The category of the target unit. --- @param #string TargetUnitType The type of the target unit. --- @return #SCORING self -function SCORING:ScoreCSV( PlayerName, ScoreType, ScoreTimes, ScoreAmount, PlayerUnitName, PlayerUnitCoalition, PlayerUnitCategory, PlayerUnitType, TargetUnitName, TargetUnitCoalition, TargetUnitCategory, TargetUnitType ) - --write statistic information to file - local ScoreTime = self:SecondsToClock( timer.getTime() ) - PlayerName = PlayerName:gsub( '"', '_' ) - - if PlayerUnitName and PlayerUnitName ~= '' then - local PlayerUnit = Unit.getByName( PlayerUnitName ) - - if PlayerUnit then - if not PlayerUnitCategory then - --PlayerUnitCategory = SCORINGCategory[PlayerUnit:getCategory()] - PlayerUnitCategory = _SCORINGCategory[PlayerUnit:getDesc().category] - end - - if not PlayerUnitCoalition then - PlayerUnitCoalition = _SCORINGCoalition[PlayerUnit:getCoalition()] - end - - if not PlayerUnitType then - PlayerUnitType = PlayerUnit:getTypeName() - end - else - PlayerUnitName = '' - PlayerUnitCategory = '' - PlayerUnitCoalition = '' - PlayerUnitType = '' - end - else - PlayerUnitName = '' - PlayerUnitCategory = '' - PlayerUnitCoalition = '' - PlayerUnitType = '' - end - - if not TargetUnitCoalition then - TargetUnitCoalition = '' - end - - if not TargetUnitCategory then - TargetUnitCategory = '' - end - - if not TargetUnitType then - TargetUnitType = '' - end - - if not TargetUnitName then - TargetUnitName = '' - end - - if lfs and io and os then - self.CSVFile:write( - '"' .. self.GameName .. '"' .. ',' .. - '"' .. self.RunTime .. '"' .. ',' .. - '' .. ScoreTime .. '' .. ',' .. - '"' .. PlayerName .. '"' .. ',' .. - '"' .. ScoreType .. '"' .. ',' .. - '"' .. PlayerUnitCoalition .. '"' .. ',' .. - '"' .. PlayerUnitCategory .. '"' .. ',' .. - '"' .. PlayerUnitType .. '"' .. ',' .. - '"' .. PlayerUnitName .. '"' .. ',' .. - '"' .. TargetUnitCoalition .. '"' .. ',' .. - '"' .. TargetUnitCategory .. '"' .. ',' .. - '"' .. TargetUnitType .. '"' .. ',' .. - '"' .. TargetUnitName .. '"' .. ',' .. - '' .. ScoreTimes .. '' .. ',' .. - '' .. ScoreAmount - ) - - self.CSVFile:write( "\n" ) - end -end - - -function SCORING:CloseCSV() - if lfs and io and os then - self.CSVFile:close() - end -end - ---- CARGO Classes --- @module CARGO - -Include.File( "Routines" ) -Include.File( "Base" ) -Include.File( "Message" ) -Include.File( "Scheduler" ) - - ---- Clients are those Groups defined within the Mission Editor that have the skillset defined as "Client" or "Player". --- These clients are defined within the Mission Orchestration Framework (MOF) - -CARGOS = {} - - -CARGO_ZONE = { - ClassName="CARGO_ZONE", - CargoZoneName = '', - CargoHostUnitName = '', - SIGNAL = { - TYPE = { - SMOKE = { ID = 1, TEXT = "smoke" }, - FLARE = { ID = 2, TEXT = "flare" } - }, - COLOR = { - GREEN = { ID = 1, TRIGGERCOLOR = trigger.smokeColor.Green, TEXT = "A green" }, - RED = { ID = 2, TRIGGERCOLOR = trigger.smokeColor.Red, TEXT = "A red" }, - WHITE = { ID = 3, TRIGGERCOLOR = trigger.smokeColor.White, TEXT = "A white" }, - ORANGE = { ID = 4, TRIGGERCOLOR = trigger.smokeColor.Orange, TEXT = "An orange" }, - BLUE = { ID = 5, TRIGGERCOLOR = trigger.smokeColor.Blue, TEXT = "A blue" }, - YELLOW = { ID = 6, TRIGGERCOLOR = trigger.flareColor.Yellow, TEXT = "A yellow" } - } - } -} - ---- Creates a new zone where cargo can be collected or deployed. --- The zone functionality is useful to smoke or indicate routes for cargo pickups or deployments. --- Provide the zone name as declared in the mission file into the CargoZoneName in the :New method. --- An optional parameter is the CargoHostName, which is a Group declared with Late Activation switched on in the mission file. --- The CargoHostName is the "host" of the cargo zone: --- --- * It will smoke the zone position when a client is approaching the zone. --- * Depending on the cargo type, it will assist in the delivery of the cargo by driving to and from the client. --- --- @param #CARGO_ZONE self --- @param #string CargoZoneName The name of the zone as declared within the mission editor. --- @param #string CargoHostName The name of the Group "hosting" the zone. The Group MUST NOT be a static, and must be a "mobile" unit. -function CARGO_ZONE:New( CargoZoneName, CargoHostName ) local self = BASE:Inherit( self, ZONE:New( CargoZoneName ) ) - self:F( { CargoZoneName, CargoHostName } ) - - self.CargoZoneName = CargoZoneName - self.SignalHeight = 2 - --self.CargoZone = trigger.misc.getZone( CargoZoneName ) - - - if CargoHostName then - self.CargoHostName = CargoHostName - end - - self:T( self.CargoZoneName ) - - return self -end - -function CARGO_ZONE:Spawn() - self:F( self.CargoHostName ) - - if self.CargoHostName then -- Only spawn a host in the zone when there is one given as a parameter in the New function. - if self.CargoHostSpawn then - local CargoHostGroup = self.CargoHostSpawn:GetGroupFromIndex() - if CargoHostGroup and CargoHostGroup:IsAlive() then - else - self.CargoHostSpawn:ReSpawn( 1 ) - end - else - self:T( "Initialize CargoHostSpawn" ) - self.CargoHostSpawn = SPAWN:New( self.CargoHostName ):Limit( 1, 1 ) - self.CargoHostSpawn:ReSpawn( 1 ) - end - end - - return self -end - -function CARGO_ZONE:GetHostUnit() - self:F( self ) - - if self.CargoHostName then - - -- A Host has been given, signal the host - local CargoHostGroup = self.CargoHostSpawn:GetGroupFromIndex() - local CargoHostUnit - if CargoHostGroup and CargoHostGroup:IsAlive() then - CargoHostUnit = CargoHostGroup:GetUnit(1) - else - CargoHostUnit = StaticObject.getByName( self.CargoHostName ) - end - - return CargoHostUnit - end - - return nil -end - -function CARGO_ZONE:ReportCargosToClient( Client, CargoType ) - self:F() - - local SignalUnit = self:GetHostUnit() - - if SignalUnit then - - local SignalUnitTypeName = SignalUnit:getTypeName() - - local HostMessage = "" - - local IsCargo = false - for CargoID, Cargo in pairs( CARGOS ) do - if Cargo.CargoType == Task.CargoType then - if Cargo:IsStatusNone() then - HostMessage = HostMessage .. " - " .. Cargo.CargoName .. " - " .. Cargo.CargoType .. " (" .. Cargo.Weight .. "kg)" .. "\n" - IsCargo = true - end - end - end - - if not IsCargo then - HostMessage = "No Cargo Available." - end - - Client:Message( HostMessage, 20, Mission.Name .. "/StageHosts." .. SignalUnitTypeName, SignalUnitTypeName .. ": Reporting Cargo", 10 ) - end -end - - -function CARGO_ZONE:Signal() - self:F() - - local Signalled = false - - if self.SignalType then - - if self.CargoHostName then - - -- A Host has been given, signal the host - - local SignalUnit = self:GetHostUnit() - - if SignalUnit then - - self:T( 'Signalling Unit' ) - local SignalVehiclePos = SignalUnit:GetPointVec3() - SignalVehiclePos.y = SignalVehiclePos.y + 2 - - if self.SignalType.ID == CARGO_ZONE.SIGNAL.TYPE.SMOKE.ID then - - trigger.action.smoke( SignalVehiclePos, self.SignalColor.TRIGGERCOLOR ) - Signalled = true - - elseif self.SignalType.ID == CARGO_ZONE.SIGNAL.TYPE.FLARE.ID then - - trigger.action.signalFlare( SignalVehiclePos, self.SignalColor.TRIGGERCOLOR , 0 ) - Signalled = false - - end - end - - else - - local ZonePointVec3 = self:GetPointVec3( self.SignalHeight ) -- Get the zone position + the landheight + 2 meters - - if self.SignalType.ID == CARGO_ZONE.SIGNAL.TYPE.SMOKE.ID then - - trigger.action.smoke( ZonePointVec3, self.SignalColor.TRIGGERCOLOR ) - Signalled = true - - elseif self.SignalType.ID == CARGO_ZONE.SIGNAL.TYPE.FLARE.ID then - trigger.action.signalFlare( ZonePointVec3, self.SignalColor.TRIGGERCOLOR, 0 ) - Signalled = false - - end - end - end - - return Signalled - -end - -function CARGO_ZONE:WhiteSmoke( SignalHeight ) - self:F() - - self.SignalType = CARGO_ZONE.SIGNAL.TYPE.SMOKE - self.SignalColor = CARGO_ZONE.SIGNAL.COLOR.WHITE - - if SignalHeight then - self.SignalHeight = SignalHeight - end - - return self -end - -function CARGO_ZONE:BlueSmoke( SignalHeight ) - self:F() - - self.SignalType = CARGO_ZONE.SIGNAL.TYPE.SMOKE - self.SignalColor = CARGO_ZONE.SIGNAL.COLOR.BLUE - - if SignalHeight then - self.SignalHeight = SignalHeight - end - - return self -end - -function CARGO_ZONE:RedSmoke( SignalHeight ) - self:F() - - self.SignalType = CARGO_ZONE.SIGNAL.TYPE.SMOKE - self.SignalColor = CARGO_ZONE.SIGNAL.COLOR.RED - - if SignalHeight then - self.SignalHeight = SignalHeight - end - - return self -end - -function CARGO_ZONE:OrangeSmoke( SignalHeight ) - self:F() - - self.SignalType = CARGO_ZONE.SIGNAL.TYPE.SMOKE - self.SignalColor = CARGO_ZONE.SIGNAL.COLOR.ORANGE - - if SignalHeight then - self.SignalHeight = SignalHeight - end - - return self -end - -function CARGO_ZONE:GreenSmoke( SignalHeight ) - self:F() - - self.SignalType = CARGO_ZONE.SIGNAL.TYPE.SMOKE - self.SignalColor = CARGO_ZONE.SIGNAL.COLOR.GREEN - - if SignalHeight then - self.SignalHeight = SignalHeight - end - - return self -end - - -function CARGO_ZONE:WhiteFlare( SignalHeight ) - self:F() - - self.SignalType = CARGO_ZONE.SIGNAL.TYPE.FLARE - self.SignalColor = CARGO_ZONE.SIGNAL.COLOR.WHITE - - if SignalHeight then - self.SignalHeight = SignalHeight - end - - return self -end - -function CARGO_ZONE:RedFlare( SignalHeight ) - self:F() - - self.SignalType = CARGO_ZONE.SIGNAL.TYPE.FLARE - self.SignalColor = CARGO_ZONE.SIGNAL.COLOR.RED - - if SignalHeight then - self.SignalHeight = SignalHeight - end - - return self -end - -function CARGO_ZONE:GreenFlare( SignalHeight ) - self:F() - - self.SignalType = CARGO_ZONE.SIGNAL.TYPE.FLARE - self.SignalColor = CARGO_ZONE.SIGNAL.COLOR.GREEN - - if SignalHeight then - self.SignalHeight = SignalHeight - end - - return self -end - -function CARGO_ZONE:YellowFlare( SignalHeight ) - self:F() - - self.SignalType = CARGO_ZONE.SIGNAL.TYPE.FLARE - self.SignalColor = CARGO_ZONE.SIGNAL.COLOR.YELLOW - - if SignalHeight then - self.SignalHeight = SignalHeight - end - - return self -end - - -function CARGO_ZONE:GetCargoHostUnit() - self:F( self ) - - if self.CargoHostSpawn then - local CargoHostGroup = self.CargoHostSpawn:GetGroupFromIndex(1) - if CargoHostGroup and CargoHostGroup:IsAlive() then - local CargoHostUnit = CargoHostGroup:GetUnit(1) - if CargoHostUnit and CargoHostUnit:IsAlive() then - return CargoHostUnit - end - end - end - - return nil -end - -function CARGO_ZONE:GetCargoZoneName() - self:F() - - return self.CargoZoneName -end - -CARGO = { - ClassName = "CARGO", - STATUS = { - NONE = 0, - LOADED = 1, - UNLOADED = 2, - LOADING = 3 - }, - CargoClient = nil -} - ---- Add Cargo to the mission... Cargo functionality needs to be reworked a bit, so this is still under construction. I need to make a CARGO Class... -function CARGO:New( CargoType, CargoName, CargoWeight ) local self = BASE:Inherit( self, BASE:New() ) - self:F( { CargoType, CargoName, CargoWeight } ) - - - self.CargoType = CargoType - self.CargoName = CargoName - self.CargoWeight = CargoWeight - - self:StatusNone() - - return self -end - -function CARGO:Spawn( Client ) - self:F() - - return self - -end - -function CARGO:IsNear( Client, LandingZone ) - self:F() - - local Near = true - - return Near - -end - - -function CARGO:IsLoadingToClient() - self:F() - - if self:IsStatusLoading() then - return self.CargoClient - end - - return nil - -end - - -function CARGO:IsLoadedInClient() - self:F() - - if self:IsStatusLoaded() then - return self.CargoClient - end - - return nil - -end - - -function CARGO:UnLoad( Client, TargetZoneName ) - self:F() - - self:StatusUnLoaded() - - return self -end - -function CARGO:OnBoard( Client, LandingZone ) - self:F() - - local Valid = true - - self.CargoClient = Client - local ClientUnit = Client:GetClientGroupDCSUnit() - - return Valid -end - -function CARGO:OnBoarded( Client, LandingZone ) - self:F() - - local OnBoarded = true - - return OnBoarded -end - -function CARGO:Load( Client ) - self:F() - - self:StatusLoaded( Client ) - - return self -end - -function CARGO:IsLandingRequired() - self:F() - return true -end - -function CARGO:IsSlingLoad() - self:F() - return false -end - - -function CARGO:StatusNone() - self:F() - - self.CargoClient = nil - self.CargoStatus = CARGO.STATUS.NONE - - return self -end - -function CARGO:StatusLoading( Client ) - self:F() - - self.CargoClient = Client - self.CargoStatus = CARGO.STATUS.LOADING - self:T( "Cargo " .. self.CargoName .. " loading to Client: " .. self.CargoClient:GetClientGroupName() ) - - return self -end - -function CARGO:StatusLoaded( Client ) - self:F() - - self.CargoClient = Client - self.CargoStatus = CARGO.STATUS.LOADED - self:T( "Cargo " .. self.CargoName .. " loaded in Client: " .. self.CargoClient:GetClientGroupName() ) - - return self -end - -function CARGO:StatusUnLoaded() - self:F() - - self.CargoClient = nil - self.CargoStatus = CARGO.STATUS.UNLOADED - - return self -end - - -function CARGO:IsStatusNone() - self:F() - - return self.CargoStatus == CARGO.STATUS.NONE -end - -function CARGO:IsStatusLoading() - self:F() - - return self.CargoStatus == CARGO.STATUS.LOADING -end - -function CARGO:IsStatusLoaded() - self:F() - - return self.CargoStatus == CARGO.STATUS.LOADED -end - -function CARGO:IsStatusUnLoaded() - self:F() - - return self.CargoStatus == CARGO.STATUS.UNLOADED -end - - -CARGO_GROUP = { - ClassName = "CARGO_GROUP" -} - - -function CARGO_GROUP:New( CargoType, CargoName, CargoWeight, CargoGroupTemplate, CargoZone ) local self = BASE:Inherit( self, CARGO:New( CargoType, CargoName, CargoWeight ) ) - self:F( { CargoType, CargoName, CargoWeight, CargoGroupTemplate, CargoZone } ) - - self.CargoSpawn = SPAWN:NewWithAlias( CargoGroupTemplate, CargoName ) - self.CargoZone = CargoZone - - CARGOS[self.CargoName] = self - - return self - -end - -function CARGO_GROUP:Spawn( Client ) - self:F( { Client } ) - - local SpawnCargo = true - - if self:IsStatusNone() then - local CargoGroup = Group.getByName( self.CargoName ) - if CargoGroup and CargoGroup:isExist() then - SpawnCargo = false - end - - elseif self:IsStatusLoading() then - - local Client = self:IsLoadingToClient() - if Client and Client:GetDCSGroup() then - SpawnCargo = false - else - local CargoGroup = Group.getByName( self.CargoName ) - if CargoGroup and CargoGroup:isExist() then - SpawnCargo = false - end - end - - elseif self:IsStatusLoaded() then - - local ClientLoaded = self:IsLoadedInClient() - -- Now test if another Client is alive (not this one), and it has the CARGO, then this cargo does not need to be initialized and spawned. - if ClientLoaded and ClientLoaded ~= Client then - local ClientGroup = Client:GetDCSGroup() - if ClientLoaded:GetClientGroupDCSUnit() and ClientLoaded:GetClientGroupDCSUnit():isExist() then - SpawnCargo = false - else - self:StatusNone() - end - else - -- Same Client, but now in initialize, so set back the status to None. - self:StatusNone() - end - - elseif self:IsStatusUnLoaded() then - - SpawnCargo = false - - end - - if SpawnCargo then - if self.CargoZone:GetCargoHostUnit() then - --- ReSpawn the Cargo from the CargoHost - self.CargoGroupName = self.CargoSpawn:SpawnFromUnit( self.CargoZone:GetCargoHostUnit(), 60, 30, 1 ):GetName() - else - --- ReSpawn the Cargo in the CargoZone without a host ... - self:T( self.CargoZone ) - self.CargoGroupName = self.CargoSpawn:SpawnInZone( self.CargoZone, true, 1 ):GetName() - end - self:StatusNone() - end - - self:T( { self.CargoGroupName, CARGOS[self.CargoName].CargoGroupName } ) - - return self -end - -function CARGO_GROUP:IsNear( Client, LandingZone ) - self:F() - - local Near = false - - if self.CargoGroupName then - local CargoGroup = Group.getByName( self.CargoGroupName ) - if routines.IsPartOfGroupInRadius( CargoGroup, Client:GetPositionVec3(), 250 ) then - Near = true - end - end - - return Near - -end - - -function CARGO_GROUP:OnBoard( Client, LandingZone, OnBoardSide ) - self:F() - - local Valid = true - - local ClientUnit = Client:GetClientGroupDCSUnit() - - local CarrierPos = ClientUnit:getPoint() - local CarrierPosMove = ClientUnit:getPoint() - local CarrierPosOnBoard = ClientUnit:getPoint() - - local CargoGroup = Group.getByName( self.CargoGroupName ) - - local CargoUnit = CargoGroup:getUnit(1) - local CargoPos = CargoUnit:getPoint() - - self.CargoInAir = CargoUnit:inAir() - - self:T( self.CargoInAir ) - - -- Only move the group to the carrier when the cargo is not in the air - -- (eg. cargo can be on a oil derrick, moving the cargo on the oil derrick will drop the cargo on the sea). - if not self.CargoInAir then - - local Points = {} - - self:T( 'CargoPos x = ' .. CargoPos.x .. " z = " .. CargoPos.z ) - self:T( 'CarrierPosMove x = ' .. CarrierPosMove.x .. " z = " .. CarrierPosMove.z ) - - Points[#Points+1] = routines.ground.buildWP( CargoPos, "Cone", 10 ) - - self:T( 'Points[1] x = ' .. Points[1].x .. " y = " .. Points[1].y ) - - if OnBoardSide == nil then - OnBoardSide = CLIENT.ONBOARDSIDE.NONE - end - - if OnBoardSide == CLIENT.ONBOARDSIDE.LEFT then - - self:T( "TransportCargoOnBoard: Onboarding LEFT" ) - CarrierPosMove.z = CarrierPosMove.z - 25 - CarrierPosOnBoard.z = CarrierPosOnBoard.z - 5 - Points[#Points+1] = routines.ground.buildWP( CarrierPosMove, "Cone", 10 ) - Points[#Points+1] = routines.ground.buildWP( CarrierPosOnBoard, "Cone", 10 ) - - elseif OnBoardSide == CLIENT.ONBOARDSIDE.RIGHT then - - self:T( "TransportCargoOnBoard: Onboarding RIGHT" ) - CarrierPosMove.z = CarrierPosMove.z + 25 - CarrierPosOnBoard.z = CarrierPosOnBoard.z + 5 - Points[#Points+1] = routines.ground.buildWP( CarrierPosMove, "Cone", 10 ) - Points[#Points+1] = routines.ground.buildWP( CarrierPosOnBoard, "Cone", 10 ) - - elseif OnBoardSide == CLIENT.ONBOARDSIDE.BACK then - - self:T( "TransportCargoOnBoard: Onboarding BACK" ) - CarrierPosMove.x = CarrierPosMove.x - 25 - CarrierPosOnBoard.x = CarrierPosOnBoard.x - 5 - Points[#Points+1] = routines.ground.buildWP( CarrierPosMove, "Cone", 10 ) - Points[#Points+1] = routines.ground.buildWP( CarrierPosOnBoard, "Cone", 10 ) - - elseif OnBoardSide == CLIENT.ONBOARDSIDE.FRONT then - - self:T( "TransportCargoOnBoard: Onboarding FRONT" ) - CarrierPosMove.x = CarrierPosMove.x + 25 - CarrierPosOnBoard.x = CarrierPosOnBoard.x + 5 - Points[#Points+1] = routines.ground.buildWP( CarrierPosMove, "Cone", 10 ) - Points[#Points+1] = routines.ground.buildWP( CarrierPosOnBoard, "Cone", 10 ) - - elseif OnBoardSide == CLIENT.ONBOARDSIDE.NONE then - - self:T( "TransportCargoOnBoard: Onboarding CENTRAL" ) - Points[#Points+1] = routines.ground.buildWP( CarrierPos, "Cone", 10 ) - - end - self:T( "TransportCargoOnBoard: Routing " .. self.CargoGroupName ) - - --routines.scheduleFunction( routines.goRoute, { self.CargoGroupName, Points}, timer.getTime() + 4 ) - SCHEDULER:New( self, routines.goRoute, { self.CargoGroupName, Points}, 4 ) - end - - self:StatusLoading( Client ) - - return Valid - -end - - -function CARGO_GROUP:OnBoarded( Client, LandingZone ) - self:F() - - local OnBoarded = false - - local CargoGroup = Group.getByName( self.CargoGroupName ) - - if not self.CargoInAir then - if routines.IsPartOfGroupInRadius( CargoGroup, Client:GetPositionVec3(), 25 ) then - CargoGroup:destroy() - self:StatusLoaded( Client ) - OnBoarded = true - end - else - CargoGroup:destroy() - self:StatusLoaded( Client ) - OnBoarded = true - end - - return OnBoarded -end - - -function CARGO_GROUP:UnLoad( Client, TargetZoneName ) - self:F() - - self:T( 'self.CargoName = ' .. self.CargoName ) - - local CargoGroup = self.CargoSpawn:SpawnFromUnit( Client:GetClientGroupUnit(), 60, 30 ) - - self.CargoGroupName = CargoGroup:GetName() - self:T( 'self.CargoGroupName = ' .. self.CargoGroupName ) - - CargoGroup:TaskRouteToZone( ZONE:New( TargetZoneName ), true ) - - self:StatusUnLoaded() - - return self -end - - -CARGO_PACKAGE = { - ClassName = "CARGO_PACKAGE" -} - - -function CARGO_PACKAGE:New( CargoType, CargoName, CargoWeight, CargoClient ) local self = BASE:Inherit( self, CARGO:New( CargoType, CargoName, CargoWeight ) ) - self:F( { CargoType, CargoName, CargoWeight, CargoClient } ) - - self.CargoClient = CargoClient - - CARGOS[self.CargoName] = self - - return self - -end - - -function CARGO_PACKAGE:Spawn( Client ) - self:F( { self, Client } ) - - -- this needs to be checked thoroughly - - local CargoClientGroup = self.CargoClient:GetDCSGroup() - if not CargoClientGroup then - if not self.CargoClientSpawn then - self.CargoClientSpawn = SPAWN:New( self.CargoClient:GetClientGroupName() ):Limit( 1, 1 ) - end - self.CargoClientSpawn:ReSpawn( 1 ) - end - - local SpawnCargo = true - - if self:IsStatusNone() then - - elseif self:IsStatusLoading() or self:IsStatusLoaded() then - - local CargoClientLoaded = self:IsLoadedInClient() - if CargoClientLoaded and CargoClientLoaded:GetDCSGroup() then - SpawnCargo = false - end - - elseif self:IsStatusUnLoaded() then - - SpawnCargo = false - - else - - end - - if SpawnCargo then - self:StatusLoaded( self.CargoClient ) - end - - return self -end - - -function CARGO_PACKAGE:IsNear( Client, LandingZone ) - self:F() - - local Near = false - - if self.CargoClient and self.CargoClient:GetDCSGroup() then - self:T( self.CargoClient.ClientName ) - self:T( 'Client Exists.' ) - - if routines.IsUnitInRadius( self.CargoClient:GetClientGroupDCSUnit(), Client:GetPositionVec3(), 150 ) then - Near = true - end - end - - return Near - -end - - -function CARGO_PACKAGE:OnBoard( Client, LandingZone, OnBoardSide ) - self:F() - - local Valid = true - - local ClientUnit = Client:GetClientGroupDCSUnit() - - local CarrierPos = ClientUnit:getPoint() - local CarrierPosMove = ClientUnit:getPoint() - local CarrierPosOnBoard = ClientUnit:getPoint() - local CarrierPosMoveAway = ClientUnit:getPoint() - - local CargoHostGroup = self.CargoClient:GetDCSGroup() - local CargoHostName = self.CargoClient:GetDCSGroup():getName() - - local CargoHostUnits = CargoHostGroup:getUnits() - local CargoPos = CargoHostUnits[1]:getPoint() - - local Points = {} - - self:T( 'CargoPos x = ' .. CargoPos.x .. " z = " .. CargoPos.z ) - self:T( 'CarrierPosMove x = ' .. CarrierPosMove.x .. " z = " .. CarrierPosMove.z ) - - Points[#Points+1] = routines.ground.buildWP( CargoPos, "Cone", 10 ) - - self:T( 'Points[1] x = ' .. Points[1].x .. " y = " .. Points[1].y ) - - if OnBoardSide == nil then - OnBoardSide = CLIENT.ONBOARDSIDE.NONE - end - - if OnBoardSide == CLIENT.ONBOARDSIDE.LEFT then - - self:T( "TransportCargoOnBoard: Onboarding LEFT" ) - CarrierPosMove.z = CarrierPosMove.z - 25 - CarrierPosOnBoard.z = CarrierPosOnBoard.z - 5 - CarrierPosMoveAway.z = CarrierPosMoveAway.z - 20 - Points[#Points+1] = routines.ground.buildWP( CarrierPosMove, "Cone", 10 ) - Points[#Points+1] = routines.ground.buildWP( CarrierPosOnBoard, "Cone", 10 ) - Points[#Points+1] = routines.ground.buildWP( CarrierPosMoveAway, "Cone", 10 ) - - elseif OnBoardSide == CLIENT.ONBOARDSIDE.RIGHT then - - self:T( "TransportCargoOnBoard: Onboarding RIGHT" ) - CarrierPosMove.z = CarrierPosMove.z + 25 - CarrierPosOnBoard.z = CarrierPosOnBoard.z + 5 - CarrierPosMoveAway.z = CarrierPosMoveAway.z + 20 - Points[#Points+1] = routines.ground.buildWP( CarrierPosMove, "Cone", 10 ) - Points[#Points+1] = routines.ground.buildWP( CarrierPosOnBoard, "Cone", 10 ) - Points[#Points+1] = routines.ground.buildWP( CarrierPosMoveAway, "Cone", 10 ) - - elseif OnBoardSide == CLIENT.ONBOARDSIDE.BACK then - - self:T( "TransportCargoOnBoard: Onboarding BACK" ) - CarrierPosMove.x = CarrierPosMove.x - 25 - CarrierPosOnBoard.x = CarrierPosOnBoard.x - 5 - CarrierPosMoveAway.x = CarrierPosMoveAway.x - 20 - Points[#Points+1] = routines.ground.buildWP( CarrierPosMove, "Cone", 10 ) - Points[#Points+1] = routines.ground.buildWP( CarrierPosOnBoard, "Cone", 10 ) - Points[#Points+1] = routines.ground.buildWP( CarrierPosMoveAway, "Cone", 10 ) - - elseif OnBoardSide == CLIENT.ONBOARDSIDE.FRONT then - - self:T( "TransportCargoOnBoard: Onboarding FRONT" ) - CarrierPosMove.x = CarrierPosMove.x + 25 - CarrierPosOnBoard.x = CarrierPosOnBoard.x + 5 - CarrierPosMoveAway.x = CarrierPosMoveAway.x + 20 - Points[#Points+1] = routines.ground.buildWP( CarrierPosMove, "Cone", 10 ) - Points[#Points+1] = routines.ground.buildWP( CarrierPosOnBoard, "Cone", 10 ) - Points[#Points+1] = routines.ground.buildWP( CarrierPosMoveAway, "Cone", 10 ) - - elseif OnBoardSide == CLIENT.ONBOARDSIDE.NONE then - - self:T( "TransportCargoOnBoard: Onboarding FRONT" ) - CarrierPosMove.x = CarrierPosMove.x + 25 - CarrierPosOnBoard.x = CarrierPosOnBoard.x + 5 - CarrierPosMoveAway.x = CarrierPosMoveAway.x + 20 - Points[#Points+1] = routines.ground.buildWP( CarrierPosMove, "Cone", 10 ) - Points[#Points+1] = routines.ground.buildWP( CarrierPosOnBoard, "Cone", 10 ) - Points[#Points+1] = routines.ground.buildWP( CarrierPosMoveAway, "Cone", 10 ) - - end - self:T( "Routing " .. CargoHostName ) - - --routines.scheduleFunction( routines.goRoute, { CargoHostName, Points}, timer.getTime() + 4 ) - SCHEDULER:New( self, routines.goRoute, { CargoHostName, Points }, 4 ) - - return Valid - -end - - -function CARGO_PACKAGE:OnBoarded( Client, LandingZone ) - self:F() - - local OnBoarded = false - - if self.CargoClient and self.CargoClient:GetDCSGroup() then - if routines.IsUnitInRadius( self.CargoClient:GetClientGroupDCSUnit(), self.CargoClient:GetPositionVec3(), 10 ) then - - -- Switch Cargo from self.CargoClient to Client ... Each cargo can have only one client. So assigning the new client for the cargo is enough. - self:StatusLoaded( Client ) - - -- All done, onboarded the Cargo to the new Client. - OnBoarded = true - end - end - - return OnBoarded -end - - -function CARGO_PACKAGE:UnLoad( Client, TargetZoneName ) - self:F() - - self:T( 'self.CargoName = ' .. self.CargoName ) - --self:T( 'self.CargoHostName = ' .. self.CargoHostName ) - - --self.CargoSpawn:FromCarrier( Client:GetDCSGroup(), TargetZoneName, self.CargoHostName ) - self:StatusUnLoaded() - - return Cargo -end - - -CARGO_SLINGLOAD = { - ClassName = "CARGO_SLINGLOAD" -} - - -function CARGO_SLINGLOAD:New( CargoType, CargoName, CargoWeight, CargoZone, CargoHostName, CargoCountryID ) - local self = BASE:Inherit( self, CARGO:New( CargoType, CargoName, CargoWeight ) ) - self:F( { CargoType, CargoName, CargoWeight, CargoZone, CargoHostName, CargoCountryID } ) - - self.CargoHostName = CargoHostName - - -- Cargo will be initialized around the CargoZone position. - self.CargoZone = CargoZone - - self.CargoCount = 0 - self.CargoStaticName = string.format( "%s#%03d", self.CargoName, self.CargoCount ) - - -- The country ID needs to be correctly set. - self.CargoCountryID = CargoCountryID - - CARGOS[self.CargoName] = self - - return self - -end - - -function CARGO_SLINGLOAD:IsLandingRequired() - self:F() - return false -end - - -function CARGO_SLINGLOAD:IsSlingLoad() - self:F() - return true -end - - -function CARGO_SLINGLOAD:Spawn( Client ) - self:F( { self, Client } ) - - local Zone = trigger.misc.getZone( self.CargoZone ) - - local ZonePos = {} - ZonePos.x = Zone.point.x + math.random( Zone.radius / 2 * -1, Zone.radius / 2 ) - ZonePos.y = Zone.point.z + math.random( Zone.radius / 2 * -1, Zone.radius / 2 ) - - self:T( "Cargo Location = " .. ZonePos.x .. ", " .. ZonePos.y ) - - --[[ - -- This does not work in 1.5.2. - CargoStatic = StaticObject.getByName( self.CargoName ) - if CargoStatic then - CargoStatic:destroy() - end - --]] - - CargoStatic = StaticObject.getByName( self.CargoStaticName ) - - if CargoStatic and CargoStatic:isExist() then - CargoStatic:destroy() - end - - -- I need to make every time a new cargo due to bugs in 1.5.2. - - self.CargoCount = self.CargoCount + 1 - self.CargoStaticName = string.format( "%s#%03d", self.CargoName, self.CargoCount ) - - local CargoTemplate = { - ["category"] = "Cargo", - ["shape_name"] = "ab-212_cargo", - ["type"] = "Cargo1", - ["x"] = ZonePos.x, - ["y"] = ZonePos.y, - ["mass"] = self.CargoWeight, - ["name"] = self.CargoStaticName, - ["canCargo"] = true, - ["heading"] = 0, - } - - coalition.addStaticObject( self.CargoCountryID, CargoTemplate ) - --- end - - return self -end - - -function CARGO_SLINGLOAD:IsNear( Client, LandingZone ) - self:F() - - local Near = false - - return Near -end - - -function CARGO_SLINGLOAD:IsInLandingZone( Client, LandingZone ) - self:F() - - local Near = false - - local CargoStaticUnit = StaticObject.getByName( self.CargoName ) - if CargoStaticUnit then - if routines.IsStaticInZones( CargoStaticUnit, LandingZone ) then - Near = true - end - end - - return Near -end - - -function CARGO_SLINGLOAD:OnBoard( Client, LandingZone, OnBoardSide ) - self:F() - - local Valid = true - - - return Valid -end - - -function CARGO_SLINGLOAD:OnBoarded( Client, LandingZone ) - self:F() - - local OnBoarded = false - - local CargoStaticUnit = StaticObject.getByName( self.CargoName ) - if CargoStaticUnit then - if not routines.IsStaticInZones( CargoStaticUnit, LandingZone ) then - OnBoarded = true - end - end - - return OnBoarded -end - - -function CARGO_SLINGLOAD:UnLoad( Client, TargetZoneName ) - self:F() - - self:T( 'self.CargoName = ' .. self.CargoName ) - self:T( 'self.CargoGroupName = ' .. self.CargoGroupName ) - - self:StatusUnLoaded() - - return Cargo -end ---- Message System to display Messages for Clients and Coalitions or All. --- Messages are grouped on the display panel per Category to improve readability for the players. --- Messages are shown on the display panel for an amount of seconds, and will then disappear. --- Messages are identified by an ID. The messages with the same ID belonging to the same category will be overwritten if they were still being displayed on the display panel. --- Messages are created with MESSAGE:@{New}(). --- Messages are sent to Clients with MESSAGE:@{ToClient}(). --- Messages are sent to Coalitions with MESSAGE:@{ToCoalition}(). --- Messages are sent to All Players with MESSAGE:@{ToAll}(). --- @module Message - -Include.File( "Base" ) - ---- The MESSAGE class --- @type MESSAGE -MESSAGE = { - ClassName = "MESSAGE", - MessageCategory = 0, - MessageID = 0, -} - - ---- Creates a new MESSAGE object. Note that these MESSAGE objects are not yet displayed on the display panel. You must use the functions @{ToClient} or @{ToCoalition} or @{ToAll} to send these Messages to the respective recipients. --- @param self --- @param #string MessageText is the text of the Message. --- @param #string MessageCategory is a string expressing the Category of the Message. Messages are grouped on the display panel per Category to improve readability. --- @param #number MessageDuration is a number in seconds of how long the MESSAGE should be shown on the display panel. --- @param #string MessageID is a string expressing the ID of the Message. --- @return #MESSAGE --- @usage --- -- Create a series of new Messages. --- -- MessageAll is meant to be sent to all players, for 25 seconds, and is classified as "Score". --- -- MessageRED is meant to be sent to the RED players only, for 10 seconds, and is classified as "End of Mission", with ID "Win". --- -- MessageClient1 is meant to be sent to a Client, for 25 seconds, and is classified as "Score", with ID "Score". --- -- MessageClient1 is meant to be sent to a Client, for 25 seconds, and is classified as "Score", with ID "Score". --- MessageAll = MESSAGE:New( "To all Players: BLUE has won! Each player of BLUE wins 50 points!", "End of Mission", 25, "Win" ) --- MessageRED = MESSAGE:New( "To the RED Players: You receive a penalty because you've killed one of your own units", "Penalty", 25, "Score" ) --- MessageClient1 = MESSAGE:New( "Congratulations, you've just hit a target", "Score", 25, "Score" ) --- MessageClient2 = MESSAGE:New( "Congratulations, you've just killed a target", "Score", 25, "Score" ) -function MESSAGE:New( MessageText, MessageCategory, MessageDuration, MessageID ) - local self = BASE:Inherit( self, BASE:New() ) - self:F( { MessageText, MessageCategory, MessageDuration, MessageID } ) - - -- When no messagecategory is given, we don't show it as a title... - if MessageCategory and MessageCategory ~= "" then - self.MessageCategory = MessageCategory .. ": " - else - self.MessageCategory = "" - end - - self.MessageDuration = MessageDuration - self.MessageID = MessageID - self.MessageTime = timer.getTime() - self.MessageText = MessageText - - self.MessageSent = false - self.MessageGroup = false - self.MessageCoalition = false - - return self -end - ---- Sends a MESSAGE to a Client Group. Note that the Group needs to be defined within the ME with the skillset "Client" or "Player". --- @param #MESSAGE self --- @param Client#CLIENT Client is the Group of the Client. --- @return #MESSAGE --- @usage --- -- Send the 2 messages created with the @{New} method to the Client Group. --- -- Note that the Message of MessageClient2 is overwriting the Message of MessageClient1. --- ClientGroup = Group.getByName( "ClientGroup" ) --- --- MessageClient1 = MESSAGE:New( "Congratulations, you've just hit a target", "Score", 25, "Score" ):ToClient( ClientGroup ) --- MessageClient2 = MESSAGE:New( "Congratulations, you've just killed a target", "Score", 25, "Score" ):ToClient( ClientGroup ) --- or --- MESSAGE:New( "Congratulations, you've just hit a target", "Score", 25, "Score" ):ToClient( ClientGroup ) --- MESSAGE:New( "Congratulations, you've just killed a target", "Score", 25, "Score" ):ToClient( ClientGroup ) --- or --- MessageClient1 = MESSAGE:New( "Congratulations, you've just hit a target", "Score", 25, "Score" ) --- MessageClient2 = MESSAGE:New( "Congratulations, you've just killed a target", "Score", 25, "Score" ) --- MessageClient1:ToClient( ClientGroup ) --- MessageClient2:ToClient( ClientGroup ) -function MESSAGE:ToClient( Client ) - self:F( Client ) - - if Client and Client:GetClientGroupID() then - - local ClientGroupID = Client:GetClientGroupID() - self:T( self.MessageCategory .. self.MessageText:gsub("\n$",""):gsub("\n$","") .. " / " .. self.MessageDuration ) - trigger.action.outTextForGroup( ClientGroupID, self.MessageCategory .. self.MessageText:gsub("\n$",""):gsub("\n$",""), self.MessageDuration ) - end - - return self -end - ---- Sends a MESSAGE to the Blue coalition. --- @param #MESSAGE self --- @return #MESSAGE --- @usage --- -- Send a message created with the @{New} method to the BLUE coalition. --- MessageBLUE = MESSAGE:New( "To the BLUE Players: You receive a penalty because you've killed one of your own units", "Penalty", 25, "Score" ):ToBlue() --- or --- MESSAGE:New( "To the BLUE Players: You receive a penalty because you've killed one of your own units", "Penalty", 25, "Score" ):ToBlue() --- or --- MessageBLUE = MESSAGE:New( "To the BLUE Players: You receive a penalty because you've killed one of your own units", "Penalty", 25, "Score" ) --- MessageBLUE:ToBlue() -function MESSAGE:ToBlue() - self:F() - - self:ToCoalition( coalition.side.BLUE ) - - return self -end - ---- Sends a MESSAGE to the Red Coalition. --- @param #MESSAGE self --- @return #MESSAGE --- @usage --- -- Send a message created with the @{New} method to the RED coalition. --- MessageRED = MESSAGE:New( "To the RED Players: You receive a penalty because you've killed one of your own units", "Penalty", 25, "Score" ):ToRed() --- or --- MESSAGE:New( "To the RED Players: You receive a penalty because you've killed one of your own units", "Penalty", 25, "Score" ):ToRed() --- or --- MessageRED = MESSAGE:New( "To the RED Players: You receive a penalty because you've killed one of your own units", "Penalty", 25, "Score" ) --- MessageRED:ToRed() -function MESSAGE:ToRed( ) - self:F() - - self:ToCoalition( coalition.side.RED ) - - return self -end - ---- Sends a MESSAGE to a Coalition. --- @param #MESSAGE self --- @param CoalitionSide needs to be filled out by the defined structure of the standard scripting engine @{coalition.side}. --- @return #MESSAGE --- @usage --- -- Send a message created with the @{New} method to the RED coalition. --- MessageRED = MESSAGE:New( "To the RED Players: You receive a penalty because you've killed one of your own units", "Penalty", 25, "Score" ):ToCoalition( coalition.side.RED ) --- or --- MESSAGE:New( "To the RED Players: You receive a penalty because you've killed one of your own units", "Penalty", 25, "Score" ):ToCoalition( coalition.side.RED ) --- or --- MessageRED = MESSAGE:New( "To the RED Players: You receive a penalty because you've killed one of your own units", "Penalty", 25, "Score" ) --- MessageRED:ToCoalition( coalition.side.RED ) -function MESSAGE:ToCoalition( CoalitionSide ) - self:F( CoalitionSide ) - - if CoalitionSide then - self:T( self.MessageCategory .. self.MessageText:gsub("\n$",""):gsub("\n$","") .. " / " .. self.MessageDuration ) - trigger.action.outTextForCoalition( CoalitionSide, self.MessageCategory .. self.MessageText:gsub("\n$",""):gsub("\n$",""), self.MessageDuration ) - end - - return self -end - ---- Sends a MESSAGE to all players. --- @param #MESSAGE self --- @return #MESSAGE --- @usage --- -- Send a message created to all players. --- MessageAll = MESSAGE:New( "To all Players: BLUE has won! Each player of BLUE wins 50 points!", "End of Mission", 25, "Win" ):ToAll() --- or --- MESSAGE:New( "To all Players: BLUE has won! Each player of BLUE wins 50 points!", "End of Mission", 25, "Win" ):ToAll() --- or --- MessageAll = MESSAGE:New( "To all Players: BLUE has won! Each player of BLUE wins 50 points!", "End of Mission", 25, "Win" ) --- MessageAll:ToAll() -function MESSAGE:ToAll() - self:F() - - self:ToCoalition( coalition.side.RED ) - self:ToCoalition( coalition.side.BLUE ) - - return self -end - - - ---- The MESSAGEQUEUE class --- @type MESSAGEQUEUE -MESSAGEQUEUE = { - ClientGroups = {}, - CoalitionSides = {} -} - -function MESSAGEQUEUE:New( RefreshInterval ) - local self = BASE:Inherit( self, BASE:New() ) - self:F( { RefreshInterval } ) - - self.RefreshInterval = RefreshInterval - - --self.DisplayFunction = routines.scheduleFunction( self._DisplayMessages, { self }, 0, RefreshInterval ) - self.DisplayFunction = SCHEDULER:New( self, self._DisplayMessages, {}, 0, RefreshInterval ) - - return self -end - ---- This function is called automatically by the MESSAGEQUEUE scheduler. -function MESSAGEQUEUE:_DisplayMessages() - - -- First we display all messages that a coalition needs to receive... Also those who are not in a client (CA module clients...). - for CoalitionSideID, CoalitionSideData in pairs( self.CoalitionSides ) do - for MessageID, MessageData in pairs( CoalitionSideData.Messages ) do - if MessageData.MessageSent == false then - --trigger.action.outTextForCoalition( CoalitionSideID, MessageData.MessageCategory .. '\n' .. MessageData.MessageText:gsub("\n$",""):gsub("\n$",""), MessageData.MessageDuration ) - MessageData.MessageSent = true - end - local MessageTimeLeft = ( MessageData.MessageTime + MessageData.MessageDuration ) - timer.getTime() - if MessageTimeLeft <= 0 then - MessageData = nil - end - end - end - - -- Then we send the messages for each individual client, but also to be included are those Coalition messages for the Clients who belong to a coalition. - -- Because the Client messages will overwrite the Coalition messages (for that Client). - for ClientGroupName, ClientGroupData in pairs( self.ClientGroups ) do - for MessageID, MessageData in pairs( ClientGroupData.Messages ) do - if MessageData.MessageGroup == false then - trigger.action.outTextForGroup( Group.getByName(ClientGroupName):getID(), MessageData.MessageCategory .. '\n' .. MessageData.MessageText:gsub("\n$",""):gsub("\n$",""), MessageData.MessageDuration ) - MessageData.MessageGroup = true - end - local MessageTimeLeft = ( MessageData.MessageTime + MessageData.MessageDuration ) - timer.getTime() - if MessageTimeLeft <= 0 then - MessageData = nil - end - end - - -- Now check if the Client also has messages that belong to the Coalition of the Client... - for CoalitionSideID, CoalitionSideData in pairs( self.CoalitionSides ) do - for MessageID, MessageData in pairs( CoalitionSideData.Messages ) do - local CoalitionGroup = Group.getByName( ClientGroupName ) - if CoalitionGroup and CoalitionGroup:getCoalition() == CoalitionSideID then - if MessageData.MessageCoalition == false then - trigger.action.outTextForGroup( Group.getByName(ClientGroupName):getID(), MessageData.MessageCategory .. '\n' .. MessageData.MessageText:gsub("\n$",""):gsub("\n$",""), MessageData.MessageDuration ) - MessageData.MessageCoalition = true - end - end - local MessageTimeLeft = ( MessageData.MessageTime + MessageData.MessageDuration ) - timer.getTime() - if MessageTimeLeft <= 0 then - MessageData = nil - end - end - end - end - - return true -end - ---- The _MessageQueue object is created when the MESSAGE class module is loaded. ---_MessageQueue = MESSAGEQUEUE:New( 0.5 ) - ---- Stages within a @{TASK} within a @{MISSION}. All of the STAGE functionality is considered internally administered and not to be used by any Mission designer. --- @module STAGE --- @author Flightcontrol - -Include.File( "Routines" ) -Include.File( "Base" ) -Include.File( "Mission" ) -Include.File( "Client" ) -Include.File( "Task" ) - ---- The STAGE class --- @type -STAGE = { - ClassName = "STAGE", - MSG = { ID = "None", TIME = 10 }, - FREQUENCY = { NONE = 0, ONCE = 1, REPEAT = -1 }, - - Name = "NoStage", - StageType = '', - WaitTime = 1, - Frequency = 1, - MessageCount = 0, - MessageInterval = 15, - MessageShown = {}, - MessageShow = false, - MessageFlash = false -} - - -function STAGE:New() - local self = BASE:Inherit( self, BASE:New() ) - self:F() - return self -end - -function STAGE:Execute( Mission, Client, Task ) - - local Valid = true - - return Valid -end - -function STAGE:Executing( Mission, Client, Task ) - -end - -function STAGE:Validate( Mission, Client, Task ) - local Valid = true - - return Valid -end - - -STAGEBRIEF = { - ClassName = "BRIEF", - MSG = { ID = "Brief", TIME = 1 }, - Name = "Brief", - StageBriefingTime = 0, - StageBriefingDuration = 1 -} - -function STAGEBRIEF:New() - local self = BASE:Inherit( self, STAGE:New() ) - self:F() - self.StageType = 'CLIENT' - return self -end - ---- Execute --- @param #STAGEBRIEF self --- @param Mission#MISSION Mission --- @param Client#CLIENT Client --- @param Task#TASK Task --- @return #boolean -function STAGEBRIEF:Execute( Mission, Client, Task ) - local Valid = BASE:Inherited(self):Execute( Mission, Client, Task ) - self:F() - Client:ShowMissionBriefing( Mission.MissionBriefing ) - self.StageBriefingTime = timer.getTime() - return Valid -end - -function STAGEBRIEF:Validate( Mission, Client, Task ) - local Valid = STAGE:Validate( Mission, Client, Task ) - self:T() - - if timer.getTime() - self.StageBriefingTime <= self.StageBriefingDuration then - return 0 - else - self.StageBriefingTime = timer.getTime() - return 1 - end - -end - - -STAGESTART = { - ClassName = "START", - MSG = { ID = "Start", TIME = 1 }, - Name = "Start", - StageStartTime = 0, - StageStartDuration = 1 -} - -function STAGESTART:New() - local self = BASE:Inherit( self, STAGE:New() ) - self:F() - self.StageType = 'CLIENT' - return self -end - -function STAGESTART:Execute( Mission, Client, Task ) - self:F() - local Valid = BASE:Inherited(self):Execute( Mission, Client, Task ) - if Task.TaskBriefing then - Client:Message( Task.TaskBriefing, 30, Mission.Name .. "/Stage", "Command" ) - else - Client:Message( 'Task ' .. Task.TaskNumber .. '.', 30, Mission.Name .. "/Stage", "Command" ) - end - self.StageStartTime = timer.getTime() - return Valid -end - -function STAGESTART:Validate( Mission, Client, Task ) - self:F() - local Valid = STAGE:Validate( Mission, Client, Task ) - - if timer.getTime() - self.StageStartTime <= self.StageStartDuration then - return 0 - else - self.StageStartTime = timer.getTime() - return 1 - end - - return 1 - -end - -STAGE_CARGO_LOAD = { - ClassName = "STAGE_CARGO_LOAD" -} - -function STAGE_CARGO_LOAD:New() - local self = BASE:Inherit( self, STAGE:New() ) - self:F() - self.StageType = 'CLIENT' - return self -end - -function STAGE_CARGO_LOAD:Execute( Mission, Client, Task ) - self:F() - local Valid = BASE:Inherited(self):Execute( Mission, Client, Task ) - - for LoadCargoID, LoadCargo in pairs( Task.Cargos.LoadCargos ) do - LoadCargo:Load( Client ) - end - - if Mission.MissionReportFlash and Client:IsTransport() then - Client:ShowCargo() - end - - return Valid -end - -function STAGE_CARGO_LOAD:Validate( Mission, Client, Task ) - self:F() - local Valid = STAGE:Validate( Mission, Client, Task ) - - return 1 -end - - -STAGE_CARGO_INIT = { - ClassName = "STAGE_CARGO_INIT" -} - -function STAGE_CARGO_INIT:New() - local self = BASE:Inherit( self, STAGE:New() ) - self:F() - self.StageType = 'CLIENT' - return self -end - -function STAGE_CARGO_INIT:Execute( Mission, Client, Task ) - self:F() - local Valid = BASE:Inherited(self):Execute( Mission, Client, Task ) - - for InitLandingZoneID, InitLandingZone in pairs( Task.LandingZones.LandingZones ) do - self:T( InitLandingZone ) - InitLandingZone:Spawn() - end - - - self:T( Task.Cargos.InitCargos ) - for InitCargoID, InitCargoData in pairs( Task.Cargos.InitCargos ) do - self:T( { InitCargoData } ) - InitCargoData:Spawn( Client ) - end - - return Valid -end - - -function STAGE_CARGO_INIT:Validate( Mission, Client, Task ) - self:F() - local Valid = STAGE:Validate( Mission, Client, Task ) - - return 1 -end - - - -STAGEROUTE = { - ClassName = "STAGEROUTE", - MSG = { ID = "Route", TIME = 5 }, - Frequency = STAGE.FREQUENCY.REPEAT, - Name = "Route" -} - -function STAGEROUTE:New() - local self = BASE:Inherit( self, STAGE:New() ) - self:F() - self.StageType = 'CLIENT' - self.MessageSwitch = true - return self -end - - ---- Execute the routing. --- @param #STAGEROUTE self --- @param Mission#MISSION Mission --- @param Client#CLIENT Client --- @param Task#TASK Task -function STAGEROUTE:Execute( Mission, Client, Task ) - self:F() - local Valid = BASE:Inherited(self):Execute( Mission, Client, Task ) - - local RouteMessage = "Fly to: " - self:T( Task.LandingZones ) - for LandingZoneID, LandingZoneName in pairs( Task.LandingZones.LandingZoneNames ) do - RouteMessage = RouteMessage .. "\n " .. LandingZoneName .. ' at ' .. routines.getBRStringZone( { zone = LandingZoneName, ref = Client:GetClientGroupDCSUnit():getPoint(), true, true } ) .. ' km.' - end - - if Client:IsMultiSeated() then - Client:Message( RouteMessage, self.MSG.TIME, Mission.Name .. "/StageRoute", "Co-Pilot", 20 ) - else - Client:Message( RouteMessage, self.MSG.TIME, Mission.Name .. "/StageRoute", "Command", 20 ) - end - - - if Mission.MissionReportFlash and Client:IsTransport() then - Client:ShowCargo() - end - - return Valid -end - -function STAGEROUTE:Validate( Mission, Client, Task ) - self:F() - local Valid = STAGE:Validate( Mission, Client, Task ) - - -- check if the Client is in the landing zone - self:T( Task.LandingZones.LandingZoneNames ) - Task.CurrentLandingZoneName = routines.IsUnitNearZonesRadius( Client:GetClientGroupDCSUnit(), Task.LandingZones.LandingZoneNames, 500 ) - - if Task.CurrentLandingZoneName then - - Task.CurrentLandingZone = Task.LandingZones.LandingZones[Task.CurrentLandingZoneName].CargoZone - Task.CurrentCargoZone = Task.LandingZones.LandingZones[Task.CurrentLandingZoneName] - - if Task.CurrentCargoZone then - if not Task.Signalled then - Task.Signalled = Task.CurrentCargoZone:Signal() - end - end - - self:T( 1 ) - return 1 - end - - self:T( 0 ) - return 0 -end - - - -STAGELANDING = { - ClassName = "STAGELANDING", - MSG = { ID = "Landing", TIME = 10 }, - Name = "Landing", - Signalled = false -} - -function STAGELANDING:New() - local self = BASE:Inherit( self, STAGE:New() ) - self:F() - self.StageType = 'CLIENT' - return self -end - ---- Execute the landing coordination. --- @param #STAGELANDING self --- @param Mission#MISSION Mission --- @param Client#CLIENT Client --- @param Task#TASK Task -function STAGELANDING:Execute( Mission, Client, Task ) - self:F() - - if Client:IsMultiSeated() then - Client:Message( "We have arrived at the landing zone.", self.MSG.TIME, Mission.Name .. "/StageArrived", "Co-Pilot", 10 ) - else - Client:Message( "You have arrived at the landing zone.", self.MSG.TIME, Mission.Name .. "/StageArrived", "Command", 10 ) - end - - Task.HostUnit = Task.CurrentCargoZone:GetHostUnit() - - self:T( { Task.HostUnit } ) - - if Task.HostUnit then - - Task.HostUnitName = Task.HostUnit:GetPrefix() - Task.HostUnitTypeName = Task.HostUnit:GetTypeName() - - local HostMessage = "" - Task.CargoNames = "" - - local IsFirst = true - - for CargoID, Cargo in pairs( CARGOS ) do - if Cargo.CargoType == Task.CargoType then - - if Cargo:IsLandingRequired() then - self:T( "Task for cargo " .. Cargo.CargoType .. " requires landing.") - Task.IsLandingRequired = true - end - - if Cargo:IsSlingLoad() then - self:T( "Task for cargo " .. Cargo.CargoType .. " is a slingload.") - Task.IsSlingLoad = true - end - - if IsFirst then - IsFirst = false - Task.CargoNames = Task.CargoNames .. Cargo.CargoName .. "( " .. Cargo.CargoWeight .. " )" - else - Task.CargoNames = Task.CargoNames .. "; " .. Cargo.CargoName .. "( " .. Cargo.CargoWeight .. " )" - end - end - end - - if Task.IsLandingRequired then - HostMessage = "Land the helicopter to " .. Task.TEXT[1] .. " " .. Task.CargoNames .. "." - else - HostMessage = "Use the Radio menu and F6 to find the cargo, then fly or land near the cargo and " .. Task.TEXT[1] .. " " .. Task.CargoNames .. "." - end - - local Host = "Command" - if Task.HostUnitName then - Host = Task.HostUnitName .. " (" .. Task.HostUnitTypeName .. ")" - else - if Client:IsMultiSeated() then - Host = "Co-Pilot" - end - end - - Client:Message( HostMessage, self.MSG.TIME, Mission.Name .. "/STAGELANDING.EXEC." .. Host, Host, 10 ) - - end -end - -function STAGELANDING:Validate( Mission, Client, Task ) - self:F() - - Task.CurrentLandingZoneName = routines.IsUnitNearZonesRadius( Client:GetClientGroupDCSUnit(), Task.LandingZones.LandingZoneNames, 500 ) - if Task.CurrentLandingZoneName then - - -- Client is in de landing zone. - self:T( Task.CurrentLandingZoneName ) - - Task.CurrentLandingZone = Task.LandingZones.LandingZones[Task.CurrentLandingZoneName].CargoZone - Task.CurrentCargoZone = Task.LandingZones.LandingZones[Task.CurrentLandingZoneName] - - if Task.CurrentCargoZone then - if not Task.Signalled then - Task.Signalled = Task.CurrentCargoZone:Signal() - end - end - else - if Task.CurrentLandingZone then - Task.CurrentLandingZone = nil - end - if Task.CurrentCargoZone then - Task.CurrentCargoZone = nil - end - Task.Signalled = false - Task:RemoveCargoMenus( Client ) - self:T( -1 ) - return -1 - end - - - local DCSUnitVelocityVec3 = Client:GetClientGroupDCSUnit():getVelocity() - local DCSUnitVelocity = ( DCSUnitVelocityVec3.x ^2 + DCSUnitVelocityVec3.y ^2 + DCSUnitVelocityVec3.z ^2 ) ^ 0.5 - - local DCSUnitPointVec3 = Client:GetClientGroupDCSUnit():getPoint() - local LandHeight = land.getHeight( { x = DCSUnitPointVec3.x, y = DCSUnitPointVec3.z } ) - local DCSUnitHeight = DCSUnitPointVec3.y - LandHeight - - self:T( { Task.IsLandingRequired, Client:GetClientGroupDCSUnit():inAir() } ) - if Task.IsLandingRequired and not Client:GetClientGroupDCSUnit():inAir() then - self:T( 1 ) - Task.IsInAirTestRequired = true - return 1 - end - - self:T( { DCSUnitVelocity, DCSUnitHeight, LandHeight, Task.CurrentCargoZone.SignalHeight } ) - if Task.IsLandingRequired and DCSUnitVelocity <= 0.05 and DCSUnitHeight <= Task.CurrentCargoZone.SignalHeight then - self:T( 1 ) - Task.IsInAirTestRequired = false - return 1 - end - - self:T( 0 ) - return 0 -end - -STAGELANDED = { - ClassName = "STAGELANDED", - MSG = { ID = "Land", TIME = 10 }, - Name = "Landed", - MenusAdded = false -} - -function STAGELANDED:New() - local self = BASE:Inherit( self, STAGE:New() ) - self:F() - self.StageType = 'CLIENT' - return self -end - -function STAGELANDED:Execute( Mission, Client, Task ) - self:F() - - if Task.IsLandingRequired then - - local Host = "Command" - if Task.HostUnitName then - Host = Task.HostUnitName .. " (" .. Task.HostUnitTypeName .. ")" - else - if Client:IsMultiSeated() then - Host = "Co-Pilot" - end - end - - Client:Message( 'You have landed within the landing zone. Use the radio menu (F10) to ' .. Task.TEXT[1] .. ' the ' .. Task.CargoType .. '.', - self.MSG.TIME, Mission.Name .. "/STAGELANDED.EXEC" .. Host, Host ) - - if not self.MenusAdded then - Task.Cargo = nil - Task:RemoveCargoMenus( Client ) - Task:AddCargoMenus( Client, CARGOS, 250 ) - end - end -end - - - -function STAGELANDED:Validate( Mission, Client, Task ) - self:F() - - if not routines.IsUnitNearZonesRadius( Client:GetClientGroupDCSUnit(), Task.CurrentLandingZoneName, 500 ) then - self:T( "Client is not anymore in the landing zone, go back to stage Route, and remove cargo menus." ) - Task.Signalled = false - Task:RemoveCargoMenus( Client ) - self:T( -2 ) - return -2 - end - - local DCSUnitVelocityVec3 = Client:GetClientGroupDCSUnit():getVelocity() - local DCSUnitVelocity = ( DCSUnitVelocityVec3.x ^2 + DCSUnitVelocityVec3.y ^2 + DCSUnitVelocityVec3.z ^2 ) ^ 0.5 - - local DCSUnitPointVec3 = Client:GetClientGroupDCSUnit():getPoint() - local LandHeight = land.getHeight( { x = DCSUnitPointVec3.x, y = DCSUnitPointVec3.z } ) - local DCSUnitHeight = DCSUnitPointVec3.y - LandHeight - - self:T( { Task.IsLandingRequired, Client:GetClientGroupDCSUnit():inAir() } ) - if Task.IsLandingRequired and Task.IsInAirTestRequired == true and Client:GetClientGroupDCSUnit():inAir() then - self:T( "Client went back in the air. Go back to stage Landing." ) - self:T( -1 ) - return -1 - end - - self:T( { DCSUnitVelocity, DCSUnitHeight, LandHeight, Task.CurrentCargoZone.SignalHeight } ) - if Task.IsLandingRequired and Task.IsInAirTestRequired == false and DCSUnitVelocity >= 2 and DCSUnitHeight >= Task.CurrentCargoZone.SignalHeight then - self:T( "It seems the Client went back in the air and over the boundary limits. Go back to stage Landing." ) - self:T( -1 ) - return -1 - end - - -- Wait until cargo is selected from the menu. - if Task.IsLandingRequired then - if not Task.Cargo then - self:T( 0 ) - return 0 - end - end - - self:T( 1 ) - return 1 -end - -STAGEUNLOAD = { - ClassName = "STAGEUNLOAD", - MSG = { ID = "Unload", TIME = 10 }, - Name = "Unload" -} - -function STAGEUNLOAD:New() - local self = BASE:Inherit( self, STAGE:New() ) - self:F() - self.StageType = 'CLIENT' - return self -end - ---- Coordinate UnLoading --- @param #STAGEUNLOAD self --- @param Mission#MISSION Mission --- @param Client#CLIENT Client --- @param Task#TASK Task -function STAGEUNLOAD:Execute( Mission, Client, Task ) - self:F() - - if Client:IsMultiSeated() then - Client:Message( 'The ' .. Task.CargoType .. ' are being ' .. Task.TEXT[2] .. ' within the landing zone. Wait until the helicopter is ' .. Task.TEXT[3] .. '.', - self.MSG.TIME, Mission.Name .. "/StageUnLoad", "Co-Pilot" ) - else - Client:Message( 'You are unloading the ' .. Task.CargoType .. ' ' .. Task.TEXT[2] .. ' within the landing zone. Wait until the helicopter is ' .. Task.TEXT[3] .. '.', - self.MSG.TIME, Mission.Name .. "/StageUnLoad", "Command" ) - end - Task:RemoveCargoMenus( Client ) -end - -function STAGEUNLOAD:Executing( Mission, Client, Task ) - self:F() - env.info( 'STAGEUNLOAD:Executing() Task.Cargo.CargoName = ' .. Task.Cargo.CargoName ) - - local TargetZoneName - - if Task.TargetZoneName then - TargetZoneName = Task.TargetZoneName - else - TargetZoneName = Task.CurrentLandingZoneName - end - - if Task.Cargo:UnLoad( Client, TargetZoneName ) then - Task.ExecuteStage = _TransportExecuteStage.SUCCESS - if Mission.MissionReportFlash then - Client:ShowCargo() - end - end -end - ---- Validate UnLoading --- @param #STAGEUNLOAD self --- @param Mission#MISSION Mission --- @param Client#CLIENT Client --- @param Task#TASK Task -function STAGEUNLOAD:Validate( Mission, Client, Task ) - self:F() - env.info( 'STAGEUNLOAD:Validate()' ) - - if routines.IsUnitNearZonesRadius( Client:GetClientGroupDCSUnit(), Task.CurrentLandingZoneName, 500 ) then - else - Task.ExecuteStage = _TransportExecuteStage.FAILED - Task:RemoveCargoMenus( Client ) - if Client:IsMultiSeated() then - Client:Message( 'The ' .. Task.CargoType .. " haven't been successfully " .. Task.TEXT[3] .. ' within the landing zone. Task and mission has failed.', - _TransportStageMsgTime.DONE, Mission.Name .. "/StageFailure", "Co-Pilot" ) - else - Client:Message( 'The ' .. Task.CargoType .. " haven't been successfully " .. Task.TEXT[3] .. ' within the landing zone. Task and mission has failed.', - _TransportStageMsgTime.DONE, Mission.Name .. "/StageFailure", "Command" ) - end - return 1 - end - - if not Client:GetClientGroupDCSUnit():inAir() then - else - Task.ExecuteStage = _TransportExecuteStage.FAILED - Task:RemoveCargoMenus( Client ) - if Client:IsMultiSeated() then - Client:Message( 'The ' .. Task.CargoType .. " haven't been successfully " .. Task.TEXT[3] .. ' within the landing zone. Task and mission has failed.', - _TransportStageMsgTime.DONE, Mission.Name .. "/StageFailure", "Co-Pilot" ) - else - Client:Message( 'The ' .. Task.CargoType .. " haven't been successfully " .. Task.TEXT[3] .. ' within the landing zone. Task and mission has failed.', - _TransportStageMsgTime.DONE, Mission.Name .. "/StageFailure", "Command" ) - end - return 1 - end - - if Task.ExecuteStage == _TransportExecuteStage.SUCCESS then - if Client:IsMultiSeated() then - Client:Message( 'The ' .. Task.CargoType .. ' have been sucessfully ' .. Task.TEXT[3] .. ' within the landing zone.', _TransportStageMsgTime.DONE, Mission.Name .. "/Stage", "Co-Pilot" ) - else - Client:Message( 'The ' .. Task.CargoType .. ' have been sucessfully ' .. Task.TEXT[3] .. ' within the landing zone.', _TransportStageMsgTime.DONE, Mission.Name .. "/Stage", "Command" ) - end - Task:RemoveCargoMenus( Client ) - Task.MissionTask:AddGoalCompletion( Task.MissionTask.GoalVerb, Task.CargoName, 1 ) -- We set the cargo as one more goal completed in the mission. - return 1 - end - - return 1 -end - -STAGELOAD = { - ClassName = "STAGELOAD", - MSG = { ID = "Load", TIME = 10 }, - Name = "Load" -} - -function STAGELOAD:New() - local self = BASE:Inherit( self, STAGE:New() ) - self:F() - self.StageType = 'CLIENT' - return self -end - -function STAGELOAD:Execute( Mission, Client, Task ) - self:F() - - if not Task.IsSlingLoad then - - local Host = "Command" - if Task.HostUnitName then - Host = Task.HostUnitName .. " (" .. Task.HostUnitTypeName .. ")" - else - if Client:IsMultiSeated() then - Host = "Co-Pilot" - end - end - - Client:Message( 'The ' .. Task.CargoType .. ' are being ' .. Task.TEXT[2] .. ' within the landing zone. Wait until the helicopter is ' .. Task.TEXT[3] .. '.', - _TransportStageMsgTime.EXECUTING, Mission.Name .. "/STAGELOAD.EXEC." .. Host, Host ) - - -- Route the cargo to the Carrier - - Task.Cargo:OnBoard( Client, Task.CurrentCargoZone, Task.OnBoardSide ) - Task.ExecuteStage = _TransportExecuteStage.EXECUTING - else - Task.ExecuteStage = _TransportExecuteStage.EXECUTING - end -end - -function STAGELOAD:Executing( Mission, Client, Task ) - self:F() - - -- If the Cargo is ready to be loaded, load it into the Client. - - local Host = "Command" - if Task.HostUnitName then - Host = Task.HostUnitName .. " (" .. Task.HostUnitTypeName .. ")" - else - if Client:IsMultiSeated() then - Host = "Co-Pilot" - end - end - - if not Task.IsSlingLoad then - self:T( Task.Cargo.CargoName) - - if Task.Cargo:OnBoarded( Client, Task.CurrentCargoZone ) then - - -- Load the Cargo onto the Client - Task.Cargo:Load( Client ) - - -- Message to the pilot that cargo has been loaded. - Client:Message( "The cargo " .. Task.Cargo.CargoName .. " has been loaded in our helicopter.", - 20, Mission.Name .. "/STAGELANDING.LOADING1." .. Host, Host ) - Task.ExecuteStage = _TransportExecuteStage.SUCCESS - - Client:ShowCargo() - end - else - Client:Message( "Hook the " .. Task.CargoNames .. " onto the helicopter " .. Task.TEXT[3] .. " within the landing zone.", - _TransportStageMsgTime.EXECUTING, Mission.Name .. "/STAGELOAD.LOADING.1." .. Host, Host , 10 ) - for CargoID, Cargo in pairs( CARGOS ) do - self:T( "Cargo.CargoName = " .. Cargo.CargoName ) - - if Cargo:IsSlingLoad() then - local CargoStatic = StaticObject.getByName( Cargo.CargoStaticName ) - if CargoStatic then - self:T( "Cargo is found in the DCS simulator.") - local CargoStaticPosition = CargoStatic:getPosition().p - self:T( "Cargo Position x = " .. CargoStaticPosition.x .. ", y = " .. CargoStaticPosition.y .. ", z = " .. CargoStaticPosition.z ) - local CargoStaticHeight = routines.GetUnitHeight( CargoStatic ) - if CargoStaticHeight > 5 then - self:T( "Cargo is airborne.") - Cargo:StatusLoaded() - Task.Cargo = Cargo - Client:Message( 'The Cargo has been successfully hooked onto the helicopter and is now being sling loaded. Fly outside the landing zone.', - self.MSG.TIME, Mission.Name .. "/STAGELANDING.LOADING.2." .. Host, Host ) - Task.ExecuteStage = _TransportExecuteStage.SUCCESS - break - end - else - self:T( "Cargo not found in the DCS simulator." ) - end - end - end - end - -end - -function STAGELOAD:Validate( Mission, Client, Task ) - self:F() - - self:T( "Task.CurrentLandingZoneName = " .. Task.CurrentLandingZoneName ) - - local Host = "Command" - if Task.HostUnitName then - Host = Task.HostUnitName .. " (" .. Task.HostUnitTypeName .. ")" - else - if Client:IsMultiSeated() then - Host = "Co-Pilot" - end - end - - if not Task.IsSlingLoad then - if not routines.IsUnitNearZonesRadius( Client:GetClientGroupDCSUnit(), Task.CurrentLandingZoneName, 500 ) then - Task:RemoveCargoMenus( Client ) - Task.ExecuteStage = _TransportExecuteStage.FAILED - Task.CargoName = nil - Client:Message( "The " .. Task.CargoType .. " loading has been aborted. You flew outside the pick-up zone while loading. ", - self.MSG.TIME, Mission.Name .. "/STAGELANDING.VALIDATE.1." .. Host, Host ) - self:T( -1 ) - return -1 - end - - local DCSUnitVelocityVec3 = Client:GetClientGroupDCSUnit():getVelocity() - local DCSUnitVelocity = ( DCSUnitVelocityVec3.x ^2 + DCSUnitVelocityVec3.y ^2 + DCSUnitVelocityVec3.z ^2 ) ^ 0.5 - - local DCSUnitPointVec3 = Client:GetClientGroupDCSUnit():getPoint() - local LandHeight = land.getHeight( { x = DCSUnitPointVec3.x, y = DCSUnitPointVec3.z } ) - local DCSUnitHeight = DCSUnitPointVec3.y - LandHeight - - self:T( { Task.IsLandingRequired, Client:GetClientGroupDCSUnit():inAir() } ) - if Task.IsLandingRequired and Task.IsInAirTestRequired == true and Client:GetClientGroupDCSUnit():inAir() then - Task:RemoveCargoMenus( Client ) - Task.ExecuteStage = _TransportExecuteStage.FAILED - Task.CargoName = nil - Client:Message( "The " .. Task.CargoType .. " loading has been aborted. Re-start the " .. Task.TEXT[3] .. " process. Don't fly outside the pick-up zone.", - self.MSG.TIME, Mission.Name .. "/STAGELANDING.VALIDATE.1." .. Host, Host ) - self:T( -1 ) - return -1 - end - - self:T( { DCSUnitVelocity, DCSUnitHeight, LandHeight, Task.CurrentCargoZone.SignalHeight } ) - if Task.IsLandingRequired and Task.IsInAirTestRequired == false and DCSUnitVelocity >= 2 and DCSUnitHeight >= Task.CurrentCargoZone.SignalHeight then - Task:RemoveCargoMenus( Client ) - Task.ExecuteStage = _TransportExecuteStage.FAILED - Task.CargoName = nil - Client:Message( "The " .. Task.CargoType .. " loading has been aborted. Re-start the " .. Task.TEXT[3] .. " process. Don't fly outside the pick-up zone.", - self.MSG.TIME, Mission.Name .. "/STAGELANDING.VALIDATE.1." .. Host, Host ) - self:T( -1 ) - return -1 - end - - if Task.ExecuteStage == _TransportExecuteStage.SUCCESS then - Task:RemoveCargoMenus( Client ) - Client:Message( "Good Job. The " .. Task.CargoType .. " has been sucessfully " .. Task.TEXT[3] .. " within the landing zone.", - self.MSG.TIME, Mission.Name .. "/STAGELANDING.VALIDATE.3." .. Host, Host ) - Task.MissionTask:AddGoalCompletion( Task.MissionTask.GoalVerb, Task.CargoName, 1 ) - self:T( 1 ) - return 1 - end - - else - if Task.ExecuteStage == _TransportExecuteStage.SUCCESS then - CargoStatic = StaticObject.getByName( Task.Cargo.CargoStaticName ) - if CargoStatic and not routines.IsStaticInZones( CargoStatic, Task.CurrentLandingZoneName ) then - Client:Message( "Good Job. The " .. Task.CargoType .. " has been sucessfully " .. Task.TEXT[3] .. " and flown outside of the landing zone.", - self.MSG.TIME, Mission.Name .. "/STAGELANDING.VALIDATE.4." .. Host, Host ) - Task.MissionTask:AddGoalCompletion( Task.MissionTask.GoalVerb, Task.Cargo.CargoName, 1 ) - self:T( 1 ) - return 1 - end - end - - end - - - self:T( 0 ) - return 0 -end - - -STAGEDONE = { - ClassName = "STAGEDONE", - MSG = { ID = "Done", TIME = 10 }, - Name = "Done" -} - -function STAGEDONE:New() - local self = BASE:Inherit( self, STAGE:New() ) - self:F() - self.StageType = 'AI' - return self -end - -function STAGEDONE:Execute( Mission, Client, Task ) - self:F() - -end - -function STAGEDONE:Validate( Mission, Client, Task ) - self:F() - - Task:Done() - - return 0 -end - -STAGEARRIVE = { - ClassName = "STAGEARRIVE", - MSG = { ID = "Arrive", TIME = 10 }, - Name = "Arrive" -} - -function STAGEARRIVE:New() - local self = BASE:Inherit( self, STAGE:New() ) - self:F() - self.StageType = 'CLIENT' - return self -end - - ---- Execute Arrival --- @param #STAGEARRIVE self --- @param Mission#MISSION Mission --- @param Client#CLIENT Client --- @param Task#TASK Task -function STAGEARRIVE:Execute( Mission, Client, Task ) - self:F() - - if Client:IsMultiSeated() then - Client:Message( 'We have arrived at ' .. Task.CurrentLandingZoneName .. ".", self.MSG.TIME, Mission.Name .. "/Stage", "Co-Pilot" ) - else - Client:Message( 'We have arrived at ' .. Task.CurrentLandingZoneName .. ".", self.MSG.TIME, Mission.Name .. "/Stage", "Command" ) - end - -end - -function STAGEARRIVE:Validate( Mission, Client, Task ) - self:F() - - Task.CurrentLandingZoneID = routines.IsUnitInZones( Client:GetClientGroupDCSUnit(), Task.LandingZones ) - if ( Task.CurrentLandingZoneID ) then - else - return -1 - end - - return 1 -end - -STAGEGROUPSDESTROYED = { - ClassName = "STAGEGROUPSDESTROYED", - DestroyGroupSize = -1, - Frequency = STAGE.FREQUENCY.REPEAT, - MSG = { ID = "DestroyGroup", TIME = 10 }, - Name = "GroupsDestroyed" -} - -function STAGEGROUPSDESTROYED:New() - local self = BASE:Inherit( self, STAGE:New() ) - self:F() - self.StageType = 'AI' - return self -end - ---function STAGEGROUPSDESTROYED:Execute( Mission, Client, Task ) --- --- Client:Message( 'Task: Still ' .. DestroyGroupSize .. " of " .. Task.DestroyGroupCount .. " " .. Task.DestroyGroupType .. " to be destroyed!", self.MSG.TIME, Mission.Name .. "/Stage" ) --- ---end - -function STAGEGROUPSDESTROYED:Validate( Mission, Client, Task ) - self:F() - - if Task.MissionTask:IsGoalReached() then - return 1 - else - return 0 - end -end - -function STAGEGROUPSDESTROYED:Execute( Mission, Client, Task ) - self:F() - self:T( { Task.ClassName, Task.Destroyed } ) - --env.info( 'Event Table Task = ' .. tostring(Task) ) - -end - - - - - - - - - - - - - ---[[ - _TransportStage: Defines the different stages of which of transport missions can be in. This table is internal and is used to control the sequence of messages, actions and flow. - - - _TransportStage.START - - _TransportStage.ROUTE - - _TransportStage.LAND - - _TransportStage.EXECUTE - - _TransportStage.DONE - - _TransportStage.REMOVE ---]] -_TransportStage = { - HOLD = "HOLD", - START = "START", - ROUTE = "ROUTE", - LANDING = "LANDING", - LANDED = "LANDED", - EXECUTING = "EXECUTING", - LOAD = "LOAD", - UNLOAD = "UNLOAD", - DONE = "DONE", - NEXT = "NEXT" -} - -_TransportStageMsgTime = { - HOLD = 10, - START = 60, - ROUTE = 5, - LANDING = 10, - LANDED = 30, - EXECUTING = 30, - LOAD = 30, - UNLOAD = 30, - DONE = 30, - NEXT = 0 -} - -_TransportStageTime = { - HOLD = 10, - START = 5, - ROUTE = 5, - LANDING = 1, - LANDED = 1, - EXECUTING = 5, - LOAD = 5, - UNLOAD = 5, - DONE = 1, - NEXT = 0 -} - -_TransportStageAction = { - REPEAT = -1, - NONE = 0, - ONCE = 1 -} ---- The TASK Classes define major end-to-end activities within a MISSION. The TASK Class is the Master Class to orchestrate these activities. From this class, many concrete TASK classes are inherited. --- @module TASK - -Include.File( "Routines" ) -Include.File( "Base" ) -Include.File( "Mission" ) -Include.File( "Client" ) -Include.File( "Stage" ) - ---- The TASK class --- @type TASK --- @extends Base#BASE -TASK = { - - -- Defines the different signal types with a Task. - SIGNAL = { - COLOR = { - RED = { ID = 1, COLOR = trigger.smokeColor.Red, TEXT = "A red" }, - GREEN = { ID = 2, COLOR = trigger.smokeColor.Green, TEXT = "A green" }, - BLUE = { ID = 3, COLOR = trigger.smokeColor.Blue, TEXT = "A blue" }, - WHITE = { ID = 4, COLOR = trigger.smokeColor.White, TEXT = "A white" }, - ORANGE = { ID = 5, COLOR = trigger.smokeColor.Orange, TEXT = "An orange" } - }, - TYPE = { - SMOKE = { ID = 1, TEXT = "smoke" }, - FLARE = { ID = 2, TEXT = "flare" } - } - }, - ClassName = "TASK", - Mission = {}, -- Owning mission of the Task - Name = '', - Stages = {}, - Stage = {}, - Cargos = { - InitCargos = {}, - LoadCargos = {} - }, - LandingZones = { - LandingZoneNames = {}, - LandingZones = {} - }, - ActiveStage = 0, - TaskDone = false, - TaskFailed = false, - GoalTasks = {} -} - ---- Instantiates a new TASK Base. Should never be used. Interface Class. --- @return TASK -function TASK:New() - local self = BASE:Inherit( self, BASE:New() ) - self:F() - - -- assign Task default values during construction - self.TaskBriefing = "Task: No Task." - self.Time = timer.getTime() - self.ExecuteStage = _TransportExecuteStage.NONE - - return self -end - -function TASK:SetStage( StageSequenceIncrement ) - self:F( { StageSequenceIncrement } ) - - local Valid = false - if StageSequenceIncrement ~= 0 then - self.ActiveStage = self.ActiveStage + StageSequenceIncrement - if 1 <= self.ActiveStage and self.ActiveStage <= #self.Stages then - self.Stage = self.Stages[self.ActiveStage] - self:T( { self.Stage.Name } ) - self.Frequency = self.Stage.Frequency - Valid = true - else - Valid = false - env.info( "TASK:SetStage() self.ActiveStage is smaller or larger than self.Stages array. self.ActiveStage = " .. self.ActiveStage ) - end - end - self.Time = timer.getTime() - return Valid -end - -function TASK:Init() - self:F() - self.ActiveStage = 0 - self:SetStage(1) - self.TaskDone = false - self.TaskFailed = false -end - - ---- Get progress of a TASK. --- @return string GoalsText -function TASK:GetGoalProgress() - self:F2() - - local GoalsText = "" - for GoalVerb, GoalVerbData in pairs( self.GoalTasks ) do - local Goals = self:GetGoalCompletion( GoalVerb ) - if Goals and Goals ~= "" then - Goals = '(' .. Goals .. ')' - else - Goals = '( - )' - end - GoalsText = GoalsText .. GoalVerb .. ': ' .. self:GetGoalCount(GoalVerb) .. ' goals ' .. Goals .. ' of ' .. self:GetGoalTotal(GoalVerb) .. ' goals completed (' .. self:GetGoalPercentage(GoalVerb) .. '%); ' - end - - if GoalsText == "" then - GoalsText = "( - )" - end - - return GoalsText -end - ---- Show progress of a TASK. --- @param MISSION Mission Group structure describing the Mission. --- @param CLIENT Client Group structure describing the Client. -function TASK:ShowGoalProgress( Mission, Client ) - self:F2() - - local GoalsText = "" - for GoalVerb, GoalVerbData in pairs( self.GoalTasks ) do - if Mission:IsCompleted() then - else - local Goals = self:GetGoalCompletion( GoalVerb ) - if Goals and Goals ~= "" then - else - Goals = "-" - end - GoalsText = GoalsText .. self:GetGoalProgress() - end - end - - if Mission.MissionReportFlash or Mission.MissionReportShow then - Client:Message( GoalsText, 10, "/TASKPROGRESS" .. self.ClassName, "Mission Command: Task Status", 30 ) - end -end - ---- Sets a TASK to status Done. -function TASK:Done() - self:F2() - self.TaskDone = true -end - ---- Returns if a TASK is done. --- @return bool -function TASK:IsDone() - self:F2( self.TaskDone ) - return self.TaskDone -end - ---- Sets a TASK to status failed. -function TASK:Failed() - self:F() - self.TaskFailed = true -end - ---- Returns if a TASk has failed. --- @return bool -function TASK:IsFailed() - self:F2( self.TaskFailed ) - return self.TaskFailed -end - -function TASK:Reset( Mission, Client ) - self:F2() - self.ExecuteStage = _TransportExecuteStage.NONE -end - ---- Returns the Goals of a TASK --- @return @table Goals -function TASK:GetGoals() - return self.GoalTasks -end - ---- Returns if a TASK has Goal(s). --- @param #TASK self --- @param #string GoalVerb is the name of the Goal of the TASK. --- @return bool -function TASK:Goal( GoalVerb ) - self:F2( { GoalVerb } ) - if not GoalVerb then - GoalVerb = self.GoalVerb - end - self:T2( {self.GoalTasks[GoalVerb] } ) - if self.GoalTasks[GoalVerb] and self.GoalTasks[GoalVerb].GoalTotal > 0 then - return true - else - return false - end -end - ---- Sets the total Goals to be achieved of the Goal Name --- @param number GoalTotal is the number of times the GoalVerb needs to be achieved. --- @param ?string GoalVerb is the name of the Goal of the TASK. If the GoalVerb is not given, then the default TASK Goals will be used. -function TASK:SetGoalTotal( GoalTotal, GoalVerb ) - self:F2( { GoalTotal, GoalVerb } ) - - if not GoalVerb then - GoalVerb = self.GoalVerb - end - self.GoalTasks[GoalVerb] = {} - self.GoalTasks[GoalVerb].Goals = {} - self.GoalTasks[GoalVerb].GoalTotal = GoalTotal - self.GoalTasks[GoalVerb].GoalCount = 0 - return self -end - ---- Gets the total of Goals to be achieved within the TASK of the GoalVerb. --- @param ?string GoalVerb is the name of the Goal of the TASK. If the GoalVerb is not given, then the default TASK Goals will be used. -function TASK:GetGoalTotal( GoalVerb ) - self:F2( { GoalVerb } ) - if not GoalVerb then - GoalVerb = self.GoalVerb - end - if self:Goal( GoalVerb ) then - return self.GoalTasks[GoalVerb].GoalTotal - else - return 0 - end -end - ---- Sets the total of Goals currently achieved within the TASK of the GoalVerb. --- @param number GoalCount is the total number of Goals achieved within the TASK. --- @param ?string GoalVerb is the name of the Goal of the TASK. If the GoalVerb is not given, then the default TASK Goals will be used. --- @return TASK -function TASK:SetGoalCount( GoalCount, GoalVerb ) - self:F2() - if not GoalVerb then - GoalVerb = self.GoalVerb - end - if self:Goal( GoalVerb) then - self.GoalTasks[GoalVerb].GoalCount = GoalCount - end - return self -end - ---- Increments the total of Goals currently achieved within the TASK of the GoalVerb, with the given GoalCountIncrease. --- @param number GoalCountIncrease is the number of new Goals achieved within the TASK. --- @param ?string GoalVerb is the name of the Goal of the TASK. If the GoalVerb is not given, then the default TASK Goals will be used. --- @return TASK -function TASK:IncreaseGoalCount( GoalCountIncrease, GoalVerb ) - self:F2( { GoalCountIncrease, GoalVerb } ) - if not GoalVerb then - GoalVerb = self.GoalVerb - end - if self:Goal( GoalVerb) then - self.GoalTasks[GoalVerb].GoalCount = self.GoalTasks[GoalVerb].GoalCount + GoalCountIncrease - end - return self -end - ---- Gets the total of Goals currently achieved within the TASK of the GoalVerb. --- @param ?string GoalVerb is the name of the Goal of the TASK. If the GoalVerb is not given, then the default TASK Goals will be used. --- @return TASK -function TASK:GetGoalCount( GoalVerb ) - self:F2() - if not GoalVerb then - GoalVerb = self.GoalVerb - end - if self:Goal( GoalVerb ) then - return self.GoalTasks[GoalVerb].GoalCount - else - return 0 - end -end - ---- Gets the percentage of Goals currently achieved within the TASK of the GoalVerb. --- @param ?string GoalVerb is the name of the Goal of the TASK. If the GoalVerb is not given, then the default TASK Goals will be used. --- @return TASK -function TASK:GetGoalPercentage( GoalVerb ) - self:F2() - if not GoalVerb then - GoalVerb = self.GoalVerb - end - if self:Goal( GoalVerb ) then - return math.floor( self:GetGoalCount( GoalVerb ) / self:GetGoalTotal( GoalVerb ) * 100 + .5 ) - else - return 100 - end -end - ---- Returns if all the Goals of the TASK were achieved. --- @return bool -function TASK:IsGoalReached() - self:F2() - - local GoalReached = true - - for GoalVerb, Goals in pairs( self.GoalTasks ) do - self:T2( { "GoalVerb", GoalVerb } ) - if self:Goal( GoalVerb ) then - local GoalToDo = self:GetGoalTotal( GoalVerb ) - self:GetGoalCount( GoalVerb ) - self:T2( "GoalToDo = " .. GoalToDo ) - if GoalToDo <= 0 then - else - GoalReached = false - break - end - else - break - end - end - - self:T( { GoalReached, self.GoalTasks } ) - return GoalReached -end - ---- Adds an Additional Goal for the TASK to be achieved. --- @param string GoalVerb is the name of the Goal of the TASK. --- @param string GoalTask is a text describing the Goal of the TASK to be achieved. --- @param number GoalIncrease is a number by which the Goal achievement is increasing. -function TASK:AddGoalCompletion( GoalVerb, GoalTask, GoalIncrease ) - self:F2( { GoalVerb, GoalTask, GoalIncrease } ) - - if self:Goal( GoalVerb ) then - self.GoalTasks[GoalVerb].Goals[#self.GoalTasks[GoalVerb].Goals+1] = GoalTask - self.GoalTasks[GoalVerb].GoalCount = self.GoalTasks[GoalVerb].GoalCount + GoalIncrease - end - return self -end - ---- Returns if the additional Goal for the TASK was completed. --- @param ?string GoalVerb is the name of the Goal of the TASK. If the GoalVerb is not given, then the default TASK Goals will be used. --- @return string Goals -function TASK:GetGoalCompletion( GoalVerb ) - self:F2( { GoalVerb } ) - - if self:Goal( GoalVerb ) then - local Goals = "" - for GoalID, GoalName in pairs( self.GoalTasks[GoalVerb].Goals ) do Goals = Goals .. GoalName .. " + " end - return Goals:gsub(" + $", ""), self.GoalTasks[GoalVerb].GoalCount - end -end - -function TASK.MenuAction( Parameter ) - Parameter.ReferenceTask.ExecuteStage = _TransportExecuteStage.EXECUTING - Parameter.ReferenceTask.Cargo = Parameter.CargoTask -end - -function TASK:StageExecute() - self:F() - - local Execute = false - - if self.Frequency == STAGE.FREQUENCY.REPEAT then - Execute = true - elseif self.Frequency == STAGE.FREQUENCY.NONE then - Execute = false - elseif self.Frequency >= 0 then - Execute = true - self.Frequency = self.Frequency - 1 - end - - return Execute - -end - ---- Work function to set signal events within a TASK. -function TASK:AddSignal( SignalUnitNames, SignalType, SignalColor, SignalHeight ) - self:F() - - local Valid = true - - if Valid then - if type( SignalUnitNames ) == "table" then - self.LandingZoneSignalUnitNames = SignalUnitNames - else - self.LandingZoneSignalUnitNames = { SignalUnitNames } - end - self.LandingZoneSignalType = SignalType - self.LandingZoneSignalColor = SignalColor - self.Signalled = false - if SignalHeight ~= nil then - self.LandingZoneSignalHeight = SignalHeight - else - self.LandingZoneSignalHeight = 0 - end - - if self.TaskBriefing then - self.TaskBriefing = self.TaskBriefing .. " " .. SignalColor.TEXT .. " " .. SignalType.TEXT .. " will be fired when entering the landing zone." - end - end - - return Valid -end - ---- When the CLIENT is approaching the landing zone, a RED SMOKE will be fired by an optional SignalUnitNames. --- @param table|string SignalUnitNames Name of the Group that will fire the signal. If this parameter is NIL, the signal will be fired from the center of the landing zone. --- @param number SignalHeight Altitude that the Signal should be fired... -function TASK:AddSmokeRed( SignalUnitNames, SignalHeight ) - self:F() - self:AddSignal( SignalUnitNames, TASK.SIGNAL.TYPE.SMOKE, TASK.SIGNAL.COLOR.RED, SignalHeight ) -end - ---- When the CLIENT is approaching the landing zone, a GREEN SMOKE will be fired by an optional SignalUnitNames. --- @param table|string SignalUnitNames Name of the Group that will fire the signal. If this parameter is NIL, the signal will be fired from the center of the landing zone. --- @param number SignalHeight Altitude that the Signal should be fired... -function TASK:AddSmokeGreen( SignalUnitNames, SignalHeight ) - self:F() - self:AddSignal( SignalUnitNames, TASK.SIGNAL.TYPE.SMOKE, TASK.SIGNAL.COLOR.GREEN, SignalHeight ) -end - ---- When the CLIENT is approaching the landing zone, a BLUE SMOKE will be fired by an optional SignalUnitNames. --- @param table|string SignalUnitNames Name of the Group that will fire the signal. If this parameter is NIL, the signal will be fired from the center of the landing zone. --- @param number SignalHeight Altitude that the Signal should be fired... -function TASK:AddSmokeBlue( SignalUnitNames, SignalHeight ) - self:F() - self:AddSignal( SignalUnitNames, TASK.SIGNAL.TYPE.SMOKE, TASK.SIGNAL.COLOR.BLUE, SignalHeight ) -end - ---- When the CLIENT is approaching the landing zone, a WHITE SMOKE will be fired by an optional SignalUnitNames. --- @param table|string SignalUnitNames Name of the Group that will fire the signal. If this parameter is NIL, the signal will be fired from the center of the landing zone. --- @param number SignalHeight Altitude that the Signal should be fired... -function TASK:AddSmokeWhite( SignalUnitNames, SignalHeight ) - self:F() - self:AddSignal( SignalUnitNames, TASK.SIGNAL.TYPE.SMOKE, TASK.SIGNAL.COLOR.WHITE, SignalHeight ) -end - ---- When the CLIENT is approaching the landing zone, an ORANGE SMOKE will be fired by an optional SignalUnitNames. --- @param table|string SignalUnitNames Name of the Group that will fire the signal. If this parameter is NIL, the signal will be fired from the center of the landing zone. --- @param number SignalHeight Altitude that the Signal should be fired... -function TASK:AddSmokeOrange( SignalUnitNames, SignalHeight ) - self:F() - self:AddSignal( SignalUnitNames, TASK.SIGNAL.TYPE.SMOKE, TASK.SIGNAL.COLOR.ORANGE, SignalHeight ) -end - ---- When the CLIENT is approaching the landing zone, a RED FLARE will be fired by an optional SignalUnitNames. --- @param table|string SignalUnitNames Name of the Group that will fire the signal. If this parameter is NIL, the signal will be fired from the center of the landing zone. --- @param number SignalHeight Altitude that the Signal should be fired... -function TASK:AddFlareRed( SignalUnitNames, SignalHeight ) - self:F() - self:AddSignal( SignalUnitNames, TASK.SIGNAL.TYPE.FLARE, TASK.SIGNAL.COLOR.RED, SignalHeight ) -end - ---- When the CLIENT is approaching the landing zone, a GREEN FLARE will be fired by an optional SignalUnitNames. --- @param table|string SignalUnitNames Name of the Group that will fire the signal. If this parameter is NIL, the signal will be fired from the center of the landing zone. --- @param number SignalHeight Altitude that the Signal should be fired... -function TASK:AddFlareGreen( SignalUnitNames, SignalHeight ) - self:F() - self:AddSignal( SignalUnitNames, TASK.SIGNAL.TYPE.FLARE, TASK.SIGNAL.COLOR.GREEN, SignalHeight ) -end - ---- When the CLIENT is approaching the landing zone, a BLUE FLARE will be fired by an optional SignalUnitNames. --- @param table|string SignalUnitNames Name of the Group that will fire the signal. If this parameter is NIL, the signal will be fired from the center of the landing zone. --- @param number SignalHeight Altitude that the Signal should be fired... -function TASK:AddFlareBlue( SignalUnitNames, SignalHeight ) - self:F() - self:AddSignal( SignalUnitNames, TASK.SIGNAL.TYPE.FLARE, TASK.SIGNAL.COLOR.BLUE, SignalHeight ) -end - ---- When the CLIENT is approaching the landing zone, a WHITE FLARE will be fired by an optional SignalUnitNames. --- @param table|string SignalUnitNames Name of the Group that will fire the signal. If this parameter is NIL, the signal will be fired from the center of the landing zone. --- @param number SignalHeight Altitude that the Signal should be fired... -function TASK:AddFlareWhite( SignalUnitNames, SignalHeight ) - self:F() - self:AddSignal( SignalUnitNames, TASK.SIGNAL.TYPE.FLARE, TASK.SIGNAL.COLOR.WHITE, SignalHeight ) -end - ---- When the CLIENT is approaching the landing zone, an ORANGE FLARE will be fired by an optional SignalUnitNames. --- @param table|string SignalUnitNames Name of the Group that will fire the signal. If this parameter is NIL, the signal will be fired from the center of the landing zone. --- @param number SignalHeight Altitude that the Signal should be fired... -function TASK:AddFlareOrange( SignalUnitNames, SignalHeight ) - self:F() - self:AddSignal( SignalUnitNames, TASK.SIGNAL.TYPE.FLARE, TASK.SIGNAL.COLOR.ORANGE, SignalHeight ) -end ---- A GOHOMETASK orchestrates the travel back to the home base, which is a specific zone defined within the ME. --- @module GOHOMETASK - -Include.File("Task") - ---- The GOHOMETASK class --- @type -GOHOMETASK = { - ClassName = "GOHOMETASK", -} - ---- Creates a new GOHOMETASK. --- @param table{string,...}|string LandingZones Table of Landing Zone names where Home(s) are located. --- @return GOHOMETASK -function GOHOMETASK:New( LandingZones ) - local self = BASE:Inherit( self, TASK:New() ) - self:F( { LandingZones } ) - local Valid = true - - Valid = routines.ValidateZone( LandingZones, "LandingZones", Valid ) - - if Valid then - self.Name = 'Fly Home' - self.TaskBriefing = "Task: Fly back to your home base. Your co-pilot will provide you with the directions (required flight angle in degrees) and the distance (in km) to your home base." - if type( LandingZones ) == "table" then - self.LandingZones = LandingZones - else - self.LandingZones = { LandingZones } - end - self.Stages = { STAGEBRIEF:New(), STAGESTART:New(), STAGEROUTE:New(), STAGEARRIVE:New(), STAGEDONE:New() } - self.SetStage( self, 1 ) - end - - return self -end ---- A DESTROYBASETASK will monitor the destruction of Groups and Units. This is a BASE class, other classes are derived from this class. --- @module DESTROYBASETASK --- @see DESTROYGROUPSTASK --- @see DESTROYUNITTYPESTASK --- @see DESTROY_RADARS_TASK - -Include.File("Task") - ---- The DESTROYBASETASK class --- @type DESTROYBASETASK -DESTROYBASETASK = { - ClassName = "DESTROYBASETASK", - Destroyed = 0, - GoalVerb = "Destroy", - DestroyPercentage = 100, -} - ---- Creates a new DESTROYBASETASK. --- @param #DESTROYBASETASK self --- @param #string DestroyGroupType Text describing the group to be destroyed. f.e. "Radar Installations", "Ships", "Vehicles", "Command Centers". --- @param #string DestroyUnitType Text describing the unit types to be destroyed. f.e. "SA-6", "Row Boats", "Tanks", "Tents". --- @param #list<#string> DestroyGroupPrefixes Table of Prefixes of the Groups to be destroyed before task is completed. --- @param #number DestroyPercentage defines the %-tage that needs to be destroyed to achieve mission success. eg. If in the Group there are 10 units, then a value of 75 would require 8 units to be destroyed from the Group to complete the @{TASK}. --- @return DESTROYBASETASK -function DESTROYBASETASK:New( DestroyGroupType, DestroyUnitType, DestroyGroupPrefixes, DestroyPercentage ) - local self = BASE:Inherit( self, TASK:New() ) - self:F() - - self.Name = 'Destroy' - self.Destroyed = 0 - self.DestroyGroupPrefixes = DestroyGroupPrefixes - self.DestroyGroupType = DestroyGroupType - self.DestroyUnitType = DestroyUnitType - if DestroyPercentage then - self.DestroyPercentage = DestroyPercentage - end - self.TaskBriefing = "Task: Destroy " .. DestroyGroupType .. "." - self.Stages = { STAGEBRIEF:New(), STAGESTART:New(), STAGEGROUPSDESTROYED:New(), STAGEDONE:New() } - self.SetStage( self, 1 ) - - return self -end - ---- Handle the S_EVENT_DEAD events to validate the destruction of units for the task monitoring. --- @param #DESTROYBASETASK self --- @param Event#EVENTDATA Event structure of MOOSE. -function DESTROYBASETASK:EventDead( Event ) - self:F( { Event } ) - - if Event.IniDCSUnit then - local DestroyUnit = Event.IniDCSUnit - local DestroyUnitName = Event.IniDCSUnitName - local DestroyGroup = Event.IniDCSGroup - local DestroyGroupName = Event.IniDCSGroupName - - --TODO: I need to fix here if 2 groups in the mission have a similar name with GroupPrefix equal, then i should differentiate for which group the goal was reached! - --I may need to test if for the goalverb that group goal was reached or something. Need to think about it a bit more ... - local UnitsDestroyed = 0 - for DestroyGroupPrefixID, DestroyGroupPrefix in pairs( self.DestroyGroupPrefixes ) do - self:T( DestroyGroupPrefix ) - if string.find( DestroyGroupName, DestroyGroupPrefix, 1, true ) then - self:T( BASE:Inherited(self).ClassName ) - UnitsDestroyed = self:ReportGoalProgress( DestroyGroup, DestroyUnit ) - self:T( UnitsDestroyed ) - end - end - - self:T( { UnitsDestroyed } ) - self:IncreaseGoalCount( UnitsDestroyed, self.GoalVerb ) - end - -end - ---- Validate task completeness of DESTROYBASETASK. --- @param DestroyGroup Group structure describing the group to be evaluated. --- @param DestroyUnit Unit structure describing the Unit to be evaluated. -function DESTROYBASETASK:ReportGoalProgress( DestroyGroup, DestroyUnit ) - self:F() - - return 0 -end ---- DESTROYGROUPSTASK --- @module DESTROYGROUPSTASK - -Include.File("DestroyBaseTask") - ---- The DESTROYGROUPSTASK class --- @type -DESTROYGROUPSTASK = { - ClassName = "DESTROYGROUPSTASK", - GoalVerb = "Destroy Groups", -} - ---- Creates a new DESTROYGROUPSTASK. --- @param #DESTROYGROUPSTASK self --- @param #string DestroyGroupType String describing the group to be destroyed. --- @param #string DestroyUnitType String describing the unit to be destroyed. --- @param #list<#string> DestroyGroupNames Table of string containing the name of the groups to be destroyed before task is completed. --- @param #number DestroyPercentage defines the %-tage that needs to be destroyed to achieve mission success. eg. If in the Group there are 10 units, then a value of 75 would require 8 units to be destroyed from the Group to complete the @{TASK}. ----@return DESTROYGROUPSTASK -function DESTROYGROUPSTASK:New( DestroyGroupType, DestroyUnitType, DestroyGroupNames, DestroyPercentage ) - local self = BASE:Inherit( self, DESTROYBASETASK:New( DestroyGroupType, DestroyUnitType, DestroyGroupNames, DestroyPercentage ) ) - self:F() - - self.Name = 'Destroy Groups' - self.GoalVerb = "Destroy " .. DestroyGroupType - - _EVENTDISPATCHER:OnDead( self.EventDead , self ) - _EVENTDISPATCHER:OnCrash( self.EventDead , self ) - - return self -end - ---- Report Goal Progress. --- @param #DESTROYGROUPSTASK self --- @param DCSGroup#Group DestroyGroup Group structure describing the group to be evaluated. --- @param DCSUnit#Unit DestroyUnit Unit structure describing the Unit to be evaluated. --- @return #number The DestroyCount reflecting the amount of units destroyed within the group. -function DESTROYGROUPSTASK:ReportGoalProgress( DestroyGroup, DestroyUnit ) - self:F( { DestroyGroup, DestroyUnit, self.DestroyPercentage } ) - - local DestroyGroupSize = DestroyGroup:getSize() - 1 -- When a DEAD event occurs, the getSize is still one larger than the destroyed unit. - local DestroyGroupInitialSize = DestroyGroup:getInitialSize() - self:T( { DestroyGroupSize, DestroyGroupInitialSize - ( DestroyGroupInitialSize * self.DestroyPercentage / 100 ) } ) - - local DestroyCount = 0 - if DestroyGroup then - if DestroyGroupSize <= DestroyGroupInitialSize - ( DestroyGroupInitialSize * self.DestroyPercentage / 100 ) then - DestroyCount = 1 - end - else - DestroyCount = 1 - end - - self:T( DestroyCount ) - - return DestroyCount -end ---- Task class to destroy radar installations. --- @module DESTROYRADARSTASK - -Include.File("DestroyBaseTask") - ---- The DESTROYRADARS class --- @type -DESTROYRADARSTASK = { - ClassName = "DESTROYRADARSTASK", - GoalVerb = "Destroy Radars" -} - ---- Creates a new DESTROYRADARSTASK. --- @param table{string,...} DestroyGroupNames Table of string containing the group names of which the radars are be destroyed. --- @return DESTROYRADARSTASK -function DESTROYRADARSTASK:New( DestroyGroupNames ) - local self = BASE:Inherit( self, DESTROYGROUPSTASK:New( 'radar installations', 'radars', DestroyGroupNames ) ) - self:F() - - self.Name = 'Destroy Radars' - - _EVENTDISPATCHER:OnDead( self.EventDead , self ) - - return self -end - ---- Report Goal Progress. --- @param Group DestroyGroup Group structure describing the group to be evaluated. --- @param Unit DestroyUnit Unit structure describing the Unit to be evaluated. -function DESTROYRADARSTASK:ReportGoalProgress( DestroyGroup, DestroyUnit ) - self:F( { DestroyGroup, DestroyUnit } ) - - local DestroyCount = 0 - if DestroyUnit and DestroyUnit:hasSensors( Unit.SensorType.RADAR, Unit.RadarType.AS ) then - if DestroyUnit and DestroyUnit:getLife() <= 1.0 then - self:T( 'Destroyed a radar' ) - DestroyCount = 1 - end - end - return DestroyCount -end ---- Set TASK to destroy certain unit types. --- @module DESTROYUNITTYPESTASK - -Include.File("DestroyBaseTask") - ---- The DESTROYUNITTYPESTASK class --- @type -DESTROYUNITTYPESTASK = { - ClassName = "DESTROYUNITTYPESTASK", - GoalVerb = "Destroy", -} - ---- Creates a new DESTROYUNITTYPESTASK. --- @param string DestroyGroupType String describing the group to be destroyed. f.e. "Radar Installations", "Fleet", "Batallion", "Command Centers". --- @param string DestroyUnitType String describing the unit to be destroyed. f.e. "radars", "ships", "tanks", "centers". --- @param table{string,...} DestroyGroupNames Table of string containing the group names of which the radars are be destroyed. --- @param string DestroyUnitTypes Table of string containing the type names of the units to achieve mission success. --- @return DESTROYUNITTYPESTASK -function DESTROYUNITTYPESTASK:New( DestroyGroupType, DestroyUnitType, DestroyGroupNames, DestroyUnitTypes ) - local self = BASE:Inherit( self, DESTROYBASETASK:New( DestroyGroupType, DestroyUnitType, DestroyGroupNames ) ) - self:F( { DestroyGroupType, DestroyUnitType, DestroyGroupNames, DestroyUnitTypes } ) - - if type(DestroyUnitTypes) == 'table' then - self.DestroyUnitTypes = DestroyUnitTypes - else - self.DestroyUnitTypes = { DestroyUnitTypes } - end - - self.Name = 'Destroy Unit Types' - self.GoalVerb = "Destroy " .. DestroyGroupType - - _EVENTDISPATCHER:OnDead( self.EventDead , self ) - - return self -end - ---- Report Goal Progress. --- @param Group DestroyGroup Group structure describing the group to be evaluated. --- @param Unit DestroyUnit Unit structure describing the Unit to be evaluated. -function DESTROYUNITTYPESTASK:ReportGoalProgress( DestroyGroup, DestroyUnit ) - self:F( { DestroyGroup, DestroyUnit } ) - - local DestroyCount = 0 - for UnitTypeID, UnitType in pairs( self.DestroyUnitTypes ) do - if DestroyUnit and DestroyUnit:getTypeName() == UnitType then - if DestroyUnit and DestroyUnit:getLife() <= 1.0 then - DestroyCount = DestroyCount + 1 - end - end - end - return DestroyCount -end ---- A PICKUPTASK orchestrates the loading of CARGO at a specific landing zone. --- @module PICKUPTASK --- @parent TASK - -Include.File("Task") -Include.File("Cargo") - ---- The PICKUPTASK class --- @type -PICKUPTASK = { - ClassName = "PICKUPTASK", - TEXT = { "Pick-Up", "picked-up", "loaded" }, - GoalVerb = "Pick-Up" -} - ---- Creates a new PICKUPTASK. --- @param table{string,...}|string LandingZones Table of Zone names where Cargo is to be loaded. --- @param CARGO_TYPE CargoType Type of the Cargo. The type must be of the following Enumeration:.. --- @param number OnBoardSide Reflects from which side the cargo Group will be on-boarded on the Carrier. -function PICKUPTASK:New( CargoType, OnBoardSide ) - local self = BASE:Inherit( self, TASK:New() ) - self:F() - - -- self holds the inherited instance of the PICKUPTASK Class to the BASE class. - - local Valid = true - - if Valid then - self.Name = 'Pickup Cargo' - self.TaskBriefing = "Task: Fly to the indicated landing zones and pickup " .. CargoType .. ". Your co-pilot will provide you with the directions (required flight angle in degrees) and the distance (in km) to the pickup zone." - self.CargoType = CargoType - self.GoalVerb = CargoType .. " " .. self.GoalVerb - self.OnBoardSide = OnBoardSide - self.IsLandingRequired = true -- required to decide whether the client needs to land or not - self.IsSlingLoad = false -- Indicates whether the cargo is a sling load cargo - self.Stages = { STAGE_CARGO_INIT:New(), STAGE_CARGO_LOAD:New(), STAGEBRIEF:New(), STAGESTART:New(), STAGEROUTE:New(), STAGELANDING:New(), STAGELANDED:New(), STAGELOAD:New(), STAGEDONE:New() } - self.SetStage( self, 1 ) - end - - return self -end - -function PICKUPTASK:FromZone( LandingZone ) - self:F() - - self.LandingZones.LandingZoneNames[LandingZone.CargoZoneName] = LandingZone.CargoZoneName - self.LandingZones.LandingZones[LandingZone.CargoZoneName] = LandingZone - - return self -end - -function PICKUPTASK:InitCargo( InitCargos ) - self:F( { InitCargos } ) - - if type( InitCargos ) == "table" then - self.Cargos.InitCargos = InitCargos - else - self.Cargos.InitCargos = { InitCargos } - end - - return self -end - -function PICKUPTASK:LoadCargo( LoadCargos ) - self:F( { LoadCargos } ) - - if type( LoadCargos ) == "table" then - self.Cargos.LoadCargos = LoadCargos - else - self.Cargos.LoadCargos = { LoadCargos } - end - - return self -end - -function PICKUPTASK:AddCargoMenus( Client, Cargos, TransportRadius ) - self:F() - - for CargoID, Cargo in pairs( Cargos ) do - - self:T( { Cargo.ClassName, Cargo.CargoName, Cargo.CargoType, Cargo:IsStatusNone(), Cargo:IsStatusLoaded(), Cargo:IsStatusLoading(), Cargo:IsStatusUnLoaded() } ) - - -- If the Cargo has no status, allow the menu option. - if Cargo:IsStatusNone() or ( Cargo:IsStatusLoading() and Client == Cargo:IsLoadingToClient() ) then - - local MenuAdd = false - if Cargo:IsNear( Client, self.CurrentCargoZone ) then - MenuAdd = true - end - - if MenuAdd then - if Client._Menus[Cargo.CargoType] == nil then - Client._Menus[Cargo.CargoType] = {} - end - - if not Client._Menus[Cargo.CargoType].PickupMenu then - Client._Menus[Cargo.CargoType].PickupMenu = missionCommands.addSubMenuForGroup( - Client:GetClientGroupID(), - self.TEXT[1] .. " " .. Cargo.CargoType, - nil - ) - self:T( 'Added PickupMenu: ' .. self.TEXT[1] .. " " .. Cargo.CargoType ) - end - - if Client._Menus[Cargo.CargoType].PickupSubMenus == nil then - Client._Menus[Cargo.CargoType].PickupSubMenus = {} - end - - Client._Menus[Cargo.CargoType].PickupSubMenus[ #Client._Menus[Cargo.CargoType].PickupSubMenus + 1 ] = missionCommands.addCommandForGroup( - Client:GetClientGroupID(), - Cargo.CargoName .. " ( " .. Cargo.CargoWeight .. "kg )", - Client._Menus[Cargo.CargoType].PickupMenu, - self.MenuAction, - { ReferenceTask = self, CargoTask = Cargo } - ) - self:T( 'Added PickupSubMenu' .. Cargo.CargoType .. ":" .. Cargo.CargoName .. " ( " .. Cargo.CargoWeight .. "kg )" ) - end - end - end - -end - -function PICKUPTASK:RemoveCargoMenus( Client ) - self:F() - - for MenuID, MenuData in pairs( Client._Menus ) do - for SubMenuID, SubMenuData in pairs( MenuData.PickupSubMenus ) do - missionCommands.removeItemForGroup( Client:GetClientGroupID(), SubMenuData ) - self:T( "Removed PickupSubMenu " ) - SubMenuData = nil - end - if MenuData.PickupMenu then - missionCommands.removeItemForGroup( Client:GetClientGroupID(), MenuData.PickupMenu ) - self:T( "Removed PickupMenu " ) - MenuData.PickupMenu = nil - end - end - - for CargoID, Cargo in pairs( CARGOS ) do - self:T( { Cargo.ClassName, Cargo.CargoName, Cargo.CargoType, Cargo:IsStatusNone(), Cargo:IsStatusLoaded(), Cargo:IsStatusLoading(), Cargo:IsStatusUnLoaded() } ) - if Cargo:IsStatusLoading() and Client == Cargo:IsLoadingToClient() then - Cargo:StatusNone() - end - end - -end - - - -function PICKUPTASK:HasFailed( ClientDead ) - self:F() - - local TaskHasFailed = self.TaskFailed - return TaskHasFailed -end - ---- A DEPLOYTASK orchestrates the deployment of CARGO within a specific landing zone. --- @module DEPLOYTASK - -Include.File( "Task" ) - ---- A DeployTask --- @type DEPLOYTASK -DEPLOYTASK = { - ClassName = "DEPLOYTASK", - TEXT = { "Deploy", "deployed", "unloaded" }, - GoalVerb = "Deployment" -} - - ---- Creates a new DEPLOYTASK object, which models the sequence of STAGEs to unload a cargo. --- @function [parent=#DEPLOYTASK] New --- @param #string CargoType Type of the Cargo. --- @return #DEPLOYTASK The created DeployTask -function DEPLOYTASK:New( CargoType ) - local self = BASE:Inherit( self, TASK:New() ) - self:F() - - local Valid = true - - if Valid then - self.Name = 'Deploy Cargo' - self.TaskBriefing = "Fly to one of the indicated landing zones and deploy " .. CargoType .. ". Your co-pilot will provide you with the directions (required flight angle in degrees) and the distance (in km) to the deployment zone." - self.CargoType = CargoType - self.GoalVerb = CargoType .. " " .. self.GoalVerb - self.Stages = { STAGE_CARGO_INIT:New(), STAGE_CARGO_LOAD:New(), STAGEBRIEF:New(), STAGESTART:New(), STAGEROUTE:New(), STAGELANDING:New(), STAGELANDED:New(), STAGEUNLOAD:New(), STAGEDONE:New() } - self.SetStage( self, 1 ) - end - - return self -end - -function DEPLOYTASK:ToZone( LandingZone ) - self:F() - - self.LandingZones.LandingZoneNames[LandingZone.CargoZoneName] = LandingZone.CargoZoneName - self.LandingZones.LandingZones[LandingZone.CargoZoneName] = LandingZone - - return self -end - - -function DEPLOYTASK:InitCargo( InitCargos ) - self:F( { InitCargos } ) - - if type( InitCargos ) == "table" then - self.Cargos.InitCargos = InitCargos - else - self.Cargos.InitCargos = { InitCargos } - end - - return self -end - - -function DEPLOYTASK:LoadCargo( LoadCargos ) - self:F( { LoadCargos } ) - - if type( LoadCargos ) == "table" then - self.Cargos.LoadCargos = LoadCargos - else - self.Cargos.LoadCargos = { LoadCargos } - end - - return self -end - - ---- When the cargo is unloaded, it will move to the target zone name. --- @param string TargetZoneName Name of the Zone to where the Cargo should move after unloading. -function DEPLOYTASK:SetCargoTargetZoneName( TargetZoneName ) - self:F() - - local Valid = true - - Valid = routines.ValidateString( TargetZoneName, "TargetZoneName", Valid ) - - if Valid then - self.TargetZoneName = TargetZoneName - end - - return Valid - -end - -function DEPLOYTASK:AddCargoMenus( Client, Cargos, TransportRadius ) - self:F() - - local ClientGroupID = Client:GetClientGroupID() - - self:T( ClientGroupID ) - - for CargoID, Cargo in pairs( Cargos ) do - - self:T( { Cargo.ClassName, Cargo.CargoName, Cargo.CargoType, Cargo.CargoWeight } ) - - if Cargo:IsStatusLoaded() and Client == Cargo:IsLoadedInClient() then - - if Client._Menus[Cargo.CargoType] == nil then - Client._Menus[Cargo.CargoType] = {} - end - - if not Client._Menus[Cargo.CargoType].DeployMenu then - Client._Menus[Cargo.CargoType].DeployMenu = missionCommands.addSubMenuForGroup( - ClientGroupID, - self.TEXT[1] .. " " .. Cargo.CargoType, - nil - ) - self:T( 'Added DeployMenu ' .. self.TEXT[1] ) - end - - if Client._Menus[Cargo.CargoType].DeploySubMenus == nil then - Client._Menus[Cargo.CargoType].DeploySubMenus = {} - end - - if Client._Menus[Cargo.CargoType].DeployMenu == nil then - self:T( 'deploymenu is nil' ) - end - - Client._Menus[Cargo.CargoType].DeploySubMenus[ #Client._Menus[Cargo.CargoType].DeploySubMenus + 1 ] = missionCommands.addCommandForGroup( - ClientGroupID, - Cargo.CargoName .. " ( " .. Cargo.CargoWeight .. "kg )", - Client._Menus[Cargo.CargoType].DeployMenu, - self.MenuAction, - { ReferenceTask = self, CargoTask = Cargo } - ) - self:T( 'Added DeploySubMenu ' .. Cargo.CargoType .. ":" .. Cargo.CargoName .. " ( " .. Cargo.CargoWeight .. "kg )" ) - end - end - -end - -function DEPLOYTASK:RemoveCargoMenus( Client ) - self:F() - - local ClientGroupID = Client:GetClientGroupID() - self:T( ClientGroupID ) - - for MenuID, MenuData in pairs( Client._Menus ) do - if MenuData.DeploySubMenus ~= nil then - for SubMenuID, SubMenuData in pairs( MenuData.DeploySubMenus ) do - missionCommands.removeItemForGroup( ClientGroupID, SubMenuData ) - self:T( "Removed DeploySubMenu " ) - SubMenuData = nil - end - end - if MenuData.DeployMenu then - missionCommands.removeItemForGroup( ClientGroupID, MenuData.DeployMenu ) - self:T( "Removed DeployMenu " ) - MenuData.DeployMenu = nil - end - end - -end ---- A NOTASK is a dummy activity... But it will show a Mission Briefing... --- @module NOTASK - -Include.File("Task") - ---- The NOTASK class --- @type -NOTASK = { - ClassName = "NOTASK", -} - ---- Creates a new NOTASK. -function NOTASK:New() - local self = BASE:Inherit( self, TASK:New() ) - self:F() - - local Valid = true - - if Valid then - self.Name = 'Nothing' - self.TaskBriefing = "Task: Execute your mission." - self.Stages = { STAGEBRIEF:New(), STAGESTART:New(), STAGEDONE:New() } - self.SetStage( self, 1 ) - end - - return self -end ---- A ROUTETASK orchestrates the travel to a specific zone defined within the ME. --- @module ROUTETASK - ---- The ROUTETASK class --- @type -ROUTETASK = { - ClassName = "ROUTETASK", - GoalVerb = "Route", -} - ---- Creates a new ROUTETASK. --- @param table{sring,...}|string LandingZones Table of Zone Names where the target is located. --- @param string TaskBriefing (optional) Defines a text describing the briefing of the task. --- @return ROUTETASK -function ROUTETASK:New( LandingZones, TaskBriefing ) - local self = BASE:Inherit( self, TASK:New() ) - self:F( { LandingZones, TaskBriefing } ) - - local Valid = true - - Valid = routines.ValidateZone( LandingZones, "LandingZones", Valid ) - - if Valid then - self.Name = 'Route To Zone' - if TaskBriefing then - self.TaskBriefing = TaskBriefing .. " Your co-pilot will provide you with the directions (required flight angle in degrees) and the distance (in km) to the target objective." - else - self.TaskBriefing = "Task: Fly to specified zone(s). Your co-pilot will provide you with the directions (required flight angle in degrees) and the distance (in km) to the target objective." - end - if type( LandingZones ) == "table" then - self.LandingZones = LandingZones - else - self.LandingZones = { LandingZones } - end - self.Stages = { STAGEBRIEF:New(), STAGESTART:New(), STAGEROUTE:New(), STAGEARRIVE:New(), STAGEDONE:New() } - self.SetStage( self, 1 ) - end - - return self -end - ---- A MISSION is the main owner of a Mission orchestration within MOOSE . The Mission framework orchestrates @{CLIENT}s, @{TASK}s, @{STAGE}s etc. --- A @{CLIENT} needs to be registered within the @{MISSION} through the function @{AddClient}. A @{TASK} needs to be registered within the @{MISSION} through the function @{AddTask}. --- @module Mission - -Include.File( "Routines" ) -Include.File( "Base" ) -Include.File( "Client" ) -Include.File( "Task" ) - ---- The MISSION class --- @type MISSION --- @extends Base#BASE --- @field #MISSION.Clients _Clients --- @field #string MissionBriefing -MISSION = { - ClassName = "MISSION", - Name = "", - MissionStatus = "PENDING", - _Clients = {}, - _Tasks = {}, - _ActiveTasks = {}, - GoalFunction = nil, - MissionReportTrigger = 0, - MissionProgressTrigger = 0, - MissionReportShow = false, - MissionReportFlash = false, - MissionTimeInterval = 0, - MissionCoalition = "", - SUCCESS = 1, - FAILED = 2, - REPEAT = 3, - _GoalTasks = {} -} - ---- @type MISSION.Clients --- @list - -function MISSION:Meta() - - local self = BASE:Inherit( self, BASE:New() ) - self:F() - - return self -end - ---- This is the main MISSION declaration method. Each Mission is like the master or a Mission orchestration between, Clients, Tasks, Stages etc. --- @param string MissionName is the name of the mission. This name will be used to reference the status of each mission by the players. --- @param string MissionPriority is a string indicating the "priority" of the Mission. f.e. "Primary", "Secondary" or "First", "Second". It is free format and up to the Mission designer to choose. There are no rules behind this field. --- @param string MissionBriefing is a string indicating the mission briefing to be shown when a player joins a @{CLIENT}. --- @param string MissionCoalition is a string indicating the coalition or party to which this mission belongs to. It is free format and can be chosen freely by the mission designer. Note that this field is not to be confused with the coalition concept of the ME. Examples of a Mission Coalition could be "NATO", "CCCP", "Intruders", "Terrorists"... --- @return MISSION --- @usage --- -- Declare a few missions. --- local Mission = MISSIONSCHEDULER.AddMission( 'Russia Transport Troops SA-6', 'Operational', 'Transport troops from the control center to one of the SA-6 SAM sites to activate their operation.', 'Russia' ) --- local Mission = MISSIONSCHEDULER.AddMission( 'Patriots', 'Primary', 'Our intelligence reports that 3 Patriot SAM defense batteries are located near Ruisi, Kvarhiti and Gori.', 'Russia' ) --- local Mission = MISSIONSCHEDULER.AddMission( 'Package Delivery', 'Operational', 'In order to be in full control of the situation, we need you to deliver a very important package at a secret location. Fly undetected through the NATO defenses and deliver the secret package. The secret agent is located at waypoint 4.', 'Russia' ) --- local Mission = MISSIONSCHEDULER.AddMission( 'Rescue General', 'Tactical', 'Our intelligence has received a remote signal behind Gori. We believe it is a very important Russian General that was captured by Georgia. Go out there and rescue him! Ensure you stay out of the battle zone, keep south. Waypoint 4 is the location of our Russian General.', 'Russia' ) --- local Mission = MISSIONSCHEDULER.AddMission( 'NATO Transport Troops', 'Operational', 'Transport 3 groups of air defense engineers from our barracks "Gold" and "Titan" to each patriot battery control center to activate our air defenses.', 'NATO' ) --- local Mission = MISSIONSCHEDULER.AddMission( 'SA-6 SAMs', 'Primary', 'Our intelligence reports that 3 SA-6 SAM defense batteries are located near Didmukha, Khetagurov and Berula. Eliminate the Russian SAMs.', 'NATO' ) --- local Mission = MISSIONSCHEDULER.AddMission( 'NATO Sling Load', 'Operational', 'Fly to the cargo pickup zone at Dzegvi or Kaspi, and sling the cargo to Soganlug airbase.', 'NATO' ) --- local Mission = MISSIONSCHEDULER.AddMission( 'Rescue secret agent', 'Tactical', 'In order to be in full control of the situation, we need you to rescue a secret agent from the woods behind enemy lines. Avoid the Russian defenses and rescue the agent. Keep south until Khasuri, and keep your eyes open for any SAM presence. The agent is located at waypoint 4 on your kneeboard.', 'NATO' ) -function MISSION:New( MissionName, MissionPriority, MissionBriefing, MissionCoalition ) - - self = MISSION:Meta() - self:T({ MissionName, MissionPriority, MissionBriefing, MissionCoalition }) - - local Valid = true - - Valid = routines.ValidateString( MissionName, "MissionName", Valid ) - Valid = routines.ValidateString( MissionPriority, "MissionPriority", Valid ) - Valid = routines.ValidateString( MissionBriefing, "MissionBriefing", Valid ) - Valid = routines.ValidateString( MissionCoalition, "MissionCoalition", Valid ) - - if Valid then - self.Name = MissionName - self.MissionPriority = MissionPriority - self.MissionBriefing = MissionBriefing - self.MissionCoalition = MissionCoalition - end - - return self -end - ---- Returns if a Mission has completed. --- @return bool -function MISSION:IsCompleted() - self:F() - return self.MissionStatus == "ACCOMPLISHED" -end - ---- Set a Mission to completed. -function MISSION:Completed() - self:F() - self.MissionStatus = "ACCOMPLISHED" - self:StatusToClients() -end - ---- Returns if a Mission is ongoing. --- treturn bool -function MISSION:IsOngoing() - self:F() - return self.MissionStatus == "ONGOING" -end - ---- Set a Mission to ongoing. -function MISSION:Ongoing() - self:F() - self.MissionStatus = "ONGOING" - --self:StatusToClients() -end - ---- Returns if a Mission is pending. --- treturn bool -function MISSION:IsPending() - self:F() - return self.MissionStatus == "PENDING" -end - ---- Set a Mission to pending. -function MISSION:Pending() - self:F() - self.MissionStatus = "PENDING" - self:StatusToClients() -end - ---- Returns if a Mission has failed. --- treturn bool -function MISSION:IsFailed() - self:F() - return self.MissionStatus == "FAILED" -end - ---- Set a Mission to failed. -function MISSION:Failed() - self:F() - self.MissionStatus = "FAILED" - self:StatusToClients() -end - ---- Send the status of the MISSION to all Clients. -function MISSION:StatusToClients() - self:F() - if self.MissionReportFlash then - for ClientID, Client in pairs( self._Clients ) do - Client:Message( self.MissionCoalition .. ' "' .. self.Name .. '": ' .. self.MissionStatus .. '! ( ' .. self.MissionPriority .. ' mission ) ', 10, self.Name .. '/Status', "Mission Command: Mission Status") - end - end -end - ---- Handles the reporting. After certain time intervals, a MISSION report MESSAGE will be shown to All Players. -function MISSION:ReportTrigger() - self:F() - - if self.MissionReportShow == true then - self.MissionReportShow = false - return true - else - if self.MissionReportFlash == true then - if timer.getTime() >= self.MissionReportTrigger then - self.MissionReportTrigger = timer.getTime() + self.MissionTimeInterval - return true - else - return false - end - else - return false - end - end -end - ---- Report the status of all MISSIONs to all active Clients. -function MISSION:ReportToAll() - self:F() - - local AlivePlayers = '' - for ClientID, Client in pairs( self._Clients ) do - if Client:GetDCSGroup() then - if Client:GetClientGroupDCSUnit() then - if Client:GetClientGroupDCSUnit():getLife() > 0.0 then - if AlivePlayers == '' then - AlivePlayers = ' Players: ' .. Client:GetClientGroupDCSUnit():getPlayerName() - else - AlivePlayers = AlivePlayers .. ' / ' .. Client:GetClientGroupDCSUnit():getPlayerName() - end - end - end - end - end - local Tasks = self:GetTasks() - local TaskText = "" - for TaskID, TaskData in pairs( Tasks ) do - TaskText = TaskText .. " - Task " .. TaskID .. ": " .. TaskData.Name .. ": " .. TaskData:GetGoalProgress() .. "\n" - end - MESSAGE:New( self.MissionCoalition .. ' "' .. self.Name .. '": ' .. self.MissionStatus .. ' ( ' .. self.MissionPriority .. ' mission )' .. AlivePlayers .. "\n" .. TaskText:gsub("\n$",""), "Mission Command: Mission Report", 10, self.Name .. '/Status'):ToAll() -end - - ---- Add a goal function to a MISSION. Goal functions are called when a @{TASK} within a mission has been completed. --- @param function GoalFunction is the function defined by the mission designer to evaluate whether a certain goal has been reached after a @{TASK} finishes within the @{MISSION}. A GoalFunction must accept 2 parameters: Mission, Client, which contains the current MISSION object and the current CLIENT object respectively. --- @usage --- PatriotActivation = { --- { "US SAM Patriot Zerti", false }, --- { "US SAM Patriot Zegduleti", false }, --- { "US SAM Patriot Gvleti", false } --- } --- --- function DeployPatriotTroopsGoal( Mission, Client ) --- --- --- -- Check if the cargo is all deployed for mission success. --- for CargoID, CargoData in pairs( Mission._Cargos ) do --- if Group.getByName( CargoData.CargoGroupName ) then --- CargoGroup = Group.getByName( CargoData.CargoGroupName ) --- if CargoGroup then --- -- Check if the cargo is ready to activate --- CurrentLandingZoneID = routines.IsUnitInZones( CargoGroup:getUnits()[1], Mission:GetTask( 2 ).LandingZones ) -- The second task is the Deploytask to measure mission success upon --- if CurrentLandingZoneID then --- if PatriotActivation[CurrentLandingZoneID][2] == false then --- -- Now check if this is a new Mission Task to be completed... --- trigger.action.setGroupAIOn( Group.getByName( PatriotActivation[CurrentLandingZoneID][1] ) ) --- PatriotActivation[CurrentLandingZoneID][2] = true --- MessageToBlue( "Mission Command: Message to all airborne units! The " .. PatriotActivation[CurrentLandingZoneID][1] .. " is armed. Our air defenses are now stronger.", 60, "BLUE/PatriotDefense" ) --- MessageToRed( "Mission Command: Our satellite systems are detecting additional NATO air defenses. To all airborne units: Take care!!!", 60, "RED/PatriotDefense" ) --- Mission:GetTask( 2 ):AddGoalCompletion( "Patriots activated", PatriotActivation[CurrentLandingZoneID][1], 1 ) -- Register Patriot activation as part of mission goal. --- end --- end --- end --- end --- end --- end --- --- local Mission = MISSIONSCHEDULER.AddMission( 'NATO Transport Troops', 'Operational', 'Transport 3 groups of air defense engineers from our barracks "Gold" and "Titan" to each patriot battery control center to activate our air defenses.', 'NATO' ) --- Mission:AddGoalFunction( DeployPatriotTroopsGoal ) -function MISSION:AddGoalFunction( GoalFunction ) - self:F() - self.GoalFunction = GoalFunction -end - ---- Register a new @{CLIENT} to participate within the mission. --- @param CLIENT Client is the @{CLIENT} object. The object must have been instantiated with @{CLIENT:New}. --- @return CLIENT --- @usage --- Add a number of Client objects to the Mission. --- Mission:AddClient( CLIENT:FindByName( 'US UH-1H*HOT-Deploy Troops 1', 'Transport 3 groups of air defense engineers from our barracks "Gold" and "Titan" to each patriot battery control center to activate our air defenses.' ):Transport() ) --- Mission:AddClient( CLIENT:FindByName( 'US UH-1H*RAMP-Deploy Troops 3', 'Transport 3 groups of air defense engineers from our barracks "Gold" and "Titan" to each patriot battery control center to activate our air defenses.' ):Transport() ) --- Mission:AddClient( CLIENT:FindByName( 'US UH-1H*HOT-Deploy Troops 2', 'Transport 3 groups of air defense engineers from our barracks "Gold" and "Titan" to each patriot battery control center to activate our air defenses.' ):Transport() ) --- Mission:AddClient( CLIENT:FindByName( 'US UH-1H*RAMP-Deploy Troops 4', 'Transport 3 groups of air defense engineers from our barracks "Gold" and "Titan" to each patriot battery control center to activate our air defenses.' ):Transport() ) -function MISSION:AddClient( Client ) - self:F( { Client } ) - - local Valid = true - - if Valid then - self._Clients[Client.ClientName] = Client - end - - return Client -end - ---- Find a @{CLIENT} object within the @{MISSION} by its ClientName. --- @param CLIENT ClientName is a string defining the Client Group as defined within the ME. --- @return CLIENT --- @usage --- -- Seach for Client "Bomber" within the Mission. --- local BomberClient = Mission:FindClient( "Bomber" ) -function MISSION:FindClient( ClientName ) - self:F( { self._Clients[ClientName] } ) - return self._Clients[ClientName] -end - - ---- Register a @{TASK} to be completed within the @{MISSION}. Note that there can be multiple @{TASK}s registered to be completed. Each TASK can be set a certain Goal. The MISSION will not be completed until all Goals are reached. --- @param TASK Task is the @{TASK} object. The object must have been instantiated with @{TASK:New} or any of its inherited @{TASK}s. --- @param number TaskNumber is the sequence number of the TASK within the MISSION. This number does have to be chronological. --- @return TASK --- @usage --- -- Define a few tasks for the Mission. --- PickupZones = { "NATO Gold Pickup Zone", "NATO Titan Pickup Zone" } --- PickupSignalUnits = { "NATO Gold Coordination Center", "NATO Titan Coordination Center" } --- --- -- Assign the Pickup Task --- local PickupTask = PICKUPTASK:New( PickupZones, CARGO_TYPE.ENGINEERS, CLIENT.ONBOARDSIDE.LEFT ) --- PickupTask:AddSmokeBlue( PickupSignalUnits ) --- PickupTask:SetGoalTotal( 3 ) --- Mission:AddTask( PickupTask, 1 ) --- --- -- Assign the Deploy Task --- local PatriotActivationZones = { "US Patriot Battery 1 Activation", "US Patriot Battery 2 Activation", "US Patriot Battery 3 Activation" } --- local PatriotActivationZonesSmokeUnits = { "US SAM Patriot - Battery 1 Control", "US SAM Patriot - Battery 2 Control", "US SAM Patriot - Battery 3 Control" } --- local DeployTask = DEPLOYTASK:New( PatriotActivationZones, CARGO_TYPE.ENGINEERS ) --- --DeployTask:SetCargoTargetZoneName( 'US Troops Attack ' .. math.random(2) ) --- DeployTask:AddSmokeBlue( PatriotActivationZonesSmokeUnits ) --- DeployTask:SetGoalTotal( 3 ) --- DeployTask:SetGoalTotal( 3, "Patriots activated" ) --- Mission:AddTask( DeployTask, 2 ) - -function MISSION:AddTask( Task, TaskNumber ) - self:F() - - self._Tasks[TaskNumber] = Task - self._Tasks[TaskNumber]:EnableEvents() - self._Tasks[TaskNumber].ID = TaskNumber - - return Task - end - ---- Get the TASK idenified by the TaskNumber from the Mission. This function is useful in GoalFunctions. --- @param number TaskNumber is the number of the @{TASK} within the @{MISSION}. --- @return TASK --- @usage --- -- Get Task 2 from the Mission. --- Task2 = Mission:GetTask( 2 ) - -function MISSION:GetTask( TaskNumber ) - self:F() - - local Valid = true - - local Task = nil - - if type(TaskNumber) ~= "number" then - Valid = false - end - - if Valid then - Task = self._Tasks[TaskNumber] - end - - return Task -end - ---- Get all the TASKs from the Mission. This function is useful in GoalFunctions. --- @return {TASK,...} Structure of TASKS with the @{TASK} number as the key. --- @usage --- -- Get Tasks from the Mission. --- Tasks = Mission:GetTasks() --- env.info( "Task 2 Completion = " .. Tasks[2]:GetGoalPercentage() .. "%" ) -function MISSION:GetTasks() - self:F() - - return self._Tasks -end - - ---[[ - _TransportExecuteStage: Defines the different stages of Transport unload/load execution. This table is internal and is used to control the validity of Transport load/unload timing. - - - _TransportExecuteStage.EXECUTING - - _TransportExecuteStage.SUCCESS - - _TransportExecuteStage.FAILED - ---]] -_TransportExecuteStage = { - NONE = 0, - EXECUTING = 1, - SUCCESS = 2, - FAILED = 3 -} - - ---- The MISSIONSCHEDULER is an OBJECT and is the main scheduler of ALL active MISSIONs registered within this scheduler. It's workings are considered internal and is automatically created when the Mission.lua file is included. --- @type MISSIONSCHEDULER --- @field #MISSIONSCHEDULER.MISSIONS Missions -MISSIONSCHEDULER = { - Missions = {}, - MissionCount = 0, - TimeIntervalCount = 0, - TimeIntervalShow = 150, - TimeSeconds = 14400, - TimeShow = 5 -} - ---- @type MISSIONSCHEDULER.MISSIONS --- @list <#MISSION> Mission - ---- This is the main MISSIONSCHEDULER Scheduler function. It is considered internal and is automatically created when the Mission.lua file is included. -function MISSIONSCHEDULER.Scheduler() - - - -- loop through the missions in the TransportTasks - for MissionName, MissionData in pairs( MISSIONSCHEDULER.Missions ) do - - local Mission = MissionData -- #MISSION - - if not Mission:IsCompleted() then - - -- This flag will monitor if for this mission, there are clients alive. If this flag is still false at the end of the loop, the mission status will be set to Pending (if not Failed or Completed). - local ClientsAlive = false - - for ClientID, ClientData in pairs( Mission._Clients ) do - - local Client = ClientData -- Client#CLIENT - - if Client:IsAlive() then - - -- There is at least one Client that is alive... So the Mission status is set to Ongoing. - ClientsAlive = true - - -- If this Client was not registered as Alive before: - -- 1. We register the Client as Alive. - -- 2. We initialize the Client Tasks and make a link to the original Mission Task. - -- 3. We initialize the Cargos. - -- 4. We flag the Mission as Ongoing. - if not Client.ClientAlive then - Client.ClientAlive = true - Client.ClientBriefingShown = false - for TaskNumber, Task in pairs( Mission._Tasks ) do - -- Note that this a deepCopy. Each client must have their own Tasks with own Stages!!! - Client._Tasks[TaskNumber] = routines.utils.deepCopy( Mission._Tasks[TaskNumber] ) - -- Each MissionTask must point to the original Mission. - Client._Tasks[TaskNumber].MissionTask = Mission._Tasks[TaskNumber] - Client._Tasks[TaskNumber].Cargos = Mission._Tasks[TaskNumber].Cargos - Client._Tasks[TaskNumber].LandingZones = Mission._Tasks[TaskNumber].LandingZones - end - - Mission:Ongoing() - end - - - -- For each Client, check for each Task the state and evolve the mission. - -- This flag will indicate if the Task of the Client is Complete. - local TaskComplete = false - - for TaskNumber, Task in pairs( Client._Tasks ) do - - if not Task.Stage then - Task:SetStage( 1 ) - end - - - local TransportTime = timer.getTime() - - if not Task:IsDone() then - - if Task:Goal() then - Task:ShowGoalProgress( Mission, Client ) - end - - --env.info( 'Scheduler: Mission = ' .. Mission.Name .. ' / Client = ' .. Client.ClientName .. ' / Task = ' .. Task.Name .. ' / Stage = ' .. Task.ActiveStage .. ' - ' .. Task.Stage.Name .. ' - ' .. Task.Stage.StageType ) - - -- Action - if Task:StageExecute() then - Task.Stage:Execute( Mission, Client, Task ) - end - - -- Wait until execution is finished - if Task.ExecuteStage == _TransportExecuteStage.EXECUTING then - Task.Stage:Executing( Mission, Client, Task ) - end - - -- Validate completion or reverse to earlier stage - if Task.Time + Task.Stage.WaitTime <= TransportTime then - Task:SetStage( Task.Stage:Validate( Mission, Client, Task ) ) - end - - if Task:IsDone() then - --env.info( 'Scheduler: Mission '.. Mission.Name .. ' Task ' .. Task.Name .. ' Stage ' .. Task.Stage.Name .. ' done. TaskComplete = ' .. string.format ( "%s", TaskComplete and "true" or "false" ) ) - TaskComplete = true -- when a task is not yet completed, a mission cannot be completed - - else - -- break only if this task is not yet done, so that future task are not yet activated. - TaskComplete = false -- when a task is not yet completed, a mission cannot be completed - --env.info( 'Scheduler: Mission "'.. Mission.Name .. '" Task "' .. Task.Name .. '" Stage "' .. Task.Stage.Name .. '" break. TaskComplete = ' .. string.format ( "%s", TaskComplete and "true" or "false" ) ) - break - end - - if TaskComplete then - - if Mission.GoalFunction ~= nil then - Mission.GoalFunction( Mission, Client ) - end - if MISSIONSCHEDULER.Scoring then - MISSIONSCHEDULER.Scoring:_AddMissionTaskScore( Client:GetClientGroupDCSUnit(), Mission.Name, 25 ) - end - --- if not Mission:IsCompleted() then --- end - end - end - end - - local MissionComplete = true - for TaskNumber, Task in pairs( Mission._Tasks ) do - if Task:Goal() then --- Task:ShowGoalProgress( Mission, Client ) - if Task:IsGoalReached() then - else - MissionComplete = false - end - else - MissionComplete = false -- If there is no goal, the mission should never be ended. The goal status will be set somewhere else. - end - end - - if MissionComplete then - Mission:Completed() - if MISSIONSCHEDULER.Scoring then - MISSIONSCHEDULER.Scoring:_AddMissionScore( Mission.Name, 100 ) - end - else - if TaskComplete then - -- Reset for new tasking of active client - Client.ClientAlive = false -- Reset the client tasks. - end - end - - - else - if Client.ClientAlive then - env.info( 'Scheduler: Client "' .. Client.ClientName .. '" is inactive.' ) - Client.ClientAlive = false - - -- This is tricky. If we sanitize Client._Tasks before sanitizing Client._Tasks[TaskNumber].MissionTask, then the original MissionTask will be sanitized, and will be lost within the garbage collector. - -- So first sanitize Client._Tasks[TaskNumber].MissionTask, after that, sanitize only the whole _Tasks structure... - --Client._Tasks[TaskNumber].MissionTask = nil - --Client._Tasks = nil - end - end - end - - -- If all Clients of this Mission are not activated, then the Mission status needs to be put back into Pending status. - -- But only if the Mission was Ongoing. In case the Mission is Completed or Failed, the Mission status may not be changed. In these cases, this will be the last run of this Mission in the Scheduler. - if ClientsAlive == false then - if Mission:IsOngoing() then - -- Mission status back to pending... - Mission:Pending() - end - end - end - - Mission:StatusToClients() - - if Mission:ReportTrigger() then - Mission:ReportToAll() - end - end - - return true -end - ---- Start the MISSIONSCHEDULER. -function MISSIONSCHEDULER.Start() - if MISSIONSCHEDULER ~= nil then - --MISSIONSCHEDULER.SchedulerId = routines.scheduleFunction( MISSIONSCHEDULER.Scheduler, { }, 0, 2 ) - MISSIONSCHEDULER.SchedulerId = SCHEDULER:New( nil, MISSIONSCHEDULER.Scheduler, { }, 0, 2 ) - end -end - ---- Stop the MISSIONSCHEDULER. -function MISSIONSCHEDULER.Stop() - if MISSIONSCHEDULER.SchedulerId then - routines.removeFunction(MISSIONSCHEDULER.SchedulerId) - MISSIONSCHEDULER.SchedulerId = nil - end -end - ---- This is the main MISSION declaration method. Each Mission is like the master or a Mission orchestration between, Clients, Tasks, Stages etc. --- @param Mission is the MISSION object instantiated by @{MISSION:New}. --- @return MISSION --- @usage --- -- Declare a mission. --- Mission = MISSION:New( 'Russia Transport Troops SA-6', --- 'Operational', --- 'Transport troops from the control center to one of the SA-6 SAM sites to activate their operation.', --- 'Russia' ) --- MISSIONSCHEDULER:AddMission( Mission ) -function MISSIONSCHEDULER.AddMission( Mission ) - MISSIONSCHEDULER.Missions[Mission.Name] = Mission - MISSIONSCHEDULER.MissionCount = MISSIONSCHEDULER.MissionCount + 1 - -- Add an overall AI Client for the AI tasks... This AI Client will facilitate the Events in the background for each Task. - --MissionAdd:AddClient( CLIENT:Register( 'AI' ) ) - - return Mission -end - ---- Remove a MISSION from the MISSIONSCHEDULER. --- @param MissionName is the name of the MISSION given at declaration using @{AddMission}. --- @usage --- -- Declare a mission. --- Mission = MISSION:New( 'Russia Transport Troops SA-6', --- 'Operational', --- 'Transport troops from the control center to one of the SA-6 SAM sites to activate their operation.', --- 'Russia' ) --- MISSIONSCHEDULER:AddMission( Mission ) --- --- -- Now remove the Mission. --- MISSIONSCHEDULER:RemoveMission( 'Russia Transport Troops SA-6' ) -function MISSIONSCHEDULER.RemoveMission( MissionName ) - MISSIONSCHEDULER.Missions[MissionName] = nil - MISSIONSCHEDULER.MissionCount = MISSIONSCHEDULER.MissionCount - 1 -end - ---- Find a MISSION within the MISSIONSCHEDULER. --- @param MissionName is the name of the MISSION given at declaration using @{AddMission}. --- @return MISSION --- @usage --- -- Declare a mission. --- Mission = MISSION:New( 'Russia Transport Troops SA-6', --- 'Operational', --- 'Transport troops from the control center to one of the SA-6 SAM sites to activate their operation.', --- 'Russia' ) --- MISSIONSCHEDULER:AddMission( Mission ) --- --- -- Now find the Mission. --- MissionFind = MISSIONSCHEDULER:FindMission( 'Russia Transport Troops SA-6' ) -function MISSIONSCHEDULER.FindMission( MissionName ) - return MISSIONSCHEDULER.Missions[MissionName] -end - --- Internal function used by the MISSIONSCHEDULER menu. -function MISSIONSCHEDULER.ReportMissionsShow( ) - for MissionName, Mission in pairs( MISSIONSCHEDULER.Missions ) do - Mission.MissionReportShow = true - Mission.MissionReportFlash = false - end -end - --- Internal function used by the MISSIONSCHEDULER menu. -function MISSIONSCHEDULER.ReportMissionsFlash( TimeInterval ) - local Count = 0 - for MissionName, Mission in pairs( MISSIONSCHEDULER.Missions ) do - Mission.MissionReportShow = false - Mission.MissionReportFlash = true - Mission.MissionReportTrigger = timer.getTime() + Count * TimeInterval - Mission.MissionTimeInterval = MISSIONSCHEDULER.MissionCount * TimeInterval - env.info( "TimeInterval = " .. Mission.MissionTimeInterval ) - Count = Count + 1 - end -end - --- Internal function used by the MISSIONSCHEDULER menu. -function MISSIONSCHEDULER.ReportMissionsHide( Prm ) - for MissionName, Mission in pairs( MISSIONSCHEDULER.Missions ) do - Mission.MissionReportShow = false - Mission.MissionReportFlash = false - end -end - ---- Enables a MENU option in the communications menu under F10 to control the status of the active missions. --- This function should be called only once when starting the MISSIONSCHEDULER. -function MISSIONSCHEDULER.ReportMenu() - local ReportMenu = SUBMENU:New( 'Status' ) - local ReportMenuShow = COMMANDMENU:New( 'Show Report Missions', ReportMenu, MISSIONSCHEDULER.ReportMissionsShow, 0 ) - local ReportMenuFlash = COMMANDMENU:New('Flash Report Missions', ReportMenu, MISSIONSCHEDULER.ReportMissionsFlash, 120 ) - local ReportMenuHide = COMMANDMENU:New( 'Hide Report Missions', ReportMenu, MISSIONSCHEDULER.ReportMissionsHide, 0 ) -end - ---- Show the remaining mission time. -function MISSIONSCHEDULER:TimeShow() - self.TimeIntervalCount = self.TimeIntervalCount + 1 - if self.TimeIntervalCount >= self.TimeTriggerShow then - local TimeMsg = string.format("%00d", ( self.TimeSeconds / 60 ) - ( timer.getTime() / 60 )) .. ' minutes left until mission reload.' - MESSAGE:New( TimeMsg, "Mission time", self.TimeShow, '/TimeMsg' ):ToAll() - self.TimeIntervalCount = 0 - end -end - -function MISSIONSCHEDULER:Time( TimeSeconds, TimeIntervalShow, TimeShow ) - - self.TimeIntervalCount = 0 - self.TimeSeconds = TimeSeconds - self.TimeIntervalShow = TimeIntervalShow - self.TimeShow = TimeShow -end - ---- Adds a mission scoring to the game. -function MISSIONSCHEDULER:Scoring( Scoring ) - - self.Scoring = Scoring -end - ---- The CLEANUP class keeps an area clean of crashing or colliding airplanes. It also prevents airplanes from firing within this area. --- @module CleanUp --- @author Flightcontrol - -Include.File( "Routines" ) -Include.File( "Base" ) -Include.File( "Mission" ) -Include.File( "Client" ) -Include.File( "Task" ) - ---- The CLEANUP class. --- @type CLEANUP --- @extends Base#BASE -CLEANUP = { - ClassName = "CLEANUP", - ZoneNames = {}, - TimeInterval = 300, - CleanUpList = {}, -} - ---- Creates the main object which is handling the cleaning of the debris within the given Zone Names. --- @param #CLEANUP self --- @param #table ZoneNames Is a table of zone names where the debris should be cleaned. Also a single string can be passed with one zone name. --- @param #number TimeInterval The interval in seconds when the clean activity takes place. The default is 300 seconds, thus every 5 minutes. --- @return #CLEANUP --- @usage --- -- Clean these Zones. --- CleanUpAirports = CLEANUP:New( { 'CLEAN Tbilisi', 'CLEAN Kutaisi' }, 150 ) --- or --- CleanUpTbilisi = CLEANUP:New( 'CLEAN Tbilisi', 150 ) --- CleanUpKutaisi = CLEANUP:New( 'CLEAN Kutaisi', 600 ) -function CLEANUP:New( ZoneNames, TimeInterval ) local self = BASE:Inherit( self, BASE:New() ) - self:F( { ZoneNames, TimeInterval } ) - - if type( ZoneNames ) == 'table' then - self.ZoneNames = ZoneNames - else - self.ZoneNames = { ZoneNames } - end - if TimeInterval then - self.TimeInterval = TimeInterval - end - - _EVENTDISPATCHER:OnBirth( self._OnEventBirth, self ) - - --self.CleanUpScheduler = routines.scheduleFunction( self._CleanUpScheduler, { self }, timer.getTime() + 1, TimeInterval ) - self.CleanUpScheduler = SCHEDULER:New( self, self._CleanUpScheduler, {}, 1, TimeInterval ) - - return self -end - - ---- Destroys a group from the simulator, but checks first if it is still existing! --- @param #CLEANUP self --- @param DCSGroup#Group GroupObject The object to be destroyed. --- @param #string CleanUpGroupName The groupname... -function CLEANUP:_DestroyGroup( GroupObject, CleanUpGroupName ) - self:F( { GroupObject, CleanUpGroupName } ) - - if GroupObject then -- and GroupObject:isExist() then - --MESSAGE:New( "Destroy Group " .. CleanUpGroupName, CleanUpGroupName, 1, CleanUpGroupName ):ToAll() - trigger.action.deactivateGroup(GroupObject) - self:T( { "GroupObject Destroyed", GroupObject } ) - end -end - ---- Destroys a @{DCSUnit#Unit} from the simulator, but checks first if it is still existing! --- @param #CLEANUP self --- @param DCSUnit#Unit CleanUpUnit The object to be destroyed. --- @param #string CleanUpUnitName The Unit name ... -function CLEANUP:_DestroyUnit( CleanUpUnit, CleanUpUnitName ) - self:F( { CleanUpUnit, CleanUpUnitName } ) - - if CleanUpUnit then - --MESSAGE:New( "Destroy " .. CleanUpUnitName, CleanUpUnitName, 1, CleanUpUnitName ):ToAll() - local CleanUpGroup = Unit.getGroup(CleanUpUnit) - -- TODO Client bug in 1.5.3 - if CleanUpGroup and CleanUpGroup:isExist() then - local CleanUpGroupUnits = CleanUpGroup:getUnits() - if #CleanUpGroupUnits == 1 then - local CleanUpGroupName = CleanUpGroup:getName() - --self:CreateEventCrash( timer.getTime(), CleanUpUnit ) - CleanUpGroup:destroy() - self:T( { "Destroyed Group:", CleanUpGroupName } ) - else - CleanUpUnit:destroy() - self:T( { "Destroyed Unit:", CleanUpUnitName } ) - end - self.CleanUpList[CleanUpUnitName] = nil -- Cleaning from the list - CleanUpUnit = nil - end - end -end - --- TODO check DCSTypes#Weapon ---- Destroys a missile from the simulator, but checks first if it is still existing! --- @param #CLEANUP self --- @param DCSTypes#Weapon MissileObject -function CLEANUP:_DestroyMissile( MissileObject ) - self:F( { MissileObject } ) - - if MissileObject and MissileObject:isExist() then - MissileObject:destroy() - self:T( "MissileObject Destroyed") - end -end - -function CLEANUP:_OnEventBirth( Event ) - self:F( { Event } ) - - self.CleanUpList[Event.IniDCSUnitName] = {} - self.CleanUpList[Event.IniDCSUnitName].CleanUpUnit = Event.IniDCSUnit - self.CleanUpList[Event.IniDCSUnitName].CleanUpGroup = Event.IniDCSGroup - self.CleanUpList[Event.IniDCSUnitName].CleanUpGroupName = Event.IniDCSGroupName - self.CleanUpList[Event.IniDCSUnitName].CleanUpUnitName = Event.IniDCSUnitName - - _EVENTDISPATCHER:OnEngineShutDownForUnit( Event.IniDCSUnitName, self._EventAddForCleanUp, self ) - _EVENTDISPATCHER:OnEngineStartUpForUnit( Event.IniDCSUnitName, self._EventAddForCleanUp, self ) - _EVENTDISPATCHER:OnHitForUnit( Event.IniDCSUnitName, self._EventAddForCleanUp, self ) - _EVENTDISPATCHER:OnPilotDeadForUnit( Event.IniDCSUnitName, self._EventCrash, self ) - _EVENTDISPATCHER:OnDeadForUnit( Event.IniDCSUnitName, self._EventCrash, self ) - _EVENTDISPATCHER:OnCrashForUnit( Event.IniDCSUnitName, self._EventCrash, self ) - _EVENTDISPATCHER:OnShotForUnit( Event.IniDCSUnitName, self._EventShot, self ) - - --self:AddEvent( world.event.S_EVENT_ENGINE_SHUTDOWN, self._EventAddForCleanUp ) - --self:AddEvent( world.event.S_EVENT_ENGINE_STARTUP, self._EventAddForCleanUp ) --- self:AddEvent( world.event.S_EVENT_HIT, self._EventAddForCleanUp ) -- , self._EventHitCleanUp ) --- self:AddEvent( world.event.S_EVENT_CRASH, self._EventCrash ) -- , self._EventHitCleanUp ) --- --self:AddEvent( world.event.S_EVENT_DEAD, self._EventCrash ) --- self:AddEvent( world.event.S_EVENT_SHOT, self._EventShot ) --- --- self:EnableEvents() - - -end - ---- Detects if a crash event occurs. --- Crashed units go into a CleanUpList for removal. --- @param #CLEANUP self --- @param DCSTypes#Event event -function CLEANUP:_EventCrash( Event ) - self:F( { Event } ) - - --TODO: This stuff is not working due to a DCS bug. Burning units cannot be destroyed. - --MESSAGE:New( "Crash ", "Crash", 10, "Crash" ):ToAll() - -- self:T("before getGroup") - -- local _grp = Unit.getGroup(event.initiator)-- Identify the group that fired - -- self:T("after getGroup") - -- _grp:destroy() - -- self:T("after deactivateGroup") - -- event.initiator:destroy() - - self.CleanUpList[Event.IniDCSUnitName] = {} - self.CleanUpList[Event.IniDCSUnitName].CleanUpUnit = Event.IniDCSUnit - self.CleanUpList[Event.IniDCSUnitName].CleanUpGroup = Event.IniDCSGroup - self.CleanUpList[Event.IniDCSUnitName].CleanUpGroupName = Event.IniDCSGroupName - self.CleanUpList[Event.IniDCSUnitName].CleanUpUnitName = Event.IniDCSUnitName - -end - ---- Detects if a unit shoots a missile. --- If this occurs within one of the zones, then the weapon used must be destroyed. --- @param #CLEANUP self --- @param DCSTypes#Event event -function CLEANUP:_EventShot( Event ) - self:F( { Event } ) - - -- Test if the missile was fired within one of the CLEANUP.ZoneNames. - local CurrentLandingZoneID = 0 - CurrentLandingZoneID = routines.IsUnitInZones( Event.IniDCSUnit, self.ZoneNames ) - if ( CurrentLandingZoneID ) then - -- Okay, the missile was fired within the CLEANUP.ZoneNames, destroy the fired weapon. - --_SEADmissile:destroy() - --routines.scheduleFunction( CLEANUP._DestroyMissile, { self, Event.Weapon }, timer.getTime() + 0.1) - SCHEDULER:New( self, CLEANUP._DestroyMissile, { Event.Weapon }, 0.1 ) - end -end - - ---- Detects if the Unit has an S_EVENT_HIT within the given ZoneNames. If this is the case, destroy the unit. --- @param #CLEANUP self --- @param DCSTypes#Event event -function CLEANUP:_EventHitCleanUp( Event ) - self:F( { Event } ) - - if Event.IniDCSUnit then - if routines.IsUnitInZones( Event.IniDCSUnit, self.ZoneNames ) ~= nil then - self:T( { "Life: ", Event.IniDCSUnitName, ' = ', Event.IniDCSUnit:getLife(), "/", Event.IniDCSUnit:getLife0() } ) - if Event.IniDCSUnit:getLife() < Event.IniDCSUnit:getLife0() then - self:T( "CleanUp: Destroy: " .. Event.IniDCSUnitName ) - --routines.scheduleFunction( CLEANUP._DestroyUnit, { self, Event.IniDCSUnit }, timer.getTime() + 0.1) - SCHEDULER:New( self, CLEANUP._DestroyUnit, { Event.IniDCSUnit }, 0.1 ) - end - end - end - - if Event.TgtDCSUnit then - if routines.IsUnitInZones( Event.TgtDCSUnit, self.ZoneNames ) ~= nil then - self:T( { "Life: ", Event.TgtDCSUnitName, ' = ', Event.TgtDCSUnit:getLife(), "/", Event.TgtDCSUnit:getLife0() } ) - if Event.TgtDCSUnit:getLife() < Event.TgtDCSUnit:getLife0() then - self:T( "CleanUp: Destroy: " .. Event.TgtDCSUnitName ) - --routines.scheduleFunction( CLEANUP._DestroyUnit, { self, Event.TgtDCSUnit }, timer.getTime() + 0.1 ) - SCHEDULER:New( self, CLEANUP._DestroyUnit, { Event.TgtDCSUnit }, 0.1 ) - end - end - end -end - ---- Add the @{DCSUnit#Unit} to the CleanUpList for CleanUp. -function CLEANUP:_AddForCleanUp( CleanUpUnit, CleanUpUnitName ) - self:F( { CleanUpUnit, CleanUpUnitName } ) - - self.CleanUpList[CleanUpUnitName] = {} - self.CleanUpList[CleanUpUnitName].CleanUpUnit = CleanUpUnit - self.CleanUpList[CleanUpUnitName].CleanUpUnitName = CleanUpUnitName - self.CleanUpList[CleanUpUnitName].CleanUpGroup = Unit.getGroup(CleanUpUnit) - self.CleanUpList[CleanUpUnitName].CleanUpGroupName = Unit.getGroup(CleanUpUnit):getName() - self.CleanUpList[CleanUpUnitName].CleanUpTime = timer.getTime() - self.CleanUpList[CleanUpUnitName].CleanUpMoved = false - - self:T( { "CleanUp: Add to CleanUpList: ", Unit.getGroup(CleanUpUnit):getName(), CleanUpUnitName } ) - -end - ---- Detects if the Unit has an S_EVENT_ENGINE_SHUTDOWN or an S_EVENT_HIT within the given ZoneNames. If this is the case, add the Group to the CLEANUP List. --- @param #CLEANUP self --- @param DCSTypes#Event event -function CLEANUP:_EventAddForCleanUp( Event ) - - if Event.IniDCSUnit then - if self.CleanUpList[Event.IniDCSUnitName] == nil then - if routines.IsUnitInZones( Event.IniDCSUnit, self.ZoneNames ) ~= nil then - self:_AddForCleanUp( Event.IniDCSUnit, Event.IniDCSUnitName ) - end - end - end - - if Event.TgtDCSUnit then - if self.CleanUpList[Event.TgtDCSUnitName] == nil then - if routines.IsUnitInZones( Event.TgtDCSUnit, self.ZoneNames ) ~= nil then - self:_AddForCleanUp( Event.TgtDCSUnit, Event.TgtDCSUnitName ) - end - end - end - -end - -local CleanUpSurfaceTypeText = { - "LAND", - "SHALLOW_WATER", - "WATER", - "ROAD", - "RUNWAY" - } - ---- At the defined time interval, CleanUp the Groups within the CleanUpList. --- @param #CLEANUP self -function CLEANUP:_CleanUpScheduler() - self:F( { "CleanUp Scheduler" } ) - - local CleanUpCount = 0 - for CleanUpUnitName, UnitData in pairs( self.CleanUpList ) do - CleanUpCount = CleanUpCount + 1 - - self:T( { CleanUpUnitName, UnitData } ) - local CleanUpUnit = Unit.getByName(UnitData.CleanUpUnitName) - local CleanUpGroupName = UnitData.CleanUpGroupName - local CleanUpUnitName = UnitData.CleanUpUnitName - if CleanUpUnit then - self:T( { "CleanUp Scheduler", "Checking:", CleanUpUnitName } ) - if _DATABASE:GetStatusGroup( CleanUpGroupName ) ~= "ReSpawn" then - local CleanUpUnitVec3 = CleanUpUnit:getPoint() - --self:T( CleanUpUnitVec3 ) - local CleanUpUnitVec2 = {} - CleanUpUnitVec2.x = CleanUpUnitVec3.x - CleanUpUnitVec2.y = CleanUpUnitVec3.z - --self:T( CleanUpUnitVec2 ) - local CleanUpSurfaceType = land.getSurfaceType(CleanUpUnitVec2) - --self:T( CleanUpSurfaceType ) - --MESSAGE:New( "Surface " .. CleanUpUnitName .. " = " .. CleanUpSurfaceTypeText[CleanUpSurfaceType], CleanUpUnitName, 10, CleanUpUnitName ):ToAll() - - if CleanUpUnit and CleanUpUnit:getLife() <= CleanUpUnit:getLife0() * 0.95 then - if CleanUpSurfaceType == land.SurfaceType.RUNWAY then - if CleanUpUnit:inAir() then - local CleanUpLandHeight = land.getHeight(CleanUpUnitVec2) - local CleanUpUnitHeight = CleanUpUnitVec3.y - CleanUpLandHeight - self:T( { "CleanUp Scheduler", "Height = " .. CleanUpUnitHeight } ) - if CleanUpUnitHeight < 30 then - self:T( { "CleanUp Scheduler", "Destroy " .. CleanUpUnitName .. " because below safe height and damaged." } ) - self:_DestroyUnit(CleanUpUnit, CleanUpUnitName) - end - else - self:T( { "CleanUp Scheduler", "Destroy " .. CleanUpUnitName .. " because on runway and damaged." } ) - self:_DestroyUnit(CleanUpUnit, CleanUpUnitName) - end - end - end - -- Clean Units which are waiting for a very long time in the CleanUpZone. - if CleanUpUnit then - local CleanUpUnitVelocity = CleanUpUnit:getVelocity() - local CleanUpUnitVelocityTotal = math.abs(CleanUpUnitVelocity.x) + math.abs(CleanUpUnitVelocity.y) + math.abs(CleanUpUnitVelocity.z) - if CleanUpUnitVelocityTotal < 1 then - if UnitData.CleanUpMoved then - if UnitData.CleanUpTime + 180 <= timer.getTime() then - self:T( { "CleanUp Scheduler", "Destroy due to not moving anymore " .. CleanUpUnitName } ) - self:_DestroyUnit(CleanUpUnit, CleanUpUnitName) - end - end - else - UnitData.CleanUpTime = timer.getTime() - UnitData.CleanUpMoved = true - --MESSAGE:New( "Moved " .. CleanUpUnitName, CleanUpUnitName, 10, CleanUpUnitName ):ToAll() - end - end - - else - -- Do nothing ... - self.CleanUpList[CleanUpUnitName] = nil -- Not anymore in the DCSRTE - end - else - self:T( "CleanUp: Group " .. CleanUpUnitName .. " cannot be found in DCS RTE, removing ..." ) - self.CleanUpList[CleanUpUnitName] = nil -- Not anymore in the DCSRTE - end - end - self:T(CleanUpCount) - - return true -end - ---- Dynamic spawning of groups (and units). --- --- @{#SPAWN} class --- =============== --- The @{#SPAWN} class allows to spawn dynamically new groups, based on pre-defined initialization settings, modifying the behaviour when groups are spawned. --- For each group to be spawned, within the mission editor, a group has to be created with the "late activation flag" set. We call this group the *"Spawn Template"* of the SPAWN object. --- A reference to this Spawn Template needs to be provided when constructing the SPAWN object, by indicating the name of the group within the mission editor in the constructor methods. --- --- Within the SPAWN object, there is an internal index that keeps track of which group from the internal group list was spawned. --- When new groups get spawned by using the SPAWN functions (see below), it will be validated whether the Limits (@{#SPAWN.Limit}) of the SPAWN object are not reached. --- When all is valid, a new group will be created by the spawning methods, and the internal index will be increased with 1. --- --- Regarding the name of new spawned groups, a _SpawnPrefix_ will be assigned for each new group created. --- If you want to have the Spawn Template name to be used as the _SpawnPrefix_ name, use the @{#SPAWN.New} constructor. --- However, when the @{#SPAWN.NewWithAlias} constructor was used, the Alias name will define the _SpawnPrefix_ name. --- Groups will follow the following naming structure when spawned at run-time: --- --- 1. Spawned groups will have the name _SpawnPrefix_#ggg, where ggg is a counter from 0 to 999. --- 2. Spawned units will have the name _SpawnPrefix_#ggg-uu, where uu is a counter from 0 to 99 for each new spawned unit belonging to the group. --- --- Some additional notes that need to be remembered: --- --- * Templates are actually groups defined within the mission editor, with the flag "Late Activation" set. As such, these groups are never used within the mission, but are used by the @{#SPAWN} module. --- * It is important to defined BEFORE you spawn new groups, a proper initialization of the SPAWN instance is done with the options you want to use. --- * When designing a mission, NEVER name groups using a "#" within the name of the group Spawn Template(s), or the SPAWN module logic won't work anymore. --- --- SPAWN construction methods: --- =========================== --- Create a new SPAWN object with the @{#SPAWN.New} or the @{#SPAWN.NewWithAlias} methods: --- --- * @{#SPAWN.New}: Creates a new SPAWN object taking the name of the group that functions as the Template. --- --- It is important to understand how the SPAWN class works internally. The SPAWN object created will contain internally a list of groups that will be spawned and that are already spawned. --- The initialization functions will modify this list of groups so that when a group gets spawned, ALL information is already prepared when spawning. This is done for performance reasons. --- So in principle, the group list will contain all parameters and configurations after initialization, and when groups get actually spawned, this spawning can be done quickly and efficient. --- --- SPAWN initialization methods: --- ============================= --- A spawn object will behave differently based on the usage of initialization methods: --- --- * @{#SPAWN.Limit}: Limits the amount of groups that can be alive at the same time and that can be dynamically spawned. --- * @{#SPAWN.RandomizeRoute}: Randomize the routes of spawned groups. --- * @{#SPAWN.RandomizeTemplate}: Randomize the group templates so that when a new group is spawned, a random group template is selected from one of the templates defined. --- * @{#SPAWN.Uncontrolled}: Spawn plane groups uncontrolled. --- * @{#SPAWN.Array}: Make groups visible before they are actually activated, and order these groups like a batallion in an array. --- * @{#SPAWN.InitRepeat}: Re-spawn groups when they land at the home base. Similar functions are @{#SPAWN.InitRepeatOnLanding} and @{#SPAWN.InitRepeatOnEngineShutDown}. --- --- SPAWN spawning methods: --- ======================= --- Groups can be spawned at different times and methods: --- --- * @{#SPAWN.Spawn}: Spawn one new group based on the last spawned index. --- * @{#SPAWN.ReSpawn}: Re-spawn a group based on a given index. --- * @{#SPAWN.SpawnScheduled}: Spawn groups at scheduled but randomized intervals. You can use @{#SPAWN.SpawnScheduleStart} and @{#SPAWN.SpawnScheduleStop} to start and stop the schedule respectively. --- * @{#SPAWN.SpawnFromUnit}: Spawn a new group taking the position of a @{UNIT}. --- * @{#SPAWN.SpawnInZone}: Spawn a new group in a @{ZONE}. --- --- Note that @{#SPAWN.Spawn} and @{#SPAWN.ReSpawn} return a @{GROUP#GROUP.New} object, that contains a reference to the DCSGroup object. --- You can use the @{GROUP} object to do further actions with the DCSGroup. --- --- SPAWN object cleaning: --- ========================= --- Sometimes, it will occur during a mission run-time, that ground or especially air objects get damaged, and will while being damged stop their activities, while remaining alive. --- In such cases, the SPAWN object will just sit there and wait until that group gets destroyed, but most of the time it won't, --- and it may occur that no new groups are or can be spawned as limits are reached. --- To prevent this, a @{#SPAWN.CleanUp} initialization method has been defined that will silently monitor the status of each spawned group. --- Once a group has a velocity = 0, and has been waiting for a defined interval, that group will be cleaned or removed from run-time. --- There is a catch however :-) If a damaged group has returned to an airbase within the coalition, that group will not be considered as "lost"... --- In such a case, when the inactive group is cleaned, a new group will Re-spawned automatically. --- This models AI that has succesfully returned to their airbase, to restart their combat activities. --- Check the @{#SPAWN.CleanUp} for further info. --- --- ==== --- @module Spawn --- @author FlightControl - -Include.File( "Routines" ) -Include.File( "Base" ) -Include.File( "Database" ) -Include.File( "Group" ) -Include.File( "Zone" ) -Include.File( "Event" ) -Include.File( "Scheduler" ) - ---- SPAWN Class --- @type SPAWN --- @extends Base#BASE --- @field ClassName --- @field #string SpawnTemplatePrefix --- @field #string SpawnAliasPrefix -SPAWN = { - ClassName = "SPAWN", - SpawnTemplatePrefix = nil, - SpawnAliasPrefix = nil, -} - - - ---- Creates the main object to spawn a GROUP defined in the DCS ME. --- @param #SPAWN self --- @param #string SpawnTemplatePrefix is the name of the Group in the ME that defines the Template. Each new group will have the name starting with SpawnTemplatePrefix. --- @return #SPAWN --- @usage --- -- NATO helicopters engaging in the battle field. --- Spawn_BE_KA50 = SPAWN:New( 'BE KA-50@RAMP-Ground Defense' ) --- @usage local Plane = SPAWN:New( "Plane" ) -- Creates a new local variable that can initiate new planes with the name "Plane#ddd" using the template "Plane" as defined within the ME. -function SPAWN:New( SpawnTemplatePrefix ) - local self = BASE:Inherit( self, BASE:New() ) - self:F( { SpawnTemplatePrefix } ) - - local TemplateGroup = Group.getByName( SpawnTemplatePrefix ) - if TemplateGroup then - self.SpawnTemplatePrefix = SpawnTemplatePrefix - self.SpawnIndex = 0 - self.SpawnCount = 0 -- The internal counter of the amount of spawning the has happened since SpawnStart. - self.AliveUnits = 0 -- Contains the counter how many units are currently alive - self.SpawnIsScheduled = false -- Reflects if the spawning for this SpawnTemplatePrefix is going to be scheduled or not. - self.SpawnTemplate = self._GetTemplate( self, SpawnTemplatePrefix ) -- Contains the template structure for a Group Spawn from the Mission Editor. Note that this group must have lateActivation always on!!! - self.Repeat = false -- Don't repeat the group from Take-Off till Landing and back Take-Off by ReSpawning. - self.UnControlled = false -- When working in UnControlled mode, all planes are Spawned in UnControlled mode before the scheduler starts. - self.SpawnMaxUnitsAlive = 0 -- The maximum amount of groups that can be alive of SpawnTemplatePrefix at the same time. - self.SpawnMaxGroups = 0 -- The maximum amount of groups that can be spawned. - self.SpawnRandomize = false -- Sets the randomization flag of new Spawned units to false. - self.SpawnVisible = false -- Flag that indicates if all the Groups of the SpawnGroup need to be visible when Spawned. - - self.SpawnGroups = {} -- Array containing the descriptions of each Group to be Spawned. - else - error( "SPAWN:New: There is no group declared in the mission editor with SpawnTemplatePrefix = '" .. SpawnTemplatePrefix .. "'" ) - end - - return self -end - ---- Creates a new SPAWN instance to create new groups based on the defined template and using a new alias for each new group. --- @param #SPAWN self --- @param #string SpawnTemplatePrefix is the name of the Group in the ME that defines the Template. --- @param #string SpawnAliasPrefix is the name that will be given to the Group at runtime. --- @return #SPAWN --- @usage --- -- NATO helicopters engaging in the battle field. --- Spawn_BE_KA50 = SPAWN:NewWithAlias( 'BE KA-50@RAMP-Ground Defense', 'Helicopter Attacking a City' ) --- @usage local PlaneWithAlias = SPAWN:NewWithAlias( "Plane", "Bomber" ) -- Creates a new local variable that can instantiate new planes with the name "Bomber#ddd" using the template "Plane" as defined within the ME. -function SPAWN:NewWithAlias( SpawnTemplatePrefix, SpawnAliasPrefix ) - local self = BASE:Inherit( self, BASE:New() ) - self:F( { SpawnTemplatePrefix, SpawnAliasPrefix } ) - - local TemplateGroup = Group.getByName( SpawnTemplatePrefix ) - if TemplateGroup then - self.SpawnTemplatePrefix = SpawnTemplatePrefix - self.SpawnAliasPrefix = SpawnAliasPrefix - self.SpawnIndex = 0 - self.SpawnCount = 0 -- The internal counter of the amount of spawning the has happened since SpawnStart. - self.AliveUnits = 0 -- Contains the counter how many units are currently alive - self.SpawnIsScheduled = false -- Reflects if the spawning for this SpawnTemplatePrefix is going to be scheduled or not. - self.SpawnTemplate = self._GetTemplate( self, SpawnTemplatePrefix ) -- Contains the template structure for a Group Spawn from the Mission Editor. Note that this group must have lateActivation always on!!! - self.Repeat = false -- Don't repeat the group from Take-Off till Landing and back Take-Off by ReSpawning. - self.UnControlled = false -- When working in UnControlled mode, all planes are Spawned in UnControlled mode before the scheduler starts. - self.SpawnMaxUnitsAlive = 0 -- The maximum amount of groups that can be alive of SpawnTemplatePrefix at the same time. - self.SpawnMaxGroups = 0 -- The maximum amount of groups that can be spawned. - self.SpawnRandomize = false -- Sets the randomization flag of new Spawned units to false. - self.SpawnVisible = false -- Flag that indicates if all the Groups of the SpawnGroup need to be visible when Spawned. - - self.SpawnGroups = {} -- Array containing the descriptions of each Group to be Spawned. - else - error( "SPAWN:New: There is no group declared in the mission editor with SpawnTemplatePrefix = '" .. SpawnTemplatePrefix .. "'" ) - end - - return self -end - - ---- Limits the Maximum amount of Units that can be alive at the same time, and the maximum amount of groups that can be spawned. --- Note that this method is exceptionally important to balance the performance of the mission. Depending on the machine etc, a mission can only process a maximum amount of units. --- If the time interval must be short, but there should not be more Units or Groups alive than a maximum amount of units, then this function should be used... --- When a @{#SPAWN.New} is executed and the limit of the amount of units alive is reached, then no new spawn will happen of the group, until some of these units of the spawn object will be destroyed. --- @param #SPAWN self --- @param #number SpawnMaxUnitsAlive The maximum amount of units that can be alive at runtime. --- @param #number SpawnMaxGroups The maximum amount of groups that can be spawned. When the limit is reached, then no more actual spawns will happen of the group. --- This parameter is useful to define a maximum amount of airplanes, ground troops, helicopters, ships etc within a supply area. --- This parameter accepts the value 0, which defines that there are no maximum group limits, but there are limits on the maximum of units that can be alive at the same time. --- @return #SPAWN self --- @usage --- -- NATO helicopters engaging in the battle field. --- -- This helicopter group consists of one Unit. So, this group will SPAWN maximum 2 groups simultaneously within the DCSRTE. --- -- There will be maximum 24 groups spawned during the whole mission lifetime. --- Spawn_BE_KA50 = SPAWN:New( 'BE KA-50@RAMP-Ground Defense' ):Limit( 2, 24 ) -function SPAWN:Limit( SpawnMaxUnitsAlive, SpawnMaxGroups ) - self:F( { self.SpawnTemplatePrefix, SpawnMaxUnitsAlive, SpawnMaxGroups } ) - - self.SpawnMaxUnitsAlive = SpawnMaxUnitsAlive -- The maximum amount of groups that can be alive of SpawnTemplatePrefix at the same time. - self.SpawnMaxGroups = SpawnMaxGroups -- The maximum amount of groups that can be spawned. - - for SpawnGroupID = 1, self.SpawnMaxGroups do - self:_InitializeSpawnGroups( SpawnGroupID ) - end - - return self -end - - ---- Randomizes the defined route of the SpawnTemplatePrefix group in the ME. This is very useful to define extra variation of the behaviour of groups. --- @param #SPAWN self --- @param #number SpawnStartPoint is the waypoint where the randomization begins. --- Note that the StartPoint = 0 equaling the point where the group is spawned. --- @param #number SpawnEndPoint is the waypoint where the randomization ends counting backwards. --- This parameter is useful to avoid randomization to end at a waypoint earlier than the last waypoint on the route. --- @param #number SpawnRadius is the radius in meters in which the randomization of the new waypoints, with the original waypoint of the original template located in the middle ... --- @return #SPAWN --- @usage --- -- NATO helicopters engaging in the battle field. --- -- The KA-50 has waypoints Start point ( =0 or SP ), 1, 2, 3, 4, End point (= 5 or DP). --- -- Waypoints 2 and 3 will only be randomized. The others will remain on their original position with each new spawn of the helicopter. --- -- The randomization of waypoint 2 and 3 will take place within a radius of 2000 meters. --- Spawn_BE_KA50 = SPAWN:New( 'BE KA-50@RAMP-Ground Defense' ):RandomizeRoute( 2, 2, 2000 ) -function SPAWN:RandomizeRoute( SpawnStartPoint, SpawnEndPoint, SpawnRadius ) - self:F( { self.SpawnTemplatePrefix, SpawnStartPoint, SpawnEndPoint, SpawnRadius } ) - - self.SpawnRandomizeRoute = true - self.SpawnRandomizeRouteStartPoint = SpawnStartPoint - self.SpawnRandomizeRouteEndPoint = SpawnEndPoint - self.SpawnRandomizeRouteRadius = SpawnRadius - - for GroupID = 1, self.SpawnMaxGroups do - self:_RandomizeRoute( GroupID ) - end - - return self -end - - ---- This function is rather complicated to understand. But I'll try to explain. --- This function becomes useful when you need to spawn groups with random templates of groups defined within the mission editor, --- but they will all follow the same Template route and have the same prefix name. --- In other words, this method randomizes between a defined set of groups the template to be used for each new spawn of a group. --- @param #SPAWN self --- @param #string SpawnTemplatePrefixTable A table with the names of the groups defined within the mission editor, from which one will be choosen when a new group will be spawned. --- @return #SPAWN --- @usage --- -- NATO Tank Platoons invading Gori. --- -- Choose between 13 different 'US Tank Platoon' configurations for each new SPAWN the Group to be spawned for the --- -- 'US Tank Platoon Left', 'US Tank Platoon Middle' and 'US Tank Platoon Right' SpawnTemplatePrefixes. --- -- Each new SPAWN will randomize the route, with a defined time interval of 200 seconds with 40% time variation (randomization) and --- -- with a limit set of maximum 12 Units alive simulteneously and 150 Groups to be spawned during the whole mission. --- Spawn_US_Platoon = { 'US Tank Platoon 1', 'US Tank Platoon 2', 'US Tank Platoon 3', 'US Tank Platoon 4', 'US Tank Platoon 5', --- 'US Tank Platoon 6', 'US Tank Platoon 7', 'US Tank Platoon 8', 'US Tank Platoon 9', 'US Tank Platoon 10', --- 'US Tank Platoon 11', 'US Tank Platoon 12', 'US Tank Platoon 13' } --- Spawn_US_Platoon_Left = SPAWN:New( 'US Tank Platoon Left' ):Limit( 12, 150 ):Schedule( 200, 0.4 ):RandomizeTemplate( Spawn_US_Platoon ):RandomizeRoute( 3, 3, 2000 ) --- Spawn_US_Platoon_Middle = SPAWN:New( 'US Tank Platoon Middle' ):Limit( 12, 150 ):Schedule( 200, 0.4 ):RandomizeTemplate( Spawn_US_Platoon ):RandomizeRoute( 3, 3, 2000 ) --- Spawn_US_Platoon_Right = SPAWN:New( 'US Tank Platoon Right' ):Limit( 12, 150 ):Schedule( 200, 0.4 ):RandomizeTemplate( Spawn_US_Platoon ):RandomizeRoute( 3, 3, 2000 ) -function SPAWN:RandomizeTemplate( SpawnTemplatePrefixTable ) - self:F( { self.SpawnTemplatePrefix, SpawnTemplatePrefixTable } ) - - self.SpawnTemplatePrefixTable = SpawnTemplatePrefixTable - self.SpawnRandomizeTemplate = true - - for SpawnGroupID = 1, self.SpawnMaxGroups do - self:_RandomizeTemplate( SpawnGroupID ) - end - - return self -end - - - - - ---- For planes and helicopters, when these groups go home and land on their home airbases and farps, they normally would taxi to the parking spot, shut-down their engines and wait forever until the Group is removed by the runtime environment. --- This function is used to re-spawn automatically (so no extra call is needed anymore) the same group after it has landed. --- This will enable a spawned group to be re-spawned after it lands, until it is destroyed... --- Note: When the group is respawned, it will re-spawn from the original airbase where it took off. --- So ensure that the routes for groups that respawn, always return to the original airbase, or players may get confused ... --- @param #SPAWN self --- @return #SPAWN self --- @usage --- -- RU Su-34 - AI Ship Attack --- -- Re-SPAWN the Group(s) after each landing and Engine Shut-Down automatically. --- SpawnRU_SU34 = SPAWN:New( 'TF1 RU Su-34 Krymsk@AI - Attack Ships' ):Schedule( 2, 3, 1800, 0.4 ):SpawnUncontrolled():RandomizeRoute( 1, 1, 3000 ):RepeatOnEngineShutDown() -function SPAWN:InitRepeat() - self:F( { self.SpawnTemplatePrefix, self.SpawnIndex } ) - - self.Repeat = true - self.RepeatOnEngineShutDown = false - self.RepeatOnLanding = true - - return self -end - ---- Respawn group after landing. --- @param #SPAWN self --- @return #SPAWN self -function SPAWN:InitRepeatOnLanding() - self:F( { self.SpawnTemplatePrefix } ) - - self:InitRepeat() - self.RepeatOnEngineShutDown = false - self.RepeatOnLanding = true - - return self -end - - ---- Respawn after landing when its engines have shut down. --- @param #SPAWN self --- @return #SPAWN self -function SPAWN:InitRepeatOnEngineShutDown() - self:F( { self.SpawnTemplatePrefix } ) - - self:InitRepeat() - self.RepeatOnEngineShutDown = true - self.RepeatOnLanding = false - - return self -end - - ---- CleanUp groups when they are still alive, but inactive. --- When groups are still alive and have become inactive due to damage and are unable to contribute anything, then this group will be removed at defined intervals in seconds. --- @param #SPAWN self --- @param #string SpawnCleanUpInterval The interval to check for inactive groups within seconds. --- @return #SPAWN self --- @usage Spawn_Helicopter:CleanUp( 20 ) -- CleanUp the spawning of the helicopters every 20 seconds when they become inactive. -function SPAWN:CleanUp( SpawnCleanUpInterval ) - self:F( { self.SpawnTemplatePrefix, SpawnCleanUpInterval } ) - - self.SpawnCleanUpInterval = SpawnCleanUpInterval - self.SpawnCleanUpTimeStamps = {} - --self.CleanUpFunction = routines.scheduleFunction( self._SpawnCleanUpScheduler, { self }, timer.getTime() + 1, SpawnCleanUpInterval ) - self.CleanUpScheduler = SCHEDULER:New( self, self._SpawnCleanUpScheduler, {}, 1, SpawnCleanUpInterval, 0.2 ) - return self -end - - - ---- Makes the groups visible before start (like a batallion). --- The method will take the position of the group as the first position in the array. --- @param #SPAWN self --- @param #number SpawnAngle The angle in degrees how the groups and each unit of the group will be positioned. --- @param #number SpawnWidth The amount of Groups that will be positioned on the X axis. --- @param #number SpawnDeltaX The space between each Group on the X-axis. --- @param #number SpawnDeltaY The space between each Group on the Y-axis. --- @return #SPAWN self --- @usage --- -- Define an array of Groups. --- Spawn_BE_Ground = SPAWN:New( 'BE Ground' ):Limit( 2, 24 ):Visible( 90, "Diamond", 10, 100, 50 ) -function SPAWN:Array( SpawnAngle, SpawnWidth, SpawnDeltaX, SpawnDeltaY ) - self:F( { self.SpawnTemplatePrefix, SpawnAngle, SpawnWidth, SpawnDeltaX, SpawnDeltaY } ) - - self.SpawnVisible = true -- When the first Spawn executes, all the Groups need to be made visible before start. - - local SpawnX = 0 - local SpawnY = 0 - local SpawnXIndex = 0 - local SpawnYIndex = 0 - - for SpawnGroupID = 1, self.SpawnMaxGroups do - self:T( { SpawnX, SpawnY, SpawnXIndex, SpawnYIndex } ) - - self.SpawnGroups[SpawnGroupID].Visible = true - self.SpawnGroups[SpawnGroupID].Spawned = false - - SpawnXIndex = SpawnXIndex + 1 - if SpawnWidth and SpawnWidth ~= 0 then - if SpawnXIndex >= SpawnWidth then - SpawnXIndex = 0 - SpawnYIndex = SpawnYIndex + 1 - end - end - - local SpawnRootX = self.SpawnGroups[SpawnGroupID].SpawnTemplate.x - local SpawnRootY = self.SpawnGroups[SpawnGroupID].SpawnTemplate.y - - self:_TranslateRotate( SpawnGroupID, SpawnRootX, SpawnRootY, SpawnX, SpawnY, SpawnAngle ) - - self.SpawnGroups[SpawnGroupID].SpawnTemplate.lateActivation = true - self.SpawnGroups[SpawnGroupID].SpawnTemplate.visible = true - - self.SpawnGroups[SpawnGroupID].Visible = true - - _EVENTDISPATCHER:OnBirthForTemplate( self.SpawnGroups[SpawnGroupID].SpawnTemplate, self._OnBirth, self ) - _EVENTDISPATCHER:OnCrashForTemplate( self.SpawnGroups[SpawnGroupID].SpawnTemplate, self._OnDeadOrCrash, self ) - _EVENTDISPATCHER:OnDeadForTemplate( self.SpawnGroups[SpawnGroupID].SpawnTemplate, self._OnDeadOrCrash, self ) - - if self.Repeat then - _EVENTDISPATCHER:OnTakeOffForTemplate( self.SpawnGroups[SpawnGroupID].SpawnTemplate, self._OnTakeOff, self ) - _EVENTDISPATCHER:OnLandForTemplate( self.SpawnGroups[SpawnGroupID].SpawnTemplate, self._OnLand, self ) - end - if self.RepeatOnEngineShutDown then - _EVENTDISPATCHER:OnEngineShutDownForTemplate( self.SpawnGroups[SpawnGroupID].SpawnTemplate, self._OnEngineShutDown, self ) - end - - self.SpawnGroups[SpawnGroupID].Group = _DATABASE:Spawn( self.SpawnGroups[SpawnGroupID].SpawnTemplate ) - - SpawnX = SpawnXIndex * SpawnDeltaX - SpawnY = SpawnYIndex * SpawnDeltaY - end - - return self -end - - - ---- Will spawn a group based on the internal index. --- Note: Uses @{DATABASE} module defined in MOOSE. --- @param #SPAWN self --- @return Group#GROUP The group that was spawned. You can use this group for further actions. -function SPAWN:Spawn() - self:F( { self.SpawnTemplatePrefix, self.SpawnIndex } ) - - return self:SpawnWithIndex( self.SpawnIndex + 1 ) -end - ---- Will re-spawn a group based on a given index. --- Note: Uses @{DATABASE} module defined in MOOSE. --- @param #SPAWN self --- @param #string SpawnIndex The index of the group to be spawned. --- @return Group#GROUP The group that was spawned. You can use this group for further actions. -function SPAWN:ReSpawn( SpawnIndex ) - self:F( { self.SpawnTemplatePrefix, SpawnIndex } ) - - if not SpawnIndex then - SpawnIndex = 1 - end - --- TODO: This logic makes DCS crash and i don't know why (yet). - local SpawnGroup = self:GetGroupFromIndex( SpawnIndex ) - if SpawnGroup then - local SpawnDCSGroup = SpawnGroup:GetDCSGroup() - if SpawnDCSGroup then - SpawnGroup:Destroy() - end - end - - return self:SpawnWithIndex( SpawnIndex ) -end - ---- Will spawn a group with a specified index number. --- Uses @{DATABASE} global object defined in MOOSE. --- @param #SPAWN self --- @return Group#GROUP The group that was spawned. You can use this group for further actions. -function SPAWN:SpawnWithIndex( SpawnIndex ) - self:F( { self.SpawnTemplatePrefix, SpawnIndex, self.SpawnMaxGroups } ) - - if self:_GetSpawnIndex( SpawnIndex ) then - - if self.SpawnGroups[self.SpawnIndex].Visible then - self.SpawnGroups[self.SpawnIndex].Group:Activate() - else - self:T( self.SpawnGroups[self.SpawnIndex].SpawnTemplate ) - _EVENTDISPATCHER:OnBirthForTemplate( self.SpawnGroups[self.SpawnIndex].SpawnTemplate, self._OnBirth, self ) - _EVENTDISPATCHER:OnCrashForTemplate( self.SpawnGroups[self.SpawnIndex].SpawnTemplate, self._OnDeadOrCrash, self ) - _EVENTDISPATCHER:OnDeadForTemplate( self.SpawnGroups[self.SpawnIndex].SpawnTemplate, self._OnDeadOrCrash, self ) - - if self.Repeat then - _EVENTDISPATCHER:OnTakeOffForTemplate( self.SpawnGroups[self.SpawnIndex].SpawnTemplate, self._OnTakeOff, self ) - _EVENTDISPATCHER:OnLandForTemplate( self.SpawnGroups[self.SpawnIndex].SpawnTemplate, self._OnLand, self ) - end - if self.RepeatOnEngineShutDown then - _EVENTDISPATCHER:OnEngineShutDownForTemplate( self.SpawnGroups[self.SpawnIndex].SpawnTemplate, self._OnEngineShutDown, self ) - end - - self:T( self.SpawnGroups[self.SpawnIndex].SpawnTemplate ) - - self.SpawnGroups[self.SpawnIndex].Group = _DATABASE:Spawn( self.SpawnGroups[self.SpawnIndex].SpawnTemplate ) - - -- If there is a SpawnFunction hook defined, call it. - if self.SpawnFunctionHook then - self.SpawnFunctionHook( self.SpawnGroups[self.SpawnIndex].Group, unpack( self.SpawnFunctionArguments ) ) - end - -- TODO: Need to fix this by putting an "R" in the name of the group when the group repeats. - --if self.Repeat then - -- _DATABASE:SetStatusGroup( SpawnTemplate.name, "ReSpawn" ) - --end - end - - self.SpawnGroups[self.SpawnIndex].Spawned = true - return self.SpawnGroups[self.SpawnIndex].Group - else - --self:E( { self.SpawnTemplatePrefix, "No more Groups to Spawn:", SpawnIndex, self.SpawnMaxGroups } ) - end - - return nil -end - ---- Spawns new groups at varying time intervals. --- This is useful if you want to have continuity within your missions of certain (AI) groups to be present (alive) within your missions. --- @param #SPAWN self --- @param #number SpawnTime The time interval defined in seconds between each new spawn of new groups. --- @param #number SpawnTimeVariation The variation to be applied on the defined time interval between each new spawn. --- The variation is a number between 0 and 1, representing the %-tage of variation to be applied on the time interval. --- @return #SPAWN self --- @usage --- -- NATO helicopters engaging in the battle field. --- -- The time interval is set to SPAWN new helicopters between each 600 seconds, with a time variation of 50%. --- -- The time variation in this case will be between 450 seconds and 750 seconds. --- -- This is calculated as follows: --- -- Low limit: 600 * ( 1 - 0.5 / 2 ) = 450 --- -- High limit: 600 * ( 1 + 0.5 / 2 ) = 750 --- -- Between these two values, a random amount of seconds will be choosen for each new spawn of the helicopters. --- Spawn_BE_KA50 = SPAWN:New( 'BE KA-50@RAMP-Ground Defense' ):Schedule( 600, 0.5 ) -function SPAWN:SpawnScheduled( SpawnTime, SpawnTimeVariation ) - self:F( { SpawnTime, SpawnTimeVariation } ) - - if SpawnTime ~= nil and SpawnTimeVariation ~= nil then - self.SpawnScheduler = SCHEDULER:New( self, self._Scheduler, {}, 1, SpawnTime, SpawnTimeVariation ) - end - - return self -end - ---- Will re-start the spawning scheduler. --- Note: This function is only required to be called when the schedule was stopped. -function SPAWN:SpawnScheduleStart() - self:F( { self.SpawnTemplatePrefix } ) - - self.SpawnScheduler:Start() -end - ---- Will stop the scheduled spawning scheduler. -function SPAWN:SpawnScheduleStop() - self:F( { self.SpawnTemplatePrefix } ) - - self.SpawnScheduler:Stop() -end - - ---- Allows to place a CallFunction hook when a new group spawns. --- The provided function will be called when a new group is spawned, including its given parameters. --- The first parameter of the SpawnFunction is the @{Group#GROUP} that was spawned. --- @param #SPAWN self --- @param #function SpawnFunctionHook The function to be called when a group spawns. --- @param SpawnFunctionArguments A random amount of arguments to be provided to the function when the group spawns. --- @return #SPAWN -function SPAWN:SpawnFunction( SpawnFunctionHook, ... ) - self:F( SpawnFunction ) - - self.SpawnFunctionHook = SpawnFunctionHook - self.SpawnFunctionArguments = {} - if arg then - self.SpawnFunctionArguments = arg - end - - return self -end - - - - ---- Will spawn a group from a hosting unit. This function is mostly advisable to be used if you want to simulate spawning from air units, like helicopters, which are dropping infantry into a defined Landing Zone. --- Note that each point in the route assigned to the spawning group is reset to the point of the spawn. --- You can use the returned group to further define the route to be followed. --- @param #SPAWN self --- @param Unit#UNIT HostUnit The air or ground unit dropping or unloading the group. --- @param #number OuterRadius The outer radius in meters where the new group will be spawned. --- @param #number InnerRadius The inner radius in meters where the new group will NOT be spawned. --- @param #number SpawnIndex (Optional) The index which group to spawn within the given zone. --- @return Group#GROUP that was spawned. --- @return #nil Nothing was spawned. -function SPAWN:SpawnFromUnit( HostUnit, OuterRadius, InnerRadius, SpawnIndex ) - self:F( { self.SpawnTemplatePrefix, HostUnit, OuterRadius, InnerRadius, SpawnIndex } ) - - if HostUnit and HostUnit:IsAlive() then -- and HostUnit:getUnit(1):inAir() == false then - - if SpawnIndex then - else - SpawnIndex = self.SpawnIndex + 1 - end - - if self:_GetSpawnIndex( SpawnIndex ) then - - local SpawnTemplate = self.SpawnGroups[self.SpawnIndex].SpawnTemplate - - if SpawnTemplate then - - local UnitPoint = HostUnit:GetPointVec2() - - self:T( { "Current point of ", self.SpawnTemplatePrefix, UnitPoint } ) - - --for PointID, Point in pairs( SpawnTemplate.route.points ) do - --Point.x = UnitPoint.x - --Point.y = UnitPoint.y - --Point.alt = nil - --Point.alt_type = nil - --end - - SpawnTemplate.route.points[1].x = UnitPoint.x - SpawnTemplate.route.points[1].y = UnitPoint.y - - if not InnerRadius then - InnerRadius = 10 - end - - if not OuterRadius then - OuterRadius = 50 - end - - -- Apply SpawnFormation - for UnitID = 1, #SpawnTemplate.units do - if InnerRadius == 0 then - SpawnTemplate.units[UnitID].x = UnitPoint.x - SpawnTemplate.units[UnitID].y = UnitPoint.y - else - local CirclePos = routines.getRandPointInCircle( UnitPoint, OuterRadius, InnerRadius ) - SpawnTemplate.units[UnitID].x = CirclePos.x - SpawnTemplate.units[UnitID].y = CirclePos.y - end - self:T( 'SpawnTemplate.units['..UnitID..'].x = ' .. SpawnTemplate.units[UnitID].x .. ', SpawnTemplate.units['..UnitID..'].y = ' .. SpawnTemplate.units[UnitID].y ) - end - - local SpawnPos = routines.getRandPointInCircle( UnitPoint, OuterRadius, InnerRadius ) - local Point = {} - Point.type = "Turning Point" - Point.x = SpawnPos.x - Point.y = SpawnPos.y - Point.action = "Cone" - Point.speed = 5 - - table.insert( SpawnTemplate.route.points, 2, Point ) - - return self:SpawnWithIndex( self.SpawnIndex ) - end - end - end - - return nil -end - ---- Will spawn a Group within a given @{Zone#ZONE}. --- Once the group is spawned within the zone, it will continue on its route. --- The first waypoint (where the group is spawned) is replaced with the zone coordinates. --- @param #SPAWN self --- @param Zone#ZONE Zone The zone where the group is to be spawned. --- @param #number ZoneRandomize (Optional) Set to true if you want to randomize the starting point in the zone. --- @param #number SpawnIndex (Optional) The index which group to spawn within the given zone. --- @return Group#GROUP that was spawned. --- @return #nil when nothing was spawned. -function SPAWN:SpawnInZone( Zone, ZoneRandomize, SpawnIndex ) - self:F( { self.SpawnTemplatePrefix, Zone, ZoneRandomize, SpawnIndex } ) - - if Zone then - - if SpawnIndex then - else - SpawnIndex = self.SpawnIndex + 1 - end - - if self:_GetSpawnIndex( SpawnIndex ) then - - local SpawnTemplate = self.SpawnGroups[self.SpawnIndex].SpawnTemplate - - if SpawnTemplate then - - local ZonePoint - - if ZoneRandomize == true then - ZonePoint = Zone:GetRandomPointVec2() - else - ZonePoint = Zone:GetPointVec2() - end - - SpawnTemplate.route.points[1].x = ZonePoint.x - SpawnTemplate.route.points[1].y = ZonePoint.y - - -- Apply SpawnFormation - for UnitID = 1, #SpawnTemplate.units do - local ZonePointUnit = Zone:GetRandomPointVec2() - SpawnTemplate.units[UnitID].x = ZonePointUnit.x - SpawnTemplate.units[UnitID].y = ZonePointUnit.y - self:T( 'SpawnTemplate.units['..UnitID..'].x = ' .. SpawnTemplate.units[UnitID].x .. ', SpawnTemplate.units['..UnitID..'].y = ' .. SpawnTemplate.units[UnitID].y ) - end - - return self:SpawnWithIndex( self.SpawnIndex ) - end - end - end - - return nil -end - - - - ---- Will spawn a plane group in uncontrolled mode... --- This will be similar to the uncontrolled flag setting in the ME. --- @return #SPAWN self -function SPAWN:UnControlled() - self:F( { self.SpawnTemplatePrefix } ) - - self.SpawnUnControlled = true - - for SpawnGroupID = 1, self.SpawnMaxGroups do - self.SpawnGroups[SpawnGroupID].UnControlled = true - end - - return self -end - - - ---- Will return the SpawnGroupName either with with a specific count number or without any count. --- @param #SPAWN self --- @param #number SpawnIndex Is the number of the Group that is to be spawned. --- @return #string SpawnGroupName -function SPAWN:SpawnGroupName( SpawnIndex ) - self:F( { self.SpawnTemplatePrefix, SpawnIndex } ) - - local SpawnPrefix = self.SpawnTemplatePrefix - if self.SpawnAliasPrefix then - SpawnPrefix = self.SpawnAliasPrefix - end - - if SpawnIndex then - local SpawnName = string.format( '%s#%03d', SpawnPrefix, SpawnIndex ) - self:T( SpawnName ) - return SpawnName - else - self:T( SpawnPrefix ) - return SpawnPrefix - end - -end - ---- Find the first alive group. --- @param #SPAWN self --- @param #number SpawnCursor A number holding the index from where to find the first group from. --- @return Group#GROUP, #number The group found, the new index where the group was found. --- @return #nil, #nil When no group is found, #nil is returned. -function SPAWN:GetFirstAliveGroup( SpawnCursor ) - self:F( { self.SpawnTemplatePrefix, self.SpawnAliasPrefix, SpawnCursor } ) - - for SpawnIndex = 1, self.SpawnCount do - local SpawnGroup = self:GetGroupFromIndex( SpawnIndex ) - if SpawnGroup and SpawnGroup:IsAlive() then - SpawnCursor = SpawnIndex - return SpawnGroup, SpawnCursor - end - end - - return nil, nil -end - - ---- Find the next alive group. --- @param #SPAWN self --- @param #number SpawnCursor A number holding the last found previous index. --- @return Group#GROUP, #number The group found, the new index where the group was found. --- @return #nil, #nil When no group is found, #nil is returned. -function SPAWN:GetNextAliveGroup( SpawnCursor ) - self:F( { self.SpawnTemplatePrefix, self.SpawnAliasPrefix, SpawnCursor } ) - - SpawnCursor = SpawnCursor + 1 - for SpawnIndex = SpawnCursor, self.SpawnCount do - local SpawnGroup = self:GetGroupFromIndex( SpawnIndex ) - if SpawnGroup and SpawnGroup:IsAlive() then - SpawnCursor = SpawnIndex - return SpawnGroup, SpawnCursor - end - end - - return nil, nil -end - ---- Find the last alive group during runtime. -function SPAWN:GetLastAliveGroup() - self:F( { self.SpawnTemplatePrefixself.SpawnAliasPrefix } ) - - self.SpawnIndex = self:_GetLastIndex() - for SpawnIndex = self.SpawnIndex, 1, -1 do - local SpawnGroup = self:GetGroupFromIndex( SpawnIndex ) - if SpawnGroup and SpawnGroup:IsAlive() then - self.SpawnIndex = SpawnIndex - return SpawnGroup - end - end - - self.SpawnIndex = nil - return nil -end - - - ---- Get the group from an index. --- Returns the group from the SpawnGroups list. --- If no index is given, it will return the first group in the list. --- @param #SPAWN self --- @param #number SpawnIndex The index of the group to return. --- @return Group#GROUP -function SPAWN:GetGroupFromIndex( SpawnIndex ) - self:F( { self.SpawnTemplatePrefix, self.SpawnAliasPrefix, SpawnIndex } ) - - if not SpawnIndex then - SpawnIndex = 1 - end - - if self.SpawnGroups and self.SpawnGroups[SpawnIndex] then - local SpawnGroup = self.SpawnGroups[SpawnIndex].Group - return SpawnGroup - else - return nil - end -end - ---- Get the group index from a DCSUnit. --- The method will search for a #-mark, and will return the index behind the #-mark of the DCSUnit. --- It will return nil of no prefix was found. --- @param #SPAWN self --- @param DCSUnit The DCS unit to be searched. --- @return #string The prefix --- @return #nil Nothing found -function SPAWN:_GetGroupIndexFromDCSUnit( DCSUnit ) - self:F( { self.SpawnTemplatePrefix, self.SpawnAliasPrefix, DCSUnit } ) - - if DCSUnit and DCSUnit:getName() then - local IndexString = string.match( DCSUnit:getName(), "#.*-" ):sub( 2, -2 ) - self:T( IndexString ) - - if IndexString then - local Index = tonumber( IndexString ) - self:T( { "Index:", IndexString, Index } ) - return Index - end - end - - return nil -end - ---- Return the prefix of a DCSUnit. --- The method will search for a #-mark, and will return the text before the #-mark. --- It will return nil of no prefix was found. --- @param #SPAWN self --- @param DCSUnit The DCS unit to be searched. --- @return #string The prefix --- @return #nil Nothing found -function SPAWN:_GetPrefixFromDCSUnit( DCSUnit ) - self:F( { self.SpawnTemplatePrefix, self.SpawnAliasPrefix, DCSUnit } ) - - if DCSUnit and DCSUnit:getName() then - local SpawnPrefix = string.match( DCSUnit:getName(), ".*#" ) - if SpawnPrefix then - SpawnPrefix = SpawnPrefix:sub( 1, -2 ) - end - self:T( SpawnPrefix ) - return SpawnPrefix - end - - return nil -end - ---- Return the group within the SpawnGroups collection with input a DCSUnit. -function SPAWN:_GetGroupFromDCSUnit( DCSUnit ) - self:F( { self.SpawnTemplatePrefix, self.SpawnAliasPrefix, DCSUnit } ) - - if DCSUnit then - local SpawnPrefix = self:_GetPrefixFromDCSUnit( DCSUnit ) - - if self.SpawnTemplatePrefix == SpawnPrefix or ( self.SpawnAliasPrefix and self.SpawnAliasPrefix == SpawnPrefix ) then - local SpawnGroupIndex = self:_GetGroupIndexFromDCSUnit( DCSUnit ) - local SpawnGroup = self.SpawnGroups[SpawnGroupIndex].Group - self:T( SpawnGroup ) - return SpawnGroup - end - end - - return nil -end - - ---- Get the index from a given group. --- The function will search the name of the group for a #, and will return the number behind the #-mark. -function SPAWN:GetSpawnIndexFromGroup( SpawnGroup ) - self:F( { self.SpawnTemplatePrefix, self.SpawnAliasPrefix, SpawnGroup } ) - - local IndexString = string.match( SpawnGroup:GetName(), "#.*$" ):sub( 2 ) - local Index = tonumber( IndexString ) - - self:T( IndexString, Index ) - return Index - -end - ---- Return the last maximum index that can be used. -function SPAWN:_GetLastIndex() - self:F( { self.SpawnTemplatePrefix, self.SpawnAliasPrefix } ) - - return self.SpawnMaxGroups -end - ---- Initalize the SpawnGroups collection. -function SPAWN:_InitializeSpawnGroups( SpawnIndex ) - self:F( { self.SpawnTemplatePrefix, self.SpawnAliasPrefix, SpawnIndex } ) - - if not self.SpawnGroups[SpawnIndex] then - self.SpawnGroups[SpawnIndex] = {} - self.SpawnGroups[SpawnIndex].Visible = false - self.SpawnGroups[SpawnIndex].Spawned = false - self.SpawnGroups[SpawnIndex].UnControlled = false - self.SpawnGroups[SpawnIndex].SpawnTime = 0 - - self.SpawnGroups[SpawnIndex].SpawnTemplatePrefix = self.SpawnTemplatePrefix - self.SpawnGroups[SpawnIndex].SpawnTemplate = self:_Prepare( self.SpawnGroups[SpawnIndex].SpawnTemplatePrefix, SpawnIndex ) - end - - self:_RandomizeTemplate( SpawnIndex ) - self:_RandomizeRoute( SpawnIndex ) - --self:_TranslateRotate( SpawnIndex ) - - return self.SpawnGroups[SpawnIndex] -end - - - ---- Gets the CategoryID of the Group with the given SpawnPrefix -function SPAWN:_GetGroupCategoryID( SpawnPrefix ) - local TemplateGroup = Group.getByName( SpawnPrefix ) - - if TemplateGroup then - return TemplateGroup:getCategory() - else - return nil - end -end - ---- Gets the CoalitionID of the Group with the given SpawnPrefix -function SPAWN:_GetGroupCoalitionID( SpawnPrefix ) - local TemplateGroup = Group.getByName( SpawnPrefix ) - - if TemplateGroup then - return TemplateGroup:getCoalition() - else - return nil - end -end - ---- Gets the CountryID of the Group with the given SpawnPrefix -function SPAWN:_GetGroupCountryID( SpawnPrefix ) - self:F( { self.SpawnTemplatePrefix, self.SpawnAliasPrefix, SpawnPrefix } ) - - local TemplateGroup = Group.getByName( SpawnPrefix ) - - if TemplateGroup then - local TemplateUnits = TemplateGroup:getUnits() - return TemplateUnits[1]:getCountry() - else - return nil - end -end - ---- Gets the Group Template from the ME environment definition. --- This method used the @{DATABASE} object, which contains ALL initial and new spawned object in MOOSE. --- @param #SPAWN self --- @param #string SpawnTemplatePrefix --- @return @SPAWN self -function SPAWN:_GetTemplate( SpawnTemplatePrefix ) - self:F( { self.SpawnTemplatePrefix, self.SpawnAliasPrefix, SpawnTemplatePrefix } ) - - local SpawnTemplate = nil - - SpawnTemplate = routines.utils.deepCopy( _DATABASE.Templates.Groups[SpawnTemplatePrefix].Template ) - - if SpawnTemplate == nil then - error( 'No Template returned for SpawnTemplatePrefix = ' .. SpawnTemplatePrefix ) - end - - SpawnTemplate.SpawnCoalitionID = self:_GetGroupCoalitionID( SpawnTemplatePrefix ) - SpawnTemplate.SpawnCategoryID = self:_GetGroupCategoryID( SpawnTemplatePrefix ) - SpawnTemplate.SpawnCountryID = self:_GetGroupCountryID( SpawnTemplatePrefix ) - - self:T( { SpawnTemplate } ) - return SpawnTemplate -end - ---- Prepares the new Group Template. --- @param #SPAWN self --- @param #string SpawnTemplatePrefix --- @param #number SpawnIndex --- @return #SPAWN self -function SPAWN:_Prepare( SpawnTemplatePrefix, SpawnIndex ) - self:F( { self.SpawnTemplatePrefix, self.SpawnAliasPrefix } ) - - local SpawnTemplate = self:_GetTemplate( SpawnTemplatePrefix ) - SpawnTemplate.name = self:SpawnGroupName( SpawnIndex ) - - SpawnTemplate.groupId = nil - SpawnTemplate.lateActivation = false - - if SpawnTemplate.SpawnCategoryID == Group.Category.GROUND then - self:T( "For ground units, visible needs to be false..." ) - SpawnTemplate.visible = false - end - - if SpawnTemplate.SpawnCategoryID == Group.Category.HELICOPTER or SpawnTemplate.SpawnCategoryID == Group.Category.AIRPLANE then - SpawnTemplate.uncontrolled = false - end - - for UnitID = 1, #SpawnTemplate.units do - SpawnTemplate.units[UnitID].name = string.format( SpawnTemplate.name .. '-%02d', UnitID ) - SpawnTemplate.units[UnitID].unitId = nil - SpawnTemplate.units[UnitID].x = SpawnTemplate.route.points[1].x - SpawnTemplate.units[UnitID].y = SpawnTemplate.route.points[1].y - end - - self:T( { "Template:", SpawnTemplate } ) - return SpawnTemplate - -end - ---- Private method randomizing the routes. --- @param #SPAWN self --- @param #number SpawnIndex The index of the group to be spawned. --- @return #SPAWN -function SPAWN:_RandomizeRoute( SpawnIndex ) - self:F( { self.SpawnTemplatePrefix, SpawnIndex, self.SpawnRandomizeRoute, self.SpawnRandomizeRouteStartPoint, self.SpawnRandomizeRouteEndPoint, self.SpawnRandomizeRouteRadius } ) - - if self.SpawnRandomizeRoute then - local SpawnTemplate = self.SpawnGroups[SpawnIndex].SpawnTemplate - local RouteCount = #SpawnTemplate.route.points - - for t = self.SpawnRandomizeRouteStartPoint + 1, ( RouteCount - self.SpawnRandomizeRouteEndPoint ) do - SpawnTemplate.route.points[t].x = SpawnTemplate.route.points[t].x + math.random( self.SpawnRandomizeRouteRadius * -1, self.SpawnRandomizeRouteRadius ) - SpawnTemplate.route.points[t].y = SpawnTemplate.route.points[t].y + math.random( self.SpawnRandomizeRouteRadius * -1, self.SpawnRandomizeRouteRadius ) - -- TODO: manage altitude for airborne units ... - SpawnTemplate.route.points[t].alt = nil - --SpawnGroup.route.points[t].alt_type = nil - self:T( 'SpawnTemplate.route.points[' .. t .. '].x = ' .. SpawnTemplate.route.points[t].x .. ', SpawnTemplate.route.points[' .. t .. '].y = ' .. SpawnTemplate.route.points[t].y ) - end - end - - return self -end - ---- Private method that randomizes the template of the group. --- @param #SPAWN self --- @param #number SpawnIndex --- @return #SPAWN self -function SPAWN:_RandomizeTemplate( SpawnIndex ) - self:F( { self.SpawnTemplatePrefix, SpawnIndex } ) - - if self.SpawnRandomizeTemplate then - self.SpawnGroups[SpawnIndex].SpawnTemplatePrefix = self.SpawnTemplatePrefixTable[ math.random( 1, #self.SpawnTemplatePrefixTable ) ] - self.SpawnGroups[SpawnIndex].SpawnTemplate = self:_Prepare( self.SpawnGroups[SpawnIndex].SpawnTemplatePrefix, SpawnIndex ) - self.SpawnGroups[SpawnIndex].SpawnTemplate.route = routines.utils.deepCopy( self.SpawnTemplate.route ) - self.SpawnGroups[SpawnIndex].SpawnTemplate.x = self.SpawnTemplate.x - self.SpawnGroups[SpawnIndex].SpawnTemplate.y = self.SpawnTemplate.y - self.SpawnGroups[SpawnIndex].SpawnTemplate.start_time = self.SpawnTemplate.start_time - for UnitID = 1, #self.SpawnGroups[SpawnIndex].SpawnTemplate.units do - self.SpawnGroups[SpawnIndex].SpawnTemplate.units[UnitID].heading = self.SpawnTemplate.units[1].heading - end - end - - self:_RandomizeRoute( SpawnIndex ) - - return self -end - -function SPAWN:_TranslateRotate( SpawnIndex, SpawnRootX, SpawnRootY, SpawnX, SpawnY, SpawnAngle ) - self:F( { self.SpawnTemplatePrefix, SpawnIndex, SpawnRootX, SpawnRootY, SpawnX, SpawnY, SpawnAngle } ) - - -- Translate - local TranslatedX = SpawnX - local TranslatedY = SpawnY - - -- Rotate - -- From Wikipedia: https://en.wikipedia.org/wiki/Rotation_matrix#Common_rotations - -- x' = x \cos \theta - y \sin \theta\ - -- y' = x \sin \theta + y \cos \theta\ - local RotatedX = - TranslatedX * math.cos( math.rad( SpawnAngle ) ) - + TranslatedY * math.sin( math.rad( SpawnAngle ) ) - local RotatedY = TranslatedX * math.sin( math.rad( SpawnAngle ) ) - + TranslatedY * math.cos( math.rad( SpawnAngle ) ) - - -- Assign - self.SpawnGroups[SpawnIndex].SpawnTemplate.x = SpawnRootX - RotatedX - self.SpawnGroups[SpawnIndex].SpawnTemplate.y = SpawnRootY + RotatedY - - - local SpawnUnitCount = table.getn( self.SpawnGroups[SpawnIndex].SpawnTemplate.units ) - for u = 1, SpawnUnitCount do - - -- Translate - local TranslatedX = SpawnX - local TranslatedY = SpawnY - 10 * ( u - 1 ) - - -- Rotate - local RotatedX = - TranslatedX * math.cos( math.rad( SpawnAngle ) ) - + TranslatedY * math.sin( math.rad( SpawnAngle ) ) - local RotatedY = TranslatedX * math.sin( math.rad( SpawnAngle ) ) - + TranslatedY * math.cos( math.rad( SpawnAngle ) ) - - -- Assign - self.SpawnGroups[SpawnIndex].SpawnTemplate.units[u].x = SpawnRootX - RotatedX - self.SpawnGroups[SpawnIndex].SpawnTemplate.units[u].y = SpawnRootY + RotatedY - self.SpawnGroups[SpawnIndex].SpawnTemplate.units[u].heading = self.SpawnGroups[SpawnIndex].SpawnTemplate.units[u].heading + math.rad( SpawnAngle ) - end - - return self -end - ---- Get the next index of the groups to be spawned. This function is complicated, as it is used at several spaces. -function SPAWN:_GetSpawnIndex( SpawnIndex ) - self:F( { self.SpawnTemplatePrefix, SpawnIndex, self.SpawnMaxGroups, self.SpawnMaxUnitsAlive, self.AliveUnits, #self.SpawnTemplate.units } ) - - - if ( self.SpawnMaxGroups == 0 ) or ( SpawnIndex <= self.SpawnMaxGroups ) then - if ( self.SpawnMaxUnitsAlive == 0 ) or ( self.AliveUnits < self.SpawnMaxUnitsAlive * #self.SpawnTemplate.units ) or self.UnControlled then - if SpawnIndex and SpawnIndex >= self.SpawnCount + 1 then - self.SpawnCount = self.SpawnCount + 1 - SpawnIndex = self.SpawnCount - end - self.SpawnIndex = SpawnIndex - if not self.SpawnGroups[self.SpawnIndex] then - self:_InitializeSpawnGroups( self.SpawnIndex ) - end - else - return nil - end - else - return nil - end - - return self.SpawnIndex -end - - --- TODO Need to delete this... _DATABASE does this now ... -function SPAWN:_OnBirth( event ) - - if timer.getTime0() < timer.getAbsTime() then -- dont need to add units spawned in at the start of the mission if mist is loaded in init line - if event.initiator and event.initiator:getName() then - local EventPrefix = self:_GetPrefixFromDCSUnit( event.initiator ) - if EventPrefix == self.SpawnTemplatePrefix or ( self.SpawnAliasPrefix and EventPrefix == self.SpawnAliasPrefix ) then - self:T( { "Birth event: " .. event.initiator:getName(), event } ) - --MessageToAll( "Mission command: unit " .. SpawnTemplatePrefix .. " spawned." , 5, EventPrefix .. '/Event') - self.AliveUnits = self.AliveUnits + 1 - self:T( "Alive Units: " .. self.AliveUnits ) - end - end - end - -end - ---- Obscolete --- @todo Need to delete this... _DATABASE does this now ... -function SPAWN:_OnDeadOrCrash( event ) - self:F( self.SpawnTemplatePrefix, event ) - - if event.initiator and event.initiator:getName() then - local EventPrefix = self:_GetPrefixFromDCSUnit( event.initiator ) - if EventPrefix == self.SpawnTemplatePrefix or ( self.SpawnAliasPrefix and EventPrefix == self.SpawnAliasPrefix ) then - self:T( { "Dead event: " .. event.initiator:getName(), event } ) --- local DestroyedUnit = Unit.getByName( EventPrefix ) --- if DestroyedUnit and DestroyedUnit.getLife() <= 1.0 then - --MessageToAll( "Mission command: unit " .. SpawnTemplatePrefix .. " crashed." , 5, EventPrefix .. '/Event') - self.AliveUnits = self.AliveUnits - 1 - self:T( "Alive Units: " .. self.AliveUnits ) --- end - end - end -end - ---- Will detect AIR Units taking off... When the event takes place, the spawned Group is registered as airborne... --- This is needed to ensure that Re-SPAWNing only is done for landed AIR Groups. --- @todo Need to test for AIR Groups only... -function SPAWN:_OnTakeOff( event ) - self:F( self.SpawnTemplatePrefix, event ) - - if event.initiator and event.initiator:getName() then - local SpawnGroup = self:_GetGroupFromDCSUnit( event.initiator ) - if SpawnGroup then - self:T( { "TakeOff event: " .. event.initiator:getName(), event } ) - self:T( "self.Landed = false" ) - self.Landed = false - end - end -end - ---- Will detect AIR Units landing... When the event takes place, the spawned Group is registered as landed. --- This is needed to ensure that Re-SPAWNing is only done for landed AIR Groups. --- @todo Need to test for AIR Groups only... -function SPAWN:_OnLand( event ) - self:F( self.SpawnTemplatePrefix, event ) - - local SpawnUnit = event.initiator - if SpawnUnit and SpawnUnit:isExist() and Object.getCategory(SpawnUnit) == Object.Category.UNIT then - local SpawnGroup = self:_GetGroupFromDCSUnit( SpawnUnit ) - if SpawnGroup then - self:T( { "Landed event:" .. SpawnUnit:getName(), event } ) - self.Landed = true - self:T( "self.Landed = true" ) - if self.Landed and self.RepeatOnLanding then - local SpawnGroupIndex = self:GetSpawnIndexFromGroup( SpawnGroup ) - self:T( { "Landed:", "ReSpawn:", SpawnGroup:GetName(), SpawnGroupIndex } ) - self:ReSpawn( SpawnGroupIndex ) - end - end - end -end - ---- Will detect AIR Units shutting down their engines ... --- When the event takes place, and the method @{RepeatOnEngineShutDown} was called, the spawned Group will Re-SPAWN. --- But only when the Unit was registered to have landed. --- @param #SPAWN self --- @see _OnTakeOff --- @see _OnLand --- @todo Need to test for AIR Groups only... -function SPAWN:_OnEngineShutDown( event ) - self:F( self.SpawnTemplatePrefix, event ) - - local SpawnUnit = event.initiator - if SpawnUnit and SpawnUnit:isExist() and Object.getCategory(SpawnUnit) == Object.Category.UNIT then - local SpawnGroup = self:_GetGroupFromDCSUnit( SpawnUnit ) - if SpawnGroup then - self:T( { "EngineShutDown event: " .. SpawnUnit:getName(), event } ) - if self.Landed and self.RepeatOnEngineShutDown then - local SpawnGroupIndex = self:GetSpawnIndexFromGroup( SpawnGroup ) - self:T( { "EngineShutDown: ", "ReSpawn:", SpawnGroup:GetName(), SpawnGroupIndex } ) - self:ReSpawn( SpawnGroupIndex ) - end - end - end -end - ---- This function is called automatically by the Spawning scheduler. --- It is the internal worker method SPAWNing new Groups on the defined time intervals. -function SPAWN:_Scheduler() - self:F( { "_Scheduler", self.SpawnTemplatePrefix, self.SpawnAliasPrefix, self.SpawnIndex, self.SpawnMaxGroups, self.SpawnMaxUnitsAlive } ) - - -- Validate if there are still groups left in the batch... - self:Spawn() - - return true -end - -function SPAWN:_SpawnCleanUpScheduler() - self:F( { "CleanUp Scheduler:", self.SpawnTemplatePrefix } ) - - local SpawnCursor - local SpawnGroup, SpawnCursor = self:GetFirstAliveGroup( SpawnCursor ) - - self:T( { "CleanUp Scheduler:", SpawnGroup } ) - - while SpawnGroup do - - if SpawnGroup:AllOnGround() and SpawnGroup:GetMaxVelocity() < 1 then - if not self.SpawnCleanUpTimeStamps[SpawnGroup:GetName()] then - self.SpawnCleanUpTimeStamps[SpawnGroup:GetName()] = timer.getTime() - else - if self.SpawnCleanUpTimeStamps[SpawnGroup:GetName()] + self.SpawnCleanUpInterval < timer.getTime() then - self:T( { "CleanUp Scheduler:", "Cleaning:", SpawnGroup } ) - SpawnGroup:Destroy() - end - end - else - self.SpawnCleanUpTimeStamps[SpawnGroup:GetName()] = nil - end - - SpawnGroup, SpawnCursor = self:GetNextAliveGroup( SpawnCursor ) - - self:T( { "CleanUp Scheduler:", SpawnGroup } ) - - end - - return true -- Repeat - -end ---- Limit the simultaneous movement of Groups within a running Mission. --- This module is defined to improve the performance in missions, and to bring additional realism for GROUND vehicles. --- Performance: If in a DCSRTE there are a lot of moving GROUND units, then in a multi player mission, this WILL create lag if --- the main DCS execution core of your CPU is fully utilized. So, this class will limit the amount of simultaneous moving GROUND units --- on defined intervals (currently every minute). --- @module MOVEMENT - -Include.File( "Routines" ) - ---- the MOVEMENT class --- @type -MOVEMENT = { - ClassName = "MOVEMENT", -} - ---- Creates the main object which is handling the GROUND forces movement. --- @param table{string,...}|string MovePrefixes is a table of the Prefixes (names) of the GROUND Groups that need to be controlled by the MOVEMENT Object. --- @param number MoveMaximum is a number that defines the maximum amount of GROUND Units to be moving during one minute. --- @return MOVEMENT --- @usage --- -- Limit the amount of simultaneous moving units on the ground to prevent lag. --- Movement_US_Platoons = MOVEMENT:New( { 'US Tank Platoon Left', 'US Tank Platoon Middle', 'US Tank Platoon Right', 'US CH-47D Troops' }, 15 ) - -function MOVEMENT:New( MovePrefixes, MoveMaximum ) - local self = BASE:Inherit( self, BASE:New() ) - self:F( { MovePrefixes, MoveMaximum } ) - - if type( MovePrefixes ) == 'table' then - self.MovePrefixes = MovePrefixes - else - self.MovePrefixes = { MovePrefixes } - end - self.MoveCount = 0 -- The internal counter of the amount of Moveing the has happened since MoveStart. - self.MoveMaximum = MoveMaximum -- Contains the Maximum amount of units that are allowed to move... - self.AliveUnits = 0 -- Contains the counter how many units are currently alive - self.MoveUnits = {} -- Reflects if the Moving for this MovePrefixes is going to be scheduled or not. - - _EVENTDISPATCHER:OnBirth( self.OnBirth, self ) - --- self:AddEvent( world.event.S_EVENT_BIRTH, self.OnBirth ) --- --- self:EnableEvents() - - self:ScheduleStart() - - return self -end - ---- Call this function to start the MOVEMENT scheduling. -function MOVEMENT:ScheduleStart() - self:F() - --self.MoveFunction = routines.scheduleFunction( self._Scheduler, { self }, timer.getTime() + 1, 120 ) - self.MoveFunction = SCHEDULER:New( self, self._Scheduler, {}, 1, 120 ) -end - ---- Call this function to stop the MOVEMENT scheduling. --- @todo need to implement it ... Forgot. -function MOVEMENT:ScheduleStop() - self:F() - -end - ---- Captures the birth events when new Units were spawned. --- @todo This method should become obsolete. The new @{DATABASE} class will handle the collection administration. -function MOVEMENT:OnBirth( Event ) - self:F( { Event } ) - - if timer.getTime0() < timer.getAbsTime() then -- dont need to add units spawned in at the start of the mission if mist is loaded in init line - if Event.IniDCSUnit then - self:T( "Birth object : " .. Event.IniDCSUnitName ) - if Event.IniDCSGroup and Event.IniDCSGroup:isExist() then - for MovePrefixID, MovePrefix in pairs( self.MovePrefixes ) do - if string.find( Event.IniDCSUnitName, MovePrefix, 1, true ) then - self.AliveUnits = self.AliveUnits + 1 - self.MoveUnits[Event.IniDCSUnitName] = Event.IniDCSGroupName - self:T( self.AliveUnits ) - end - end - end - end - _EVENTDISPATCHER:OnCrashForUnit( Event.IniDCSUnitName, self.OnDeadOrCrash, self ) - _EVENTDISPATCHER:OnDeadForUnit( Event.IniDCSUnitName, self.OnDeadOrCrash, self ) - end - -end - ---- Captures the Dead or Crash events when Units crash or are destroyed. --- @todo This method should become obsolete. The new @{DATABASE} class will handle the collection administration. -function MOVEMENT:OnDeadOrCrash( Event ) - self:F( { Event } ) - - if Event.IniDCSUnit then - self:T( "Dead object : " .. Event.IniDCSUnitName ) - for MovePrefixID, MovePrefix in pairs( self.MovePrefixes ) do - if string.find( Event.IniDCSUnitName, MovePrefix, 1, true ) then - self.AliveUnits = self.AliveUnits - 1 - self.MoveUnits[Event.IniDCSUnitName] = nil - self:T( self.AliveUnits ) - end - end - end -end - ---- This function is called automatically by the MOVEMENT scheduler. A new function is scheduled when MoveScheduled is true. -function MOVEMENT:_Scheduler() - self:F( { self.MovePrefixes, self.MoveMaximum, self.AliveUnits, self.MovementGroups } ) - - if self.AliveUnits > 0 then - local MoveProbability = ( self.MoveMaximum * 100 ) / self.AliveUnits - self:T( 'Move Probability = ' .. MoveProbability ) - - for MovementUnitName, MovementGroupName in pairs( self.MoveUnits ) do - local MovementGroup = Group.getByName( MovementGroupName ) - if MovementGroup and MovementGroup:isExist() then - local MoveOrStop = math.random( 1, 100 ) - self:T( 'MoveOrStop = ' .. MoveOrStop ) - if MoveOrStop <= MoveProbability then - self:T( 'Group continues moving = ' .. MovementGroupName ) - trigger.action.groupContinueMoving( MovementGroup ) - else - self:T( 'Group stops moving = ' .. MovementGroupName ) - trigger.action.groupStopMoving( MovementGroup ) - end - else - self.MoveUnits[MovementUnitName] = nil - end - end - end - return true -end ---- Provides defensive behaviour to a set of SAM sites within a running Mission. --- @module Sead --- @author to be searched on the forum --- @author (co) Flightcontrol (Modified and enriched with functionality) - -Include.File( "Routines" ) -Include.File( "Event" ) -Include.File( "Base" ) -Include.File( "Mission" ) -Include.File( "Client" ) -Include.File( "Task" ) - ---- The SEAD class --- @type SEAD --- @extends Base#BASE -SEAD = { - ClassName = "SEAD", - TargetSkill = { - Average = { Evade = 50, DelayOff = { 10, 25 }, DelayOn = { 10, 30 } } , - Good = { Evade = 30, DelayOff = { 8, 20 }, DelayOn = { 20, 40 } } , - High = { Evade = 15, DelayOff = { 5, 17 }, DelayOn = { 30, 50 } } , - Excellent = { Evade = 10, DelayOff = { 3, 10 }, DelayOn = { 30, 60 } } - }, - SEADGroupPrefixes = {} -} - ---- Creates the main object which is handling defensive actions for SA sites or moving SA vehicles. --- When an anti radiation missile is fired (KH-58, KH-31P, KH-31A, KH-25MPU, HARM missiles), the SA will shut down their radars and will take evasive actions... --- Chances are big that the missile will miss. --- @param table{string,...}|string SEADGroupPrefixes which is a table of Prefixes of the SA Groups in the DCSRTE on which evasive actions need to be taken. --- @return SEAD --- @usage --- -- CCCP SEAD Defenses --- -- Defends the Russian SA installations from SEAD attacks. --- SEAD_RU_SAM_Defenses = SEAD:New( { 'RU SA-6 Kub', 'RU SA-6 Defenses', 'RU MI-26 Troops', 'RU Attack Gori' } ) -function SEAD:New( SEADGroupPrefixes ) - local self = BASE:Inherit( self, BASE:New() ) - self:F( SEADGroupPrefixes ) - if type( SEADGroupPrefixes ) == 'table' then - for SEADGroupPrefixID, SEADGroupPrefix in pairs( SEADGroupPrefixes ) do - self.SEADGroupPrefixes[SEADGroupPrefix] = SEADGroupPrefix - end - else - self.SEADGroupNames[SEADGroupPrefixes] = SEADGroupPrefixes - end - _EVENTDISPATCHER:OnShot( self.EventShot, self ) - - return self -end - ---- Detects if an SA site was shot with an anti radiation missile. In this case, take evasive actions based on the skill level set within the ME. --- @see SEAD -function SEAD:EventShot( Event ) - self:F( { Event } ) - - local SEADUnit = Event.IniDCSUnit - local SEADUnitName = Event.IniDCSUnitName - local SEADWeapon = Event.Weapon -- Identify the weapon fired - local SEADWeaponName = Event.WeaponName -- return weapon type - --trigger.action.outText( string.format("Alerte, depart missile " ..string.format(SEADWeaponName)), 20) --debug message - -- Start of the 2nd loop - self:T( "Missile Launched = " .. SEADWeaponName ) - if SEADWeaponName == "KH-58" or SEADWeaponName == "KH-25MPU" or SEADWeaponName == "AGM-88" or SEADWeaponName == "KH-31A" or SEADWeaponName == "KH-31P" then -- Check if the missile is a SEAD - local _evade = math.random (1,100) -- random number for chance of evading action - local _targetMim = Event.Weapon:getTarget() -- Identify target - local _targetMimname = Unit.getName(_targetMim) - local _targetMimgroup = Unit.getGroup(Weapon.getTarget(SEADWeapon)) - local _targetMimgroupName = _targetMimgroup:getName() - local _targetMimcont= _targetMimgroup:getController() - local _targetskill = _DATABASE.Templates.Units[_targetMimname].Template.skill - self:T( self.SEADGroupPrefixes ) - self:T( _targetMimgroupName ) - local SEADGroupFound = false - for SEADGroupPrefixID, SEADGroupPrefix in pairs( self.SEADGroupPrefixes ) do - if string.find( _targetMimgroupName, SEADGroupPrefix, 1, true ) then - SEADGroupFound = true - self:T( 'Group Found' ) - break - end - end - if SEADGroupFound == true then - if _targetskill == "Random" then -- when skill is random, choose a skill - local Skills = { "Average", "Good", "High", "Excellent" } - _targetskill = Skills[ math.random(1,4) ] - end - self:T( _targetskill ) -- debug message for skill check - if self.TargetSkill[_targetskill] then - if (_evade > self.TargetSkill[_targetskill].Evade) then - self:T( string.format("Evading, target skill " ..string.format(_targetskill)) ) --debug message - local _targetMim = Weapon.getTarget(SEADWeapon) - local _targetMimname = Unit.getName(_targetMim) - local _targetMimgroup = Unit.getGroup(Weapon.getTarget(SEADWeapon)) - local _targetMimcont= _targetMimgroup:getController() - routines.groupRandomDistSelf(_targetMimgroup,300,'Diamond',250,20) -- move randomly - local SuppressedGroups1 = {} -- unit suppressed radar off for a random time - local function SuppressionEnd1(id) - id.ctrl:setOption(AI.Option.Ground.id.ALARM_STATE,AI.Option.Ground.val.ALARM_STATE.GREEN) - SuppressedGroups1[id.groupName] = nil - end - local id = { - groupName = _targetMimgroup, - ctrl = _targetMimcont - } - local delay1 = math.random(self.TargetSkill[_targetskill].DelayOff[1], self.TargetSkill[_targetskill].DelayOff[2]) - if SuppressedGroups1[id.groupName] == nil then - SuppressedGroups1[id.groupName] = { - SuppressionEndTime1 = timer.getTime() + delay1, - SuppressionEndN1 = SuppressionEndCounter1 --Store instance of SuppressionEnd() scheduled function - } - Controller.setOption(_targetMimcont, AI.Option.Ground.id.ALARM_STATE,AI.Option.Ground.val.ALARM_STATE.GREEN) - timer.scheduleFunction(SuppressionEnd1, id, SuppressedGroups1[id.groupName].SuppressionEndTime1) --Schedule the SuppressionEnd() function - --trigger.action.outText( string.format("Radar Off " ..string.format(delay1)), 20) - end - - local SuppressedGroups = {} - local function SuppressionEnd(id) - id.ctrl:setOption(AI.Option.Ground.id.ALARM_STATE,AI.Option.Ground.val.ALARM_STATE.RED) - SuppressedGroups[id.groupName] = nil - end - local id = { - groupName = _targetMimgroup, - ctrl = _targetMimcont - } - local delay = math.random(self.TargetSkill[_targetskill].DelayOn[1], self.TargetSkill[_targetskill].DelayOn[2]) - if SuppressedGroups[id.groupName] == nil then - SuppressedGroups[id.groupName] = { - SuppressionEndTime = timer.getTime() + delay, - SuppressionEndN = SuppressionEndCounter --Store instance of SuppressionEnd() scheduled function - } - timer.scheduleFunction(SuppressionEnd, id, SuppressedGroups[id.groupName].SuppressionEndTime) --Schedule the SuppressionEnd() function - --trigger.action.outText( string.format("Radar On " ..string.format(delay)), 20) - end - end - end - end - end -end ---- Taking the lead of AI escorting your flight. --- --- @{#ESCORT} class --- ================ --- The @{#ESCORT} class allows you to interact with escorting AI on your flight and take the lead. --- Each escorting group can be commanded with a whole set of radio commands (radio menu in your flight, and then F10). --- --- The radio commands will vary according the category of the group. The richest set of commands are with Helicopters and AirPlanes. --- Ships and Ground troops will have a more limited set, but they can provide support through the bombing of targets designated by the other escorts. --- --- RADIO MENUs that can be created: --- ================================ --- Find a summary below of the current available commands: --- --- Navigation ...: --- --------------- --- Escort group navigation functions: --- --- * **"Join-Up and Follow at x meters":** The escort group fill follow you at about x meters, and they will follow you. --- * **"Flare":** Provides menu commands to let the escort group shoot a flare in the air in a color. --- * **"Smoke":** Provides menu commands to let the escort group smoke the air in a color. Note that smoking is only available for ground and naval troops. --- --- Hold position ...: --- ------------------ --- Escort group navigation functions: --- --- * **"At current location":** Stops the escort group and they will hover 30 meters above the ground at the position they stopped. --- * **"At client location":** Stops the escort group and they will hover 30 meters above the ground at the position they stopped. --- --- Report targets ...: --- ------------------- --- Report targets will make the escort group to report any target that it identifies within a 8km range. Any detected target can be attacked using the 4. Attack nearby targets function. (see below). --- --- * **"Report now":** Will report the current detected targets. --- * **"Report targets on":** Will make the escort group to report detected targets and will fill the "Attack nearby targets" menu list. --- * **"Report targets off":** Will stop detecting targets. --- --- Scan targets ...: --- ----------------- --- Menu items to pop-up the escort group for target scanning. After scanning, the escort group will resume with the mission or defined task. --- --- * **"Scan targets 30 seconds":** Scan 30 seconds for targets. --- * **"Scan targets 60 seconds":** Scan 60 seconds for targets. --- --- Attack targets ...: --- ------------------- --- This menu item will list all detected targets within a 15km range. Depending on the level of detection (known/unknown) and visuality, the targets type will also be listed. --- --- Request assistance from ...: --- ---------------------------- --- This menu item will list all detected targets within a 15km range, as with the menu item **Attack Targets**. --- This menu item allows to request attack support from other escorts supporting the current client group. --- eg. the function allows a player to request support from the Ship escort to attack a target identified by the Plane escort with its Tomahawk missiles. --- eg. the function allows a player to request support from other Planes escorting to bomb the unit with illumination missiles or bombs, so that the main plane escort can attack the area. --- --- ROE ...: --- -------- --- Sets the Rules of Engagement (ROE) of the escort group when in flight. --- --- * **"Hold Fire":** The escort group will hold fire. --- * **"Return Fire":** The escort group will return fire. --- * **"Open Fire":** The escort group will open fire on designated targets. --- * **"Weapon Free":** The escort group will engage with any target. --- --- Evasion ...: --- ------------ --- Will define the evasion techniques that the escort group will perform during flight or combat. --- --- * **"Fight until death":** The escort group will have no reaction to threats. --- * **"Use flares, chaff and jammers":** The escort group will use passive defense using flares and jammers. No evasive manoeuvres are executed. --- * **"Evade enemy fire":** The rescort group will evade enemy fire before firing. --- * **"Go below radar and evade fire":** The escort group will perform evasive vertical manoeuvres. --- --- Resume Mission ...: --- ------------------- --- Escort groups can have their own mission. This menu item will allow the escort group to resume their Mission from a given waypoint. --- Note that this is really fantastic, as you now have the dynamic of taking control of the escort groups, and allowing them to resume their path or mission. --- --- ESCORT construction methods. --- ============================ --- Create a new SPAWN object with the @{#ESCORT.New} method: --- --- * @{#ESCORT.New}: Creates a new ESCORT object from a @{Group#GROUP} for a @{Client#CLIENT}, with an optional briefing text. --- --- ESCORT initialization methods. --- ============================== --- The following menus are created within the RADIO MENU of an active unit hosted by a player: --- --- * @{#ESCORT.MenuFollowAt}: Creates a menu to make the escort follow the client. --- * @{#ESCORT.MenuHoldAtEscortPosition}: Creates a menu to hold the escort at its current position. --- * @{#ESCORT.MenuHoldAtLeaderPosition}: Creates a menu to hold the escort at the client position. --- * @{#ESCORT.MenuScanForTargets}: Creates a menu so that the escort scans targets. --- * @{#ESCORT.MenuFlare}: Creates a menu to disperse flares. --- * @{#ESCORT.MenuSmoke}: Creates a menu to disparse smoke. --- * @{#ESCORT.MenuReportTargets}: Creates a menu so that the escort reports targets. --- * @{#ESCORT.MenuReportPosition}: Creates a menu so that the escort reports its current position from bullseye. --- * @{#ESCORT.MenuAssistedAttack: Creates a menu so that the escort supportes assisted attack from other escorts with the client. --- * @{#ESCORT.MenuROE: Creates a menu structure to set the rules of engagement of the escort. --- * @{#ESCORT.MenuEvasion: Creates a menu structure to set the evasion techniques when the escort is under threat. --- * @{#ESCORT.MenuResumeMission}: Creates a menu structure so that the escort can resume from a waypoint. --- --- @module Escort --- @author FlightControl - -Include.File( "Routines" ) -Include.File( "Base" ) -Include.File( "Database" ) -Include.File( "Group" ) -Include.File( "Zone" ) - ---- --- @type ESCORT --- @extends Base#BASE --- @field Client#CLIENT EscortClient --- @field Group#GROUP EscortGroup --- @field #string EscortName --- @field #ESCORT.MODE EscortMode The mode the escort is in. --- @field #number FollowScheduler The id of the _FollowScheduler function. --- @field #boolean ReportTargets If true, nearby targets are reported. --- @Field DCSTypes#AI.Option.Air.val.ROE OptionROE Which ROE is set to the EscortGroup. --- @field DCSTypes#AI.Option.Air.val.REACTION_ON_THREAT OptionReactionOnThreat Which REACTION_ON_THREAT is set to the EscortGroup. --- @field Menu#MENU_CLIENT EscortMenuResumeMission -ESCORT = { - ClassName = "ESCORT", - EscortName = nil, -- The Escort Name - EscortClient = nil, - EscortGroup = nil, - EscortMode = nil, - MODE = { - FOLLOW = 1, - MISSION = 2, - }, - Targets = {}, -- The identified targets - FollowScheduler = nil, - ReportTargets = true, - OptionROE = AI.Option.Air.val.ROE.OPEN_FIRE, - OptionReactionOnThreat = AI.Option.Air.val.REACTION_ON_THREAT.ALLOW_ABORT_MISSION, - TaskPoints = {} -} - ---- ESCORT.Mode class --- @type ESCORT.MODE --- @field #number FOLLOW --- @field #number MISSION - ---- MENUPARAM type --- @type MENUPARAM --- @field #ESCORT ParamSelf --- @field #Distance ParamDistance --- @field #function ParamFunction --- @field #string ParamMessage - ---- ESCORT class constructor for an AI group --- @param #ESCORT self --- @param Client#CLIENT EscortClient The client escorted by the EscortGroup. --- @param Group#GROUP EscortGroup The group AI escorting the EscortClient. --- @param #string EscortName Name of the escort. --- @return #ESCORT self -function ESCORT:New( EscortClient, EscortGroup, EscortName, EscortBriefing ) - local self = BASE:Inherit( self, BASE:New() ) - self:F( { EscortClient, EscortGroup, EscortName } ) - - self.EscortClient = EscortClient -- Client#CLIENT - self.EscortGroup = EscortGroup -- Group#GROUP - self.EscortName = EscortName - self.EscortBriefing = EscortBriefing - - self:T( EscortGroup:GetClassNameAndID() ) - - -- Set EscortGroup known at EscortClient. - if not self.EscortClient._EscortGroups then - self.EscortClient._EscortGroups = {} - end - - if not self.EscortClient._EscortGroups[EscortGroup:GetName()] then - self.EscortClient._EscortGroups[EscortGroup:GetName()] = {} - self.EscortClient._EscortGroups[EscortGroup:GetName()].EscortGroup = self.EscortGroup - self.EscortClient._EscortGroups[EscortGroup:GetName()].EscortName = self.EscortName - self.EscortClient._EscortGroups[EscortGroup:GetName()].Targets = {} - self.EscortMode = ESCORT.MODE.FOLLOW - end - - - self.EscortMenu = MENU_CLIENT:New( self.EscortClient, self.EscortName ) - - self.EscortGroup:WayPointInitialize(1) - - self.EscortGroup:OptionROTVertical() - self.EscortGroup:OptionROEOpenFire() - - EscortGroup:MessageToClient( EscortGroup:GetCategoryName() .. " '" .. EscortName .. "' (" .. EscortGroup:GetCallsign() .. ") reporting! " .. - "We're escorting your flight. " .. - "Use the Radio Menu and F10 and use the options under + " .. EscortName .. "\n", - 60, EscortClient - ) - - return self -end - - ---- Defines the default menus --- @param #ESCORT self --- @return #ESCORT -function ESCORT:Menus() - self:F() - - self:MenuFollowAt( 100 ) - self:MenuFollowAt( 200 ) - self:MenuFollowAt( 300 ) - self:MenuFollowAt( 400 ) - - self:MenuScanForTargets( 100, 60 ) - - self:MenuHoldAtEscortPosition( 30 ) - self:MenuHoldAtLeaderPosition( 30 ) - - self:MenuFlare() - self:MenuSmoke() - - self:MenuReportTargets( 60 ) - self:MenuAssistedAttack() - self:MenuROE() - self:MenuEvasion() - self:MenuResumeMission() - - return self -end - - - ---- Defines a menu slot to let the escort Join and Follow you at a certain distance. --- This menu will appear under **Navigation**. --- @param #ESCORT self --- @param DCSTypes#Distance Distance The distance in meters that the escort needs to follow the client. --- @return #ESCORT -function ESCORT:MenuFollowAt( Distance ) - self:F(Distance) - - if self.EscortGroup:IsAir() then - if not self.EscortMenuReportNavigation then - self.EscortMenuReportNavigation = MENU_CLIENT:New( self.EscortClient, "Navigation", self.EscortMenu ) - end - - if not self.EscortMenuJoinUpAndFollow then - self.EscortMenuJoinUpAndFollow = {} - end - - self.EscortMenuJoinUpAndFollow[#self.EscortMenuJoinUpAndFollow+1] = MENU_CLIENT_COMMAND:New( self.EscortClient, "Join-Up and Follow at " .. Distance, self.EscortMenuReportNavigation, ESCORT._JoinUpAndFollow, { ParamSelf = self, ParamDistance = Distance } ) - - self.EscortMode = ESCORT.MODE.FOLLOW - end - - return self -end - ---- Defines a menu slot to let the escort hold at their current position and stay low with a specified height during a specified time in seconds. --- This menu will appear under **Hold position**. --- @param #ESCORT self --- @param DCSTypes#Distance Height Optional parameter that sets the height in meters to let the escort orbit at the current location. The default value is 30 meters. --- @param DCSTypes#Time Seconds Optional parameter that lets the escort orbit at the current position for a specified time. (not implemented yet). The default value is 0 seconds, meaning, that the escort will orbit forever until a sequent command is given. --- @param #string MenuTextFormat Optional parameter that shows the menu option text. The text string is formatted, and should contain two %d tokens in the string. The first for the Height, the second for the Time (if given). If no text is given, the default text will be displayed. --- @return #ESCORT --- TODO: Implement Seconds parameter. Challenge is to first develop the "continue from last activity" function. -function ESCORT:MenuHoldAtEscortPosition( Height, Seconds, MenuTextFormat ) - self:F( { Height, Seconds, MenuTextFormat } ) - - if self.EscortGroup:IsAir() then - - if not self.EscortMenuHold then - self.EscortMenuHold = MENU_CLIENT:New( self.EscortClient, "Hold position", self.EscortMenu ) - end - - if not Height then - Height = 30 - end - - if not Seconds then - Seconds = 0 - end - - local MenuText = "" - if not MenuTextFormat then - if Seconds == 0 then - MenuText = string.format( "Hold at %d meter", Height ) - else - MenuText = string.format( "Hold at %d meter for %d seconds", Height, Seconds ) - end - else - if Seconds == 0 then - MenuText = string.format( MenuTextFormat, Height ) - else - MenuText = string.format( MenuTextFormat, Height, Seconds ) - end - end - - if not self.EscortMenuHoldPosition then - self.EscortMenuHoldPosition = {} - end - - self.EscortMenuHoldPosition[#self.EscortMenuHoldPosition+1] = MENU_CLIENT_COMMAND - :New( - self.EscortClient, - MenuText, - self.EscortMenuHold, - ESCORT._HoldPosition, - { ParamSelf = self, - ParamOrbitGroup = self.EscortGroup, - ParamHeight = Height, - ParamSeconds = Seconds - } - ) - end - - return self -end - - ---- Defines a menu slot to let the escort hold at the client position and stay low with a specified height during a specified time in seconds. --- This menu will appear under **Navigation**. --- @param #ESCORT self --- @param DCSTypes#Distance Height Optional parameter that sets the height in meters to let the escort orbit at the current location. The default value is 30 meters. --- @param DCSTypes#Time Seconds Optional parameter that lets the escort orbit at the current position for a specified time. (not implemented yet). The default value is 0 seconds, meaning, that the escort will orbit forever until a sequent command is given. --- @param #string MenuTextFormat Optional parameter that shows the menu option text. The text string is formatted, and should contain one or two %d tokens in the string. The first for the Height, the second for the Time (if given). If no text is given, the default text will be displayed. --- @return #ESCORT --- TODO: Implement Seconds parameter. Challenge is to first develop the "continue from last activity" function. -function ESCORT:MenuHoldAtLeaderPosition( Height, Seconds, MenuTextFormat ) - self:F( { Height, Seconds, MenuTextFormat } ) - - if self.EscortGroup:IsAir() then - - if not self.EscortMenuHold then - self.EscortMenuHold = MENU_CLIENT:New( self.EscortClient, "Hold position", self.EscortMenu ) - end - - if not Height then - Height = 30 - end - - if not Seconds then - Seconds = 0 - end - - local MenuText = "" - if not MenuTextFormat then - if Seconds == 0 then - MenuText = string.format( "Rejoin and hold at %d meter", Height ) - else - MenuText = string.format( "Rejoin and hold at %d meter for %d seconds", Height, Seconds ) - end - else - if Seconds == 0 then - MenuText = string.format( MenuTextFormat, Height ) - else - MenuText = string.format( MenuTextFormat, Height, Seconds ) - end - end - - if not self.EscortMenuHoldAtLeaderPosition then - self.EscortMenuHoldAtLeaderPosition = {} - end - - self.EscortMenuHoldAtLeaderPosition[#self.EscortMenuHoldAtLeaderPosition+1] = MENU_CLIENT_COMMAND - :New( - self.EscortClient, - MenuText, - self.EscortMenuHold, - ESCORT._HoldPosition, - { ParamSelf = self, - ParamOrbitGroup = self.EscortClient, - ParamHeight = Height, - ParamSeconds = Seconds - } - ) - end - - return self -end - ---- Defines a menu slot to let the escort scan for targets at a certain height for a certain time in seconds. --- This menu will appear under **Scan targets**. --- @param #ESCORT self --- @param DCSTypes#Distance Height Optional parameter that sets the height in meters to let the escort orbit at the current location. The default value is 30 meters. --- @param DCSTypes#Time Seconds Optional parameter that lets the escort orbit at the current position for a specified time. (not implemented yet). The default value is 0 seconds, meaning, that the escort will orbit forever until a sequent command is given. --- @param #string MenuTextFormat Optional parameter that shows the menu option text. The text string is formatted, and should contain one or two %d tokens in the string. The first for the Height, the second for the Time (if given). If no text is given, the default text will be displayed. --- @return #ESCORT -function ESCORT:MenuScanForTargets( Height, Seconds, MenuTextFormat ) - self:F( { Height, Seconds, MenuTextFormat } ) - - if self.EscortGroup:IsAir() then - if not self.EscortMenuScan then - self.EscortMenuScan = MENU_CLIENT:New( self.EscortClient, "Scan for targets", self.EscortMenu ) - end - - if not Height then - Height = 100 - end - - if not Seconds then - Seconds = 30 - end - - local MenuText = "" - if not MenuTextFormat then - if Seconds == 0 then - MenuText = string.format( "At %d meter", Height ) - else - MenuText = string.format( "At %d meter for %d seconds", Height, Seconds ) - end - else - if Seconds == 0 then - MenuText = string.format( MenuTextFormat, Height ) - else - MenuText = string.format( MenuTextFormat, Height, Seconds ) - end - end - - if not self.EscortMenuScanForTargets then - self.EscortMenuScanForTargets = {} - end - - self.EscortMenuScanForTargets[#self.EscortMenuScanForTargets+1] = MENU_CLIENT_COMMAND - :New( - self.EscortClient, - MenuText, - self.EscortMenuScan, - ESCORT._ScanTargets, - { ParamSelf = self, - ParamScanDuration = 30 - } - ) - end - - return self -end - - - ---- Defines a menu slot to let the escort disperse a flare in a certain color. --- This menu will appear under **Navigation**. --- The flare will be fired from the first unit in the group. --- @param #ESCORT self --- @param #string MenuTextFormat Optional parameter that shows the menu option text. If no text is given, the default text will be displayed. --- @return #ESCORT -function ESCORT:MenuFlare( MenuTextFormat ) - self:F() - - if not self.EscortMenuReportNavigation then - self.EscortMenuReportNavigation = MENU_CLIENT:New( self.EscortClient, "Navigation", self.EscortMenu ) - end - - local MenuText = "" - if not MenuTextFormat then - MenuText = "Flare" - else - MenuText = MenuTextFormat - end - - if not self.EscortMenuFlare then - self.EscortMenuFlare = MENU_CLIENT:New( self.EscortClient, MenuText, self.EscortMenuReportNavigation, ESCORT._Flare, { ParamSelf = self } ) - self.EscortMenuFlareGreen = MENU_CLIENT_COMMAND:New( self.EscortClient, "Release green flare", self.EscortMenuFlare, ESCORT._Flare, { ParamSelf = self, ParamColor = UNIT.FlareColor.Green, ParamMessage = "Released a green flare!" } ) - self.EscortMenuFlareRed = MENU_CLIENT_COMMAND:New( self.EscortClient, "Release red flare", self.EscortMenuFlare, ESCORT._Flare, { ParamSelf = self, ParamColor = UNIT.FlareColor.Red, ParamMessage = "Released a red flare!" } ) - self.EscortMenuFlareWhite = MENU_CLIENT_COMMAND:New( self.EscortClient, "Release white flare", self.EscortMenuFlare, ESCORT._Flare, { ParamSelf = self, ParamColor = UNIT.FlareColor.White, ParamMessage = "Released a white flare!" } ) - self.EscortMenuFlareYellow = MENU_CLIENT_COMMAND:New( self.EscortClient, "Release yellow flare", self.EscortMenuFlare, ESCORT._Flare, { ParamSelf = self, ParamColor = UNIT.FlareColor.Yellow, ParamMessage = "Released a yellow flare!" } ) - end - - return self -end - ---- Defines a menu slot to let the escort disperse a smoke in a certain color. --- This menu will appear under **Navigation**. --- Note that smoke menu options will only be displayed for ships and ground units. Not for air units. --- The smoke will be fired from the first unit in the group. --- @param #ESCORT self --- @param #string MenuTextFormat Optional parameter that shows the menu option text. If no text is given, the default text will be displayed. --- @return #ESCORT -function ESCORT:MenuSmoke( MenuTextFormat ) - self:F() - - if not self.EscortGroup:IsAir() then - if not self.EscortMenuReportNavigation then - self.EscortMenuReportNavigation = MENU_CLIENT:New( self.EscortClient, "Navigation", self.EscortMenu ) - end - - local MenuText = "" - if not MenuTextFormat then - MenuText = "Smoke" - else - MenuText = MenuTextFormat - end - - if not self.EscortMenuSmoke then - self.EscortMenuSmoke = MENU_CLIENT:New( self.EscortClient, "Smoke", self.EscortMenuReportNavigation, ESCORT._Smoke, { ParamSelf = self } ) - self.EscortMenuSmokeGreen = MENU_CLIENT_COMMAND:New( self.EscortClient, "Release green smoke", self.EscortMenuSmoke, ESCORT._Smoke, { ParamSelf = self, ParamColor = UNIT.SmokeColor.Green, ParamMessage = "Releasing green smoke!" } ) - self.EscortMenuSmokeRed = MENU_CLIENT_COMMAND:New( self.EscortClient, "Release red smoke", self.EscortMenuSmoke, ESCORT._Smoke, { ParamSelf = self, ParamColor = UNIT.SmokeColor.Red, ParamMessage = "Releasing red smoke!" } ) - self.EscortMenuSmokeWhite = MENU_CLIENT_COMMAND:New( self.EscortClient, "Release white smoke", self.EscortMenuSmoke, ESCORT._Smoke, { ParamSelf = self, ParamColor = UNIT.SmokeColor.White, ParamMessage = "Releasing white smoke!" } ) - self.EscortMenuSmokeOrange = MENU_CLIENT_COMMAND:New( self.EscortClient, "Release orange smoke", self.EscortMenuSmoke, ESCORT._Smoke, { ParamSelf = self, ParamColor = UNIT.SmokeColor.Orange, ParamMessage = "Releasing orange smoke!" } ) - self.EscortMenuSmokeBlue = MENU_CLIENT_COMMAND:New( self.EscortClient, "Release blue smoke", self.EscortMenuSmoke, ESCORT._Smoke, { ParamSelf = self, ParamColor = UNIT.SmokeColor.Blue, ParamMessage = "Releasing blue smoke!" } ) - end - end - - return self -end - ---- Defines a menu slot to let the escort report their current detected targets with a specified time interval in seconds. --- This menu will appear under **Report targets**. --- Note that if a report targets menu is not specified, no targets will be detected by the escort, and the attack and assisted attack menus will not be displayed. --- @param #ESCORT self --- @param DCSTypes#Time Seconds Optional parameter that lets the escort report their current detected targets after specified time interval in seconds. The default time is 30 seconds. --- @return #ESCORT -function ESCORT:MenuReportTargets( Seconds ) - self:F( { Seconds } ) - - if not self.EscortMenuReportNearbyTargets then - self.EscortMenuReportNearbyTargets = MENU_CLIENT:New( self.EscortClient, "Report targets", self.EscortMenu ) - end - - if not Seconds then - Seconds = 30 - end - - -- Report Targets - self.EscortMenuReportNearbyTargetsNow = MENU_CLIENT_COMMAND:New( self.EscortClient, "Report targets now!", self.EscortMenuReportNearbyTargets, ESCORT._ReportNearbyTargetsNow, { ParamSelf = self } ) - self.EscortMenuReportNearbyTargetsOn = MENU_CLIENT_COMMAND:New( self.EscortClient, "Report targets on", self.EscortMenuReportNearbyTargets, ESCORT._SwitchReportNearbyTargets, { ParamSelf = self, ParamReportTargets = true } ) - self.EscortMenuReportNearbyTargetsOff = MENU_CLIENT_COMMAND:New( self.EscortClient, "Report targets off", self.EscortMenuReportNearbyTargets, ESCORT._SwitchReportNearbyTargets, { ParamSelf = self, ParamReportTargets = false, } ) - - -- Attack Targets - self.EscortMenuAttackNearbyTargets = MENU_CLIENT:New( self.EscortClient, "Attack targets", self.EscortMenu ) - - - --self.ReportTargetsScheduler = routines.scheduleFunction( self._ReportTargetsScheduler, { self }, timer.getTime() + 1, Seconds ) - self.ReportTargetsScheduler = SCHEDULER:New( self, self._ReportTargetsScheduler, {}, 1, Seconds ) - - return self -end - ---- Defines a menu slot to let the escort attack its detected targets using assisted attack from another escort joined also with the client. --- This menu will appear under **Request assistance from**. --- Note that this method needs to be preceded with the method MenuReportTargets. --- @param #ESCORT self --- @return #ESCORT -function ESCORT:MenuAssistedAttack() - self:F() - - -- Request assistance from other escorts. - -- This is very useful to let f.e. an escorting ship attack a target detected by an escorting plane... - self.EscortMenuTargetAssistance = MENU_CLIENT:New( self.EscortClient, "Request assistance from", self.EscortMenu ) - - return self -end - ---- Defines a menu to let the escort set its rules of engagement. --- All rules of engagement will appear under the menu **ROE**. --- @param #ESCORT self --- @return #ESCORT -function ESCORT:MenuROE( MenuTextFormat ) - self:F( MenuTextFormat ) - - if not self.EscortMenuROE then - -- Rules of Engagement - self.EscortMenuROE = MENU_CLIENT:New( self.EscortClient, "ROE", self.EscortMenu ) - if self.EscortGroup:OptionROEHoldFirePossible() then - self.EscortMenuROEHoldFire = MENU_CLIENT_COMMAND:New( self.EscortClient, "Hold Fire", self.EscortMenuROE, ESCORT._ROE, { ParamSelf = self, ParamFunction = self.EscortGroup:OptionROEHoldFire(), ParamMessage = "Holding weapons!" } ) - end - if self.EscortGroup:OptionROEReturnFirePossible() then - self.EscortMenuROEReturnFire = MENU_CLIENT_COMMAND:New( self.EscortClient, "Return Fire", self.EscortMenuROE, ESCORT._ROE, { ParamSelf = self, ParamFunction = self.EscortGroup:OptionROEReturnFire(), ParamMessage = "Returning fire!" } ) - end - if self.EscortGroup:OptionROEOpenFirePossible() then - self.EscortMenuROEOpenFire = MENU_CLIENT_COMMAND:New( self.EscortClient, "Open Fire", self.EscortMenuROE, ESCORT._ROE, { ParamSelf = self, ParamFunction = self.EscortGroup:OptionROEOpenFire(), ParamMessage = "Opening fire on designated targets!!" } ) - end - if self.EscortGroup:OptionROEWeaponFreePossible() then - self.EscortMenuROEWeaponFree = MENU_CLIENT_COMMAND:New( self.EscortClient, "Weapon Free", self.EscortMenuROE, ESCORT._ROE, { ParamSelf = self, ParamFunction = self.EscortGroup:OptionROEWeaponFree(), ParamMessage = "Opening fire on targets of opportunity!" } ) - end - end - - return self -end - - ---- Defines a menu to let the escort set its evasion when under threat. --- All rules of engagement will appear under the menu **Evasion**. --- @param #ESCORT self --- @return #ESCORT -function ESCORT:MenuEvasion( MenuTextFormat ) - self:F( MenuTextFormat ) - - if self.EscortGroup:IsAir() then - if not self.EscortMenuEvasion then - -- Reaction to Threats - self.EscortMenuEvasion = MENU_CLIENT:New( self.EscortClient, "Evasion", self.EscortMenu ) - if self.EscortGroup:OptionROTNoReactionPossible() then - self.EscortMenuEvasionNoReaction = MENU_CLIENT_COMMAND:New( self.EscortClient, "Fight until death", self.EscortMenuEvasion, ESCORT._ROT, { ParamSelf = self, ParamFunction = self.EscortGroup:OptionROTNoReaction(), ParamMessage = "Fighting until death!" } ) - end - if self.EscortGroup:OptionROTPassiveDefensePossible() then - self.EscortMenuEvasionPassiveDefense = MENU_CLIENT_COMMAND:New( self.EscortClient, "Use flares, chaff and jammers", self.EscortMenuEvasion, ESCORT._ROT, { ParamSelf = self, ParamFunction = self.EscortGroup:OptionROTPassiveDefense(), ParamMessage = "Defending using jammers, chaff and flares!" } ) - end - if self.EscortGroup:OptionROTEvadeFirePossible() then - self.EscortMenuEvasionEvadeFire = MENU_CLIENT_COMMAND:New( self.EscortClient, "Evade enemy fire", self.EscortMenuEvasion, ESCORT._ROT, { ParamSelf = self, ParamFunction = self.EscortGroup:OptionROTEvadeFire(), ParamMessage = "Evading on enemy fire!" } ) - end - if self.EscortGroup:OptionROTVerticalPossible() then - self.EscortMenuOptionEvasionVertical = MENU_CLIENT_COMMAND:New( self.EscortClient, "Go below radar and evade fire", self.EscortMenuEvasion, ESCORT._ROT, { ParamSelf = self, ParamFunction = self.EscortGroup:OptionROTVertical(), ParamMessage = "Evading on enemy fire with vertical manoeuvres!" } ) - end - end - end - - return self -end - ---- Defines a menu to let the escort resume its mission from a waypoint on its route. --- All rules of engagement will appear under the menu **Resume mission from**. --- @param #ESCORT self --- @return #ESCORT -function ESCORT:MenuResumeMission() - self:F() - - if not self.EscortMenuResumeMission then - -- Mission Resume Menu Root - self.EscortMenuResumeMission = MENU_CLIENT:New( self.EscortClient, "Resume mission from", self.EscortMenu ) - end - - return self -end - - ---- @param #MENUPARAM MenuParam -function ESCORT._HoldPosition( MenuParam ) - - local self = MenuParam.ParamSelf - local EscortGroup = self.EscortGroup - local EscortClient = self.EscortClient - - local OrbitGroup = MenuParam.ParamOrbitGroup -- Group#GROUP - local OrbitUnit = OrbitGroup:GetUnit(1) -- Unit#UNIT - local OrbitHeight = MenuParam.ParamHeight - local OrbitSeconds = MenuParam.ParamSeconds -- Not implemented yet - - routines.removeFunction( self.FollowScheduler ) - - local PointFrom = {} - local GroupPoint = EscortGroup:GetUnit(1):GetPointVec3() - PointFrom = {} - PointFrom.x = GroupPoint.x - PointFrom.y = GroupPoint.z - PointFrom.speed = 250 - PointFrom.type = AI.Task.WaypointType.TURNING_POINT - PointFrom.alt = GroupPoint.y - PointFrom.alt_type = AI.Task.AltitudeType.BARO - - local OrbitPoint = OrbitUnit:GetPointVec2() - local PointTo = {} - PointTo.x = OrbitPoint.x - PointTo.y = OrbitPoint.y - PointTo.speed = 250 - PointTo.type = AI.Task.WaypointType.TURNING_POINT - PointTo.alt = OrbitHeight - PointTo.alt_type = AI.Task.AltitudeType.BARO - PointTo.task = EscortGroup:TaskOrbitCircleAtVec2( OrbitPoint, OrbitHeight, 0 ) - - local Points = { PointFrom, PointTo } - - EscortGroup:OptionROEHoldFire() - EscortGroup:OptionROTPassiveDefense() - - EscortGroup:SetTask( EscortGroup:TaskRoute( Points ) ) - EscortGroup:MessageToClient( "Orbiting at location.", 10, EscortClient ) -end - ---- @param #MENUPARAM MenuParam -function ESCORT._JoinUpAndFollow( MenuParam ) - - local self = MenuParam.ParamSelf - local EscortGroup = self.EscortGroup - local EscortClient = self.EscortClient - - self.Distance = MenuParam.ParamDistance - - self:JoinUpAndFollow( EscortGroup, EscortClient, self.Distance ) -end - ---- JoinsUp and Follows a CLIENT. --- @param Escort#ESCORT self --- @param Group#GROUP EscortGroup --- @param Client#CLIENT EscortClient --- @param DCSTypes#Distance Distance -function ESCORT:JoinUpAndFollow( EscortGroup, EscortClient, Distance ) - self:F( { EscortGroup, EscortClient, Distance } ) - - if self.FollowScheduler then - routines.removeFunction( self.FollowScheduler ) - end - - EscortGroup:OptionROEHoldFire() - EscortGroup:OptionROTPassiveDefense() - - self.EscortMode = ESCORT.MODE.FOLLOW - - self.CT1 = 0 - self.GT1 = 0 - --self.FollowScheduler = routines.scheduleFunction( self._FollowScheduler, { self, Distance }, timer.getTime() + 1, .5 ) - self.FollowScheduler = SCHEDULER:New( self, self._FollowScheduler, { Distance }, 1, .5, .1 ) - EscortGroup:MessageToClient( "Rejoining and Following at " .. Distance .. "!", 30, EscortClient ) -end - ---- @param #MENUPARAM MenuParam -function ESCORT._Flare( MenuParam ) - - local self = MenuParam.ParamSelf - local EscortGroup = self.EscortGroup - local EscortClient = self.EscortClient - - local Color = MenuParam.ParamColor - local Message = MenuParam.ParamMessage - - EscortGroup:GetUnit(1):Flare( Color ) - EscortGroup:MessageToClient( Message, 10, EscortClient ) -end - ---- @param #MENUPARAM MenuParam -function ESCORT._Smoke( MenuParam ) - - local self = MenuParam.ParamSelf - local EscortGroup = self.EscortGroup - local EscortClient = self.EscortClient - - local Color = MenuParam.ParamColor - local Message = MenuParam.ParamMessage - - EscortGroup:GetUnit(1):Smoke( Color ) - EscortGroup:MessageToClient( Message, 10, EscortClient ) -end - - ---- @param #MENUPARAM MenuParam -function ESCORT._ReportNearbyTargetsNow( MenuParam ) - - local self = MenuParam.ParamSelf - local EscortGroup = self.EscortGroup - local EscortClient = self.EscortClient - - self:_ReportTargetsScheduler() - -end - -function ESCORT._SwitchReportNearbyTargets( MenuParam ) - - local self = MenuParam.ParamSelf - local EscortGroup = self.EscortGroup - local EscortClient = self.EscortClient - - self.ReportTargets = MenuParam.ParamReportTargets - - if self.ReportTargets then - if not self.ReportTargetsScheduler then - --self.ReportTargetsScheduler = routines.scheduleFunction( self._ReportTargetsScheduler, { self }, timer.getTime() + 1, 30 ) - self.ReportTargetsScheduler = SCHEDULER:New( self, self._ReportTargetsScheduler, {}, 1, 30 ) - end - else - routines.removeFunction( self.ReportTargetsScheduler ) - self.ReportTargetsScheduler = nil - end -end - ---- @param #MENUPARAM MenuParam -function ESCORT._ScanTargets( MenuParam ) - - local self = MenuParam.ParamSelf - local EscortGroup = self.EscortGroup - local EscortClient = self.EscortClient - - local ScanDuration = MenuParam.ParamScanDuration - - if self.FollowScheduler then - routines.removeFunction( self.FollowScheduler ) - end - - self:T( { "FollowScheduler after removefunction: ", self.FollowScheduler } ) - - if EscortGroup:IsHelicopter() then - SCHEDULER:New( EscortGroup, EscortGroup.PushTask, - { EscortGroup:TaskControlled( - EscortGroup:TaskOrbitCircle( 200, 20 ), - EscortGroup:TaskCondition( nil, nil, nil, nil, ScanDuration, nil ) - ) - }, - 1 - ) - elseif EscortGroup:IsAirPlane() then - SCHEDULER:New( EscortGroup, EscortGroup.PushTask, - { EscortGroup:TaskControlled( - EscortGroup:TaskOrbitCircle( 1000, 500 ), - EscortGroup:TaskCondition( nil, nil, nil, nil, ScanDuration, nil ) - ) - }, - 1 - ) - end - - EscortGroup:MessageToClient( "Scanning targets for " .. ScanDuration .. " seconds.", ScanDuration, EscortClient ) - - if self.EscortMode == ESCORT.MODE.FOLLOW then - --self.FollowScheduler = routines.scheduleFunction( self._FollowScheduler, { self, Distance }, timer.getTime() + ScanDuration, 1 ) - self.FollowScheduler:Start() - end - -end - -function _Resume( EscortGroup ) - env.info( '_Resume' ) - - local Escort = EscortGroup.Escort -- #ESCORT - env.info( "EscortMode = " .. Escort.EscortMode ) - if Escort.EscortMode == ESCORT.MODE.FOLLOW then - Escort:JoinUpAndFollow( EscortGroup, Escort.EscortClient, Escort.Distance ) - end - -end - ---- @param #MENUPARAM MenuParam -function ESCORT._AttackTarget( MenuParam ) - - local self = MenuParam.ParamSelf - local EscortGroup = self.EscortGroup - local EscortClient = self.EscortClient - local AttackUnit = MenuParam.ParamUnit -- Unit#UNIT - - if self.FollowScheduler then - routines.removeFunction( self.FollowScheduler ) - end - - self:T( AttackUnit ) - - if EscortGroup:IsAir() then - EscortGroup:OptionROEOpenFire() - EscortGroup:OptionROTPassiveDefense() - EscortGroup.Escort = self -- Need to do this trick to get the reference for the escort in the _Resume function. --- routines.scheduleFunction( --- EscortGroup.PushTask, --- { EscortGroup, --- EscortGroup:TaskCombo( --- { EscortGroup:TaskAttackUnit( AttackUnit ), --- EscortGroup:TaskFunction( 1, 2, "_Resume", {"''"} ) --- } --- ) --- }, timer.getTime() + 10 --- ) - SCHEDULER:New( EscortGroup, - EscortGroup.PushTask, - { EscortGroup:TaskCombo( - { EscortGroup:TaskAttackUnit( AttackUnit ), - EscortGroup:TaskFunction( 1, 2, "_Resume", {"''"} ) - } - ) - }, 10 - ) - else --- routines.scheduleFunction( --- EscortGroup.PushTask, --- { EscortGroup, --- EscortGroup:TaskCombo( --- { EscortGroup:TaskFireAtPoint( AttackUnit:GetPointVec2(), 50 ) --- } --- ) --- }, timer.getTime() + 10 --- ) - SCHEDULER:New( EscortGroup, - EscortGroup.PushTask, - { EscortGroup:TaskCombo( - { EscortGroup:TaskFireAtPoint( AttackUnit:GetPointVec2(), 50 ) - } - ) - }, 10 - ) - end - EscortGroup:MessageToClient( "Engaging Designated Unit!", 10, EscortClient ) - - -end - ---- @param #MENUPARAM MenuParam -function ESCORT._AssistTarget( MenuParam ) - - local self = MenuParam.ParamSelf - local EscortGroup = self.EscortGroup - local EscortClient = self.EscortClient - local EscortGroupAttack = MenuParam.ParamEscortGroup - local AttackUnit = MenuParam.ParamUnit -- Unit#UNIT - - if self.FollowScheduler then - routines.removeFunction( self.FollowScheduler ) - end - - - self:T( AttackUnit ) - - if EscortGroupAttack:IsAir() then - EscortGroupAttack:OptionROEOpenFire() - EscortGroupAttack:OptionROTVertical() --- routines.scheduleFunction( --- EscortGroupAttack.PushTask, --- { EscortGroupAttack, --- EscortGroupAttack:TaskCombo( --- { EscortGroupAttack:TaskAttackUnit( AttackUnit ), --- EscortGroupAttack:TaskOrbitCircle( 500, 350 ) --- } --- ) --- }, timer.getTime() + 10 --- ) - SCHDULER:New( EscortGroupAttack, - EscortGroupAttack.PushTask, - { EscortGroupAttack:TaskCombo( - { EscortGroupAttack:TaskAttackUnit( AttackUnit ), - EscortGroupAttack:TaskOrbitCircle( 500, 350 ) - } - ) - }, 10 - ) - else --- routines.scheduleFunction( --- EscortGroupAttack.PushTask, --- { EscortGroupAttack, --- EscortGroupAttack:TaskCombo( --- { EscortGroupAttack:TaskFireAtPoint( AttackUnit:GetPointVec2(), 50 ) --- } --- ) --- }, timer.getTime() + 10 --- ) - SCHEDULER:New( EscortGroupAttack, - EscortGroupAttack.PushTask, - { EscortGroupAttack:TaskCombo( - { EscortGroupAttack:TaskFireAtPoint( AttackUnit:GetPointVec2(), 50 ) - } - ) - }, 10 - ) - end - EscortGroupAttack:MessageToClient( "Assisting with the destroying the enemy unit!", 10, EscortClient ) - -end - ---- @param #MENUPARAM MenuParam -function ESCORT._ROE( MenuParam ) - - local self = MenuParam.ParamSelf - local EscortGroup = self.EscortGroup - local EscortClient = self.EscortClient - - local EscortROEFunction = MenuParam.ParamFunction - local EscortROEMessage = MenuParam.ParamMessage - - pcall( function() EscortROEFunction() end ) - EscortGroup:MessageToClient( EscortROEMessage, 10, EscortClient ) -end - ---- @param #MENUPARAM MenuParam -function ESCORT._ROT( MenuParam ) - - local self = MenuParam.ParamSelf - local EscortGroup = self.EscortGroup - local EscortClient = self.EscortClient - - local EscortROTFunction = MenuParam.ParamFunction - local EscortROTMessage = MenuParam.ParamMessage - - pcall( function() EscortROTFunction() end ) - EscortGroup:MessageToClient( EscortROTMessage, 10, EscortClient ) -end - ---- @param #MENUPARAM MenuParam -function ESCORT._ResumeMission( MenuParam ) - - local self = MenuParam.ParamSelf - local EscortGroup = self.EscortGroup - local EscortClient = self.EscortClient - - local WayPoint = MenuParam.ParamWayPoint - - routines.removeFunction( self.FollowScheduler ) - self.FollowScheduler = nil - - local WayPoints = EscortGroup:GetTaskRoute() - self:T( WayPoint, WayPoints ) - - for WayPointIgnore = 1, WayPoint do - table.remove( WayPoints, 1 ) - end - - --routines.scheduleFunction( EscortGroup.SetTask, {EscortGroup, EscortGroup:TaskRoute( WayPoints ) }, timer.getTime() + 1 ) - SCHEDULER:New( EscortGroup, EscortGroup.SetTask, { EscortGroup:TaskRoute( WayPoints ) }, 1 ) - - EscortGroup:MessageToClient( "Resuming mission from waypoint " .. WayPoint .. ".", 10, EscortClient ) -end - ---- Registers the waypoints --- @param #ESCORT self --- @return #table -function ESCORT:RegisterRoute() - self:F() - - local EscortGroup = self.EscortGroup -- Group#GROUP - - local TaskPoints = EscortGroup:GetTaskRoute() - - self:T( TaskPoints ) - - return TaskPoints -end - ---- @param Escort#ESCORT self -function ESCORT:_FollowScheduler( FollowDistance ) - self:F( { FollowDistance }) - - if self.EscortGroup:IsAlive() and self.EscortClient:IsAlive() then - - local ClientUnit = self.EscortClient:GetClientGroupUnit() - local GroupUnit = self.EscortGroup:GetUnit( 1 ) - - if self.CT1 == 0 and self.GT1 == 0 then - self.CV1 = ClientUnit:GetPointVec3() - self.CT1 = timer.getTime() - self.GV1 = GroupUnit:GetPointVec3() - self.GT1 = timer.getTime() - else - local CT1 = self.CT1 - local CT2 = timer.getTime() - local CV1 = self.CV1 - local CV2 = ClientUnit:GetPointVec3() - self.CT1 = CT2 - self.CV1 = CV2 - - local CD = ( ( CV2.x - CV1.x )^2 + ( CV2.y - CV1.y )^2 + ( CV2.z - CV1.z )^2 ) ^ 0.5 - local CT = CT2 - CT1 - - local CS = ( 3600 / CT ) * ( CD / 1000 ) - - self:T2( { "Client:", CS, CD, CT, CV2, CV1, CT2, CT1 } ) - - local GT1 = self.GT1 - local GT2 = timer.getTime() - local GV1 = self.GV1 - local GV2 = GroupUnit:GetPointVec3() - self.GT1 = GT2 - self.GV1 = GV2 - - local GD = ( ( GV2.x - GV1.x )^2 + ( GV2.y - GV1.y )^2 + ( GV2.z - GV1.z )^2 ) ^ 0.5 - local GT = GT2 - GT1 - - local GS = ( 3600 / GT ) * ( GD / 1000 ) - - self:T2( { "Group:", GS, GD, GT, GV2, GV1, GT2, GT1 } ) - - -- Calculate the group direction vector - local GV = { x = GV2.x - CV2.x, y = GV2.y - CV2.y, z = GV2.z - CV2.z } - - -- Calculate GH2, GH2 with the same height as CV2. - local GH2 = { x = GV2.x, y = CV2.y, z = GV2.z } - - -- Calculate the angle of GV to the orthonormal plane - local alpha = math.atan2( GV.z, GV.x ) - - -- Now we calculate the intersecting vector between the circle around CV2 with radius FollowDistance and GH2. - -- From the GeoGebra model: CVI = (x(CV2) + FollowDistance cos(alpha), y(GH2) + FollowDistance sin(alpha), z(CV2)) - local CVI = { x = CV2.x + FollowDistance * math.cos(alpha), - y = GH2.y, - z = CV2.z + FollowDistance * math.sin(alpha), - } - - -- Calculate the direction vector DV of the escort group. We use CVI as the base and CV2 as the direction. - local DV = { x = CV2.x - CVI.x, y = CV2.y - CVI.y, z = CV2.z - CVI.z } - - -- We now calculate the unary direction vector DVu, so that we can multiply DVu with the speed, which is expressed in meters / s. - -- We need to calculate this vector to predict the point the escort group needs to fly to according its speed. - -- The distance of the destination point should be far enough not to have the aircraft starting to swipe left to right... - local DVu = { x = DV.x / FollowDistance, y = DV.y / FollowDistance, z = DV.z / FollowDistance } - - -- Now we can calculate the group destination vector GDV. - local GDV = { x = DVu.x * CS * 8 + CVI.x, y = CVI.y, z = DVu.z * CS * 8 + CVI.z } - - --trigger.action.smoke( GDV, trigger.smokeColor.Red ) - self:T2( { "CV2:", CV2 } ) - self:T2( { "CVI:", CVI } ) - self:T2( { "GDV:", GDV } ) - - -- Measure distance between client and group - local CatchUpDistance = ( ( GDV.x - GV2.x )^2 + ( GDV.y - GV2.y )^2 + ( GDV.z - GV2.z )^2 ) ^ 0.5 - - -- The calculation of the Speed would simulate that the group would take 30 seconds to overcome - -- the requested Distance). - local Time = 10 - local CatchUpSpeed = ( CatchUpDistance - ( CS * 8.4 ) ) / Time - - local Speed = CS + CatchUpSpeed - if Speed < 0 then - Speed = 0 - end - - self:T( { "Client Speed, Escort Speed, Speed, FlyDistance, Time:", CS, GS, Speed, Distance, Time } ) - - -- Now route the escort to the desired point with the desired speed. - self.EscortGroup:TaskRouteToVec3( GDV, Speed / 3.6 ) -- DCS models speed in Mps (Miles per second) - end - return true - end - - return false -end - - ---- Report Targets Scheduler. --- @param #ESCORT self -function ESCORT:_ReportTargetsScheduler() - self:F( self.EscortGroup:GetName() ) - - if self.EscortGroup:IsAlive() and self.EscortClient:IsAlive() then - local EscortGroupName = self.EscortGroup:GetName() - local EscortTargets = self.EscortGroup:GetDetectedTargets() - - local ClientEscortTargets = self.EscortClient._EscortGroups[EscortGroupName].Targets - - local EscortTargetMessages = "" - for EscortTargetID, EscortTarget in pairs( EscortTargets ) do - local EscortObject = EscortTarget.object - self:T( EscortObject ) - if EscortObject and EscortObject:isExist() and EscortObject.id_ < 50000000 then - - local EscortTargetUnit = UNIT:Find( EscortObject ) - local EscortTargetUnitName = EscortTargetUnit:GetName() - - - - -- local EscortTargetIsDetected, - -- EscortTargetIsVisible, - -- EscortTargetLastTime, - -- EscortTargetKnowType, - -- EscortTargetKnowDistance, - -- EscortTargetLastPos, - -- EscortTargetLastVelocity - -- = self.EscortGroup:IsTargetDetected( EscortObject ) - -- - -- self:T( { EscortTargetIsDetected, - -- EscortTargetIsVisible, - -- EscortTargetLastTime, - -- EscortTargetKnowType, - -- EscortTargetKnowDistance, - -- EscortTargetLastPos, - -- EscortTargetLastVelocity } ) - - - local EscortTargetUnitPositionVec3 = EscortTargetUnit:GetPointVec3() - local EscortPositionVec3 = self.EscortGroup:GetPointVec3() - local Distance = ( ( EscortTargetUnitPositionVec3.x - EscortPositionVec3.x )^2 + - ( EscortTargetUnitPositionVec3.y - EscortPositionVec3.y )^2 + - ( EscortTargetUnitPositionVec3.z - EscortPositionVec3.z )^2 - ) ^ 0.5 / 1000 - - self:T( { self.EscortGroup:GetName(), EscortTargetUnit:GetName(), Distance, EscortTarget } ) - - if Distance <= 15 then - - if not ClientEscortTargets[EscortTargetUnitName] then - ClientEscortTargets[EscortTargetUnitName] = {} - end - ClientEscortTargets[EscortTargetUnitName].AttackUnit = EscortTargetUnit - ClientEscortTargets[EscortTargetUnitName].visible = EscortTarget.visible - ClientEscortTargets[EscortTargetUnitName].type = EscortTarget.type - ClientEscortTargets[EscortTargetUnitName].distance = EscortTarget.distance - else - if ClientEscortTargets[EscortTargetUnitName] then - ClientEscortTargets[EscortTargetUnitName] = nil - end - end - end - end - - self:T( { "Sorting Targets Table:", ClientEscortTargets } ) - table.sort( ClientEscortTargets, function( a, b ) return a.Distance < b.Distance end ) - self:T( { "Sorted Targets Table:", ClientEscortTargets } ) - - -- Remove the sub menus of the Attack menu of the Escort for the EscortGroup. - self.EscortMenuAttackNearbyTargets:RemoveSubMenus() - - if self.EscortMenuTargetAssistance then - self.EscortMenuTargetAssistance:RemoveSubMenus() - end - - --for MenuIndex = 1, #self.EscortMenuAttackTargets do - -- self:T( { "Remove Menu:", self.EscortMenuAttackTargets[MenuIndex] } ) - -- self.EscortMenuAttackTargets[MenuIndex] = self.EscortMenuAttackTargets[MenuIndex]:Remove() - --end - - - if ClientEscortTargets then - for ClientEscortTargetUnitName, ClientEscortTargetData in pairs( ClientEscortTargets ) do - - for ClientEscortGroupName, EscortGroupData in pairs( self.EscortClient._EscortGroups ) do - - if ClientEscortTargetData and ClientEscortTargetData.AttackUnit:IsAlive() then - - local EscortTargetMessage = "" - local EscortTargetCategoryName = ClientEscortTargetData.AttackUnit:GetCategoryName() - local EscortTargetCategoryType = ClientEscortTargetData.AttackUnit:GetTypeName() - if ClientEscortTargetData.type then - EscortTargetMessage = EscortTargetMessage .. EscortTargetCategoryName .. " (" .. EscortTargetCategoryType .. ") at " - else - EscortTargetMessage = EscortTargetMessage .. "Unknown target at " - end - - local EscortTargetUnitPositionVec3 = ClientEscortTargetData.AttackUnit:GetPointVec3() - local EscortPositionVec3 = self.EscortGroup:GetPointVec3() - local Distance = ( ( EscortTargetUnitPositionVec3.x - EscortPositionVec3.x )^2 + - ( EscortTargetUnitPositionVec3.y - EscortPositionVec3.y )^2 + - ( EscortTargetUnitPositionVec3.z - EscortPositionVec3.z )^2 - ) ^ 0.5 / 1000 - - self:T( { self.EscortGroup:GetName(), ClientEscortTargetData.AttackUnit:GetName(), Distance, ClientEscortTargetData.AttackUnit } ) - if ClientEscortTargetData.visible == false then - EscortTargetMessage = EscortTargetMessage .. string.format( "%.2f", Distance ) .. " estimated km" - else - EscortTargetMessage = EscortTargetMessage .. string.format( "%.2f", Distance ) .. " km" - end - - if ClientEscortTargetData.visible then - EscortTargetMessage = EscortTargetMessage .. ", visual" - end - - if ClientEscortGroupName == EscortGroupName then - - MENU_CLIENT_COMMAND:New( self.EscortClient, - EscortTargetMessage, - self.EscortMenuAttackNearbyTargets, - ESCORT._AttackTarget, - { ParamSelf = self, - ParamUnit = ClientEscortTargetData.AttackUnit - } - ) - EscortTargetMessages = EscortTargetMessages .. "\n - " .. EscortTargetMessage - else - if self.EscortMenuTargetAssistance then - local MenuTargetAssistance = MENU_CLIENT:New( self.EscortClient, EscortGroupData.EscortName, self.EscortMenuTargetAssistance ) - MENU_CLIENT_COMMAND:New( self.EscortClient, - EscortTargetMessage, - MenuTargetAssistance, - ESCORT._AssistTarget, - { ParamSelf = self, - ParamEscortGroup = EscortGroupData.EscortGroup, - ParamUnit = ClientEscortTargetData.AttackUnit - } - ) - end - end - else - ClientEscortTargetData = nil - end - end - end - - if EscortTargetMessages ~= "" and self.ReportTargets == true then - self.EscortGroup:MessageToClient( "Detected targets within 15 km range:" .. EscortTargetMessages:gsub("\n$",""), 20, self.EscortClient ) - else - self.EscortGroup:MessageToClient( "No targets detected!", 20, self.EscortClient ) - end - end - - if self.EscortMenuResumeMission then - self.EscortMenuResumeMission:RemoveSubMenus() - - -- if self.EscortMenuResumeWayPoints then - -- for MenuIndex = 1, #self.EscortMenuResumeWayPoints do - -- self:T( { "Remove Menu:", self.EscortMenuResumeWayPoints[MenuIndex] } ) - -- self.EscortMenuResumeWayPoints[MenuIndex] = self.EscortMenuResumeWayPoints[MenuIndex]:Remove() - -- end - -- end - - local TaskPoints = self:RegisterRoute() - for WayPointID, WayPoint in pairs( TaskPoints ) do - local EscortPositionVec3 = self.EscortGroup:GetPointVec3() - local Distance = ( ( WayPoint.x - EscortPositionVec3.x )^2 + - ( WayPoint.y - EscortPositionVec3.z )^2 - ) ^ 0.5 / 1000 - MENU_CLIENT_COMMAND:New( self.EscortClient, "Waypoint " .. WayPointID .. " at " .. string.format( "%.2f", Distance ).. "km", self.EscortMenuResumeMission, ESCORT._ResumeMission, { ParamSelf = self, ParamWayPoint = WayPointID } ) - end - end - return true - end - - return false -end ---- Provides missile training functions. --- --- @{#MISSILETRAINER} class --- ======================== --- The @{#MISSILETRAINER} class uses the DCS world messaging system to be alerted of any missiles fired, and when a missile would hit your aircraft, --- the class will destroy the missile within a certain range, to avoid damage to your aircraft. --- It suports the following functionality: --- --- * Track the missiles fired at you and other players, providing bearing and range information of the missiles towards the airplanes. --- * Provide alerts of missile launches, including detailed information of the units launching, including bearing, range … --- * Provide alerts when a missile would have killed your aircraft. --- * Provide alerts when the missile self destructs. --- * Enable / Disable and Configure the Missile Trainer using the various menu options. --- --- When running a mission where MISSILETRAINER is used, the following radio menu structure ( 'Radio Menu' -> 'Other (F10)' -> 'MissileTrainer' ) options are available for the players: --- --- * **Messages**: Menu to configure all messages. --- * **Messages On**: Show all messages. --- * **Messages Off**: Disable all messages. --- * **Tracking**: Menu to configure missile tracking messages. --- * **To All**: Shows missile tracking messages to all players. --- * **To Target**: Shows missile tracking messages only to the player where the missile is targetted at. --- * **Tracking On**: Show missile tracking messages. --- * **Tracking Off**: Disable missile tracking messages. --- * **Frequency Increase**: Increases the missile tracking message frequency with one second. --- * **Frequency Decrease**: Decreases the missile tracking message frequency with one second. --- * **Alerts**: Menu to configure alert messages. --- * **To All**: Shows alert messages to all players. --- * **To Target**: Shows alert messages only to the player where the missile is (was) targetted at. --- * **Hits On**: Show missile hit alert messages. --- * **Hits Off**: Disable missile hit alert messages. --- * **Launches On**: Show missile launch messages. --- * **Launches Off**: Disable missile launch messages. --- * **Details**: Menu to configure message details. --- * **Range On**: Shows range information when a missile is fired to a target. --- * **Range Off**: Disable range information when a missile is fired to a target. --- * **Bearing On**: Shows bearing information when a missile is fired to a target. --- * **Bearing Off**: Disable bearing information when a missile is fired to a target. --- * **Distance**: Menu to configure the distance when a missile needs to be destroyed when near to a player, during tracking. This will improve/influence hit calculation accuracy, but has the risk of damaging the aircraft when the missile reaches the aircraft before the distance is measured. --- * **50 meter**: Destroys the missile when the distance to the aircraft is below or equal to 50 meter. --- * **100 meter**: Destroys the missile when the distance to the aircraft is below or equal to 100 meter. --- * **150 meter**: Destroys the missile when the distance to the aircraft is below or equal to 150 meter. --- * **200 meter**: Destroys the missile when the distance to the aircraft is below or equal to 200 meter. --- --- --- MISSILETRAINER construction methods: --- ==================================== --- Create a new MISSILETRAINER object with the @{#MISSILETRAINER.New} method: --- --- * @{#MISSILETRAINER.New}: Creates a new MISSILETRAINER object taking the maximum distance to your aircraft to evaluate when a missile needs to be destroyed. --- --- MISSILETRAINER will collect each unit declared in the mission with a skill level "Client" and "Player", and will monitor the missiles shot at those. --- --- MISSILETRAINER initialization methods: --- ====================================== --- A MISSILETRAINER object will behave differently based on the usage of initialization methods: --- --- * @{#MISSILETRAINER.InitMessagesOnOff}: Sets by default the display of any message to be ON or OFF. --- * @{#MISSILETRAINER.InitTrackingToAll}: Sets by default the missile tracking report for all players or only for those missiles targetted to you. --- * @{#MISSILETRAINER.InitTrackingOnOff}: Sets by default the display of missile tracking report to be ON or OFF. --- * @{#MISSILETRAINER.InitTrackingFrequency}: Increases, decreases the missile tracking message display frequency with the provided time interval in seconds. --- * @{#MISSILETRAINER.InitAlertsToAll}: Sets by default the display of alerts to be shown to all players or only to you. --- * @{#MISSILETRAINER.InitAlertsHitsOnOff}: Sets by default the display of hit alerts ON or OFF. --- * @{#MISSILETRAINER.InitAlertsLaunchesOnOff}: Sets by default the display of launch alerts ON or OFF. --- * @{#MISSILETRAINER.InitRangeOnOff}: Sets by default the display of range information of missiles ON of OFF. --- * @{#MISSILETRAINER.InitBearingOnOff}: Sets by default the display of bearing information of missiles ON of OFF. --- * @{#MISSILETRAINER.InitMenusOnOff}: Allows to configure the options through the radio menu. --- --- @module MissileTrainer --- @author FlightControl - - -Include.File( "Client" ) -Include.File( "Scheduler" ) - ---- The MISSILETRAINER class --- @type MISSILETRAINER --- @extends Base#BASE -MISSILETRAINER = { - ClassName = "MISSILETRAINER", -} - ---- Creates the main object which is handling missile tracking. --- When a missile is fired a SCHEDULER is set off that follows the missile. When near a certain a client player, the missile will be destroyed. --- @param #MISSILETRAINER self --- @param #number Distance The distance in meters when a tracked missile needs to be destroyed when close to a player. --- @param #string Briefing (Optional) Will show a text to the players when starting their mission. Can be used for briefing purposes. --- @return #MISSILETRAINER -function MISSILETRAINER:New( Distance, Briefing ) - local self = BASE:Inherit( self, BASE:New() ) - self:F( Distance ) - - if Briefing then - self.Briefing = Briefing - end - - self.Schedulers = {} - self.SchedulerID = 0 - - self.MessageInterval = 2 - self.MessageLastTime = timer.getTime() - - self.Distance = Distance / 1000 - - _EVENTDISPATCHER:OnShot( self._EventShot, self ) - - self.DB = DATABASE:New():FilterStart() - self.DBClients = self.DB.Clients - self.DBUnits = self.DB.Units - - for ClientID, Client in pairs( self.DBClients ) do - - local function _Alive( Client ) - - if self.Briefing then - Client:Message( self.Briefing, 15, "HELLO WORLD", "Trainer" ) - end - - if self.MenusOnOff == true then - Client:Message( "Use the 'Radio Menu' -> 'Other (F10)' -> 'Missile Trainer' menu options to change the Missile Trainer settings (for all players).", 15, "MENU", "Trainer" ) - - Client.MainMenu = MENU_CLIENT:New( Client, "Missile Trainer", nil ) -- Menu#MENU_CLIENT - - Client.MenuMessages = MENU_CLIENT:New( Client, "Messages", Client.MainMenu ) - Client.MenuOn = MENU_CLIENT_COMMAND:New( Client, "Messages On", Client.MenuMessages, self._MenuMessages, { MenuSelf = self, MessagesOnOff = true } ) - Client.MenuOff = MENU_CLIENT_COMMAND:New( Client, "Messages Off", Client.MenuMessages, self._MenuMessages, { MenuSelf = self, MessagesOnOff = false } ) - - Client.MenuTracking = MENU_CLIENT:New( Client, "Tracking", Client.MainMenu ) - Client.MenuTrackingToAll = MENU_CLIENT_COMMAND:New( Client, "To All", Client.MenuTracking, self._MenuMessages, { MenuSelf = self, TrackingToAll = true } ) - Client.MenuTrackingToTarget = MENU_CLIENT_COMMAND:New( Client, "To Target", Client.MenuTracking, self._MenuMessages, { MenuSelf = self, TrackingToAll = false } ) - Client.MenuTrackOn = MENU_CLIENT_COMMAND:New( Client, "Tracking On", Client.MenuTracking, self._MenuMessages, { MenuSelf = self, TrackingOnOff = true } ) - Client.MenuTrackOff = MENU_CLIENT_COMMAND:New( Client, "Tracking Off", Client.MenuTracking, self._MenuMessages, { MenuSelf = self, TrackingOnOff = false } ) - Client.MenuTrackIncrease = MENU_CLIENT_COMMAND:New( Client, "Frequency Increase", Client.MenuTracking, self._MenuMessages, { MenuSelf = self, TrackingFrequency = -1 } ) - Client.MenuTrackDecrease = MENU_CLIENT_COMMAND:New( Client, "Frequency Decrease", Client.MenuTracking, self._MenuMessages, { MenuSelf = self, TrackingFrequency = 1 } ) - - Client.MenuAlerts = MENU_CLIENT:New( Client, "Alerts", Client.MainMenu ) - Client.MenuAlertsToAll = MENU_CLIENT_COMMAND:New( Client, "To All", Client.MenuAlerts, self._MenuMessages, { MenuSelf = self, AlertsToAll = true } ) - Client.MenuAlertsToTarget = MENU_CLIENT_COMMAND:New( Client, "To Target", Client.MenuAlerts, self._MenuMessages, { MenuSelf = self, AlertsToAll = false } ) - Client.MenuHitsOn = MENU_CLIENT_COMMAND:New( Client, "Hits On", Client.MenuAlerts, self._MenuMessages, { MenuSelf = self, AlertsHitsOnOff = true } ) - Client.MenuHitsOff = MENU_CLIENT_COMMAND:New( Client, "Hits Off", Client.MenuAlerts, self._MenuMessages, { MenuSelf = self, AlertsHitsOnOff = false } ) - Client.MenuLaunchesOn = MENU_CLIENT_COMMAND:New( Client, "Launches On", Client.MenuAlerts, self._MenuMessages, { MenuSelf = self, AlertsLaunchesOnOff = true } ) - Client.MenuLaunchesOff = MENU_CLIENT_COMMAND:New( Client, "Launches Off", Client.MenuAlerts, self._MenuMessages, { MenuSelf = self, AlertsLaunchesOnOff = false } ) - - Client.MenuDetails = MENU_CLIENT:New( Client, "Details", Client.MainMenu ) - Client.MenuDetailsDistanceOn = MENU_CLIENT_COMMAND:New( Client, "Range On", Client.MenuDetails, self._MenuMessages, { MenuSelf = self, DetailsRangeOnOff = true } ) - Client.MenuDetailsDistanceOff = MENU_CLIENT_COMMAND:New( Client, "Range Off", Client.MenuDetails, self._MenuMessages, { MenuSelf = self, DetailsRangeOnOff = false } ) - Client.MenuDetailsBearingOn = MENU_CLIENT_COMMAND:New( Client, "Bearing On", Client.MenuDetails, self._MenuMessages, { MenuSelf = self, DetailsBearingOnOff = true } ) - Client.MenuDetailsBearingOff = MENU_CLIENT_COMMAND:New( Client, "Bearing Off", Client.MenuDetails, self._MenuMessages, { MenuSelf = self, DetailsBearingOnOff = false } ) - - Client.MenuDistance = MENU_CLIENT:New( Client, "Set distance to plane", Client.MainMenu ) - Client.MenuDistance50 = MENU_CLIENT_COMMAND:New( Client, "50 meter", Client.MenuDistance, self._MenuMessages, { MenuSelf = self, Distance = 50 / 1000 } ) - Client.MenuDistance100 = MENU_CLIENT_COMMAND:New( Client, "100 meter", Client.MenuDistance, self._MenuMessages, { MenuSelf = self, Distance = 100 / 1000 } ) - Client.MenuDistance150 = MENU_CLIENT_COMMAND:New( Client, "150 meter", Client.MenuDistance, self._MenuMessages, { MenuSelf = self, Distance = 150 / 1000 } ) - Client.MenuDistance200 = MENU_CLIENT_COMMAND:New( Client, "200 meter", Client.MenuDistance, self._MenuMessages, { MenuSelf = self, Distance = 200 / 1000 } ) - else - if Client.MainMenu then - Client.MainMenu:Remove() - end - end - - - local ClientID = Client:GetID() - self:T( ClientID ) - if not self.TrackingMissiles[ClientID] then - self.TrackingMissiles[ClientID] = {} - end - self.TrackingMissiles[ClientID].Client = Client - if not self.TrackingMissiles[ClientID].MissileData then - self.TrackingMissiles[ClientID].MissileData = {} - end - end - - Client:Alive( _Alive ) - - end - --- self.DB:ForEachClient( --- --- @param Client#CLIENT Client --- function( Client ) --- --- ... actions ... --- --- end --- ) - - self.MessagesOnOff = true - - self.TrackingToAll = false - self.TrackingOnOff = true - self.TrackingFrequency = 3 - - self.AlertsToAll = true - self.AlertsHitsOnOff = true - self.AlertsLaunchesOnOff = true - - self.DetailsRangeOnOff = true - self.DetailsBearingOnOff = true - - self.MenusOnOff = true - - self.TrackingMissiles = {} - - self.TrackingScheduler = SCHEDULER:New( self, self._TrackMissiles, {}, 0.5, 0.05, 0 ) - - return self -end - --- Initialization methods. - - ---- Sets by default the display of any message to be ON or OFF. --- @param #MISSILETRAINER self --- @param #boolean MessagesOnOff true or false --- @return #MISSILETRAINER self -function MISSILETRAINER:InitMessagesOnOff( MessagesOnOff ) - self:F( MessagesOnOff ) - - self.MessagesOnOff = MessagesOnOff - if self.MessagesOnOff == true then - MESSAGE:New( "Messages ON", "Menu", 15, "ID" ):ToAll() - else - MESSAGE:New( "Messages OFF", "Menu", 15, "ID" ):ToAll() - end - - return self -end - ---- Sets by default the missile tracking report for all players or only for those missiles targetted to you. --- @param #MISSILETRAINER self --- @param #boolean TrackingToAll true or false --- @return #MISSILETRAINER self -function MISSILETRAINER:InitTrackingToAll( TrackingToAll ) - self:F( TrackingToAll ) - - self.TrackingToAll = TrackingToAll - if self.TrackingToAll == true then - MESSAGE:New( "Missile tracking to all players ON", "Menu", 15, "ID" ):ToAll() - else - MESSAGE:New( "Missile tracking to all players OFF", "Menu", 15, "ID" ):ToAll() - end - - return self -end - ---- Sets by default the display of missile tracking report to be ON or OFF. --- @param #MISSILETRAINER self --- @param #boolean TrackingOnOff true or false --- @return #MISSILETRAINER self -function MISSILETRAINER:InitTrackingOnOff( TrackingOnOff ) - self:F( TrackingOnOff ) - - self.TrackingOnOff = TrackingOnOff - if self.TrackingOnOff == true then - MESSAGE:New( "Missile tracking ON", "Menu", 15, "ID" ):ToAll() - else - MESSAGE:New( "Missile tracking OFF", "Menu", 15, "ID" ):ToAll() - end - - return self -end - ---- Increases, decreases the missile tracking message display frequency with the provided time interval in seconds. --- The default frequency is a 3 second interval, so the Tracking Frequency parameter specifies the increase or decrease from the default 3 seconds or the last frequency update. --- @param #MISSILETRAINER self --- @param #number TrackingFrequency Provide a negative or positive value in seconds to incraese or decrease the display frequency. --- @return #MISSILETRAINER self -function MISSILETRAINER:InitTrackingFrequency( TrackingFrequency ) - self:F( TrackingFrequency ) - - self.TrackingFrequency = self.TrackingFrequency + TrackingFrequency - if self.TrackingFrequency < 0.5 then - self.TrackingFrequency = 0.5 - end - if self.TrackingFrequency then - MESSAGE:New( "Missile tracking frequency is " .. self.TrackingFrequency .. " seconds.", "Menu", 15, "ID" ):ToAll() - end - - return self -end - ---- Sets by default the display of alerts to be shown to all players or only to you. --- @param #MISSILETRAINER self --- @param #boolean AlertsToAll true or false --- @return #MISSILETRAINER self -function MISSILETRAINER:InitAlertsToAll( AlertsToAll ) - self:F( AlertsToAll ) - - self.AlertsToAll = AlertsToAll - if self.AlertsToAll == true then - MESSAGE:New( "Alerts to all players ON", "Menu", 15, "ID" ):ToAll() - else - MESSAGE:New( "Alerts to all players OFF", "Menu", 15, "ID" ):ToAll() - end - - return self -end - ---- Sets by default the display of hit alerts ON or OFF. --- @param #MISSILETRAINER self --- @param #boolean AlertsHitsOnOff true or false --- @return #MISSILETRAINER self -function MISSILETRAINER:InitAlertsHitsOnOff( AlertsHitsOnOff ) - self:F( AlertsHitsOnOff ) - - self.AlertsHitsOnOff = AlertsHitsOnOff - if self.AlertsHitsOnOff == true then - MESSAGE:New( "Alerts Hits ON", "Menu", 15, "ID" ):ToAll() - else - MESSAGE:New( "Alerts Hits OFF", "Menu", 15, "ID" ):ToAll() - end - - return self -end - ---- Sets by default the display of launch alerts ON or OFF. --- @param #MISSILETRAINER self --- @param #boolean AlertsLaunchesOnOff true or false --- @return #MISSILETRAINER self -function MISSILETRAINER:InitAlertsLaunchesOnOff( AlertsLaunchesOnOff ) - self:F( AlertsLaunchesOnOff ) - - self.AlertsLaunchesOnOff = AlertsLaunchesOnOff - if self.AlertsLaunchesOnOff == true then - MESSAGE:New( "Alerts Launches ON", "Menu", 15, "ID" ):ToAll() - else - MESSAGE:New( "Alerts Launches OFF", "Menu", 15, "ID" ):ToAll() - end - - return self -end - ---- Sets by default the display of range information of missiles ON of OFF. --- @param #MISSILETRAINER self --- @param #boolean DetailsRangeOnOff true or false --- @return #MISSILETRAINER self -function MISSILETRAINER:InitRangeOnOff( DetailsRangeOnOff ) - self:F( DetailsRangeOnOff ) - - self.DetailsRangeOnOff = DetailsRangeOnOff - if self.DetailsRangeOnOff == true then - MESSAGE:New( "Range display ON", "Menu", 15, "ID" ):ToAll() - else - MESSAGE:New( "Range display OFF", "Menu", 15, "ID" ):ToAll() - end - - return self -end - ---- Sets by default the display of bearing information of missiles ON of OFF. --- @param #MISSILETRAINER self --- @param #boolean DetailsBearingOnOff true or false --- @return #MISSILETRAINER self -function MISSILETRAINER:InitBearingOnOff( DetailsBearingOnOff ) - self:F( DetailsBearingOnOff ) - - self.DetailsBearingOnOff = DetailsBearingOnOff - if self.DetailsBearingOnOff == true then - MESSAGE:New( "Bearing display OFF", "Menu", 15, "ID" ):ToAll() - else - MESSAGE:New( "Bearing display OFF", "Menu", 15, "ID" ):ToAll() - end - - return self -end - ---- Enables / Disables the menus. --- @param #MISSILETRAINER self --- @param #boolean MenusOnOff true or false --- @return #MISSILETRAINER self -function MISSILETRAINER:InitMenusOnOff( MenusOnOff ) - self:F( MenusOnOff ) - - self.MenusOnOff = MenusOnOff - if self.MenusOnOff == true then - MESSAGE:New( "Menus are ENABLED (only when a player rejoins a slot)", "Menu", 15, "ID" ):ToAll() - else - MESSAGE:New( "Menus are DISABLED", "Menu", 15, "ID" ):ToAll() - end - - return self -end - - --- Menu functions - -function MISSILETRAINER._MenuMessages( MenuParameters ) - - local self = MenuParameters.MenuSelf - - if MenuParameters.MessagesOnOff ~= nil then - self:InitMessagesOnOff( MenuParameters.MessagesOnOff ) - end - - if MenuParameters.TrackingToAll ~= nil then - self:InitTrackingToAll( MenuParameters.TrackingToAll ) - end - - if MenuParameters.TrackingOnOff ~= nil then - self:InitTrackingOnOff( MenuParameters.TrackingOnOff ) - end - - if MenuParameters.TrackingFrequency ~= nil then - self:InitTrackingFrequency( MenuParameters.TrackingFrequency ) - end - - if MenuParameters.AlertsToAll ~= nil then - self:InitAlertsToAll( MenuParameters.AlertsToAll ) - end - - if MenuParameters.AlertsHitsOnOff ~= nil then - self:InitAlertsHitsOnOff( MenuParameters.AlertsHitsOnOff ) - end - - if MenuParameters.AlertsLaunchesOnOff ~= nil then - self:InitAlertsLaunchesOnOff( MenuParameters.AlertsLaunchesOnOff ) - end - - if MenuParameters.DetailsRangeOnOff ~= nil then - self:InitRangeOnOff( MenuParameters.DetailsRangeOnOff ) - end - - if MenuParameters.DetailsBearingOnOff ~= nil then - self:InitBearingOnOff( MenuParameters.DetailsBearingOnOff ) - end - - if MenuParameters.Distance ~= nil then - self.Distance = MenuParameters.Distance - MESSAGE:New( "Hit detection distance set to " .. self.Distance .. " meters", "Menu", 15, "ID" ):ToAll() - end - -end - ---- Detects if an SA site was shot with an anti radiation missile. In this case, take evasive actions based on the skill level set within the ME. --- @param #MISSILETRAINER self --- @param Event#EVENTDATA Event -function MISSILETRAINER:_EventShot( Event ) - self:F( { Event } ) - - local TrainerSourceDCSUnit = Event.IniDCSUnit - local TrainerSourceDCSUnitName = Event.IniDCSUnitName - local TrainerWeapon = Event.Weapon -- Identify the weapon fired - local TrainerWeaponName = Event.WeaponName -- return weapon type - - self:T( "Missile Launched = " .. TrainerWeaponName ) - - local TrainerTargetDCSUnit = TrainerWeapon:getTarget() -- Identify target - local TrainerTargetDCSUnitName = Unit.getName( TrainerTargetDCSUnit ) - local TrainerTargetSkill = _DATABASE.Templates.Units[TrainerTargetDCSUnitName].Template.skill - - self:T(TrainerTargetDCSUnitName ) - - local Client = self.DBClients[TrainerTargetDCSUnitName] - if Client then - - local TrainerSourceUnit = UNIT:Find( TrainerSourceDCSUnit ) - local TrainerTargetUnit = UNIT:Find( TrainerTargetDCSUnit ) - - if self.MessagesOnOff == true and self.AlertsLaunchesOnOff == true then - - local Message = MESSAGE:New( - string.format( "%s launched a %s", - TrainerSourceUnit:GetTypeName(), - TrainerWeaponName - ) .. self:_AddRange( Client, TrainerWeapon ) .. self:_AddBearing( Client, TrainerWeapon ),"Launch Alert", 5, "ID" ) - - if self.AlertsToAll then - Message:ToAll() - else - Message:ToClient( Client ) - end - end - - local ClientID = Client:GetID() - local MissileData = {} - MissileData.TrainerSourceUnit = TrainerSourceUnit - MissileData.TrainerWeapon = TrainerWeapon - MissileData.TrainerTargetUnit = TrainerTargetUnit - MissileData.TrainerWeaponTypeName = TrainerWeapon:getTypeName() - MissileData.TrainerWeaponLaunched = true - table.insert( self.TrackingMissiles[ClientID].MissileData, MissileData ) - --self:T( self.TrackingMissiles ) - end -end - -function MISSILETRAINER:_AddRange( Client, TrainerWeapon ) - - local RangeText = "" - - if self.DetailsRangeOnOff then - - local PositionMissile = TrainerWeapon:getPoint() - local PositionTarget = Client:GetPointVec3() - - local Range = ( ( PositionMissile.x - PositionTarget.x )^2 + - ( PositionMissile.y - PositionTarget.y )^2 + - ( PositionMissile.z - PositionTarget.z )^2 - ) ^ 0.5 / 1000 - - RangeText = string.format( ", at %4.2fkm", Range ) - end - - return RangeText -end - -function MISSILETRAINER:_AddBearing( Client, TrainerWeapon ) - - local BearingText = "" - - if self.DetailsBearingOnOff then - - local PositionMissile = TrainerWeapon:getPoint() - local PositionTarget = Client:GetPointVec3() - - self:T2( { PositionTarget, PositionMissile }) - - local DirectionVector = { x = PositionMissile.x - PositionTarget.x, y = PositionMissile.y - PositionTarget.y, z = PositionMissile.z - PositionTarget.z } - local DirectionRadians = math.atan2( DirectionVector.z, DirectionVector.x ) - --DirectionRadians = DirectionRadians + routines.getNorthCorrection( PositionTarget ) - if DirectionRadians < 0 then - DirectionRadians = DirectionRadians + 2 * math.pi - end - local DirectionDegrees = DirectionRadians * 180 / math.pi - - BearingText = string.format( ", %d degrees", DirectionDegrees ) - end - - return BearingText -end - - -function MISSILETRAINER:_TrackMissiles() - self:F2() - - - local ShowMessages = false - if self.MessagesOnOff and self.MessageLastTime + self.TrackingFrequency <= timer.getTime() then - self.MessageLastTime = timer.getTime() - ShowMessages = true - end - - -- ALERTS PART - - -- Loop for all Player Clients to check the alerts and deletion of missiles. - for ClientDataID, ClientData in pairs( self.TrackingMissiles ) do - - local Client = ClientData.Client - self:T2( { Client:GetName() } ) - - for MissileDataID, MissileData in pairs( ClientData.MissileData ) do - self:T3( MissileDataID ) - - local TrainerSourceUnit = MissileData.TrainerSourceUnit - local TrainerWeapon = MissileData.TrainerWeapon - local TrainerTargetUnit = MissileData.TrainerTargetUnit - local TrainerWeaponTypeName = MissileData.TrainerWeaponTypeName - local TrainerWeaponLaunched = MissileData.TrainerWeaponLaunched - - if Client and Client:IsAlive() and TrainerSourceUnit and TrainerSourceUnit:IsAlive() and TrainerWeapon and TrainerWeapon:isExist() and TrainerTargetUnit and TrainerTargetUnit:IsAlive() then - local PositionMissile = TrainerWeapon:getPosition().p - local PositionTarget = Client:GetPointVec3() - - local Distance = ( ( PositionMissile.x - PositionTarget.x )^2 + - ( PositionMissile.y - PositionTarget.y )^2 + - ( PositionMissile.z - PositionTarget.z )^2 - ) ^ 0.5 / 1000 - - if Distance <= self.Distance then - -- Hit alert - TrainerWeapon:destroy() - if self.MessagesOnOff == true and self.AlertsHitsOnOff == true then - - self:T( "killed" ) - - local Message = MESSAGE:New( - string.format( "%s launched by %s killed %s", - TrainerWeapon:getTypeName(), - TrainerSourceUnit:GetTypeName(), - TrainerTargetUnit:GetPlayerName() - ),"Hit Alert", 15, "ID" ) - - if self.AlertsToAll == true then - Message:ToAll() - else - Message:ToClient( Client ) - end - - MissileData = nil - table.remove( ClientData.MissileData, MissileDataID ) - self:T(ClientData.MissileData) - end - end - else - if not ( TrainerWeapon and TrainerWeapon:isExist() ) then - if self.MessagesOnOff == true and self.AlertsLaunchesOnOff == true then - -- Weapon does not exist anymore. Delete from Table - local Message = MESSAGE:New( - string.format( "%s launched by %s self destructed!", - TrainerWeaponTypeName, - TrainerSourceUnit:GetTypeName() - ),"Tracking", 5, "ID" ) - - if self.AlertsToAll == true then - Message:ToAll() - else - Message:ToClient( Client ) - end - end - MissileData = nil - table.remove( ClientData.MissileData, MissileDataID ) - self:T( ClientData.MissileData ) - end - end - end - end - - if ShowMessages == true and self.MessagesOnOff == true and self.TrackingOnOff == true then -- Only do this when tracking information needs to be displayed. - - -- TRACKING PART - - -- For the current client, the missile range and bearing details are displayed To the Player Client. - -- For the other clients, the missile range and bearing details are displayed To the other Player Clients. - -- To achieve this, a cross loop is done for each Player Client <-> Other Player Client missile information. - - -- Main Player Client loop - for ClientDataID, ClientData in pairs( self.TrackingMissiles ) do - - local Client = ClientData.Client - self:T2( { Client:GetName() } ) - - - ClientData.MessageToClient = "" - ClientData.MessageToAll = "" - - -- Other Players Client loop - for TrackingDataID, TrackingData in pairs( self.TrackingMissiles ) do - - for MissileDataID, MissileData in pairs( TrackingData.MissileData ) do - self:T3( MissileDataID ) - - local TrainerSourceUnit = MissileData.TrainerSourceUnit - local TrainerWeapon = MissileData.TrainerWeapon - local TrainerTargetUnit = MissileData.TrainerTargetUnit - local TrainerWeaponTypeName = MissileData.TrainerWeaponTypeName - local TrainerWeaponLaunched = MissileData.TrainerWeaponLaunched - - if Client and Client:IsAlive() and TrainerSourceUnit and TrainerSourceUnit:IsAlive() and TrainerWeapon and TrainerWeapon:isExist() and TrainerTargetUnit and TrainerTargetUnit:IsAlive() then - - if ShowMessages == true then - local TrackingTo - TrackingTo = string.format( " -> %s", - TrainerWeaponTypeName - ) - - if ClientDataID == TrackingDataID then - if ClientData.MessageToClient == "" then - ClientData.MessageToClient = "Missiles to You:\n" - end - ClientData.MessageToClient = ClientData.MessageToClient .. TrackingTo .. self:_AddRange( ClientData.Client, TrainerWeapon ) .. self:_AddBearing( ClientData.Client, TrainerWeapon ) .. "\n" - else - if self.TrackingToAll == true then - if ClientData.MessageToAll == "" then - ClientData.MessageToAll = "Missiles to other Players:\n" - end - ClientData.MessageToAll = ClientData.MessageToAll .. TrackingTo .. self:_AddRange( ClientData.Client, TrainerWeapon ) .. self:_AddBearing( ClientData.Client, TrainerWeapon ) .. " ( " .. TrainerTargetUnit:GetPlayerName() .. " )\n" - end - end - end - end - end - end - - -- Once the Player Client and the Other Player Client tracking messages are prepared, show them. - if ClientData.MessageToClient ~= "" or ClientData.MessageToAll ~= "" then - local Message = MESSAGE:New( ClientData.MessageToClient .. ClientData.MessageToAll, "Tracking", 1, "ID" ):ToClient( Client ) - end - end - end - - return true -end -env.info( '*** MOOSE INCLUDE END *** ' ) +env.info("Loaded MOOSE Include Engine")env.info( '*** MOOSE INCLUDE END *** ' ) diff --git a/Moose Test Missions/Moose_Test_ZONE_POLYGON/Moose_Test_ZONE_POLYGON.lua b/Moose Test Missions/Moose_Test_ZONE_POLYGON/Moose_Test_ZONE_POLYGON.lua new file mode 100644 index 000000000..64d867821 --- /dev/null +++ b/Moose Test Missions/Moose_Test_ZONE_POLYGON/Moose_Test_ZONE_POLYGON.lua @@ -0,0 +1,27 @@ + +Include.File( "Zone" ) +Include.File( "Group" ) +Include.File( "Scheduler" ) + +local GroupInside = GROUP:FindByName( "Test Inside Polygon" ) +local GroupOutside = GROUP:FindByName( "Test Outside Polygon" ) + +local GroupPolygon = GROUP:FindByName( "Polygon A" ) + +local PolygonZone = ZONE_POLYGON:New( "Polygon A", GroupPolygon ) + +local function Message() + + + +end + +Messager = SCHEDULER:New( nil, + function() + GroupInside:MessageToAll( ( GroupInside:IsCompletelyInZone( PolygonZone ) ) and "Inside Polygon A" or "Outside Polygon A", 0.5 ) + if GroupInside:IsCompletelyInZone( PolygonZone ) then + GroupInside:GetUnit(1):SmokeWhite() + end + end, + {}, 0, 0.5 ) + diff --git a/Moose Test Missions/Moose_Test_ZONE_POLYGON/Moose_Test_ZONE_POLYGON.miz b/Moose Test Missions/Moose_Test_ZONE_POLYGON/Moose_Test_ZONE_POLYGON.miz new file mode 100644 index 0000000000000000000000000000000000000000..e21003e1aa02a410d58621c5b46e7c762bd0e84a GIT binary patch literal 20400 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 literal 0 HcmV?d00001 diff --git a/Moose Training/Documentation/Zone.html b/Moose Training/Documentation/Zone.html index 315f8ebe5..2040352cb 100644 --- a/Moose Training/Documentation/Zone.html +++ b/Moose Training/Documentation/Zone.html @@ -71,7 +71,46 @@

Module Zone

-

ZONE Classes

+

ZONE Classes

+

This module contains the ZONE classes, inherited from Zone#ZONE_BASE.

+ + +

There are essentially two core functions that zones accomodate:

+ +
    +
  • Test if an object is within the zone boundaries.
  • +
  • Provide the zone behaviour. Some zones are static, while others are moveable.
  • +
+ +

The object classes are using the zone classes to test the zone boundaries, which can take various forms:

+ +
    +
  • Test if completely within the zone.
  • +
  • Test if partly within the zone (for Group#GROUP objects).
  • +
  • Test if not in the zone.
  • +
  • Distance to the nearest intersecting point of the zone.
  • +
  • Distance to the center of the zone.
  • +
  • ...
  • +
+ +

Each of these ZONE classes have a zone name, and specific parameters defining the zone type:

+ +
    +
  • Zone#ZONE_BASE: The ZONE_BASE class defining the base for all other zone classes.
  • +
  • Zone#ZONE_RADIUS: The ZONE_RADIUS class defined by a zone name, a location and a radius.
  • +
  • Zone#ZONE: The ZONE class, defined by the zone name as defined within the Mission Editor.
  • +
  • Zone#ZONE_UNIT: The ZONE_UNIT class defined by a zone around a Unit#UNIT with a radius.
  • +
  • Zone#ZONE_POLYGON: The ZONE_POLYGON class defined by a sequence of Group#GROUP waypoints within the Mission Editor, forming a polygon.
  • +
+ +

Polymorphic methods

+

Each zone implements two polymorphic functions defined in Zone#ZONE_BASE:

+ + +

Global(s)

@@ -79,6 +118,30 @@ + + + + + + + + + + + + + + + +
ZONE +
ZONE_BASE + +
ZONE_POLYGON + +
ZONE_RADIUS + +
ZONE_UNIT +
@@ -88,35 +151,165 @@ ZONE.ClassName - - - - ZONE:GetPointVec2() - - - - - - ZONE:GetPointVec3(Height) - - - - - - ZONE:GetRadius() - - - - - - ZONE:GetRandomPointVec2() - - ZONE:New(ZoneName) +

Constructor of ZONE, taking the zone name.

+ + + + +

Type ZONE_BASE

+ + + + + + + + + + + + + + + + + +
ZONE_BASE.ClassName + +
ZONE_BASE:IsPointVec2InZone(PointVec2) + +
ZONE_BASE:IsPointVec3InZone(PointVec3) + +
ZONE_BASE:New(ZoneName) + +
+ +

Type ZONE_POLYGON

+ + + + + + + + + + + + + +
ZONE_POLYGON.ClassName + +
ZONE_POLYGON:IsPointVec2InZone(PointVec2) +

Returns if a location is within the zone.

+
ZONE_POLYGON:New(ZoneName, ZoneGroup) +

Constructor to create a ZONE_POLYGON instance, taking the zone name and the name of the Group#GROUP defined within the Mission Editor.

+
+ +

Type ZONE_RADIUS

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ZONE_RADIUS.ClassName + +
ZONE_RADIUS:GetPointVec2() +

Returns the location of the zone.

+
ZONE_RADIUS:GetPointVec3(Height) +

Returns the point of the zone.

+
ZONE_RADIUS:GetRadius() +

Returns the radius of the zone.

+
ZONE_RADIUS:GetRandomPointVec2() +

Returns a random location within the zone.

+
ZONE_RADIUS:IsPointVec2InZone(PointVec2) +

Returns if a location is within the zone.

+
ZONE_RADIUS:IsPointVec3InZone(PointVec3) +

Returns if a point is within the zone.

+
ZONE_RADIUS:New(PointVec2, Radius, ZoneName) +

Constructor of ZONE_RADIUS, taking the zone name, the zone location and a radius.

+
ZONE_RADIUS.PointVec2 +

The current location of the zone.

+
ZONE_RADIUS.Radius +

The radius of the zone.

+
ZONE_RADIUS:SetPointVec2(PointVec2) +

Sets the location of the zone.

+
ZONE_RADIUS:SetRadius(Radius) +

Sets the radius of the zone.

+
+ +

Type ZONE_UNIT

+ + + + + + + + + + + + + + + + @@ -135,13 +328,72 @@ + + +
+
+ + #ZONE_BASE + +ZONE_BASE + +
+
+ + + +
+
+
+
+ + #ZONE_POLYGON + +ZONE_POLYGON + +
+
+ + + +
+
+
+
+ + #ZONE_RADIUS + +ZONE_RADIUS + +
+
+ + + +
+
+
+
+ + #ZONE_UNIT + +ZONE_UNIT + +
+
+ + +

Type Zone

Type ZONE

-

The ZONE class

+

The ZONE class, defined by the zone name as defined within the Mission Editor.

+ + +

The location and the radius are automatically collected from the mission settings.

Field(s)

@@ -161,8 +413,42 @@
- -ZONE:GetPointVec2() + +ZONE:New(ZoneName) + +
+
+ +

Constructor of ZONE, taking the zone name.

+ +

Parameter

+
    +
  • + +

    #string ZoneName : +The name of the zone as defined within the mission editor.

    + +
  • +
+

Return value

+ +

#ZONE:

+ + +
+
+ +

Type ZONE_BASE

+ +

The ZONE_BASE class

+ +

Field(s)

+
+
+ + #string + +ZONE_BASE.ClassName
@@ -174,8 +460,8 @@
- -ZONE:GetPointVec3(Height) + +ZONE_BASE:IsPointVec2InZone(PointVec2)
@@ -186,7 +472,7 @@
  • -

    Height :

    +

    PointVec2 :

@@ -195,34 +481,29 @@
- -ZONE:GetRadius() + +ZONE_BASE:IsPointVec3InZone(PointVec3)
+

Parameter

+
    +
  • + +

    PointVec3 :

    + +
  • +
- -ZONE:GetRandomPointVec2() - -
-
- - - -
-
-
-
- - -ZONE:New(ZoneName) + +ZONE_BASE:New(ZoneName)
@@ -237,6 +518,455 @@ +
+
+ +

Type ZONE_POLYGON

+ +

The ZONE_POLYGON class defined by a sequence of Group#GROUP waypoints within the Mission Editor, forming a polygon.

+ +

Field(s)

+
+
+ + #string + +ZONE_POLYGON.ClassName + +
+
+ + + +
+
+
+
+ + +ZONE_POLYGON:IsPointVec2InZone(PointVec2) + +
+
+ +

Returns if a location is within the zone.

+ +

Parameter

+ +

Return value

+ +

#boolean: +true if the location is within the zone.

+ +
+
+
+
+ + +ZONE_POLYGON:New(ZoneName, ZoneGroup) + +
+
+ +

Constructor to create a ZONE_POLYGON instance, taking the zone name and the name of the Group#GROUP defined within the Mission Editor.

+ + +

The Group#GROUP waypoints define the polygon corners. The first and the last point are automatically connected by ZONE_POLYGON.

+ +

Parameters

+
    +
  • + +

    #string ZoneName : +Name of the zone.

    + +
  • +
  • + +

    Group#GROUP ZoneGroup : +The GROUP waypoints as defined within the Mission Editor define the polygon shape.

    + +
  • +
+

Return value

+ +

#ZONE_POLYGON: +self

+ +
+
+ +

Type ZONE_RADIUS

+ +

The ZONE_RADIUS class, defined by a zone name, a location and a radius.

+ +

Field(s)

+
+
+ + #string + +ZONE_RADIUS.ClassName + +
+
+ + + +
+
+
+
+ + +ZONE_RADIUS:GetPointVec2() + +
+
+ +

Returns the location of the zone.

+ +

Return value

+ +

DCSTypes#Vec2: +The location of the zone.

+ +
+
+
+
+ + +ZONE_RADIUS:GetPointVec3(Height) + +
+
+ +

Returns the point of the zone.

+ +

Parameter

+
    +
  • + +

    DCSTypes#Distance Height : +The height to add to the land height where the center of the zone is located.

    + +
  • +
+

Return value

+ +

DCSTypes#Vec3: +The point of the zone.

+ +
+
+
+
+ + +ZONE_RADIUS:GetRadius() + +
+
+ +

Returns the radius of the zone.

+ +

Return value

+ +

DCSTypes#Distance: +The radius of the zone.

+ +
+
+
+
+ + +ZONE_RADIUS:GetRandomPointVec2() + +
+
+ +

Returns a random location within the zone.

+ +

Return value

+ +

DCSTypes#Vec2: +The random location within the zone.

+ +
+
+
+
+ + +ZONE_RADIUS:IsPointVec2InZone(PointVec2) + +
+
+ +

Returns if a location is within the zone.

+ +

Parameter

+ +

Return value

+ +

#boolean: +true if the location is within the zone.

+ +
+
+
+
+ + +ZONE_RADIUS:IsPointVec3InZone(PointVec3) + +
+
+ +

Returns if a point is within the zone.

+ +

Parameter

+ +

Return value

+ +

#boolean: +true if the point is within the zone.

+ +
+
+
+
+ + +ZONE_RADIUS:New(PointVec2, Radius, ZoneName) + +
+
+ +

Constructor of ZONE_RADIUS, taking the zone name, the zone location and a radius.

+ +

Parameters

+ +

Return value

+ +

#ZONE_RADIUS:

+ + +
+
+
+
+ + DCSTypes#Vec2 + +ZONE_RADIUS.PointVec2 + +
+
+ +

The current location of the zone.

+ +
+
+
+
+ + DCSTypes#Distance + +ZONE_RADIUS.Radius + +
+
+ +

The radius of the zone.

+ +
+
+
+
+ + +ZONE_RADIUS:SetPointVec2(PointVec2) + +
+
+ +

Sets the location of the zone.

+ +

Parameter

+
    +
  • + +

    DCSTypes#Vec2 PointVec2 : +The new location of the zone.

    + +
  • +
+

Return value

+ +

DCSTypes#Vec2: +The new location of the zone.

+ +
+
+
+
+ + +ZONE_RADIUS:SetRadius(Radius) + +
+
+ +

Sets the radius of the zone.

+ +

Parameter

+ +

Return value

+ +

DCSTypes#Distance: +The radius of the zone.

+ +
+
+ +

Type ZONE_UNIT

+ +

The ZONE_UNIT class defined by a zone around a Unit#UNIT with a radius.

+ +

Field(s)

+
+
+ + #string + +ZONE_UNIT.ClassName + +
+
+ + + +
+
+
+
+ + +ZONE_UNIT:GetPointVec2() + +
+
+ +

Returns the current location of the Unit#UNIT.

+ +

Return value

+ +

DCSTypes#Vec2: +The location of the zone based on the Unit#UNITlocation.

+ +
+
+
+
+ + +ZONE_UNIT:New(ZoneName, ZoneUNIT, Radius) + +
+
+ +

Constructor to create a ZONE_UNIT instance, taking the zone name, a zone unit and a radius.

+ +

Parameters

+
    +
  • + +

    #string ZoneName : +Name of the zone.

    + +
  • +
  • + +

    Unit#UNIT ZoneUNIT : +The unit as the center of the zone.

    + +
  • +
  • + +

    DCSTypes#Distance Radius : +The radius of the zone.

    + +
  • +
+

Return value

+ +

#ZONE_UNIT: +self

+ +
+
+
+
+ + Unit#UNIT + +ZONE_UNIT.ZoneUNIT + +
+
+ + +
diff --git a/Moose Training/Documentation/index.html b/Moose Training/Documentation/index.html index 734897a86..891e8acef 100644 --- a/Moose Training/Documentation/index.html +++ b/Moose Training/Documentation/index.html @@ -358,7 +358,8 @@
From d5867a1c8c361c7c41911eb715fb6f89378d97a0 Mon Sep 17 00:00:00 2001 From: FlightControl Date: Sun, 5 Jun 2016 00:04:12 +0200 Subject: [PATCH 2/7] For those who want to test ZONES --- .../l10n/DEFAULT/Moose.lua | 17619 +++++++++++++++- Moose Mission Setup/Moose.lua | 17619 +++++++++++++++- .../Moose_Test_CLEANUP/Moose_Test_CLEANUP.miz | Bin 199246 -> 204111 bytes .../Moose_Test_DATABASE.miz | Bin 138994 -> 143859 bytes .../Moose_Test_DESTROY/MOOSE_Test_DESTROY.miz | Bin 134430 -> 139295 bytes .../Moose_Test_ESCORT/MOOSE_Test_ESCORT.miz | Bin 160085 -> 164950 bytes .../Moose_Test_MISSILETRAINER.miz | Bin 219379 -> 224244 bytes .../Moose_Test_SEAD/MOOSE_Test_SEAD.miz | Bin 126683 -> 131548 bytes .../Moose_Test_SPAWN/MOOSE_Test_SPAWN.miz | Bin 159386 -> 160750 bytes .../MOOSE_Test_SPAWN_Repeat.miz | Bin 126244 -> 131109 bytes .../MOOSE_Test_TASK_Pickup_and_Deploy.miz | Bin 132845 -> 137710 bytes .../Moose_Test_WRAPPER/Moose_Test_WRAPPER.miz | Bin 141864 -> 146729 bytes .../Moose_Test_ZONE_POLYGON.miz | Bin 20400 -> 126214 bytes 13 files changed, 35192 insertions(+), 46 deletions(-) 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 dc9f9f58b..7db8a5175 100644 --- a/Moose Mission Setup/Moose Mission Update/l10n/DEFAULT/Moose.lua +++ b/Moose Mission Setup/Moose Mission Update/l10n/DEFAULT/Moose.lua @@ -1,6 +1,5 @@ -env.info( '*** MOOSE DYNAMIC INCLUDE START *** ' ) -env.info( 'Moose Generation Timestamp: 20160604_1716' ) - +env.info( '*** MOOSE STATIC INCLUDE START *** ' ) +env.info( 'Moose Generation Timestamp: 20160605_0003' ) local base = _G env.info("Loading MOOSE " .. base.timer.getAbsTime() ) @@ -12,27 +11,9 @@ Include.Path = function() end Include.File = function( IncludeFile ) - if not Include.Files[ IncludeFile ] then - Include.Files[IncludeFile] = IncludeFile - env.info( "Include:" .. IncludeFile .. " from " .. Include.ProgramPath ) - local f = assert( base.loadfile( Include.ProgramPath .. IncludeFile .. ".lua" ) ) - if f == nil then - env.info( "Include:" .. IncludeFile .. " from " .. Include.MissionPath ) - local f = assert( base.loadfile( Include.MissionPath .. IncludeFile .. ".lua" ) ) - if f == nil then - error ("Could not load MOOSE file " .. IncludeFile .. ".lua" ) - else - env.info( "Include:" .. IncludeFile .. " loaded from " .. Include.MissionPath ) - return f() - end - else - env.info( "Include:" .. IncludeFile .. " loaded from " .. Include.ProgramPath ) - return f() - end - end end -Include.ProgramPath = "Scripts/Moose/" +Include.ProgramPath = "Scripts/Moose/Moose/" Include.MissionPath = Include.Path() env.info( "Include.ProgramPath = " .. Include.ProgramPath) @@ -42,4 +23,17596 @@ Include.Files = {} Include.File( "Moose" ) -env.info("Loaded MOOSE Include Engine")env.info( '*** MOOSE INCLUDE END *** ' ) +env.info("Loaded MOOSE Include Engine") +--- Various routines +-- @module routines +-- @author Flightcontrol + +--Include.File( "Trace" ) +--Include.File( "Message" ) + + +env.setErrorMessageBoxEnabled(false) + +--- Extract of MIST functions. +-- @author Grimes + +routines = {} + + +-- don't change these +routines.majorVersion = 3 +routines.minorVersion = 3 +routines.build = 22 + +----------------------------------------------------------------------------------------------------------------- + +---------------------------------------------------------------------------------------------- +-- Utils- conversion, Lua utils, etc. +routines.utils = {} + +--from http://lua-users.org/wiki/CopyTable +routines.utils.deepCopy = function(object) + local lookup_table = {} + local function _copy(object) + if type(object) ~= "table" then + return object + elseif lookup_table[object] then + return lookup_table[object] + end + local new_table = {} + lookup_table[object] = new_table + for index, value in pairs(object) do + new_table[_copy(index)] = _copy(value) + end + return setmetatable(new_table, getmetatable(object)) + end + local objectreturn = _copy(object) + return objectreturn +end + + +-- porting in Slmod's serialize_slmod2 +routines.utils.oneLineSerialize = function(tbl) -- serialization of a table all on a single line, no comments, made to replace old get_table_string function + + lookup_table = {} + + local function _Serialize( tbl ) + + if type(tbl) == 'table' then --function only works for tables! + + if lookup_table[tbl] then + return lookup_table[object] + end + + local tbl_str = {} + + lookup_table[tbl] = tbl_str + + tbl_str[#tbl_str + 1] = '{' + + for ind,val in pairs(tbl) do -- serialize its fields + local ind_str = {} + if type(ind) == "number" then + ind_str[#ind_str + 1] = '[' + ind_str[#ind_str + 1] = tostring(ind) + ind_str[#ind_str + 1] = ']=' + else --must be a string + ind_str[#ind_str + 1] = '[' + ind_str[#ind_str + 1] = routines.utils.basicSerialize(ind) + ind_str[#ind_str + 1] = ']=' + end + + local val_str = {} + if ((type(val) == 'number') or (type(val) == 'boolean')) then + val_str[#val_str + 1] = tostring(val) + val_str[#val_str + 1] = ',' + tbl_str[#tbl_str + 1] = table.concat(ind_str) + tbl_str[#tbl_str + 1] = table.concat(val_str) + elseif type(val) == 'string' then + val_str[#val_str + 1] = routines.utils.basicSerialize(val) + val_str[#val_str + 1] = ',' + tbl_str[#tbl_str + 1] = table.concat(ind_str) + tbl_str[#tbl_str + 1] = table.concat(val_str) + elseif type(val) == 'nil' then -- won't ever happen, right? + val_str[#val_str + 1] = 'nil,' + tbl_str[#tbl_str + 1] = table.concat(ind_str) + tbl_str[#tbl_str + 1] = table.concat(val_str) + elseif type(val) == 'table' then + if ind == "__index" then + -- tbl_str[#tbl_str + 1] = "__index" + -- tbl_str[#tbl_str + 1] = ',' --I think this is right, I just added it + else + + val_str[#val_str + 1] = _Serialize(val) + val_str[#val_str + 1] = ',' --I think this is right, I just added it + tbl_str[#tbl_str + 1] = table.concat(ind_str) + tbl_str[#tbl_str + 1] = table.concat(val_str) + end + elseif type(val) == 'function' then + -- tbl_str[#tbl_str + 1] = "function " .. tostring(ind) + -- tbl_str[#tbl_str + 1] = ',' --I think this is right, I just added it + else +-- env.info('unable to serialize value type ' .. routines.utils.basicSerialize(type(val)) .. ' at index ' .. tostring(ind)) +-- env.info( debug.traceback() ) + end + + end + tbl_str[#tbl_str + 1] = '}' + return table.concat(tbl_str) + else + return tostring(tbl) + end + end + + local objectreturn = _Serialize(tbl) + return objectreturn +end + +--porting in Slmod's "safestring" basic serialize +routines.utils.basicSerialize = function(s) + if s == nil then + return "\"\"" + else + if ((type(s) == 'number') or (type(s) == 'boolean') or (type(s) == 'function') or (type(s) == 'table') or (type(s) == 'userdata') ) then + return tostring(s) + elseif type(s) == 'string' then + s = string.format('%q', s) + return s + end + end +end + + +routines.utils.toDegree = function(angle) + return angle*180/math.pi +end + +routines.utils.toRadian = function(angle) + return angle*math.pi/180 +end + +routines.utils.metersToNM = function(meters) + return meters/1852 +end + +routines.utils.metersToFeet = function(meters) + return meters/0.3048 +end + +routines.utils.NMToMeters = function(NM) + return NM*1852 +end + +routines.utils.feetToMeters = function(feet) + return feet*0.3048 +end + +routines.utils.mpsToKnots = function(mps) + return mps*3600/1852 +end + +routines.utils.mpsToKmph = function(mps) + return mps*3.6 +end + +routines.utils.knotsToMps = function(knots) + return knots*1852/3600 +end + +routines.utils.kmphToMps = function(kmph) + return kmph/3.6 +end + +function routines.utils.makeVec2(Vec3) + if Vec3.z then + return {x = Vec3.x, y = Vec3.z} + else + return {x = Vec3.x, y = Vec3.y} -- it was actually already vec2. + end +end + +function routines.utils.makeVec3(Vec2, y) + if not Vec2.z then + if not y then + y = 0 + end + return {x = Vec2.x, y = y, z = Vec2.y} + else + return {x = Vec2.x, y = Vec2.y, z = Vec2.z} -- it was already Vec3, actually. + end +end + +function routines.utils.makeVec3GL(Vec2, offset) + local adj = offset or 0 + + if not Vec2.z then + return {x = Vec2.x, y = (land.getHeight(Vec2) + adj), z = Vec2.y} + else + return {x = Vec2.x, y = (land.getHeight({x = Vec2.x, y = Vec2.z}) + adj), z = Vec2.z} + end +end + +routines.utils.zoneToVec3 = function(zone) + local new = {} + if type(zone) == 'table' and zone.point then + new.x = zone.point.x + new.y = zone.point.y + new.z = zone.point.z + return new + elseif type(zone) == 'string' then + zone = trigger.misc.getZone(zone) + if zone then + new.x = zone.point.x + new.y = zone.point.y + new.z = zone.point.z + return new + end + end +end + +-- gets heading-error corrected direction from point along vector vec. +function routines.utils.getDir(vec, point) + local dir = math.atan2(vec.z, vec.x) + dir = dir + routines.getNorthCorrection(point) + if dir < 0 then + dir = dir + 2*math.pi -- put dir in range of 0 to 2*pi + end + return dir +end + +-- gets distance in meters between two points (2 dimensional) +function routines.utils.get2DDist(point1, point2) + point1 = routines.utils.makeVec3(point1) + point2 = routines.utils.makeVec3(point2) + return routines.vec.mag({x = point1.x - point2.x, y = 0, z = point1.z - point2.z}) +end + +-- gets distance in meters between two points (3 dimensional) +function routines.utils.get3DDist(point1, point2) + return routines.vec.mag({x = point1.x - point2.x, y = point1.y - point2.y, z = point1.z - point2.z}) +end + + + +-- From http://lua-users.org/wiki/SimpleRound +-- use negative idp for rounding ahead of decimal place, positive for rounding after decimal place +routines.utils.round = function(num, idp) + local mult = 10^(idp or 0) + return math.floor(num * mult + 0.5) / mult +end + +-- porting in Slmod's dostring +routines.utils.dostring = function(s) + local f, err = loadstring(s) + if f then + return true, f() + else + return false, err + end +end + + +--3D Vector manipulation +routines.vec = {} + +routines.vec.add = function(vec1, vec2) + return {x = vec1.x + vec2.x, y = vec1.y + vec2.y, z = vec1.z + vec2.z} +end + +routines.vec.sub = function(vec1, vec2) + return {x = vec1.x - vec2.x, y = vec1.y - vec2.y, z = vec1.z - vec2.z} +end + +routines.vec.scalarMult = function(vec, mult) + return {x = vec.x*mult, y = vec.y*mult, z = vec.z*mult} +end + +routines.vec.scalar_mult = routines.vec.scalarMult + +routines.vec.dp = function(vec1, vec2) + return vec1.x*vec2.x + vec1.y*vec2.y + vec1.z*vec2.z +end + +routines.vec.cp = function(vec1, vec2) + return { x = vec1.y*vec2.z - vec1.z*vec2.y, y = vec1.z*vec2.x - vec1.x*vec2.z, z = vec1.x*vec2.y - vec1.y*vec2.x} +end + +routines.vec.mag = function(vec) + return (vec.x^2 + vec.y^2 + vec.z^2)^0.5 +end + +routines.vec.getUnitVec = function(vec) + local mag = routines.vec.mag(vec) + return { x = vec.x/mag, y = vec.y/mag, z = vec.z/mag } +end + +routines.vec.rotateVec2 = function(vec2, theta) + return { x = vec2.x*math.cos(theta) - vec2.y*math.sin(theta), y = vec2.x*math.sin(theta) + vec2.y*math.cos(theta)} +end +--------------------------------------------------------------------------------------------------------------------------- + + + + +-- acc- the accuracy of each easting/northing. 0, 1, 2, 3, 4, or 5. +routines.tostringMGRS = function(MGRS, acc) + if acc == 0 then + return MGRS.UTMZone .. ' ' .. MGRS.MGRSDigraph + else + return MGRS.UTMZone .. ' ' .. MGRS.MGRSDigraph .. ' ' .. string.format('%0' .. acc .. 'd', routines.utils.round(MGRS.Easting/(10^(5-acc)), 0)) + .. ' ' .. string.format('%0' .. acc .. 'd', routines.utils.round(MGRS.Northing/(10^(5-acc)), 0)) + end +end + +--[[acc: +in DM: decimal point of minutes. +In DMS: decimal point of seconds. +position after the decimal of the least significant digit: +So: +42.32 - acc of 2. +]] +routines.tostringLL = function(lat, lon, acc, DMS) + + local latHemi, lonHemi + if lat > 0 then + latHemi = 'N' + else + latHemi = 'S' + end + + if lon > 0 then + lonHemi = 'E' + else + lonHemi = 'W' + end + + lat = math.abs(lat) + lon = math.abs(lon) + + local latDeg = math.floor(lat) + local latMin = (lat - latDeg)*60 + + local lonDeg = math.floor(lon) + local lonMin = (lon - lonDeg)*60 + + if DMS then -- degrees, minutes, and seconds. + local oldLatMin = latMin + latMin = math.floor(latMin) + local latSec = routines.utils.round((oldLatMin - latMin)*60, acc) + + local oldLonMin = lonMin + lonMin = math.floor(lonMin) + local lonSec = routines.utils.round((oldLonMin - lonMin)*60, acc) + + if latSec == 60 then + latSec = 0 + latMin = latMin + 1 + end + + if lonSec == 60 then + lonSec = 0 + lonMin = lonMin + 1 + end + + local secFrmtStr -- create the formatting string for the seconds place + if acc <= 0 then -- no decimal place. + secFrmtStr = '%02d' + else + local width = 3 + acc -- 01.310 - that's a width of 6, for example. + secFrmtStr = '%0' .. width .. '.' .. acc .. 'f' + end + + return string.format('%02d', latDeg) .. ' ' .. string.format('%02d', latMin) .. '\' ' .. string.format(secFrmtStr, latSec) .. '"' .. latHemi .. ' ' + .. string.format('%02d', lonDeg) .. ' ' .. string.format('%02d', lonMin) .. '\' ' .. string.format(secFrmtStr, lonSec) .. '"' .. lonHemi + + else -- degrees, decimal minutes. + latMin = routines.utils.round(latMin, acc) + lonMin = routines.utils.round(lonMin, acc) + + if latMin == 60 then + latMin = 0 + latDeg = latDeg + 1 + end + + if lonMin == 60 then + lonMin = 0 + lonDeg = lonDeg + 1 + end + + local minFrmtStr -- create the formatting string for the minutes place + if acc <= 0 then -- no decimal place. + minFrmtStr = '%02d' + else + local width = 3 + acc -- 01.310 - that's a width of 6, for example. + minFrmtStr = '%0' .. width .. '.' .. acc .. 'f' + end + + return string.format('%02d', latDeg) .. ' ' .. string.format(minFrmtStr, latMin) .. '\'' .. latHemi .. ' ' + .. string.format('%02d', lonDeg) .. ' ' .. string.format(minFrmtStr, lonMin) .. '\'' .. lonHemi + + end +end + +--[[ required: az - radian + required: dist - meters + optional: alt - meters (set to false or nil if you don't want to use it). + optional: metric - set true to get dist and alt in km and m. + precision will always be nearest degree and NM or km.]] +routines.tostringBR = function(az, dist, alt, metric) + az = routines.utils.round(routines.utils.toDegree(az), 0) + + if metric then + dist = routines.utils.round(dist/1000, 2) + else + dist = routines.utils.round(routines.utils.metersToNM(dist), 2) + end + + local s = string.format('%03d', az) .. ' for ' .. dist + + if alt then + if metric then + s = s .. ' at ' .. routines.utils.round(alt, 0) + else + s = s .. ' at ' .. routines.utils.round(routines.utils.metersToFeet(alt), 0) + end + end + return s +end + +routines.getNorthCorrection = function(point) --gets the correction needed for true north + if not point.z then --Vec2; convert to Vec3 + point.z = point.y + point.y = 0 + end + local lat, lon = coord.LOtoLL(point) + local north_posit = coord.LLtoLO(lat + 1, lon) + return math.atan2(north_posit.z - point.z, north_posit.x - point.x) +end + + +-- the main area +do + -- THE MAIN FUNCTION -- Accessed 100 times/sec. + routines.main = function() + timer.scheduleFunction(routines.main, {}, timer.getTime() + 2) --reschedule first in case of Lua error + ---------------------------------------------------------------------------------------------------------- + --area to add new stuff in + + routines.do_scheduled_functions() + end -- end of routines.main + + timer.scheduleFunction(routines.main, {}, timer.getTime() + 2) + +end + + +do + local idNum = 0 + + --Simplified event handler + routines.addEventHandler = function(f) --id is optional! + local handler = {} + idNum = idNum + 1 + handler.id = idNum + handler.f = f + handler.onEvent = function(self, event) + self.f(event) + end + world.addEventHandler(handler) + end + + routines.removeEventHandler = function(id) + for key, handler in pairs(world.eventHandlers) do + if handler.id and handler.id == id then + world.eventHandlers[key] = nil + return true + end + end + return false + end +end + +-- need to return a Vec3 or Vec2? +function routines.getRandPointInCircle(point, radius, innerRadius) + local theta = 2*math.pi*math.random() + local rad = math.random() + math.random() + if rad > 1 then + rad = 2 - rad + end + + local radMult + if innerRadius and innerRadius <= radius then + radMult = (radius - innerRadius)*rad + innerRadius + else + radMult = radius*rad + end + + if not point.z then --might as well work with vec2/3 + point.z = point.y + end + + local rndCoord + if radius > 0 then + rndCoord = {x = math.cos(theta)*radMult + point.x, y = math.sin(theta)*radMult + point.z} + else + rndCoord = {x = point.x, y = point.z} + end + return rndCoord +end + +routines.goRoute = function(group, path) + local misTask = { + id = 'Mission', + params = { + route = { + points = routines.utils.deepCopy(path), + }, + }, + } + if type(group) == 'string' then + group = Group.getByName(group) + end + local groupCon = group:getController() + if groupCon then + groupCon:setTask(misTask) + return true + end + + Controller.setTask(groupCon, misTask) + return false +end + + +-- Useful atomic functions from mist, ported. + +routines.ground = {} +routines.fixedWing = {} +routines.heli = {} + +routines.ground.buildWP = function(point, overRideForm, overRideSpeed) + + local wp = {} + wp.x = point.x + + if point.z then + wp.y = point.z + else + wp.y = point.y + end + local form, speed + + if point.speed and not overRideSpeed then + wp.speed = point.speed + elseif type(overRideSpeed) == 'number' then + wp.speed = overRideSpeed + else + wp.speed = routines.utils.kmphToMps(20) + end + + if point.form and not overRideForm then + form = point.form + else + form = overRideForm + end + + if not form then + wp.action = 'Cone' + else + form = string.lower(form) + if form == 'off_road' or form == 'off road' then + wp.action = 'Off Road' + elseif form == 'on_road' or form == 'on road' then + wp.action = 'On Road' + elseif form == 'rank' or form == 'line_abrest' or form == 'line abrest' or form == 'lineabrest'then + wp.action = 'Rank' + elseif form == 'cone' then + wp.action = 'Cone' + elseif form == 'diamond' then + wp.action = 'Diamond' + elseif form == 'vee' then + wp.action = 'Vee' + elseif form == 'echelon_left' or form == 'echelon left' or form == 'echelonl' then + wp.action = 'EchelonL' + elseif form == 'echelon_right' or form == 'echelon right' or form == 'echelonr' then + wp.action = 'EchelonR' + else + wp.action = 'Cone' -- if nothing matched + end + end + + wp.type = 'Turning Point' + + return wp + +end + +routines.fixedWing.buildWP = function(point, WPtype, speed, alt, altType) + + local wp = {} + wp.x = point.x + + if point.z then + wp.y = point.z + else + wp.y = point.y + end + + if alt and type(alt) == 'number' then + wp.alt = alt + else + wp.alt = 2000 + end + + if altType then + altType = string.lower(altType) + if altType == 'radio' or 'agl' then + wp.alt_type = 'RADIO' + elseif altType == 'baro' or 'asl' then + wp.alt_type = 'BARO' + end + else + wp.alt_type = 'RADIO' + end + + if point.speed then + speed = point.speed + end + + if point.type then + WPtype = point.type + end + + if not speed then + wp.speed = routines.utils.kmphToMps(500) + else + wp.speed = speed + end + + if not WPtype then + wp.action = 'Turning Point' + else + WPtype = string.lower(WPtype) + if WPtype == 'flyover' or WPtype == 'fly over' or WPtype == 'fly_over' then + wp.action = 'Fly Over Point' + elseif WPtype == 'turningpoint' or WPtype == 'turning point' or WPtype == 'turning_point' then + wp.action = 'Turning Point' + else + wp.action = 'Turning Point' + end + end + + wp.type = 'Turning Point' + return wp +end + +routines.heli.buildWP = function(point, WPtype, speed, alt, altType) + + local wp = {} + wp.x = point.x + + if point.z then + wp.y = point.z + else + wp.y = point.y + end + + if alt and type(alt) == 'number' then + wp.alt = alt + else + wp.alt = 500 + end + + if altType then + altType = string.lower(altType) + if altType == 'radio' or 'agl' then + wp.alt_type = 'RADIO' + elseif altType == 'baro' or 'asl' then + wp.alt_type = 'BARO' + end + else + wp.alt_type = 'RADIO' + end + + if point.speed then + speed = point.speed + end + + if point.type then + WPtype = point.type + end + + if not speed then + wp.speed = routines.utils.kmphToMps(200) + else + wp.speed = speed + end + + if not WPtype then + wp.action = 'Turning Point' + else + WPtype = string.lower(WPtype) + if WPtype == 'flyover' or WPtype == 'fly over' or WPtype == 'fly_over' then + wp.action = 'Fly Over Point' + elseif WPtype == 'turningpoint' or WPtype == 'turning point' or WPtype == 'turning_point' then + wp.action = 'Turning Point' + else + wp.action = 'Turning Point' + end + end + + wp.type = 'Turning Point' + return wp +end + +routines.groupToRandomPoint = function(vars) + local group = vars.group --Required + local point = vars.point --required + local radius = vars.radius or 0 + local innerRadius = vars.innerRadius + local form = vars.form or 'Cone' + local heading = vars.heading or math.random()*2*math.pi + local headingDegrees = vars.headingDegrees + local speed = vars.speed or routines.utils.kmphToMps(20) + + + local useRoads + if not vars.disableRoads then + useRoads = true + else + useRoads = false + end + + local path = {} + + if headingDegrees then + heading = headingDegrees*math.pi/180 + end + + if heading >= 2*math.pi then + heading = heading - 2*math.pi + end + + local rndCoord = routines.getRandPointInCircle(point, radius, innerRadius) + + local offset = {} + local posStart = routines.getLeadPos(group) + + offset.x = routines.utils.round(math.sin(heading - (math.pi/2)) * 50 + rndCoord.x, 3) + offset.z = routines.utils.round(math.cos(heading + (math.pi/2)) * 50 + rndCoord.y, 3) + path[#path + 1] = routines.ground.buildWP(posStart, form, speed) + + + if useRoads == true and ((point.x - posStart.x)^2 + (point.z - posStart.z)^2)^0.5 > radius * 1.3 then + path[#path + 1] = routines.ground.buildWP({['x'] = posStart.x + 11, ['z'] = posStart.z + 11}, 'off_road', speed) + path[#path + 1] = routines.ground.buildWP(posStart, 'on_road', speed) + path[#path + 1] = routines.ground.buildWP(offset, 'on_road', speed) + else + path[#path + 1] = routines.ground.buildWP({['x'] = posStart.x + 25, ['z'] = posStart.z + 25}, form, speed) + end + + path[#path + 1] = routines.ground.buildWP(offset, form, speed) + path[#path + 1] = routines.ground.buildWP(rndCoord, form, speed) + + routines.goRoute(group, path) + + return +end + +routines.groupRandomDistSelf = function(gpData, dist, form, heading, speed) + local pos = routines.getLeadPos(gpData) + local fakeZone = {} + fakeZone.radius = dist or math.random(300, 1000) + fakeZone.point = {x = pos.x, y, pos.y, z = pos.z} + routines.groupToRandomZone(gpData, fakeZone, form, heading, speed) + + return +end + +routines.groupToRandomZone = function(gpData, zone, form, heading, speed) + if type(gpData) == 'string' then + gpData = Group.getByName(gpData) + end + + if type(zone) == 'string' then + zone = trigger.misc.getZone(zone) + elseif type(zone) == 'table' and not zone.radius then + zone = trigger.misc.getZone(zone[math.random(1, #zone)]) + end + + if speed then + speed = routines.utils.kmphToMps(speed) + end + + local vars = {} + vars.group = gpData + vars.radius = zone.radius + vars.form = form + vars.headingDegrees = heading + vars.speed = speed + vars.point = routines.utils.zoneToVec3(zone) + + routines.groupToRandomPoint(vars) + + return +end + +routines.isTerrainValid = function(coord, terrainTypes) -- vec2/3 and enum or table of acceptable terrain types + if coord.z then + coord.y = coord.z + end + local typeConverted = {} + + if type(terrainTypes) == 'string' then -- if its a string it does this check + for constId, constData in pairs(land.SurfaceType) do + if string.lower(constId) == string.lower(terrainTypes) or string.lower(constData) == string.lower(terrainTypes) then + table.insert(typeConverted, constId) + end + end + elseif type(terrainTypes) == 'table' then -- if its a table it does this check + for typeId, typeData in pairs(terrainTypes) do + for constId, constData in pairs(land.SurfaceType) do + if string.lower(constId) == string.lower(typeData) or string.lower(constData) == string.lower(typeId) then + table.insert(typeConverted, constId) + end + end + end + end + for validIndex, validData in pairs(typeConverted) do + if land.getSurfaceType(coord) == land.SurfaceType[validData] then + return true + end + end + return false +end + +routines.groupToPoint = function(gpData, point, form, heading, speed, useRoads) + if type(point) == 'string' then + point = trigger.misc.getZone(point) + end + if speed then + speed = routines.utils.kmphToMps(speed) + end + + local vars = {} + vars.group = gpData + vars.form = form + vars.headingDegrees = heading + vars.speed = speed + vars.disableRoads = useRoads + vars.point = routines.utils.zoneToVec3(point) + routines.groupToRandomPoint(vars) + + return +end + + +routines.getLeadPos = function(group) + if type(group) == 'string' then -- group name + group = Group.getByName(group) + end + + local units = group:getUnits() + + local leader = units[1] + if not leader then -- SHOULD be good, but if there is a bug, this code future-proofs it then. + local lowestInd = math.huge + for ind, unit in pairs(units) do + if ind < lowestInd then + lowestInd = ind + leader = unit + end + end + end + if leader and Unit.isExist(leader) then -- maybe a little too paranoid now... + return leader:getPosition().p + end +end + +--[[ vars for routines.getMGRSString: +vars.units - table of unit names (NOT unitNameTable- maybe this should change). +vars.acc - integer between 0 and 5, inclusive +]] +routines.getMGRSString = function(vars) + local units = vars.units + local acc = vars.acc or 5 + local avgPos = routines.getAvgPos(units) + if avgPos then + return routines.tostringMGRS(coord.LLtoMGRS(coord.LOtoLL(avgPos)), acc) + end +end + +--[[ vars for routines.getLLString +vars.units - table of unit names (NOT unitNameTable- maybe this should change). +vars.acc - integer, number of numbers after decimal place +vars.DMS - if true, output in degrees, minutes, seconds. Otherwise, output in degrees, minutes. + + +]] +routines.getLLString = function(vars) + local units = vars.units + local acc = vars.acc or 3 + local DMS = vars.DMS + local avgPos = routines.getAvgPos(units) + if avgPos then + local lat, lon = coord.LOtoLL(avgPos) + return routines.tostringLL(lat, lon, acc, DMS) + end +end + +--[[ +vars.zone - table of a zone name. +vars.ref - vec3 ref point, maybe overload for vec2 as well? +vars.alt - boolean, if used, includes altitude in string +vars.metric - boolean, gives distance in km instead of NM. +]] +routines.getBRStringZone = function(vars) + local zone = trigger.misc.getZone( vars.zone ) + local ref = routines.utils.makeVec3(vars.ref, 0) -- turn it into Vec3 if it is not already. + local alt = vars.alt + local metric = vars.metric + if zone then + local vec = {x = zone.point.x - ref.x, y = zone.point.y - ref.y, z = zone.point.z - ref.z} + local dir = routines.utils.getDir(vec, ref) + local dist = routines.utils.get2DDist(zone.point, ref) + if alt then + alt = zone.y + end + return routines.tostringBR(dir, dist, alt, metric) + else + env.info( 'routines.getBRStringZone: error: zone is nil' ) + end +end + +--[[ +vars.units- table of unit names (NOT unitNameTable- maybe this should change). +vars.ref - vec3 ref point, maybe overload for vec2 as well? +vars.alt - boolean, if used, includes altitude in string +vars.metric - boolean, gives distance in km instead of NM. +]] +routines.getBRString = function(vars) + local units = vars.units + local ref = routines.utils.makeVec3(vars.ref, 0) -- turn it into Vec3 if it is not already. + local alt = vars.alt + local metric = vars.metric + local avgPos = routines.getAvgPos(units) + if avgPos then + local vec = {x = avgPos.x - ref.x, y = avgPos.y - ref.y, z = avgPos.z - ref.z} + local dir = routines.utils.getDir(vec, ref) + local dist = routines.utils.get2DDist(avgPos, ref) + if alt then + alt = avgPos.y + end + return routines.tostringBR(dir, dist, alt, metric) + end +end + + +-- Returns the Vec3 coordinates of the average position of the concentration of units most in the heading direction. +--[[ vars for routines.getLeadingPos: +vars.units - table of unit names +vars.heading - direction +vars.radius - number +vars.headingDegrees - boolean, switches heading to degrees +]] +routines.getLeadingPos = function(vars) + local units = vars.units + local heading = vars.heading + local radius = vars.radius + if vars.headingDegrees then + heading = routines.utils.toRadian(vars.headingDegrees) + end + + local unitPosTbl = {} + for i = 1, #units do + local unit = Unit.getByName(units[i]) + if unit and unit:isExist() then + unitPosTbl[#unitPosTbl + 1] = unit:getPosition().p + end + end + if #unitPosTbl > 0 then -- one more more units found. + -- first, find the unit most in the heading direction + local maxPos = -math.huge + + local maxPosInd -- maxPos - the furthest in direction defined by heading; maxPosInd = + for i = 1, #unitPosTbl do + local rotatedVec2 = routines.vec.rotateVec2(routines.utils.makeVec2(unitPosTbl[i]), heading) + if (not maxPos) or maxPos < rotatedVec2.x then + maxPos = rotatedVec2.x + maxPosInd = i + end + end + + --now, get all the units around this unit... + local avgPos + if radius then + local maxUnitPos = unitPosTbl[maxPosInd] + local avgx, avgy, avgz, totNum = 0, 0, 0, 0 + for i = 1, #unitPosTbl do + if routines.utils.get2DDist(maxUnitPos, unitPosTbl[i]) <= radius then + avgx = avgx + unitPosTbl[i].x + avgy = avgy + unitPosTbl[i].y + avgz = avgz + unitPosTbl[i].z + totNum = totNum + 1 + end + end + avgPos = { x = avgx/totNum, y = avgy/totNum, z = avgz/totNum} + else + avgPos = unitPosTbl[maxPosInd] + end + + return avgPos + end +end + + +--[[ vars for routines.getLeadingMGRSString: +vars.units - table of unit names +vars.heading - direction +vars.radius - number +vars.headingDegrees - boolean, switches heading to degrees +vars.acc - number, 0 to 5. +]] +routines.getLeadingMGRSString = function(vars) + local pos = routines.getLeadingPos(vars) + if pos then + local acc = vars.acc or 5 + return routines.tostringMGRS(coord.LLtoMGRS(coord.LOtoLL(pos)), acc) + end +end + +--[[ vars for routines.getLeadingLLString: +vars.units - table of unit names +vars.heading - direction, number +vars.radius - number +vars.headingDegrees - boolean, switches heading to degrees +vars.acc - number of digits after decimal point (can be negative) +vars.DMS - boolean, true if you want DMS. +]] +routines.getLeadingLLString = function(vars) + local pos = routines.getLeadingPos(vars) + if pos then + local acc = vars.acc or 3 + local DMS = vars.DMS + local lat, lon = coord.LOtoLL(pos) + return routines.tostringLL(lat, lon, acc, DMS) + end +end + + + +--[[ vars for routines.getLeadingBRString: +vars.units - table of unit names +vars.heading - direction, number +vars.radius - number +vars.headingDegrees - boolean, switches heading to degrees +vars.metric - boolean, if true, use km instead of NM. +vars.alt - boolean, if true, include altitude. +vars.ref - vec3/vec2 reference point. +]] +routines.getLeadingBRString = function(vars) + local pos = routines.getLeadingPos(vars) + if pos then + local ref = vars.ref + local alt = vars.alt + local metric = vars.metric + + local vec = {x = pos.x - ref.x, y = pos.y - ref.y, z = pos.z - ref.z} + local dir = routines.utils.getDir(vec, ref) + local dist = routines.utils.get2DDist(pos, ref) + if alt then + alt = pos.y + end + return routines.tostringBR(dir, dist, alt, metric) + end +end + +--[[ vars for routines.message.add + vars.text = 'Hello World' + vars.displayTime = 20 + vars.msgFor = {coa = {'red'}, countries = {'Ukraine', 'Georgia'}, unitTypes = {'A-10C'}} + +]] + +--[[ vars for routines.msgMGRS +vars.units - table of unit names (NOT unitNameTable- maybe this should change). +vars.acc - integer between 0 and 5, inclusive +vars.text - text in the message +vars.displayTime - self explanatory +vars.msgFor - scope +]] +routines.msgMGRS = function(vars) + local units = vars.units + local acc = vars.acc + local text = vars.text + local displayTime = vars.displayTime + local msgFor = vars.msgFor + + local s = routines.getMGRSString{units = units, acc = acc} + local newText + if string.find(text, '%%s') then -- look for %s + newText = string.format(text, s) -- insert the coordinates into the message + else -- else, just append to the end. + newText = text .. s + end + + routines.message.add{ + text = newText, + displayTime = displayTime, + msgFor = msgFor + } +end + +--[[ vars for routines.msgLL +vars.units - table of unit names (NOT unitNameTable- maybe this should change) (Yes). +vars.acc - integer, number of numbers after decimal place +vars.DMS - if true, output in degrees, minutes, seconds. Otherwise, output in degrees, minutes. +vars.text - text in the message +vars.displayTime - self explanatory +vars.msgFor - scope +]] +routines.msgLL = function(vars) + local units = vars.units -- technically, I don't really need to do this, but it helps readability. + local acc = vars.acc + local DMS = vars.DMS + local text = vars.text + local displayTime = vars.displayTime + local msgFor = vars.msgFor + + local s = routines.getLLString{units = units, acc = acc, DMS = DMS} + local newText + if string.find(text, '%%s') then -- look for %s + newText = string.format(text, s) -- insert the coordinates into the message + else -- else, just append to the end. + newText = text .. s + end + + routines.message.add{ + text = newText, + displayTime = displayTime, + msgFor = msgFor + } + +end + + +--[[ +vars.units- table of unit names (NOT unitNameTable- maybe this should change). +vars.ref - vec3 ref point, maybe overload for vec2 as well? +vars.alt - boolean, if used, includes altitude in string +vars.metric - boolean, gives distance in km instead of NM. +vars.text - text of the message +vars.displayTime +vars.msgFor - scope +]] +routines.msgBR = function(vars) + local units = vars.units -- technically, I don't really need to do this, but it helps readability. + local ref = vars.ref -- vec2/vec3 will be handled in routines.getBRString + local alt = vars.alt + local metric = vars.metric + local text = vars.text + local displayTime = vars.displayTime + local msgFor = vars.msgFor + + local s = routines.getBRString{units = units, ref = ref, alt = alt, metric = metric} + local newText + if string.find(text, '%%s') then -- look for %s + newText = string.format(text, s) -- insert the coordinates into the message + else -- else, just append to the end. + newText = text .. s + end + + routines.message.add{ + text = newText, + displayTime = displayTime, + msgFor = msgFor + } + +end + + +-------------------------------------------------------------------------------------------- +-- basically, just sub-types of routines.msgBR... saves folks the work of getting the ref point. +--[[ +vars.units- table of unit names (NOT unitNameTable- maybe this should change). +vars.ref - string red, blue +vars.alt - boolean, if used, includes altitude in string +vars.metric - boolean, gives distance in km instead of NM. +vars.text - text of the message +vars.displayTime +vars.msgFor - scope +]] +routines.msgBullseye = function(vars) + if string.lower(vars.ref) == 'red' then + vars.ref = routines.DBs.missionData.bullseye.red + routines.msgBR(vars) + elseif string.lower(vars.ref) == 'blue' then + vars.ref = routines.DBs.missionData.bullseye.blue + routines.msgBR(vars) + end +end + +--[[ +vars.units- table of unit names (NOT unitNameTable- maybe this should change). +vars.ref - unit name of reference point +vars.alt - boolean, if used, includes altitude in string +vars.metric - boolean, gives distance in km instead of NM. +vars.text - text of the message +vars.displayTime +vars.msgFor - scope +]] + +routines.msgBRA = function(vars) + if Unit.getByName(vars.ref) then + vars.ref = Unit.getByName(vars.ref):getPosition().p + if not vars.alt then + vars.alt = true + end + routines.msgBR(vars) + end +end +-------------------------------------------------------------------------------------------- + +--[[ vars for routines.msgLeadingMGRS: +vars.units - table of unit names +vars.heading - direction +vars.radius - number +vars.headingDegrees - boolean, switches heading to degrees (optional) +vars.acc - number, 0 to 5. +vars.text - text of the message +vars.displayTime +vars.msgFor - scope +]] +routines.msgLeadingMGRS = function(vars) + local units = vars.units -- technically, I don't really need to do this, but it helps readability. + local heading = vars.heading + local radius = vars.radius + local headingDegrees = vars.headingDegrees + local acc = vars.acc + local text = vars.text + local displayTime = vars.displayTime + local msgFor = vars.msgFor + + local s = routines.getLeadingMGRSString{units = units, heading = heading, radius = radius, headingDegrees = headingDegrees, acc = acc} + local newText + if string.find(text, '%%s') then -- look for %s + newText = string.format(text, s) -- insert the coordinates into the message + else -- else, just append to the end. + newText = text .. s + end + + routines.message.add{ + text = newText, + displayTime = displayTime, + msgFor = msgFor + } + + +end +--[[ vars for routines.msgLeadingLL: +vars.units - table of unit names +vars.heading - direction, number +vars.radius - number +vars.headingDegrees - boolean, switches heading to degrees (optional) +vars.acc - number of digits after decimal point (can be negative) +vars.DMS - boolean, true if you want DMS. (optional) +vars.text - text of the message +vars.displayTime +vars.msgFor - scope +]] +routines.msgLeadingLL = function(vars) + local units = vars.units -- technically, I don't really need to do this, but it helps readability. + local heading = vars.heading + local radius = vars.radius + local headingDegrees = vars.headingDegrees + local acc = vars.acc + local DMS = vars.DMS + local text = vars.text + local displayTime = vars.displayTime + local msgFor = vars.msgFor + + local s = routines.getLeadingLLString{units = units, heading = heading, radius = radius, headingDegrees = headingDegrees, acc = acc, DMS = DMS} + local newText + if string.find(text, '%%s') then -- look for %s + newText = string.format(text, s) -- insert the coordinates into the message + else -- else, just append to the end. + newText = text .. s + end + + routines.message.add{ + text = newText, + displayTime = displayTime, + msgFor = msgFor + } + +end + +--[[ +vars.units - table of unit names +vars.heading - direction, number +vars.radius - number +vars.headingDegrees - boolean, switches heading to degrees (optional) +vars.metric - boolean, if true, use km instead of NM. (optional) +vars.alt - boolean, if true, include altitude. (optional) +vars.ref - vec3/vec2 reference point. +vars.text - text of the message +vars.displayTime +vars.msgFor - scope +]] +routines.msgLeadingBR = function(vars) + local units = vars.units -- technically, I don't really need to do this, but it helps readability. + local heading = vars.heading + local radius = vars.radius + local headingDegrees = vars.headingDegrees + local metric = vars.metric + local alt = vars.alt + local ref = vars.ref -- vec2/vec3 will be handled in routines.getBRString + local text = vars.text + local displayTime = vars.displayTime + local msgFor = vars.msgFor + + local s = routines.getLeadingBRString{units = units, heading = heading, radius = radius, headingDegrees = headingDegrees, metric = metric, alt = alt, ref = ref} + local newText + if string.find(text, '%%s') then -- look for %s + newText = string.format(text, s) -- insert the coordinates into the message + else -- else, just append to the end. + newText = text .. s + end + + routines.message.add{ + text = newText, + displayTime = displayTime, + msgFor = msgFor + } +end + + +function spairs(t, order) + -- collect the keys + local keys = {} + for k in pairs(t) do keys[#keys+1] = k end + + -- if order function given, sort by it by passing the table and keys a, b, + -- otherwise just sort the keys + if order then + table.sort(keys, function(a,b) return order(t, a, b) end) + else + table.sort(keys) + end + + -- return the iterator function + local i = 0 + return function() + i = i + 1 + if keys[i] then + return keys[i], t[keys[i]] + end + end +end + + +function routines.IsPartOfGroupInZones( CargoGroup, LandingZones ) +--trace.f() + + local CurrentZoneID = nil + + if CargoGroup then + local CargoUnits = CargoGroup:getUnits() + for CargoUnitID, CargoUnit in pairs( CargoUnits ) do + if CargoUnit and CargoUnit:getLife() >= 1.0 then + CurrentZoneID = routines.IsUnitInZones( CargoUnit, LandingZones ) + if CurrentZoneID then + break + end + end + end + end + +--trace.r( "", "", { CurrentZoneID } ) + return CurrentZoneID +end + + + +function routines.IsUnitInZones( TransportUnit, LandingZones ) +--trace.f("", "routines.IsUnitInZones" ) + + local TransportZoneResult = nil + local TransportZonePos = nil + local TransportZone = nil + + -- fill-up some local variables to support further calculations to determine location of units within the zone. + if TransportUnit then + local TransportUnitPos = TransportUnit:getPosition().p + if type( LandingZones ) == "table" then + for LandingZoneID, LandingZoneName in pairs( LandingZones ) do + TransportZone = trigger.misc.getZone( LandingZoneName ) + if TransportZone then + TransportZonePos = {radius = TransportZone.radius, x = TransportZone.point.x, y = TransportZone.point.y, z = TransportZone.point.z} + if ((( TransportUnitPos.x - TransportZonePos.x)^2 + (TransportUnitPos.z - TransportZonePos.z)^2)^0.5 <= TransportZonePos.radius) then + TransportZoneResult = LandingZoneID + break + end + end + end + else + TransportZone = trigger.misc.getZone( LandingZones ) + TransportZonePos = {radius = TransportZone.radius, x = TransportZone.point.x, y = TransportZone.point.y, z = TransportZone.point.z} + if ((( TransportUnitPos.x - TransportZonePos.x)^2 + (TransportUnitPos.z - TransportZonePos.z)^2)^0.5 <= TransportZonePos.radius) then + TransportZoneResult = 1 + end + end + if TransportZoneResult then + --trace.i( "routines", "TransportZone:" .. TransportZoneResult ) + else + --trace.i( "routines", "TransportZone:nil logic" ) + end + return TransportZoneResult + else + --trace.i( "routines", "TransportZone:nil hard" ) + return nil + end +end + +function routines.IsUnitNearZonesRadius( TransportUnit, LandingZones, ZoneRadius ) +--trace.f("", "routines.IsUnitInZones" ) + + local TransportZoneResult = nil + local TransportZonePos = nil + local TransportZone = nil + + -- fill-up some local variables to support further calculations to determine location of units within the zone. + if TransportUnit then + local TransportUnitPos = TransportUnit:getPosition().p + if type( LandingZones ) == "table" then + for LandingZoneID, LandingZoneName in pairs( LandingZones ) do + TransportZone = trigger.misc.getZone( LandingZoneName ) + if TransportZone then + TransportZonePos = {radius = TransportZone.radius, x = TransportZone.point.x, y = TransportZone.point.y, z = TransportZone.point.z} + if ((( TransportUnitPos.x - TransportZonePos.x)^2 + (TransportUnitPos.z - TransportZonePos.z)^2)^0.5 <= ZoneRadius ) then + TransportZoneResult = LandingZoneID + break + end + end + end + else + TransportZone = trigger.misc.getZone( LandingZones ) + TransportZonePos = {radius = TransportZone.radius, x = TransportZone.point.x, y = TransportZone.point.y, z = TransportZone.point.z} + if ((( TransportUnitPos.x - TransportZonePos.x)^2 + (TransportUnitPos.z - TransportZonePos.z)^2)^0.5 <= ZoneRadius ) then + TransportZoneResult = 1 + end + end + if TransportZoneResult then + --trace.i( "routines", "TransportZone:" .. TransportZoneResult ) + else + --trace.i( "routines", "TransportZone:nil logic" ) + end + return TransportZoneResult + else + --trace.i( "routines", "TransportZone:nil hard" ) + return nil + end +end + + +function routines.IsStaticInZones( TransportStatic, LandingZones ) +--trace.f() + + local TransportZoneResult = nil + local TransportZonePos = nil + local TransportZone = nil + + -- fill-up some local variables to support further calculations to determine location of units within the zone. + local TransportStaticPos = TransportStatic:getPosition().p + if type( LandingZones ) == "table" then + for LandingZoneID, LandingZoneName in pairs( LandingZones ) do + TransportZone = trigger.misc.getZone( LandingZoneName ) + if TransportZone then + TransportZonePos = {radius = TransportZone.radius, x = TransportZone.point.x, y = TransportZone.point.y, z = TransportZone.point.z} + if ((( TransportStaticPos.x - TransportZonePos.x)^2 + (TransportStaticPos.z - TransportZonePos.z)^2)^0.5 <= TransportZonePos.radius) then + TransportZoneResult = LandingZoneID + break + end + end + end + else + TransportZone = trigger.misc.getZone( LandingZones ) + TransportZonePos = {radius = TransportZone.radius, x = TransportZone.point.x, y = TransportZone.point.y, z = TransportZone.point.z} + if ((( TransportStaticPos.x - TransportZonePos.x)^2 + (TransportStaticPos.z - TransportZonePos.z)^2)^0.5 <= TransportZonePos.radius) then + TransportZoneResult = 1 + end + end + +--trace.r( "", "", { TransportZoneResult } ) + return TransportZoneResult +end + + +function routines.IsUnitInRadius( CargoUnit, ReferencePosition, Radius ) +--trace.f() + + local Valid = true + + -- fill-up some local variables to support further calculations to determine location of units within the zone. + local CargoPos = CargoUnit:getPosition().p + local ReferenceP = ReferencePosition.p + + if (((CargoPos.x - ReferenceP.x)^2 + (CargoPos.z - ReferenceP.z)^2)^0.5 <= Radius) then + else + Valid = false + end + + return Valid +end + +function routines.IsPartOfGroupInRadius( CargoGroup, ReferencePosition, Radius ) +--trace.f() + + local Valid = true + + Valid = routines.ValidateGroup( CargoGroup, "CargoGroup", Valid ) + + -- fill-up some local variables to support further calculations to determine location of units within the zone + local CargoUnits = CargoGroup:getUnits() + for CargoUnitId, CargoUnit in pairs( CargoUnits ) do + local CargoUnitPos = CargoUnit:getPosition().p +-- env.info( 'routines.IsPartOfGroupInRadius: CargoUnitPos.x = ' .. CargoUnitPos.x .. ' CargoUnitPos.z = ' .. CargoUnitPos.z ) + local ReferenceP = ReferencePosition.p +-- env.info( 'routines.IsPartOfGroupInRadius: ReferenceGroupPos.x = ' .. ReferenceGroupPos.x .. ' ReferenceGroupPos.z = ' .. ReferenceGroupPos.z ) + + if ((( CargoUnitPos.x - ReferenceP.x)^2 + (CargoUnitPos.z - ReferenceP.z)^2)^0.5 <= Radius) then + else + Valid = false + break + end + end + + return Valid +end + + +function routines.ValidateString( Variable, VariableName, Valid ) +--trace.f() + + if type( Variable ) == "string" then + if Variable == "" then + error( "routines.ValidateString: error: " .. VariableName .. " must be filled out!" ) + Valid = false + end + else + error( "routines.ValidateString: error: " .. VariableName .. " is not a string." ) + Valid = false + end + +--trace.r( "", "", { Valid } ) + return Valid +end + +function routines.ValidateNumber( Variable, VariableName, Valid ) +--trace.f() + + if type( Variable ) == "number" then + else + error( "routines.ValidateNumber: error: " .. VariableName .. " is not a number." ) + Valid = false + end + +--trace.r( "", "", { Valid } ) + return Valid + +end + +function routines.ValidateGroup( Variable, VariableName, Valid ) +--trace.f() + + if Variable == nil then + error( "routines.ValidateGroup: error: " .. VariableName .. " is a nil value!" ) + Valid = false + end + +--trace.r( "", "", { Valid } ) + return Valid +end + +function routines.ValidateZone( LandingZones, VariableName, Valid ) +--trace.f() + + if LandingZones == nil then + error( "routines.ValidateGroup: error: " .. VariableName .. " is a nil value!" ) + Valid = false + end + + if type( LandingZones ) == "table" then + for LandingZoneID, LandingZoneName in pairs( LandingZones ) do + if trigger.misc.getZone( LandingZoneName ) == nil then + error( "routines.ValidateGroup: error: Zone " .. LandingZoneName .. " does not exist!" ) + Valid = false + break + end + end + else + if trigger.misc.getZone( LandingZones ) == nil then + error( "routines.ValidateGroup: error: Zone " .. LandingZones .. " does not exist!" ) + Valid = false + end + end + +--trace.r( "", "", { Valid } ) + return Valid +end + +function routines.ValidateEnumeration( Variable, VariableName, Enum, Valid ) +--trace.f() + + local ValidVariable = false + + for EnumId, EnumData in pairs( Enum ) do + if Variable == EnumData then + ValidVariable = true + break + end + end + + if ValidVariable then + else + error( 'TransportValidateEnum: " .. VariableName .. " is not a valid type.' .. Variable ) + Valid = false + end + +--trace.r( "", "", { Valid } ) + return Valid +end + +function routines.getGroupRoute(groupIdent, task) -- same as getGroupPoints but returns speed and formation type along with vec2 of point} + -- refactor to search by groupId and allow groupId and groupName as inputs + local gpId = groupIdent + if type(groupIdent) == 'string' and not tonumber(groupIdent) then + gpId = _DATABASE.Templates.Groups[groupIdent].groupId + end + + for coa_name, coa_data in pairs(env.mission.coalition) do + if (coa_name == 'red' or coa_name == 'blue') and type(coa_data) == 'table' then + if coa_data.country then --there is a country table + for cntry_id, cntry_data in pairs(coa_data.country) do + for obj_type_name, obj_type_data in pairs(cntry_data) do + if obj_type_name == "helicopter" or obj_type_name == "ship" or obj_type_name == "plane" or obj_type_name == "vehicle" then -- only these types have points + if ((type(obj_type_data) == 'table') and obj_type_data.group and (type(obj_type_data.group) == 'table') and (#obj_type_data.group > 0)) then --there's a group! + for group_num, group_data in pairs(obj_type_data.group) do + if group_data and group_data.groupId == gpId then -- this is the group we are looking for + if group_data.route and group_data.route.points and #group_data.route.points > 0 then + local points = {} + + for point_num, point in pairs(group_data.route.points) do + local routeData = {} + if not point.point then + routeData.x = point.x + routeData.y = point.y + else + routeData.point = point.point --it's possible that the ME could move to the point = Vec2 notation. + end + routeData.form = point.action + routeData.speed = point.speed + routeData.alt = point.alt + routeData.alt_type = point.alt_type + routeData.airdromeId = point.airdromeId + routeData.helipadId = point.helipadId + routeData.type = point.type + routeData.action = point.action + if task then + routeData.task = point.task + end + points[point_num] = routeData + end + + return points + end + return + end --if group_data and group_data.name and group_data.name == 'groupname' + end --for group_num, group_data in pairs(obj_type_data.group) do + end --if ((type(obj_type_data) == 'table') and obj_type_data.group and (type(obj_type_data.group) == 'table') and (#obj_type_data.group > 0)) then + end --if obj_type_name == "helicopter" or obj_type_name == "ship" or obj_type_name == "plane" or obj_type_name == "vehicle" or obj_type_name == "static" then + end --for obj_type_name, obj_type_data in pairs(cntry_data) do + end --for cntry_id, cntry_data in pairs(coa_data.country) do + end --if coa_data.country then --there is a country table + end --if coa_name == 'red' or coa_name == 'blue' and type(coa_data) == 'table' then + end --for coa_name, coa_data in pairs(mission.coalition) do +end + +routines.ground.patrolRoute = function(vars) + + + local tempRoute = {} + local useRoute = {} + local gpData = vars.gpData + if type(gpData) == 'string' then + gpData = Group.getByName(gpData) + end + + local useGroupRoute + if not vars.useGroupRoute then + useGroupRoute = vars.gpData + else + useGroupRoute = vars.useGroupRoute + end + local routeProvided = false + if not vars.route then + if useGroupRoute then + tempRoute = routines.getGroupRoute(useGroupRoute) + end + else + useRoute = vars.route + local posStart = routines.getLeadPos(gpData) + useRoute[1] = routines.ground.buildWP(posStart, useRoute[1].action, useRoute[1].speed) + routeProvided = true + end + + + local overRideSpeed = vars.speed or 'default' + local pType = vars.pType + local offRoadForm = vars.offRoadForm or 'default' + local onRoadForm = vars.onRoadForm or 'default' + + if routeProvided == false and #tempRoute > 0 then + local posStart = routines.getLeadPos(gpData) + + + useRoute[#useRoute + 1] = routines.ground.buildWP(posStart, offRoadForm, overRideSpeed) + for i = 1, #tempRoute do + local tempForm = tempRoute[i].action + local tempSpeed = tempRoute[i].speed + + if offRoadForm == 'default' then + tempForm = tempRoute[i].action + end + if onRoadForm == 'default' then + onRoadForm = 'On Road' + end + if (string.lower(tempRoute[i].action) == 'on road' or string.lower(tempRoute[i].action) == 'onroad' or string.lower(tempRoute[i].action) == 'on_road') then + tempForm = onRoadForm + else + tempForm = offRoadForm + end + + if type(overRideSpeed) == 'number' then + tempSpeed = overRideSpeed + end + + + useRoute[#useRoute + 1] = routines.ground.buildWP(tempRoute[i], tempForm, tempSpeed) + end + + if pType and string.lower(pType) == 'doubleback' then + local curRoute = routines.utils.deepCopy(useRoute) + for i = #curRoute, 2, -1 do + useRoute[#useRoute + 1] = routines.ground.buildWP(curRoute[i], curRoute[i].action, curRoute[i].speed) + end + end + + useRoute[1].action = useRoute[#useRoute].action -- make it so the first WP matches the last WP + end + + local cTask3 = {} + local newPatrol = {} + newPatrol.route = useRoute + newPatrol.gpData = gpData:getName() + cTask3[#cTask3 + 1] = 'routines.ground.patrolRoute(' + cTask3[#cTask3 + 1] = routines.utils.oneLineSerialize(newPatrol) + cTask3[#cTask3 + 1] = ')' + cTask3 = table.concat(cTask3) + local tempTask = { + id = 'WrappedAction', + params = { + action = { + id = 'Script', + params = { + command = cTask3, + + }, + }, + }, + } + + + useRoute[#useRoute].task = tempTask + routines.goRoute(gpData, useRoute) + + return +end + +routines.ground.patrol = function(gpData, pType, form, speed) + local vars = {} + + if type(gpData) == 'table' and gpData:getName() then + gpData = gpData:getName() + end + + vars.useGroupRoute = gpData + vars.gpData = gpData + vars.pType = pType + vars.offRoadForm = form + vars.speed = speed + + routines.ground.patrolRoute(vars) + + return +end + +function routines.GetUnitHeight( CheckUnit ) +--trace.f( "routines" ) + + local UnitPoint = CheckUnit:getPoint() + local UnitPosition = { x = UnitPoint.x, y = UnitPoint.z } + local UnitHeight = UnitPoint.y + + local LandHeight = land.getHeight( UnitPosition ) + + --env.info(( 'CarrierHeight: LandHeight = ' .. LandHeight .. ' CarrierHeight = ' .. CarrierHeight )) + + --trace.f( "routines", "Unit Height = " .. UnitHeight - LandHeight ) + + return UnitHeight - LandHeight + +end + + + +Su34Status = { status = {} } +boardMsgRed = { statusMsg = "" } +boardMsgAll = { timeMsg = "" } +SpawnSettings = {} +Su34MenuPath = {} +Su34Menus = 0 + + +function Su34AttackCarlVinson(groupName) +--trace.menu("", "Su34AttackCarlVinson") + local groupSu34 = Group.getByName( groupName ) + local controllerSu34 = groupSu34.getController(groupSu34) + local groupCarlVinson = Group.getByName("US Carl Vinson #001") + controllerSu34.setOption( controllerSu34, AI.Option.Air.id.ROE, AI.Option.Air.val.ROE.OPEN_FIRE ) + controllerSu34.setOption( controllerSu34, AI.Option.Air.id.REACTION_ON_THREAT, AI.Option.Air.val.REACTION_ON_THREAT.EVADE_FIRE ) + if groupCarlVinson ~= nil then + controllerSu34.pushTask(controllerSu34,{id = 'AttackGroup', params = { groupId = groupCarlVinson:getID(), expend = AI.Task.WeaponExpend.ALL, attackQtyLimit = true}}) + end + Su34Status.status[groupName] = 1 + MessageToRed( string.format('%s: ',groupName) .. 'Attacking carrier Carl Vinson. ', 10, 'RedStatus' .. groupName ) +end + +function Su34AttackWest(groupName) +--trace.f("","Su34AttackWest") + local groupSu34 = Group.getByName( groupName ) + local controllerSu34 = groupSu34.getController(groupSu34) + local groupShipWest1 = Group.getByName("US Ship West #001") + local groupShipWest2 = Group.getByName("US Ship West #002") + controllerSu34.setOption( controllerSu34, AI.Option.Air.id.ROE, AI.Option.Air.val.ROE.OPEN_FIRE ) + controllerSu34.setOption( controllerSu34, AI.Option.Air.id.REACTION_ON_THREAT, AI.Option.Air.val.REACTION_ON_THREAT.EVADE_FIRE ) + if groupShipWest1 ~= nil then + controllerSu34.pushTask(controllerSu34,{id = 'AttackGroup', params = { groupId = groupShipWest1:getID(), expend = AI.Task.WeaponExpend.ALL, attackQtyLimit = true}}) + end + if groupShipWest2 ~= nil then + controllerSu34.pushTask(controllerSu34,{id = 'AttackGroup', params = { groupId = groupShipWest2:getID(), expend = AI.Task.WeaponExpend.ALL, attackQtyLimit = true}}) + end + Su34Status.status[groupName] = 2 + MessageToRed( string.format('%s: ',groupName) .. 'Attacking invading ships in the west. ', 10, 'RedStatus' .. groupName ) +end + +function Su34AttackNorth(groupName) +--trace.menu("","Su34AttackNorth") + local groupSu34 = Group.getByName( groupName ) + local controllerSu34 = groupSu34.getController(groupSu34) + local groupShipNorth1 = Group.getByName("US Ship North #001") + local groupShipNorth2 = Group.getByName("US Ship North #002") + local groupShipNorth3 = Group.getByName("US Ship North #003") + controllerSu34.setOption( controllerSu34, AI.Option.Air.id.ROE, AI.Option.Air.val.ROE.OPEN_FIRE ) + controllerSu34.setOption( controllerSu34, AI.Option.Air.id.REACTION_ON_THREAT, AI.Option.Air.val.REACTION_ON_THREAT.EVADE_FIRE ) + if groupShipNorth1 ~= nil then + controllerSu34.pushTask(controllerSu34,{id = 'AttackGroup', params = { groupId = groupShipNorth1:getID(), expend = AI.Task.WeaponExpend.ALL, attackQtyLimit = false}}) + end + if groupShipNorth2 ~= nil then + controllerSu34.pushTask(controllerSu34,{id = 'AttackGroup', params = { groupId = groupShipNorth2:getID(), expend = AI.Task.WeaponExpend.ALL, attackQtyLimit = false}}) + end + if groupShipNorth3 ~= nil then + controllerSu34.pushTask(controllerSu34,{id = 'AttackGroup', params = { groupId = groupShipNorth3:getID(), expend = AI.Task.WeaponExpend.ALL, attackQtyLimit = false}}) + end + Su34Status.status[groupName] = 3 + MessageToRed( string.format('%s: ',groupName) .. 'Attacking invading ships in the north. ', 10, 'RedStatus' .. groupName ) +end + +function Su34Orbit(groupName) +--trace.menu("","Su34Orbit") + local groupSu34 = Group.getByName( groupName ) + local controllerSu34 = groupSu34:getController() + controllerSu34.setOption( controllerSu34, AI.Option.Air.id.ROE, AI.Option.Air.val.ROE.WEAPON_HOLD ) + controllerSu34.setOption( controllerSu34, AI.Option.Air.id.REACTION_ON_THREAT, AI.Option.Air.val.REACTION_ON_THREAT.EVADE_FIRE ) + controllerSu34:pushTask( {id = 'ControlledTask', params = { task = { id = 'Orbit', params = { pattern = AI.Task.OrbitPattern.RACE_TRACK } }, stopCondition = { duration = 600 } } } ) + Su34Status.status[groupName] = 4 + MessageToRed( string.format('%s: ',groupName) .. 'In orbit and awaiting further instructions. ', 10, 'RedStatus' .. groupName ) +end + +function Su34TakeOff(groupName) +--trace.menu("","Su34TakeOff") + local groupSu34 = Group.getByName( groupName ) + local controllerSu34 = groupSu34:getController() + controllerSu34.setOption( controllerSu34, AI.Option.Air.id.ROE, AI.Option.Air.val.ROE.WEAPON_HOLD ) + controllerSu34.setOption( controllerSu34, AI.Option.Air.id.REACTION_ON_THREAT, AI.Option.Air.val.REACTION_ON_THREAT.BYPASS_AND_ESCAPE ) + Su34Status.status[groupName] = 8 + MessageToRed( string.format('%s: ',groupName) .. 'Take-Off. ', 10, 'RedStatus' .. groupName ) +end + +function Su34Hold(groupName) +--trace.menu("","Su34Hold") + local groupSu34 = Group.getByName( groupName ) + local controllerSu34 = groupSu34:getController() + controllerSu34.setOption( controllerSu34, AI.Option.Air.id.ROE, AI.Option.Air.val.ROE.WEAPON_HOLD ) + controllerSu34.setOption( controllerSu34, AI.Option.Air.id.REACTION_ON_THREAT, AI.Option.Air.val.REACTION_ON_THREAT.BYPASS_AND_ESCAPE ) + Su34Status.status[groupName] = 5 + MessageToRed( string.format('%s: ',groupName) .. 'Holding Weapons. ', 10, 'RedStatus' .. groupName ) +end + +function Su34RTB(groupName) +--trace.menu("","Su34RTB") + Su34Status.status[groupName] = 6 + MessageToRed( string.format('%s: ',groupName) .. 'Return to Krasnodar. ', 10, 'RedStatus' .. groupName ) +end + +function Su34Destroyed(groupName) +--trace.menu("","Su34Destroyed") + Su34Status.status[groupName] = 7 + MessageToRed( string.format('%s: ',groupName) .. 'Destroyed. ', 30, 'RedStatus' .. groupName ) +end + +function GroupAlive( groupName ) +--trace.menu("","GroupAlive") + local groupTest = Group.getByName( groupName ) + + local groupExists = false + + if groupTest then + groupExists = groupTest:isExist() + end + + --trace.r( "", "", { groupExists } ) + return groupExists +end + +function Su34IsDead() +--trace.f() + +end + +function Su34OverviewStatus() +--trace.menu("","Su34OverviewStatus") + local msg = "" + local currentStatus = 0 + local Exists = false + + for groupName, currentStatus in pairs(Su34Status.status) do + + env.info(('Su34 Overview Status: GroupName = ' .. groupName )) + Alive = GroupAlive( groupName ) + + if Alive then + if currentStatus == 1 then + msg = msg .. string.format("%s: ",groupName) + msg = msg .. "Attacking carrier Carl Vinson. " + elseif currentStatus == 2 then + msg = msg .. string.format("%s: ",groupName) + msg = msg .. "Attacking supporting ships in the west. " + elseif currentStatus == 3 then + msg = msg .. string.format("%s: ",groupName) + msg = msg .. "Attacking invading ships in the north. " + elseif currentStatus == 4 then + msg = msg .. string.format("%s: ",groupName) + msg = msg .. "In orbit and awaiting further instructions. " + elseif currentStatus == 5 then + msg = msg .. string.format("%s: ",groupName) + msg = msg .. "Holding Weapons. " + elseif currentStatus == 6 then + msg = msg .. string.format("%s: ",groupName) + msg = msg .. "Return to Krasnodar. " + elseif currentStatus == 7 then + msg = msg .. string.format("%s: ",groupName) + msg = msg .. "Destroyed. " + elseif currentStatus == 8 then + msg = msg .. string.format("%s: ",groupName) + msg = msg .. "Take-Off. " + end + else + if currentStatus == 7 then + msg = msg .. string.format("%s: ",groupName) + msg = msg .. "Destroyed. " + else + Su34Destroyed(groupName) + end + end + end + + boardMsgRed.statusMsg = msg +end + + +function UpdateBoardMsg() +--trace.f() + Su34OverviewStatus() + MessageToRed( boardMsgRed.statusMsg, 15, 'RedStatus' ) +end + +function MusicReset( flg ) +--trace.f() + trigger.action.setUserFlag(95,flg) +end + +function PlaneActivate(groupNameFormat, flg) +--trace.f() + local groupName = groupNameFormat .. string.format("#%03d", trigger.misc.getUserFlag(flg)) + --trigger.action.outText(groupName,10) + trigger.action.activateGroup(Group.getByName(groupName)) +end + +function Su34Menu(groupName) +--trace.f() + + --env.info(( 'Su34Menu(' .. groupName .. ')' )) + local groupSu34 = Group.getByName( groupName ) + + if Su34Status.status[groupName] == 1 or + Su34Status.status[groupName] == 2 or + Su34Status.status[groupName] == 3 or + Su34Status.status[groupName] == 4 or + Su34Status.status[groupName] == 5 then + if Su34MenuPath[groupName] == nil then + if planeMenuPath == nil then + planeMenuPath = missionCommands.addSubMenuForCoalition( + coalition.side.RED, + "SU-34 anti-ship flights", + nil + ) + end + Su34MenuPath[groupName] = missionCommands.addSubMenuForCoalition( + coalition.side.RED, + "Flight " .. groupName, + planeMenuPath + ) + + missionCommands.addCommandForCoalition( + coalition.side.RED, + "Attack carrier Carl Vinson", + Su34MenuPath[groupName], + Su34AttackCarlVinson, + groupName + ) + + missionCommands.addCommandForCoalition( + coalition.side.RED, + "Attack ships in the west", + Su34MenuPath[groupName], + Su34AttackWest, + groupName + ) + + missionCommands.addCommandForCoalition( + coalition.side.RED, + "Attack ships in the north", + Su34MenuPath[groupName], + Su34AttackNorth, + groupName + ) + + missionCommands.addCommandForCoalition( + coalition.side.RED, + "Hold position and await instructions", + Su34MenuPath[groupName], + Su34Orbit, + groupName + ) + + missionCommands.addCommandForCoalition( + coalition.side.RED, + "Report status", + Su34MenuPath[groupName], + Su34OverviewStatus + ) + end + else + if Su34MenuPath[groupName] then + missionCommands.removeItemForCoalition(coalition.side.RED, Su34MenuPath[groupName]) + end + end +end + +--- Obsolete function, but kept to rework in framework. + +function ChooseInfantry ( TeleportPrefixTable, TeleportMax ) +--trace.f("Spawn") + --env.info(( 'ChooseInfantry: ' )) + + TeleportPrefixTableCount = #TeleportPrefixTable + TeleportPrefixTableIndex = math.random( 1, TeleportPrefixTableCount ) + + --env.info(( 'ChooseInfantry: TeleportPrefixTableIndex = ' .. TeleportPrefixTableIndex .. ' TeleportPrefixTableCount = ' .. TeleportPrefixTableCount .. ' TeleportMax = ' .. TeleportMax )) + + local TeleportFound = false + local TeleportLoop = true + local Index = TeleportPrefixTableIndex + local TeleportPrefix = '' + + while TeleportLoop do + TeleportPrefix = TeleportPrefixTable[Index] + if SpawnSettings[TeleportPrefix] then + if SpawnSettings[TeleportPrefix]['SpawnCount'] - 1 < TeleportMax then + SpawnSettings[TeleportPrefix]['SpawnCount'] = SpawnSettings[TeleportPrefix]['SpawnCount'] + 1 + TeleportFound = true + else + TeleportFound = false + end + else + SpawnSettings[TeleportPrefix] = {} + SpawnSettings[TeleportPrefix]['SpawnCount'] = 0 + TeleportFound = true + end + if TeleportFound then + TeleportLoop = false + else + if Index < TeleportPrefixTableCount then + Index = Index + 1 + else + TeleportLoop = false + end + end + --env.info(( 'ChooseInfantry: Loop 1 - TeleportPrefix = ' .. TeleportPrefix .. ' Index = ' .. Index )) + end + + if TeleportFound == false then + TeleportLoop = true + Index = 1 + while TeleportLoop do + TeleportPrefix = TeleportPrefixTable[Index] + if SpawnSettings[TeleportPrefix] then + if SpawnSettings[TeleportPrefix]['SpawnCount'] - 1 < TeleportMax then + SpawnSettings[TeleportPrefix]['SpawnCount'] = SpawnSettings[TeleportPrefix]['SpawnCount'] + 1 + TeleportFound = true + else + TeleportFound = false + end + else + SpawnSettings[TeleportPrefix] = {} + SpawnSettings[TeleportPrefix]['SpawnCount'] = 0 + TeleportFound = true + end + if TeleportFound then + TeleportLoop = false + else + if Index < TeleportPrefixTableIndex then + Index = Index + 1 + else + TeleportLoop = false + end + end + --env.info(( 'ChooseInfantry: Loop 2 - TeleportPrefix = ' .. TeleportPrefix .. ' Index = ' .. Index )) + end + end + + local TeleportGroupName = '' + if TeleportFound == true then + TeleportGroupName = TeleportPrefix .. string.format("#%03d", SpawnSettings[TeleportPrefix]['SpawnCount'] ) + else + TeleportGroupName = '' + end + + --env.info(('ChooseInfantry: TeleportGroupName = ' .. TeleportGroupName )) + --env.info(('ChooseInfantry: return')) + + return TeleportGroupName +end + +SpawnedInfantry = 0 + +function LandCarrier ( CarrierGroup, LandingZonePrefix ) +--trace.f() + --env.info(( 'LandCarrier: ' )) + --env.info(( 'LandCarrier: CarrierGroup = ' .. CarrierGroup:getName() )) + --env.info(( 'LandCarrier: LandingZone = ' .. LandingZonePrefix )) + + local controllerGroup = CarrierGroup:getController() + + local LandingZone = trigger.misc.getZone(LandingZonePrefix) + local LandingZonePos = {} + LandingZonePos.x = LandingZone.point.x + math.random(LandingZone.radius * -1, LandingZone.radius) + LandingZonePos.y = LandingZone.point.z + math.random(LandingZone.radius * -1, LandingZone.radius) + + controllerGroup:pushTask( { id = 'Land', params = { point = LandingZonePos, durationFlag = true, duration = 10 } } ) + + --env.info(( 'LandCarrier: end' )) +end + +EscortCount = 0 +function EscortCarrier ( CarrierGroup, EscortPrefix, EscortLastWayPoint, EscortEngagementDistanceMax, EscortTargetTypes ) +--trace.f() + --env.info(( 'EscortCarrier: ' )) + --env.info(( 'EscortCarrier: CarrierGroup = ' .. CarrierGroup:getName() )) + --env.info(( 'EscortCarrier: EscortPrefix = ' .. EscortPrefix )) + + local CarrierName = CarrierGroup:getName() + + local EscortMission = {} + local CarrierMission = {} + + local EscortMission = SpawnMissionGroup( EscortPrefix ) + local CarrierMission = SpawnMissionGroup( CarrierGroup:getName() ) + + if EscortMission ~= nil and CarrierMission ~= nil then + + EscortCount = EscortCount + 1 + EscortMissionName = string.format( EscortPrefix .. '#Escort %s', CarrierName ) + EscortMission.name = EscortMissionName + EscortMission.groupId = nil + EscortMission.lateActivation = false + EscortMission.taskSelected = false + + local EscortUnits = #EscortMission.units + for u = 1, EscortUnits do + EscortMission.units[u].name = string.format( EscortPrefix .. '#Escort %s %02d', CarrierName, u ) + EscortMission.units[u].unitId = nil + end + + + EscortMission.route.points[1].task = { id = "ComboTask", + params = + { + tasks = + { + [1] = + { + enabled = true, + auto = false, + id = "Escort", + number = 1, + params = + { + lastWptIndexFlagChangedManually = false, + groupId = CarrierGroup:getID(), + lastWptIndex = nil, + lastWptIndexFlag = false, + engagementDistMax = EscortEngagementDistanceMax, + targetTypes = EscortTargetTypes, + pos = + { + y = 20, + x = 20, + z = 0, + } -- end of ["pos"] + } -- end of ["params"] + } -- end of [1] + } -- end of ["tasks"] + } -- end of ["params"] + } -- end of ["task"] + + SpawnGroupAdd( EscortPrefix, EscortMission ) + + end +end + +function SendMessageToCarrier( CarrierGroup, CarrierMessage ) +--trace.f() + + if CarrierGroup ~= nil then + MessageToGroup( CarrierGroup, CarrierMessage, 30, 'Carrier/' .. CarrierGroup:getName() ) + end + +end + +function MessageToGroup( MsgGroup, MsgText, MsgTime, MsgName ) +--trace.f() + + if type(MsgGroup) == 'string' then + --env.info( 'MessageToGroup: Converted MsgGroup string "' .. MsgGroup .. '" into a Group structure.' ) + MsgGroup = Group.getByName( MsgGroup ) + end + + if MsgGroup ~= nil then + local MsgTable = {} + MsgTable.text = MsgText + MsgTable.displayTime = MsgTime + MsgTable.msgFor = { units = { MsgGroup:getUnits()[1]:getName() } } + MsgTable.name = MsgName + --routines.message.add( MsgTable ) + --env.info(('MessageToGroup: Message sent to ' .. MsgGroup:getUnits()[1]:getName() .. ' -> ' .. MsgText )) + end +end + +function MessageToUnit( UnitName, MsgText, MsgTime, MsgName ) +--trace.f() + + if UnitName ~= nil then + local MsgTable = {} + MsgTable.text = MsgText + MsgTable.displayTime = MsgTime + MsgTable.msgFor = { units = { UnitName } } + MsgTable.name = MsgName + --routines.message.add( MsgTable ) + end +end + +function MessageToAll( MsgText, MsgTime, MsgName ) +--trace.f() + + MESSAGE:New( MsgText, "Message", MsgTime, MsgName ):ToCoalition( coalition.side.RED ):ToCoalition( coalition.side.BLUE ) +end + +function MessageToRed( MsgText, MsgTime, MsgName ) +--trace.f() + + MESSAGE:New( MsgText, "To Red Coalition", MsgTime, MsgName ):ToCoalition( coalition.side.RED ) +end + +function MessageToBlue( MsgText, MsgTime, MsgName ) +--trace.f() + + MESSAGE:New( MsgText, "To Blue Coalition", MsgTime, MsgName ):ToCoalition( coalition.side.RED ) +end + +function getCarrierHeight( CarrierGroup ) +--trace.f() + + if CarrierGroup ~= nil then + if table.getn(CarrierGroup:getUnits()) == 1 then + local CarrierUnit = CarrierGroup:getUnits()[1] + local CurrentPoint = CarrierUnit:getPoint() + + local CurrentPosition = { x = CurrentPoint.x, y = CurrentPoint.z } + local CarrierHeight = CurrentPoint.y + + local LandHeight = land.getHeight( CurrentPosition ) + + --env.info(( 'CarrierHeight: LandHeight = ' .. LandHeight .. ' CarrierHeight = ' .. CarrierHeight )) + + return CarrierHeight - LandHeight + else + return 999999 + end + else + return 999999 + end + +end + +function GetUnitHeight( CheckUnit ) +--trace.f() + + local UnitPoint = CheckUnit:getPoint() + local UnitPosition = { x = CurrentPoint.x, y = CurrentPoint.z } + local UnitHeight = CurrentPoint.y + + local LandHeight = land.getHeight( CurrentPosition ) + + --env.info(( 'CarrierHeight: LandHeight = ' .. LandHeight .. ' CarrierHeight = ' .. CarrierHeight )) + + return UnitHeight - LandHeight + +end + + +_MusicTable = {} +_MusicTable.Files = {} +_MusicTable.Queue = {} +_MusicTable.FileCnt = 0 + + +function MusicRegister( SndRef, SndFile, SndTime ) +--trace.f() + + env.info(( 'MusicRegister: SndRef = ' .. SndRef )) + env.info(( 'MusicRegister: SndFile = ' .. SndFile )) + env.info(( 'MusicRegister: SndTime = ' .. SndTime )) + + + _MusicTable.FileCnt = _MusicTable.FileCnt + 1 + + _MusicTable.Files[_MusicTable.FileCnt] = {} + _MusicTable.Files[_MusicTable.FileCnt].Ref = SndRef + _MusicTable.Files[_MusicTable.FileCnt].File = SndFile + _MusicTable.Files[_MusicTable.FileCnt].Time = SndTime + + if not _MusicTable.Function then + _MusicTable.Function = routines.scheduleFunction( MusicScheduler, { }, timer.getTime() + 10, 10) + end + +end + +function MusicToPlayer( SndRef, PlayerName, SndContinue ) +--trace.f() + + --env.info(( 'MusicToPlayer: SndRef = ' .. SndRef )) + + local PlayerUnits = AlivePlayerUnits() + for PlayerUnitIdx, PlayerUnit in pairs(PlayerUnits) do + local PlayerUnitName = PlayerUnit:getPlayerName() + --env.info(( 'MusicToPlayer: PlayerUnitName = ' .. PlayerUnitName )) + if PlayerName == PlayerUnitName then + PlayerGroup = PlayerUnit:getGroup() + if PlayerGroup then + --env.info(( 'MusicToPlayer: PlayerGroup = ' .. PlayerGroup:getName() )) + MusicToGroup( SndRef, PlayerGroup, SndContinue ) + end + break + end + end + + --env.info(( 'MusicToPlayer: end' )) + +end + +function MusicToGroup( SndRef, SndGroup, SndContinue ) +--trace.f() + + --env.info(( 'MusicToGroup: SndRef = ' .. SndRef )) + + if SndGroup ~= nil then + if _MusicTable and _MusicTable.FileCnt > 0 then + if SndGroup:isExist() then + if MusicCanStart(SndGroup:getUnit(1):getPlayerName()) then + --env.info(( 'MusicToGroup: OK for Sound.' )) + local SndIdx = 0 + if SndRef == '' then + --env.info(( 'MusicToGroup: SndRef as empty. Queueing at random.' )) + SndIdx = math.random( 1, _MusicTable.FileCnt ) + else + for SndIdx = 1, _MusicTable.FileCnt do + if _MusicTable.Files[SndIdx].Ref == SndRef then + break + end + end + end + --env.info(( 'MusicToGroup: SndIdx = ' .. SndIdx )) + --env.info(( 'MusicToGroup: Queueing Music ' .. _MusicTable.Files[SndIdx].File .. ' for Group ' .. SndGroup:getID() )) + trigger.action.outSoundForGroup( SndGroup:getID(), _MusicTable.Files[SndIdx].File ) + MessageToGroup( SndGroup, 'Playing ' .. _MusicTable.Files[SndIdx].File, 15, 'Music-' .. SndGroup:getUnit(1):getPlayerName() ) + + local SndQueueRef = SndGroup:getUnit(1):getPlayerName() + if _MusicTable.Queue[SndQueueRef] == nil then + _MusicTable.Queue[SndQueueRef] = {} + end + _MusicTable.Queue[SndQueueRef].Start = timer.getTime() + _MusicTable.Queue[SndQueueRef].PlayerName = SndGroup:getUnit(1):getPlayerName() + _MusicTable.Queue[SndQueueRef].Group = SndGroup + _MusicTable.Queue[SndQueueRef].ID = SndGroup:getID() + _MusicTable.Queue[SndQueueRef].Ref = SndIdx + _MusicTable.Queue[SndQueueRef].Continue = SndContinue + _MusicTable.Queue[SndQueueRef].Type = Group + end + end + end + end +end + +function MusicCanStart(PlayerName) +--trace.f() + + --env.info(( 'MusicCanStart:' )) + + local MusicOut = false + + if _MusicTable['Queue'] ~= nil and _MusicTable.FileCnt > 0 then + --env.info(( 'MusicCanStart: PlayerName = ' .. PlayerName )) + local PlayerFound = false + local MusicStart = 0 + local MusicTime = 0 + for SndQueueIdx, SndQueue in pairs( _MusicTable.Queue ) do + if SndQueue.PlayerName == PlayerName then + PlayerFound = true + MusicStart = SndQueue.Start + MusicTime = _MusicTable.Files[SndQueue.Ref].Time + break + end + end + if PlayerFound then + --env.info(( 'MusicCanStart: MusicStart = ' .. MusicStart )) + --env.info(( 'MusicCanStart: MusicTime = ' .. MusicTime )) + --env.info(( 'MusicCanStart: timer.getTime() = ' .. timer.getTime() )) + + if MusicStart + MusicTime <= timer.getTime() then + MusicOut = true + end + else + MusicOut = true + end + end + + if MusicOut then + --env.info(( 'MusicCanStart: true' )) + else + --env.info(( 'MusicCanStart: false' )) + end + + return MusicOut +end + +function MusicScheduler() +--trace.scheduled("", "MusicScheduler") + + --env.info(( 'MusicScheduler:' )) + if _MusicTable['Queue'] ~= nil and _MusicTable.FileCnt > 0 then + --env.info(( 'MusicScheduler: Walking Sound Queue.')) + for SndQueueIdx, SndQueue in pairs( _MusicTable.Queue ) do + if SndQueue.Continue then + if MusicCanStart(SndQueue.PlayerName) then + --env.info(('MusicScheduler: MusicToGroup')) + MusicToPlayer( '', SndQueue.PlayerName, true ) + end + end + end + end + +end + + +env.info(( 'Init: Scripts Loaded v1.1' )) + +--- BASE classes. +-- +-- @{#BASE} class +-- ============== +-- The @{#BASE} class is the super class for most of the classes defined within MOOSE. +-- +-- It handles: +-- +-- * The construction and inheritance of child classes. +-- * The tracing of objects during mission execution within the DCS.log file (under saved games folder). +-- +-- Note: Normally you would not use the BASE class unless you are extending the MOOSE framework with new classes. +-- +-- BASE Trace functionality +-- ======================== +-- The BASE class contains trace methods to trace progress within a mission execution of a certain object. +-- Note that these trace methods are inherited by each MOOSE class interiting BASE. +-- As such, each object created from derived class from BASE can use the tracing functions to trace its execution. +-- +-- Trace a function call +-- --------------------- +-- There are basically 3 types of tracing methods available within BASE: +-- +-- * @{#BASE.F}: Trace the beginning of a function and its given parameters. +-- * @{#BASE.T}: Trace further logic within a function giving optional variables or parameters. +-- * @{#BASE.E}: Trace an execption within a function giving optional variables or parameters. An exception will always be traced. +-- +-- Tracing levels +-- -------------- +-- There are 3 tracing levels within MOOSE. +-- These tracing levels were defined to avoid bulks of tracing to be generated by lots of objects. +-- +-- As such, the F and T methods have additional variants to trace level 2 and 3 respectively: +-- +-- * @{#BASE.F2}: Trace the beginning of a function and its given parameters with tracing level 2. +-- * @{#BASE.F3}: Trace the beginning of a function and its given parameters with tracing level 3. +-- * @{#BASE.T2}: Trace further logic within a function giving optional variables or parameters with tracing level 2. +-- * @{#BASE.T3}: Trace further logic within a function giving optional variables or parameters with tracing level 3. +-- +-- BASE Inheritance support +-- ======================== +-- The following methods are available to support inheritance: +-- +-- * @{#BASE.Inherit}: Inherits from a class. +-- * @{#BASE.Inherited}: Returns the parent class from the class. +-- +-- Future +-- ====== +-- Further methods may be added to BASE whenever there is a need to make "overall" functions available within MOOSE. +-- +-- ==== +-- +-- @module Base +-- @author FlightControl + +Include.File( "Routines" ) + +local _TraceOn = true +local _TraceLevel = 1 +local _TraceClass = { + --DATABASE = true, + --SEAD = true, + --DESTROYBASETASK = true, + --MOVEMENT = true, + --SPAWN = true, + --STAGE = true, + --ZONE = true, + --GROUP = true, + --UNIT = true, + --CLIENT = true, + --CARGO = true, + --CARGO_GROUP = true, + --CARGO_PACKAGE = true, + --CARGO_SLINGLOAD = true, + --CARGO_ZONE = true, + --CLEANUP = true, + --MENU_CLIENT = true, + --MENU_CLIENT_COMMAND = true, + --ESCORT = true, + } +local _TraceClassMethod = {} + +--- The BASE Class +-- @type BASE +-- @field ClassName The name of the class. +-- @field ClassID The ID number of the class. +BASE = { + ClassName = "BASE", + ClassID = 0, + Events = {} +} + +--- The Formation Class +-- @type FORMATION +-- @field Cone A cone formation. +FORMATION = { + Cone = "Cone" +} + + + +--- The base constructor. This is the top top class of all classed defined within the MOOSE. +-- Any new class needs to be derived from this class for proper inheritance. +-- @param #BASE self +-- @return #BASE The new instance of the BASE class. +-- @usage +-- function TASK:New() +-- +-- local self = BASE:Inherit( self, BASE:New() ) +-- +-- -- assign Task default values during construction +-- self.TaskBriefing = "Task: No Task." +-- self.Time = timer.getTime() +-- self.ExecuteStage = _TransportExecuteStage.NONE +-- +-- return self +-- end +-- @todo need to investigate if the deepCopy is really needed... Don't think so. +function BASE:New() + local Child = routines.utils.deepCopy( self ) + local Parent = {} + setmetatable( Child, Parent ) + Child.__index = Child + self.ClassID = self.ClassID + 1 + Child.ClassID = self.ClassID + --Child.AddEvent( Child, S_EVENT_BIRTH, Child.EventBirth ) + return Child +end + +--- This is the worker method to inherit from a parent class. +-- @param #BASE self +-- @param Child is the Child class that inherits. +-- @param #BASE Parent is the Parent class that the Child inherits from. +-- @return #BASE Child +function BASE:Inherit( Child, Parent ) + local Child = routines.utils.deepCopy( Child ) + local Parent = routines.utils.deepCopy( Parent ) + if Child ~= nil then + setmetatable( Child, Parent ) + Child.__index = Child + end + --Child.ClassName = Child.ClassName .. '.' .. Child.ClassID + self:T( 'Inherited from ' .. Parent.ClassName ) + return Child +end + +--- This is the worker method to retrieve the Parent class. +-- @param #BASE self +-- @param #BASE Child is the Child class from which the Parent class needs to be retrieved. +-- @return #BASE +function BASE:Inherited( Child ) + local Parent = getmetatable( Child ) +-- env.info('Inherited class of ' .. Child.ClassName .. ' is ' .. Parent.ClassName ) + return Parent +end + +--- Get the ClassName + ClassID of the class instance. +-- The ClassName + ClassID is formatted as '%s#%09d'. +-- @param #BASE self +-- @return #string The ClassName + ClassID of the class instance. +function BASE:GetClassNameAndID() + return string.format( '%s#%09d', self:GetClassName(), self:GetClassID() ) +end + +--- Get the ClassName of the class instance. +-- @param #BASE self +-- @return #string The ClassName of the class instance. +function BASE:GetClassName() + return self.ClassName +end + +--- Get the ClassID of the class instance. +-- @param #BASE self +-- @return #string The ClassID of the class instance. +function BASE:GetClassID() + return self.ClassID +end + +--- Set a new listener for the class. +-- @param self +-- @param DCSTypes#Event Event +-- @param #function EventFunction +-- @return #BASE +function BASE:AddEvent( Event, EventFunction ) + self:F( Event ) + + self.Events[#self.Events+1] = {} + self.Events[#self.Events].Event = Event + self.Events[#self.Events].EventFunction = EventFunction + self.Events[#self.Events].EventEnabled = false + + return self +end + +--- Returns the event dispatcher +-- @param #BASE self +-- @return Event#EVENT +function BASE:Event() + + return _EVENTDISPATCHER +end + + + + + +--- Enable the event listeners for the class. +-- @param #BASE self +-- @return #BASE +function BASE:EnableEvents() + self:F( #self.Events ) + + for EventID, Event in pairs( self.Events ) do + Event.Self = self + Event.EventEnabled = true + end + self.Events.Handler = world.addEventHandler( self ) + + return self +end + + +--- Disable the event listeners for the class. +-- @param #BASE self +-- @return #BASE +function BASE:DisableEvents() + self:F() + + world.removeEventHandler( self ) + for EventID, Event in pairs( self.Events ) do + Event.Self = nil + Event.EventEnabled = false + end + + return self +end + + +local BaseEventCodes = { + "S_EVENT_SHOT", + "S_EVENT_HIT", + "S_EVENT_TAKEOFF", + "S_EVENT_LAND", + "S_EVENT_CRASH", + "S_EVENT_EJECTION", + "S_EVENT_REFUELING", + "S_EVENT_DEAD", + "S_EVENT_PILOT_DEAD", + "S_EVENT_BASE_CAPTURED", + "S_EVENT_MISSION_START", + "S_EVENT_MISSION_END", + "S_EVENT_TOOK_CONTROL", + "S_EVENT_REFUELING_STOP", + "S_EVENT_BIRTH", + "S_EVENT_HUMAN_FAILURE", + "S_EVENT_ENGINE_STARTUP", + "S_EVENT_ENGINE_SHUTDOWN", + "S_EVENT_PLAYER_ENTER_UNIT", + "S_EVENT_PLAYER_LEAVE_UNIT", + "S_EVENT_PLAYER_COMMENT", + "S_EVENT_SHOOTING_START", + "S_EVENT_SHOOTING_END", + "S_EVENT_MAX", +} + +--onEvent( {[1]="S_EVENT_BIRTH",[2]={["subPlace"]=5,["time"]=0,["initiator"]={["id_"]=16884480,},["place"]={["id_"]=5000040,},["id"]=15,["IniUnitName"]="US F-15C@RAMP-Air Support Mountains#001-01",},} +-- Event = { +-- id = enum world.event, +-- time = Time, +-- initiator = Unit, +-- target = Unit, +-- place = Unit, +-- subPlace = enum world.BirthPlace, +-- weapon = Weapon +-- } + +--- Creation of a Birth Event. +-- @param #BASE self +-- @param DCSTypes#Time EventTime The time stamp of the event. +-- @param DCSObject#Object Initiator The initiating object of the event. +-- @param #string IniUnitName The initiating unit name. +-- @param place +-- @param subplace +function BASE:CreateEventBirth( EventTime, Initiator, IniUnitName, place, subplace ) + self:F( { EventTime, Initiator, IniUnitName, place, subplace } ) + + local Event = { + id = world.event.S_EVENT_BIRTH, + time = EventTime, + initiator = Initiator, + IniUnitName = IniUnitName, + place = place, + subplace = subplace + } + + world.onEvent( Event ) +end + +--- Creation of a Crash Event. +-- @param #BASE self +-- @param DCSTypes#Time EventTime The time stamp of the event. +-- @param DCSObject#Object Initiator The initiating object of the event. +function BASE:CreateEventCrash( EventTime, Initiator ) + self:F( { EventTime, Initiator } ) + + local Event = { + id = world.event.S_EVENT_CRASH, + time = EventTime, + initiator = Initiator, + } + + world.onEvent( Event ) +end + +-- TODO: Complete DCSTypes#Event structure. +--- The main event handling function... This function captures all events generated for the class. +-- @param #BASE self +-- @param DCSTypes#Event event +function BASE:onEvent(event) + --self:F( { BaseEventCodes[event.id], event } ) + + if self then + for EventID, EventObject in pairs( self.Events ) do + if EventObject.EventEnabled then + --env.info( 'onEvent Table EventObject.Self = ' .. tostring(EventObject.Self) ) + --env.info( 'onEvent event.id = ' .. tostring(event.id) ) + --env.info( 'onEvent EventObject.Event = ' .. tostring(EventObject.Event) ) + if event.id == EventObject.Event then + if self == EventObject.Self then + if event.initiator and event.initiator:isExist() then + event.IniUnitName = event.initiator:getName() + end + if event.target and event.target:isExist() then + event.TgtUnitName = event.target:getName() + end + --self:T( { BaseEventCodes[event.id], event } ) + --EventObject.EventFunction( self, event ) + end + end + end + end + end +end + +-- Trace section + +-- Log a trace (only shown when trace is on) +-- TODO: Make trace function using variable parameters. + +--- Set trace level +-- @param #BASE self +-- @param #number Level +function BASE:TraceLevel( Level ) + _TraceLevel = Level + self:E( "Tracing level " .. Level ) +end + +--- Set tracing for a class +-- @param #BASE self +-- @param #string Class +function BASE:TraceClass( Class ) + _TraceClass[Class] = true + _TraceClassMethod[Class] = {} + self:E( "Tracing class " .. Class ) +end + +--- Set tracing for a specific method of class +-- @param #BASE self +-- @param #string Class +-- @param #string Method +function BASE:TraceClassMethod( Class, Method ) + if not _TraceClassMethod[Class] then + _TraceClassMethod[Class] = {} + _TraceClassMethod[Class].Method = {} + end + _TraceClassMethod[Class].Method[Method] = true + self:E( "Tracing method " .. Method .. " of class " .. Class ) +end + +--- Trace a function call. Must be at the beginning of the function logic. +-- @param #BASE self +-- @param Arguments A #table or any field. +function BASE:F( Arguments ) + + if _TraceOn and ( _TraceClass[self.ClassName] or _TraceClassMethod[self.ClassName] ) then + + local DebugInfoCurrent = debug.getinfo( 2, "nl" ) + local DebugInfoFrom = debug.getinfo( 3, "l" ) + + local Function = "function" + if DebugInfoCurrent.name then + Function = DebugInfoCurrent.name + end + + if _TraceClass[self.ClassName] or _TraceClassMethod[self.ClassName].Method[Function] then + local LineCurrent = DebugInfoCurrent.currentline + local LineFrom = 0 + if DebugInfoFrom then + LineFrom = DebugInfoFrom.currentline + end + env.info( string.format( "%6d(%6d)/%1s:%20s%05d.%s(%s)" , LineCurrent, LineFrom, "F", self.ClassName, self.ClassID, Function, routines.utils.oneLineSerialize( Arguments ) ) ) + end + end +end + +--- Trace a function call level 2. Must be at the beginning of the function logic. +-- @param #BASE self +-- @param Arguments A #table or any field. +function BASE:F2( Arguments ) + + if _TraceLevel >= 2 then + self:F( Arguments ) + end + +end + +--- Trace a function call level 3. Must be at the beginning of the function logic. +-- @param #BASE self +-- @param Arguments A #table or any field. +function BASE:F3( Arguments ) + + if _TraceLevel >= 3 then + self:F( Arguments ) + end + +end + +--- Trace a function logic. Can be anywhere within the function logic. +-- @param #BASE self +-- @param Arguments A #table or any field. +function BASE:T( Arguments ) + + if _TraceOn and ( _TraceClass[self.ClassName] or _TraceClassMethod[self.ClassName] ) then + + local DebugInfoCurrent = debug.getinfo( 2, "nl" ) + local DebugInfoFrom = debug.getinfo( 3, "l" ) + + local Function = "function" + if DebugInfoCurrent.name then + Function = DebugInfoCurrent.name + end + + if _TraceClass[self.ClassName] or _TraceClassMethod[self.ClassName].Method[Function] then + local LineCurrent = DebugInfoCurrent.currentline + local LineFrom = 0 + if DebugInfoFrom then + LineFrom = DebugInfoFrom.currentline + end + env.info( string.format( "%6d(%6d)/%1s:%20s%05d.%s" , LineCurrent, LineFrom, "T", self.ClassName, self.ClassID, routines.utils.oneLineSerialize( Arguments ) ) ) + end + end +end + +--- Trace a function logic level 2. Can be anywhere within the function logic. +-- @param #BASE self +-- @param Arguments A #table or any field. +function BASE:T2( Arguments ) + + if _TraceLevel >= 2 then + self:T( Arguments ) + end + +end + +--- Trace a function logic level 3. Can be anywhere within the function logic. +-- @param #BASE self +-- @param Arguments A #table or any field. +function BASE:T3( Arguments ) + + if _TraceLevel >= 3 then + self:T( Arguments ) + end + +end + +--- Log an exception which will be traced always. Can be anywhere within the function logic. +-- @param #BASE self +-- @param Arguments A #table or any field. +function BASE:E( Arguments ) + + local DebugInfoCurrent = debug.getinfo( 2, "nl" ) + local DebugInfoFrom = debug.getinfo( 3, "l" ) + + local Function = "function" + if DebugInfoCurrent.name then + Function = DebugInfoCurrent.name + end + + local LineCurrent = DebugInfoCurrent.currentline + local LineFrom = -1 + if DebugInfoFrom then + LineFrom = DebugInfoFrom.currentline + end + + env.info( string.format( "%6d(%6d)/%1s:%20s%05d.%s(%s)" , LineCurrent, LineFrom, "E", self.ClassName, self.ClassID, Function, routines.utils.oneLineSerialize( Arguments ) ) ) +end + + + +--- Models time events calling event handing functions. +-- +-- @{SCHEDULER} class +-- =================== +-- The @{SCHEDULER} class models time events calling given event handling functions. +-- +-- SCHEDULER constructor +-- ===================== +-- The SCHEDULER class is quite easy to use: +-- +-- * @{#SCHEDULER.New}: Setup a new scheduler and start it with the specified parameters. +-- +-- SCHEDULER timer methods +-- ======================= +-- The SCHEDULER can be stopped and restarted with the following methods: +-- +-- * @{#SCHEDULER.Start}: (Re-)Start the scheduler. +-- * @{#SCHEDULER.Start}: Stop the scheduler. +-- +-- @module Scheduler +-- @author FlightControl + +Include.File( "Routines" ) +Include.File( "Base" ) + + +--- The SCHEDULER class +-- @type SCHEDULER +-- @extends Base#BASE +SCHEDULER = { + ClassName = "SCHEDULER", +} + + +--- Constructor. +-- @param #SCHEDULER self +-- @param #table TimeEventObject Specified for which Moose object the timer is setup. If a value of nil is provided, a scheduler will be setup without an object reference. +-- @param #function TimeEventFunction The event function to be called when a timer event occurs. The event function needs to accept the parameters specified in TimeEventFunctionArguments. +-- @param #table TimeEventFunctionArguments Optional arguments that can be given as part of scheduler. The arguments need to be given as a table { param1, param 2, ... }. +-- @param #number StartSeconds Specifies the amount of seconds that will be waited before the scheduling is started, and the event function is called. +-- @param #number RepeatSecondsInterval Specifies the interval in seconds when the scheduler will call the event function. +-- @param #number RandomizationFactor Specifies a randomization factor between 0 and 1 to randomize the RepeatSecondsInterval. +-- @param #number StopSeconds Specifies the amount of seconds when the scheduler will be stopped. +-- @return #SCHEDULER self +function SCHEDULER:New( TimeEventObject, TimeEventFunction, TimeEventFunctionArguments, StartSeconds, RepeatSecondsInterval, RandomizationFactor, StopSeconds ) + local self = BASE:Inherit( self, BASE:New() ) + self:F2( { TimeEventObject, TimeEventFunction, TimeEventFunctionArguments, StartSeconds, RepeatSecondsInterval, RandomizationFactor, StopSeconds } ) + + self.TimeEventObject = TimeEventObject + self.TimeEventFunction = TimeEventFunction + self.TimeEventFunctionArguments = TimeEventFunctionArguments + self.StartSeconds = StartSeconds + + if RepeatSecondsInterval then + self.RepeatSecondsInterval = RepeatSecondsInterval + else + self.RepeatSecondsInterval = 0 + end + + if RandomizationFactor then + self.RandomizationFactor = RandomizationFactor + else + self.RandomizationFactor = 0 + end + + if StopSeconds then + self.StopSeconds = StopSeconds + end + + self.Repeat = false + + self.StartTime = timer.getTime() + + self:Start() + + return self +end + +--- (Re-)Starts the scheduler. +-- @param #SCHEDULER self +-- @return #SCHEDULER self +function SCHEDULER:Start() + self:F2( self.TimeEventObject ) + + self.Repeat = true + timer.scheduleFunction( self._Scheduler, self, timer.getTime() + self.StartSeconds + .01 ) + + return self +end + +--- Stops the scheduler. +-- @param #SCHEDULER self +-- @return #SCHEDULER self +function SCHEDULER:Stop() + self:F2( self.TimeEventObject ) + + self.Repeat = false + + return self +end + +-- Private Functions + +function SCHEDULER:_Scheduler() + self:F2( self.TimeEventFunctionArguments ) + + local ErrorHandler = function( errmsg ) + + env.info( "Error in SCHEDULER function:" .. errmsg ) + env.info( debug.traceback() ) + + return errmsg + end + + local Status, Result + if self.TimeEventObject then + Status, Result = xpcall( function() return self.TimeEventFunction( self.TimeEventObject, unpack( self.TimeEventFunctionArguments ) ) end, ErrorHandler ) + else + Status, Result = xpcall( function() return self.TimeEventFunction( unpack( self.TimeEventFunctionArguments ) ) end, ErrorHandler ) + end + + self:T( { Status, Result } ) + + if Status and ( ( not Result ) or ( Result and Result ~= false ) ) then + if self.Repeat and ( not self.StopSeconds or ( self.StopSeconds and timer.getTime() <= self.StartTime + self.StopSeconds ) ) then + timer.scheduleFunction( + self._Scheduler, + self, + timer.getTime() + self.RepeatSecondsInterval + math.random( - ( self.RandomizationFactor * self.RepeatSecondsInterval / 2 ), ( self.RandomizationFactor * self.RepeatSecondsInterval / 2 ) ) + 0.01 + ) + end + end + +end + + + + + + + + +--- The EVENT class models an efficient event handling process between other classes and its units, weapons. +-- @module Event +-- @author FlightControl + +Include.File( "Routines" ) +Include.File( "Base" ) + +--- The EVENT structure +-- @type EVENT +-- @field #EVENT.Events Events +EVENT = { + ClassName = "EVENT", + ClassID = 0, +} + +local _EVENTCODES = { + "S_EVENT_SHOT", + "S_EVENT_HIT", + "S_EVENT_TAKEOFF", + "S_EVENT_LAND", + "S_EVENT_CRASH", + "S_EVENT_EJECTION", + "S_EVENT_REFUELING", + "S_EVENT_DEAD", + "S_EVENT_PILOT_DEAD", + "S_EVENT_BASE_CAPTURED", + "S_EVENT_MISSION_START", + "S_EVENT_MISSION_END", + "S_EVENT_TOOK_CONTROL", + "S_EVENT_REFUELING_STOP", + "S_EVENT_BIRTH", + "S_EVENT_HUMAN_FAILURE", + "S_EVENT_ENGINE_STARTUP", + "S_EVENT_ENGINE_SHUTDOWN", + "S_EVENT_PLAYER_ENTER_UNIT", + "S_EVENT_PLAYER_LEAVE_UNIT", + "S_EVENT_PLAYER_COMMENT", + "S_EVENT_SHOOTING_START", + "S_EVENT_SHOOTING_END", + "S_EVENT_MAX", +} + +--- The Event structure +-- @type EVENTDATA +-- @field id +-- @field initiator +-- @field target +-- @field weapon +-- @field IniDCSUnit +-- @field IniDCSUnitName +-- @field IniDCSGroup +-- @field IniDCSGroupName +-- @field TgtDCSUnit +-- @field TgtDCSUnitName +-- @field TgtDCSGroup +-- @field TgtDCSGroupName +-- @field Weapon +-- @field WeaponName +-- @field WeaponTgtDCSUnit + +--- The Events structure +-- @type EVENT.Events +-- @field #number IniUnit + +function EVENT:New() + local self = BASE:Inherit( self, BASE:New() ) + self:F2() + self.EventHandler = world.addEventHandler( self ) + return self +end + +function EVENT:EventText( EventID ) + + local EventText = _EVENTCODES[EventID] + + return EventText +end + + +--- Initializes the Events structure for the event +-- @param #EVENT self +-- @param DCSWorld#world.event EventID +-- @param #string EventClass +-- @return #EVENT.Events +function EVENT:Init( EventID, EventClass ) + self:F3( { _EVENTCODES[EventID], EventClass } ) + if not self.Events[EventID] then + self.Events[EventID] = {} + end + if not self.Events[EventID][EventClass] then + self.Events[EventID][EventClass] = {} + end + return self.Events[EventID][EventClass] +end + + +--- Create an OnDead event handler for a group +-- @param #EVENT self +-- @param #table EventTemplate +-- @param #function EventFunction The function to be called when the event occurs for the unit. +-- @param EventSelf The self instance of the class for which the event is. +-- @param #function OnEventFunction +-- @return #EVENT +function EVENT:OnEventForTemplate( EventTemplate, EventFunction, EventSelf, OnEventFunction ) + self:F2( EventTemplate.name ) + + for EventUnitID, EventUnit in pairs( EventTemplate.units ) do + OnEventFunction( self, EventUnit.name, EventFunction, EventSelf ) + end + return self +end + +--- Set a new listener for an S_EVENT_X event independent from a unit or a weapon. +-- @param #EVENT self +-- @param #function EventFunction The function to be called when the event occurs for the unit. +-- @param Base#BASE EventSelf The self instance of the class for which the event is. +-- @param EventID +-- @return #EVENT +function EVENT:OnEventGeneric( EventFunction, EventSelf, EventID ) + self:F2( { EventID } ) + + local Event = self:Init( EventID, EventSelf:GetClassNameAndID() ) + Event.EventFunction = EventFunction + Event.EventSelf = EventSelf + return self +end + + +--- Set a new listener for an S_EVENT_X event +-- @param #EVENT self +-- @param #string EventDCSUnitName +-- @param #function EventFunction The function to be called when the event occurs for the unit. +-- @param Base#BASE EventSelf The self instance of the class for which the event is. +-- @param EventID +-- @return #EVENT +function EVENT:OnEventForUnit( EventDCSUnitName, EventFunction, EventSelf, EventID ) + self:F2( EventDCSUnitName ) + + local Event = self:Init( EventID, EventSelf:GetClassNameAndID() ) + if not Event.IniUnit then + Event.IniUnit = {} + end + Event.IniUnit[EventDCSUnitName] = {} + Event.IniUnit[EventDCSUnitName].EventFunction = EventFunction + Event.IniUnit[EventDCSUnitName].EventSelf = EventSelf + return self +end + + +--- Create an OnBirth event handler for a group +-- @param #EVENT self +-- @param Group#GROUP EventGroup +-- @param #function EventFunction The function to be called when the event occurs for the unit. +-- @param EventSelf The self instance of the class for which the event is. +-- @return #EVENT +function EVENT:OnBirthForTemplate( EventTemplate, EventFunction, EventSelf ) + self:F2( EventTemplate.name ) + + self:OnEventForTemplate( EventTemplate, EventFunction, EventSelf, self.OnBirthForUnit ) + + return self +end + +--- Set a new listener for an S_EVENT_BIRTH event, and registers the unit born. +-- @param #EVENT self +-- @param #function EventFunction The function to be called when the event occurs for the unit. +-- @param Base#BASE EventSelf +-- @return #EVENT +function EVENT:OnBirth( EventFunction, EventSelf ) + self:F2() + + self:OnEventGeneric( EventFunction, EventSelf, world.event.S_EVENT_BIRTH ) + + return self +end + +--- Set a new listener for an S_EVENT_BIRTH event. +-- @param #EVENT self +-- @param #string EventDCSUnitName The id of the unit for the event to be handled. +-- @param #function EventFunction The function to be called when the event occurs for the unit. +-- @param Base#BASE EventSelf +-- @return #EVENT +function EVENT:OnBirthForUnit( EventDCSUnitName, EventFunction, EventSelf ) + self:F2( EventDCSUnitName ) + + self:OnEventForUnit( EventDCSUnitName, EventFunction, EventSelf, world.event.S_EVENT_BIRTH ) + + return self +end + +--- Create an OnCrash event handler for a group +-- @param #EVENT self +-- @param Group#GROUP EventGroup +-- @param #function EventFunction The function to be called when the event occurs for the unit. +-- @param EventSelf The self instance of the class for which the event is. +-- @return #EVENT +function EVENT:OnCrashForTemplate( EventTemplate, EventFunction, EventSelf ) + self:F2( EventTemplate.name ) + + self:OnEventForTemplate( EventTemplate, EventFunction, EventSelf, self.OnCrashForUnit ) + + return self +end + +--- Set a new listener for an S_EVENT_CRASH event. +-- @param #EVENT self +-- @param #function EventFunction The function to be called when the event occurs for the unit. +-- @param Base#BASE EventSelf +-- @return #EVENT +function EVENT:OnCrash( EventFunction, EventSelf ) + self:F2() + + self:OnEventGeneric( EventFunction, EventSelf, world.event.S_EVENT_CRASH ) + + return self +end + +--- Set a new listener for an S_EVENT_CRASH event. +-- @param #EVENT self +-- @param #string EventDCSUnitName +-- @param #function EventFunction The function to be called when the event occurs for the unit. +-- @param Base#BASE EventSelf The self instance of the class for which the event is. +-- @return #EVENT +function EVENT:OnCrashForUnit( EventDCSUnitName, EventFunction, EventSelf ) + self:F2( EventDCSUnitName ) + + self:OnEventForUnit( EventDCSUnitName, EventFunction, EventSelf, world.event.S_EVENT_CRASH ) + + return self +end + +--- Create an OnDead event handler for a group +-- @param #EVENT self +-- @param Group#GROUP EventGroup +-- @param #function EventFunction The function to be called when the event occurs for the unit. +-- @param EventSelf The self instance of the class for which the event is. +-- @return #EVENT +function EVENT:OnDeadForTemplate( EventTemplate, EventFunction, EventSelf ) + self:F2( EventTemplate.name ) + + self:OnEventForTemplate( EventTemplate, EventFunction, EventSelf, self.OnDeadForUnit ) + + return self +end + +--- Set a new listener for an S_EVENT_DEAD event. +-- @param #EVENT self +-- @param #function EventFunction The function to be called when the event occurs for the unit. +-- @param Base#BASE EventSelf +-- @return #EVENT +function EVENT:OnDead( EventFunction, EventSelf ) + self:F2() + + self:OnEventGeneric( EventFunction, EventSelf, world.event.S_EVENT_DEAD ) + + return self +end + + +--- Set a new listener for an S_EVENT_DEAD event. +-- @param #EVENT self +-- @param #string EventDCSUnitName +-- @param #function EventFunction The function to be called when the event occurs for the unit. +-- @param Base#BASE EventSelf The self instance of the class for which the event is. +-- @return #EVENT +function EVENT:OnDeadForUnit( EventDCSUnitName, EventFunction, EventSelf ) + self:F2( EventDCSUnitName ) + + self:OnEventForUnit( EventDCSUnitName, EventFunction, EventSelf, world.event.S_EVENT_DEAD ) + + return self +end + +--- Set a new listener for an S_EVENT_PILOT_DEAD event. +-- @param #EVENT self +-- @param #string EventDCSUnitName +-- @param #function EventFunction The function to be called when the event occurs for the unit. +-- @param Base#BASE EventSelf The self instance of the class for which the event is. +-- @return #EVENT +function EVENT:OnPilotDeadForUnit( EventDCSUnitName, EventFunction, EventSelf ) + self:F2( EventDCSUnitName ) + + self:OnEventForUnit( EventDCSUnitName, EventFunction, EventSelf, world.event.S_EVENT_PILOT_DEAD ) + + return self +end + +--- Create an OnDead event handler for a group +-- @param #EVENT self +-- @param #table EventTemplate +-- @param #function EventFunction The function to be called when the event occurs for the unit. +-- @param EventSelf The self instance of the class for which the event is. +-- @return #EVENT +function EVENT:OnLandForTemplate( EventTemplate, EventFunction, EventSelf ) + self:F2( EventTemplate.name ) + + self:OnEventForTemplate( EventTemplate, EventFunction, EventSelf, self.OnLandForUnit ) + + return self +end + +--- Set a new listener for an S_EVENT_LAND event. +-- @param #EVENT self +-- @param #string EventDCSUnitName +-- @param #function EventFunction The function to be called when the event occurs for the unit. +-- @param Base#BASE EventSelf The self instance of the class for which the event is. +-- @return #EVENT +function EVENT:OnLandForUnit( EventDCSUnitName, EventFunction, EventSelf ) + self:F2( EventDCSUnitName ) + + self:OnEventForUnit( EventDCSUnitName, EventFunction, EventSelf, world.event.S_EVENT_LAND ) + + return self +end + +--- Create an OnDead event handler for a group +-- @param #EVENT self +-- @param #table EventTemplate +-- @param #function EventFunction The function to be called when the event occurs for the unit. +-- @param EventSelf The self instance of the class for which the event is. +-- @return #EVENT +function EVENT:OnTakeOffForTemplate( EventTemplate, EventFunction, EventSelf ) + self:F2( EventTemplate.name ) + + self:OnEventForTemplate( EventTemplate, EventFunction, EventSelf, self.OnTakeOffForUnit ) + + return self +end + +--- Set a new listener for an S_EVENT_TAKEOFF event. +-- @param #EVENT self +-- @param #string EventDCSUnitName +-- @param #function EventFunction The function to be called when the event occurs for the unit. +-- @param Base#BASE EventSelf The self instance of the class for which the event is. +-- @return #EVENT +function EVENT:OnTakeOffForUnit( EventDCSUnitName, EventFunction, EventSelf ) + self:F2( EventDCSUnitName ) + + self:OnEventForUnit( EventDCSUnitName, EventFunction, EventSelf, world.event.S_EVENT_TAKEOFF ) + + return self +end + +--- Create an OnDead event handler for a group +-- @param #EVENT self +-- @param #table EventTemplate +-- @param #function EventFunction The function to be called when the event occurs for the unit. +-- @param EventSelf The self instance of the class for which the event is. +-- @return #EVENT +function EVENT:OnEngineShutDownForTemplate( EventTemplate, EventFunction, EventSelf ) + self:F2( EventTemplate.name ) + + self:OnEventForTemplate( EventTemplate, EventFunction, EventSelf, self.OnEngineShutDownForUnit ) + + return self +end + +--- Set a new listener for an S_EVENT_ENGINE_SHUTDOWN event. +-- @param #EVENT self +-- @param #string EventDCSUnitName +-- @param #function EventFunction The function to be called when the event occurs for the unit. +-- @param Base#BASE EventSelf The self instance of the class for which the event is. +-- @return #EVENT +function EVENT:OnEngineShutDownForUnit( EventDCSUnitName, EventFunction, EventSelf ) + self:F2( EventDCSUnitName ) + + self:OnEventForUnit( EventDCSUnitName, EventFunction, EventSelf, world.event.S_EVENT_ENGINE_SHUTDOWN ) + + return self +end + +--- Set a new listener for an S_EVENT_ENGINE_STARTUP event. +-- @param #EVENT self +-- @param #string EventDCSUnitName +-- @param #function EventFunction The function to be called when the event occurs for the unit. +-- @param Base#BASE EventSelf The self instance of the class for which the event is. +-- @return #EVENT +function EVENT:OnEngineStartUpForUnit( EventDCSUnitName, EventFunction, EventSelf ) + self:F2( EventDCSUnitName ) + + self:OnEventForUnit( EventDCSUnitName, EventFunction, EventSelf, world.event.S_EVENT_ENGINE_STARTUP ) + + return self +end + +--- Set a new listener for an S_EVENT_SHOT event. +-- @param #EVENT self +-- @param #function EventFunction The function to be called when the event occurs for the unit. +-- @param Base#BASE EventSelf The self instance of the class for which the event is. +-- @return #EVENT +function EVENT:OnShot( EventFunction, EventSelf ) + self:F2() + + self:OnEventGeneric( EventFunction, EventSelf, world.event.S_EVENT_SHOT ) + + return self +end + +--- Set a new listener for an S_EVENT_SHOT event for a unit. +-- @param #EVENT self +-- @param #string EventDCSUnitName +-- @param #function EventFunction The function to be called when the event occurs for the unit. +-- @param Base#BASE EventSelf The self instance of the class for which the event is. +-- @return #EVENT +function EVENT:OnShotForUnit( EventDCSUnitName, EventFunction, EventSelf ) + self:F2( EventDCSUnitName ) + + self:OnEventForUnit( EventDCSUnitName, EventFunction, EventSelf, world.event.S_EVENT_SHOT ) + + return self +end + +--- Set a new listener for an S_EVENT_HIT event. +-- @param #EVENT self +-- @param #function EventFunction The function to be called when the event occurs for the unit. +-- @param Base#BASE EventSelf The self instance of the class for which the event is. +-- @return #EVENT +function EVENT:OnHit( EventFunction, EventSelf ) + self:F2() + + self:OnEventGeneric( EventFunction, EventSelf, world.event.S_EVENT_HIT ) + + return self +end + +--- Set a new listener for an S_EVENT_HIT event. +-- @param #EVENT self +-- @param #string EventDCSUnitName +-- @param #function EventFunction The function to be called when the event occurs for the unit. +-- @param Base#BASE EventSelf The self instance of the class for which the event is. +-- @return #EVENT +function EVENT:OnHitForUnit( EventDCSUnitName, EventFunction, EventSelf ) + self:F2( EventDCSUnitName ) + + self:OnEventForUnit( EventDCSUnitName, EventFunction, EventSelf, world.event.S_EVENT_HIT ) + + return self +end + +--- Set a new listener for an S_EVENT_PLAYER_ENTER_UNIT event. +-- @param #EVENT self +-- @param #function EventFunction The function to be called when the event occurs for the unit. +-- @param Base#BASE EventSelf The self instance of the class for which the event is. +-- @return #EVENT +function EVENT:OnPlayerEnterUnit( EventFunction, EventSelf ) + self:F2() + + self:OnEventGeneric( EventFunction, EventSelf, world.event.S_EVENT_PLAYER_ENTER_UNIT ) + + return self +end + +--- Set a new listener for an S_EVENT_PLAYER_LEAVE_UNIT event. +-- @param #EVENT self +-- @param #function EventFunction The function to be called when the event occurs for the unit. +-- @param Base#BASE EventSelf The self instance of the class for which the event is. +-- @return #EVENT +function EVENT:OnPlayerLeaveUnit( EventFunction, EventSelf ) + self:F2() + + self:OnEventGeneric( EventFunction, EventSelf, world.event.S_EVENT_PLAYER_LEAVE_UNIT ) + + return self +end + + + +function EVENT:onEvent( Event ) + self:F2( { _EVENTCODES[Event.id], Event } ) + + if self and self.Events and self.Events[Event.id] then + if Event.initiator and Event.initiator:getCategory() == Object.Category.UNIT then + Event.IniDCSUnit = Event.initiator + Event.IniDCSGroup = Event.IniDCSUnit:getGroup() + Event.IniDCSUnitName = Event.IniDCSUnit:getName() + Event.IniDCSGroupName = "" + if Event.IniDCSGroup and Event.IniDCSGroup:isExist() then + Event.IniDCSGroupName = Event.IniDCSGroup:getName() + end + end + if Event.target then + if Event.target and Event.target:getCategory() == Object.Category.UNIT then + Event.TgtDCSUnit = Event.target + Event.TgtDCSGroup = Event.TgtDCSUnit:getGroup() + Event.TgtDCSUnitName = Event.TgtDCSUnit:getName() + Event.TgtDCSGroupName = "" + if Event.TgtDCSGroup and Event.TgtDCSGroup:isExist() then + Event.TgtDCSGroupName = Event.TgtDCSGroup:getName() + end + end + end + if Event.weapon then + Event.Weapon = Event.weapon + Event.WeaponName = Event.Weapon:getTypeName() + --Event.WeaponTgtDCSUnit = Event.Weapon:getTarget() + end + self:E( { _EVENTCODES[Event.id], Event } ) + for ClassName, EventData in pairs( self.Events[Event.id] ) do + if Event.IniDCSUnitName and EventData.IniUnit and EventData.IniUnit[Event.IniDCSUnitName] then + self:T2( { "Calling event function for class ", ClassName, " unit ", Event.IniDCSUnitName } ) + EventData.IniUnit[Event.IniDCSUnitName].EventFunction( EventData.IniUnit[Event.IniDCSUnitName].EventSelf, Event ) + else + if Event.IniDCSUnit and not EventData.IniUnit then + self:T2( { "Calling event function for class ", ClassName } ) + EventData.EventFunction( EventData.EventSelf, Event ) + end + end + end + end +end + +--- Encapsulation of DCS World Menu system in a set of MENU classes. +-- @module Menu + +Include.File( "Routines" ) +Include.File( "Base" ) + +--- The MENU class +-- @type MENU +-- @extends Base#BASE +MENU = { + ClassName = "MENU", + MenuPath = nil, + MenuText = "", + MenuParentPath = nil +} + +--- +function MENU:New( MenuText, MenuParentPath ) + + -- Arrange meta tables + local Child = BASE:Inherit( self, BASE:New() ) + + Child.MenuPath = nil + Child.MenuText = MenuText + Child.MenuParentPath = MenuParentPath + return Child +end + +--- The COMMANDMENU class +-- @type COMMANDMENU +-- @extends Menu#MENU +COMMANDMENU = { + ClassName = "COMMANDMENU", + CommandMenuFunction = nil, + CommandMenuArgument = nil +} + +function COMMANDMENU:New( MenuText, ParentMenu, CommandMenuFunction, CommandMenuArgument ) + + -- Arrange meta tables + + local MenuParentPath = nil + if ParentMenu ~= nil then + MenuParentPath = ParentMenu.MenuPath + end + + local Child = BASE:Inherit( self, MENU:New( MenuText, MenuParentPath ) ) + + Child.MenuPath = missionCommands.addCommand( MenuText, MenuParentPath, CommandMenuFunction, CommandMenuArgument ) + Child.CommandMenuFunction = CommandMenuFunction + Child.CommandMenuArgument = CommandMenuArgument + return Child +end + +--- The SUBMENU class +-- @type SUBMENU +-- @extends Menu#MENU +SUBMENU = { + ClassName = "SUBMENU" +} + +function SUBMENU:New( MenuText, ParentMenu ) + + -- Arrange meta tables + local MenuParentPath = nil + if ParentMenu ~= nil then + MenuParentPath = ParentMenu.MenuPath + end + + local Child = BASE:Inherit( self, MENU:New( MenuText, MenuParentPath ) ) + + Child.MenuPath = missionCommands.addSubMenu( MenuText, MenuParentPath ) + return Child +end + +-- This local variable is used to cache the menus registered under clients. +-- Menus don't dissapear when clients are destroyed and restarted. +-- So every menu for a client created must be tracked so that program logic accidentally does not create +-- the same menus twice during initialization logic. +-- These menu classes are handling this logic with this variable. +local _MENUCLIENTS = {} + +--- The MENU_CLIENT class +-- @type MENU_CLIENT +-- @extends Menu#MENU +MENU_CLIENT = { + ClassName = "MENU_CLIENT" +} + +--- Creates a new menu item for a group +-- @param self +-- @param Client#CLIENT MenuClient The Client owning the menu. +-- @param #string MenuText The text for the menu. +-- @param #table ParentMenu The parent menu. +-- @return #MENU_CLIENT self +function MENU_CLIENT:New( MenuClient, MenuText, ParentMenu ) + + -- Arrange meta tables + local MenuParentPath = {} + if ParentMenu ~= nil then + MenuParentPath = ParentMenu.MenuPath + end + + local self = BASE:Inherit( self, MENU:New( MenuText, MenuParentPath ) ) + self:F( { MenuClient, MenuText, ParentMenu } ) + + self.MenuClient = MenuClient + self.MenuClientGroupID = MenuClient:GetClientGroupID() + self.MenuParentPath = MenuParentPath + self.MenuText = MenuText + self.ParentMenu = ParentMenu + + self.Menus = {} + + if not _MENUCLIENTS[self.MenuClientGroupID] then + _MENUCLIENTS[self.MenuClientGroupID] = {} + end + + local MenuPath = _MENUCLIENTS[self.MenuClientGroupID] + + self:T( { MenuClient:GetClientGroupName(), MenuPath[table.concat(MenuParentPath)], MenuParentPath, MenuText } ) + + local MenuPathID = table.concat(MenuParentPath) .. "/" .. MenuText + if MenuPath[MenuPathID] then + missionCommands.removeItemForGroup( self.MenuClient:GetClientGroupID(), MenuPath[MenuPathID] ) + end + + self.MenuPath = missionCommands.addSubMenuForGroup( self.MenuClient:GetClientGroupID(), MenuText, MenuParentPath ) + MenuPath[MenuPathID] = self.MenuPath + + self:T( { MenuClient:GetClientGroupName(), self.MenuPath } ) + + if ParentMenu and ParentMenu.Menus then + ParentMenu.Menus[self.MenuPath] = self + end + return self +end + +--- Removes the sub menus recursively of this MENU_CLIENT. +-- @param #MENU_CLIENT self +-- @return #MENU_CLIENT self +function MENU_CLIENT:RemoveSubMenus() + self:F( self.MenuPath ) + + for MenuID, Menu in pairs( self.Menus ) do + Menu:Remove() + end + +end + +--- Removes the sub menus recursively of this MENU_CLIENT. +-- @param #MENU_CLIENT self +-- @return #MENU_CLIENT self +function MENU_CLIENT:Remove() + self:F( self.MenuPath ) + + self:RemoveSubMenus() + + if not _MENUCLIENTS[self.MenuClientGroupID] then + _MENUCLIENTS[self.MenuClientGroupID] = {} + end + + local MenuPath = _MENUCLIENTS[self.MenuClientGroupID] + + if MenuPath[table.concat(self.MenuParentPath) .. "/" .. self.MenuText] then + MenuPath[table.concat(self.MenuParentPath) .. "/" .. self.MenuText] = nil + end + + missionCommands.removeItemForGroup( self.MenuClient:GetClientGroupID(), self.MenuPath ) + self.ParentMenu.Menus[self.MenuPath] = nil + return nil +end + + +--- The MENU_CLIENT_COMMAND class +-- @type MENU_CLIENT_COMMAND +-- @extends Menu#MENU +MENU_CLIENT_COMMAND = { + ClassName = "MENU_CLIENT_COMMAND" +} + +--- Creates a new radio command item for a group +-- @param self +-- @param Client#CLIENT MenuClient The Client owning the menu. +-- @param MenuText The text for the menu. +-- @param ParentMenu The parent menu. +-- @param CommandMenuFunction A function that is called when the menu key is pressed. +-- @param CommandMenuArgument An argument for the function. +-- @return Menu#MENU_CLIENT_COMMAND self +function MENU_CLIENT_COMMAND:New( MenuClient, MenuText, ParentMenu, CommandMenuFunction, CommandMenuArgument ) + + -- Arrange meta tables + + local MenuParentPath = {} + if ParentMenu ~= nil then + MenuParentPath = ParentMenu.MenuPath + end + + local self = BASE:Inherit( self, MENU:New( MenuText, MenuParentPath ) ) + + self.MenuClient = MenuClient + self.MenuClientGroupID = MenuClient:GetClientGroupID() + self.MenuParentPath = MenuParentPath + self.MenuText = MenuText + self.ParentMenu = ParentMenu + + if not _MENUCLIENTS[self.MenuClientGroupID] then + _MENUCLIENTS[self.MenuClientGroupID] = {} + end + + local MenuPath = _MENUCLIENTS[self.MenuClientGroupID] + + self:T( { MenuClient:GetClientGroupName(), MenuPath[table.concat(MenuParentPath)], MenuParentPath, MenuText, CommandMenuFunction, CommandMenuArgument } ) + + local MenuPathID = table.concat(MenuParentPath) .. "/" .. MenuText + if MenuPath[MenuPathID] then + missionCommands.removeItemForGroup( self.MenuClient:GetClientGroupID(), MenuPath[MenuPathID] ) + end + + self.MenuPath = missionCommands.addCommandForGroup( self.MenuClient:GetClientGroupID(), MenuText, MenuParentPath, CommandMenuFunction, CommandMenuArgument ) + MenuPath[MenuPathID] = self.MenuPath + + self.CommandMenuFunction = CommandMenuFunction + self.CommandMenuArgument = CommandMenuArgument + + ParentMenu.Menus[self.MenuPath] = self + + return self +end + +function MENU_CLIENT_COMMAND:Remove() + self:F( self.MenuPath ) + + if not _MENUCLIENTS[self.MenuClientGroupID] then + _MENUCLIENTS[self.MenuClientGroupID] = {} + end + + local MenuPath = _MENUCLIENTS[self.MenuClientGroupID] + + if MenuPath[table.concat(self.MenuParentPath) .. "/" .. self.MenuText] then + MenuPath[table.concat(self.MenuParentPath) .. "/" .. self.MenuText] = nil + end + + missionCommands.removeItemForGroup( self.MenuClient:GetClientGroupID(), self.MenuPath ) + self.ParentMenu.Menus[self.MenuPath] = nil + return nil +end + + +--- The MENU_COALITION class +-- @type MENU_COALITION +-- @extends Menu#MENU +MENU_COALITION = { + ClassName = "MENU_COALITION" +} + +--- Creates a new coalition menu item +-- @param #MENU_COALITION self +-- @param DCSCoalition#coalition.side MenuCoalition The coalition owning the menu. +-- @param #string MenuText The text for the menu. +-- @param #table ParentMenu The parent menu. +-- @return #MENU_COALITION self +function MENU_COALITION:New( MenuCoalition, MenuText, ParentMenu ) + + -- Arrange meta tables + local MenuParentPath = {} + if ParentMenu ~= nil then + MenuParentPath = ParentMenu.MenuPath + end + + local self = BASE:Inherit( self, MENU:New( MenuText, MenuParentPath ) ) + self:F( { MenuCoalition, MenuText, ParentMenu } ) + + self.MenuCoalition = MenuCoalition + self.MenuParentPath = MenuParentPath + self.MenuText = MenuText + self.ParentMenu = ParentMenu + + self.Menus = {} + + self:T( { MenuParentPath, MenuText } ) + + self.MenuPath = missionCommands.addSubMenuForCoalition( self.MenuCoalition, MenuText, MenuParentPath ) + + self:T( { self.MenuPath } ) + + if ParentMenu and ParentMenu.Menus then + ParentMenu.Menus[self.MenuPath] = self + end + return self +end + +--- Removes the sub menus recursively of this MENU_COALITION. +-- @param #MENU_COALITION self +-- @return #MENU_COALITION self +function MENU_COALITION:RemoveSubMenus() + self:F( self.MenuPath ) + + for MenuID, Menu in pairs( self.Menus ) do + Menu:Remove() + end + +end + +--- Removes the sub menus recursively of this MENU_COALITION. +-- @param #MENU_COALITION self +-- @return #MENU_COALITION self +function MENU_COALITION:Remove() + self:F( self.MenuPath ) + + self:RemoveSubMenus() + missionCommands.removeItemForCoalition( self.MenuCoalition, self.MenuPath ) + self.ParentMenu.Menus[self.MenuPath] = nil + + return nil +end + + +--- The MENU_COALITION_COMMAND class +-- @type MENU_COALITION_COMMAND +-- @extends Menu#MENU +MENU_COALITION_COMMAND = { + ClassName = "MENU_COALITION_COMMAND" +} + +--- Creates a new radio command item for a group +-- @param #MENU_COALITION_COMMAND self +-- @param DCSCoalition#coalition.side MenuCoalition The coalition owning the menu. +-- @param MenuText The text for the menu. +-- @param ParentMenu The parent menu. +-- @param CommandMenuFunction A function that is called when the menu key is pressed. +-- @param CommandMenuArgument An argument for the function. +-- @return #MENU_COALITION_COMMAND self +function MENU_COALITION_COMMAND:New( MenuCoalition, MenuText, ParentMenu, CommandMenuFunction, CommandMenuArgument ) + + -- Arrange meta tables + + local MenuParentPath = {} + if ParentMenu ~= nil then + MenuParentPath = ParentMenu.MenuPath + end + + local self = BASE:Inherit( self, MENU:New( MenuText, MenuParentPath ) ) + + self.MenuCoalition = MenuCoalition + self.MenuParentPath = MenuParentPath + self.MenuText = MenuText + self.ParentMenu = ParentMenu + + self:T( { MenuParentPath, MenuText, CommandMenuFunction, CommandMenuArgument } ) + + self.MenuPath = missionCommands.addCommandForCoalition( self.MenuCoalition, MenuText, MenuParentPath, CommandMenuFunction, CommandMenuArgument ) + + self.CommandMenuFunction = CommandMenuFunction + self.CommandMenuArgument = CommandMenuArgument + + ParentMenu.Menus[self.MenuPath] = self + + return self +end + +--- Removes a radio command item for a coalition +-- @param #MENU_COALITION_COMMAND self +-- @return #MENU_COALITION_COMMAND self +function MENU_COALITION_COMMAND:Remove() + self:F( self.MenuPath ) + + missionCommands.removeItemForCoalition( self.MenuCoalition, self.MenuPath ) + self.ParentMenu.Menus[self.MenuPath] = nil + return nil +end +--- GROUP class. +-- +-- @{GROUP} class +-- ============== +-- The @{GROUP} class is a wrapper class to handle the DCS Group objects: +-- +-- * Support all DCS Group APIs. +-- * Enhance with Group specific APIs not in the DCS Group API set. +-- * Handle local Group Controller. +-- * Manage the "state" of the DCS Group. +-- +-- +-- GROUP reference methods +-- ======================= +-- For each DCS Group object alive within a running mission, a GROUP wrapper object (instance) will be created within the _@{DATABASE} object. +-- This is done at the beginning of the mission (when the mission starts), and dynamically when new DCS Group objects are spawned (using the @{SPAWN} class). +-- +-- The GROUP class does not contain a :New() method, rather it provides :Find() methods to retrieve the object reference +-- using the DCS Group or the DCS GroupName. +-- +-- Another thing to know is that GROUP objects do not "contain" the DCS Group object. +-- The GROUP methods will reference the DCS Group object by name when it is needed during API execution. +-- If the DCS Group object does not exist or is nil, the GROUP methods will return nil and log an exception in the DCS.log file. +-- +-- The GROUP class provides the following functions to retrieve quickly the relevant GROUP instance: +-- +-- * @{#GROUP.Find}(): Find a GROUP instance from the _DATABASE object using a DCS Group object. +-- * @{#GROUP.FindByName}(): Find a GROUP instance from the _DATABASE object using a DCS Group name. +-- +-- IMPORTANT: ONE SHOULD NEVER SANATIZE these GROUP OBJECT REFERENCES! (make the GROUP object references nil). +-- @module Group +-- @author FlightControl + +Include.File( "Routines" ) +Include.File( "Base" ) +Include.File( "Message" ) +Include.File( "Unit" ) + +--- The GROUP class +-- @type GROUP +-- @extends Base#BASE +-- @field DCSGroup#Group DCSGroup The DCS group class. +-- @field #string GroupName The name of the group. +GROUP = { + ClassName = "GROUP", + GroupName = "", + GroupID = 0, + Controller = nil, + DCSGroup = nil, + WayPointFunctions = {}, +} + +--- A DCSGroup +-- @type DCSGroup +-- @field id_ The ID of the group in DCS + +--- Create a new GROUP from a DCSGroup +-- @param #GROUP self +-- @param DCSGroup#Group GroupName The DCS Group name +-- @return #GROUP self +function GROUP:Register( GroupName ) + local self = BASE:Inherit( self, BASE:New() ) + self:F2( GroupName ) + self.GroupName = GroupName + return self +end + +-- Reference methods. + +--- Find the GROUP wrapper class instance using the DCS Group. +-- @param #GROUP self +-- @param DCSGroup#Group DCSGroup The DCS Group. +-- @return #GROUP The GROUP. +function GROUP:Find( DCSGroup ) + + local GroupName = DCSGroup:getName() -- Group#GROUP + local GroupFound = _DATABASE:FindGroup( GroupName ) + return GroupFound +end + +--- Find the created GROUP using the DCS Group Name. +-- @param #GROUP self +-- @param #string GroupName The DCS Group Name. +-- @return #GROUP The GROUP. +function GROUP:FindByName( GroupName ) + + local GroupFound = _DATABASE:FindGroup( GroupName ) + return GroupFound +end + +-- DCS Group methods support. + +--- Returns the DCS Group. +-- @param #GROUP self +-- @return DCSGroup#Group The DCS Group. +function GROUP:GetDCSGroup() + local DCSGroup = Group.getByName( self.GroupName ) + + if DCSGroup then + return DCSGroup + end + + return nil +end + + +--- Returns if the DCS Group is alive. +-- When the group exists at run-time, this method will return true, otherwise false. +-- @param #GROUP self +-- @return #boolean true if the DCS Group is alive. +function GROUP:IsAlive() + self:F2( self.GroupName ) + + local DCSGroup = self:GetDCSGroup() + + if DCSGroup then + local GroupIsAlive = DCSGroup:isExist() + self:T3( GroupIsAlive ) + return GroupIsAlive + end + + return nil +end + +--- Destroys the DCS Group and all of its DCS Units. +-- Note that this destroy method also raises a destroy event at run-time. +-- So all event listeners will catch the destroy event of this DCS Group. +-- @param #GROUP self +function GROUP:Destroy() + self:F2( self.GroupName ) + + local DCSGroup = self:GetDCSGroup() + + if DCSGroup then + for Index, UnitData in pairs( DCSGroup:getUnits() ) do + self:CreateEventCrash( timer.getTime(), UnitData ) + end + DCSGroup:destroy() + DCSGroup = nil + end + + return nil +end + +--- Returns category of the DCS Group. +-- @param #GROUP self +-- @return DCSGroup#Group.Category The category ID +function GROUP:GetCategory() + self:F2( self.GroupName ) + + local DCSGroup = self:GetDCSGroup() + if DCSGroup then + local GroupCategory = DCSGroup:getCategory() + self:T3( GroupCategory ) + return GroupCategory + end + + return nil +end + +--- Returns the category name of the DCS Group. +-- @param #GROUP self +-- @return #string Category name = Helicopter, Airplane, Ground Unit, Ship +function GROUP:GetCategoryName() + self:F2( self.GroupName ) + + local DCSGroup = self:GetDCSGroup() + if DCSGroup then + local CategoryNames = { + [Group.Category.AIRPLANE] = "Airplane", + [Group.Category.HELICOPTER] = "Helicopter", + [Group.Category.GROUND] = "Ground Unit", + [Group.Category.SHIP] = "Ship", + } + local GroupCategory = DCSGroup:getCategory() + self:T3( GroupCategory ) + + return CategoryNames[GroupCategory] + end + + return nil +end + + +--- Returns the coalition of the DCS Group. +-- @param #GROUP self +-- @return DCSCoalitionObject#coalition.side The coalition side of the DCS Group. +function GROUP:GetCoalition() + self:F2( self.GroupName ) + + local DCSGroup = self:GetDCSGroup() + if DCSGroup then + local GroupCoalition = DCSGroup:getCoalition() + self:T3( GroupCoalition ) + return GroupCoalition + end + + return nil +end + +--- Returns the country of the DCS Group. +-- @param #GROUP self +-- @return DCScountry#country.id The country identifier. +-- @return #nil The DCS Group is not existing or alive. +function GROUP:GetCountry() + self:F2( self.GroupName ) + + local DCSGroup = self:GetDCSGroup() + if DCSGroup then + local GroupCountry = DCSGroup:getUnit(1):getCountry() + self:T3( GroupCountry ) + return GroupCountry + end + + return nil +end + +--- Returns the name of the DCS Group. +-- @param #GROUP self +-- @return #string The DCS Group name. +function GROUP:GetName() + self:F2( self.GroupName ) + + local DCSGroup = self:GetDCSGroup() + + if DCSGroup then + local GroupName = DCSGroup:getName() + self:T3( GroupName ) + return GroupName + end + + return nil +end + +--- Returns the DCS Group identifier. +-- @param #GROUP self +-- @return #number The identifier of the DCS Group. +function GROUP:GetID() + self:F2( self.GroupName ) + + local DCSGroup = self:GetDCSGroup() + + if DCSGroup then + local GroupID = DCSGroup:getID() + self:T3( GroupID ) + return GroupID + end + + return nil +end + +--- Returns the UNIT wrapper class with number UnitNumber. +-- If the underlying DCS Unit does not exist, the method will return nil. . +-- @param #GROUP self +-- @param #number UnitNumber The number of the UNIT wrapper class to be returned. +-- @return Unit#UNIT The UNIT wrapper class. +function GROUP:GetUnit( UnitNumber ) + self:F2( { self.GroupName, UnitNumber } ) + + local DCSGroup = self:GetDCSGroup() + + if DCSGroup then + local UnitFound = UNIT:Find( DCSGroup:getUnit( UnitNumber ) ) + self:T3( UnitFound.UnitName ) + self:T2( UnitFound ) + return UnitFound + end + + return nil +end + +--- Returns the DCS Unit with number UnitNumber. +-- If the underlying DCS Unit does not exist, the method will return nil. . +-- @param #GROUP self +-- @param #number UnitNumber The number of the DCS Unit to be returned. +-- @return DCSUnit#Unit The DCS Unit. +function GROUP:GetDCSUnit( UnitNumber ) + self:F2( { self.GroupName, UnitNumber } ) + + local DCSGroup = self:GetDCSGroup() + + if DCSGroup then + local DCSUnitFound = DCSGroup:getUnit( UnitNumber ) + self:T3( DCSUnitFound ) + return DCSUnitFound + end + + return nil +end + +--- Returns current size of the DCS Group. +-- If some of the DCS Units of the DCS Group are destroyed the size of the DCS Group is changed. +-- @param #GROUP self +-- @return #number The DCS Group size. +function GROUP:GetSize() + self:F2( { self.GroupName } ) + local DCSGroup = self:GetDCSGroup() + + if DCSGroup then + local GroupSize = DCSGroup:getSize() + self:T3( GroupSize ) + return GroupSize + end + + return nil +end + +--- +--- Returns the initial size of the DCS Group. +-- If some of the DCS Units of the DCS Group are destroyed, the initial size of the DCS Group is unchanged. +-- @param #GROUP self +-- @return #number The DCS Group initial size. +function GROUP:GetInitialSize() + self:F2( { self.GroupName } ) + local DCSGroup = self:GetDCSGroup() + + if DCSGroup then + local GroupInitialSize = DCSGroup:getInitialSize() + self:T3( GroupInitialSize ) + return GroupInitialSize + end + + return nil +end + +--- Returns the UNITs wrappers of the DCS Units of the DCS Group. +-- @param #GROUP self +-- @return #table The UNITs wrappers. +function GROUP:GetUnits() + self:F2( { self.GroupName } ) + local DCSGroup = self:GetDCSGroup() + + if DCSGroup then + local DCSUnits = DCSGroup:getUnits() + local Units = {} + for Index, UnitData in pairs( DCSUnits ) do + Units[#Units+1] = UNIT:Find( UnitData ) + end + self:T3( Units ) + return Units + end + + return nil +end + + +--- Returns the DCS Units of the DCS Group. +-- @param #GROUP self +-- @return #table The DCS Units. +function GROUP:GetDCSUnits() + self:F2( { self.GroupName } ) + local DCSGroup = self:GetDCSGroup() + + if DCSGroup then + local DCSUnits = DCSGroup:getUnits() + self:T3( DCSUnits ) + return DCSUnits + end + + return nil +end + +--- Get the controller for the GROUP. +-- @param #GROUP self +-- @return DCSController#Controller +function GROUP:_GetController() + self:F2( { self.GroupName } ) + local DCSGroup = self:GetDCSGroup() + + if DCSGroup then + local GroupController = DCSGroup:getController() + self:T3( GroupController ) + return GroupController + end + + return nil +end + + +--- Retrieve the group mission and allow to place function hooks within the mission waypoint plan. +-- Use the method @{Group#GROUP:WayPointFunction} to define the hook functions for specific waypoints. +-- Use the method @{Group@GROUP:WayPointExecute) to start the execution of the new mission plan. +-- Note that when WayPointInitialize is called, the Mission of the group is RESTARTED! +-- @param #GROUP self +-- @return #GROUP +function GROUP:WayPointInitialize() + + self.WayPoints = self:GetTaskRoute() + + return self +end + + +--- Registers a waypoint function that will be executed when the group moves over the WayPoint. +-- @param #GROUP self +-- @param #number WayPoint The waypoint number. Note that the start waypoint on the route is WayPoint 1! +-- @param #number WayPointIndex When defining multiple WayPoint functions for one WayPoint, use WayPointIndex to set the sequence of actions. +-- @param #function WayPointFunction The waypoint function to be called when the group moves over the waypoint. The waypoint function takes variable parameters. +-- @return #GROUP +function GROUP:WayPointFunction( WayPoint, WayPointIndex, WayPointFunction, ... ) + self:F2( { WayPoint, WayPointIndex, WayPointFunction } ) + + table.insert( self.WayPoints[WayPoint].task.params.tasks, WayPointIndex ) + self.WayPoints[WayPoint].task.params.tasks[WayPointIndex] = self:TaskFunction( WayPoint, WayPointIndex, WayPointFunction, arg ) + return self +end + + +function GROUP:TaskFunction( WayPoint, WayPointIndex, FunctionString, FunctionArguments ) + + local DCSTask + + local DCSScript = {} + DCSScript[#DCSScript+1] = "local MissionGroup = GROUP:Find( ... ) " + + if FunctionArguments.n > 0 then + DCSScript[#DCSScript+1] = FunctionString .. "( MissionGroup, " .. table.concat( FunctionArguments, "," ) .. ")" + else + DCSScript[#DCSScript+1] = FunctionString .. "( MissionGroup )" + end + + DCSTask = self:TaskWrappedAction( + self:CommandDoScript( + table.concat( DCSScript ) + ), WayPointIndex + ) + + self:T3( DCSTask ) + + return DCSTask + +end + + + +--- Executes the WayPoint plan. +-- The function gets a WayPoint parameter, that you can use to restart the mission at a specific WayPoint. +-- Note that when the WayPoint parameter is used, the new start mission waypoint of the group will be 1! +-- @param #GROUP self +-- @param #number WayPoint The WayPoint from where to execute the mission. +-- @param #number WaitTime The amount seconds to wait before initiating the mission. +-- @return #GROUP +function GROUP:WayPointExecute( WayPoint, WaitTime ) + + if not WayPoint then + WayPoint = 1 + end + + -- When starting the mission from a certain point, the TaskPoints need to be deleted before the given WayPoint. + for TaskPointID = 1, WayPoint - 1 do + table.remove( self.WayPoints, 1 ) + end + + self:T3( self.WayPoints ) + + self:SetTask( self:TaskRoute( self.WayPoints ), WaitTime ) + + return self +end + + +--- Activates a GROUP. +-- @param #GROUP self +function GROUP:Activate() + self:F2( { self.GroupName } ) + trigger.action.activateGroup( self:GetDCSGroup() ) + return self:GetDCSGroup() +end + + +--- Gets the type name of the group. +-- @param #GROUP self +-- @return #string The type name of the group. +function GROUP:GetTypeName() + self:F2( self.GroupName ) + + local DCSGroup = self:GetDCSGroup() + + if DCSGroup then + local GroupTypeName = DCSGroup:getUnit(1):getTypeName() + self:T3( GroupTypeName ) + return( GroupTypeName ) + end + + return nil +end + +--- Gets the CallSign of the first DCS Unit of the DCS Group. +-- @param #GROUP self +-- @return #string The CallSign of the first DCS Unit of the DCS Group. +function GROUP:GetCallsign() + self:F2( self.GroupName ) + + local DCSGroup = self:GetDCSGroup() + + if DCSGroup then + local GroupCallSign = DCSGroup:getUnit(1):getCallsign() + self:T3( GroupCallSign ) + return GroupCallSign + end + + return nil +end + +--- Returns the current point (Vec2 vector) of the first DCS Unit in the DCS Group. +-- @return DCSTypes#Vec2 Current Vec2 point of the first DCS Unit of the DCS Group. +function GROUP:GetPointVec2() + self:F2( self.GroupName ) + + local GroupPointVec2 = self:GetUnit(1):GetPointVec2() + self:T3( GroupPointVec2 ) + return GroupPointVec2 +end + +--- Returns the current point (Vec3 vector) of the first DCS Unit in the DCS Group. +-- @return DCSTypes#Vec3 Current Vec3 point of the first DCS Unit of the DCS Group. +function GROUP:GetPointVec3() + self:F2( self.GroupName ) + + local GroupPointVec3 = self:GetUnit(1):GetPointVec3() + self:T3( GroupPointVec3 ) + return GroupPointVec3 +end + + + +-- Is Functions + +--- Returns if all units of the group are within a @{Zone#ZONE}. +-- @param #GROUP self +-- @param Zone#ZONE_BASE Zone The zone to test. +-- @return #boolean Returns true if the Group is completely within the @{Zone#ZONE} +function GROUP:IsCompletelyInZone( Zone ) + self:F2( { self.GroupName, Zone } ) + + for UnitID, UnitData in pairs( self:GetUnits() ) do + local Unit = UnitData -- Unit#UNIT + if Zone:IsPointVec3InZone( Unit:GetPointVec3() ) then + else + return false + end + end + + return true +end + +--- Returns if the group is of an air category. +-- If the group is a helicopter or a plane, then this method will return true, otherwise false. +-- @param #GROUP self +-- @return #boolean Air category evaluation result. +function GROUP:IsAir() + self:F2( self.GroupName ) + + local DCSGroup = self:GetDCSGroup() + + if DCSGroup then + local IsAirResult = DCSGroup:getCategory() == Group.Category.AIRPLANE or DCSGroup:getCategory() == Group.Category.HELICOPTER + self:T3( IsAirResult ) + return IsAirResult + end + + return nil +end + +--- Returns if the DCS Group contains Helicopters. +-- @param #GROUP self +-- @return #boolean true if DCS Group contains Helicopters. +function GROUP:IsHelicopter() + self:F2( self.GroupName ) + + local DCSGroup = self:GetDCSGroup() + + if DCSGroup then + local GroupCategory = DCSGroup:getCategory() + self:T2( GroupCategory ) + return GroupCategory == Group.Category.HELICOPTER + end + + return nil +end + +--- Returns if the DCS Group contains AirPlanes. +-- @param #GROUP self +-- @return #boolean true if DCS Group contains AirPlanes. +function GROUP:IsAirPlane() + self:F2() + + local DCSGroup = self:GetDCSGroup() + + if DCSGroup then + local GroupCategory = DCSGroup:getCategory() + self:T2( GroupCategory ) + return GroupCategory == Group.Category.AIRPLANE + end + + return nil +end + +--- Returns if the DCS Group contains Ground troops. +-- @param #GROUP self +-- @return #boolean true if DCS Group contains Ground troops. +function GROUP:IsGround() + self:F2() + + local DCSGroup = self:GetDCSGroup() + + if DCSGroup then + local GroupCategory = DCSGroup:getCategory() + self:T2( GroupCategory ) + return GroupCategory == Group.Category.GROUND + end + + return nil +end + +--- Returns if the DCS Group contains Ships. +-- @param #GROUP self +-- @return #boolean true if DCS Group contains Ships. +function GROUP:IsShip() + self:F2() + + local DCSGroup = self:GetDCSGroup() + + if DCSGroup then + local GroupCategory = DCSGroup:getCategory() + self:T2( GroupCategory ) + return GroupCategory == Group.Category.SHIP + end + + return nil +end + +--- Returns if all units of the group are on the ground or landed. +-- If all units of this group are on the ground, this function will return true, otherwise false. +-- @param #GROUP self +-- @return #boolean All units on the ground result. +function GROUP:AllOnGround() + self:F2() + + local DCSGroup = self:GetDCSGroup() + + if DCSGroup then + local AllOnGroundResult = true + + for Index, UnitData in pairs( DCSGroup:getUnits() ) do + if UnitData:inAir() then + AllOnGroundResult = false + end + end + + self:T3( AllOnGroundResult ) + return AllOnGroundResult + end + + return nil +end + +--- Returns the current maximum velocity of the group. +-- Each unit within the group gets evaluated, and the maximum velocity (= the unit which is going the fastest) is returned. +-- @param #GROUP self +-- @return #number Maximum velocity found. +function GROUP:GetMaxVelocity() + self:F2() + + local DCSGroup = self:GetDCSGroup() + + if DCSGroup then + local MaxVelocity = 0 + + for Index, UnitData in pairs( DCSGroup:getUnits() ) do + + local Velocity = UnitData:getVelocity() + local VelocityTotal = math.abs( Velocity.x ) + math.abs( Velocity.y ) + math.abs( Velocity.z ) + + if VelocityTotal < MaxVelocity then + MaxVelocity = VelocityTotal + end + end + + return MaxVelocity + end + + return nil +end + +--- Returns the current minimum height of the group. +-- Each unit within the group gets evaluated, and the minimum height (= the unit which is the lowest elevated) is returned. +-- @param #GROUP self +-- @return #number Minimum height found. +function GROUP:GetMinHeight() + self:F2() + +end + +--- Returns the current maximum height of the group. +-- Each unit within the group gets evaluated, and the maximum height (= the unit which is the highest elevated) is returned. +-- @param #GROUP self +-- @return #number Maximum height found. +function GROUP:GetMaxHeight() + self:F2() + +end + +-- Tasks + +--- Popping current Task from the group. +-- @param #GROUP self +-- @return Group#GROUP self +function GROUP:PopCurrentTask() + self:F2() + + local DCSGroup = self:GetDCSGroup() + + if DCSGroup then + local Controller = self:_GetController() + Controller:popTask() + return self + end + + return nil +end + +--- Pushing Task on the queue from the group. +-- @param #GROUP self +-- @return Group#GROUP self +function GROUP:PushTask( DCSTask, WaitTime ) + self:F2() + + local DCSGroup = self:GetDCSGroup() + + if DCSGroup then + local Controller = self:_GetController() + + -- When a group SPAWNs, it takes about a second to get the group in the simulator. Setting tasks to unspawned groups provides unexpected results. + -- Therefore we schedule the functions to set the mission and options for the Group. + -- Controller:pushTask( DCSTask ) + + if WaitTime then + --routines.scheduleFunction( Controller.pushTask, { Controller, DCSTask }, timer.getTime() + WaitTime ) + SCHEDULER:New( Controller, Controller.pushTask, { DCSTask }, WaitTime ) + else + Controller:pushTask( DCSTask ) + end + + return self + end + + return nil +end + +--- Clearing the Task Queue and Setting the Task on the queue from the group. +-- @param #GROUP self +-- @return Group#GROUP self +function GROUP:SetTask( DCSTask, WaitTime ) + self:F2( { DCSTask } ) + + local DCSGroup = self:GetDCSGroup() + + if DCSGroup then + + local Controller = self:_GetController() + + -- When a group SPAWNs, it takes about a second to get the group in the simulator. Setting tasks to unspawned groups provides unexpected results. + -- Therefore we schedule the functions to set the mission and options for the Group. + -- Controller.setTask( Controller, DCSTask ) + + if not WaitTime then + WaitTime = 1 + end + --routines.scheduleFunction( Controller.setTask, { Controller, DCSTask }, timer.getTime() + WaitTime ) + SCHEDULER:New( Controller, Controller.setTask, { DCSTask }, WaitTime ) + + return self + end + + return nil +end + + +--- Return a condition section for a controlled task +-- @param #GROUP self +-- @param DCSTime#Time time +-- @param #string userFlag +-- @param #boolean userFlagValue +-- @param #string condition +-- @param DCSTime#Time duration +-- @param #number lastWayPoint +-- return DCSTask#Task +function GROUP:TaskCondition( time, userFlag, userFlagValue, condition, duration, lastWayPoint ) + self:F2( { time, userFlag, userFlagValue, condition, duration, lastWayPoint } ) + + local DCSStopCondition = {} + DCSStopCondition.time = time + DCSStopCondition.userFlag = userFlag + DCSStopCondition.userFlagValue = userFlagValue + DCSStopCondition.condition = condition + DCSStopCondition.duration = duration + DCSStopCondition.lastWayPoint = lastWayPoint + + self:T3( { DCSStopCondition } ) + return DCSStopCondition +end + +--- Return a Controlled Task taking a Task and a TaskCondition +-- @param #GROUP self +-- @param DCSTask#Task DCSTask +-- @param #DCSStopCondition DCSStopCondition +-- @return DCSTask#Task +function GROUP:TaskControlled( DCSTask, DCSStopCondition ) + self:F2( { DCSTask, DCSStopCondition } ) + + local DCSTaskControlled + + DCSTaskControlled = { + id = 'ControlledTask', + params = { + task = DCSTask, + stopCondition = DCSStopCondition + } + } + + self:T3( { DCSTaskControlled } ) + return DCSTaskControlled +end + +--- Return a Combo Task taking an array of Tasks +-- @param #GROUP self +-- @param DCSTask#TaskArray DCSTasks Array of @{DCSTask#Task} +-- @return DCSTask#Task +function GROUP:TaskCombo( DCSTasks ) + self:F2( { DCSTasks } ) + + local DCSTaskCombo + + DCSTaskCombo = { + id = 'ComboTask', + params = { + tasks = DCSTasks + } + } + + self:T3( { DCSTaskCombo } ) + return DCSTaskCombo +end + +--- Return a WrappedAction Task taking a Command +-- @param #GROUP self +-- @param DCSCommand#Command DCSCommand +-- @return DCSTask#Task +function GROUP:TaskWrappedAction( DCSCommand, Index ) + self:F2( { DCSCommand } ) + + local DCSTaskWrappedAction + + DCSTaskWrappedAction = { + id = "WrappedAction", + enabled = true, + number = Index, + auto = false, + params = { + action = DCSCommand, + }, + } + + self:T3( { DCSTaskWrappedAction } ) + return DCSTaskWrappedAction +end + +--- Executes a command action +-- @param #GROUP self +-- @param DCSCommand#Command DCSCommand +-- @return #GROUP self +function GROUP:SetCommand( DCSCommand ) + self:F2( DCSCommand ) + + local DCSGroup = self:GetDCSGroup() + + if DCSGroup then + local Controller = self:_GetController() + Controller:setCommand( DCSCommand ) + return self + end + + return nil +end + +--- Perform a switch waypoint command +-- @param #GROUP self +-- @param #number FromWayPoint +-- @param #number ToWayPoint +-- @return DCSTask#Task +function GROUP:CommandSwitchWayPoint( FromWayPoint, ToWayPoint, Index ) + self:F2( { FromWayPoint, ToWayPoint, Index } ) + + local CommandSwitchWayPoint = { + id = 'SwitchWaypoint', + params = { + fromWaypointIndex = FromWayPoint, + goToWaypointIndex = ToWayPoint, + }, + } + + self:T3( { CommandSwitchWayPoint } ) + return CommandSwitchWayPoint +end + + +-- TASKS FOR AIR GROUPS + + +--- (AIR) Attack a Group. +-- @param #GROUP self +-- @param Group#GROUP AttackGroup The Group to be attacked. +-- @param #number WeaponType (optional) Bitmask of weapon types those allowed to use. If parameter is not defined that means no limits on weapon usage. +-- @param DCSTypes#AI.Task.WeaponExpend WeaponExpend (optional) Determines how much weapon will be released at each attack. If parameter is not defined the unit / group will choose expend on its own discretion. +-- @param #number AttackQty (optional) This parameter limits maximal quantity of attack. The aicraft/group will not make more attack than allowed even if the target group not destroyed and the aicraft/group still have ammo. If not defined the aircraft/group will attack target until it will be destroyed or until the aircraft/group will run out of ammo. +-- @param DCSTypes#Azimuth Direction (optional) Desired ingress direction from the target to the attacking aircraft. Group/aircraft will make its attacks from the direction. Of course if there is no way to attack from the direction due the terrain group/aircraft will choose another direction. +-- @param DCSTypes#Distance Altitude (optional) Desired attack start altitude. Group/aircraft will make its attacks from the altitude. If the altitude is too low or too high to use weapon aircraft/group will choose closest altitude to the desired attack start altitude. If the desired altitude is defined group/aircraft will not attack from safe altitude. +-- @param #boolean AttackQtyLimit (optional) The flag determines how to interpret attackQty parameter. If the flag is true then attackQty is a limit on maximal attack quantity for "AttackGroup" and "AttackUnit" tasks. If the flag is false then attackQty is a desired attack quantity for "Bombing" and "BombingRunway" tasks. +-- @return DCSTask#Task The DCS task structure. +function GROUP:TaskAttackGroup( AttackGroup, WeaponType, WeaponExpend, AttackQty, Direction, Altitude, AttackQtyLimit ) + self:F2( { self.GroupName, AttackGroup, WeaponType, WeaponExpend, AttackQty, Direction, Altitude, AttackQtyLimit } ) + + -- AttackGroup = { + -- id = 'AttackGroup', + -- params = { + -- groupId = Group.ID, + -- weaponType = number, + -- expend = enum AI.Task.WeaponExpend, + -- attackQty = number, + -- directionEnabled = boolean, + -- direction = Azimuth, + -- altitudeEnabled = boolean, + -- altitude = Distance, + -- attackQtyLimit = boolean, + -- } + -- } + + local DirectionEnabled = nil + if Direction then + DirectionEnabled = true + end + + local AltitudeEnabled = nil + if Altitude then + AltitudeEnabled = true + end + + local DCSTask + DCSTask = { id = 'AttackGroup', + params = { + groupId = AttackGroup:GetID(), + weaponType = WeaponType, + expend = WeaponExpend, + attackQty = AttackQty, + directionEnabled = DirectionEnabled, + direction = Direction, + altitudeEnabled = AltitudeEnabled, + altitude = Altitude, + attackQtyLimit = AttackQtyLimit, + }, + }, + + self:T3( { DCSTask } ) + return DCSTask +end + + +--- (AIR) Attack the Unit. +-- @param #GROUP self +-- @param Unit#UNIT AttackUnit The unit. +-- @param #number WeaponType (optional) Bitmask of weapon types those allowed to use. If parameter is not defined that means no limits on weapon usage. +-- @param DCSTypes#AI.Task.WeaponExpend WeaponExpend (optional) Determines how much weapon will be released at each attack. If parameter is not defined the unit / group will choose expend on its own discretion. +-- @param #number AttackQty (optional) This parameter limits maximal quantity of attack. The aicraft/group will not make more attack than allowed even if the target group not destroyed and the aicraft/group still have ammo. If not defined the aircraft/group will attack target until it will be destroyed or until the aircraft/group will run out of ammo. +-- @param DCSTypes#Azimuth Direction (optional) Desired ingress direction from the target to the attacking aircraft. Group/aircraft will make its attacks from the direction. Of course if there is no way to attack from the direction due the terrain group/aircraft will choose another direction. +-- @param #boolean AttackQtyLimit (optional) The flag determines how to interpret attackQty parameter. If the flag is true then attackQty is a limit on maximal attack quantity for "AttackGroup" and "AttackUnit" tasks. If the flag is false then attackQty is a desired attack quantity for "Bombing" and "BombingRunway" tasks. +-- @param #boolean GroupAttack (optional) Flag indicates that the target must be engaged by all aircrafts of the group. Has effect only if the task is assigned to a group, not to a single aircraft. +-- @return DCSTask#Task The DCS task structure. +function GROUP:TaskAttackUnit( AttackUnit, WeaponType, WeaponExpend, AttackQty, Direction, AttackQtyLimit, GroupAttack ) + self:F2( { self.GroupName, AttackUnit, WeaponType, WeaponExpend, AttackQty, Direction, AttackQtyLimit, GroupAttack } ) + + -- AttackUnit = { + -- id = 'AttackUnit', + -- params = { + -- unitId = Unit.ID, + -- weaponType = number, + -- expend = enum AI.Task.WeaponExpend + -- attackQty = number, + -- direction = Azimuth, + -- attackQtyLimit = boolean, + -- groupAttack = boolean, + -- } + -- } + + local DCSTask + DCSTask = { id = 'AttackUnit', + params = { + unitId = AttackUnit:GetID(), + weaponType = WeaponType, + expend = WeaponExpend, + attackQty = AttackQty, + direction = Direction, + attackQtyLimit = AttackQtyLimit, + groupAttack = GroupAttack, + }, + }, + + self:T3( { DCSTask } ) + return DCSTask +end + + +--- (AIR) Delivering weapon at the point on the ground. +-- @param #GROUP self +-- @param DCSTypes#Vec2 PointVec2 2D-coordinates of the point to deliver weapon at. +-- @param #number WeaponType (optional) Bitmask of weapon types those allowed to use. If parameter is not defined that means no limits on weapon usage. +-- @param DCSTypes#AI.Task.WeaponExpend WeaponExpend (optional) Determines how much weapon will be released at each attack. If parameter is not defined the unit / group will choose expend on its own discretion. +-- @param #number AttackQty (optional) Desired quantity of passes. The parameter is not the same in AttackGroup and AttackUnit tasks. +-- @param DCSTypes#Azimuth Direction (optional) Desired ingress direction from the target to the attacking aircraft. Group/aircraft will make its attacks from the direction. Of course if there is no way to attack from the direction due the terrain group/aircraft will choose another direction. +-- @param #boolean GroupAttack (optional) Flag indicates that the target must be engaged by all aircrafts of the group. Has effect only if the task is assigned to a group, not to a single aircraft. +-- @return DCSTask#Task The DCS task structure. +function GROUP:TaskBombing( PointVec2, WeaponType, WeaponExpend, AttackQty, Direction, GroupAttack ) + self:F2( { self.GroupName, PointVec2, WeaponType, WeaponExpend, AttackQty, Direction, GroupAttack } ) + +-- Bombing = { +-- id = 'Bombing', +-- params = { +-- point = Vec2, +-- weaponType = number, +-- expend = enum AI.Task.WeaponExpend, +-- attackQty = number, +-- direction = Azimuth, +-- groupAttack = boolean, +-- } +-- } + + local DCSTask + DCSTask = { id = 'Bombing', + params = { + point = PointVec2, + weaponType = WeaponType, + expend = WeaponExpend, + attackQty = AttackQty, + direction = Direction, + groupAttack = GroupAttack, + }, + }, + + self:T3( { DCSTask } ) + return DCSTask +end + +--- (AIR) Orbit at a specified position at a specified alititude during a specified duration with a specified speed. +-- @param #GROUP self +-- @param DCSTypes#Vec2 Point The point to hold the position. +-- @param #number Altitude The altitude to hold the position. +-- @param #number Speed The speed flying when holding the position. +-- @return #GROUP self +function GROUP:TaskOrbitCircleAtVec2( Point, Altitude, Speed ) + self:F2( { self.GroupName, Point, Altitude, Speed } ) + + -- pattern = enum AI.Task.OribtPattern, + -- point = Vec2, + -- point2 = Vec2, + -- speed = Distance, + -- altitude = Distance + + local LandHeight = land.getHeight( Point ) + + self:T3( { LandHeight } ) + + local DCSTask = { id = 'Orbit', + params = { pattern = AI.Task.OrbitPattern.CIRCLE, + point = Point, + speed = Speed, + altitude = Altitude + LandHeight + } + } + + + -- local AITask = { id = 'ControlledTask', + -- params = { task = { id = 'Orbit', + -- params = { pattern = AI.Task.OrbitPattern.CIRCLE, + -- point = Point, + -- speed = Speed, + -- altitude = Altitude + LandHeight + -- } + -- }, + -- stopCondition = { duration = Duration + -- } + -- } + -- } + -- ) + + return DCSTask +end + +--- (AIR) Orbit at the current position of the first unit of the group at a specified alititude +-- @param #GROUP self +-- @param #number Altitude The altitude to hold the position. +-- @param #number Speed The speed flying when holding the position. +-- @return #GROUP self +function GROUP:TaskOrbitCircle( Altitude, Speed ) + self:F2( { self.GroupName, Altitude, Speed } ) + + local DCSGroup = self:GetDCSGroup() + + if DCSGroup then + local GroupPoint = self:GetPointVec2() + return self:TaskOrbitCircleAtVec2( GroupPoint, Altitude, Speed ) + end + + return nil +end + + + +--- (AIR) Hold position at the current position of the first unit of the group. +-- @param #GROUP self +-- @param #number Duration The maximum duration in seconds to hold the position. +-- @return #GROUP self +function GROUP:TaskHoldPosition() + self:F2( { self.GroupName } ) + + return self:TaskOrbitCircle( 30, 10 ) +end + + + + +--- (AIR) Attacking the map object (building, structure, e.t.c). +-- @param #GROUP self +-- @param DCSTypes#Vec2 PointVec2 2D-coordinates of the point the map object is closest to. The distance between the point and the map object must not be greater than 2000 meters. Object id is not used here because Mission Editor doesn't support map object identificators. +-- @param #number WeaponType (optional) Bitmask of weapon types those allowed to use. If parameter is not defined that means no limits on weapon usage. +-- @param DCSTypes#AI.Task.WeaponExpend WeaponExpend (optional) Determines how much weapon will be released at each attack. If parameter is not defined the unit / group will choose expend on its own discretion. +-- @param #number AttackQty (optional) This parameter limits maximal quantity of attack. The aicraft/group will not make more attack than allowed even if the target group not destroyed and the aicraft/group still have ammo. If not defined the aircraft/group will attack target until it will be destroyed or until the aircraft/group will run out of ammo. +-- @param DCSTypes#Azimuth Direction (optional) Desired ingress direction from the target to the attacking aircraft. Group/aircraft will make its attacks from the direction. Of course if there is no way to attack from the direction due the terrain group/aircraft will choose another direction. +-- @param #boolean GroupAttack (optional) Flag indicates that the target must be engaged by all aircrafts of the group. Has effect only if the task is assigned to a group, not to a single aircraft. +-- @return DCSTask#Task The DCS task structure. +function GROUP:TaskAttackMapObject( PointVec2, WeaponType, WeaponExpend, AttackQty, Direction, GroupAttack ) + self:F2( { self.GroupName, PointVec2, WeaponType, WeaponExpend, AttackQty, Direction, GroupAttack } ) + +-- AttackMapObject = { +-- id = 'AttackMapObject', +-- params = { +-- point = Vec2, +-- weaponType = number, +-- expend = enum AI.Task.WeaponExpend, +-- attackQty = number, +-- direction = Azimuth, +-- groupAttack = boolean, +-- } +-- } + + local DCSTask + DCSTask = { id = 'AttackMapObject', + params = { + point = PointVec2, + weaponType = WeaponType, + expend = WeaponExpend, + attackQty = AttackQty, + direction = Direction, + groupAttack = GroupAttack, + }, + }, + + self:T3( { DCSTask } ) + return DCSTask +end + + +--- (AIR) Delivering weapon on the runway. +-- @param #GROUP self +-- @param Airbase#AIRBASE Airbase Airbase to attack. +-- @param #number WeaponType (optional) Bitmask of weapon types those allowed to use. If parameter is not defined that means no limits on weapon usage. +-- @param DCSTypes#AI.Task.WeaponExpend WeaponExpend (optional) Determines how much weapon will be released at each attack. If parameter is not defined the unit / group will choose expend on its own discretion. +-- @param #number AttackQty (optional) This parameter limits maximal quantity of attack. The aicraft/group will not make more attack than allowed even if the target group not destroyed and the aicraft/group still have ammo. If not defined the aircraft/group will attack target until it will be destroyed or until the aircraft/group will run out of ammo. +-- @param DCSTypes#Azimuth Direction (optional) Desired ingress direction from the target to the attacking aircraft. Group/aircraft will make its attacks from the direction. Of course if there is no way to attack from the direction due the terrain group/aircraft will choose another direction. +-- @param #boolean GroupAttack (optional) Flag indicates that the target must be engaged by all aircrafts of the group. Has effect only if the task is assigned to a group, not to a single aircraft. +-- @return DCSTask#Task The DCS task structure. +function GROUP:TaskBombingRunway( Airbase, WeaponType, WeaponExpend, AttackQty, Direction, GroupAttack ) + self:F2( { self.GroupName, Airbase, WeaponType, WeaponExpend, AttackQty, Direction, GroupAttack } ) + +-- BombingRunway = { +-- id = 'BombingRunway', +-- params = { +-- runwayId = AirdromeId, +-- weaponType = number, +-- expend = enum AI.Task.WeaponExpend, +-- attackQty = number, +-- direction = Azimuth, +-- groupAttack = boolean, +-- } +-- } + + local DCSTask + DCSTask = { id = 'BombingRunway', + params = { + point = Airbase:GetID(), + weaponType = WeaponType, + expend = WeaponExpend, + attackQty = AttackQty, + direction = Direction, + groupAttack = GroupAttack, + }, + }, + + self:T3( { DCSTask } ) + return DCSTask +end + + +--- (AIR) Refueling from the nearest tanker. No parameters. +-- @param #GROUP self +-- @return DCSTask#Task The DCS task structure. +function GROUP:TaskRefueling() + self:F2( { self.GroupName } ) + +-- Refueling = { +-- id = 'Refueling', +-- params = {} +-- } + + local DCSTask + DCSTask = { id = 'Refueling', + params = { + }, + }, + + self:T3( { DCSTask } ) + return DCSTask +end + + +--- (AIR HELICOPTER) Landing at the ground. For helicopters only. +-- @param #GROUP self +-- @param DCSTypes#Vec2 Point The point where to land. +-- @param #number Duration The duration in seconds to stay on the ground. +-- @return #GROUP self +function GROUP:TaskLandAtVec2( Point, Duration ) + self:F2( { self.GroupName, Point, Duration } ) + +-- Land = { +-- id= 'Land', +-- params = { +-- point = Vec2, +-- durationFlag = boolean, +-- duration = Time +-- } +-- } + + local DCSTask + if Duration and Duration > 0 then + DCSTask = { id = 'Land', + params = { + point = Point, + durationFlag = true, + duration = Duration, + }, + } + else + DCSTask = { id = 'Land', + params = { + point = Point, + durationFlag = false, + }, + } + end + + self:T3( DCSTask ) + return DCSTask +end + +--- (AIR) Land the group at a @{Zone#ZONE). +-- @param #GROUP self +-- @param Zone#ZONE Zone The zone where to land. +-- @param #number Duration The duration in seconds to stay on the ground. +-- @return #GROUP self +function GROUP:TaskLandAtZone( Zone, Duration, RandomPoint ) + self:F2( { self.GroupName, Zone, Duration, RandomPoint } ) + + local Point + if RandomPoint then + Point = Zone:GetRandomPointVec2() + else + Point = Zone:GetPointVec2() + end + + local DCSTask = self:TaskLandAtVec2( Point, Duration ) + + self:T3( DCSTask ) + return DCSTask +end + +--- (AIR) Following another airborne group. +-- The unit / group will follow lead unit of another group, wingmens of both groups will continue following their leaders. +-- If another group is on land the unit / group will orbit around. +-- @param #GROUP self +-- @param Group#GROUP FollowGroup The group to be followed. +-- @param DCSTypes#Vec3 PointVec3 Position of the unit / lead unit of the group relative lead unit of another group in frame reference oriented by course of lead unit of another group. If another group is on land the unit / group will orbit around. +-- @param #number LastWaypointIndex Detach waypoint of another group. Once reached the unit / group Follow task is finished. +-- @return DCSTask#Task The DCS task structure. +function GROUP:TaskFollow( FollowGroup, PointVec3, LastWaypointIndex ) + self:F2( { self.GroupName, FollowGroup, PointVec3, LastWaypointIndex } ) + +-- Follow = { +-- id = 'Follow', +-- params = { +-- groupId = Group.ID, +-- pos = Vec3, +-- lastWptIndexFlag = boolean, +-- lastWptIndex = number +-- } +-- } + + local LastWaypointIndexFlag = nil + if LastWaypointIndex then + LastWaypointIndexFlag = true + end + + local DCSTask + DCSTask = { id = 'Follow', + params = { + groupId = FollowGroup:GetID(), + pos = PointVec3, + lastWptIndexFlag = LastWaypointIndexFlag, + lastWptIndex = LastWaypointIndex, + }, + }, + + self:T3( { DCSTask } ) + return DCSTask +end + + +--- (AIR) Escort another airborne group. +-- The unit / group will follow lead unit of another group, wingmens of both groups will continue following their leaders. +-- The unit / group will also protect that group from threats of specified types. +-- @param #GROUP self +-- @param Group#GROUP EscortGroup The group to be escorted. +-- @param DCSTypes#Vec3 PointVec3 Position of the unit / lead unit of the group relative lead unit of another group in frame reference oriented by course of lead unit of another group. If another group is on land the unit / group will orbit around. +-- @param #number LastWaypointIndex Detach waypoint of another group. Once reached the unit / group Follow task is finished. +-- @param #number EngagementDistanceMax Maximal distance from escorted group to threat. If the threat is already engaged by escort escort will disengage if the distance becomes greater than 1.5 * engagementDistMax. +-- @param DCSTypes#AttributeNameArray TargetTypes Array of AttributeName that is contains threat categories allowed to engage. +-- @return DCSTask#Task The DCS task structure. +function GROUP:TaskEscort( FollowGroup, PointVec3, LastWaypointIndex, EngagementDistance, TargetTypes ) + self:F2( { self.GroupName, FollowGroup, PointVec3, LastWaypointIndex, EngagementDistance, TargetTypes } ) + +-- Escort = { +-- id = 'Escort', +-- params = { +-- groupId = Group.ID, +-- pos = Vec3, +-- lastWptIndexFlag = boolean, +-- lastWptIndex = number, +-- engagementDistMax = Distance, +-- targetTypes = array of AttributeName, +-- } +-- } + + local LastWaypointIndexFlag = nil + if LastWaypointIndex then + LastWaypointIndexFlag = true + end + + local DCSTask + DCSTask = { id = 'Follow', + params = { + groupId = FollowGroup:GetID(), + pos = PointVec3, + lastWptIndexFlag = LastWaypointIndexFlag, + lastWptIndex = LastWaypointIndex, + engagementDistMax = EngagementDistance, + targetTypes = TargetTypes, + }, + }, + + self:T3( { DCSTask } ) + return DCSTask +end + + +-- GROUND TASKS + +--- (GROUND) Fire at a VEC2 point until ammunition is finished. +-- @param #GROUP self +-- @param DCSTypes#Vec2 PointVec2 The point to fire at. +-- @param DCSTypes#Distance Radius The radius of the zone to deploy the fire at. +-- @return DCSTask#Task The DCS task structure. +function GROUP:TaskFireAtPoint( PointVec2, Radius ) + self:F2( { self.GroupName, PointVec2, Radius } ) + + -- FireAtPoint = { + -- id = 'FireAtPoint', + -- params = { + -- point = Vec2, + -- radius = Distance, + -- } + -- } + + local DCSTask + DCSTask = { id = 'FireAtPoint', + params = { + point = PointVec2, + radius = Radius, + } + } + + self:T3( { DCSTask } ) + return DCSTask +end + +--- (GROUND) Hold ground group from moving. +-- @param #GROUP self +-- @return DCSTask#Task The DCS task structure. +function GROUP:TaskHold() + self:F2( { self.GroupName } ) + +-- Hold = { +-- id = 'Hold', +-- params = { +-- } +-- } + + local DCSTask + DCSTask = { id = 'Hold', + params = { + } + } + + self:T3( { DCSTask } ) + return DCSTask +end + +-- TASKS FOR AIRBORNE AND GROUND UNITS/GROUPS + +--- (AIR + GROUND) The task makes the group/unit a FAC and orders the FAC to control the target (enemy ground group) destruction. +-- The killer is player-controlled allied CAS-aircraft that is in contact with the FAC. +-- If the task is assigned to the group lead unit will be a FAC. +-- @param #GROUP self +-- @param Group#GROUP AttackGroup Target GROUP. +-- @param #number WeaponType Bitmask of weapon types those allowed to use. If parameter is not defined that means no limits on weapon usage. +-- @param DCSTypes#AI.Task.Designation Designation (optional) Designation type. +-- @param #boolean Datalink (optional) Allows to use datalink to send the target information to attack aircraft. Enabled by default. +-- @return DCSTask#Task The DCS task structure. +function GROUP:TaskFAC_AttackGroup( AttackGroup, WeaponType, Designation, Datalink ) + self:F2( { self.GroupName, AttackGroup, WeaponType, Designation, Datalink } ) + +-- FAC_AttackGroup = { +-- id = 'FAC_AttackGroup', +-- params = { +-- groupId = Group.ID, +-- weaponType = number, +-- designation = enum AI.Task.Designation, +-- datalink = boolean +-- } +-- } + + local DCSTask + DCSTask = { id = 'FAC_AttackGroup', + params = { + groupId = AttackGroup:GetID(), + weaponType = WeaponType, + designation = Designation, + datalink = Datalink, + } + } + + self:T3( { DCSTask } ) + return DCSTask +end + +-- EN-ROUTE TASKS FOR AIRBORNE GROUPS + +--- (AIR) Engaging targets of defined types. +-- @param #GROUP self +-- @param DCSTypes#Distance Distance Maximal distance from the target to a route leg. If the target is on a greater distance it will be ignored. +-- @param DCSTypes#AttributeNameArray TargetTypes Array of target categories allowed to engage. +-- @param #number Priority All enroute tasks have the priority parameter. This is a number (less value - higher priority) that determines actions related to what task will be performed first. +-- @return DCSTask#Task The DCS task structure. +function GROUP:EnRouteTaskEngageTargets( Distance, TargetTypes, Priority ) + self:F2( { self.GroupName, Distance, TargetTypes, Priority } ) + +-- EngageTargets ={ +-- id = 'EngageTargets', +-- params = { +-- maxDist = Distance, +-- targetTypes = array of AttributeName, +-- priority = number +-- } +-- } + + local DCSTask + DCSTask = { id = 'EngageTargets', + params = { + maxDist = Distance, + targetTypes = TargetTypes, + priority = Priority + } + } + + self:T3( { DCSTask } ) + return DCSTask +end + + +--- (AIR) Engaging a targets of defined types at circle-shaped zone. +-- @param #GROUP self +-- @param DCSTypes#Vec2 PointVec2 2D-coordinates of the zone. +-- @param DCSTypes#Distance Radius Radius of the zone. +-- @param DCSTypes#AttributeNameArray TargetTypes Array of target categories allowed to engage. +-- @param #number Priority All en-route tasks have the priority parameter. This is a number (less value - higher priority) that determines actions related to what task will be performed first. +-- @return DCSTask#Task The DCS task structure. +function GROUP:EnRouteTaskEngageTargets( PointVec2, Radius, TargetTypes, Priority ) + self:F2( { self.GroupName, PointVec2, Radius, TargetTypes, Priority } ) + +-- EngageTargetsInZone = { +-- id = 'EngageTargetsInZone', +-- params = { +-- point = Vec2, +-- zoneRadius = Distance, +-- targetTypes = array of AttributeName, +-- priority = number +-- } +-- } + + local DCSTask + DCSTask = { id = 'EngageTargetsInZone', + params = { + point = PointVec2, + zoneRadius = Radius, + targetTypes = TargetTypes, + priority = Priority + } + } + + self:T3( { DCSTask } ) + return DCSTask +end + +--- (AIR) Engaging a group. The task does not assign the target group to the unit/group to attack now; it just allows the unit/group to engage the target group as well as other assigned targets. +-- @param #GROUP self +-- @param Group#GROUP AttackGroup The Group to be attacked. +-- @param #number Priority All en-route tasks have the priority parameter. This is a number (less value - higher priority) that determines actions related to what task will be performed first. +-- @param #number WeaponType (optional) Bitmask of weapon types those allowed to use. If parameter is not defined that means no limits on weapon usage. +-- @param DCSTypes#AI.Task.WeaponExpend WeaponExpend (optional) Determines how much weapon will be released at each attack. If parameter is not defined the unit / group will choose expend on its own discretion. +-- @param #number AttackQty (optional) This parameter limits maximal quantity of attack. The aicraft/group will not make more attack than allowed even if the target group not destroyed and the aicraft/group still have ammo. If not defined the aircraft/group will attack target until it will be destroyed or until the aircraft/group will run out of ammo. +-- @param DCSTypes#Azimuth Direction (optional) Desired ingress direction from the target to the attacking aircraft. Group/aircraft will make its attacks from the direction. Of course if there is no way to attack from the direction due the terrain group/aircraft will choose another direction. +-- @param DCSTypes#Distance Altitude (optional) Desired attack start altitude. Group/aircraft will make its attacks from the altitude. If the altitude is too low or too high to use weapon aircraft/group will choose closest altitude to the desired attack start altitude. If the desired altitude is defined group/aircraft will not attack from safe altitude. +-- @param #boolean AttackQtyLimit (optional) The flag determines how to interpret attackQty parameter. If the flag is true then attackQty is a limit on maximal attack quantity for "AttackGroup" and "AttackUnit" tasks. If the flag is false then attackQty is a desired attack quantity for "Bombing" and "BombingRunway" tasks. +-- @return DCSTask#Task The DCS task structure. +function GROUP:EnRouteTaskEngageGroup( AttackGroup, Priority, WeaponType, WeaponExpend, AttackQty, Direction, Altitude, AttackQtyLimit ) + self:F2( { self.GroupName, AttackGroup, Priority, WeaponType, WeaponExpend, AttackQty, Direction, Altitude, AttackQtyLimit } ) + + -- EngageGroup = { + -- id = 'EngageGroup ', + -- params = { + -- groupId = Group.ID, + -- weaponType = number, + -- expend = enum AI.Task.WeaponExpend, + -- attackQty = number, + -- directionEnabled = boolean, + -- direction = Azimuth, + -- altitudeEnabled = boolean, + -- altitude = Distance, + -- attackQtyLimit = boolean, + -- priority = number, + -- } + -- } + + local DirectionEnabled = nil + if Direction then + DirectionEnabled = true + end + + local AltitudeEnabled = nil + if Altitude then + AltitudeEnabled = true + end + + local DCSTask + DCSTask = { id = 'EngageGroup', + params = { + groupId = AttackGroup:GetID(), + weaponType = WeaponType, + expend = WeaponExpend, + attackQty = AttackQty, + directionEnabled = DirectionEnabled, + direction = Direction, + altitudeEnabled = AltitudeEnabled, + altitude = Altitude, + attackQtyLimit = AttackQtyLimit, + priority = Priority, + }, + }, + + self:T3( { DCSTask } ) + return DCSTask +end + + +--- (AIR) Attack the Unit. +-- @param #GROUP self +-- @param Unit#UNIT AttackUnit The UNIT. +-- @param #number Priority All en-route tasks have the priority parameter. This is a number (less value - higher priority) that determines actions related to what task will be performed first. +-- @param #number WeaponType (optional) Bitmask of weapon types those allowed to use. If parameter is not defined that means no limits on weapon usage. +-- @param DCSTypes#AI.Task.WeaponExpend WeaponExpend (optional) Determines how much weapon will be released at each attack. If parameter is not defined the unit / group will choose expend on its own discretion. +-- @param #number AttackQty (optional) This parameter limits maximal quantity of attack. The aicraft/group will not make more attack than allowed even if the target group not destroyed and the aicraft/group still have ammo. If not defined the aircraft/group will attack target until it will be destroyed or until the aircraft/group will run out of ammo. +-- @param DCSTypes#Azimuth Direction (optional) Desired ingress direction from the target to the attacking aircraft. Group/aircraft will make its attacks from the direction. Of course if there is no way to attack from the direction due the terrain group/aircraft will choose another direction. +-- @param #boolean AttackQtyLimit (optional) The flag determines how to interpret attackQty parameter. If the flag is true then attackQty is a limit on maximal attack quantity for "AttackGroup" and "AttackUnit" tasks. If the flag is false then attackQty is a desired attack quantity for "Bombing" and "BombingRunway" tasks. +-- @param #boolean GroupAttack (optional) Flag indicates that the target must be engaged by all aircrafts of the group. Has effect only if the task is assigned to a group, not to a single aircraft. +-- @return DCSTask#Task The DCS task structure. +function GROUP:EnRouteTaskEngageUnit( AttackUnit, Priority, WeaponType, WeaponExpend, AttackQty, Direction, AttackQtyLimit, GroupAttack ) + self:F2( { self.GroupName, AttackUnit, Priority, WeaponType, WeaponExpend, AttackQty, Direction, AttackQtyLimit, GroupAttack } ) + + -- EngageUnit = { + -- id = 'EngageUnit', + -- params = { + -- unitId = Unit.ID, + -- weaponType = number, + -- expend = enum AI.Task.WeaponExpend + -- attackQty = number, + -- direction = Azimuth, + -- attackQtyLimit = boolean, + -- groupAttack = boolean, + -- priority = number, + -- } + -- } + + local DCSTask + DCSTask = { id = 'EngageUnit', + params = { + unitId = AttackUnit:GetID(), + weaponType = WeaponType, + expend = WeaponExpend, + attackQty = AttackQty, + direction = Direction, + attackQtyLimit = AttackQtyLimit, + groupAttack = GroupAttack, + priority = Priority, + }, + }, + + self:T3( { DCSTask } ) + return DCSTask +end + + +--- (AIR) Aircraft will act as an AWACS for friendly units (will provide them with information about contacts). No parameters. +-- @param #GROUP self +-- @return DCSTask#Task The DCS task structure. +function GROUP:EnRouteTaskAWACS( ) + self:F2( { self.GroupName } ) + +-- AWACS = { +-- id = 'AWACS', +-- params = { +-- } +-- } + + local DCSTask + DCSTask = { id = 'AWACS', + params = { + } + } + + self:T3( { DCSTask } ) + return DCSTask +end + + +--- (AIR) Aircraft will act as a tanker for friendly units. No parameters. +-- @param #GROUP self +-- @return DCSTask#Task The DCS task structure. +function GROUP:EnRouteTaskTanker( ) + self:F2( { self.GroupName } ) + +-- Tanker = { +-- id = 'Tanker', +-- params = { +-- } +-- } + + local DCSTask + DCSTask = { id = 'Tanker', + params = { + } + } + + self:T3( { DCSTask } ) + return DCSTask +end + + +-- En-route tasks for ground units/groups + +--- (GROUND) Ground unit (EW-radar) will act as an EWR for friendly units (will provide them with information about contacts). No parameters. +-- @param #GROUP self +-- @return DCSTask#Task The DCS task structure. +function GROUP:EnRouteTaskEWR( ) + self:F2( { self.GroupName } ) + +-- EWR = { +-- id = 'EWR', +-- params = { +-- } +-- } + + local DCSTask + DCSTask = { id = 'EWR', + params = { + } + } + + self:T3( { DCSTask } ) + return DCSTask +end + + +-- En-route tasks for airborne and ground units/groups + +--- (AIR + GROUND) The task makes the group/unit a FAC and lets the FAC to choose the target (enemy ground group) as well as other assigned targets. +-- The killer is player-controlled allied CAS-aircraft that is in contact with the FAC. +-- If the task is assigned to the group lead unit will be a FAC. +-- @param #GROUP self +-- @param Group#GROUP AttackGroup Target GROUP. +-- @param #number Priority All en-route tasks have the priority parameter. This is a number (less value - higher priority) that determines actions related to what task will be performed first. +-- @param #number WeaponType Bitmask of weapon types those allowed to use. If parameter is not defined that means no limits on weapon usage. +-- @param DCSTypes#AI.Task.Designation Designation (optional) Designation type. +-- @param #boolean Datalink (optional) Allows to use datalink to send the target information to attack aircraft. Enabled by default. +-- @return DCSTask#Task The DCS task structure. +function GROUP:EnRouteTaskFAC_EngageGroup( AttackGroup, Priority, WeaponType, Designation, Datalink ) + self:F2( { self.GroupName, AttackGroup, WeaponType, Priority, Designation, Datalink } ) + +-- FAC_EngageGroup = { +-- id = 'FAC_EngageGroup', +-- params = { +-- groupId = Group.ID, +-- weaponType = number, +-- designation = enum AI.Task.Designation, +-- datalink = boolean, +-- priority = number, +-- } +-- } + + local DCSTask + DCSTask = { id = 'FAC_EngageGroup', + params = { + groupId = AttackGroup:GetID(), + weaponType = WeaponType, + designation = Designation, + datalink = Datalink, + priority = Priority, + } + } + + self:T3( { DCSTask } ) + return DCSTask +end + + +--- (AIR + GROUND) The task makes the group/unit a FAC and lets the FAC to choose a targets (enemy ground group) around as well as other assigned targets. +-- The killer is player-controlled allied CAS-aircraft that is in contact with the FAC. +-- If the task is assigned to the group lead unit will be a FAC. +-- @param #GROUP self +-- @param DCSTypes#Distance Radius The maximal distance from the FAC to a target. +-- @param #number Priority All en-route tasks have the priority parameter. This is a number (less value - higher priority) that determines actions related to what task will be performed first. +-- @return DCSTask#Task The DCS task structure. +function GROUP:EnRouteTaskFAC( Radius, Priority ) + self:F2( { self.GroupName, Radius, Priority } ) + +-- FAC = { +-- id = 'FAC', +-- params = { +-- radius = Distance, +-- priority = number +-- } +-- } + + local DCSTask + DCSTask = { id = 'FAC', + params = { + radius = Radius, + priority = Priority + } + } + + self:T3( { DCSTask } ) + return DCSTask +end + + + + +--- Move the group to a Vec2 Point, wait for a defined duration and embark a group. +-- @param #GROUP self +-- @param DCSTypes#Vec2 Point The point where to wait. +-- @param #number Duration The duration in seconds to wait. +-- @param #GROUP EmbarkingGroup The group to be embarked. +-- @return DCSTask#Task The DCS task structure +function GROUP:TaskEmbarkingAtVec2( Point, Duration, EmbarkingGroup ) + self:F2( { self.GroupName, Point, Duration, EmbarkingGroup.DCSGroup } ) + + local DCSTask + DCSTask = { id = 'Embarking', + params = { x = Point.x, + y = Point.y, + duration = Duration, + groupsForEmbarking = { EmbarkingGroup.GroupID }, + durationFlag = true, + distributionFlag = false, + distribution = {}, + } + } + + self:T3( { DCSTask } ) + return DCSTask +end + +--- Move to a defined Vec2 Point, and embark to a group when arrived within a defined Radius. +-- @param #GROUP self +-- @param DCSTypes#Vec2 Point The point where to wait. +-- @param #number Radius The radius of the embarking zone around the Point. +-- @return DCSTask#Task The DCS task structure. +function GROUP:TaskEmbarkToTransportAtVec2( Point, Radius ) + self:F2( { self.GroupName, Point, Radius } ) + + local DCSTask --DCSTask#Task + DCSTask = { id = 'EmbarkToTransport', + params = { x = Point.x, + y = Point.y, + zoneRadius = Radius, + } + } + + self:T3( { DCSTask } ) + return DCSTask +end + +--- Return a Misson task from a mission template. +-- @param #GROUP self +-- @param #table TaskMission A table containing the mission task. +-- @return DCSTask#Task +function GROUP:TaskMission( TaskMission ) + self:F2( Points ) + + local DCSTask + DCSTask = { id = 'Mission', params = { TaskMission, }, } + + self:T3( { DCSTask } ) + return DCSTask +end + +--- Return a Misson task to follow a given route defined by Points. +-- @param #GROUP self +-- @param #table Points A table of route points. +-- @return DCSTask#Task +function GROUP:TaskRoute( Points ) + self:F2( Points ) + + local DCSTask + DCSTask = { id = 'Mission', params = { route = { points = Points, }, }, } + + self:T3( { DCSTask } ) + return DCSTask +end + +--- Make the DCS Group to fly to a given point and hover. +-- @param #GROUP self +-- @param DCSTypes#Vec3 Point The destination point in Vec3 format. +-- @param #number Speed The speed to travel. +-- @return #GROUP self +function GROUP:TaskRouteToVec2( Point, Speed ) + self:F2( { Point, Speed } ) + + local GroupPoint = self:GetUnit( 1 ):GetPointVec2() + + local PointFrom = {} + PointFrom.x = GroupPoint.x + PointFrom.y = GroupPoint.y + PointFrom.type = "Turning Point" + PointFrom.action = "Turning Point" + PointFrom.speed = Speed + PointFrom.speed_locked = true + PointFrom.properties = { + ["vnav"] = 1, + ["scale"] = 0, + ["angle"] = 0, + ["vangle"] = 0, + ["steer"] = 2, + } + + + local PointTo = {} + PointTo.x = Point.x + PointTo.y = Point.y + PointTo.type = "Turning Point" + PointTo.action = "Fly Over Point" + PointTo.speed = Speed + PointTo.speed_locked = true + PointTo.properties = { + ["vnav"] = 1, + ["scale"] = 0, + ["angle"] = 0, + ["vangle"] = 0, + ["steer"] = 2, + } + + + local Points = { PointFrom, PointTo } + + self:T3( Points ) + + self:Route( Points ) + + return self +end + +--- Make the DCS Group to fly to a given point and hover. +-- @param #GROUP self +-- @param DCSTypes#Vec3 Point The destination point in Vec3 format. +-- @param #number Speed The speed to travel. +-- @return #GROUP self +function GROUP:TaskRouteToVec3( Point, Speed ) + self:F2( { Point, Speed } ) + + local GroupPoint = self:GetUnit( 1 ):GetPointVec3() + + local PointFrom = {} + PointFrom.x = GroupPoint.x + PointFrom.y = GroupPoint.z + PointFrom.alt = GroupPoint.y + PointFrom.alt_type = "BARO" + PointFrom.type = "Turning Point" + PointFrom.action = "Turning Point" + PointFrom.speed = Speed + PointFrom.speed_locked = true + PointFrom.properties = { + ["vnav"] = 1, + ["scale"] = 0, + ["angle"] = 0, + ["vangle"] = 0, + ["steer"] = 2, + } + + + local PointTo = {} + PointTo.x = Point.x + PointTo.y = Point.z + PointTo.alt = Point.y + PointTo.alt_type = "BARO" + PointTo.type = "Turning Point" + PointTo.action = "Fly Over Point" + PointTo.speed = Speed + PointTo.speed_locked = true + PointTo.properties = { + ["vnav"] = 1, + ["scale"] = 0, + ["angle"] = 0, + ["vangle"] = 0, + ["steer"] = 2, + } + + + local Points = { PointFrom, PointTo } + + self:T3( Points ) + + self:Route( Points ) + + return self +end + + + +--- Make the group to follow a given route. +-- @param #GROUP self +-- @param #table GoPoints A table of Route Points. +-- @return #GROUP self +function GROUP:Route( GoPoints ) + self:F2( GoPoints ) + + local DCSGroup = self:GetDCSGroup() + + if DCSGroup then + local Points = routines.utils.deepCopy( GoPoints ) + local MissionTask = { id = 'Mission', params = { route = { points = Points, }, }, } + local Controller = self:_GetController() + --Controller.setTask( Controller, MissionTask ) + --routines.scheduleFunction( Controller.setTask, { Controller, MissionTask}, timer.getTime() + 1 ) + SCHEDULER:New( Controller, Controller.setTask, { MissionTask }, 1 ) + return self + end + + return nil +end + + + +--- Route the group to a given zone. +-- The group final destination point can be randomized. +-- A speed can be given in km/h. +-- A given formation can be given. +-- @param #GROUP self +-- @param Zone#ZONE Zone The zone where to route to. +-- @param #boolean Randomize Defines whether to target point gets randomized within the Zone. +-- @param #number Speed The speed. +-- @param Base#FORMATION Formation The formation string. +function GROUP:TaskRouteToZone( Zone, Randomize, Speed, Formation ) + self:F2( Zone ) + + local DCSGroup = self:GetDCSGroup() + + if DCSGroup then + + local GroupPoint = self:GetPointVec2() + + local PointFrom = {} + PointFrom.x = GroupPoint.x + PointFrom.y = GroupPoint.y + PointFrom.type = "Turning Point" + PointFrom.action = "Cone" + PointFrom.speed = 20 / 1.6 + + + local PointTo = {} + local ZonePoint + + if Randomize then + ZonePoint = Zone:GetRandomPointVec2() + else + ZonePoint = Zone:GetPointVec2() + end + + PointTo.x = ZonePoint.x + PointTo.y = ZonePoint.y + PointTo.type = "Turning Point" + + if Formation then + PointTo.action = Formation + else + PointTo.action = "Cone" + end + + if Speed then + PointTo.speed = Speed + else + PointTo.speed = 20 / 1.6 + end + + local Points = { PointFrom, PointTo } + + self:T3( Points ) + + self:Route( Points ) + + return self + end + + return nil +end + +-- Commands + +--- Do Script command +-- @param #GROUP self +-- @param #string DoScript +-- @return #DCSCommand +function GROUP:CommandDoScript( DoScript ) + + local DCSDoScript = { + id = "Script", + params = { + command = DoScript, + }, + } + + self:T3( DCSDoScript ) + return DCSDoScript +end + + +--- Return the mission template of the group. +-- @param #GROUP self +-- @return #table The MissionTemplate +function GROUP:GetTaskMission() + self:F2( self.GroupName ) + + return routines.utils.deepCopy( _DATABASE.Templates.Groups[self.GroupName].Template ) +end + +--- Return the mission route of the group. +-- @param #GROUP self +-- @return #table The mission route defined by points. +function GROUP:GetTaskRoute() + self:F2( self.GroupName ) + + return routines.utils.deepCopy( _DATABASE.Templates.Groups[self.GroupName].Template.route.points ) +end + +--- Return the route of a group by using the @{Database#DATABASE} class. +-- @param #GROUP self +-- @param #number Begin The route point from where the copy will start. The base route point is 0. +-- @param #number End The route point where the copy will end. The End point is the last point - the End point. The last point has base 0. +-- @param #boolean Randomize Randomization of the route, when true. +-- @param #number Radius When randomization is on, the randomization is within the radius. +function GROUP:CopyRoute( Begin, End, Randomize, Radius ) + self:F2( { Begin, End } ) + + local Points = {} + + -- Could be a Spawned Group + local GroupName = string.match( self:GetName(), ".*#" ) + if GroupName then + GroupName = GroupName:sub( 1, -2 ) + else + GroupName = self:GetName() + end + + self:T3( { GroupName } ) + + local Template = _DATABASE.Templates.Groups[GroupName].Template + + if Template then + if not Begin then + Begin = 0 + end + if not End then + End = 0 + end + + for TPointID = Begin + 1, #Template.route.points - End do + if Template.route.points[TPointID] then + Points[#Points+1] = routines.utils.deepCopy( Template.route.points[TPointID] ) + if Randomize then + if not Radius then + Radius = 500 + end + Points[#Points].x = Points[#Points].x + math.random( Radius * -1, Radius ) + Points[#Points].y = Points[#Points].y + math.random( Radius * -1, Radius ) + end + end + end + return Points + end + + return nil +end + + +function GROUP:GetDetectedTargets() + self:F2( self.GroupName ) + + local DCSGroup = self:GetDCSGroup() + if DCSGroup then + return self:_GetController():getDetectedTargets() + end + + return nil +end + +function GROUP:IsTargetDetected( DCSObject ) + self:F2( self.GroupName ) + + local DCSGroup = self:GetDCSGroup() + if DCSGroup then + + local TargetIsDetected, TargetIsVisible, TargetLastTime, TargetKnowType, TargetKnowDistance, TargetLastPos, TargetLastVelocity + = self:_GetController().isTargetDetected( self:_GetController(), DCSObject, + Controller.Detection.VISUAL, + Controller.Detection.OPTIC, + Controller.Detection.RADAR, + Controller.Detection.IRST, + Controller.Detection.RWR, + Controller.Detection.DLINK + ) + return TargetIsDetected, TargetIsVisible, TargetLastTime, TargetKnowType, TargetKnowDistance, TargetLastPos, TargetLastVelocity + end + + return nil +end + +-- Options + +--- Can the GROUP hold their weapons? +-- @param #GROUP self +-- @return #boolean +function GROUP:OptionROEHoldFirePossible() + self:F2( { self.GroupName } ) + + local DCSGroup = self:GetDCSGroup() + if DCSGroup then + if self:IsAir() or self:IsGround() or self:IsShip() then + return true + end + + return false + end + + return nil +end + +--- Holding weapons. +-- @param Group#GROUP self +-- @return Group#GROUP self +function GROUP:OptionROEHoldFire() + self:F2( { self.GroupName } ) + + local DCSGroup = self:GetDCSGroup() + if DCSGroup then + local Controller = self:_GetController() + + if self:IsAir() then + Controller:setOption( AI.Option.Air.id.ROE, AI.Option.Air.val.ROE.WEAPON_HOLD ) + elseif self:IsGround() then + Controller:setOption( AI.Option.Ground.id.ROE, AI.Option.Ground.val.ROE.WEAPON_HOLD ) + elseif self:IsShip() then + Controller:setOption( AI.Option.Naval.id.ROE, AI.Option.Naval.val.ROE.WEAPON_HOLD ) + end + + return self + end + + return nil +end + +--- Can the GROUP attack returning on enemy fire? +-- @param #GROUP self +-- @return #boolean +function GROUP:OptionROEReturnFirePossible() + self:F2( { self.GroupName } ) + + local DCSGroup = self:GetDCSGroup() + if DCSGroup then + if self:IsAir() or self:IsGround() or self:IsShip() then + return true + end + + return false + end + + return nil +end + +--- Return fire. +-- @param #GROUP self +-- @return #GROUP self +function GROUP:OptionROEReturnFire() + self:F2( { self.GroupName } ) + + local DCSGroup = self:GetDCSGroup() + if DCSGroup then + local Controller = self:_GetController() + + if self:IsAir() then + Controller:setOption( AI.Option.Air.id.ROE, AI.Option.Air.val.ROE.RETURN_FIRE ) + elseif self:IsGround() then + Controller:setOption( AI.Option.Ground.id.ROE, AI.Option.Ground.val.ROE.RETURN_FIRE ) + elseif self:IsShip() then + Controller:setOption( AI.Option.Naval.id.ROE, AI.Option.Naval.val.ROE.RETURN_FIRE ) + end + + return self + end + + return nil +end + +--- Can the GROUP attack designated targets? +-- @param #GROUP self +-- @return #boolean +function GROUP:OptionROEOpenFirePossible() + self:F2( { self.GroupName } ) + + local DCSGroup = self:GetDCSGroup() + if DCSGroup then + if self:IsAir() or self:IsGround() or self:IsShip() then + return true + end + + return false + end + + return nil +end + +--- Openfire. +-- @param #GROUP self +-- @return #GROUP self +function GROUP:OptionROEOpenFire() + self:F2( { self.GroupName } ) + + local DCSGroup = self:GetDCSGroup() + if DCSGroup then + local Controller = self:_GetController() + + if self:IsAir() then + Controller:setOption( AI.Option.Air.id.ROE, AI.Option.Air.val.ROE.OPEN_FIRE ) + elseif self:IsGround() then + Controller:setOption( AI.Option.Ground.id.ROE, AI.Option.Ground.val.ROE.OPEN_FIRE ) + elseif self:IsShip() then + Controller:setOption( AI.Option.Naval.id.ROE, AI.Option.Naval.val.ROE.OPEN_FIRE ) + end + + return self + end + + return nil +end + +--- Can the GROUP attack targets of opportunity? +-- @param #GROUP self +-- @return #boolean +function GROUP:OptionROEWeaponFreePossible() + self:F2( { self.GroupName } ) + + local DCSGroup = self:GetDCSGroup() + if DCSGroup then + if self:IsAir() then + return true + end + + return false + end + + return nil +end + +--- Weapon free. +-- @param #GROUP self +-- @return #GROUP self +function GROUP:OptionROEWeaponFree() + self:F2( { self.GroupName } ) + + local DCSGroup = self:GetDCSGroup() + if DCSGroup then + local Controller = self:_GetController() + + if self:IsAir() then + Controller:setOption( AI.Option.Air.id.ROE, AI.Option.Air.val.ROE.WEAPON_FREE ) + end + + return self + end + + return nil +end + +--- Can the GROUP ignore enemy fire? +-- @param #GROUP self +-- @return #boolean +function GROUP:OptionROTNoReactionPossible() + self:F2( { self.GroupName } ) + + local DCSGroup = self:GetDCSGroup() + if DCSGroup then + if self:IsAir() then + return true + end + + return false + end + + return nil +end + + +--- No evasion on enemy threats. +-- @param #GROUP self +-- @return #GROUP self +function GROUP:OptionROTNoReaction() + self:F2( { self.GroupName } ) + + local DCSGroup = self:GetDCSGroup() + if DCSGroup then + local Controller = self:_GetController() + + if self:IsAir() then + Controller:setOption( AI.Option.Air.id.REACTION_ON_THREAT, AI.Option.Air.val.REACTION_ON_THREAT.NO_REACTION ) + end + + return self + end + + return nil +end + +--- Can the GROUP evade using passive defenses? +-- @param #GROUP self +-- @return #boolean +function GROUP:OptionROTPassiveDefensePossible() + self:F2( { self.GroupName } ) + + local DCSGroup = self:GetDCSGroup() + if DCSGroup then + if self:IsAir() then + return true + end + + return false + end + + return nil +end + +--- Evasion passive defense. +-- @param #GROUP self +-- @return #GROUP self +function GROUP:OptionROTPassiveDefense() + self:F2( { self.GroupName } ) + + local DCSGroup = self:GetDCSGroup() + if DCSGroup then + local Controller = self:_GetController() + + if self:IsAir() then + Controller:setOption( AI.Option.Air.id.REACTION_ON_THREAT, AI.Option.Air.val.REACTION_ON_THREAT.PASSIVE_DEFENCE ) + end + + return self + end + + return nil +end + +--- Can the GROUP evade on enemy fire? +-- @param #GROUP self +-- @return #boolean +function GROUP:OptionROTEvadeFirePossible() + self:F2( { self.GroupName } ) + + local DCSGroup = self:GetDCSGroup() + if DCSGroup then + if self:IsAir() then + return true + end + + return false + end + + return nil +end + + +--- Evade on fire. +-- @param #GROUP self +-- @return #GROUP self +function GROUP:OptionROTEvadeFire() + self:F2( { self.GroupName } ) + + local DCSGroup = self:GetDCSGroup() + if DCSGroup then + local Controller = self:_GetController() + + if self:IsAir() then + Controller:setOption( AI.Option.Air.id.REACTION_ON_THREAT, AI.Option.Air.val.REACTION_ON_THREAT.EVADE_FIRE ) + end + + return self + end + + return nil +end + +--- Can the GROUP evade on fire using vertical manoeuvres? +-- @param #GROUP self +-- @return #boolean +function GROUP:OptionROTVerticalPossible() + self:F2( { self.GroupName } ) + + local DCSGroup = self:GetDCSGroup() + if DCSGroup then + if self:IsAir() then + return true + end + + return false + end + + return nil +end + + +--- Evade on fire using vertical manoeuvres. +-- @param #GROUP self +-- @return #GROUP self +function GROUP:OptionROTVertical() + self:F2( { self.GroupName } ) + + local DCSGroup = self:GetDCSGroup() + if DCSGroup then + local Controller = self:_GetController() + + if self:IsAir() then + Controller:setOption( AI.Option.Air.id.REACTION_ON_THREAT, AI.Option.Air.val.REACTION_ON_THREAT.BYPASS_AND_ESCAPE ) + end + + return self + end + + return nil +end + +-- Message APIs + +--- Returns a message for a coalition or a client. +-- @param #GROUP self +-- @param #string Message The message text +-- @param DCSTypes#Duration Duration The duration of the message. +-- @return Message#MESSAGE +function GROUP:Message( Message, Duration ) + self:F2( { Message, Duration } ) + + local DCSGroup = self:GetDCSGroup() + if DCSGroup then + return MESSAGE:New( Message, self:GetCallsign() .. " (" .. self:GetTypeName() .. ")", Duration, self:GetClassNameAndID() ) + end + + return nil +end + +--- Send a message to all coalitions. +-- The message will appear in the message area. The message will begin with the callsign of the group and the type of the first unit sending the message. +-- @param #GROUP self +-- @param #string Message The message text +-- @param DCSTypes#Duration Duration The duration of the message. +function GROUP:MessageToAll( Message, Duration ) + self:F2( { Message, Duration } ) + + local DCSGroup = self:GetDCSGroup() + if DCSGroup then + self:Message( Message, Duration ):ToAll() + end + + return nil +end + +--- Send a message to the red coalition. +-- The message will appear in the message area. The message will begin with the callsign of the group and the type of the first unit sending the message. +-- @param #GROUP self +-- @param #string Message The message text +-- @param DCSTYpes#Duration Duration The duration of the message. +function GROUP:MessageToRed( Message, Duration ) + self:F2( { Message, Duration } ) + + local DCSGroup = self:GetDCSGroup() + if DCSGroup then + self:Message( Message, Duration ):ToRed() + end + + return nil +end + +--- Send a message to the blue coalition. +-- The message will appear in the message area. The message will begin with the callsign of the group and the type of the first unit sending the message. +-- @param #GROUP self +-- @param #string Message The message text +-- @param DCSTypes#Duration Duration The duration of the message. +function GROUP:MessageToBlue( Message, Duration ) + self:F2( { Message, Duration } ) + + local DCSGroup = self:GetDCSGroup() + if DCSGroup then + self:Message( Message, Duration ):ToBlue() + end + + return nil +end + +--- Send a message to a client. +-- The message will appear in the message area. The message will begin with the callsign of the group and the type of the first unit sending the message. +-- @param #GROUP self +-- @param #string Message The message text +-- @param DCSTypes#Duration Duration The duration of the message. +-- @param Client#CLIENT Client The client object receiving the message. +function GROUP:MessageToClient( Message, Duration, Client ) + self:F2( { Message, Duration } ) + + local DCSGroup = self:GetDCSGroup() + if DCSGroup then + self:Message( Message, Duration ):ToClient( Client ) + end + + return nil +end +--- UNIT Class +-- +-- @{UNIT} class +-- ============== +-- The @{UNIT} class is a wrapper class to handle the DCS Unit objects: +-- +-- * Support all DCS Unit APIs. +-- * Enhance with Unit specific APIs not in the DCS Unit API set. +-- * Handle local Unit Controller. +-- * Manage the "state" of the DCS Unit. +-- +-- +-- UNIT reference methods +-- ====================== +-- For each DCS Unit object alive within a running mission, a UNIT wrapper object (instance) will be created within the _@{DATABASE} object. +-- This is done at the beginning of the mission (when the mission starts), and dynamically when new DCS Unit objects are spawned (using the @{SPAWN} class). +-- +-- The UNIT class **does not contain a :New()** method, rather it provides **:Find()** methods to retrieve the object reference +-- using the DCS Unit or the DCS UnitName. +-- +-- Another thing to know is that UNIT objects do not "contain" the DCS Unit object. +-- The UNIT methods will reference the DCS Unit object by name when it is needed during API execution. +-- If the DCS Unit object does not exist or is nil, the UNIT methods will return nil and log an exception in the DCS.log file. +-- +-- The UNIT class provides the following functions to retrieve quickly the relevant UNIT instance: +-- +-- * @{#UNIT.Find}(): Find a UNIT instance from the _DATABASE object using a DCS Unit object. +-- * @{#UNIT.FindByName}(): Find a UNIT instance from the _DATABASE object using a DCS Unit name. +-- +-- IMPORTANT: ONE SHOULD NEVER SANATIZE these UNIT OBJECT REFERENCES! (make the UNIT object references nil). +-- +-- DCS UNIT APIs +-- ============= +-- The DCS Unit APIs are used extensively within MOOSE. The UNIT class has for each DCS Unit API a corresponding method. +-- To be able to distinguish easily in your code the difference between a UNIT API call and a DCS Unit API call, +-- the first letter of the method is also capitalized. So, by example, the DCS Unit method @{DCSUnit#Unit.getName}() +-- is implemented in the UNIT class as @{#UNIT.GetName}(). +-- +-- Additional UNIT APIs +-- ==================== +-- The UNIT class comes with additional methods. Find below a summary. +-- +-- Smoke, Flare Units +-- ------------------ +-- The UNIT class provides methods to smoke or flare units easily. +-- The @{#UNIT.SmokeBlue}(), @{#UNIT.SmokeGreen}(),@{#UNIT.SmokeOrange}(), @{#UNIT.SmokeRed}(), @{#UNIT.SmokeRed}() methods +-- will smoke the unit in the corresponding color. Note that smoking a unit is done at the current position of the DCS Unit. +-- When the DCS Unit moves for whatever reason, the smoking will still continue! +-- The @{#UNIT.FlareGreen}(), @{#UNIT.FlareRed}(), @{#UNIT.FlareWhite}(), @{#UNIT.FlareYellow}() +-- methods will fire off a flare in the air with the corresponding color. Note that a flare is a one-off shot and its effect is of very short duration. +-- +-- Position, Point +-- --------------- +-- The UNIT class provides methods to obtain the current point or position of the DCS Unit. +-- The @{#UNIT.GetPointVec2}(), @{#UNIT.GetPointVec3}() will obtain the current location of the DCS Unit in a Vec2 (2D) or a Vec3 (3D) vector respectively. +-- If you want to obtain the complete 3D position including oriëntation and direction vectors, consult the @{#UNIT.GetPositionVec3}() method respectively. +-- +-- Alive +-- ----- +-- The @{#UNIT.IsAlive}(), @{#UNIT.IsActive}() methods determines if the DCS Unit is alive, meaning, it is existing and active. +-- +-- Test for other units in radius +-- ------------------------------ +-- One can test if another DCS Unit is within a given radius of the current DCS Unit, by using the @{#UNIT.OtherUnitInRadius}() method. +-- +-- More functions will be added +-- ---------------------------- +-- During the MOOSE development, more functions will be added. A complete list of the current functions is below. +-- +-- +-- +-- +-- @module Unit +-- @author FlightControl + +Include.File( "Routines" ) +Include.File( "Base" ) +Include.File( "Message" ) + +--- The UNIT class +-- @type UNIT +-- @extends Base#BASE +-- @field #UNIT.FlareColor FlareColor +-- @field #UNIT.SmokeColor SmokeColor +UNIT = { + ClassName="UNIT", + CategoryName = { + [Unit.Category.AIRPLANE] = "Airplane", + [Unit.Category.HELICOPTER] = "Helicoper", + [Unit.Category.GROUND_UNIT] = "Ground Unit", + [Unit.Category.SHIP] = "Ship", + [Unit.Category.STRUCTURE] = "Structure", + }, + FlareColor = { + Green = trigger.flareColor.Green, + Red = trigger.flareColor.Red, + White = trigger.flareColor.White, + Yellow = trigger.flareColor.Yellow + }, + SmokeColor = { + Green = trigger.smokeColor.Green, + Red = trigger.smokeColor.Red, + White = trigger.smokeColor.White, + Orange = trigger.smokeColor.Orange, + Blue = trigger.smokeColor.Blue + }, + } + +--- FlareColor +-- @type UNIT.FlareColor +-- @field Green +-- @field Red +-- @field White +-- @field Yellow + +--- SmokeColor +-- @type UNIT.SmokeColor +-- @field Green +-- @field Red +-- @field White +-- @field Orange +-- @field Blue + +-- Registration. + +--- Create a new UNIT from DCSUnit. +-- @param #UNIT self +-- @param DCSUnit#Unit DCSUnit +-- @param Database#DATABASE Database +-- @return Unit#UNIT +function UNIT:Register( UnitName ) + + local self = BASE:Inherit( self, BASE:New() ) + self:F2( UnitName ) + self.UnitName = UnitName + return self +end + +-- Reference methods. + +--- Finds a UNIT from the _DATABASE using a DCSUnit object. +-- @param #UNIT self +-- @param DCSUnit#Unit DCSUnit An existing DCS Unit object reference. +-- @return Unit#UNIT self +function UNIT:Find( DCSUnit ) + + local UnitName = DCSUnit:getName() + local UnitFound = _DATABASE:FindUnit( UnitName ) + return UnitFound +end + +--- Find a UNIT in the _DATABASE using the name of an existing DCS Unit. +-- @param #UNIT self +-- @param #string UnitName The Unit Name. +-- @return Unit#UNIT self +function UNIT:FindByName( UnitName ) + + local UnitFound = _DATABASE:FindUnit( UnitName ) + return UnitFound +end + +function UNIT:GetDCSUnit() + local DCSUnit = Unit.getByName( self.UnitName ) + + if DCSUnit then + return DCSUnit + end + + return nil +end + +--- Returns coalition of the Unit. +-- @param Unit#UNIT self +-- @return DCSCoalitionObject#coalition.side The side of the coalition. +-- @return #nil The DCS Unit is not existing or alive. +function UNIT:GetCoalition() + self:F2( self.UnitName ) + + local DCSUnit = self:GetDCSUnit() + + if DCSUnit then + local UnitCoalition = DCSUnit:getCoalition() + self:T3( UnitCoalition ) + return UnitCoalition + end + + return nil +end + +--- Returns country of the Unit. +-- @param Unit#UNIT self +-- @return DCScountry#country.id The country identifier. +-- @return #nil The DCS Unit is not existing or alive. +function UNIT:GetCountry() + self:F2( self.UnitName ) + + local DCSUnit = self:GetDCSUnit() + + if DCSUnit then + local UnitCountry = DCSUnit:getCountry() + self:T3( UnitCountry ) + return UnitCountry + end + + return nil +end + + +--- Returns DCS Unit object name. +-- The function provides access to non-activated units too. +-- @param Unit#UNIT self +-- @return #string The name of the DCS Unit. +-- @return #nil The DCS Unit is not existing or alive. +function UNIT:GetName() + self:F2( self.UnitName ) + + local DCSUnit = self:GetDCSUnit() + + if DCSUnit then + local UnitName = self.UnitName + return UnitName + end + + return nil +end + + +--- Returns if the unit is alive. +-- @param Unit#UNIT self +-- @return #boolean true if Unit is alive. +-- @return #nil The DCS Unit is not existing or alive. +function UNIT:IsAlive() + self:F2( self.UnitName ) + + local DCSUnit = self:GetDCSUnit() + + if DCSUnit then + local UnitIsAlive = DCSUnit:isExist() + return UnitIsAlive + end + + return false +end + +--- Returns if the unit is activated. +-- @param Unit#UNIT self +-- @return #boolean true if Unit is activated. +-- @return #nil The DCS Unit is not existing or alive. +function UNIT:IsActive() + self:F2( self.UnitName ) + + local DCSUnit = self:GetDCSUnit() + + if DCSUnit then + + local UnitIsActive = DCSUnit:isActive() + return UnitIsActive + end + + return nil +end + +--- Returns name of the player that control the unit or nil if the unit is controlled by A.I. +-- @param Unit#UNIT self +-- @return #string Player Name +-- @return #nil The DCS Unit is not existing or alive. +function UNIT:GetPlayerName() + self:F2( self.UnitName ) + + local DCSUnit = self:GetDCSUnit() + + if DCSUnit then + + local PlayerName = DCSUnit:getPlayerName() + if PlayerName == nil then + PlayerName = "" + end + return PlayerName + end + + return nil +end + +--- Returns the unit's unique identifier. +-- @param Unit#UNIT self +-- @return DCSUnit#Unit.ID Unit ID +-- @return #nil The DCS Unit is not existing or alive. +function UNIT:GetID() + self:F2( self.UnitName ) + + local DCSUnit = self:GetDCSUnit() + + if DCSUnit then + local UnitID = DCSUnit:getID() + return UnitID + end + + return nil +end + +--- Returns the unit's number in the group. +-- The number is the same number the unit has in ME. +-- It may not be changed during the mission. +-- If any unit in the group is destroyed, the numbers of another units will not be changed. +-- @param Unit#UNIT self +-- @return #number The Unit number. +-- @return #nil The DCS Unit is not existing or alive. +function UNIT:GetNumber() + self:F2( self.UnitName ) + + local DCSUnit = self:GetDCSUnit() + + if DCSUnit then + local UnitNumber = DCSUnit:getNumber() + return UnitNumber + end + + return nil +end + +--- Returns the unit's group if it exist and nil otherwise. +-- @param Unit#UNIT self +-- @return Group#GROUP The Group of the Unit. +-- @return #nil The DCS Unit is not existing or alive. +function UNIT:GetGroup() + self:F2( self.UnitName ) + + local DCSUnit = self:GetDCSUnit() + + if DCSUnit then + local UnitGroup = DCSUnit:getGroup() + return UnitGroup + end + + return nil +end + + +--- Returns the unit's callsign - the localized string. +-- @param Unit#UNIT self +-- @return #string The Callsign of the Unit. +-- @return #nil The DCS Unit is not existing or alive. +function UNIT:GetCallSign() + self:F2( self.UnitName ) + + local DCSUnit = self:GetDCSUnit() + + if DCSUnit then + local UnitCallSign = DCSUnit:getCallsign() + return UnitCallSign + end + + return nil +end + +--- Returns the unit's health. Dead units has health <= 1.0. +-- @param Unit#UNIT self +-- @return #number The Unit's health value. +-- @return #nil The DCS Unit is not existing or alive. +function UNIT:GetLife() + self:F2( self.UnitName ) + + local DCSUnit = self:GetDCSUnit() + + if DCSUnit then + local UnitLife = DCSUnit:getLife() + return UnitLife + end + + return nil +end + +--- Returns the Unit's initial health. +-- @param Unit#UNIT self +-- @return #number The Unit's initial health value. +-- @return #nil The DCS Unit is not existing or alive. +function UNIT:GetLife0() + self:F2( self.UnitName ) + + local DCSUnit = self:GetDCSUnit() + + if DCSUnit then + local UnitLife0 = DCSUnit:getLife0() + return UnitLife0 + end + + return nil +end + +--- Returns relative amount of fuel (from 0.0 to 1.0) the unit has in its internal tanks. If there are additional fuel tanks the value may be greater than 1.0. +-- @param Unit#UNIT self +-- @return #number The relative amount of fuel (from 0.0 to 1.0). +-- @return #nil The DCS Unit is not existing or alive. +function UNIT:GetFuel() + self:F2( self.UnitName ) + + local DCSUnit = self:GetDCSUnit() + + if DCSUnit then + local UnitFuel = DCSUnit:getFuel() + return UnitFuel + end + + return nil +end + +--- Returns the Unit's ammunition. +-- @param Unit#UNIT self +-- @return DCSUnit#Unit.Ammo +-- @return #nil The DCS Unit is not existing or alive. +function UNIT:GetAmmo() + self:F2( self.UnitName ) + + local DCSUnit = self:GetDCSUnit() + + if DCSUnit then + local UnitAmmo = DCSUnit:getAmmo() + return UnitAmmo + end + + return nil +end + +--- Returns the unit sensors. +-- @param Unit#UNIT self +-- @return DCSUnit#Unit.Sensors +-- @return #nil The DCS Unit is not existing or alive. +function UNIT:GetSensors() + self:F2( self.UnitName ) + + local DCSUnit = self:GetDCSUnit() + + if DCSUnit then + local UnitSensors = DCSUnit:getSensors() + return UnitSensors + end + + return nil +end + +-- Need to add here a function per sensortype +-- unit:hasSensors(Unit.SensorType.RADAR, Unit.RadarType.AS) + +--- Returns two values: +-- +-- * First value indicates if at least one of the unit's radar(s) is on. +-- * Second value is the object of the radar's interest. Not nil only if at least one radar of the unit is tracking a target. +-- @param Unit#UNIT self +-- @return #boolean Indicates if at least one of the unit's radar(s) is on. +-- @return DCSObject#Object The object of the radar's interest. Not nil only if at least one radar of the unit is tracking a target. +-- @return #nil The DCS Unit is not existing or alive. +function UNIT:GetRadar() + self:F2( self.UnitName ) + + local DCSUnit = self:GetDCSUnit() + + if DCSUnit then + local UnitRadarOn, UnitRadarObject = DCSUnit:getRadar() + return UnitRadarOn, UnitRadarObject + end + + return nil, nil +end + +-- Need to add here functions to check if radar is on and which object etc. + +--- Returns unit descriptor. Descriptor type depends on unit category. +-- @param Unit#UNIT self +-- @return DCSUnit#Unit.Desc The Unit descriptor. +-- @return #nil The DCS Unit is not existing or alive. +function UNIT:GetDesc() + self:F2( self.UnitName ) + + local DCSUnit = self:GetDCSUnit() + + if DCSUnit then + local UnitDesc = DCSUnit:getDesc() + return UnitDesc + end + + return nil +end + + +--- Returns the type name of the DCS Unit. +-- @param Unit#UNIT self +-- @return #string The type name of the DCS Unit. +-- @return #nil The DCS Unit is not existing or alive. +function UNIT:GetTypeName() + self:F2( self.UnitName ) + + local DCSUnit = self:GetDCSUnit() + + if DCSUnit then + local UnitTypeName = DCSUnit:getTypeName() + self:T3( UnitTypeName ) + return UnitTypeName + end + + return nil +end + + + +--- Returns the prefix name of the DCS Unit. A prefix name is a part of the name before a '#'-sign. +-- DCS Units spawned with the @{SPAWN} class contain a '#'-sign to indicate the end of the (base) DCS Unit name. +-- The spawn sequence number and unit number are contained within the name after the '#' sign. +-- @param Unit#UNIT self +-- @return #string The name of the DCS Unit. +-- @return #nil The DCS Unit is not existing or alive. +function UNIT:GetPrefix() + self:F2( self.UnitName ) + + local DCSUnit = self:GetDCSUnit() + + if DCSUnit then + local UnitPrefix = string.match( self.UnitName, ".*#" ):sub( 1, -2 ) + self:T3( UnitPrefix ) + return UnitPrefix + end + + return nil +end + + + +--- Returns the @{DCSTypes#Vec2} vector indicating the point in 2D of the DCS Unit within the mission. +-- @param Unit#UNIT self +-- @return DCSTypes#Vec2 The 2D point vector of the DCS Unit. +-- @return #nil The DCS Unit is not existing or alive. +function UNIT:GetPointVec2() + self:F2( self.UnitName ) + + local DCSUnit = self:GetDCSUnit() + + if DCSUnit then + local UnitPointVec3 = DCSUnit:getPosition().p + + local UnitPointVec2 = {} + UnitPointVec2.x = UnitPointVec3.x + UnitPointVec2.y = UnitPointVec3.z + + self:T3( UnitPointVec2 ) + return UnitPointVec2 + end + + return nil +end + + +--- Returns the @{DCSTypes#Vec3} vector indicating the point in 3D of the DCS Unit within the mission. +-- @param Unit#UNIT self +-- @return DCSTypes#Vec3 The 3D point vector of the DCS Unit. +-- @return #nil The DCS Unit is not existing or alive. +function UNIT:GetPointVec3() + self:F2( self.UnitName ) + + local DCSUnit = self:GetDCSUnit() + + if DCSUnit then + local UnitPointVec3 = DCSUnit:getPosition().p + self:T3( UnitPointVec3 ) + return UnitPointVec3 + end + + return nil +end + +--- Returns the @{DCSTypes#Position3} position vectors indicating the point and direction vectors in 3D of the DCS Unit within the mission. +-- @param Unit#UNIT self +-- @return DCSTypes#Position The 3D position vectors of the DCS Unit. +-- @return #nil The DCS Unit is not existing or alive. +function UNIT:GetPositionVec3() + self:F2( self.UnitName ) + + local DCSUnit = self:GetDCSUnit() + + if DCSUnit then + local UnitPosition = DCSUnit:getPosition() + self:T3( UnitPosition ) + return UnitPosition + end + + return nil +end + +--- Returns the DCS Unit velocity vector. +-- @param Unit#UNIT self +-- @return DCSTypes#Vec3 The velocity vector +-- @return #nil The DCS Unit is not existing or alive. +function UNIT:GetVelocity() + self:F2( self.UnitName ) + + local DCSUnit = self:GetDCSUnit() + + if DCSUnit then + local UnitVelocityVec3 = DCSUnit:getVelocity() + self:T3( UnitVelocityVec3 ) + return UnitVelocityVec3 + end + + return nil +end + +--- Returns true if the DCS Unit is in the air. +-- @param Unit#UNIT self +-- @return #boolean true if in the air. +-- @return #nil The DCS Unit is not existing or alive. +function UNIT:InAir() + self:F2( self.UnitName ) + + local DCSUnit = self:GetDCSUnit() + + if DCSUnit then + local UnitInAir = DCSUnit:inAir() + self:T3( UnitInAir ) + return UnitInAir + end + + return nil +end + +--- Returns the altitude of the DCS Unit. +-- @param Unit#UNIT self +-- @return DCSTypes#Distance The altitude of the DCS Unit. +-- @return #nil The DCS Unit is not existing or alive. +function UNIT:GetAltitude() + self:F2() + + local DCSUnit = self:GetDCSUnit() + + if DCSUnit then + local UnitPointVec3 = DCSUnit:getPoint() --DCSTypes#Vec3 + return UnitPointVec3.y + end + + return nil +end + +--- Returns true if there is an **other** DCS Unit within a radius of the current 2D point of the DCS Unit. +-- @param Unit#UNIT self +-- @param Unit#UNIT AwaitUnit The other UNIT wrapper object. +-- @param Radius The radius in meters with the DCS Unit in the centre. +-- @return true If the other DCS Unit is within the radius of the 2D point of the DCS Unit. +-- @return #nil The DCS Unit is not existing or alive. +function UNIT:OtherUnitInRadius( AwaitUnit, Radius ) + self:F2( { self.UnitName, AwaitUnit.UnitName, Radius } ) + + local DCSUnit = self:GetDCSUnit() + + if DCSUnit then + local UnitPos = self:GetPointVec3() + local AwaitUnitPos = AwaitUnit:GetPointVec3() + + if (((UnitPos.x - AwaitUnitPos.x)^2 + (UnitPos.z - AwaitUnitPos.z)^2)^0.5 <= Radius) then + self:T3( "true" ) + return true + else + self:T3( "false" ) + return false + end + end + + return nil +end + +--- Returns the DCS Unit category name as defined within the DCS Unit Descriptor. +-- @param Unit#UNIT self +-- @return #string The DCS Unit Category Name +function UNIT:GetCategoryName() + local DCSUnit = self:GetDCSUnit() + + if DCSUnit then + local UnitCategoryName = self.CategoryName[ self:GetDesc().category ] + return UnitCategoryName + end + + return nil +end + +--- Signal a flare at the position of the UNIT. +-- @param #UNIT self +function UNIT:Flare( FlareColor ) + self:F2() + trigger.action.signalFlare( self:GetPointVec3(), FlareColor , 0 ) +end + +--- Signal a white flare at the position of the UNIT. +-- @param #UNIT self +function UNIT:FlareWhite() + self:F2() + trigger.action.signalFlare( self:GetPointVec3(), trigger.flareColor.White , 0 ) +end + +--- Signal a yellow flare at the position of the UNIT. +-- @param #UNIT self +function UNIT:FlareYellow() + self:F2() + trigger.action.signalFlare( self:GetPointVec3(), trigger.flareColor.Yellow , 0 ) +end + +--- Signal a green flare at the position of the UNIT. +-- @param #UNIT self +function UNIT:FlareGreen() + self:F2() + trigger.action.signalFlare( self:GetPointVec3(), trigger.flareColor.Green , 0 ) +end + +--- Signal a red flare at the position of the UNIT. +-- @param #UNIT self +function UNIT:FlareRed() + self:F2() + trigger.action.signalFlare( self:GetPointVec3(), trigger.flareColor.Red, 0 ) +end + +--- Smoke the UNIT. +-- @param #UNIT self +function UNIT:Smoke( SmokeColor ) + self:F2() + trigger.action.smoke( self:GetPointVec3(), SmokeColor ) +end + +--- Smoke the UNIT Green. +-- @param #UNIT self +function UNIT:SmokeGreen() + self:F2() + trigger.action.smoke( self:GetPointVec3(), trigger.smokeColor.Green ) +end + +--- Smoke the UNIT Red. +-- @param #UNIT self +function UNIT:SmokeRed() + self:F2() + trigger.action.smoke( self:GetPointVec3(), trigger.smokeColor.Red ) +end + +--- Smoke the UNIT White. +-- @param #UNIT self +function UNIT:SmokeWhite() + self:F2() + trigger.action.smoke( self:GetPointVec3(), trigger.smokeColor.White ) +end + +--- Smoke the UNIT Orange. +-- @param #UNIT self +function UNIT:SmokeOrange() + self:F2() + trigger.action.smoke( self:GetPointVec3(), trigger.smokeColor.Orange ) +end + +--- Smoke the UNIT Blue. +-- @param #UNIT self +function UNIT:SmokeBlue() + self:F2() + trigger.action.smoke( self:GetPointVec3(), trigger.smokeColor.Blue ) +end + +-- Is methods + +--- Returns if the unit is of an air category. +-- If the unit is a helicopter or a plane, then this method will return true, otherwise false. +-- @param #UNIT self +-- @return #boolean Air category evaluation result. +function UNIT:IsAir() + self:F2() + + local UnitDescriptor = self.DCSUnit:getDesc() + self:T3( { UnitDescriptor.category, Unit.Category.AIRPLANE, Unit.Category.HELICOPTER } ) + + local IsAirResult = ( UnitDescriptor.category == Unit.Category.AIRPLANE ) or ( UnitDescriptor.category == Unit.Category.HELICOPTER ) + + self:T3( IsAirResult ) + return IsAirResult +end + +--- ZONE Classes +-- ============= +-- This module contains the ZONE classes, inherited from @{Zone#ZONE_BASE}. +-- There are essentially two core functions that zones accomodate: +-- +-- * Test if an object is within the zone boundaries. +-- * Provide the zone behaviour. Some zones are static, while others are moveable. +-- +-- The object classes are using the zone classes to test the zone boundaries, which can take various forms: +-- +-- * Test if completely within the zone. +-- * Test if partly within the zone (for @{Group#GROUP} objects). +-- * Test if not in the zone. +-- * Distance to the nearest intersecting point of the zone. +-- * Distance to the center of the zone. +-- * ... +-- +-- Each of these ZONE classes have a zone name, and specific parameters defining the zone type: +-- +-- * @{Zone#ZONE_BASE}: The ZONE_BASE class defining the base for all other zone classes. +-- * @{Zone#ZONE_RADIUS}: The ZONE_RADIUS class defined by a zone name, a location and a radius. +-- * @{Zone#ZONE}: The ZONE class, defined by the zone name as defined within the Mission Editor. +-- * @{Zone#ZONE_UNIT}: The ZONE_UNIT class defined by a zone around a @{Unit#UNIT} with a radius. +-- * @{Zone#ZONE_POLYGON}: The ZONE_POLYGON class defined by a sequence of @{Group#GROUP} waypoints within the Mission Editor, forming a polygon. +-- +-- Polymorphic methods +-- =================== +-- Each zone implements two polymorphic functions defined in @{Zone#ZONE_BASE}: +-- +-- * @{#ZONE_BASE.IsPointVec2InZone}: Returns if a location is within the zone. +-- * @{#ZONE_BASE.IsPointVec3InZone}: Returns if a point is within the zone. +-- +-- @module Zone +-- @author FlightControl + + +Include.File( "Routines" ) +Include.File( "Base" ) +Include.File( "Message" ) + + + +--- The ZONE_BASE class +-- @type ZONE_BASE +-- @Extends Base#BASE +ZONE_BASE = { + ClassName = "ZONE_BASE", + } + +function ZONE_BASE:New( ZoneName ) + local self = BASE:Inherit( self, BASE:New() ) + self:F( ZoneName ) + + self.ZoneName = ZoneName + + return self +end + +--- Returns if a location is within the zone. +-- @param #ZONE_RADIUS self +-- @param DCSTypes#Vec2 PointVec2 The location to test. +-- @return #boolean true if the location is within the zone. +function ZONE_BASE:IsPointVec2InZone( PointVec2 ) + self:F2( PointVec2 ) + + return false +end + +--- Returns if a point is within the zone. +-- @param #ZONE_RADIUS self +-- @param DCSTypes#Vec3 PointVec3 The point to test. +-- @return #boolean true if the point is within the zone. +function ZONE_BASE:IsPointVec3InZone( PointVec3 ) + self:F2( PointVec3 ) + + local InZone = self:IsPointVec2InZone( { x = PointVec3.x, y = PointVec3.z } ) + + return InZone +end + + +--- The ZONE_RADIUS class, defined by a zone name, a location and a radius. +-- @type ZONE_RADIUS +-- @field DCSTypes#Vec2 PointVec2 The current location of the zone. +-- @field DCSTypes#Distance Radius The radius of the zone. +-- @Extends Zone#ZONE_BASE +ZONE_RADIUS = { + ClassName="ZONE_RADIUS", + } + +--- Constructor of ZONE_RADIUS, taking the zone name, the zone location and a radius. +-- @param #ZONE_RADIUS self +-- @param DCSTypes#Vec2 PointVec2 The location of the zone. +-- @param DCSTypes#Distance Radius The radius of the zone. +-- @return #ZONE_RADIUS +function ZONE_RADIUS:New( ZoneName, PointVec2, Radius ) + local self = BASE:Inherit( self, ZONE_BASE:New( ZoneName ) ) + self:F( { ZoneName, PointVec2, Radius } ) + + self.Radius = Radius + self.PointVec2 = PointVec2 + + return self +end + + +--- Returns the radius of the zone. +-- @param #ZONE_RADIUS self +-- @return DCSTypes#Distance The radius of the zone. +function ZONE_RADIUS:GetRadius() + self:F2( self.ZoneName ) + + self:T2( { self.Radius } ) + + return self.Radius +end + +--- Sets the radius of the zone. +-- @param #ZONE_RADIUS self +-- @param DCSTypes#Distance Radius The radius of the zone. +-- @return DCSTypes#Distance The radius of the zone. +function ZONE_RADIUS:SetRadius( Radius ) + self:F2( self.ZoneName ) + + self.Radius = Radius + self:T2( { self.Radius } ) + + return self.Radius +end + +--- Returns the location of the zone. +-- @param #ZONE_RADIUS self +-- @return DCSTypes#Vec2 The location of the zone. +function ZONE_RADIUS:GetPointVec2() + self:F2( self.ZoneName ) + + self:T2( { self.PointVec2 } ) + + return self.PointVec2 +end + +--- Sets the location of the zone. +-- @param #ZONE_RADIUS self +-- @param DCSTypes#Vec2 PointVec2 The new location of the zone. +-- @return DCSTypes#Vec2 The new location of the zone. +function ZONE_RADIUS:SetPointVec2( PointVec2 ) + self:F2( self.ZoneName ) + + self.PointVec2 = PointVec2 + + self:T2( { self.PointVec2 } ) + + return self.PointVec2 +end + +--- Returns the point of the zone. +-- @param #ZONE_RADIUS self +-- @param DCSTypes#Distance Height The height to add to the land height where the center of the zone is located. +-- @return DCSTypes#Vec3 The point of the zone. +function ZONE_RADIUS:GetPointVec3( Height ) + self:F2( self.ZoneName ) + + local PointVec2 = self:GetPointVec2() + + local PointVec3 = { x = PointVec2.x, y = land.getHeight( self:GetPointVec2() ) + Height, z = PointVec2.y } + + self:T2( { PointVec3 } ) + + return PointVec3 +end + +--- Returns if a location is within the zone. +-- @param #ZONE_RADIUS self +-- @param DCSTypes#Vec2 PointVec2 The location to test. +-- @return #boolean true if the location is within the zone. +function ZONE_RADIUS:IsPointVec2InZone( PointVec2 ) + self:F2( PointVec2 ) + + if (( PointVec2.x - self.PointVec2.x )^2 + ( PointVec2.y - self.PointVec2.y ) ^2 ) ^ 0.5 <= self.Radius then + return true + end + + return false +end + +--- Returns if a point is within the zone. +-- @param #ZONE_RADIUS self +-- @param DCSTypes#Vec3 PointVec3 The point to test. +-- @return #boolean true if the point is within the zone. +function ZONE_RADIUS:IsPointVec3InZone( PointVec3 ) + self:F2( PointVec3 ) + + local InZone = self:IsPointVec3InZone( { x = PointVec3.x, y = PointVec3.z } ) + + return InZone +end + +--- Returns a random location within the zone. +-- @param #ZONE_RADIUS self +-- @return DCSTypes#Vec2 The random location within the zone. +function ZONE_RADIUS:GetRandomPointVec2() + self:F( self.ZoneName ) + + local Point = {} + + local angle = math.random() * math.pi*2; + Point.x = self.PointVec2.x + math.cos( angle ) * math.random() * self.Radius; + Point.y = self.PointVec2.y + math.sin( angle ) * math.random() * self.Radius; + + self:T( { Point } ) + + return Point +end + + + +--- The ZONE class, defined by the zone name as defined within the Mission Editor. The location and the radius are automatically collected from the mission settings. +-- @type ZONE +-- @Extends Zone#ZONE_RADIUS +ZONE = { + ClassName="ZONE", + } + + +--- Constructor of ZONE, taking the zone name. +-- @param #ZONE self +-- @param #string ZoneName The name of the zone as defined within the mission editor. +-- @return #ZONE +function ZONE:New( ZoneName ) + + local Zone = trigger.misc.getZone( ZoneName ) + + if not Zone then + error( "Zone " .. ZoneName .. " does not exist." ) + return nil + end + + local self = BASE:Inherit( self, ZONE_RADIUS:New( ZoneName, { x = Zone.x, y = Zone.y }, Zone.radius ) ) + self:F( ZoneName ) + + self.Zone = Zone + + return self +end + + + +--- The ZONE_UNIT class defined by a zone around a @{Unit#UNIT} with a radius. +-- @type ZONE_UNIT +-- @field Unit#UNIT ZoneUNIT +-- @Extends Zone#ZONE_RADIUS +ZONE_UNIT = { + ClassName="ZONE_UNIT", + } + +--- Constructor to create a ZONE_UNIT instance, taking the zone name, a zone unit and a radius. +-- @param #ZONE_UNIT self +-- @param #string ZoneName Name of the zone. +-- @param Unit#UNIT ZoneUNIT The unit as the center of the zone. +-- @param DCSTypes#Distance Radius The radius of the zone. +-- @return #ZONE_UNIT self +function ZONE_UNIT:New( ZoneName, ZoneUNIT, Radius ) + local self = BASE:Inherit( self, ZONE_RADIUS:New( ZoneName, ZoneUNIT:GetPointVec2(), Radius ) ) + self:F( { ZoneName, ZoneUNIT:GetPointVec2(), Radius } ) + + self.ZoneUNIT = ZoneUNIT + + return self +end + + +--- Returns the current location of the @{Unit#UNIT}. +-- @param #ZONE_UNIT self +-- @return DCSTypes#Vec2 The location of the zone based on the @{Unit#UNIT}location. +function ZONE_UNIT:GetPointVec2() + self:F( self.ZoneName ) + + local ZonePointVec2 = self.ZoneUNIT:GetPointVec2() + + self:T( { ZonePointVec2 } ) + + return ZonePointVec2 +end + + +--- The ZONE_POLYGON class defined by a sequence of @{Group#GROUP} waypoints within the Mission Editor, forming a polygon. +-- @type ZONE_POLYGON +-- @Extends Zone#ZONE_BASE +ZONE_POLYGON = { + ClassName="ZONE_POLYGON", + } + +--- Constructor to create a ZONE_POLYGON instance, taking the zone name and the name of the @{Group#GROUP} defined within the Mission Editor. +-- The @{Group#GROUP} waypoints define the polygon corners. The first and the last point are automatically connected by ZONE_POLYGON. +-- @param #ZONE_POLYGON self +-- @param #string ZoneName Name of the zone. +-- @param Group#GROUP ZoneGroup The GROUP waypoints as defined within the Mission Editor define the polygon shape. +-- @return #ZONE_POLYGON self +function ZONE_POLYGON:New( ZoneName, ZoneGroup ) + local self = BASE:Inherit( self, ZONE_BASE:New( ZoneName ) ) + self:F( { ZoneName, ZoneGroup } ) + + local GroupPoints = ZoneGroup:GetTaskRoute() + local i = 0 + + self.Polygon = {} + + for i = 1, #GroupPoints do + self.Polygon[i] = {} + self.Polygon[i].x = GroupPoints[i].x + self.Polygon[i].y = GroupPoints[i].y + end + + return self +end + + +--- Returns if a location is within the zone. +-- @param #ZONE_POLYGON self +-- @param DCSTypes#Vec2 PointVec2 The location to test. +-- @return #boolean true if the location is within the zone. +function ZONE_POLYGON:IsPointVec2InZone( PointVec2 ) + self:F2( PointVec2 ) + + local i + local j + local c = false + + i = 1 + j = #self.Polygon + + while i < #self.Polygon do + j = i + i = i + 1 + self:T( { i, j, self.Polygon[i], self.Polygon[j] } ) + if ( ( ( self.Polygon[i].y > PointVec2.y ) ~= ( self.Polygon[j].y > PointVec2.y ) ) and + ( PointVec2.x < ( self.Polygon[j].x - self.Polygon[i].x ) * ( PointVec2.y - self.Polygon[i].y ) / ( self.Polygon[j].y - self.Polygon[i].y ) + self.Polygon[i].x ) + ) then + c = not c + end + self:T( { "c = ", c } ) + end + + return c +end + +--- The CLIENT models client units in multi player missions. +-- +-- @{#CLIENT} class +-- ================ +-- Clients are those **Units** defined within the Mission Editor that have the skillset defined as __Client__ or __Player__. +-- Note that clients are NOT the same as Units, they are NOT necessarily alive. +-- The @{CLIENT} class is a wrapper class to handle the DCS Unit objects that have the skillset defined as __Client__ or __Player__: +-- +-- * Wraps the DCS Unit objects with skill level set to Player or Client. +-- * Support all DCS Unit APIs. +-- * Enhance with Unit specific APIs not in the DCS Group API set. +-- * When player joins Unit, execute alive init logic. +-- * Handles messages to players. +-- * Manage the "state" of the DCS Unit. +-- +-- Clients are being used by the @{MISSION} class to follow players and register their successes. +-- +-- CLIENT reference methods +-- ======================= +-- For each DCS Unit having skill level Player or Client, a CLIENT wrapper object (instance) will be created within the _@{DATABASE} object. +-- This is done at the beginning of the mission (when the mission starts). +-- +-- The CLIENT class does not contain a :New() method, rather it provides :Find() methods to retrieve the object reference +-- using the DCS Unit or the DCS UnitName. +-- +-- Another thing to know is that CLIENT objects do not "contain" the DCS Unit object. +-- The CLIENT methods will reference the DCS Unit object by name when it is needed during API execution. +-- If the DCS Unit object does not exist or is nil, the CLIENT methods will return nil and log an exception in the DCS.log file. +-- +-- The CLIENT class provides the following functions to retrieve quickly the relevant CLIENT instance: +-- +-- * @{#CLIENT.Find}(): Find a CLIENT instance from the _DATABASE object using a DCS Unit object. +-- * @{#CLIENT.FindByName}(): Find a CLIENT instance from the _DATABASE object using a DCS Unit name. +-- +-- IMPORTANT: ONE SHOULD NEVER SANATIZE these CLIENT OBJECT REFERENCES! (make the CLIENT object references nil). +-- +-- @module Client +-- @author FlightControl + +Include.File( "Routines" ) +Include.File( "Base" ) +Include.File( "Cargo" ) +Include.File( "Message" ) + + +--- The CLIENT class +-- @type CLIENT +-- @extends Unit#UNIT +CLIENT = { + ONBOARDSIDE = { + NONE = 0, + LEFT = 1, + RIGHT = 2, + BACK = 3, + FRONT = 4 + }, + ClassName = "CLIENT", + ClientName = nil, + ClientAlive = false, + ClientTransport = false, + ClientBriefingShown = false, + _Menus = {}, + _Tasks = {}, + Messages = { + } +} + + +--- Finds a CLIENT from the _DATABASE using the relevant DCS Unit. +-- @param #CLIENT self +-- @param #string ClientName Name of the DCS **Unit** as defined within the Mission Editor. +-- @param #string ClientBriefing Text that describes the briefing of the mission when a Player logs into the Client. +-- @return #CLIENT +-- @usage +-- -- Create new Clients. +-- local Mission = MISSIONSCHEDULER.AddMission( 'Russia Transport Troops SA-6', 'Operational', 'Transport troops from the control center to one of the SA-6 SAM sites to activate their operation.', 'Russia' ) +-- Mission:AddGoal( DeploySA6TroopsGoal ) +-- +-- Mission:AddClient( CLIENT:FindByName( 'RU MI-8MTV2*HOT-Deploy Troops 1' ):Transport() ) +-- Mission:AddClient( CLIENT:FindByName( 'RU MI-8MTV2*RAMP-Deploy Troops 3' ):Transport() ) +-- Mission:AddClient( CLIENT:FindByName( 'RU MI-8MTV2*HOT-Deploy Troops 2' ):Transport() ) +-- Mission:AddClient( CLIENT:FindByName( 'RU MI-8MTV2*RAMP-Deploy Troops 4' ):Transport() ) +function CLIENT:Find( DCSUnit ) + local ClientName = DCSUnit:getName() + local ClientFound = _DATABASE:FindClient( ClientName ) + + if ClientFound then + ClientFound:F( ClientName ) + return ClientFound + end + + error( "CLIENT not found for: " .. ClientName ) +end + + +--- Finds a CLIENT from the _DATABASE using the relevant Client Unit Name. +-- As an optional parameter, a briefing text can be given also. +-- @param #CLIENT self +-- @param #string ClientName Name of the DCS **Unit** as defined within the Mission Editor. +-- @param #string ClientBriefing Text that describes the briefing of the mission when a Player logs into the Client. +-- @return #CLIENT +-- @usage +-- -- Create new Clients. +-- local Mission = MISSIONSCHEDULER.AddMission( 'Russia Transport Troops SA-6', 'Operational', 'Transport troops from the control center to one of the SA-6 SAM sites to activate their operation.', 'Russia' ) +-- Mission:AddGoal( DeploySA6TroopsGoal ) +-- +-- Mission:AddClient( CLIENT:FindByName( 'RU MI-8MTV2*HOT-Deploy Troops 1' ):Transport() ) +-- Mission:AddClient( CLIENT:FindByName( 'RU MI-8MTV2*RAMP-Deploy Troops 3' ):Transport() ) +-- Mission:AddClient( CLIENT:FindByName( 'RU MI-8MTV2*HOT-Deploy Troops 2' ):Transport() ) +-- Mission:AddClient( CLIENT:FindByName( 'RU MI-8MTV2*RAMP-Deploy Troops 4' ):Transport() ) +function CLIENT:FindByName( ClientName, ClientBriefing ) + local ClientFound = _DATABASE:FindClient( ClientName ) + + if ClientFound then + ClientFound:F( { ClientName, ClientBriefing } ) + ClientFound:AddBriefing( ClientBriefing ) + ClientFound.MessageSwitch = true + + return ClientFound + end + + error( "CLIENT not found for: " .. ClientName ) +end + +function CLIENT:Register( ClientName ) + local self = BASE:Inherit( self, UNIT:Register( ClientName ) ) + + self:F( ClientName ) + self.ClientName = ClientName + self.MessageSwitch = true + self.ClientAlive2 = false + + --self.AliveCheckScheduler = routines.scheduleFunction( self._AliveCheckScheduler, { self }, timer.getTime() + 1, 5 ) + self.AliveCheckScheduler = SCHEDULER:New( self, self._AliveCheckScheduler, {}, 1, 5 ) + + return self +end + + +--- Transport defines that the Client is a Transport. Transports show cargo. +-- @param #CLIENT self +-- @return #CLIENT +function CLIENT:Transport() + self:F() + + self.ClientTransport = true + return self +end + +--- AddBriefing adds a briefing to a CLIENT when a player joins a mission. +-- @param #CLIENT self +-- @param #string ClientBriefing is the text defining the Mission briefing. +-- @return #CLIENT self +function CLIENT:AddBriefing( ClientBriefing ) + self:F( ClientBriefing ) + self.ClientBriefing = ClientBriefing + self.ClientBriefingShown = false + + return self +end + +--- Show the briefing of a CLIENT. +-- @param #CLIENT self +-- @return #CLIENT self +function CLIENT:ShowBriefing() + self:F( { self.ClientName, self.ClientBriefingShown } ) + + if not self.ClientBriefingShown then + self.ClientBriefingShown = true + local Briefing = "" + if self.ClientBriefing then + Briefing = Briefing .. self.ClientBriefing + end + Briefing = Briefing .. " Press [LEFT ALT]+[B] to view the complete mission briefing." + self:Message( Briefing, 60, self.ClientName .. '/ClientBriefing', "Briefing" ) + end + + return self +end + +--- Show the mission briefing of a MISSION to the CLIENT. +-- @param #CLIENT self +-- @param #string MissionBriefing +-- @return #CLIENT self +function CLIENT:ShowMissionBriefing( MissionBriefing ) + self:F( { self.ClientName } ) + + if MissionBriefing then + self:Message( MissionBriefing, 60, self.ClientName .. '/MissionBriefing', "Mission Briefing" ) + end + + return self +end + + + +--- Resets a CLIENT. +-- @param #CLIENT self +-- @param #string ClientName Name of the Group as defined within the Mission Editor. The Group must have a Unit with the type Client. +function CLIENT:Reset( ClientName ) + self:F() + self._Menus = {} +end + +-- Is Functions + +--- Checks if the CLIENT is a multi-seated UNIT. +-- @param #CLIENT self +-- @return #boolean true if multi-seated. +function CLIENT:IsMultiSeated() + self:F( self.ClientName ) + + local ClientMultiSeatedTypes = { + ["Mi-8MT"] = "Mi-8MT", + ["UH-1H"] = "UH-1H", + ["P-51B"] = "P-51B" + } + + if self:IsAlive() then + local ClientTypeName = self:GetClientGroupUnit():GetTypeName() + if ClientMultiSeatedTypes[ClientTypeName] then + return true + end + end + + return false +end + +--- Checks for a client alive event and calls a function on a continuous basis. +-- @param #CLIENT self +-- @param #function CallBack Function. +-- @return #CLIENT +function CLIENT:Alive( CallBack, ... ) + self:F() + + self.ClientCallBack = CallBack + self.ClientParameters = arg + + return self +end + +--- @param #CLIENT self +function CLIENT:_AliveCheckScheduler() + self:F( { self.ClientName, self.ClientAlive2, self.ClientBriefingShown } ) + + if self:IsAlive() then -- Polymorphic call of UNIT + if self.ClientAlive2 == false then + self:ShowBriefing() + if self.ClientCallBack then + self:T("Calling Callback function") + self.ClientCallBack( self, unpack( self.ClientParameters ) ) + end + self.ClientAlive2 = true + end + else + if self.ClientAlive2 == true then + self.ClientAlive2 = false + end + end + + return true +end + +--- Return the DCSGroup of a Client. +-- This function is modified to deal with a couple of bugs in DCS 1.5.3 +-- @param #CLIENT self +-- @return DCSGroup#Group +function CLIENT:GetDCSGroup() + self:F3() + +-- local ClientData = Group.getByName( self.ClientName ) +-- if ClientData and ClientData:isExist() then +-- self:T( self.ClientName .. " : group found!" ) +-- return ClientData +-- else +-- return nil +-- end + + local ClientUnit = Unit.getByName( self.ClientName ) + + local CoalitionsData = { AlivePlayersRed = coalition.getPlayers( coalition.side.RED ), AlivePlayersBlue = coalition.getPlayers( coalition.side.BLUE ) } + for CoalitionId, CoalitionData in pairs( CoalitionsData ) do + self:T3( { "CoalitionData:", CoalitionData } ) + for UnitId, UnitData in pairs( CoalitionData ) do + self:T3( { "UnitData:", UnitData } ) + if UnitData and UnitData:isExist() then + + --self:E(self.ClientName) + if ClientUnit then + local ClientGroup = ClientUnit:getGroup() + if ClientGroup then + self:T3( "ClientGroup = " .. self.ClientName ) + if ClientGroup:isExist() and UnitData:getGroup():isExist() then + if ClientGroup:getID() == UnitData:getGroup():getID() then + self:T3( "Normal logic" ) + self:T3( self.ClientName .. " : group found!" ) + self.ClientGroupID = ClientGroup:getID() + self.ClientGroupName = ClientGroup:getName() + return ClientGroup + end + else + -- Now we need to resolve the bugs in DCS 1.5 ... + -- Consult the database for the units of the Client Group. (ClientGroup:getUnits() returns nil) + self:T3( "Bug 1.5 logic" ) + local ClientGroupTemplate = _DATABASE.Templates.Units[self.ClientName].GroupTemplate + self.ClientGroupID = ClientGroupTemplate.groupId + self.ClientGroupName = _DATABASE.Templates.Units[self.ClientName].GroupName + self:T3( self.ClientName .. " : group found in bug 1.5 resolvement logic!" ) + return ClientGroup + end + -- else + -- error( "Client " .. self.ClientName .. " not found!" ) + end + else + --self:E( { "Client not found!", self.ClientName } ) + end + end + end + end + + -- For non player clients + if ClientUnit then + local ClientGroup = ClientUnit:getGroup() + if ClientGroup then + self:T3( "ClientGroup = " .. self.ClientName ) + if ClientGroup:isExist() then + self:T3( "Normal logic" ) + self:T3( self.ClientName .. " : group found!" ) + return ClientGroup + end + end + end + + self.ClientGroupID = nil + self.ClientGroupUnit = nil + + return nil +end + + +-- TODO: Check DCSTypes#Group.ID +--- Get the group ID of the client. +-- @param #CLIENT self +-- @return DCSTypes#Group.ID +function CLIENT:GetClientGroupID() + + local ClientGroup = self:GetDCSGroup() + + --self:E( self.ClientGroupID ) -- Determined in GetDCSGroup() + return self.ClientGroupID +end + + +--- Get the name of the group of the client. +-- @param #CLIENT self +-- @return #string +function CLIENT:GetClientGroupName() + + local ClientGroup = self:GetDCSGroup() + + self:T( self.ClientGroupName ) -- Determined in GetDCSGroup() + return self.ClientGroupName +end + +--- Returns the UNIT of the CLIENT. +-- @param #CLIENT self +-- @return Unit#UNIT +function CLIENT:GetClientGroupUnit() + self:F2() + + local ClientDCSUnit = Unit.getByName( self.ClientName ) + + self:T( self.ClientDCSUnit ) + if ClientDCSUnit and ClientDCSUnit:isExist() then + local ClientUnit = _DATABASE:FindUnit( self.ClientName ) + self:T2( ClientUnit ) + return ClientUnit + end +end + +--- Returns the DCSUnit of the CLIENT. +-- @param #CLIENT self +-- @return DCSTypes#Unit +function CLIENT:GetClientGroupDCSUnit() + self:F2() + + local ClientDCSUnit = Unit.getByName( self.ClientName ) + + if ClientDCSUnit and ClientDCSUnit:isExist() then + self:T2( ClientDCSUnit ) + return ClientDCSUnit + end +end + + +--- Evaluates if the CLIENT is a transport. +-- @param #CLIENT self +-- @return #boolean true is a transport. +function CLIENT:IsTransport() + self:F() + return self.ClientTransport +end + +--- Shows the @{Cargo#CARGO} contained within the CLIENT to the player as a message. +-- The @{Cargo#CARGO} is shown using the @{Message#MESSAGE} distribution system. +-- @param #CLIENT self +function CLIENT:ShowCargo() + self:F() + + local CargoMsg = "" + + for CargoName, Cargo in pairs( CARGOS ) do + if self == Cargo:IsLoadedInClient() then + CargoMsg = CargoMsg .. Cargo.CargoName .. " Type:" .. Cargo.CargoType .. " Weight: " .. Cargo.CargoWeight .. "\n" + end + end + + if CargoMsg == "" then + CargoMsg = "empty" + end + + self:Message( CargoMsg, 15, self.ClientName .. "/Cargo", "Co-Pilot: Cargo Status", 30 ) + +end + +-- TODO (1) I urgently need to revise this. +--- A local function called by the DCS World Menu system to switch off messages. +function CLIENT.SwitchMessages( PrmTable ) + PrmTable[1].MessageSwitch = PrmTable[2] +end + +--- The main message driver for the CLIENT. +-- This function displays various messages to the Player logged into the CLIENT through the DCS World Messaging system. +-- @param #CLIENT self +-- @param #string Message is the text describing the message. +-- @param #number MessageDuration is the duration in seconds that the Message should be displayed. +-- @param #string MessageId is a text identifying the Message in the MessageQueue. The Message system overwrites Messages with the same MessageId +-- @param #string MessageCategory is the category of the message (the title). +-- @param #number MessageInterval is the interval in seconds between the display of the @{Message#MESSAGE} when the CLIENT is in the air. +function CLIENT:Message( Message, MessageDuration, MessageId, MessageCategory, MessageInterval ) + self:F( { Message, MessageDuration, MessageId, MessageCategory, MessageInterval } ) + + if not self.MenuMessages then + if self:GetClientGroupID() then + self.MenuMessages = MENU_CLIENT:New( self, 'Messages' ) + self.MenuRouteMessageOn = MENU_CLIENT_COMMAND:New( self, 'Messages On', self.MenuMessages, CLIENT.SwitchMessages, { self, true } ) + self.MenuRouteMessageOff = MENU_CLIENT_COMMAND:New( self,'Messages Off', self.MenuMessages, CLIENT.SwitchMessages, { self, false } ) + end + end + + if self.MessageSwitch == true then + if MessageCategory == nil then + MessageCategory = "Messages" + end + if self.Messages[MessageId] == nil then + self.Messages[MessageId] = {} + self.Messages[MessageId].MessageId = MessageId + self.Messages[MessageId].MessageTime = timer.getTime() + self.Messages[MessageId].MessageDuration = MessageDuration + if MessageInterval == nil then + self.Messages[MessageId].MessageInterval = 600 + else + self.Messages[MessageId].MessageInterval = MessageInterval + end + MESSAGE:New( Message, MessageCategory, MessageDuration, MessageId ):ToClient( self ) + else + if self:GetClientGroupDCSUnit() and not self:GetClientGroupDCSUnit():inAir() then + if timer.getTime() - self.Messages[MessageId].MessageTime >= self.Messages[MessageId].MessageDuration + 10 then + MESSAGE:New( Message, MessageCategory, MessageDuration, MessageId ):ToClient( self ) + self.Messages[MessageId].MessageTime = timer.getTime() + end + else + if timer.getTime() - self.Messages[MessageId].MessageTime >= self.Messages[MessageId].MessageDuration + self.Messages[MessageId].MessageInterval then + MESSAGE:New( Message, MessageCategory, MessageDuration, MessageId ):ToClient( self ) + self.Messages[MessageId].MessageTime = timer.getTime() + end + end + end + end +end +--- Manage the mission database. +-- +-- @{#DATABASE} class +-- ================== +-- Mission designers can use the DATABASE class to refer to: +-- +-- * UNITS +-- * GROUPS +-- * players +-- * alive players +-- * CLIENTS +-- * alive CLIENTS +-- +-- On top, for internal MOOSE administration purposes, the DATBASE administers the Unit and Gruop templates as defined within the Mission Editor. +-- +-- Moose will automatically create one instance of the DATABASE class into the **global** object _DATABASE. +-- Moose refers to _DATABASE within the framework extensively, but you can also refer to the _DATABASE object within your missions if required. +-- +-- DATABASE iterators: +-- =================== +-- You can iterate the database with the available iterator methods. +-- The iterator methods will walk the DATABASE set, and call for each element within the set a function that you provide. +-- The following iterator methods are currently available within the DATABASE: +-- +-- * @{#DATABASE.ForEachUnit}: Calls a function for each @{UNIT} it finds within the DATABASE. +-- * @{#DATABASE.ForEachGroup}: Calls a function for each @{GROUP} it finds within the DATABASE. +-- * @{#DATABASE.ForEachPlayer}: Calls a function for each player it finds within the DATABASE. +-- * @{#DATABASE.ForEachPlayerAlive}: Calls a function for each alive player it finds within the DATABASE. +-- * @{#DATABASE.ForEachClient}: Calls a function for each @{CLIENT} it finds within the DATABASE. +-- * @{#DATABASE.ForEachClientAlive}: Calls a function for each alive @{CLIENT} it finds within the DATABASE. +-- +-- @module Database +-- @author FlightControl + +Include.File( "Routines" ) +Include.File( "Base" ) +Include.File( "Menu" ) +Include.File( "Group" ) +Include.File( "Unit" ) +Include.File( "Event" ) +Include.File( "Client" ) + + +--- DATABASE class +-- @type DATABASE +-- @extends Base#BASE +DATABASE = { + ClassName = "DATABASE", + Templates = { + Units = {}, + Groups = {}, + ClientsByName = {}, + ClientsByID = {}, + }, + DCSUnits = {}, + DCSGroups = {}, + UNITS = {}, + GROUPS = {}, + PLAYERS = {}, + PLAYERSALIVE = {}, + CLIENTS = {}, + CLIENTSALIVE = {}, + NavPoints = {}, +} + +local _DATABASECoalition = + { + [1] = "Red", + [2] = "Blue", + } + +local _DATABASECategory = + { + [Unit.Category.AIRPLANE] = "Plane", + [Unit.Category.HELICOPTER] = "Helicopter", + [Unit.Category.GROUND_UNIT] = "Vehicle", + [Unit.Category.SHIP] = "Ship", + [Unit.Category.STRUCTURE] = "Structure", + } + + +--- Creates a new DATABASE object, building a set of units belonging to a coalitions, categories, countries, types or with defined prefix names. +-- @param #DATABASE self +-- @return #DATABASE +-- @usage +-- -- Define a new DATABASE Object. This DBObject will contain a reference to all Group and Unit Templates defined within the ME and the DCSRTE. +-- DBObject = DATABASE:New() +function DATABASE:New() + + -- Inherits from BASE + local self = BASE:Inherit( self, BASE:New() ) + + _EVENTDISPATCHER:OnBirth( self._EventOnBirth, self ) + _EVENTDISPATCHER:OnDead( self._EventOnDeadOrCrash, self ) + _EVENTDISPATCHER:OnCrash( self._EventOnDeadOrCrash, self ) + + + -- Follow alive players and clients + _EVENTDISPATCHER:OnPlayerEnterUnit( self._EventOnPlayerEnterUnit, self ) + _EVENTDISPATCHER:OnPlayerLeaveUnit( self._EventOnPlayerLeaveUnit, self ) + + self:_RegisterTemplates() + self:_RegisterDatabase() + self:_RegisterPlayers() + + return self +end + +--- Finds a Unit based on the Unit Name. +-- @param #DATABASE self +-- @param #string UnitName +-- @return Unit#UNIT The found Unit. +function DATABASE:FindUnit( UnitName ) + + local UnitFound = self.UNITS[UnitName] + return UnitFound +end + + +--- Adds a Unit based on the Unit Name in the DATABASE. +-- @param #DATABASE self +function DATABASE:AddUnit( DCSUnit, DCSUnitName ) + + self.DCSUnits[DCSUnitName] = DCSUnit + self.UNITS[DCSUnitName] = UNIT:Register( DCSUnitName ) +end + + +--- Deletes a Unit from the DATABASE based on the Unit Name. +-- @param #DATABASE self +function DATABASE:DeleteUnit( DCSUnitName ) + + self.DCSUnits[DCSUnitName] = nil +end + + +--- Finds a CLIENT based on the ClientName. +-- @param #DATABASE self +-- @param #string ClientName +-- @return Client#CLIENT The found CLIENT. +function DATABASE:FindClient( ClientName ) + + local ClientFound = self.CLIENTS[ClientName] + return ClientFound +end + + +--- Adds a CLIENT based on the ClientName in the DATABASE. +-- @param #DATABASE self +function DATABASE:AddClient( ClientName ) + + self.CLIENTS[ClientName] = CLIENT:Register( ClientName ) + self:E( self.CLIENTS[ClientName]:GetClassNameAndID() ) +end + + +--- Finds a GROUP based on the GroupName. +-- @param #DATABASE self +-- @param #string GroupName +-- @return Group#GROUP The found GROUP. +function DATABASE:FindGroup( GroupName ) + + local GroupFound = self.GROUPS[GroupName] + return GroupFound +end + + +--- Adds a GROUP based on the GroupName in the DATABASE. +-- @param #DATABASE self +function DATABASE:AddGroup( DCSGroup, GroupName ) + + self.DCSGroups[GroupName] = DCSGroup + self.GROUPS[GroupName] = GROUP:Register( GroupName ) +end + +--- Adds a player based on the Player Name in the DATABASE. +-- @param #DATABASE self +function DATABASE:AddPlayer( UnitName, PlayerName ) + + if PlayerName then + self:E( { "Add player for unit:", UnitName, PlayerName } ) + self.PLAYERS[PlayerName] = PlayerName + self.PLAYERSALIVE[PlayerName] = PlayerName + self.CLIENTSALIVE[PlayerName] = self:FindClient( UnitName ) + end +end + +--- Deletes a player from the DATABASE based on the Player Name. +-- @param #DATABASE self +function DATABASE:DeletePlayer( PlayerName ) + + if PlayerName then + self:E( { "Clean player:", PlayerName } ) + self.PLAYERSALIVE[PlayerName] = nil + self.CLIENTSALIVE[PlayerName] = nil + end +end + + +--- Instantiate new Groups within the DCSRTE. +-- This method expects EXACTLY the same structure as a structure within the ME, and needs 2 additional fields defined: +-- SpawnCountryID, SpawnCategoryID +-- This method is used by the SPAWN class. +-- @param #DATABASE self +-- @param #table SpawnTemplate +-- @return #DATABASE self +function DATABASE:Spawn( SpawnTemplate ) + self:F2( SpawnTemplate.name ) + + self:T2( { SpawnTemplate.SpawnCountryID, SpawnTemplate.SpawnCategoryID } ) + + -- Copy the spawn variables of the template in temporary storage, nullify, and restore the spawn variables. + local SpawnCoalitionID = SpawnTemplate.SpawnCoalitionID + local SpawnCountryID = SpawnTemplate.SpawnCountryID + local SpawnCategoryID = SpawnTemplate.SpawnCategoryID + + -- Nullify + SpawnTemplate.SpawnCoalitionID = nil + SpawnTemplate.SpawnCountryID = nil + SpawnTemplate.SpawnCategoryID = nil + + self:_RegisterTemplate( SpawnTemplate ) + coalition.addGroup( SpawnCountryID, SpawnCategoryID, SpawnTemplate ) + + -- Restore + SpawnTemplate.SpawnCoalitionID = SpawnCoalitionID + SpawnTemplate.SpawnCountryID = SpawnCountryID + SpawnTemplate.SpawnCategoryID = SpawnCategoryID + + + local SpawnGroup = GROUP:Register( SpawnTemplate.name ) + return SpawnGroup +end + +--- Set a status to a Group within the Database, this to check crossing events for example. +function DATABASE:SetStatusGroup( GroupName, Status ) + self:F2( Status ) + + self.Templates.Groups[GroupName].Status = Status +end + +--- Get a status to a Group within the Database, this to check crossing events for example. +function DATABASE:GetStatusGroup( GroupName ) + self:F2( Status ) + + if self.Templates.Groups[GroupName] then + return self.Templates.Groups[GroupName].Status + else + return "" + end +end + + +--- Private method that registers new Group Templates within the DATABASE Object. +-- @param #DATABASE self +-- @param #table GroupTemplate +-- @return #DATABASE self +function DATABASE:_RegisterTemplate( GroupTemplate ) + + local GroupTemplateName = env.getValueDictByKey(GroupTemplate.name) + + if not self.Templates.Groups[GroupTemplateName] then + self.Templates.Groups[GroupTemplateName] = {} + self.Templates.Groups[GroupTemplateName].Status = nil + end + + -- Delete the spans from the route, it is not needed and takes memory. + if GroupTemplate.route and GroupTemplate.route.spans then + GroupTemplate.route.spans = nil + end + + self.Templates.Groups[GroupTemplateName].GroupName = GroupTemplateName + self.Templates.Groups[GroupTemplateName].Template = GroupTemplate + self.Templates.Groups[GroupTemplateName].groupId = GroupTemplate.groupId + self.Templates.Groups[GroupTemplateName].UnitCount = #GroupTemplate.units + self.Templates.Groups[GroupTemplateName].Units = GroupTemplate.units + + self:T2( { "Group", self.Templates.Groups[GroupTemplateName].GroupName, self.Templates.Groups[GroupTemplateName].UnitCount } ) + + for unit_num, UnitTemplate in pairs( GroupTemplate.units ) do + + local UnitTemplateName = env.getValueDictByKey(UnitTemplate.name) + self.Templates.Units[UnitTemplateName] = {} + self.Templates.Units[UnitTemplateName].UnitName = UnitTemplateName + self.Templates.Units[UnitTemplateName].Template = UnitTemplate + self.Templates.Units[UnitTemplateName].GroupName = GroupTemplateName + self.Templates.Units[UnitTemplateName].GroupTemplate = GroupTemplate + self.Templates.Units[UnitTemplateName].GroupId = GroupTemplate.groupId + self:E( {"skill",UnitTemplate.skill}) + if UnitTemplate.skill and (UnitTemplate.skill == "Client" or UnitTemplate.skill == "Player") then + self.Templates.ClientsByName[UnitTemplateName] = UnitTemplate + self.Templates.ClientsByID[UnitTemplate.unitId] = UnitTemplate + end + self:E( { "Unit", self.Templates.Units[UnitTemplateName].UnitName } ) + end +end + + +--- Private method that registers all alive players in the mission. +-- @param #DATABASE self +-- @return #DATABASE self +function DATABASE:_RegisterPlayers() + + local CoalitionsData = { AlivePlayersRed = coalition.getPlayers( coalition.side.RED ), AlivePlayersBlue = coalition.getPlayers( coalition.side.BLUE ) } + for CoalitionId, CoalitionData in pairs( CoalitionsData ) do + for UnitId, UnitData in pairs( CoalitionData ) do + self:T3( { "UnitData:", UnitData } ) + if UnitData and UnitData:isExist() then + local UnitName = UnitData:getName() + local PlayerName = UnitData:getPlayerName() + if not self.PLAYERS[PlayerName] then + self:E( { "Add player for unit:", UnitName, PlayerName } ) + self:AddPlayer( UnitName, PlayerName ) + end + end + end + end + + return self +end + + +--- Private method that registers all datapoints within in the mission. +-- @param #DATABASE self +-- @return #DATABASE self +function DATABASE:_RegisterDatabase() + + local CoalitionsData = { GroupsRed = coalition.getGroups( coalition.side.RED ), GroupsBlue = coalition.getGroups( coalition.side.BLUE ) } + for CoalitionId, CoalitionData in pairs( CoalitionsData ) do + for DCSGroupId, DCSGroup in pairs( CoalitionData ) do + + if DCSGroup:isExist() then + local DCSGroupName = DCSGroup:getName() + + self:E( { "Register Group:", DCSGroup, DCSGroupName } ) + self:AddGroup( DCSGroup, DCSGroupName ) + + for DCSUnitId, DCSUnit in pairs( DCSGroup:getUnits() ) do + + local DCSUnitName = DCSUnit:getName() + self:E( { "Register Unit:", DCSUnit, DCSUnitName } ) + self:AddUnit( DCSUnit, DCSUnitName ) + end + else + self:E( { "Group does not exist: ", DCSGroup } ) + end + + end + end + + for ClientName, ClientTemplate in pairs( self.Templates.ClientsByName ) do + self:E( { "Adding Client:", ClientName } ) + self:AddClient( ClientName ) + end + + return self +end + +--- Events + +--- Handles the OnBirth event for the alive units set. +-- @param #DATABASE self +-- @param Event#EVENTDATA Event +function DATABASE:_EventOnBirth( Event ) + self:F2( { Event } ) + + if Event.IniDCSUnit then + self:AddUnit( Event.IniDCSUnit, Event.IniDCSUnitName ) + self:AddGroup( Event.IniDCSGroup, Event.IniDCSGroupName ) + self:_EventOnPlayerEnterUnit( Event ) + end +end + + +--- Handles the OnDead or OnCrash event for alive units set. +-- @param #DATABASE self +-- @param Event#EVENTDATA Event +function DATABASE:_EventOnDeadOrCrash( Event ) + self:F2( { Event } ) + + if Event.IniDCSUnit then + if self.DCSUnits[Event.IniDCSUnitName] then + self:DeleteUnit( Event.IniDCSUnitName ) + -- add logic to correctly remove a group once all units are destroyed... + end + end +end + + +--- Handles the OnPlayerEnterUnit event to fill the active players table (with the unit filter applied). +-- @param #DATABASE self +-- @param Event#EVENTDATA Event +function DATABASE:_EventOnPlayerEnterUnit( Event ) + self:F2( { Event } ) + + if Event.IniDCSUnit then + local PlayerName = Event.IniDCSUnit:getPlayerName() + if not self.PLAYERSALIVE[PlayerName] then + self:AddPlayer( Event.IniDCSUnitName, PlayerName ) + end + end +end + + +--- Handles the OnPlayerLeaveUnit event to clean the active players table. +-- @param #DATABASE self +-- @param Event#EVENTDATA Event +function DATABASE:_EventOnPlayerLeaveUnit( Event ) + self:F2( { Event } ) + + if Event.IniDCSUnit then + local PlayerName = Event.IniDCSUnit:getPlayerName() + if self.PLAYERSALIVE[PlayerName] then + self:DeletePlayer( PlayerName ) + end + end +end + +--- Iterators + +--- Iterate the DATABASE and call an iterator function for the given set, providing the Object for each element within the set and optional parameters. +-- @param #DATABASE self +-- @param #function IteratorFunction The function that will be called when there is an alive player in the database. +-- @return #DATABASE self +function DATABASE:ForEach( IteratorFunction, arg, Set ) + self:F2( arg ) + + local function CoRoutine() + local Count = 0 + for ObjectID, Object in pairs( Set ) do + self:T2( Object ) + IteratorFunction( Object, unpack( arg ) ) + Count = Count + 1 + if Count % 10 == 0 then + coroutine.yield( false ) + end + end + return true + end + + local co = coroutine.create( CoRoutine ) + + local function Schedule() + + local status, res = coroutine.resume( co ) + self:T2( { status, res } ) + + if status == false then + error( res ) + end + if res == false then + return true -- resume next time the loop + end + + return false + end + + local Scheduler = SCHEDULER:New( self, Schedule, {}, 0.001, 0.001, 0 ) + + return self +end + + +--- Iterate the DATABASE and call an iterator function for each **alive** unit, providing the DCSUnit and optional parameters. +-- @param #DATABASE self +-- @param #function IteratorFunction The function that will be called when there is an alive unit in the database. The function needs to accept a DCSUnit parameter. +-- @return #DATABASE self +function DATABASE:ForEachDCSUnit( IteratorFunction, ... ) + self:F2( arg ) + + self:ForEach( IteratorFunction, arg, self.DCSUnits ) + + return self +end + + +--- Iterate the DATABASE and call an iterator function for each **alive** UNIT, providing the UNIT and optional parameters. +-- @param #DATABASE self +-- @param #function IteratorFunction The function that will be called when there is an alive UNIT in the database. The function needs to accept a UNIT parameter. +-- @return #DATABASE self +function DATABASE:ForEachUnit( IteratorFunction, ... ) + self:F2( arg ) + + self:ForEach( IteratorFunction, arg, self.UNITS ) + + return self +end + +--- Iterate the DATABASE and call an iterator function for each **alive** GROUP, providing the GROUP and optional parameters. +-- @param #DATABASE self +-- @param #function IteratorFunction The function that will be called when there is an alive GROUP in the database. The function needs to accept a GROUP parameter. +-- @return #DATABASE self +function DATABASE:ForEachGroup( IteratorFunction, ... ) + self:F2( arg ) + + self:ForEach( IteratorFunction, arg, self.GROUPS ) + + return self +end + + +--- Iterate the DATABASE and call an iterator function for each player, providing the player name and optional parameters. +-- @param #DATABASE self +-- @param #function IteratorFunction The function that will be called when there is an player in the database. The function needs to accept the player name. +-- @return #DATABASE self +function DATABASE:ForEachPlayer( IteratorFunction, ... ) + self:F2( arg ) + + self:ForEach( IteratorFunction, arg, self.PLAYERS ) + + return self +end + + +--- Iterate the DATABASE and call an iterator function for each **alive** player, providing the Unit of the player and optional parameters. +-- @param #DATABASE self +-- @param #function IteratorFunction The function that will be called when there is an alive player in the database. The function needs to accept a UNIT parameter. +-- @return #DATABASE self +function DATABASE:ForEachPlayerAlive( IteratorFunction, ... ) + self:F2( arg ) + + self:ForEach( IteratorFunction, arg, self.PLAYERSALIVE ) + + return self +end + +--- Iterate the DATABASE and call an iterator function for each CLIENT, providing the CLIENT to the function and optional parameters. +-- @param #DATABASE self +-- @param #function IteratorFunction The function that will be called when there is an alive player in the database. The function needs to accept a CLIENT parameter. +-- @return #DATABASE self +function DATABASE:ForEachClient( IteratorFunction, ... ) + self:F2( arg ) + + self:ForEach( IteratorFunction, arg, self.CLIENTS ) + + return self +end + +--- Iterate the DATABASE and call an iterator function for each **ALIVE** CLIENT, providing the CLIENT to the function and optional parameters. +-- @param #DATABASE self +-- @param #function IteratorFunction The function that will be called when there is an alive CLIENT in the database. The function needs to accept a CLIENT parameter. +-- @return #DATABASE self +function DATABASE:ForEachClientAlive( IteratorFunction, ... ) + self:F2( arg ) + + self:ForEach( IteratorFunction, arg, self.CLIENTSALIVE ) + + return self +end + + +function DATABASE:_RegisterTemplates() + self:F2() + + self.Navpoints = {} + self.UNITS = {} + --Build routines.db.units and self.Navpoints + for coa_name, coa_data in pairs(env.mission.coalition) do + + if (coa_name == 'red' or coa_name == 'blue') and type(coa_data) == 'table' then + --self.Units[coa_name] = {} + + ---------------------------------------------- + -- build nav points DB + self.Navpoints[coa_name] = {} + if coa_data.nav_points then --navpoints + for nav_ind, nav_data in pairs(coa_data.nav_points) do + + if type(nav_data) == 'table' then + self.Navpoints[coa_name][nav_ind] = routines.utils.deepCopy(nav_data) + + self.Navpoints[coa_name][nav_ind]['name'] = nav_data.callsignStr -- name is a little bit more self-explanatory. + self.Navpoints[coa_name][nav_ind]['point'] = {} -- point is used by SSE, support it. + self.Navpoints[coa_name][nav_ind]['point']['x'] = nav_data.x + self.Navpoints[coa_name][nav_ind]['point']['y'] = 0 + self.Navpoints[coa_name][nav_ind]['point']['z'] = nav_data.y + end + end + end + ------------------------------------------------- + if coa_data.country then --there is a country table + for cntry_id, cntry_data in pairs(coa_data.country) do + + local countryName = string.lower(cntry_data.name) + --self.Units[coa_name][countryName] = {} + --self.Units[coa_name][countryName]["countryId"] = cntry_data.id + + if type(cntry_data) == 'table' then --just making sure + + for obj_type_name, obj_type_data in pairs(cntry_data) do + + if obj_type_name == "helicopter" or obj_type_name == "ship" or obj_type_name == "plane" or obj_type_name == "vehicle" or obj_type_name == "static" then --should be an unncessary check + + local category = obj_type_name + + if ((type(obj_type_data) == 'table') and obj_type_data.group and (type(obj_type_data.group) == 'table') and (#obj_type_data.group > 0)) then --there's a group! + + --self.Units[coa_name][countryName][category] = {} + + for group_num, GroupTemplate in pairs(obj_type_data.group) do + + if GroupTemplate and GroupTemplate.units and type(GroupTemplate.units) == 'table' then --making sure again- this is a valid group + self:_RegisterTemplate( GroupTemplate ) + end --if GroupTemplate and GroupTemplate.units then + end --for group_num, GroupTemplate in pairs(obj_type_data.group) do + end --if ((type(obj_type_data) == 'table') and obj_type_data.group and (type(obj_type_data.group) == 'table') and (#obj_type_data.group > 0)) then + end --if obj_type_name == "helicopter" or obj_type_name == "ship" or obj_type_name == "plane" or obj_type_name == "vehicle" or obj_type_name == "static" then + end --for obj_type_name, obj_type_data in pairs(cntry_data) do + end --if type(cntry_data) == 'table' then + end --for cntry_id, cntry_data in pairs(coa_data.country) do + end --if coa_data.country then --there is a country table + end --if coa_name == 'red' or coa_name == 'blue' and type(coa_data) == 'table' then + end --for coa_name, coa_data in pairs(mission.coalition) do + + return self +end + + + + +--- The main include file for the MOOSE system. + +Include.File( "Routines" ) +Include.File( "Base" ) +Include.File( "Database" ) +Include.File( "Event" ) + +-- The order of the declarations is important here. Don't touch it. + +--- Declare the event dispatcher based on the EVENT class +_EVENTDISPATCHER = EVENT:New() -- #EVENT + +--- Declare the main database object, which is used internally by the MOOSE classes. +_DATABASE = DATABASE:New() -- Database#DATABASE + +--- Scoring system for MOOSE. +-- This scoring class calculates the hits and kills that players make within a simulation session. +-- Scoring is calculated using a defined algorithm. +-- With a small change in MissionScripting.lua, the scoring can also be logged in a CSV file, that can then be uploaded +-- to a database or a BI tool to publish the scoring results to the player community. +-- @module Scoring +-- @author FlightControl + + +Include.File( "Routines" ) +Include.File( "Base" ) +Include.File( "Menu" ) +Include.File( "Group" ) +Include.File( "Event" ) + + +--- The Scoring class +-- @type SCORING +-- @field Players A collection of the current players that have joined the game. +-- @extends Base#BASE +SCORING = { + ClassName = "SCORING", + ClassID = 0, + Players = {}, +} + +local _SCORINGCoalition = + { + [1] = "Red", + [2] = "Blue", + } + +local _SCORINGCategory = + { + [Unit.Category.AIRPLANE] = "Plane", + [Unit.Category.HELICOPTER] = "Helicopter", + [Unit.Category.GROUND_UNIT] = "Vehicle", + [Unit.Category.SHIP] = "Ship", + [Unit.Category.STRUCTURE] = "Structure", + } + +--- Creates a new SCORING object to administer the scoring achieved by players. +-- @param #SCORING self +-- @param #string GameName The name of the game. This name is also logged in the CSV score file. +-- @return #SCORING self +-- @usage +-- -- Define a new scoring object for the mission Gori Valley. +-- ScoringObject = SCORING:New( "Gori Valley" ) +function SCORING:New( GameName ) + + -- Inherits from BASE + local self = BASE:Inherit( self, BASE:New() ) + + if GameName then + self.GameName = GameName + else + error( "A game name must be given to register the scoring results" ) + end + + + _EVENTDISPATCHER:OnDead( self._EventOnDeadOrCrash, self ) + _EVENTDISPATCHER:OnCrash( self._EventOnDeadOrCrash, self ) + _EVENTDISPATCHER:OnHit( self._EventOnHit, self ) + + --self.SchedulerId = routines.scheduleFunction( SCORING._FollowPlayersScheduled, { self }, 0, 5 ) + self.SchedulerId = SCHEDULER:New( self, self._FollowPlayersScheduled, {}, 0, 5 ) + + self:ScoreMenu() + + return self + +end + +--- Creates a score radio menu. Can be accessed using Radio -> F10. +-- @param #SCORING self +-- @return #SCORING self +function SCORING:ScoreMenu() + self.Menu = SUBMENU:New( 'Scoring' ) + self.AllScoresMenu = COMMANDMENU:New( 'Score All Active Players', self.Menu, SCORING.ReportScoreAll, self ) + --- = COMMANDMENU:New('Your Current Score', ReportScore, SCORING.ReportScorePlayer, self ) + return self +end + +--- Follows new players entering Clients within the DCSRTE. +-- TODO: Need to see if i can catch this also with an event. It will eliminate the schedule ... +function SCORING:_FollowPlayersScheduled() + self:F3( "_FollowPlayersScheduled" ) + + local ClientUnit = 0 + local CoalitionsData = { AlivePlayersRed = coalition.getPlayers(coalition.side.RED), AlivePlayersBlue = coalition.getPlayers(coalition.side.BLUE) } + local unitId + local unitData + local AlivePlayerUnits = {} + + for CoalitionId, CoalitionData in pairs( CoalitionsData ) do + self:T3( { "_FollowPlayersScheduled", CoalitionData } ) + for UnitId, UnitData in pairs( CoalitionData ) do + self:_AddPlayerFromUnit( UnitData ) + end + end + + return true +end + + +--- Track DEAD or CRASH events for the scoring. +-- @param #SCORING self +-- @param Event#EVENTDATA Event +function SCORING:_EventOnDeadOrCrash( Event ) + self:F( { Event } ) + + local TargetUnit = nil + local TargetGroup = nil + local TargetUnitName = "" + local TargetGroupName = "" + local TargetPlayerName = "" + local TargetCoalition = nil + local TargetCategory = nil + local TargetType = nil + local TargetUnitCoalition = nil + local TargetUnitCategory = nil + local TargetUnitType = nil + + if Event.IniDCSUnit then + + TargetUnit = Event.IniDCSUnit + TargetUnitName = Event.IniDCSUnitName + TargetGroup = Event.IniDCSGroup + TargetGroupName = Event.IniDCSGroupName + TargetPlayerName = TargetUnit:getPlayerName() + + TargetCoalition = TargetUnit:getCoalition() + --TargetCategory = TargetUnit:getCategory() + TargetCategory = TargetUnit:getDesc().category -- Workaround + TargetType = TargetUnit:getTypeName() + + TargetUnitCoalition = _SCORINGCoalition[TargetCoalition] + TargetUnitCategory = _SCORINGCategory[TargetCategory] + TargetUnitType = TargetType + + self:T( { TargetUnitName, TargetGroupName, TargetPlayerName, TargetCoalition, TargetCategory, TargetType } ) + end + + for PlayerName, PlayerData in pairs( self.Players ) do + if PlayerData then -- This should normally not happen, but i'll test it anyway. + self:T( "Something got killed" ) + + -- Some variables + local InitUnitName = PlayerData.UnitName + local InitUnitType = PlayerData.UnitType + local InitCoalition = PlayerData.UnitCoalition + local InitCategory = PlayerData.UnitCategory + local InitUnitCoalition = _SCORINGCoalition[InitCoalition] + local InitUnitCategory = _SCORINGCategory[InitCategory] + + self:T( { InitUnitName, InitUnitType, InitUnitCoalition, InitCoalition, InitUnitCategory, InitCategory } ) + + -- What is he hitting? + if TargetCategory then + if PlayerData and PlayerData.Hit and PlayerData.Hit[TargetCategory] and PlayerData.Hit[TargetCategory][TargetUnitName] then -- Was there a hit for this unit for this player before registered??? + if not PlayerData.Kill[TargetCategory] then + PlayerData.Kill[TargetCategory] = {} + end + if not PlayerData.Kill[TargetCategory][TargetType] then + PlayerData.Kill[TargetCategory][TargetType] = {} + PlayerData.Kill[TargetCategory][TargetType].Score = 0 + PlayerData.Kill[TargetCategory][TargetType].ScoreKill = 0 + PlayerData.Kill[TargetCategory][TargetType].Penalty = 0 + PlayerData.Kill[TargetCategory][TargetType].PenaltyKill = 0 + end + + if InitCoalition == TargetCoalition then + PlayerData.Penalty = PlayerData.Penalty + 25 + PlayerData.Kill[TargetCategory][TargetType].Penalty = PlayerData.Kill[TargetCategory][TargetType].Penalty + 25 + PlayerData.Kill[TargetCategory][TargetType].PenaltyKill = PlayerData.Kill[TargetCategory][TargetType].PenaltyKill + 1 + MESSAGE:New( "Player '" .. PlayerName .. "' killed a friendly " .. TargetUnitCategory .. " ( " .. TargetType .. " ) " .. + PlayerData.Kill[TargetCategory][TargetType].PenaltyKill .. " times. Penalty: -" .. PlayerData.Kill[TargetCategory][TargetType].Penalty .. + ". Score Total:" .. PlayerData.Score - PlayerData.Penalty, + "", 5, "/PENALTY" .. PlayerName .. "/" .. InitUnitName ):ToAll() + self:ScoreCSV( PlayerName, "KILL_PENALTY", 1, -125, InitUnitName, InitUnitCoalition, InitUnitCategory, InitUnitType, TargetUnitName, TargetUnitCoalition, TargetUnitCategory, TargetUnitType ) + else + PlayerData.Score = PlayerData.Score + 10 + PlayerData.Kill[TargetCategory][TargetType].Score = PlayerData.Kill[TargetCategory][TargetType].Score + 10 + PlayerData.Kill[TargetCategory][TargetType].ScoreKill = PlayerData.Kill[TargetCategory][TargetType].ScoreKill + 1 + MESSAGE:New( "Player '" .. PlayerName .. "' killed an enemy " .. TargetUnitCategory .. " ( " .. TargetType .. " ) " .. + PlayerData.Kill[TargetCategory][TargetType].ScoreKill .. " times. Score: " .. PlayerData.Kill[TargetCategory][TargetType].Score .. + ". Score Total:" .. PlayerData.Score - PlayerData.Penalty, + "", 5, "/SCORE" .. PlayerName .. "/" .. InitUnitName ):ToAll() + self:ScoreCSV( PlayerName, "KILL_SCORE", 1, 10, InitUnitName, InitUnitCoalition, InitUnitCategory, InitUnitType, TargetUnitName, TargetUnitCoalition, TargetUnitCategory, TargetUnitType ) + end + end + end + end + end +end + + + +--- Add a new player entering a Unit. +function SCORING:_AddPlayerFromUnit( UnitData ) + self:F( UnitData ) + + if UnitData and UnitData:isExist() then + local UnitName = UnitData:getName() + local PlayerName = UnitData:getPlayerName() + local UnitDesc = UnitData:getDesc() + local UnitCategory = UnitDesc.category + local UnitCoalition = UnitData:getCoalition() + local UnitTypeName = UnitData:getTypeName() + + self:T( { PlayerName, UnitName, UnitCategory, UnitCoalition, UnitTypeName } ) + + if self.Players[PlayerName] == nil then -- I believe this is the place where a Player gets a life in a mission when he enters a unit ... + self.Players[PlayerName] = {} + self.Players[PlayerName].Hit = {} + self.Players[PlayerName].Kill = {} + self.Players[PlayerName].Mission = {} + + -- for CategoryID, CategoryName in pairs( SCORINGCategory ) do + -- self.Players[PlayerName].Hit[CategoryID] = {} + -- self.Players[PlayerName].Kill[CategoryID] = {} + -- end + self.Players[PlayerName].HitPlayers = {} + self.Players[PlayerName].HitUnits = {} + self.Players[PlayerName].Score = 0 + self.Players[PlayerName].Penalty = 0 + self.Players[PlayerName].PenaltyCoalition = 0 + self.Players[PlayerName].PenaltyWarning = 0 + end + + if not self.Players[PlayerName].UnitCoalition then + self.Players[PlayerName].UnitCoalition = UnitCoalition + else + if self.Players[PlayerName].UnitCoalition ~= UnitCoalition then + self.Players[PlayerName].Penalty = self.Players[PlayerName].Penalty + 50 + self.Players[PlayerName].PenaltyCoalition = self.Players[PlayerName].PenaltyCoalition + 1 + MESSAGE:New( "Player '" .. PlayerName .. "' changed coalition from " .. _SCORINGCoalition[self.Players[PlayerName].UnitCoalition] .. " to " .. _SCORINGCoalition[UnitCoalition] .. + "(changed " .. self.Players[PlayerName].PenaltyCoalition .. " times the coalition). 50 Penalty points added.", + "", + 2, + "/PENALTYCOALITION" .. PlayerName + ):ToAll() + self:ScoreCSV( PlayerName, "COALITION_PENALTY", 1, -50, self.Players[PlayerName].UnitName, _SCORINGCoalition[self.Players[PlayerName].UnitCoalition], _SCORINGCategory[self.Players[PlayerName].UnitCategory], self.Players[PlayerName].UnitType, + UnitName, _SCORINGCoalition[UnitCoalition], _SCORINGCategory[UnitCategory], UnitData:getTypeName() ) + end + end + self.Players[PlayerName].UnitName = UnitName + self.Players[PlayerName].UnitCoalition = UnitCoalition + self.Players[PlayerName].UnitCategory = UnitCategory + self.Players[PlayerName].UnitType = UnitTypeName + + if self.Players[PlayerName].Penalty > 100 then + if self.Players[PlayerName].PenaltyWarning < 1 then + MESSAGE:New( "Player '" .. PlayerName .. "': WARNING! If you continue to commit FRATRICIDE and have a PENALTY score higher than 150, you will be COURT MARTIALED and DISMISSED from this mission! \nYour total penalty is: " .. self.Players[PlayerName].Penalty, + "", + 30, + "/PENALTYCOALITION" .. PlayerName + ):ToAll() + self.Players[PlayerName].PenaltyWarning = self.Players[PlayerName].PenaltyWarning + 1 + end + end + + if self.Players[PlayerName].Penalty > 150 then + ClientGroup = GROUP:NewFromDCSUnit( UnitData ) + ClientGroup:Destroy() + MESSAGE:New( "Player '" .. PlayerName .. "' committed FRATRICIDE, he will be COURT MARTIALED and is DISMISSED from this mission!", + "", + 10, + "/PENALTYCOALITION" .. PlayerName + ):ToAll() + end + + end +end + + +--- Registers Scores the players completing a Mission Task. +function SCORING:_AddMissionTaskScore( PlayerUnit, MissionName, Score ) + self:F( { PlayerUnit, MissionName, Score } ) + + local PlayerName = PlayerUnit:getPlayerName() + + if not self.Players[PlayerName].Mission[MissionName] then + self.Players[PlayerName].Mission[MissionName] = {} + self.Players[PlayerName].Mission[MissionName].ScoreTask = 0 + self.Players[PlayerName].Mission[MissionName].ScoreMission = 0 + end + + self:T( PlayerName ) + self:T( self.Players[PlayerName].Mission[MissionName] ) + + self.Players[PlayerName].Score = self.Players[PlayerName].Score + Score + self.Players[PlayerName].Mission[MissionName].ScoreTask = self.Players[PlayerName].Mission[MissionName].ScoreTask + Score + + MESSAGE:New( "Player '" .. PlayerName .. "' has finished another Task in Mission '" .. MissionName .. "'. " .. + Score .. " Score points added.", + "", 20, "/SCORETASK" .. PlayerName ):ToAll() + + self:ScoreCSV( PlayerName, "TASK_" .. MissionName:gsub( ' ', '_' ), 1, Score, PlayerUnit:getName() ) +end + + +--- Registers Mission Scores for possible multiple players that contributed in the Mission. +function SCORING:_AddMissionScore( MissionName, Score ) + self:F( { MissionName, Score } ) + + for PlayerName, PlayerData in pairs( self.Players ) do + + if PlayerData.Mission[MissionName] then + PlayerData.Score = PlayerData.Score + Score + PlayerData.Mission[MissionName].ScoreMission = PlayerData.Mission[MissionName].ScoreMission + Score + MESSAGE:New( "Player '" .. PlayerName .. "' has finished Mission '" .. MissionName .. "'. " .. + Score .. " Score points added.", + "", 20, "/SCOREMISSION" .. PlayerName ):ToAll() + self:ScoreCSV( PlayerName, "MISSION_" .. MissionName:gsub( ' ', '_' ), 1, Score ) + end + end +end + +--- Handles the OnHit event for the scoring. +-- @param #SCORING self +-- @param Event#EVENTDATA Event +function SCORING:_EventOnHit( Event ) + self:F( { Event } ) + + local InitUnit = nil + local InitUnitName = "" + local InitGroup = nil + local InitGroupName = "" + local InitPlayerName = nil + + local InitCoalition = nil + local InitCategory = nil + local InitType = nil + local InitUnitCoalition = nil + local InitUnitCategory = nil + local InitUnitType = nil + + local TargetUnit = nil + local TargetUnitName = "" + local TargetGroup = nil + local TargetGroupName = "" + local TargetPlayerName = "" + + local TargetCoalition = nil + local TargetCategory = nil + local TargetType = nil + local TargetUnitCoalition = nil + local TargetUnitCategory = nil + local TargetUnitType = nil + + if Event.IniDCSUnit then + + InitUnit = Event.IniDCSUnit + InitUnitName = Event.IniDCSUnitName + InitGroup = Event.IniDCSGroup + InitGroupName = Event.IniDCSGroupName + InitPlayerName = InitUnit:getPlayerName() + + InitCoalition = InitUnit:getCoalition() + --TODO: Workaround Client DCS Bug + --InitCategory = InitUnit:getCategory() + InitCategory = InitUnit:getDesc().category + InitType = InitUnit:getTypeName() + + InitUnitCoalition = _SCORINGCoalition[InitCoalition] + InitUnitCategory = _SCORINGCategory[InitCategory] + InitUnitType = InitType + + self:T( { InitUnitName, InitGroupName, InitPlayerName, InitCoalition, InitCategory, InitType , InitUnitCoalition, InitUnitCategory, InitUnitType } ) + end + + + if Event.TgtDCSUnit then + + TargetUnit = Event.TgtDCSUnit + TargetUnitName = Event.TgtDCSUnitName + TargetGroup = Event.TgtDCSGroup + TargetGroupName = Event.TgtDCSGroupName + TargetPlayerName = TargetUnit:getPlayerName() + + TargetCoalition = TargetUnit:getCoalition() + --TODO: Workaround Client DCS Bug + --TargetCategory = TargetUnit:getCategory() + TargetCategory = TargetUnit:getDesc().category + TargetType = TargetUnit:getTypeName() + + TargetUnitCoalition = _SCORINGCoalition[TargetCoalition] + TargetUnitCategory = _SCORINGCategory[TargetCategory] + TargetUnitType = TargetType + + self:T( { TargetUnitName, TargetGroupName, TargetPlayerName, TargetCoalition, TargetCategory, TargetType, TargetUnitCoalition, TargetUnitCategory, TargetUnitType } ) + end + + if InitPlayerName ~= nil then -- It is a player that is hitting something + self:_AddPlayerFromUnit( InitUnit ) + if self.Players[InitPlayerName] then -- This should normally not happen, but i'll test it anyway. + if TargetPlayerName ~= nil then -- It is a player hitting another player ... + self:_AddPlayerFromUnit( TargetUnit ) + self.Players[InitPlayerName].HitPlayers = self.Players[InitPlayerName].HitPlayers + 1 + end + + self:T( "Hitting Something" ) + -- What is he hitting? + if TargetCategory then + if not self.Players[InitPlayerName].Hit[TargetCategory] then + self.Players[InitPlayerName].Hit[TargetCategory] = {} + end + if not self.Players[InitPlayerName].Hit[TargetCategory][TargetUnitName] then + self.Players[InitPlayerName].Hit[TargetCategory][TargetUnitName] = {} + self.Players[InitPlayerName].Hit[TargetCategory][TargetUnitName].Score = 0 + self.Players[InitPlayerName].Hit[TargetCategory][TargetUnitName].Penalty = 0 + self.Players[InitPlayerName].Hit[TargetCategory][TargetUnitName].ScoreHit = 0 + self.Players[InitPlayerName].Hit[TargetCategory][TargetUnitName].PenaltyHit = 0 + end + local Score = 0 + if InitCoalition == TargetCoalition then + self.Players[InitPlayerName].Penalty = self.Players[InitPlayerName].Penalty + 10 + self.Players[InitPlayerName].Hit[TargetCategory][TargetUnitName].Penalty = self.Players[InitPlayerName].Hit[TargetCategory][TargetUnitName].Penalty + 10 + self.Players[InitPlayerName].Hit[TargetCategory][TargetUnitName].PenaltyHit = self.Players[InitPlayerName].Hit[TargetCategory][TargetUnitName].PenaltyHit + 1 + MESSAGE:New( "Player '" .. InitPlayerName .. "' hit a friendly " .. TargetUnitCategory .. " ( " .. TargetType .. " ) " .. + self.Players[InitPlayerName].Hit[TargetCategory][TargetUnitName].PenaltyHit .. " times. Penalty: -" .. self.Players[InitPlayerName].Hit[TargetCategory][TargetUnitName].Penalty .. + ". Score Total:" .. self.Players[InitPlayerName].Score - self.Players[InitPlayerName].Penalty, + "", + 2, + "/PENALTY" .. InitPlayerName .. "/" .. InitUnitName + ):ToAll() + self:ScoreCSV( InitPlayerName, "HIT_PENALTY", 1, -25, InitUnitName, InitUnitCoalition, InitUnitCategory, InitUnitType, TargetUnitName, TargetUnitCoalition, TargetUnitCategory, TargetUnitType ) + else + self.Players[InitPlayerName].Score = self.Players[InitPlayerName].Score + 10 + self.Players[InitPlayerName].Hit[TargetCategory][TargetUnitName].Score = self.Players[InitPlayerName].Hit[TargetCategory][TargetUnitName].Score + 1 + self.Players[InitPlayerName].Hit[TargetCategory][TargetUnitName].ScoreHit = self.Players[InitPlayerName].Hit[TargetCategory][TargetUnitName].ScoreHit + 1 + MESSAGE:New( "Player '" .. InitPlayerName .. "' hit a target " .. TargetUnitCategory .. " ( " .. TargetType .. " ) " .. + self.Players[InitPlayerName].Hit[TargetCategory][TargetUnitName].ScoreHit .. " times. Score: " .. self.Players[InitPlayerName].Hit[TargetCategory][TargetUnitName].Score .. + ". Score Total:" .. self.Players[InitPlayerName].Score - self.Players[InitPlayerName].Penalty, + "", + 2, + "/SCORE" .. InitPlayerName .. "/" .. InitUnitName + ):ToAll() + self:ScoreCSV( InitPlayerName, "HIT_SCORE", 1, 1, InitUnitName, InitUnitCoalition, InitUnitCategory, InitUnitType, TargetUnitName, TargetUnitCoalition, TargetUnitCategory, TargetUnitType ) + end + end + end + elseif InitPlayerName == nil then -- It is an AI hitting a player??? + + end +end + + +function SCORING:ReportScoreAll() + + env.info( "Hello World " ) + + local ScoreMessage = "" + local PlayerMessage = "" + + self:T( "Score Report" ) + + for PlayerName, PlayerData in pairs( self.Players ) do + if PlayerData then -- This should normally not happen, but i'll test it anyway. + self:T( "Score Player: " .. PlayerName ) + + -- Some variables + local InitUnitCoalition = _SCORINGCoalition[PlayerData.UnitCoalition] + local InitUnitCategory = _SCORINGCategory[PlayerData.UnitCategory] + local InitUnitType = PlayerData.UnitType + local InitUnitName = PlayerData.UnitName + + local PlayerScore = 0 + local PlayerPenalty = 0 + + ScoreMessage = ":\n" + + local ScoreMessageHits = "" + + for CategoryID, CategoryName in pairs( _SCORINGCategory ) do + self:T( CategoryName ) + if PlayerData.Hit[CategoryID] then + local Score = 0 + local ScoreHit = 0 + local Penalty = 0 + local PenaltyHit = 0 + self:T( "Hit scores exist for player " .. PlayerName ) + for UnitName, UnitData in pairs( PlayerData.Hit[CategoryID] ) do + Score = Score + UnitData.Score + ScoreHit = ScoreHit + UnitData.ScoreHit + Penalty = Penalty + UnitData.Penalty + PenaltyHit = UnitData.PenaltyHit + end + local ScoreMessageHit = string.format( "%s:%d ", CategoryName, Score - Penalty ) + self:T( ScoreMessageHit ) + ScoreMessageHits = ScoreMessageHits .. ScoreMessageHit + PlayerScore = PlayerScore + Score + PlayerPenalty = PlayerPenalty + Penalty + else + --ScoreMessageHits = ScoreMessageHits .. string.format( "%s:%d ", string.format(CategoryName, 1, 1), 0 ) + end + end + if ScoreMessageHits ~= "" then + ScoreMessage = ScoreMessage .. " Hits: " .. ScoreMessageHits .. "\n" + end + + local ScoreMessageKills = "" + for CategoryID, CategoryName in pairs( _SCORINGCategory ) do + self:T( "Kill scores exist for player " .. PlayerName ) + if PlayerData.Kill[CategoryID] then + local Score = 0 + local ScoreKill = 0 + local Penalty = 0 + local PenaltyKill = 0 + + for UnitName, UnitData in pairs( PlayerData.Kill[CategoryID] ) do + Score = Score + UnitData.Score + ScoreKill = ScoreKill + UnitData.ScoreKill + Penalty = Penalty + UnitData.Penalty + PenaltyKill = PenaltyKill + UnitData.PenaltyKill + end + + local ScoreMessageKill = string.format( " %s:%d ", CategoryName, Score - Penalty ) + self:T( ScoreMessageKill ) + ScoreMessageKills = ScoreMessageKills .. ScoreMessageKill + + PlayerScore = PlayerScore + Score + PlayerPenalty = PlayerPenalty + Penalty + else + --ScoreMessageKills = ScoreMessageKills .. string.format( "%s:%d ", string.format(CategoryName, 1, 1), 0 ) + end + end + if ScoreMessageKills ~= "" then + ScoreMessage = ScoreMessage .. " Kills: " .. ScoreMessageKills .. "\n" + end + + local ScoreMessageCoalitionChangePenalties = "" + if PlayerData.PenaltyCoalition ~= 0 then + ScoreMessageCoalitionChangePenalties = ScoreMessageCoalitionChangePenalties .. string.format( " -%d (%d changed)", PlayerData.Penalty, PlayerData.PenaltyCoalition ) + PlayerPenalty = PlayerPenalty + PlayerData.Penalty + end + if ScoreMessageCoalitionChangePenalties ~= "" then + ScoreMessage = ScoreMessage .. " Coalition Penalties: " .. ScoreMessageCoalitionChangePenalties .. "\n" + end + + local ScoreMessageMission = "" + local ScoreMission = 0 + local ScoreTask = 0 + for MissionName, MissionData in pairs( PlayerData.Mission ) do + ScoreMission = ScoreMission + MissionData.ScoreMission + ScoreTask = ScoreTask + MissionData.ScoreTask + ScoreMessageMission = ScoreMessageMission .. "'" .. MissionName .. "'; " + end + PlayerScore = PlayerScore + ScoreMission + ScoreTask + + if ScoreMessageMission ~= "" then + ScoreMessage = ScoreMessage .. " Tasks: " .. ScoreTask .. " Mission: " .. ScoreMission .. " ( " .. ScoreMessageMission .. ")\n" + end + + PlayerMessage = PlayerMessage .. string.format( "Player '%s' Score:%d (%d Score -%d Penalties)%s", PlayerName, PlayerScore - PlayerPenalty, PlayerScore, PlayerPenalty, ScoreMessage ) + end + end + MESSAGE:New( PlayerMessage, "Player Scores", 30, "AllPlayerScores"):ToAll() +end + + +function SCORING:ReportScorePlayer() + + env.info( "Hello World " ) + + local ScoreMessage = "" + local PlayerMessage = "" + + self:T( "Score Report" ) + + for PlayerName, PlayerData in pairs( self.Players ) do + if PlayerData then -- This should normally not happen, but i'll test it anyway. + self:T( "Score Player: " .. PlayerName ) + + -- Some variables + local InitUnitCoalition = _SCORINGCoalition[PlayerData.UnitCoalition] + local InitUnitCategory = _SCORINGCategory[PlayerData.UnitCategory] + local InitUnitType = PlayerData.UnitType + local InitUnitName = PlayerData.UnitName + + local PlayerScore = 0 + local PlayerPenalty = 0 + + ScoreMessage = "" + + local ScoreMessageHits = "" + + for CategoryID, CategoryName in pairs( _SCORINGCategory ) do + self:T( CategoryName ) + if PlayerData.Hit[CategoryID] then + local Score = 0 + local ScoreHit = 0 + local Penalty = 0 + local PenaltyHit = 0 + self:T( "Hit scores exist for player " .. PlayerName ) + for UnitName, UnitData in pairs( PlayerData.Hit[CategoryID] ) do + Score = Score + UnitData.Score + ScoreHit = ScoreHit + UnitData.ScoreHit + Penalty = Penalty + UnitData.Penalty + PenaltyHit = UnitData.PenaltyHit + end + local ScoreMessageHit = string.format( "\n %s = %d score(%d;-%d) hits(#%d;#-%d)", CategoryName, Score - Penalty, Score, Penalty, ScoreHit, PenaltyHit ) + self:T( ScoreMessageHit ) + ScoreMessageHits = ScoreMessageHits .. ScoreMessageHit + PlayerScore = PlayerScore + Score + PlayerPenalty = PlayerPenalty + Penalty + else + --ScoreMessageHits = ScoreMessageHits .. string.format( "%s:%d ", string.format(CategoryName, 1, 1), 0 ) + end + end + if ScoreMessageHits ~= "" then + ScoreMessage = ScoreMessage .. "\n Hits: " .. ScoreMessageHits .. " " + end + + local ScoreMessageKills = "" + for CategoryID, CategoryName in pairs( _SCORINGCategory ) do + self:T( "Kill scores exist for player " .. PlayerName ) + if PlayerData.Kill[CategoryID] then + local Score = 0 + local ScoreKill = 0 + local Penalty = 0 + local PenaltyKill = 0 + + for UnitName, UnitData in pairs( PlayerData.Kill[CategoryID] ) do + Score = Score + UnitData.Score + ScoreKill = ScoreKill + UnitData.ScoreKill + Penalty = Penalty + UnitData.Penalty + PenaltyKill = PenaltyKill + UnitData.PenaltyKill + end + + local ScoreMessageKill = string.format( "\n %s = %d score(%d;-%d) hits(#%d;#-%d)", CategoryName, Score - Penalty, Score, Penalty, ScoreKill, PenaltyKill ) + self:T( ScoreMessageKill ) + ScoreMessageKills = ScoreMessageKills .. ScoreMessageKill + + PlayerScore = PlayerScore + Score + PlayerPenalty = PlayerPenalty + Penalty + else + --ScoreMessageKills = ScoreMessageKills .. string.format( "%s:%d ", string.format(CategoryName, 1, 1), 0 ) + end + end + if ScoreMessageKills ~= "" then + ScoreMessage = ScoreMessage .. "\n Kills: " .. ScoreMessageKills .. " " + end + + local ScoreMessageCoalitionChangePenalties = "" + if PlayerData.PenaltyCoalition ~= 0 then + ScoreMessageCoalitionChangePenalties = ScoreMessageCoalitionChangePenalties .. string.format( " -%d (%d changed)", PlayerData.Penalty, PlayerData.PenaltyCoalition ) + PlayerPenalty = PlayerPenalty + PlayerData.Penalty + end + if ScoreMessageCoalitionChangePenalties ~= "" then + ScoreMessage = ScoreMessage .. "\n Coalition: " .. ScoreMessageCoalitionChangePenalties .. " " + end + + local ScoreMessageMission = "" + local ScoreMission = 0 + local ScoreTask = 0 + for MissionName, MissionData in pairs( PlayerData.Mission ) do + ScoreMission = ScoreMission + MissionData.ScoreMission + ScoreTask = ScoreTask + MissionData.ScoreTask + ScoreMessageMission = ScoreMessageMission .. "'" .. MissionName .. "'; " + end + PlayerScore = PlayerScore + ScoreMission + ScoreTask + + if ScoreMessageMission ~= "" then + ScoreMessage = ScoreMessage .. "\n Tasks: " .. ScoreTask .. " Mission: " .. ScoreMission .. " ( " .. ScoreMessageMission .. ") " + end + + PlayerMessage = PlayerMessage .. string.format( "Player '%s' Score = %d ( %d Score, -%d Penalties ):%s", PlayerName, PlayerScore - PlayerPenalty, PlayerScore, PlayerPenalty, ScoreMessage ) + end + end + MESSAGE:New( PlayerMessage, "Player Scores", 30, "AllPlayerScores"):ToAll() + +end + + +function SCORING:SecondsToClock(sSeconds) + local nSeconds = sSeconds + if nSeconds == 0 then + --return nil; + return "00:00:00"; + else + nHours = string.format("%02.f", math.floor(nSeconds/3600)); + nMins = string.format("%02.f", math.floor(nSeconds/60 - (nHours*60))); + nSecs = string.format("%02.f", math.floor(nSeconds - nHours*3600 - nMins *60)); + return nHours..":"..nMins..":"..nSecs + end +end + +--- Opens a score CSV file to log the scores. +-- @param #SCORING self +-- @param #string ScoringCSV +-- @return #SCORING self +-- @usage +-- -- Open a new CSV file to log the scores of the game Gori Valley. Let the name of the CSV file begin with "Player Scores". +-- ScoringObject = SCORING:New( "Gori Valley" ) +-- ScoringObject:OpenCSV( "Player Scores" ) +function SCORING:OpenCSV( ScoringCSV ) + self:F( ScoringCSV ) + + if lfs and io and os then + if ScoringCSV then + self.ScoringCSV = ScoringCSV + local fdir = lfs.writedir() .. [[Logs\]] .. self.ScoringCSV .. " " .. os.date( "%Y-%m-%d %H-%M-%S" ) .. ".csv" + + self.CSVFile, self.err = io.open( fdir, "w+" ) + if not self.CSVFile then + error( "Error: Cannot open CSV file in " .. lfs.writedir() ) + end + + self.CSVFile:write( '"GameName","RunTime","Time","PlayerName","ScoreType","PlayerUnitCoaltion","PlayerUnitCategory","PlayerUnitType","PlayerUnitName","TargetUnitCoalition","TargetUnitCategory","TargetUnitType","TargetUnitName","Times","Score"\n' ) + + self.RunTime = os.date("%y-%m-%d_%H-%M-%S") + else + error( "A string containing the CSV file name must be given." ) + end + else + self:E( "The MissionScripting.lua file has not been changed to allow lfs, io and os modules to be used..." ) + end + return self +end + + +--- Registers a score for a player. +-- @param #SCORING self +-- @param #string PlayerName The name of the player. +-- @param #string ScoreType The type of the score. +-- @param #string ScoreTimes The amount of scores achieved. +-- @param #string ScoreAmount The score given. +-- @param #string PlayerUnitName The unit name of the player. +-- @param #string PlayerUnitCoalition The coalition of the player unit. +-- @param #string PlayerUnitCategory The category of the player unit. +-- @param #string PlayerUnitType The type of the player unit. +-- @param #string TargetUnitName The name of the target unit. +-- @param #string TargetUnitCoalition The coalition of the target unit. +-- @param #string TargetUnitCategory The category of the target unit. +-- @param #string TargetUnitType The type of the target unit. +-- @return #SCORING self +function SCORING:ScoreCSV( PlayerName, ScoreType, ScoreTimes, ScoreAmount, PlayerUnitName, PlayerUnitCoalition, PlayerUnitCategory, PlayerUnitType, TargetUnitName, TargetUnitCoalition, TargetUnitCategory, TargetUnitType ) + --write statistic information to file + local ScoreTime = self:SecondsToClock( timer.getTime() ) + PlayerName = PlayerName:gsub( '"', '_' ) + + if PlayerUnitName and PlayerUnitName ~= '' then + local PlayerUnit = Unit.getByName( PlayerUnitName ) + + if PlayerUnit then + if not PlayerUnitCategory then + --PlayerUnitCategory = SCORINGCategory[PlayerUnit:getCategory()] + PlayerUnitCategory = _SCORINGCategory[PlayerUnit:getDesc().category] + end + + if not PlayerUnitCoalition then + PlayerUnitCoalition = _SCORINGCoalition[PlayerUnit:getCoalition()] + end + + if not PlayerUnitType then + PlayerUnitType = PlayerUnit:getTypeName() + end + else + PlayerUnitName = '' + PlayerUnitCategory = '' + PlayerUnitCoalition = '' + PlayerUnitType = '' + end + else + PlayerUnitName = '' + PlayerUnitCategory = '' + PlayerUnitCoalition = '' + PlayerUnitType = '' + end + + if not TargetUnitCoalition then + TargetUnitCoalition = '' + end + + if not TargetUnitCategory then + TargetUnitCategory = '' + end + + if not TargetUnitType then + TargetUnitType = '' + end + + if not TargetUnitName then + TargetUnitName = '' + end + + if lfs and io and os then + self.CSVFile:write( + '"' .. self.GameName .. '"' .. ',' .. + '"' .. self.RunTime .. '"' .. ',' .. + '' .. ScoreTime .. '' .. ',' .. + '"' .. PlayerName .. '"' .. ',' .. + '"' .. ScoreType .. '"' .. ',' .. + '"' .. PlayerUnitCoalition .. '"' .. ',' .. + '"' .. PlayerUnitCategory .. '"' .. ',' .. + '"' .. PlayerUnitType .. '"' .. ',' .. + '"' .. PlayerUnitName .. '"' .. ',' .. + '"' .. TargetUnitCoalition .. '"' .. ',' .. + '"' .. TargetUnitCategory .. '"' .. ',' .. + '"' .. TargetUnitType .. '"' .. ',' .. + '"' .. TargetUnitName .. '"' .. ',' .. + '' .. ScoreTimes .. '' .. ',' .. + '' .. ScoreAmount + ) + + self.CSVFile:write( "\n" ) + end +end + + +function SCORING:CloseCSV() + if lfs and io and os then + self.CSVFile:close() + end +end + +--- CARGO Classes +-- @module CARGO + +Include.File( "Routines" ) +Include.File( "Base" ) +Include.File( "Message" ) +Include.File( "Scheduler" ) + + +--- Clients are those Groups defined within the Mission Editor that have the skillset defined as "Client" or "Player". +-- These clients are defined within the Mission Orchestration Framework (MOF) + +CARGOS = {} + + +CARGO_ZONE = { + ClassName="CARGO_ZONE", + CargoZoneName = '', + CargoHostUnitName = '', + SIGNAL = { + TYPE = { + SMOKE = { ID = 1, TEXT = "smoke" }, + FLARE = { ID = 2, TEXT = "flare" } + }, + COLOR = { + GREEN = { ID = 1, TRIGGERCOLOR = trigger.smokeColor.Green, TEXT = "A green" }, + RED = { ID = 2, TRIGGERCOLOR = trigger.smokeColor.Red, TEXT = "A red" }, + WHITE = { ID = 3, TRIGGERCOLOR = trigger.smokeColor.White, TEXT = "A white" }, + ORANGE = { ID = 4, TRIGGERCOLOR = trigger.smokeColor.Orange, TEXT = "An orange" }, + BLUE = { ID = 5, TRIGGERCOLOR = trigger.smokeColor.Blue, TEXT = "A blue" }, + YELLOW = { ID = 6, TRIGGERCOLOR = trigger.flareColor.Yellow, TEXT = "A yellow" } + } + } +} + +--- Creates a new zone where cargo can be collected or deployed. +-- The zone functionality is useful to smoke or indicate routes for cargo pickups or deployments. +-- Provide the zone name as declared in the mission file into the CargoZoneName in the :New method. +-- An optional parameter is the CargoHostName, which is a Group declared with Late Activation switched on in the mission file. +-- The CargoHostName is the "host" of the cargo zone: +-- +-- * It will smoke the zone position when a client is approaching the zone. +-- * Depending on the cargo type, it will assist in the delivery of the cargo by driving to and from the client. +-- +-- @param #CARGO_ZONE self +-- @param #string CargoZoneName The name of the zone as declared within the mission editor. +-- @param #string CargoHostName The name of the Group "hosting" the zone. The Group MUST NOT be a static, and must be a "mobile" unit. +function CARGO_ZONE:New( CargoZoneName, CargoHostName ) local self = BASE:Inherit( self, ZONE:New( CargoZoneName ) ) + self:F( { CargoZoneName, CargoHostName } ) + + self.CargoZoneName = CargoZoneName + self.SignalHeight = 2 + --self.CargoZone = trigger.misc.getZone( CargoZoneName ) + + + if CargoHostName then + self.CargoHostName = CargoHostName + end + + self:T( self.CargoZoneName ) + + return self +end + +function CARGO_ZONE:Spawn() + self:F( self.CargoHostName ) + + if self.CargoHostName then -- Only spawn a host in the zone when there is one given as a parameter in the New function. + if self.CargoHostSpawn then + local CargoHostGroup = self.CargoHostSpawn:GetGroupFromIndex() + if CargoHostGroup and CargoHostGroup:IsAlive() then + else + self.CargoHostSpawn:ReSpawn( 1 ) + end + else + self:T( "Initialize CargoHostSpawn" ) + self.CargoHostSpawn = SPAWN:New( self.CargoHostName ):Limit( 1, 1 ) + self.CargoHostSpawn:ReSpawn( 1 ) + end + end + + return self +end + +function CARGO_ZONE:GetHostUnit() + self:F( self ) + + if self.CargoHostName then + + -- A Host has been given, signal the host + local CargoHostGroup = self.CargoHostSpawn:GetGroupFromIndex() + local CargoHostUnit + if CargoHostGroup and CargoHostGroup:IsAlive() then + CargoHostUnit = CargoHostGroup:GetUnit(1) + else + CargoHostUnit = StaticObject.getByName( self.CargoHostName ) + end + + return CargoHostUnit + end + + return nil +end + +function CARGO_ZONE:ReportCargosToClient( Client, CargoType ) + self:F() + + local SignalUnit = self:GetHostUnit() + + if SignalUnit then + + local SignalUnitTypeName = SignalUnit:getTypeName() + + local HostMessage = "" + + local IsCargo = false + for CargoID, Cargo in pairs( CARGOS ) do + if Cargo.CargoType == Task.CargoType then + if Cargo:IsStatusNone() then + HostMessage = HostMessage .. " - " .. Cargo.CargoName .. " - " .. Cargo.CargoType .. " (" .. Cargo.Weight .. "kg)" .. "\n" + IsCargo = true + end + end + end + + if not IsCargo then + HostMessage = "No Cargo Available." + end + + Client:Message( HostMessage, 20, Mission.Name .. "/StageHosts." .. SignalUnitTypeName, SignalUnitTypeName .. ": Reporting Cargo", 10 ) + end +end + + +function CARGO_ZONE:Signal() + self:F() + + local Signalled = false + + if self.SignalType then + + if self.CargoHostName then + + -- A Host has been given, signal the host + + local SignalUnit = self:GetHostUnit() + + if SignalUnit then + + self:T( 'Signalling Unit' ) + local SignalVehiclePos = SignalUnit:GetPointVec3() + SignalVehiclePos.y = SignalVehiclePos.y + 2 + + if self.SignalType.ID == CARGO_ZONE.SIGNAL.TYPE.SMOKE.ID then + + trigger.action.smoke( SignalVehiclePos, self.SignalColor.TRIGGERCOLOR ) + Signalled = true + + elseif self.SignalType.ID == CARGO_ZONE.SIGNAL.TYPE.FLARE.ID then + + trigger.action.signalFlare( SignalVehiclePos, self.SignalColor.TRIGGERCOLOR , 0 ) + Signalled = false + + end + end + + else + + local ZonePointVec3 = self:GetPointVec3( self.SignalHeight ) -- Get the zone position + the landheight + 2 meters + + if self.SignalType.ID == CARGO_ZONE.SIGNAL.TYPE.SMOKE.ID then + + trigger.action.smoke( ZonePointVec3, self.SignalColor.TRIGGERCOLOR ) + Signalled = true + + elseif self.SignalType.ID == CARGO_ZONE.SIGNAL.TYPE.FLARE.ID then + trigger.action.signalFlare( ZonePointVec3, self.SignalColor.TRIGGERCOLOR, 0 ) + Signalled = false + + end + end + end + + return Signalled + +end + +function CARGO_ZONE:WhiteSmoke( SignalHeight ) + self:F() + + self.SignalType = CARGO_ZONE.SIGNAL.TYPE.SMOKE + self.SignalColor = CARGO_ZONE.SIGNAL.COLOR.WHITE + + if SignalHeight then + self.SignalHeight = SignalHeight + end + + return self +end + +function CARGO_ZONE:BlueSmoke( SignalHeight ) + self:F() + + self.SignalType = CARGO_ZONE.SIGNAL.TYPE.SMOKE + self.SignalColor = CARGO_ZONE.SIGNAL.COLOR.BLUE + + if SignalHeight then + self.SignalHeight = SignalHeight + end + + return self +end + +function CARGO_ZONE:RedSmoke( SignalHeight ) + self:F() + + self.SignalType = CARGO_ZONE.SIGNAL.TYPE.SMOKE + self.SignalColor = CARGO_ZONE.SIGNAL.COLOR.RED + + if SignalHeight then + self.SignalHeight = SignalHeight + end + + return self +end + +function CARGO_ZONE:OrangeSmoke( SignalHeight ) + self:F() + + self.SignalType = CARGO_ZONE.SIGNAL.TYPE.SMOKE + self.SignalColor = CARGO_ZONE.SIGNAL.COLOR.ORANGE + + if SignalHeight then + self.SignalHeight = SignalHeight + end + + return self +end + +function CARGO_ZONE:GreenSmoke( SignalHeight ) + self:F() + + self.SignalType = CARGO_ZONE.SIGNAL.TYPE.SMOKE + self.SignalColor = CARGO_ZONE.SIGNAL.COLOR.GREEN + + if SignalHeight then + self.SignalHeight = SignalHeight + end + + return self +end + + +function CARGO_ZONE:WhiteFlare( SignalHeight ) + self:F() + + self.SignalType = CARGO_ZONE.SIGNAL.TYPE.FLARE + self.SignalColor = CARGO_ZONE.SIGNAL.COLOR.WHITE + + if SignalHeight then + self.SignalHeight = SignalHeight + end + + return self +end + +function CARGO_ZONE:RedFlare( SignalHeight ) + self:F() + + self.SignalType = CARGO_ZONE.SIGNAL.TYPE.FLARE + self.SignalColor = CARGO_ZONE.SIGNAL.COLOR.RED + + if SignalHeight then + self.SignalHeight = SignalHeight + end + + return self +end + +function CARGO_ZONE:GreenFlare( SignalHeight ) + self:F() + + self.SignalType = CARGO_ZONE.SIGNAL.TYPE.FLARE + self.SignalColor = CARGO_ZONE.SIGNAL.COLOR.GREEN + + if SignalHeight then + self.SignalHeight = SignalHeight + end + + return self +end + +function CARGO_ZONE:YellowFlare( SignalHeight ) + self:F() + + self.SignalType = CARGO_ZONE.SIGNAL.TYPE.FLARE + self.SignalColor = CARGO_ZONE.SIGNAL.COLOR.YELLOW + + if SignalHeight then + self.SignalHeight = SignalHeight + end + + return self +end + + +function CARGO_ZONE:GetCargoHostUnit() + self:F( self ) + + if self.CargoHostSpawn then + local CargoHostGroup = self.CargoHostSpawn:GetGroupFromIndex(1) + if CargoHostGroup and CargoHostGroup:IsAlive() then + local CargoHostUnit = CargoHostGroup:GetUnit(1) + if CargoHostUnit and CargoHostUnit:IsAlive() then + return CargoHostUnit + end + end + end + + return nil +end + +function CARGO_ZONE:GetCargoZoneName() + self:F() + + return self.CargoZoneName +end + +CARGO = { + ClassName = "CARGO", + STATUS = { + NONE = 0, + LOADED = 1, + UNLOADED = 2, + LOADING = 3 + }, + CargoClient = nil +} + +--- Add Cargo to the mission... Cargo functionality needs to be reworked a bit, so this is still under construction. I need to make a CARGO Class... +function CARGO:New( CargoType, CargoName, CargoWeight ) local self = BASE:Inherit( self, BASE:New() ) + self:F( { CargoType, CargoName, CargoWeight } ) + + + self.CargoType = CargoType + self.CargoName = CargoName + self.CargoWeight = CargoWeight + + self:StatusNone() + + return self +end + +function CARGO:Spawn( Client ) + self:F() + + return self + +end + +function CARGO:IsNear( Client, LandingZone ) + self:F() + + local Near = true + + return Near + +end + + +function CARGO:IsLoadingToClient() + self:F() + + if self:IsStatusLoading() then + return self.CargoClient + end + + return nil + +end + + +function CARGO:IsLoadedInClient() + self:F() + + if self:IsStatusLoaded() then + return self.CargoClient + end + + return nil + +end + + +function CARGO:UnLoad( Client, TargetZoneName ) + self:F() + + self:StatusUnLoaded() + + return self +end + +function CARGO:OnBoard( Client, LandingZone ) + self:F() + + local Valid = true + + self.CargoClient = Client + local ClientUnit = Client:GetClientGroupDCSUnit() + + return Valid +end + +function CARGO:OnBoarded( Client, LandingZone ) + self:F() + + local OnBoarded = true + + return OnBoarded +end + +function CARGO:Load( Client ) + self:F() + + self:StatusLoaded( Client ) + + return self +end + +function CARGO:IsLandingRequired() + self:F() + return true +end + +function CARGO:IsSlingLoad() + self:F() + return false +end + + +function CARGO:StatusNone() + self:F() + + self.CargoClient = nil + self.CargoStatus = CARGO.STATUS.NONE + + return self +end + +function CARGO:StatusLoading( Client ) + self:F() + + self.CargoClient = Client + self.CargoStatus = CARGO.STATUS.LOADING + self:T( "Cargo " .. self.CargoName .. " loading to Client: " .. self.CargoClient:GetClientGroupName() ) + + return self +end + +function CARGO:StatusLoaded( Client ) + self:F() + + self.CargoClient = Client + self.CargoStatus = CARGO.STATUS.LOADED + self:T( "Cargo " .. self.CargoName .. " loaded in Client: " .. self.CargoClient:GetClientGroupName() ) + + return self +end + +function CARGO:StatusUnLoaded() + self:F() + + self.CargoClient = nil + self.CargoStatus = CARGO.STATUS.UNLOADED + + return self +end + + +function CARGO:IsStatusNone() + self:F() + + return self.CargoStatus == CARGO.STATUS.NONE +end + +function CARGO:IsStatusLoading() + self:F() + + return self.CargoStatus == CARGO.STATUS.LOADING +end + +function CARGO:IsStatusLoaded() + self:F() + + return self.CargoStatus == CARGO.STATUS.LOADED +end + +function CARGO:IsStatusUnLoaded() + self:F() + + return self.CargoStatus == CARGO.STATUS.UNLOADED +end + + +CARGO_GROUP = { + ClassName = "CARGO_GROUP" +} + + +function CARGO_GROUP:New( CargoType, CargoName, CargoWeight, CargoGroupTemplate, CargoZone ) local self = BASE:Inherit( self, CARGO:New( CargoType, CargoName, CargoWeight ) ) + self:F( { CargoType, CargoName, CargoWeight, CargoGroupTemplate, CargoZone } ) + + self.CargoSpawn = SPAWN:NewWithAlias( CargoGroupTemplate, CargoName ) + self.CargoZone = CargoZone + + CARGOS[self.CargoName] = self + + return self + +end + +function CARGO_GROUP:Spawn( Client ) + self:F( { Client } ) + + local SpawnCargo = true + + if self:IsStatusNone() then + local CargoGroup = Group.getByName( self.CargoName ) + if CargoGroup and CargoGroup:isExist() then + SpawnCargo = false + end + + elseif self:IsStatusLoading() then + + local Client = self:IsLoadingToClient() + if Client and Client:GetDCSGroup() then + SpawnCargo = false + else + local CargoGroup = Group.getByName( self.CargoName ) + if CargoGroup and CargoGroup:isExist() then + SpawnCargo = false + end + end + + elseif self:IsStatusLoaded() then + + local ClientLoaded = self:IsLoadedInClient() + -- Now test if another Client is alive (not this one), and it has the CARGO, then this cargo does not need to be initialized and spawned. + if ClientLoaded and ClientLoaded ~= Client then + local ClientGroup = Client:GetDCSGroup() + if ClientLoaded:GetClientGroupDCSUnit() and ClientLoaded:GetClientGroupDCSUnit():isExist() then + SpawnCargo = false + else + self:StatusNone() + end + else + -- Same Client, but now in initialize, so set back the status to None. + self:StatusNone() + end + + elseif self:IsStatusUnLoaded() then + + SpawnCargo = false + + end + + if SpawnCargo then + if self.CargoZone:GetCargoHostUnit() then + --- ReSpawn the Cargo from the CargoHost + self.CargoGroupName = self.CargoSpawn:SpawnFromUnit( self.CargoZone:GetCargoHostUnit(), 60, 30, 1 ):GetName() + else + --- ReSpawn the Cargo in the CargoZone without a host ... + self:T( self.CargoZone ) + self.CargoGroupName = self.CargoSpawn:SpawnInZone( self.CargoZone, true, 1 ):GetName() + end + self:StatusNone() + end + + self:T( { self.CargoGroupName, CARGOS[self.CargoName].CargoGroupName } ) + + return self +end + +function CARGO_GROUP:IsNear( Client, LandingZone ) + self:F() + + local Near = false + + if self.CargoGroupName then + local CargoGroup = Group.getByName( self.CargoGroupName ) + if routines.IsPartOfGroupInRadius( CargoGroup, Client:GetPositionVec3(), 250 ) then + Near = true + end + end + + return Near + +end + + +function CARGO_GROUP:OnBoard( Client, LandingZone, OnBoardSide ) + self:F() + + local Valid = true + + local ClientUnit = Client:GetClientGroupDCSUnit() + + local CarrierPos = ClientUnit:getPoint() + local CarrierPosMove = ClientUnit:getPoint() + local CarrierPosOnBoard = ClientUnit:getPoint() + + local CargoGroup = Group.getByName( self.CargoGroupName ) + + local CargoUnit = CargoGroup:getUnit(1) + local CargoPos = CargoUnit:getPoint() + + self.CargoInAir = CargoUnit:inAir() + + self:T( self.CargoInAir ) + + -- Only move the group to the carrier when the cargo is not in the air + -- (eg. cargo can be on a oil derrick, moving the cargo on the oil derrick will drop the cargo on the sea). + if not self.CargoInAir then + + local Points = {} + + self:T( 'CargoPos x = ' .. CargoPos.x .. " z = " .. CargoPos.z ) + self:T( 'CarrierPosMove x = ' .. CarrierPosMove.x .. " z = " .. CarrierPosMove.z ) + + Points[#Points+1] = routines.ground.buildWP( CargoPos, "Cone", 10 ) + + self:T( 'Points[1] x = ' .. Points[1].x .. " y = " .. Points[1].y ) + + if OnBoardSide == nil then + OnBoardSide = CLIENT.ONBOARDSIDE.NONE + end + + if OnBoardSide == CLIENT.ONBOARDSIDE.LEFT then + + self:T( "TransportCargoOnBoard: Onboarding LEFT" ) + CarrierPosMove.z = CarrierPosMove.z - 25 + CarrierPosOnBoard.z = CarrierPosOnBoard.z - 5 + Points[#Points+1] = routines.ground.buildWP( CarrierPosMove, "Cone", 10 ) + Points[#Points+1] = routines.ground.buildWP( CarrierPosOnBoard, "Cone", 10 ) + + elseif OnBoardSide == CLIENT.ONBOARDSIDE.RIGHT then + + self:T( "TransportCargoOnBoard: Onboarding RIGHT" ) + CarrierPosMove.z = CarrierPosMove.z + 25 + CarrierPosOnBoard.z = CarrierPosOnBoard.z + 5 + Points[#Points+1] = routines.ground.buildWP( CarrierPosMove, "Cone", 10 ) + Points[#Points+1] = routines.ground.buildWP( CarrierPosOnBoard, "Cone", 10 ) + + elseif OnBoardSide == CLIENT.ONBOARDSIDE.BACK then + + self:T( "TransportCargoOnBoard: Onboarding BACK" ) + CarrierPosMove.x = CarrierPosMove.x - 25 + CarrierPosOnBoard.x = CarrierPosOnBoard.x - 5 + Points[#Points+1] = routines.ground.buildWP( CarrierPosMove, "Cone", 10 ) + Points[#Points+1] = routines.ground.buildWP( CarrierPosOnBoard, "Cone", 10 ) + + elseif OnBoardSide == CLIENT.ONBOARDSIDE.FRONT then + + self:T( "TransportCargoOnBoard: Onboarding FRONT" ) + CarrierPosMove.x = CarrierPosMove.x + 25 + CarrierPosOnBoard.x = CarrierPosOnBoard.x + 5 + Points[#Points+1] = routines.ground.buildWP( CarrierPosMove, "Cone", 10 ) + Points[#Points+1] = routines.ground.buildWP( CarrierPosOnBoard, "Cone", 10 ) + + elseif OnBoardSide == CLIENT.ONBOARDSIDE.NONE then + + self:T( "TransportCargoOnBoard: Onboarding CENTRAL" ) + Points[#Points+1] = routines.ground.buildWP( CarrierPos, "Cone", 10 ) + + end + self:T( "TransportCargoOnBoard: Routing " .. self.CargoGroupName ) + + --routines.scheduleFunction( routines.goRoute, { self.CargoGroupName, Points}, timer.getTime() + 4 ) + SCHEDULER:New( self, routines.goRoute, { self.CargoGroupName, Points}, 4 ) + end + + self:StatusLoading( Client ) + + return Valid + +end + + +function CARGO_GROUP:OnBoarded( Client, LandingZone ) + self:F() + + local OnBoarded = false + + local CargoGroup = Group.getByName( self.CargoGroupName ) + + if not self.CargoInAir then + if routines.IsPartOfGroupInRadius( CargoGroup, Client:GetPositionVec3(), 25 ) then + CargoGroup:destroy() + self:StatusLoaded( Client ) + OnBoarded = true + end + else + CargoGroup:destroy() + self:StatusLoaded( Client ) + OnBoarded = true + end + + return OnBoarded +end + + +function CARGO_GROUP:UnLoad( Client, TargetZoneName ) + self:F() + + self:T( 'self.CargoName = ' .. self.CargoName ) + + local CargoGroup = self.CargoSpawn:SpawnFromUnit( Client:GetClientGroupUnit(), 60, 30 ) + + self.CargoGroupName = CargoGroup:GetName() + self:T( 'self.CargoGroupName = ' .. self.CargoGroupName ) + + CargoGroup:TaskRouteToZone( ZONE:New( TargetZoneName ), true ) + + self:StatusUnLoaded() + + return self +end + + +CARGO_PACKAGE = { + ClassName = "CARGO_PACKAGE" +} + + +function CARGO_PACKAGE:New( CargoType, CargoName, CargoWeight, CargoClient ) local self = BASE:Inherit( self, CARGO:New( CargoType, CargoName, CargoWeight ) ) + self:F( { CargoType, CargoName, CargoWeight, CargoClient } ) + + self.CargoClient = CargoClient + + CARGOS[self.CargoName] = self + + return self + +end + + +function CARGO_PACKAGE:Spawn( Client ) + self:F( { self, Client } ) + + -- this needs to be checked thoroughly + + local CargoClientGroup = self.CargoClient:GetDCSGroup() + if not CargoClientGroup then + if not self.CargoClientSpawn then + self.CargoClientSpawn = SPAWN:New( self.CargoClient:GetClientGroupName() ):Limit( 1, 1 ) + end + self.CargoClientSpawn:ReSpawn( 1 ) + end + + local SpawnCargo = true + + if self:IsStatusNone() then + + elseif self:IsStatusLoading() or self:IsStatusLoaded() then + + local CargoClientLoaded = self:IsLoadedInClient() + if CargoClientLoaded and CargoClientLoaded:GetDCSGroup() then + SpawnCargo = false + end + + elseif self:IsStatusUnLoaded() then + + SpawnCargo = false + + else + + end + + if SpawnCargo then + self:StatusLoaded( self.CargoClient ) + end + + return self +end + + +function CARGO_PACKAGE:IsNear( Client, LandingZone ) + self:F() + + local Near = false + + if self.CargoClient and self.CargoClient:GetDCSGroup() then + self:T( self.CargoClient.ClientName ) + self:T( 'Client Exists.' ) + + if routines.IsUnitInRadius( self.CargoClient:GetClientGroupDCSUnit(), Client:GetPositionVec3(), 150 ) then + Near = true + end + end + + return Near + +end + + +function CARGO_PACKAGE:OnBoard( Client, LandingZone, OnBoardSide ) + self:F() + + local Valid = true + + local ClientUnit = Client:GetClientGroupDCSUnit() + + local CarrierPos = ClientUnit:getPoint() + local CarrierPosMove = ClientUnit:getPoint() + local CarrierPosOnBoard = ClientUnit:getPoint() + local CarrierPosMoveAway = ClientUnit:getPoint() + + local CargoHostGroup = self.CargoClient:GetDCSGroup() + local CargoHostName = self.CargoClient:GetDCSGroup():getName() + + local CargoHostUnits = CargoHostGroup:getUnits() + local CargoPos = CargoHostUnits[1]:getPoint() + + local Points = {} + + self:T( 'CargoPos x = ' .. CargoPos.x .. " z = " .. CargoPos.z ) + self:T( 'CarrierPosMove x = ' .. CarrierPosMove.x .. " z = " .. CarrierPosMove.z ) + + Points[#Points+1] = routines.ground.buildWP( CargoPos, "Cone", 10 ) + + self:T( 'Points[1] x = ' .. Points[1].x .. " y = " .. Points[1].y ) + + if OnBoardSide == nil then + OnBoardSide = CLIENT.ONBOARDSIDE.NONE + end + + if OnBoardSide == CLIENT.ONBOARDSIDE.LEFT then + + self:T( "TransportCargoOnBoard: Onboarding LEFT" ) + CarrierPosMove.z = CarrierPosMove.z - 25 + CarrierPosOnBoard.z = CarrierPosOnBoard.z - 5 + CarrierPosMoveAway.z = CarrierPosMoveAway.z - 20 + Points[#Points+1] = routines.ground.buildWP( CarrierPosMove, "Cone", 10 ) + Points[#Points+1] = routines.ground.buildWP( CarrierPosOnBoard, "Cone", 10 ) + Points[#Points+1] = routines.ground.buildWP( CarrierPosMoveAway, "Cone", 10 ) + + elseif OnBoardSide == CLIENT.ONBOARDSIDE.RIGHT then + + self:T( "TransportCargoOnBoard: Onboarding RIGHT" ) + CarrierPosMove.z = CarrierPosMove.z + 25 + CarrierPosOnBoard.z = CarrierPosOnBoard.z + 5 + CarrierPosMoveAway.z = CarrierPosMoveAway.z + 20 + Points[#Points+1] = routines.ground.buildWP( CarrierPosMove, "Cone", 10 ) + Points[#Points+1] = routines.ground.buildWP( CarrierPosOnBoard, "Cone", 10 ) + Points[#Points+1] = routines.ground.buildWP( CarrierPosMoveAway, "Cone", 10 ) + + elseif OnBoardSide == CLIENT.ONBOARDSIDE.BACK then + + self:T( "TransportCargoOnBoard: Onboarding BACK" ) + CarrierPosMove.x = CarrierPosMove.x - 25 + CarrierPosOnBoard.x = CarrierPosOnBoard.x - 5 + CarrierPosMoveAway.x = CarrierPosMoveAway.x - 20 + Points[#Points+1] = routines.ground.buildWP( CarrierPosMove, "Cone", 10 ) + Points[#Points+1] = routines.ground.buildWP( CarrierPosOnBoard, "Cone", 10 ) + Points[#Points+1] = routines.ground.buildWP( CarrierPosMoveAway, "Cone", 10 ) + + elseif OnBoardSide == CLIENT.ONBOARDSIDE.FRONT then + + self:T( "TransportCargoOnBoard: Onboarding FRONT" ) + CarrierPosMove.x = CarrierPosMove.x + 25 + CarrierPosOnBoard.x = CarrierPosOnBoard.x + 5 + CarrierPosMoveAway.x = CarrierPosMoveAway.x + 20 + Points[#Points+1] = routines.ground.buildWP( CarrierPosMove, "Cone", 10 ) + Points[#Points+1] = routines.ground.buildWP( CarrierPosOnBoard, "Cone", 10 ) + Points[#Points+1] = routines.ground.buildWP( CarrierPosMoveAway, "Cone", 10 ) + + elseif OnBoardSide == CLIENT.ONBOARDSIDE.NONE then + + self:T( "TransportCargoOnBoard: Onboarding FRONT" ) + CarrierPosMove.x = CarrierPosMove.x + 25 + CarrierPosOnBoard.x = CarrierPosOnBoard.x + 5 + CarrierPosMoveAway.x = CarrierPosMoveAway.x + 20 + Points[#Points+1] = routines.ground.buildWP( CarrierPosMove, "Cone", 10 ) + Points[#Points+1] = routines.ground.buildWP( CarrierPosOnBoard, "Cone", 10 ) + Points[#Points+1] = routines.ground.buildWP( CarrierPosMoveAway, "Cone", 10 ) + + end + self:T( "Routing " .. CargoHostName ) + + --routines.scheduleFunction( routines.goRoute, { CargoHostName, Points}, timer.getTime() + 4 ) + SCHEDULER:New( self, routines.goRoute, { CargoHostName, Points }, 4 ) + + return Valid + +end + + +function CARGO_PACKAGE:OnBoarded( Client, LandingZone ) + self:F() + + local OnBoarded = false + + if self.CargoClient and self.CargoClient:GetDCSGroup() then + if routines.IsUnitInRadius( self.CargoClient:GetClientGroupDCSUnit(), self.CargoClient:GetPositionVec3(), 10 ) then + + -- Switch Cargo from self.CargoClient to Client ... Each cargo can have only one client. So assigning the new client for the cargo is enough. + self:StatusLoaded( Client ) + + -- All done, onboarded the Cargo to the new Client. + OnBoarded = true + end + end + + return OnBoarded +end + + +function CARGO_PACKAGE:UnLoad( Client, TargetZoneName ) + self:F() + + self:T( 'self.CargoName = ' .. self.CargoName ) + --self:T( 'self.CargoHostName = ' .. self.CargoHostName ) + + --self.CargoSpawn:FromCarrier( Client:GetDCSGroup(), TargetZoneName, self.CargoHostName ) + self:StatusUnLoaded() + + return Cargo +end + + +CARGO_SLINGLOAD = { + ClassName = "CARGO_SLINGLOAD" +} + + +function CARGO_SLINGLOAD:New( CargoType, CargoName, CargoWeight, CargoZone, CargoHostName, CargoCountryID ) + local self = BASE:Inherit( self, CARGO:New( CargoType, CargoName, CargoWeight ) ) + self:F( { CargoType, CargoName, CargoWeight, CargoZone, CargoHostName, CargoCountryID } ) + + self.CargoHostName = CargoHostName + + -- Cargo will be initialized around the CargoZone position. + self.CargoZone = CargoZone + + self.CargoCount = 0 + self.CargoStaticName = string.format( "%s#%03d", self.CargoName, self.CargoCount ) + + -- The country ID needs to be correctly set. + self.CargoCountryID = CargoCountryID + + CARGOS[self.CargoName] = self + + return self + +end + + +function CARGO_SLINGLOAD:IsLandingRequired() + self:F() + return false +end + + +function CARGO_SLINGLOAD:IsSlingLoad() + self:F() + return true +end + + +function CARGO_SLINGLOAD:Spawn( Client ) + self:F( { self, Client } ) + + local Zone = trigger.misc.getZone( self.CargoZone ) + + local ZonePos = {} + ZonePos.x = Zone.point.x + math.random( Zone.radius / 2 * -1, Zone.radius / 2 ) + ZonePos.y = Zone.point.z + math.random( Zone.radius / 2 * -1, Zone.radius / 2 ) + + self:T( "Cargo Location = " .. ZonePos.x .. ", " .. ZonePos.y ) + + --[[ + -- This does not work in 1.5.2. + CargoStatic = StaticObject.getByName( self.CargoName ) + if CargoStatic then + CargoStatic:destroy() + end + --]] + + CargoStatic = StaticObject.getByName( self.CargoStaticName ) + + if CargoStatic and CargoStatic:isExist() then + CargoStatic:destroy() + end + + -- I need to make every time a new cargo due to bugs in 1.5.2. + + self.CargoCount = self.CargoCount + 1 + self.CargoStaticName = string.format( "%s#%03d", self.CargoName, self.CargoCount ) + + local CargoTemplate = { + ["category"] = "Cargo", + ["shape_name"] = "ab-212_cargo", + ["type"] = "Cargo1", + ["x"] = ZonePos.x, + ["y"] = ZonePos.y, + ["mass"] = self.CargoWeight, + ["name"] = self.CargoStaticName, + ["canCargo"] = true, + ["heading"] = 0, + } + + coalition.addStaticObject( self.CargoCountryID, CargoTemplate ) + +-- end + + return self +end + + +function CARGO_SLINGLOAD:IsNear( Client, LandingZone ) + self:F() + + local Near = false + + return Near +end + + +function CARGO_SLINGLOAD:IsInLandingZone( Client, LandingZone ) + self:F() + + local Near = false + + local CargoStaticUnit = StaticObject.getByName( self.CargoName ) + if CargoStaticUnit then + if routines.IsStaticInZones( CargoStaticUnit, LandingZone ) then + Near = true + end + end + + return Near +end + + +function CARGO_SLINGLOAD:OnBoard( Client, LandingZone, OnBoardSide ) + self:F() + + local Valid = true + + + return Valid +end + + +function CARGO_SLINGLOAD:OnBoarded( Client, LandingZone ) + self:F() + + local OnBoarded = false + + local CargoStaticUnit = StaticObject.getByName( self.CargoName ) + if CargoStaticUnit then + if not routines.IsStaticInZones( CargoStaticUnit, LandingZone ) then + OnBoarded = true + end + end + + return OnBoarded +end + + +function CARGO_SLINGLOAD:UnLoad( Client, TargetZoneName ) + self:F() + + self:T( 'self.CargoName = ' .. self.CargoName ) + self:T( 'self.CargoGroupName = ' .. self.CargoGroupName ) + + self:StatusUnLoaded() + + return Cargo +end +--- Message System to display Messages for Clients and Coalitions or All. +-- Messages are grouped on the display panel per Category to improve readability for the players. +-- Messages are shown on the display panel for an amount of seconds, and will then disappear. +-- Messages are identified by an ID. The messages with the same ID belonging to the same category will be overwritten if they were still being displayed on the display panel. +-- Messages are created with MESSAGE:@{New}(). +-- Messages are sent to Clients with MESSAGE:@{ToClient}(). +-- Messages are sent to Coalitions with MESSAGE:@{ToCoalition}(). +-- Messages are sent to All Players with MESSAGE:@{ToAll}(). +-- @module Message + +Include.File( "Base" ) + +--- The MESSAGE class +-- @type MESSAGE +MESSAGE = { + ClassName = "MESSAGE", + MessageCategory = 0, + MessageID = 0, +} + + +--- Creates a new MESSAGE object. Note that these MESSAGE objects are not yet displayed on the display panel. You must use the functions @{ToClient} or @{ToCoalition} or @{ToAll} to send these Messages to the respective recipients. +-- @param self +-- @param #string MessageText is the text of the Message. +-- @param #string MessageCategory is a string expressing the Category of the Message. Messages are grouped on the display panel per Category to improve readability. +-- @param #number MessageDuration is a number in seconds of how long the MESSAGE should be shown on the display panel. +-- @param #string MessageID is a string expressing the ID of the Message. +-- @return #MESSAGE +-- @usage +-- -- Create a series of new Messages. +-- -- MessageAll is meant to be sent to all players, for 25 seconds, and is classified as "Score". +-- -- MessageRED is meant to be sent to the RED players only, for 10 seconds, and is classified as "End of Mission", with ID "Win". +-- -- MessageClient1 is meant to be sent to a Client, for 25 seconds, and is classified as "Score", with ID "Score". +-- -- MessageClient1 is meant to be sent to a Client, for 25 seconds, and is classified as "Score", with ID "Score". +-- MessageAll = MESSAGE:New( "To all Players: BLUE has won! Each player of BLUE wins 50 points!", "End of Mission", 25, "Win" ) +-- MessageRED = MESSAGE:New( "To the RED Players: You receive a penalty because you've killed one of your own units", "Penalty", 25, "Score" ) +-- MessageClient1 = MESSAGE:New( "Congratulations, you've just hit a target", "Score", 25, "Score" ) +-- MessageClient2 = MESSAGE:New( "Congratulations, you've just killed a target", "Score", 25, "Score" ) +function MESSAGE:New( MessageText, MessageCategory, MessageDuration, MessageID ) + local self = BASE:Inherit( self, BASE:New() ) + self:F( { MessageText, MessageCategory, MessageDuration, MessageID } ) + + -- When no messagecategory is given, we don't show it as a title... + if MessageCategory and MessageCategory ~= "" then + self.MessageCategory = MessageCategory .. ": " + else + self.MessageCategory = "" + end + + self.MessageDuration = MessageDuration + self.MessageID = MessageID + self.MessageTime = timer.getTime() + self.MessageText = MessageText + + self.MessageSent = false + self.MessageGroup = false + self.MessageCoalition = false + + return self +end + +--- Sends a MESSAGE to a Client Group. Note that the Group needs to be defined within the ME with the skillset "Client" or "Player". +-- @param #MESSAGE self +-- @param Client#CLIENT Client is the Group of the Client. +-- @return #MESSAGE +-- @usage +-- -- Send the 2 messages created with the @{New} method to the Client Group. +-- -- Note that the Message of MessageClient2 is overwriting the Message of MessageClient1. +-- ClientGroup = Group.getByName( "ClientGroup" ) +-- +-- MessageClient1 = MESSAGE:New( "Congratulations, you've just hit a target", "Score", 25, "Score" ):ToClient( ClientGroup ) +-- MessageClient2 = MESSAGE:New( "Congratulations, you've just killed a target", "Score", 25, "Score" ):ToClient( ClientGroup ) +-- or +-- MESSAGE:New( "Congratulations, you've just hit a target", "Score", 25, "Score" ):ToClient( ClientGroup ) +-- MESSAGE:New( "Congratulations, you've just killed a target", "Score", 25, "Score" ):ToClient( ClientGroup ) +-- or +-- MessageClient1 = MESSAGE:New( "Congratulations, you've just hit a target", "Score", 25, "Score" ) +-- MessageClient2 = MESSAGE:New( "Congratulations, you've just killed a target", "Score", 25, "Score" ) +-- MessageClient1:ToClient( ClientGroup ) +-- MessageClient2:ToClient( ClientGroup ) +function MESSAGE:ToClient( Client ) + self:F( Client ) + + if Client and Client:GetClientGroupID() then + + local ClientGroupID = Client:GetClientGroupID() + self:T( self.MessageCategory .. self.MessageText:gsub("\n$",""):gsub("\n$","") .. " / " .. self.MessageDuration ) + trigger.action.outTextForGroup( ClientGroupID, self.MessageCategory .. self.MessageText:gsub("\n$",""):gsub("\n$",""), self.MessageDuration ) + end + + return self +end + +--- Sends a MESSAGE to the Blue coalition. +-- @param #MESSAGE self +-- @return #MESSAGE +-- @usage +-- -- Send a message created with the @{New} method to the BLUE coalition. +-- MessageBLUE = MESSAGE:New( "To the BLUE Players: You receive a penalty because you've killed one of your own units", "Penalty", 25, "Score" ):ToBlue() +-- or +-- MESSAGE:New( "To the BLUE Players: You receive a penalty because you've killed one of your own units", "Penalty", 25, "Score" ):ToBlue() +-- or +-- MessageBLUE = MESSAGE:New( "To the BLUE Players: You receive a penalty because you've killed one of your own units", "Penalty", 25, "Score" ) +-- MessageBLUE:ToBlue() +function MESSAGE:ToBlue() + self:F() + + self:ToCoalition( coalition.side.BLUE ) + + return self +end + +--- Sends a MESSAGE to the Red Coalition. +-- @param #MESSAGE self +-- @return #MESSAGE +-- @usage +-- -- Send a message created with the @{New} method to the RED coalition. +-- MessageRED = MESSAGE:New( "To the RED Players: You receive a penalty because you've killed one of your own units", "Penalty", 25, "Score" ):ToRed() +-- or +-- MESSAGE:New( "To the RED Players: You receive a penalty because you've killed one of your own units", "Penalty", 25, "Score" ):ToRed() +-- or +-- MessageRED = MESSAGE:New( "To the RED Players: You receive a penalty because you've killed one of your own units", "Penalty", 25, "Score" ) +-- MessageRED:ToRed() +function MESSAGE:ToRed( ) + self:F() + + self:ToCoalition( coalition.side.RED ) + + return self +end + +--- Sends a MESSAGE to a Coalition. +-- @param #MESSAGE self +-- @param CoalitionSide needs to be filled out by the defined structure of the standard scripting engine @{coalition.side}. +-- @return #MESSAGE +-- @usage +-- -- Send a message created with the @{New} method to the RED coalition. +-- MessageRED = MESSAGE:New( "To the RED Players: You receive a penalty because you've killed one of your own units", "Penalty", 25, "Score" ):ToCoalition( coalition.side.RED ) +-- or +-- MESSAGE:New( "To the RED Players: You receive a penalty because you've killed one of your own units", "Penalty", 25, "Score" ):ToCoalition( coalition.side.RED ) +-- or +-- MessageRED = MESSAGE:New( "To the RED Players: You receive a penalty because you've killed one of your own units", "Penalty", 25, "Score" ) +-- MessageRED:ToCoalition( coalition.side.RED ) +function MESSAGE:ToCoalition( CoalitionSide ) + self:F( CoalitionSide ) + + if CoalitionSide then + self:T( self.MessageCategory .. self.MessageText:gsub("\n$",""):gsub("\n$","") .. " / " .. self.MessageDuration ) + trigger.action.outTextForCoalition( CoalitionSide, self.MessageCategory .. self.MessageText:gsub("\n$",""):gsub("\n$",""), self.MessageDuration ) + end + + return self +end + +--- Sends a MESSAGE to all players. +-- @param #MESSAGE self +-- @return #MESSAGE +-- @usage +-- -- Send a message created to all players. +-- MessageAll = MESSAGE:New( "To all Players: BLUE has won! Each player of BLUE wins 50 points!", "End of Mission", 25, "Win" ):ToAll() +-- or +-- MESSAGE:New( "To all Players: BLUE has won! Each player of BLUE wins 50 points!", "End of Mission", 25, "Win" ):ToAll() +-- or +-- MessageAll = MESSAGE:New( "To all Players: BLUE has won! Each player of BLUE wins 50 points!", "End of Mission", 25, "Win" ) +-- MessageAll:ToAll() +function MESSAGE:ToAll() + self:F() + + self:ToCoalition( coalition.side.RED ) + self:ToCoalition( coalition.side.BLUE ) + + return self +end + + + +--- The MESSAGEQUEUE class +-- @type MESSAGEQUEUE +MESSAGEQUEUE = { + ClientGroups = {}, + CoalitionSides = {} +} + +function MESSAGEQUEUE:New( RefreshInterval ) + local self = BASE:Inherit( self, BASE:New() ) + self:F( { RefreshInterval } ) + + self.RefreshInterval = RefreshInterval + + --self.DisplayFunction = routines.scheduleFunction( self._DisplayMessages, { self }, 0, RefreshInterval ) + self.DisplayFunction = SCHEDULER:New( self, self._DisplayMessages, {}, 0, RefreshInterval ) + + return self +end + +--- This function is called automatically by the MESSAGEQUEUE scheduler. +function MESSAGEQUEUE:_DisplayMessages() + + -- First we display all messages that a coalition needs to receive... Also those who are not in a client (CA module clients...). + for CoalitionSideID, CoalitionSideData in pairs( self.CoalitionSides ) do + for MessageID, MessageData in pairs( CoalitionSideData.Messages ) do + if MessageData.MessageSent == false then + --trigger.action.outTextForCoalition( CoalitionSideID, MessageData.MessageCategory .. '\n' .. MessageData.MessageText:gsub("\n$",""):gsub("\n$",""), MessageData.MessageDuration ) + MessageData.MessageSent = true + end + local MessageTimeLeft = ( MessageData.MessageTime + MessageData.MessageDuration ) - timer.getTime() + if MessageTimeLeft <= 0 then + MessageData = nil + end + end + end + + -- Then we send the messages for each individual client, but also to be included are those Coalition messages for the Clients who belong to a coalition. + -- Because the Client messages will overwrite the Coalition messages (for that Client). + for ClientGroupName, ClientGroupData in pairs( self.ClientGroups ) do + for MessageID, MessageData in pairs( ClientGroupData.Messages ) do + if MessageData.MessageGroup == false then + trigger.action.outTextForGroup( Group.getByName(ClientGroupName):getID(), MessageData.MessageCategory .. '\n' .. MessageData.MessageText:gsub("\n$",""):gsub("\n$",""), MessageData.MessageDuration ) + MessageData.MessageGroup = true + end + local MessageTimeLeft = ( MessageData.MessageTime + MessageData.MessageDuration ) - timer.getTime() + if MessageTimeLeft <= 0 then + MessageData = nil + end + end + + -- Now check if the Client also has messages that belong to the Coalition of the Client... + for CoalitionSideID, CoalitionSideData in pairs( self.CoalitionSides ) do + for MessageID, MessageData in pairs( CoalitionSideData.Messages ) do + local CoalitionGroup = Group.getByName( ClientGroupName ) + if CoalitionGroup and CoalitionGroup:getCoalition() == CoalitionSideID then + if MessageData.MessageCoalition == false then + trigger.action.outTextForGroup( Group.getByName(ClientGroupName):getID(), MessageData.MessageCategory .. '\n' .. MessageData.MessageText:gsub("\n$",""):gsub("\n$",""), MessageData.MessageDuration ) + MessageData.MessageCoalition = true + end + end + local MessageTimeLeft = ( MessageData.MessageTime + MessageData.MessageDuration ) - timer.getTime() + if MessageTimeLeft <= 0 then + MessageData = nil + end + end + end + end + + return true +end + +--- The _MessageQueue object is created when the MESSAGE class module is loaded. +--_MessageQueue = MESSAGEQUEUE:New( 0.5 ) + +--- Stages within a @{TASK} within a @{MISSION}. All of the STAGE functionality is considered internally administered and not to be used by any Mission designer. +-- @module STAGE +-- @author Flightcontrol + +Include.File( "Routines" ) +Include.File( "Base" ) +Include.File( "Mission" ) +Include.File( "Client" ) +Include.File( "Task" ) + +--- The STAGE class +-- @type +STAGE = { + ClassName = "STAGE", + MSG = { ID = "None", TIME = 10 }, + FREQUENCY = { NONE = 0, ONCE = 1, REPEAT = -1 }, + + Name = "NoStage", + StageType = '', + WaitTime = 1, + Frequency = 1, + MessageCount = 0, + MessageInterval = 15, + MessageShown = {}, + MessageShow = false, + MessageFlash = false +} + + +function STAGE:New() + local self = BASE:Inherit( self, BASE:New() ) + self:F() + return self +end + +function STAGE:Execute( Mission, Client, Task ) + + local Valid = true + + return Valid +end + +function STAGE:Executing( Mission, Client, Task ) + +end + +function STAGE:Validate( Mission, Client, Task ) + local Valid = true + + return Valid +end + + +STAGEBRIEF = { + ClassName = "BRIEF", + MSG = { ID = "Brief", TIME = 1 }, + Name = "Brief", + StageBriefingTime = 0, + StageBriefingDuration = 1 +} + +function STAGEBRIEF:New() + local self = BASE:Inherit( self, STAGE:New() ) + self:F() + self.StageType = 'CLIENT' + return self +end + +--- Execute +-- @param #STAGEBRIEF self +-- @param Mission#MISSION Mission +-- @param Client#CLIENT Client +-- @param Task#TASK Task +-- @return #boolean +function STAGEBRIEF:Execute( Mission, Client, Task ) + local Valid = BASE:Inherited(self):Execute( Mission, Client, Task ) + self:F() + Client:ShowMissionBriefing( Mission.MissionBriefing ) + self.StageBriefingTime = timer.getTime() + return Valid +end + +function STAGEBRIEF:Validate( Mission, Client, Task ) + local Valid = STAGE:Validate( Mission, Client, Task ) + self:T() + + if timer.getTime() - self.StageBriefingTime <= self.StageBriefingDuration then + return 0 + else + self.StageBriefingTime = timer.getTime() + return 1 + end + +end + + +STAGESTART = { + ClassName = "START", + MSG = { ID = "Start", TIME = 1 }, + Name = "Start", + StageStartTime = 0, + StageStartDuration = 1 +} + +function STAGESTART:New() + local self = BASE:Inherit( self, STAGE:New() ) + self:F() + self.StageType = 'CLIENT' + return self +end + +function STAGESTART:Execute( Mission, Client, Task ) + self:F() + local Valid = BASE:Inherited(self):Execute( Mission, Client, Task ) + if Task.TaskBriefing then + Client:Message( Task.TaskBriefing, 30, Mission.Name .. "/Stage", "Command" ) + else + Client:Message( 'Task ' .. Task.TaskNumber .. '.', 30, Mission.Name .. "/Stage", "Command" ) + end + self.StageStartTime = timer.getTime() + return Valid +end + +function STAGESTART:Validate( Mission, Client, Task ) + self:F() + local Valid = STAGE:Validate( Mission, Client, Task ) + + if timer.getTime() - self.StageStartTime <= self.StageStartDuration then + return 0 + else + self.StageStartTime = timer.getTime() + return 1 + end + + return 1 + +end + +STAGE_CARGO_LOAD = { + ClassName = "STAGE_CARGO_LOAD" +} + +function STAGE_CARGO_LOAD:New() + local self = BASE:Inherit( self, STAGE:New() ) + self:F() + self.StageType = 'CLIENT' + return self +end + +function STAGE_CARGO_LOAD:Execute( Mission, Client, Task ) + self:F() + local Valid = BASE:Inherited(self):Execute( Mission, Client, Task ) + + for LoadCargoID, LoadCargo in pairs( Task.Cargos.LoadCargos ) do + LoadCargo:Load( Client ) + end + + if Mission.MissionReportFlash and Client:IsTransport() then + Client:ShowCargo() + end + + return Valid +end + +function STAGE_CARGO_LOAD:Validate( Mission, Client, Task ) + self:F() + local Valid = STAGE:Validate( Mission, Client, Task ) + + return 1 +end + + +STAGE_CARGO_INIT = { + ClassName = "STAGE_CARGO_INIT" +} + +function STAGE_CARGO_INIT:New() + local self = BASE:Inherit( self, STAGE:New() ) + self:F() + self.StageType = 'CLIENT' + return self +end + +function STAGE_CARGO_INIT:Execute( Mission, Client, Task ) + self:F() + local Valid = BASE:Inherited(self):Execute( Mission, Client, Task ) + + for InitLandingZoneID, InitLandingZone in pairs( Task.LandingZones.LandingZones ) do + self:T( InitLandingZone ) + InitLandingZone:Spawn() + end + + + self:T( Task.Cargos.InitCargos ) + for InitCargoID, InitCargoData in pairs( Task.Cargos.InitCargos ) do + self:T( { InitCargoData } ) + InitCargoData:Spawn( Client ) + end + + return Valid +end + + +function STAGE_CARGO_INIT:Validate( Mission, Client, Task ) + self:F() + local Valid = STAGE:Validate( Mission, Client, Task ) + + return 1 +end + + + +STAGEROUTE = { + ClassName = "STAGEROUTE", + MSG = { ID = "Route", TIME = 5 }, + Frequency = STAGE.FREQUENCY.REPEAT, + Name = "Route" +} + +function STAGEROUTE:New() + local self = BASE:Inherit( self, STAGE:New() ) + self:F() + self.StageType = 'CLIENT' + self.MessageSwitch = true + return self +end + + +--- Execute the routing. +-- @param #STAGEROUTE self +-- @param Mission#MISSION Mission +-- @param Client#CLIENT Client +-- @param Task#TASK Task +function STAGEROUTE:Execute( Mission, Client, Task ) + self:F() + local Valid = BASE:Inherited(self):Execute( Mission, Client, Task ) + + local RouteMessage = "Fly to: " + self:T( Task.LandingZones ) + for LandingZoneID, LandingZoneName in pairs( Task.LandingZones.LandingZoneNames ) do + RouteMessage = RouteMessage .. "\n " .. LandingZoneName .. ' at ' .. routines.getBRStringZone( { zone = LandingZoneName, ref = Client:GetClientGroupDCSUnit():getPoint(), true, true } ) .. ' km.' + end + + if Client:IsMultiSeated() then + Client:Message( RouteMessage, self.MSG.TIME, Mission.Name .. "/StageRoute", "Co-Pilot", 20 ) + else + Client:Message( RouteMessage, self.MSG.TIME, Mission.Name .. "/StageRoute", "Command", 20 ) + end + + + if Mission.MissionReportFlash and Client:IsTransport() then + Client:ShowCargo() + end + + return Valid +end + +function STAGEROUTE:Validate( Mission, Client, Task ) + self:F() + local Valid = STAGE:Validate( Mission, Client, Task ) + + -- check if the Client is in the landing zone + self:T( Task.LandingZones.LandingZoneNames ) + Task.CurrentLandingZoneName = routines.IsUnitNearZonesRadius( Client:GetClientGroupDCSUnit(), Task.LandingZones.LandingZoneNames, 500 ) + + if Task.CurrentLandingZoneName then + + Task.CurrentLandingZone = Task.LandingZones.LandingZones[Task.CurrentLandingZoneName].CargoZone + Task.CurrentCargoZone = Task.LandingZones.LandingZones[Task.CurrentLandingZoneName] + + if Task.CurrentCargoZone then + if not Task.Signalled then + Task.Signalled = Task.CurrentCargoZone:Signal() + end + end + + self:T( 1 ) + return 1 + end + + self:T( 0 ) + return 0 +end + + + +STAGELANDING = { + ClassName = "STAGELANDING", + MSG = { ID = "Landing", TIME = 10 }, + Name = "Landing", + Signalled = false +} + +function STAGELANDING:New() + local self = BASE:Inherit( self, STAGE:New() ) + self:F() + self.StageType = 'CLIENT' + return self +end + +--- Execute the landing coordination. +-- @param #STAGELANDING self +-- @param Mission#MISSION Mission +-- @param Client#CLIENT Client +-- @param Task#TASK Task +function STAGELANDING:Execute( Mission, Client, Task ) + self:F() + + if Client:IsMultiSeated() then + Client:Message( "We have arrived at the landing zone.", self.MSG.TIME, Mission.Name .. "/StageArrived", "Co-Pilot", 10 ) + else + Client:Message( "You have arrived at the landing zone.", self.MSG.TIME, Mission.Name .. "/StageArrived", "Command", 10 ) + end + + Task.HostUnit = Task.CurrentCargoZone:GetHostUnit() + + self:T( { Task.HostUnit } ) + + if Task.HostUnit then + + Task.HostUnitName = Task.HostUnit:GetPrefix() + Task.HostUnitTypeName = Task.HostUnit:GetTypeName() + + local HostMessage = "" + Task.CargoNames = "" + + local IsFirst = true + + for CargoID, Cargo in pairs( CARGOS ) do + if Cargo.CargoType == Task.CargoType then + + if Cargo:IsLandingRequired() then + self:T( "Task for cargo " .. Cargo.CargoType .. " requires landing.") + Task.IsLandingRequired = true + end + + if Cargo:IsSlingLoad() then + self:T( "Task for cargo " .. Cargo.CargoType .. " is a slingload.") + Task.IsSlingLoad = true + end + + if IsFirst then + IsFirst = false + Task.CargoNames = Task.CargoNames .. Cargo.CargoName .. "( " .. Cargo.CargoWeight .. " )" + else + Task.CargoNames = Task.CargoNames .. "; " .. Cargo.CargoName .. "( " .. Cargo.CargoWeight .. " )" + end + end + end + + if Task.IsLandingRequired then + HostMessage = "Land the helicopter to " .. Task.TEXT[1] .. " " .. Task.CargoNames .. "." + else + HostMessage = "Use the Radio menu and F6 to find the cargo, then fly or land near the cargo and " .. Task.TEXT[1] .. " " .. Task.CargoNames .. "." + end + + local Host = "Command" + if Task.HostUnitName then + Host = Task.HostUnitName .. " (" .. Task.HostUnitTypeName .. ")" + else + if Client:IsMultiSeated() then + Host = "Co-Pilot" + end + end + + Client:Message( HostMessage, self.MSG.TIME, Mission.Name .. "/STAGELANDING.EXEC." .. Host, Host, 10 ) + + end +end + +function STAGELANDING:Validate( Mission, Client, Task ) + self:F() + + Task.CurrentLandingZoneName = routines.IsUnitNearZonesRadius( Client:GetClientGroupDCSUnit(), Task.LandingZones.LandingZoneNames, 500 ) + if Task.CurrentLandingZoneName then + + -- Client is in de landing zone. + self:T( Task.CurrentLandingZoneName ) + + Task.CurrentLandingZone = Task.LandingZones.LandingZones[Task.CurrentLandingZoneName].CargoZone + Task.CurrentCargoZone = Task.LandingZones.LandingZones[Task.CurrentLandingZoneName] + + if Task.CurrentCargoZone then + if not Task.Signalled then + Task.Signalled = Task.CurrentCargoZone:Signal() + end + end + else + if Task.CurrentLandingZone then + Task.CurrentLandingZone = nil + end + if Task.CurrentCargoZone then + Task.CurrentCargoZone = nil + end + Task.Signalled = false + Task:RemoveCargoMenus( Client ) + self:T( -1 ) + return -1 + end + + + local DCSUnitVelocityVec3 = Client:GetClientGroupDCSUnit():getVelocity() + local DCSUnitVelocity = ( DCSUnitVelocityVec3.x ^2 + DCSUnitVelocityVec3.y ^2 + DCSUnitVelocityVec3.z ^2 ) ^ 0.5 + + local DCSUnitPointVec3 = Client:GetClientGroupDCSUnit():getPoint() + local LandHeight = land.getHeight( { x = DCSUnitPointVec3.x, y = DCSUnitPointVec3.z } ) + local DCSUnitHeight = DCSUnitPointVec3.y - LandHeight + + self:T( { Task.IsLandingRequired, Client:GetClientGroupDCSUnit():inAir() } ) + if Task.IsLandingRequired and not Client:GetClientGroupDCSUnit():inAir() then + self:T( 1 ) + Task.IsInAirTestRequired = true + return 1 + end + + self:T( { DCSUnitVelocity, DCSUnitHeight, LandHeight, Task.CurrentCargoZone.SignalHeight } ) + if Task.IsLandingRequired and DCSUnitVelocity <= 0.05 and DCSUnitHeight <= Task.CurrentCargoZone.SignalHeight then + self:T( 1 ) + Task.IsInAirTestRequired = false + return 1 + end + + self:T( 0 ) + return 0 +end + +STAGELANDED = { + ClassName = "STAGELANDED", + MSG = { ID = "Land", TIME = 10 }, + Name = "Landed", + MenusAdded = false +} + +function STAGELANDED:New() + local self = BASE:Inherit( self, STAGE:New() ) + self:F() + self.StageType = 'CLIENT' + return self +end + +function STAGELANDED:Execute( Mission, Client, Task ) + self:F() + + if Task.IsLandingRequired then + + local Host = "Command" + if Task.HostUnitName then + Host = Task.HostUnitName .. " (" .. Task.HostUnitTypeName .. ")" + else + if Client:IsMultiSeated() then + Host = "Co-Pilot" + end + end + + Client:Message( 'You have landed within the landing zone. Use the radio menu (F10) to ' .. Task.TEXT[1] .. ' the ' .. Task.CargoType .. '.', + self.MSG.TIME, Mission.Name .. "/STAGELANDED.EXEC" .. Host, Host ) + + if not self.MenusAdded then + Task.Cargo = nil + Task:RemoveCargoMenus( Client ) + Task:AddCargoMenus( Client, CARGOS, 250 ) + end + end +end + + + +function STAGELANDED:Validate( Mission, Client, Task ) + self:F() + + if not routines.IsUnitNearZonesRadius( Client:GetClientGroupDCSUnit(), Task.CurrentLandingZoneName, 500 ) then + self:T( "Client is not anymore in the landing zone, go back to stage Route, and remove cargo menus." ) + Task.Signalled = false + Task:RemoveCargoMenus( Client ) + self:T( -2 ) + return -2 + end + + local DCSUnitVelocityVec3 = Client:GetClientGroupDCSUnit():getVelocity() + local DCSUnitVelocity = ( DCSUnitVelocityVec3.x ^2 + DCSUnitVelocityVec3.y ^2 + DCSUnitVelocityVec3.z ^2 ) ^ 0.5 + + local DCSUnitPointVec3 = Client:GetClientGroupDCSUnit():getPoint() + local LandHeight = land.getHeight( { x = DCSUnitPointVec3.x, y = DCSUnitPointVec3.z } ) + local DCSUnitHeight = DCSUnitPointVec3.y - LandHeight + + self:T( { Task.IsLandingRequired, Client:GetClientGroupDCSUnit():inAir() } ) + if Task.IsLandingRequired and Task.IsInAirTestRequired == true and Client:GetClientGroupDCSUnit():inAir() then + self:T( "Client went back in the air. Go back to stage Landing." ) + self:T( -1 ) + return -1 + end + + self:T( { DCSUnitVelocity, DCSUnitHeight, LandHeight, Task.CurrentCargoZone.SignalHeight } ) + if Task.IsLandingRequired and Task.IsInAirTestRequired == false and DCSUnitVelocity >= 2 and DCSUnitHeight >= Task.CurrentCargoZone.SignalHeight then + self:T( "It seems the Client went back in the air and over the boundary limits. Go back to stage Landing." ) + self:T( -1 ) + return -1 + end + + -- Wait until cargo is selected from the menu. + if Task.IsLandingRequired then + if not Task.Cargo then + self:T( 0 ) + return 0 + end + end + + self:T( 1 ) + return 1 +end + +STAGEUNLOAD = { + ClassName = "STAGEUNLOAD", + MSG = { ID = "Unload", TIME = 10 }, + Name = "Unload" +} + +function STAGEUNLOAD:New() + local self = BASE:Inherit( self, STAGE:New() ) + self:F() + self.StageType = 'CLIENT' + return self +end + +--- Coordinate UnLoading +-- @param #STAGEUNLOAD self +-- @param Mission#MISSION Mission +-- @param Client#CLIENT Client +-- @param Task#TASK Task +function STAGEUNLOAD:Execute( Mission, Client, Task ) + self:F() + + if Client:IsMultiSeated() then + Client:Message( 'The ' .. Task.CargoType .. ' are being ' .. Task.TEXT[2] .. ' within the landing zone. Wait until the helicopter is ' .. Task.TEXT[3] .. '.', + self.MSG.TIME, Mission.Name .. "/StageUnLoad", "Co-Pilot" ) + else + Client:Message( 'You are unloading the ' .. Task.CargoType .. ' ' .. Task.TEXT[2] .. ' within the landing zone. Wait until the helicopter is ' .. Task.TEXT[3] .. '.', + self.MSG.TIME, Mission.Name .. "/StageUnLoad", "Command" ) + end + Task:RemoveCargoMenus( Client ) +end + +function STAGEUNLOAD:Executing( Mission, Client, Task ) + self:F() + env.info( 'STAGEUNLOAD:Executing() Task.Cargo.CargoName = ' .. Task.Cargo.CargoName ) + + local TargetZoneName + + if Task.TargetZoneName then + TargetZoneName = Task.TargetZoneName + else + TargetZoneName = Task.CurrentLandingZoneName + end + + if Task.Cargo:UnLoad( Client, TargetZoneName ) then + Task.ExecuteStage = _TransportExecuteStage.SUCCESS + if Mission.MissionReportFlash then + Client:ShowCargo() + end + end +end + +--- Validate UnLoading +-- @param #STAGEUNLOAD self +-- @param Mission#MISSION Mission +-- @param Client#CLIENT Client +-- @param Task#TASK Task +function STAGEUNLOAD:Validate( Mission, Client, Task ) + self:F() + env.info( 'STAGEUNLOAD:Validate()' ) + + if routines.IsUnitNearZonesRadius( Client:GetClientGroupDCSUnit(), Task.CurrentLandingZoneName, 500 ) then + else + Task.ExecuteStage = _TransportExecuteStage.FAILED + Task:RemoveCargoMenus( Client ) + if Client:IsMultiSeated() then + Client:Message( 'The ' .. Task.CargoType .. " haven't been successfully " .. Task.TEXT[3] .. ' within the landing zone. Task and mission has failed.', + _TransportStageMsgTime.DONE, Mission.Name .. "/StageFailure", "Co-Pilot" ) + else + Client:Message( 'The ' .. Task.CargoType .. " haven't been successfully " .. Task.TEXT[3] .. ' within the landing zone. Task and mission has failed.', + _TransportStageMsgTime.DONE, Mission.Name .. "/StageFailure", "Command" ) + end + return 1 + end + + if not Client:GetClientGroupDCSUnit():inAir() then + else + Task.ExecuteStage = _TransportExecuteStage.FAILED + Task:RemoveCargoMenus( Client ) + if Client:IsMultiSeated() then + Client:Message( 'The ' .. Task.CargoType .. " haven't been successfully " .. Task.TEXT[3] .. ' within the landing zone. Task and mission has failed.', + _TransportStageMsgTime.DONE, Mission.Name .. "/StageFailure", "Co-Pilot" ) + else + Client:Message( 'The ' .. Task.CargoType .. " haven't been successfully " .. Task.TEXT[3] .. ' within the landing zone. Task and mission has failed.', + _TransportStageMsgTime.DONE, Mission.Name .. "/StageFailure", "Command" ) + end + return 1 + end + + if Task.ExecuteStage == _TransportExecuteStage.SUCCESS then + if Client:IsMultiSeated() then + Client:Message( 'The ' .. Task.CargoType .. ' have been sucessfully ' .. Task.TEXT[3] .. ' within the landing zone.', _TransportStageMsgTime.DONE, Mission.Name .. "/Stage", "Co-Pilot" ) + else + Client:Message( 'The ' .. Task.CargoType .. ' have been sucessfully ' .. Task.TEXT[3] .. ' within the landing zone.', _TransportStageMsgTime.DONE, Mission.Name .. "/Stage", "Command" ) + end + Task:RemoveCargoMenus( Client ) + Task.MissionTask:AddGoalCompletion( Task.MissionTask.GoalVerb, Task.CargoName, 1 ) -- We set the cargo as one more goal completed in the mission. + return 1 + end + + return 1 +end + +STAGELOAD = { + ClassName = "STAGELOAD", + MSG = { ID = "Load", TIME = 10 }, + Name = "Load" +} + +function STAGELOAD:New() + local self = BASE:Inherit( self, STAGE:New() ) + self:F() + self.StageType = 'CLIENT' + return self +end + +function STAGELOAD:Execute( Mission, Client, Task ) + self:F() + + if not Task.IsSlingLoad then + + local Host = "Command" + if Task.HostUnitName then + Host = Task.HostUnitName .. " (" .. Task.HostUnitTypeName .. ")" + else + if Client:IsMultiSeated() then + Host = "Co-Pilot" + end + end + + Client:Message( 'The ' .. Task.CargoType .. ' are being ' .. Task.TEXT[2] .. ' within the landing zone. Wait until the helicopter is ' .. Task.TEXT[3] .. '.', + _TransportStageMsgTime.EXECUTING, Mission.Name .. "/STAGELOAD.EXEC." .. Host, Host ) + + -- Route the cargo to the Carrier + + Task.Cargo:OnBoard( Client, Task.CurrentCargoZone, Task.OnBoardSide ) + Task.ExecuteStage = _TransportExecuteStage.EXECUTING + else + Task.ExecuteStage = _TransportExecuteStage.EXECUTING + end +end + +function STAGELOAD:Executing( Mission, Client, Task ) + self:F() + + -- If the Cargo is ready to be loaded, load it into the Client. + + local Host = "Command" + if Task.HostUnitName then + Host = Task.HostUnitName .. " (" .. Task.HostUnitTypeName .. ")" + else + if Client:IsMultiSeated() then + Host = "Co-Pilot" + end + end + + if not Task.IsSlingLoad then + self:T( Task.Cargo.CargoName) + + if Task.Cargo:OnBoarded( Client, Task.CurrentCargoZone ) then + + -- Load the Cargo onto the Client + Task.Cargo:Load( Client ) + + -- Message to the pilot that cargo has been loaded. + Client:Message( "The cargo " .. Task.Cargo.CargoName .. " has been loaded in our helicopter.", + 20, Mission.Name .. "/STAGELANDING.LOADING1." .. Host, Host ) + Task.ExecuteStage = _TransportExecuteStage.SUCCESS + + Client:ShowCargo() + end + else + Client:Message( "Hook the " .. Task.CargoNames .. " onto the helicopter " .. Task.TEXT[3] .. " within the landing zone.", + _TransportStageMsgTime.EXECUTING, Mission.Name .. "/STAGELOAD.LOADING.1." .. Host, Host , 10 ) + for CargoID, Cargo in pairs( CARGOS ) do + self:T( "Cargo.CargoName = " .. Cargo.CargoName ) + + if Cargo:IsSlingLoad() then + local CargoStatic = StaticObject.getByName( Cargo.CargoStaticName ) + if CargoStatic then + self:T( "Cargo is found in the DCS simulator.") + local CargoStaticPosition = CargoStatic:getPosition().p + self:T( "Cargo Position x = " .. CargoStaticPosition.x .. ", y = " .. CargoStaticPosition.y .. ", z = " .. CargoStaticPosition.z ) + local CargoStaticHeight = routines.GetUnitHeight( CargoStatic ) + if CargoStaticHeight > 5 then + self:T( "Cargo is airborne.") + Cargo:StatusLoaded() + Task.Cargo = Cargo + Client:Message( 'The Cargo has been successfully hooked onto the helicopter and is now being sling loaded. Fly outside the landing zone.', + self.MSG.TIME, Mission.Name .. "/STAGELANDING.LOADING.2." .. Host, Host ) + Task.ExecuteStage = _TransportExecuteStage.SUCCESS + break + end + else + self:T( "Cargo not found in the DCS simulator." ) + end + end + end + end + +end + +function STAGELOAD:Validate( Mission, Client, Task ) + self:F() + + self:T( "Task.CurrentLandingZoneName = " .. Task.CurrentLandingZoneName ) + + local Host = "Command" + if Task.HostUnitName then + Host = Task.HostUnitName .. " (" .. Task.HostUnitTypeName .. ")" + else + if Client:IsMultiSeated() then + Host = "Co-Pilot" + end + end + + if not Task.IsSlingLoad then + if not routines.IsUnitNearZonesRadius( Client:GetClientGroupDCSUnit(), Task.CurrentLandingZoneName, 500 ) then + Task:RemoveCargoMenus( Client ) + Task.ExecuteStage = _TransportExecuteStage.FAILED + Task.CargoName = nil + Client:Message( "The " .. Task.CargoType .. " loading has been aborted. You flew outside the pick-up zone while loading. ", + self.MSG.TIME, Mission.Name .. "/STAGELANDING.VALIDATE.1." .. Host, Host ) + self:T( -1 ) + return -1 + end + + local DCSUnitVelocityVec3 = Client:GetClientGroupDCSUnit():getVelocity() + local DCSUnitVelocity = ( DCSUnitVelocityVec3.x ^2 + DCSUnitVelocityVec3.y ^2 + DCSUnitVelocityVec3.z ^2 ) ^ 0.5 + + local DCSUnitPointVec3 = Client:GetClientGroupDCSUnit():getPoint() + local LandHeight = land.getHeight( { x = DCSUnitPointVec3.x, y = DCSUnitPointVec3.z } ) + local DCSUnitHeight = DCSUnitPointVec3.y - LandHeight + + self:T( { Task.IsLandingRequired, Client:GetClientGroupDCSUnit():inAir() } ) + if Task.IsLandingRequired and Task.IsInAirTestRequired == true and Client:GetClientGroupDCSUnit():inAir() then + Task:RemoveCargoMenus( Client ) + Task.ExecuteStage = _TransportExecuteStage.FAILED + Task.CargoName = nil + Client:Message( "The " .. Task.CargoType .. " loading has been aborted. Re-start the " .. Task.TEXT[3] .. " process. Don't fly outside the pick-up zone.", + self.MSG.TIME, Mission.Name .. "/STAGELANDING.VALIDATE.1." .. Host, Host ) + self:T( -1 ) + return -1 + end + + self:T( { DCSUnitVelocity, DCSUnitHeight, LandHeight, Task.CurrentCargoZone.SignalHeight } ) + if Task.IsLandingRequired and Task.IsInAirTestRequired == false and DCSUnitVelocity >= 2 and DCSUnitHeight >= Task.CurrentCargoZone.SignalHeight then + Task:RemoveCargoMenus( Client ) + Task.ExecuteStage = _TransportExecuteStage.FAILED + Task.CargoName = nil + Client:Message( "The " .. Task.CargoType .. " loading has been aborted. Re-start the " .. Task.TEXT[3] .. " process. Don't fly outside the pick-up zone.", + self.MSG.TIME, Mission.Name .. "/STAGELANDING.VALIDATE.1." .. Host, Host ) + self:T( -1 ) + return -1 + end + + if Task.ExecuteStage == _TransportExecuteStage.SUCCESS then + Task:RemoveCargoMenus( Client ) + Client:Message( "Good Job. The " .. Task.CargoType .. " has been sucessfully " .. Task.TEXT[3] .. " within the landing zone.", + self.MSG.TIME, Mission.Name .. "/STAGELANDING.VALIDATE.3." .. Host, Host ) + Task.MissionTask:AddGoalCompletion( Task.MissionTask.GoalVerb, Task.CargoName, 1 ) + self:T( 1 ) + return 1 + end + + else + if Task.ExecuteStage == _TransportExecuteStage.SUCCESS then + CargoStatic = StaticObject.getByName( Task.Cargo.CargoStaticName ) + if CargoStatic and not routines.IsStaticInZones( CargoStatic, Task.CurrentLandingZoneName ) then + Client:Message( "Good Job. The " .. Task.CargoType .. " has been sucessfully " .. Task.TEXT[3] .. " and flown outside of the landing zone.", + self.MSG.TIME, Mission.Name .. "/STAGELANDING.VALIDATE.4." .. Host, Host ) + Task.MissionTask:AddGoalCompletion( Task.MissionTask.GoalVerb, Task.Cargo.CargoName, 1 ) + self:T( 1 ) + return 1 + end + end + + end + + + self:T( 0 ) + return 0 +end + + +STAGEDONE = { + ClassName = "STAGEDONE", + MSG = { ID = "Done", TIME = 10 }, + Name = "Done" +} + +function STAGEDONE:New() + local self = BASE:Inherit( self, STAGE:New() ) + self:F() + self.StageType = 'AI' + return self +end + +function STAGEDONE:Execute( Mission, Client, Task ) + self:F() + +end + +function STAGEDONE:Validate( Mission, Client, Task ) + self:F() + + Task:Done() + + return 0 +end + +STAGEARRIVE = { + ClassName = "STAGEARRIVE", + MSG = { ID = "Arrive", TIME = 10 }, + Name = "Arrive" +} + +function STAGEARRIVE:New() + local self = BASE:Inherit( self, STAGE:New() ) + self:F() + self.StageType = 'CLIENT' + return self +end + + +--- Execute Arrival +-- @param #STAGEARRIVE self +-- @param Mission#MISSION Mission +-- @param Client#CLIENT Client +-- @param Task#TASK Task +function STAGEARRIVE:Execute( Mission, Client, Task ) + self:F() + + if Client:IsMultiSeated() then + Client:Message( 'We have arrived at ' .. Task.CurrentLandingZoneName .. ".", self.MSG.TIME, Mission.Name .. "/Stage", "Co-Pilot" ) + else + Client:Message( 'We have arrived at ' .. Task.CurrentLandingZoneName .. ".", self.MSG.TIME, Mission.Name .. "/Stage", "Command" ) + end + +end + +function STAGEARRIVE:Validate( Mission, Client, Task ) + self:F() + + Task.CurrentLandingZoneID = routines.IsUnitInZones( Client:GetClientGroupDCSUnit(), Task.LandingZones ) + if ( Task.CurrentLandingZoneID ) then + else + return -1 + end + + return 1 +end + +STAGEGROUPSDESTROYED = { + ClassName = "STAGEGROUPSDESTROYED", + DestroyGroupSize = -1, + Frequency = STAGE.FREQUENCY.REPEAT, + MSG = { ID = "DestroyGroup", TIME = 10 }, + Name = "GroupsDestroyed" +} + +function STAGEGROUPSDESTROYED:New() + local self = BASE:Inherit( self, STAGE:New() ) + self:F() + self.StageType = 'AI' + return self +end + +--function STAGEGROUPSDESTROYED:Execute( Mission, Client, Task ) +-- +-- Client:Message( 'Task: Still ' .. DestroyGroupSize .. " of " .. Task.DestroyGroupCount .. " " .. Task.DestroyGroupType .. " to be destroyed!", self.MSG.TIME, Mission.Name .. "/Stage" ) +-- +--end + +function STAGEGROUPSDESTROYED:Validate( Mission, Client, Task ) + self:F() + + if Task.MissionTask:IsGoalReached() then + return 1 + else + return 0 + end +end + +function STAGEGROUPSDESTROYED:Execute( Mission, Client, Task ) + self:F() + self:T( { Task.ClassName, Task.Destroyed } ) + --env.info( 'Event Table Task = ' .. tostring(Task) ) + +end + + + + + + + + + + + + + +--[[ + _TransportStage: Defines the different stages of which of transport missions can be in. This table is internal and is used to control the sequence of messages, actions and flow. + + - _TransportStage.START + - _TransportStage.ROUTE + - _TransportStage.LAND + - _TransportStage.EXECUTE + - _TransportStage.DONE + - _TransportStage.REMOVE +--]] +_TransportStage = { + HOLD = "HOLD", + START = "START", + ROUTE = "ROUTE", + LANDING = "LANDING", + LANDED = "LANDED", + EXECUTING = "EXECUTING", + LOAD = "LOAD", + UNLOAD = "UNLOAD", + DONE = "DONE", + NEXT = "NEXT" +} + +_TransportStageMsgTime = { + HOLD = 10, + START = 60, + ROUTE = 5, + LANDING = 10, + LANDED = 30, + EXECUTING = 30, + LOAD = 30, + UNLOAD = 30, + DONE = 30, + NEXT = 0 +} + +_TransportStageTime = { + HOLD = 10, + START = 5, + ROUTE = 5, + LANDING = 1, + LANDED = 1, + EXECUTING = 5, + LOAD = 5, + UNLOAD = 5, + DONE = 1, + NEXT = 0 +} + +_TransportStageAction = { + REPEAT = -1, + NONE = 0, + ONCE = 1 +} +--- The TASK Classes define major end-to-end activities within a MISSION. The TASK Class is the Master Class to orchestrate these activities. From this class, many concrete TASK classes are inherited. +-- @module TASK + +Include.File( "Routines" ) +Include.File( "Base" ) +Include.File( "Mission" ) +Include.File( "Client" ) +Include.File( "Stage" ) + +--- The TASK class +-- @type TASK +-- @extends Base#BASE +TASK = { + + -- Defines the different signal types with a Task. + SIGNAL = { + COLOR = { + RED = { ID = 1, COLOR = trigger.smokeColor.Red, TEXT = "A red" }, + GREEN = { ID = 2, COLOR = trigger.smokeColor.Green, TEXT = "A green" }, + BLUE = { ID = 3, COLOR = trigger.smokeColor.Blue, TEXT = "A blue" }, + WHITE = { ID = 4, COLOR = trigger.smokeColor.White, TEXT = "A white" }, + ORANGE = { ID = 5, COLOR = trigger.smokeColor.Orange, TEXT = "An orange" } + }, + TYPE = { + SMOKE = { ID = 1, TEXT = "smoke" }, + FLARE = { ID = 2, TEXT = "flare" } + } + }, + ClassName = "TASK", + Mission = {}, -- Owning mission of the Task + Name = '', + Stages = {}, + Stage = {}, + Cargos = { + InitCargos = {}, + LoadCargos = {} + }, + LandingZones = { + LandingZoneNames = {}, + LandingZones = {} + }, + ActiveStage = 0, + TaskDone = false, + TaskFailed = false, + GoalTasks = {} +} + +--- Instantiates a new TASK Base. Should never be used. Interface Class. +-- @return TASK +function TASK:New() + local self = BASE:Inherit( self, BASE:New() ) + self:F() + + -- assign Task default values during construction + self.TaskBriefing = "Task: No Task." + self.Time = timer.getTime() + self.ExecuteStage = _TransportExecuteStage.NONE + + return self +end + +function TASK:SetStage( StageSequenceIncrement ) + self:F( { StageSequenceIncrement } ) + + local Valid = false + if StageSequenceIncrement ~= 0 then + self.ActiveStage = self.ActiveStage + StageSequenceIncrement + if 1 <= self.ActiveStage and self.ActiveStage <= #self.Stages then + self.Stage = self.Stages[self.ActiveStage] + self:T( { self.Stage.Name } ) + self.Frequency = self.Stage.Frequency + Valid = true + else + Valid = false + env.info( "TASK:SetStage() self.ActiveStage is smaller or larger than self.Stages array. self.ActiveStage = " .. self.ActiveStage ) + end + end + self.Time = timer.getTime() + return Valid +end + +function TASK:Init() + self:F() + self.ActiveStage = 0 + self:SetStage(1) + self.TaskDone = false + self.TaskFailed = false +end + + +--- Get progress of a TASK. +-- @return string GoalsText +function TASK:GetGoalProgress() + self:F2() + + local GoalsText = "" + for GoalVerb, GoalVerbData in pairs( self.GoalTasks ) do + local Goals = self:GetGoalCompletion( GoalVerb ) + if Goals and Goals ~= "" then + Goals = '(' .. Goals .. ')' + else + Goals = '( - )' + end + GoalsText = GoalsText .. GoalVerb .. ': ' .. self:GetGoalCount(GoalVerb) .. ' goals ' .. Goals .. ' of ' .. self:GetGoalTotal(GoalVerb) .. ' goals completed (' .. self:GetGoalPercentage(GoalVerb) .. '%); ' + end + + if GoalsText == "" then + GoalsText = "( - )" + end + + return GoalsText +end + +--- Show progress of a TASK. +-- @param MISSION Mission Group structure describing the Mission. +-- @param CLIENT Client Group structure describing the Client. +function TASK:ShowGoalProgress( Mission, Client ) + self:F2() + + local GoalsText = "" + for GoalVerb, GoalVerbData in pairs( self.GoalTasks ) do + if Mission:IsCompleted() then + else + local Goals = self:GetGoalCompletion( GoalVerb ) + if Goals and Goals ~= "" then + else + Goals = "-" + end + GoalsText = GoalsText .. self:GetGoalProgress() + end + end + + if Mission.MissionReportFlash or Mission.MissionReportShow then + Client:Message( GoalsText, 10, "/TASKPROGRESS" .. self.ClassName, "Mission Command: Task Status", 30 ) + end +end + +--- Sets a TASK to status Done. +function TASK:Done() + self:F2() + self.TaskDone = true +end + +--- Returns if a TASK is done. +-- @return bool +function TASK:IsDone() + self:F2( self.TaskDone ) + return self.TaskDone +end + +--- Sets a TASK to status failed. +function TASK:Failed() + self:F() + self.TaskFailed = true +end + +--- Returns if a TASk has failed. +-- @return bool +function TASK:IsFailed() + self:F2( self.TaskFailed ) + return self.TaskFailed +end + +function TASK:Reset( Mission, Client ) + self:F2() + self.ExecuteStage = _TransportExecuteStage.NONE +end + +--- Returns the Goals of a TASK +-- @return @table Goals +function TASK:GetGoals() + return self.GoalTasks +end + +--- Returns if a TASK has Goal(s). +-- @param #TASK self +-- @param #string GoalVerb is the name of the Goal of the TASK. +-- @return bool +function TASK:Goal( GoalVerb ) + self:F2( { GoalVerb } ) + if not GoalVerb then + GoalVerb = self.GoalVerb + end + self:T2( {self.GoalTasks[GoalVerb] } ) + if self.GoalTasks[GoalVerb] and self.GoalTasks[GoalVerb].GoalTotal > 0 then + return true + else + return false + end +end + +--- Sets the total Goals to be achieved of the Goal Name +-- @param number GoalTotal is the number of times the GoalVerb needs to be achieved. +-- @param ?string GoalVerb is the name of the Goal of the TASK. If the GoalVerb is not given, then the default TASK Goals will be used. +function TASK:SetGoalTotal( GoalTotal, GoalVerb ) + self:F2( { GoalTotal, GoalVerb } ) + + if not GoalVerb then + GoalVerb = self.GoalVerb + end + self.GoalTasks[GoalVerb] = {} + self.GoalTasks[GoalVerb].Goals = {} + self.GoalTasks[GoalVerb].GoalTotal = GoalTotal + self.GoalTasks[GoalVerb].GoalCount = 0 + return self +end + +--- Gets the total of Goals to be achieved within the TASK of the GoalVerb. +-- @param ?string GoalVerb is the name of the Goal of the TASK. If the GoalVerb is not given, then the default TASK Goals will be used. +function TASK:GetGoalTotal( GoalVerb ) + self:F2( { GoalVerb } ) + if not GoalVerb then + GoalVerb = self.GoalVerb + end + if self:Goal( GoalVerb ) then + return self.GoalTasks[GoalVerb].GoalTotal + else + return 0 + end +end + +--- Sets the total of Goals currently achieved within the TASK of the GoalVerb. +-- @param number GoalCount is the total number of Goals achieved within the TASK. +-- @param ?string GoalVerb is the name of the Goal of the TASK. If the GoalVerb is not given, then the default TASK Goals will be used. +-- @return TASK +function TASK:SetGoalCount( GoalCount, GoalVerb ) + self:F2() + if not GoalVerb then + GoalVerb = self.GoalVerb + end + if self:Goal( GoalVerb) then + self.GoalTasks[GoalVerb].GoalCount = GoalCount + end + return self +end + +--- Increments the total of Goals currently achieved within the TASK of the GoalVerb, with the given GoalCountIncrease. +-- @param number GoalCountIncrease is the number of new Goals achieved within the TASK. +-- @param ?string GoalVerb is the name of the Goal of the TASK. If the GoalVerb is not given, then the default TASK Goals will be used. +-- @return TASK +function TASK:IncreaseGoalCount( GoalCountIncrease, GoalVerb ) + self:F2( { GoalCountIncrease, GoalVerb } ) + if not GoalVerb then + GoalVerb = self.GoalVerb + end + if self:Goal( GoalVerb) then + self.GoalTasks[GoalVerb].GoalCount = self.GoalTasks[GoalVerb].GoalCount + GoalCountIncrease + end + return self +end + +--- Gets the total of Goals currently achieved within the TASK of the GoalVerb. +-- @param ?string GoalVerb is the name of the Goal of the TASK. If the GoalVerb is not given, then the default TASK Goals will be used. +-- @return TASK +function TASK:GetGoalCount( GoalVerb ) + self:F2() + if not GoalVerb then + GoalVerb = self.GoalVerb + end + if self:Goal( GoalVerb ) then + return self.GoalTasks[GoalVerb].GoalCount + else + return 0 + end +end + +--- Gets the percentage of Goals currently achieved within the TASK of the GoalVerb. +-- @param ?string GoalVerb is the name of the Goal of the TASK. If the GoalVerb is not given, then the default TASK Goals will be used. +-- @return TASK +function TASK:GetGoalPercentage( GoalVerb ) + self:F2() + if not GoalVerb then + GoalVerb = self.GoalVerb + end + if self:Goal( GoalVerb ) then + return math.floor( self:GetGoalCount( GoalVerb ) / self:GetGoalTotal( GoalVerb ) * 100 + .5 ) + else + return 100 + end +end + +--- Returns if all the Goals of the TASK were achieved. +-- @return bool +function TASK:IsGoalReached() + self:F2() + + local GoalReached = true + + for GoalVerb, Goals in pairs( self.GoalTasks ) do + self:T2( { "GoalVerb", GoalVerb } ) + if self:Goal( GoalVerb ) then + local GoalToDo = self:GetGoalTotal( GoalVerb ) - self:GetGoalCount( GoalVerb ) + self:T2( "GoalToDo = " .. GoalToDo ) + if GoalToDo <= 0 then + else + GoalReached = false + break + end + else + break + end + end + + self:T( { GoalReached, self.GoalTasks } ) + return GoalReached +end + +--- Adds an Additional Goal for the TASK to be achieved. +-- @param string GoalVerb is the name of the Goal of the TASK. +-- @param string GoalTask is a text describing the Goal of the TASK to be achieved. +-- @param number GoalIncrease is a number by which the Goal achievement is increasing. +function TASK:AddGoalCompletion( GoalVerb, GoalTask, GoalIncrease ) + self:F2( { GoalVerb, GoalTask, GoalIncrease } ) + + if self:Goal( GoalVerb ) then + self.GoalTasks[GoalVerb].Goals[#self.GoalTasks[GoalVerb].Goals+1] = GoalTask + self.GoalTasks[GoalVerb].GoalCount = self.GoalTasks[GoalVerb].GoalCount + GoalIncrease + end + return self +end + +--- Returns if the additional Goal for the TASK was completed. +-- @param ?string GoalVerb is the name of the Goal of the TASK. If the GoalVerb is not given, then the default TASK Goals will be used. +-- @return string Goals +function TASK:GetGoalCompletion( GoalVerb ) + self:F2( { GoalVerb } ) + + if self:Goal( GoalVerb ) then + local Goals = "" + for GoalID, GoalName in pairs( self.GoalTasks[GoalVerb].Goals ) do Goals = Goals .. GoalName .. " + " end + return Goals:gsub(" + $", ""), self.GoalTasks[GoalVerb].GoalCount + end +end + +function TASK.MenuAction( Parameter ) + Parameter.ReferenceTask.ExecuteStage = _TransportExecuteStage.EXECUTING + Parameter.ReferenceTask.Cargo = Parameter.CargoTask +end + +function TASK:StageExecute() + self:F() + + local Execute = false + + if self.Frequency == STAGE.FREQUENCY.REPEAT then + Execute = true + elseif self.Frequency == STAGE.FREQUENCY.NONE then + Execute = false + elseif self.Frequency >= 0 then + Execute = true + self.Frequency = self.Frequency - 1 + end + + return Execute + +end + +--- Work function to set signal events within a TASK. +function TASK:AddSignal( SignalUnitNames, SignalType, SignalColor, SignalHeight ) + self:F() + + local Valid = true + + if Valid then + if type( SignalUnitNames ) == "table" then + self.LandingZoneSignalUnitNames = SignalUnitNames + else + self.LandingZoneSignalUnitNames = { SignalUnitNames } + end + self.LandingZoneSignalType = SignalType + self.LandingZoneSignalColor = SignalColor + self.Signalled = false + if SignalHeight ~= nil then + self.LandingZoneSignalHeight = SignalHeight + else + self.LandingZoneSignalHeight = 0 + end + + if self.TaskBriefing then + self.TaskBriefing = self.TaskBriefing .. " " .. SignalColor.TEXT .. " " .. SignalType.TEXT .. " will be fired when entering the landing zone." + end + end + + return Valid +end + +--- When the CLIENT is approaching the landing zone, a RED SMOKE will be fired by an optional SignalUnitNames. +-- @param table|string SignalUnitNames Name of the Group that will fire the signal. If this parameter is NIL, the signal will be fired from the center of the landing zone. +-- @param number SignalHeight Altitude that the Signal should be fired... +function TASK:AddSmokeRed( SignalUnitNames, SignalHeight ) + self:F() + self:AddSignal( SignalUnitNames, TASK.SIGNAL.TYPE.SMOKE, TASK.SIGNAL.COLOR.RED, SignalHeight ) +end + +--- When the CLIENT is approaching the landing zone, a GREEN SMOKE will be fired by an optional SignalUnitNames. +-- @param table|string SignalUnitNames Name of the Group that will fire the signal. If this parameter is NIL, the signal will be fired from the center of the landing zone. +-- @param number SignalHeight Altitude that the Signal should be fired... +function TASK:AddSmokeGreen( SignalUnitNames, SignalHeight ) + self:F() + self:AddSignal( SignalUnitNames, TASK.SIGNAL.TYPE.SMOKE, TASK.SIGNAL.COLOR.GREEN, SignalHeight ) +end + +--- When the CLIENT is approaching the landing zone, a BLUE SMOKE will be fired by an optional SignalUnitNames. +-- @param table|string SignalUnitNames Name of the Group that will fire the signal. If this parameter is NIL, the signal will be fired from the center of the landing zone. +-- @param number SignalHeight Altitude that the Signal should be fired... +function TASK:AddSmokeBlue( SignalUnitNames, SignalHeight ) + self:F() + self:AddSignal( SignalUnitNames, TASK.SIGNAL.TYPE.SMOKE, TASK.SIGNAL.COLOR.BLUE, SignalHeight ) +end + +--- When the CLIENT is approaching the landing zone, a WHITE SMOKE will be fired by an optional SignalUnitNames. +-- @param table|string SignalUnitNames Name of the Group that will fire the signal. If this parameter is NIL, the signal will be fired from the center of the landing zone. +-- @param number SignalHeight Altitude that the Signal should be fired... +function TASK:AddSmokeWhite( SignalUnitNames, SignalHeight ) + self:F() + self:AddSignal( SignalUnitNames, TASK.SIGNAL.TYPE.SMOKE, TASK.SIGNAL.COLOR.WHITE, SignalHeight ) +end + +--- When the CLIENT is approaching the landing zone, an ORANGE SMOKE will be fired by an optional SignalUnitNames. +-- @param table|string SignalUnitNames Name of the Group that will fire the signal. If this parameter is NIL, the signal will be fired from the center of the landing zone. +-- @param number SignalHeight Altitude that the Signal should be fired... +function TASK:AddSmokeOrange( SignalUnitNames, SignalHeight ) + self:F() + self:AddSignal( SignalUnitNames, TASK.SIGNAL.TYPE.SMOKE, TASK.SIGNAL.COLOR.ORANGE, SignalHeight ) +end + +--- When the CLIENT is approaching the landing zone, a RED FLARE will be fired by an optional SignalUnitNames. +-- @param table|string SignalUnitNames Name of the Group that will fire the signal. If this parameter is NIL, the signal will be fired from the center of the landing zone. +-- @param number SignalHeight Altitude that the Signal should be fired... +function TASK:AddFlareRed( SignalUnitNames, SignalHeight ) + self:F() + self:AddSignal( SignalUnitNames, TASK.SIGNAL.TYPE.FLARE, TASK.SIGNAL.COLOR.RED, SignalHeight ) +end + +--- When the CLIENT is approaching the landing zone, a GREEN FLARE will be fired by an optional SignalUnitNames. +-- @param table|string SignalUnitNames Name of the Group that will fire the signal. If this parameter is NIL, the signal will be fired from the center of the landing zone. +-- @param number SignalHeight Altitude that the Signal should be fired... +function TASK:AddFlareGreen( SignalUnitNames, SignalHeight ) + self:F() + self:AddSignal( SignalUnitNames, TASK.SIGNAL.TYPE.FLARE, TASK.SIGNAL.COLOR.GREEN, SignalHeight ) +end + +--- When the CLIENT is approaching the landing zone, a BLUE FLARE will be fired by an optional SignalUnitNames. +-- @param table|string SignalUnitNames Name of the Group that will fire the signal. If this parameter is NIL, the signal will be fired from the center of the landing zone. +-- @param number SignalHeight Altitude that the Signal should be fired... +function TASK:AddFlareBlue( SignalUnitNames, SignalHeight ) + self:F() + self:AddSignal( SignalUnitNames, TASK.SIGNAL.TYPE.FLARE, TASK.SIGNAL.COLOR.BLUE, SignalHeight ) +end + +--- When the CLIENT is approaching the landing zone, a WHITE FLARE will be fired by an optional SignalUnitNames. +-- @param table|string SignalUnitNames Name of the Group that will fire the signal. If this parameter is NIL, the signal will be fired from the center of the landing zone. +-- @param number SignalHeight Altitude that the Signal should be fired... +function TASK:AddFlareWhite( SignalUnitNames, SignalHeight ) + self:F() + self:AddSignal( SignalUnitNames, TASK.SIGNAL.TYPE.FLARE, TASK.SIGNAL.COLOR.WHITE, SignalHeight ) +end + +--- When the CLIENT is approaching the landing zone, an ORANGE FLARE will be fired by an optional SignalUnitNames. +-- @param table|string SignalUnitNames Name of the Group that will fire the signal. If this parameter is NIL, the signal will be fired from the center of the landing zone. +-- @param number SignalHeight Altitude that the Signal should be fired... +function TASK:AddFlareOrange( SignalUnitNames, SignalHeight ) + self:F() + self:AddSignal( SignalUnitNames, TASK.SIGNAL.TYPE.FLARE, TASK.SIGNAL.COLOR.ORANGE, SignalHeight ) +end +--- A GOHOMETASK orchestrates the travel back to the home base, which is a specific zone defined within the ME. +-- @module GOHOMETASK + +Include.File("Task") + +--- The GOHOMETASK class +-- @type +GOHOMETASK = { + ClassName = "GOHOMETASK", +} + +--- Creates a new GOHOMETASK. +-- @param table{string,...}|string LandingZones Table of Landing Zone names where Home(s) are located. +-- @return GOHOMETASK +function GOHOMETASK:New( LandingZones ) + local self = BASE:Inherit( self, TASK:New() ) + self:F( { LandingZones } ) + local Valid = true + + Valid = routines.ValidateZone( LandingZones, "LandingZones", Valid ) + + if Valid then + self.Name = 'Fly Home' + self.TaskBriefing = "Task: Fly back to your home base. Your co-pilot will provide you with the directions (required flight angle in degrees) and the distance (in km) to your home base." + if type( LandingZones ) == "table" then + self.LandingZones = LandingZones + else + self.LandingZones = { LandingZones } + end + self.Stages = { STAGEBRIEF:New(), STAGESTART:New(), STAGEROUTE:New(), STAGEARRIVE:New(), STAGEDONE:New() } + self.SetStage( self, 1 ) + end + + return self +end +--- A DESTROYBASETASK will monitor the destruction of Groups and Units. This is a BASE class, other classes are derived from this class. +-- @module DESTROYBASETASK +-- @see DESTROYGROUPSTASK +-- @see DESTROYUNITTYPESTASK +-- @see DESTROY_RADARS_TASK + +Include.File("Task") + +--- The DESTROYBASETASK class +-- @type DESTROYBASETASK +DESTROYBASETASK = { + ClassName = "DESTROYBASETASK", + Destroyed = 0, + GoalVerb = "Destroy", + DestroyPercentage = 100, +} + +--- Creates a new DESTROYBASETASK. +-- @param #DESTROYBASETASK self +-- @param #string DestroyGroupType Text describing the group to be destroyed. f.e. "Radar Installations", "Ships", "Vehicles", "Command Centers". +-- @param #string DestroyUnitType Text describing the unit types to be destroyed. f.e. "SA-6", "Row Boats", "Tanks", "Tents". +-- @param #list<#string> DestroyGroupPrefixes Table of Prefixes of the Groups to be destroyed before task is completed. +-- @param #number DestroyPercentage defines the %-tage that needs to be destroyed to achieve mission success. eg. If in the Group there are 10 units, then a value of 75 would require 8 units to be destroyed from the Group to complete the @{TASK}. +-- @return DESTROYBASETASK +function DESTROYBASETASK:New( DestroyGroupType, DestroyUnitType, DestroyGroupPrefixes, DestroyPercentage ) + local self = BASE:Inherit( self, TASK:New() ) + self:F() + + self.Name = 'Destroy' + self.Destroyed = 0 + self.DestroyGroupPrefixes = DestroyGroupPrefixes + self.DestroyGroupType = DestroyGroupType + self.DestroyUnitType = DestroyUnitType + if DestroyPercentage then + self.DestroyPercentage = DestroyPercentage + end + self.TaskBriefing = "Task: Destroy " .. DestroyGroupType .. "." + self.Stages = { STAGEBRIEF:New(), STAGESTART:New(), STAGEGROUPSDESTROYED:New(), STAGEDONE:New() } + self.SetStage( self, 1 ) + + return self +end + +--- Handle the S_EVENT_DEAD events to validate the destruction of units for the task monitoring. +-- @param #DESTROYBASETASK self +-- @param Event#EVENTDATA Event structure of MOOSE. +function DESTROYBASETASK:EventDead( Event ) + self:F( { Event } ) + + if Event.IniDCSUnit then + local DestroyUnit = Event.IniDCSUnit + local DestroyUnitName = Event.IniDCSUnitName + local DestroyGroup = Event.IniDCSGroup + local DestroyGroupName = Event.IniDCSGroupName + + --TODO: I need to fix here if 2 groups in the mission have a similar name with GroupPrefix equal, then i should differentiate for which group the goal was reached! + --I may need to test if for the goalverb that group goal was reached or something. Need to think about it a bit more ... + local UnitsDestroyed = 0 + for DestroyGroupPrefixID, DestroyGroupPrefix in pairs( self.DestroyGroupPrefixes ) do + self:T( DestroyGroupPrefix ) + if string.find( DestroyGroupName, DestroyGroupPrefix, 1, true ) then + self:T( BASE:Inherited(self).ClassName ) + UnitsDestroyed = self:ReportGoalProgress( DestroyGroup, DestroyUnit ) + self:T( UnitsDestroyed ) + end + end + + self:T( { UnitsDestroyed } ) + self:IncreaseGoalCount( UnitsDestroyed, self.GoalVerb ) + end + +end + +--- Validate task completeness of DESTROYBASETASK. +-- @param DestroyGroup Group structure describing the group to be evaluated. +-- @param DestroyUnit Unit structure describing the Unit to be evaluated. +function DESTROYBASETASK:ReportGoalProgress( DestroyGroup, DestroyUnit ) + self:F() + + return 0 +end +--- DESTROYGROUPSTASK +-- @module DESTROYGROUPSTASK + +Include.File("DestroyBaseTask") + +--- The DESTROYGROUPSTASK class +-- @type +DESTROYGROUPSTASK = { + ClassName = "DESTROYGROUPSTASK", + GoalVerb = "Destroy Groups", +} + +--- Creates a new DESTROYGROUPSTASK. +-- @param #DESTROYGROUPSTASK self +-- @param #string DestroyGroupType String describing the group to be destroyed. +-- @param #string DestroyUnitType String describing the unit to be destroyed. +-- @param #list<#string> DestroyGroupNames Table of string containing the name of the groups to be destroyed before task is completed. +-- @param #number DestroyPercentage defines the %-tage that needs to be destroyed to achieve mission success. eg. If in the Group there are 10 units, then a value of 75 would require 8 units to be destroyed from the Group to complete the @{TASK}. +---@return DESTROYGROUPSTASK +function DESTROYGROUPSTASK:New( DestroyGroupType, DestroyUnitType, DestroyGroupNames, DestroyPercentage ) + local self = BASE:Inherit( self, DESTROYBASETASK:New( DestroyGroupType, DestroyUnitType, DestroyGroupNames, DestroyPercentage ) ) + self:F() + + self.Name = 'Destroy Groups' + self.GoalVerb = "Destroy " .. DestroyGroupType + + _EVENTDISPATCHER:OnDead( self.EventDead , self ) + _EVENTDISPATCHER:OnCrash( self.EventDead , self ) + + return self +end + +--- Report Goal Progress. +-- @param #DESTROYGROUPSTASK self +-- @param DCSGroup#Group DestroyGroup Group structure describing the group to be evaluated. +-- @param DCSUnit#Unit DestroyUnit Unit structure describing the Unit to be evaluated. +-- @return #number The DestroyCount reflecting the amount of units destroyed within the group. +function DESTROYGROUPSTASK:ReportGoalProgress( DestroyGroup, DestroyUnit ) + self:F( { DestroyGroup, DestroyUnit, self.DestroyPercentage } ) + + local DestroyGroupSize = DestroyGroup:getSize() - 1 -- When a DEAD event occurs, the getSize is still one larger than the destroyed unit. + local DestroyGroupInitialSize = DestroyGroup:getInitialSize() + self:T( { DestroyGroupSize, DestroyGroupInitialSize - ( DestroyGroupInitialSize * self.DestroyPercentage / 100 ) } ) + + local DestroyCount = 0 + if DestroyGroup then + if DestroyGroupSize <= DestroyGroupInitialSize - ( DestroyGroupInitialSize * self.DestroyPercentage / 100 ) then + DestroyCount = 1 + end + else + DestroyCount = 1 + end + + self:T( DestroyCount ) + + return DestroyCount +end +--- Task class to destroy radar installations. +-- @module DESTROYRADARSTASK + +Include.File("DestroyBaseTask") + +--- The DESTROYRADARS class +-- @type +DESTROYRADARSTASK = { + ClassName = "DESTROYRADARSTASK", + GoalVerb = "Destroy Radars" +} + +--- Creates a new DESTROYRADARSTASK. +-- @param table{string,...} DestroyGroupNames Table of string containing the group names of which the radars are be destroyed. +-- @return DESTROYRADARSTASK +function DESTROYRADARSTASK:New( DestroyGroupNames ) + local self = BASE:Inherit( self, DESTROYGROUPSTASK:New( 'radar installations', 'radars', DestroyGroupNames ) ) + self:F() + + self.Name = 'Destroy Radars' + + _EVENTDISPATCHER:OnDead( self.EventDead , self ) + + return self +end + +--- Report Goal Progress. +-- @param Group DestroyGroup Group structure describing the group to be evaluated. +-- @param Unit DestroyUnit Unit structure describing the Unit to be evaluated. +function DESTROYRADARSTASK:ReportGoalProgress( DestroyGroup, DestroyUnit ) + self:F( { DestroyGroup, DestroyUnit } ) + + local DestroyCount = 0 + if DestroyUnit and DestroyUnit:hasSensors( Unit.SensorType.RADAR, Unit.RadarType.AS ) then + if DestroyUnit and DestroyUnit:getLife() <= 1.0 then + self:T( 'Destroyed a radar' ) + DestroyCount = 1 + end + end + return DestroyCount +end +--- Set TASK to destroy certain unit types. +-- @module DESTROYUNITTYPESTASK + +Include.File("DestroyBaseTask") + +--- The DESTROYUNITTYPESTASK class +-- @type +DESTROYUNITTYPESTASK = { + ClassName = "DESTROYUNITTYPESTASK", + GoalVerb = "Destroy", +} + +--- Creates a new DESTROYUNITTYPESTASK. +-- @param string DestroyGroupType String describing the group to be destroyed. f.e. "Radar Installations", "Fleet", "Batallion", "Command Centers". +-- @param string DestroyUnitType String describing the unit to be destroyed. f.e. "radars", "ships", "tanks", "centers". +-- @param table{string,...} DestroyGroupNames Table of string containing the group names of which the radars are be destroyed. +-- @param string DestroyUnitTypes Table of string containing the type names of the units to achieve mission success. +-- @return DESTROYUNITTYPESTASK +function DESTROYUNITTYPESTASK:New( DestroyGroupType, DestroyUnitType, DestroyGroupNames, DestroyUnitTypes ) + local self = BASE:Inherit( self, DESTROYBASETASK:New( DestroyGroupType, DestroyUnitType, DestroyGroupNames ) ) + self:F( { DestroyGroupType, DestroyUnitType, DestroyGroupNames, DestroyUnitTypes } ) + + if type(DestroyUnitTypes) == 'table' then + self.DestroyUnitTypes = DestroyUnitTypes + else + self.DestroyUnitTypes = { DestroyUnitTypes } + end + + self.Name = 'Destroy Unit Types' + self.GoalVerb = "Destroy " .. DestroyGroupType + + _EVENTDISPATCHER:OnDead( self.EventDead , self ) + + return self +end + +--- Report Goal Progress. +-- @param Group DestroyGroup Group structure describing the group to be evaluated. +-- @param Unit DestroyUnit Unit structure describing the Unit to be evaluated. +function DESTROYUNITTYPESTASK:ReportGoalProgress( DestroyGroup, DestroyUnit ) + self:F( { DestroyGroup, DestroyUnit } ) + + local DestroyCount = 0 + for UnitTypeID, UnitType in pairs( self.DestroyUnitTypes ) do + if DestroyUnit and DestroyUnit:getTypeName() == UnitType then + if DestroyUnit and DestroyUnit:getLife() <= 1.0 then + DestroyCount = DestroyCount + 1 + end + end + end + return DestroyCount +end +--- A PICKUPTASK orchestrates the loading of CARGO at a specific landing zone. +-- @module PICKUPTASK +-- @parent TASK + +Include.File("Task") +Include.File("Cargo") + +--- The PICKUPTASK class +-- @type +PICKUPTASK = { + ClassName = "PICKUPTASK", + TEXT = { "Pick-Up", "picked-up", "loaded" }, + GoalVerb = "Pick-Up" +} + +--- Creates a new PICKUPTASK. +-- @param table{string,...}|string LandingZones Table of Zone names where Cargo is to be loaded. +-- @param CARGO_TYPE CargoType Type of the Cargo. The type must be of the following Enumeration:.. +-- @param number OnBoardSide Reflects from which side the cargo Group will be on-boarded on the Carrier. +function PICKUPTASK:New( CargoType, OnBoardSide ) + local self = BASE:Inherit( self, TASK:New() ) + self:F() + + -- self holds the inherited instance of the PICKUPTASK Class to the BASE class. + + local Valid = true + + if Valid then + self.Name = 'Pickup Cargo' + self.TaskBriefing = "Task: Fly to the indicated landing zones and pickup " .. CargoType .. ". Your co-pilot will provide you with the directions (required flight angle in degrees) and the distance (in km) to the pickup zone." + self.CargoType = CargoType + self.GoalVerb = CargoType .. " " .. self.GoalVerb + self.OnBoardSide = OnBoardSide + self.IsLandingRequired = true -- required to decide whether the client needs to land or not + self.IsSlingLoad = false -- Indicates whether the cargo is a sling load cargo + self.Stages = { STAGE_CARGO_INIT:New(), STAGE_CARGO_LOAD:New(), STAGEBRIEF:New(), STAGESTART:New(), STAGEROUTE:New(), STAGELANDING:New(), STAGELANDED:New(), STAGELOAD:New(), STAGEDONE:New() } + self.SetStage( self, 1 ) + end + + return self +end + +function PICKUPTASK:FromZone( LandingZone ) + self:F() + + self.LandingZones.LandingZoneNames[LandingZone.CargoZoneName] = LandingZone.CargoZoneName + self.LandingZones.LandingZones[LandingZone.CargoZoneName] = LandingZone + + return self +end + +function PICKUPTASK:InitCargo( InitCargos ) + self:F( { InitCargos } ) + + if type( InitCargos ) == "table" then + self.Cargos.InitCargos = InitCargos + else + self.Cargos.InitCargos = { InitCargos } + end + + return self +end + +function PICKUPTASK:LoadCargo( LoadCargos ) + self:F( { LoadCargos } ) + + if type( LoadCargos ) == "table" then + self.Cargos.LoadCargos = LoadCargos + else + self.Cargos.LoadCargos = { LoadCargos } + end + + return self +end + +function PICKUPTASK:AddCargoMenus( Client, Cargos, TransportRadius ) + self:F() + + for CargoID, Cargo in pairs( Cargos ) do + + self:T( { Cargo.ClassName, Cargo.CargoName, Cargo.CargoType, Cargo:IsStatusNone(), Cargo:IsStatusLoaded(), Cargo:IsStatusLoading(), Cargo:IsStatusUnLoaded() } ) + + -- If the Cargo has no status, allow the menu option. + if Cargo:IsStatusNone() or ( Cargo:IsStatusLoading() and Client == Cargo:IsLoadingToClient() ) then + + local MenuAdd = false + if Cargo:IsNear( Client, self.CurrentCargoZone ) then + MenuAdd = true + end + + if MenuAdd then + if Client._Menus[Cargo.CargoType] == nil then + Client._Menus[Cargo.CargoType] = {} + end + + if not Client._Menus[Cargo.CargoType].PickupMenu then + Client._Menus[Cargo.CargoType].PickupMenu = missionCommands.addSubMenuForGroup( + Client:GetClientGroupID(), + self.TEXT[1] .. " " .. Cargo.CargoType, + nil + ) + self:T( 'Added PickupMenu: ' .. self.TEXT[1] .. " " .. Cargo.CargoType ) + end + + if Client._Menus[Cargo.CargoType].PickupSubMenus == nil then + Client._Menus[Cargo.CargoType].PickupSubMenus = {} + end + + Client._Menus[Cargo.CargoType].PickupSubMenus[ #Client._Menus[Cargo.CargoType].PickupSubMenus + 1 ] = missionCommands.addCommandForGroup( + Client:GetClientGroupID(), + Cargo.CargoName .. " ( " .. Cargo.CargoWeight .. "kg )", + Client._Menus[Cargo.CargoType].PickupMenu, + self.MenuAction, + { ReferenceTask = self, CargoTask = Cargo } + ) + self:T( 'Added PickupSubMenu' .. Cargo.CargoType .. ":" .. Cargo.CargoName .. " ( " .. Cargo.CargoWeight .. "kg )" ) + end + end + end + +end + +function PICKUPTASK:RemoveCargoMenus( Client ) + self:F() + + for MenuID, MenuData in pairs( Client._Menus ) do + for SubMenuID, SubMenuData in pairs( MenuData.PickupSubMenus ) do + missionCommands.removeItemForGroup( Client:GetClientGroupID(), SubMenuData ) + self:T( "Removed PickupSubMenu " ) + SubMenuData = nil + end + if MenuData.PickupMenu then + missionCommands.removeItemForGroup( Client:GetClientGroupID(), MenuData.PickupMenu ) + self:T( "Removed PickupMenu " ) + MenuData.PickupMenu = nil + end + end + + for CargoID, Cargo in pairs( CARGOS ) do + self:T( { Cargo.ClassName, Cargo.CargoName, Cargo.CargoType, Cargo:IsStatusNone(), Cargo:IsStatusLoaded(), Cargo:IsStatusLoading(), Cargo:IsStatusUnLoaded() } ) + if Cargo:IsStatusLoading() and Client == Cargo:IsLoadingToClient() then + Cargo:StatusNone() + end + end + +end + + + +function PICKUPTASK:HasFailed( ClientDead ) + self:F() + + local TaskHasFailed = self.TaskFailed + return TaskHasFailed +end + +--- A DEPLOYTASK orchestrates the deployment of CARGO within a specific landing zone. +-- @module DEPLOYTASK + +Include.File( "Task" ) + +--- A DeployTask +-- @type DEPLOYTASK +DEPLOYTASK = { + ClassName = "DEPLOYTASK", + TEXT = { "Deploy", "deployed", "unloaded" }, + GoalVerb = "Deployment" +} + + +--- Creates a new DEPLOYTASK object, which models the sequence of STAGEs to unload a cargo. +-- @function [parent=#DEPLOYTASK] New +-- @param #string CargoType Type of the Cargo. +-- @return #DEPLOYTASK The created DeployTask +function DEPLOYTASK:New( CargoType ) + local self = BASE:Inherit( self, TASK:New() ) + self:F() + + local Valid = true + + if Valid then + self.Name = 'Deploy Cargo' + self.TaskBriefing = "Fly to one of the indicated landing zones and deploy " .. CargoType .. ". Your co-pilot will provide you with the directions (required flight angle in degrees) and the distance (in km) to the deployment zone." + self.CargoType = CargoType + self.GoalVerb = CargoType .. " " .. self.GoalVerb + self.Stages = { STAGE_CARGO_INIT:New(), STAGE_CARGO_LOAD:New(), STAGEBRIEF:New(), STAGESTART:New(), STAGEROUTE:New(), STAGELANDING:New(), STAGELANDED:New(), STAGEUNLOAD:New(), STAGEDONE:New() } + self.SetStage( self, 1 ) + end + + return self +end + +function DEPLOYTASK:ToZone( LandingZone ) + self:F() + + self.LandingZones.LandingZoneNames[LandingZone.CargoZoneName] = LandingZone.CargoZoneName + self.LandingZones.LandingZones[LandingZone.CargoZoneName] = LandingZone + + return self +end + + +function DEPLOYTASK:InitCargo( InitCargos ) + self:F( { InitCargos } ) + + if type( InitCargos ) == "table" then + self.Cargos.InitCargos = InitCargos + else + self.Cargos.InitCargos = { InitCargos } + end + + return self +end + + +function DEPLOYTASK:LoadCargo( LoadCargos ) + self:F( { LoadCargos } ) + + if type( LoadCargos ) == "table" then + self.Cargos.LoadCargos = LoadCargos + else + self.Cargos.LoadCargos = { LoadCargos } + end + + return self +end + + +--- When the cargo is unloaded, it will move to the target zone name. +-- @param string TargetZoneName Name of the Zone to where the Cargo should move after unloading. +function DEPLOYTASK:SetCargoTargetZoneName( TargetZoneName ) + self:F() + + local Valid = true + + Valid = routines.ValidateString( TargetZoneName, "TargetZoneName", Valid ) + + if Valid then + self.TargetZoneName = TargetZoneName + end + + return Valid + +end + +function DEPLOYTASK:AddCargoMenus( Client, Cargos, TransportRadius ) + self:F() + + local ClientGroupID = Client:GetClientGroupID() + + self:T( ClientGroupID ) + + for CargoID, Cargo in pairs( Cargos ) do + + self:T( { Cargo.ClassName, Cargo.CargoName, Cargo.CargoType, Cargo.CargoWeight } ) + + if Cargo:IsStatusLoaded() and Client == Cargo:IsLoadedInClient() then + + if Client._Menus[Cargo.CargoType] == nil then + Client._Menus[Cargo.CargoType] = {} + end + + if not Client._Menus[Cargo.CargoType].DeployMenu then + Client._Menus[Cargo.CargoType].DeployMenu = missionCommands.addSubMenuForGroup( + ClientGroupID, + self.TEXT[1] .. " " .. Cargo.CargoType, + nil + ) + self:T( 'Added DeployMenu ' .. self.TEXT[1] ) + end + + if Client._Menus[Cargo.CargoType].DeploySubMenus == nil then + Client._Menus[Cargo.CargoType].DeploySubMenus = {} + end + + if Client._Menus[Cargo.CargoType].DeployMenu == nil then + self:T( 'deploymenu is nil' ) + end + + Client._Menus[Cargo.CargoType].DeploySubMenus[ #Client._Menus[Cargo.CargoType].DeploySubMenus + 1 ] = missionCommands.addCommandForGroup( + ClientGroupID, + Cargo.CargoName .. " ( " .. Cargo.CargoWeight .. "kg )", + Client._Menus[Cargo.CargoType].DeployMenu, + self.MenuAction, + { ReferenceTask = self, CargoTask = Cargo } + ) + self:T( 'Added DeploySubMenu ' .. Cargo.CargoType .. ":" .. Cargo.CargoName .. " ( " .. Cargo.CargoWeight .. "kg )" ) + end + end + +end + +function DEPLOYTASK:RemoveCargoMenus( Client ) + self:F() + + local ClientGroupID = Client:GetClientGroupID() + self:T( ClientGroupID ) + + for MenuID, MenuData in pairs( Client._Menus ) do + if MenuData.DeploySubMenus ~= nil then + for SubMenuID, SubMenuData in pairs( MenuData.DeploySubMenus ) do + missionCommands.removeItemForGroup( ClientGroupID, SubMenuData ) + self:T( "Removed DeploySubMenu " ) + SubMenuData = nil + end + end + if MenuData.DeployMenu then + missionCommands.removeItemForGroup( ClientGroupID, MenuData.DeployMenu ) + self:T( "Removed DeployMenu " ) + MenuData.DeployMenu = nil + end + end + +end +--- A NOTASK is a dummy activity... But it will show a Mission Briefing... +-- @module NOTASK + +Include.File("Task") + +--- The NOTASK class +-- @type +NOTASK = { + ClassName = "NOTASK", +} + +--- Creates a new NOTASK. +function NOTASK:New() + local self = BASE:Inherit( self, TASK:New() ) + self:F() + + local Valid = true + + if Valid then + self.Name = 'Nothing' + self.TaskBriefing = "Task: Execute your mission." + self.Stages = { STAGEBRIEF:New(), STAGESTART:New(), STAGEDONE:New() } + self.SetStage( self, 1 ) + end + + return self +end +--- A ROUTETASK orchestrates the travel to a specific zone defined within the ME. +-- @module ROUTETASK + +--- The ROUTETASK class +-- @type +ROUTETASK = { + ClassName = "ROUTETASK", + GoalVerb = "Route", +} + +--- Creates a new ROUTETASK. +-- @param table{sring,...}|string LandingZones Table of Zone Names where the target is located. +-- @param string TaskBriefing (optional) Defines a text describing the briefing of the task. +-- @return ROUTETASK +function ROUTETASK:New( LandingZones, TaskBriefing ) + local self = BASE:Inherit( self, TASK:New() ) + self:F( { LandingZones, TaskBriefing } ) + + local Valid = true + + Valid = routines.ValidateZone( LandingZones, "LandingZones", Valid ) + + if Valid then + self.Name = 'Route To Zone' + if TaskBriefing then + self.TaskBriefing = TaskBriefing .. " Your co-pilot will provide you with the directions (required flight angle in degrees) and the distance (in km) to the target objective." + else + self.TaskBriefing = "Task: Fly to specified zone(s). Your co-pilot will provide you with the directions (required flight angle in degrees) and the distance (in km) to the target objective." + end + if type( LandingZones ) == "table" then + self.LandingZones = LandingZones + else + self.LandingZones = { LandingZones } + end + self.Stages = { STAGEBRIEF:New(), STAGESTART:New(), STAGEROUTE:New(), STAGEARRIVE:New(), STAGEDONE:New() } + self.SetStage( self, 1 ) + end + + return self +end + +--- A MISSION is the main owner of a Mission orchestration within MOOSE . The Mission framework orchestrates @{CLIENT}s, @{TASK}s, @{STAGE}s etc. +-- A @{CLIENT} needs to be registered within the @{MISSION} through the function @{AddClient}. A @{TASK} needs to be registered within the @{MISSION} through the function @{AddTask}. +-- @module Mission + +Include.File( "Routines" ) +Include.File( "Base" ) +Include.File( "Client" ) +Include.File( "Task" ) + +--- The MISSION class +-- @type MISSION +-- @extends Base#BASE +-- @field #MISSION.Clients _Clients +-- @field #string MissionBriefing +MISSION = { + ClassName = "MISSION", + Name = "", + MissionStatus = "PENDING", + _Clients = {}, + _Tasks = {}, + _ActiveTasks = {}, + GoalFunction = nil, + MissionReportTrigger = 0, + MissionProgressTrigger = 0, + MissionReportShow = false, + MissionReportFlash = false, + MissionTimeInterval = 0, + MissionCoalition = "", + SUCCESS = 1, + FAILED = 2, + REPEAT = 3, + _GoalTasks = {} +} + +--- @type MISSION.Clients +-- @list + +function MISSION:Meta() + + local self = BASE:Inherit( self, BASE:New() ) + self:F() + + return self +end + +--- This is the main MISSION declaration method. Each Mission is like the master or a Mission orchestration between, Clients, Tasks, Stages etc. +-- @param string MissionName is the name of the mission. This name will be used to reference the status of each mission by the players. +-- @param string MissionPriority is a string indicating the "priority" of the Mission. f.e. "Primary", "Secondary" or "First", "Second". It is free format and up to the Mission designer to choose. There are no rules behind this field. +-- @param string MissionBriefing is a string indicating the mission briefing to be shown when a player joins a @{CLIENT}. +-- @param string MissionCoalition is a string indicating the coalition or party to which this mission belongs to. It is free format and can be chosen freely by the mission designer. Note that this field is not to be confused with the coalition concept of the ME. Examples of a Mission Coalition could be "NATO", "CCCP", "Intruders", "Terrorists"... +-- @return MISSION +-- @usage +-- -- Declare a few missions. +-- local Mission = MISSIONSCHEDULER.AddMission( 'Russia Transport Troops SA-6', 'Operational', 'Transport troops from the control center to one of the SA-6 SAM sites to activate their operation.', 'Russia' ) +-- local Mission = MISSIONSCHEDULER.AddMission( 'Patriots', 'Primary', 'Our intelligence reports that 3 Patriot SAM defense batteries are located near Ruisi, Kvarhiti and Gori.', 'Russia' ) +-- local Mission = MISSIONSCHEDULER.AddMission( 'Package Delivery', 'Operational', 'In order to be in full control of the situation, we need you to deliver a very important package at a secret location. Fly undetected through the NATO defenses and deliver the secret package. The secret agent is located at waypoint 4.', 'Russia' ) +-- local Mission = MISSIONSCHEDULER.AddMission( 'Rescue General', 'Tactical', 'Our intelligence has received a remote signal behind Gori. We believe it is a very important Russian General that was captured by Georgia. Go out there and rescue him! Ensure you stay out of the battle zone, keep south. Waypoint 4 is the location of our Russian General.', 'Russia' ) +-- local Mission = MISSIONSCHEDULER.AddMission( 'NATO Transport Troops', 'Operational', 'Transport 3 groups of air defense engineers from our barracks "Gold" and "Titan" to each patriot battery control center to activate our air defenses.', 'NATO' ) +-- local Mission = MISSIONSCHEDULER.AddMission( 'SA-6 SAMs', 'Primary', 'Our intelligence reports that 3 SA-6 SAM defense batteries are located near Didmukha, Khetagurov and Berula. Eliminate the Russian SAMs.', 'NATO' ) +-- local Mission = MISSIONSCHEDULER.AddMission( 'NATO Sling Load', 'Operational', 'Fly to the cargo pickup zone at Dzegvi or Kaspi, and sling the cargo to Soganlug airbase.', 'NATO' ) +-- local Mission = MISSIONSCHEDULER.AddMission( 'Rescue secret agent', 'Tactical', 'In order to be in full control of the situation, we need you to rescue a secret agent from the woods behind enemy lines. Avoid the Russian defenses and rescue the agent. Keep south until Khasuri, and keep your eyes open for any SAM presence. The agent is located at waypoint 4 on your kneeboard.', 'NATO' ) +function MISSION:New( MissionName, MissionPriority, MissionBriefing, MissionCoalition ) + + self = MISSION:Meta() + self:T({ MissionName, MissionPriority, MissionBriefing, MissionCoalition }) + + local Valid = true + + Valid = routines.ValidateString( MissionName, "MissionName", Valid ) + Valid = routines.ValidateString( MissionPriority, "MissionPriority", Valid ) + Valid = routines.ValidateString( MissionBriefing, "MissionBriefing", Valid ) + Valid = routines.ValidateString( MissionCoalition, "MissionCoalition", Valid ) + + if Valid then + self.Name = MissionName + self.MissionPriority = MissionPriority + self.MissionBriefing = MissionBriefing + self.MissionCoalition = MissionCoalition + end + + return self +end + +--- Returns if a Mission has completed. +-- @return bool +function MISSION:IsCompleted() + self:F() + return self.MissionStatus == "ACCOMPLISHED" +end + +--- Set a Mission to completed. +function MISSION:Completed() + self:F() + self.MissionStatus = "ACCOMPLISHED" + self:StatusToClients() +end + +--- Returns if a Mission is ongoing. +-- treturn bool +function MISSION:IsOngoing() + self:F() + return self.MissionStatus == "ONGOING" +end + +--- Set a Mission to ongoing. +function MISSION:Ongoing() + self:F() + self.MissionStatus = "ONGOING" + --self:StatusToClients() +end + +--- Returns if a Mission is pending. +-- treturn bool +function MISSION:IsPending() + self:F() + return self.MissionStatus == "PENDING" +end + +--- Set a Mission to pending. +function MISSION:Pending() + self:F() + self.MissionStatus = "PENDING" + self:StatusToClients() +end + +--- Returns if a Mission has failed. +-- treturn bool +function MISSION:IsFailed() + self:F() + return self.MissionStatus == "FAILED" +end + +--- Set a Mission to failed. +function MISSION:Failed() + self:F() + self.MissionStatus = "FAILED" + self:StatusToClients() +end + +--- Send the status of the MISSION to all Clients. +function MISSION:StatusToClients() + self:F() + if self.MissionReportFlash then + for ClientID, Client in pairs( self._Clients ) do + Client:Message( self.MissionCoalition .. ' "' .. self.Name .. '": ' .. self.MissionStatus .. '! ( ' .. self.MissionPriority .. ' mission ) ', 10, self.Name .. '/Status', "Mission Command: Mission Status") + end + end +end + +--- Handles the reporting. After certain time intervals, a MISSION report MESSAGE will be shown to All Players. +function MISSION:ReportTrigger() + self:F() + + if self.MissionReportShow == true then + self.MissionReportShow = false + return true + else + if self.MissionReportFlash == true then + if timer.getTime() >= self.MissionReportTrigger then + self.MissionReportTrigger = timer.getTime() + self.MissionTimeInterval + return true + else + return false + end + else + return false + end + end +end + +--- Report the status of all MISSIONs to all active Clients. +function MISSION:ReportToAll() + self:F() + + local AlivePlayers = '' + for ClientID, Client in pairs( self._Clients ) do + if Client:GetDCSGroup() then + if Client:GetClientGroupDCSUnit() then + if Client:GetClientGroupDCSUnit():getLife() > 0.0 then + if AlivePlayers == '' then + AlivePlayers = ' Players: ' .. Client:GetClientGroupDCSUnit():getPlayerName() + else + AlivePlayers = AlivePlayers .. ' / ' .. Client:GetClientGroupDCSUnit():getPlayerName() + end + end + end + end + end + local Tasks = self:GetTasks() + local TaskText = "" + for TaskID, TaskData in pairs( Tasks ) do + TaskText = TaskText .. " - Task " .. TaskID .. ": " .. TaskData.Name .. ": " .. TaskData:GetGoalProgress() .. "\n" + end + MESSAGE:New( self.MissionCoalition .. ' "' .. self.Name .. '": ' .. self.MissionStatus .. ' ( ' .. self.MissionPriority .. ' mission )' .. AlivePlayers .. "\n" .. TaskText:gsub("\n$",""), "Mission Command: Mission Report", 10, self.Name .. '/Status'):ToAll() +end + + +--- Add a goal function to a MISSION. Goal functions are called when a @{TASK} within a mission has been completed. +-- @param function GoalFunction is the function defined by the mission designer to evaluate whether a certain goal has been reached after a @{TASK} finishes within the @{MISSION}. A GoalFunction must accept 2 parameters: Mission, Client, which contains the current MISSION object and the current CLIENT object respectively. +-- @usage +-- PatriotActivation = { +-- { "US SAM Patriot Zerti", false }, +-- { "US SAM Patriot Zegduleti", false }, +-- { "US SAM Patriot Gvleti", false } +-- } +-- +-- function DeployPatriotTroopsGoal( Mission, Client ) +-- +-- +-- -- Check if the cargo is all deployed for mission success. +-- for CargoID, CargoData in pairs( Mission._Cargos ) do +-- if Group.getByName( CargoData.CargoGroupName ) then +-- CargoGroup = Group.getByName( CargoData.CargoGroupName ) +-- if CargoGroup then +-- -- Check if the cargo is ready to activate +-- CurrentLandingZoneID = routines.IsUnitInZones( CargoGroup:getUnits()[1], Mission:GetTask( 2 ).LandingZones ) -- The second task is the Deploytask to measure mission success upon +-- if CurrentLandingZoneID then +-- if PatriotActivation[CurrentLandingZoneID][2] == false then +-- -- Now check if this is a new Mission Task to be completed... +-- trigger.action.setGroupAIOn( Group.getByName( PatriotActivation[CurrentLandingZoneID][1] ) ) +-- PatriotActivation[CurrentLandingZoneID][2] = true +-- MessageToBlue( "Mission Command: Message to all airborne units! The " .. PatriotActivation[CurrentLandingZoneID][1] .. " is armed. Our air defenses are now stronger.", 60, "BLUE/PatriotDefense" ) +-- MessageToRed( "Mission Command: Our satellite systems are detecting additional NATO air defenses. To all airborne units: Take care!!!", 60, "RED/PatriotDefense" ) +-- Mission:GetTask( 2 ):AddGoalCompletion( "Patriots activated", PatriotActivation[CurrentLandingZoneID][1], 1 ) -- Register Patriot activation as part of mission goal. +-- end +-- end +-- end +-- end +-- end +-- end +-- +-- local Mission = MISSIONSCHEDULER.AddMission( 'NATO Transport Troops', 'Operational', 'Transport 3 groups of air defense engineers from our barracks "Gold" and "Titan" to each patriot battery control center to activate our air defenses.', 'NATO' ) +-- Mission:AddGoalFunction( DeployPatriotTroopsGoal ) +function MISSION:AddGoalFunction( GoalFunction ) + self:F() + self.GoalFunction = GoalFunction +end + +--- Register a new @{CLIENT} to participate within the mission. +-- @param CLIENT Client is the @{CLIENT} object. The object must have been instantiated with @{CLIENT:New}. +-- @return CLIENT +-- @usage +-- Add a number of Client objects to the Mission. +-- Mission:AddClient( CLIENT:FindByName( 'US UH-1H*HOT-Deploy Troops 1', 'Transport 3 groups of air defense engineers from our barracks "Gold" and "Titan" to each patriot battery control center to activate our air defenses.' ):Transport() ) +-- Mission:AddClient( CLIENT:FindByName( 'US UH-1H*RAMP-Deploy Troops 3', 'Transport 3 groups of air defense engineers from our barracks "Gold" and "Titan" to each patriot battery control center to activate our air defenses.' ):Transport() ) +-- Mission:AddClient( CLIENT:FindByName( 'US UH-1H*HOT-Deploy Troops 2', 'Transport 3 groups of air defense engineers from our barracks "Gold" and "Titan" to each patriot battery control center to activate our air defenses.' ):Transport() ) +-- Mission:AddClient( CLIENT:FindByName( 'US UH-1H*RAMP-Deploy Troops 4', 'Transport 3 groups of air defense engineers from our barracks "Gold" and "Titan" to each patriot battery control center to activate our air defenses.' ):Transport() ) +function MISSION:AddClient( Client ) + self:F( { Client } ) + + local Valid = true + + if Valid then + self._Clients[Client.ClientName] = Client + end + + return Client +end + +--- Find a @{CLIENT} object within the @{MISSION} by its ClientName. +-- @param CLIENT ClientName is a string defining the Client Group as defined within the ME. +-- @return CLIENT +-- @usage +-- -- Seach for Client "Bomber" within the Mission. +-- local BomberClient = Mission:FindClient( "Bomber" ) +function MISSION:FindClient( ClientName ) + self:F( { self._Clients[ClientName] } ) + return self._Clients[ClientName] +end + + +--- Register a @{TASK} to be completed within the @{MISSION}. Note that there can be multiple @{TASK}s registered to be completed. Each TASK can be set a certain Goal. The MISSION will not be completed until all Goals are reached. +-- @param TASK Task is the @{TASK} object. The object must have been instantiated with @{TASK:New} or any of its inherited @{TASK}s. +-- @param number TaskNumber is the sequence number of the TASK within the MISSION. This number does have to be chronological. +-- @return TASK +-- @usage +-- -- Define a few tasks for the Mission. +-- PickupZones = { "NATO Gold Pickup Zone", "NATO Titan Pickup Zone" } +-- PickupSignalUnits = { "NATO Gold Coordination Center", "NATO Titan Coordination Center" } +-- +-- -- Assign the Pickup Task +-- local PickupTask = PICKUPTASK:New( PickupZones, CARGO_TYPE.ENGINEERS, CLIENT.ONBOARDSIDE.LEFT ) +-- PickupTask:AddSmokeBlue( PickupSignalUnits ) +-- PickupTask:SetGoalTotal( 3 ) +-- Mission:AddTask( PickupTask, 1 ) +-- +-- -- Assign the Deploy Task +-- local PatriotActivationZones = { "US Patriot Battery 1 Activation", "US Patriot Battery 2 Activation", "US Patriot Battery 3 Activation" } +-- local PatriotActivationZonesSmokeUnits = { "US SAM Patriot - Battery 1 Control", "US SAM Patriot - Battery 2 Control", "US SAM Patriot - Battery 3 Control" } +-- local DeployTask = DEPLOYTASK:New( PatriotActivationZones, CARGO_TYPE.ENGINEERS ) +-- --DeployTask:SetCargoTargetZoneName( 'US Troops Attack ' .. math.random(2) ) +-- DeployTask:AddSmokeBlue( PatriotActivationZonesSmokeUnits ) +-- DeployTask:SetGoalTotal( 3 ) +-- DeployTask:SetGoalTotal( 3, "Patriots activated" ) +-- Mission:AddTask( DeployTask, 2 ) + +function MISSION:AddTask( Task, TaskNumber ) + self:F() + + self._Tasks[TaskNumber] = Task + self._Tasks[TaskNumber]:EnableEvents() + self._Tasks[TaskNumber].ID = TaskNumber + + return Task + end + +--- Get the TASK idenified by the TaskNumber from the Mission. This function is useful in GoalFunctions. +-- @param number TaskNumber is the number of the @{TASK} within the @{MISSION}. +-- @return TASK +-- @usage +-- -- Get Task 2 from the Mission. +-- Task2 = Mission:GetTask( 2 ) + +function MISSION:GetTask( TaskNumber ) + self:F() + + local Valid = true + + local Task = nil + + if type(TaskNumber) ~= "number" then + Valid = false + end + + if Valid then + Task = self._Tasks[TaskNumber] + end + + return Task +end + +--- Get all the TASKs from the Mission. This function is useful in GoalFunctions. +-- @return {TASK,...} Structure of TASKS with the @{TASK} number as the key. +-- @usage +-- -- Get Tasks from the Mission. +-- Tasks = Mission:GetTasks() +-- env.info( "Task 2 Completion = " .. Tasks[2]:GetGoalPercentage() .. "%" ) +function MISSION:GetTasks() + self:F() + + return self._Tasks +end + + +--[[ + _TransportExecuteStage: Defines the different stages of Transport unload/load execution. This table is internal and is used to control the validity of Transport load/unload timing. + + - _TransportExecuteStage.EXECUTING + - _TransportExecuteStage.SUCCESS + - _TransportExecuteStage.FAILED + +--]] +_TransportExecuteStage = { + NONE = 0, + EXECUTING = 1, + SUCCESS = 2, + FAILED = 3 +} + + +--- The MISSIONSCHEDULER is an OBJECT and is the main scheduler of ALL active MISSIONs registered within this scheduler. It's workings are considered internal and is automatically created when the Mission.lua file is included. +-- @type MISSIONSCHEDULER +-- @field #MISSIONSCHEDULER.MISSIONS Missions +MISSIONSCHEDULER = { + Missions = {}, + MissionCount = 0, + TimeIntervalCount = 0, + TimeIntervalShow = 150, + TimeSeconds = 14400, + TimeShow = 5 +} + +--- @type MISSIONSCHEDULER.MISSIONS +-- @list <#MISSION> Mission + +--- This is the main MISSIONSCHEDULER Scheduler function. It is considered internal and is automatically created when the Mission.lua file is included. +function MISSIONSCHEDULER.Scheduler() + + + -- loop through the missions in the TransportTasks + for MissionName, MissionData in pairs( MISSIONSCHEDULER.Missions ) do + + local Mission = MissionData -- #MISSION + + if not Mission:IsCompleted() then + + -- This flag will monitor if for this mission, there are clients alive. If this flag is still false at the end of the loop, the mission status will be set to Pending (if not Failed or Completed). + local ClientsAlive = false + + for ClientID, ClientData in pairs( Mission._Clients ) do + + local Client = ClientData -- Client#CLIENT + + if Client:IsAlive() then + + -- There is at least one Client that is alive... So the Mission status is set to Ongoing. + ClientsAlive = true + + -- If this Client was not registered as Alive before: + -- 1. We register the Client as Alive. + -- 2. We initialize the Client Tasks and make a link to the original Mission Task. + -- 3. We initialize the Cargos. + -- 4. We flag the Mission as Ongoing. + if not Client.ClientAlive then + Client.ClientAlive = true + Client.ClientBriefingShown = false + for TaskNumber, Task in pairs( Mission._Tasks ) do + -- Note that this a deepCopy. Each client must have their own Tasks with own Stages!!! + Client._Tasks[TaskNumber] = routines.utils.deepCopy( Mission._Tasks[TaskNumber] ) + -- Each MissionTask must point to the original Mission. + Client._Tasks[TaskNumber].MissionTask = Mission._Tasks[TaskNumber] + Client._Tasks[TaskNumber].Cargos = Mission._Tasks[TaskNumber].Cargos + Client._Tasks[TaskNumber].LandingZones = Mission._Tasks[TaskNumber].LandingZones + end + + Mission:Ongoing() + end + + + -- For each Client, check for each Task the state and evolve the mission. + -- This flag will indicate if the Task of the Client is Complete. + local TaskComplete = false + + for TaskNumber, Task in pairs( Client._Tasks ) do + + if not Task.Stage then + Task:SetStage( 1 ) + end + + + local TransportTime = timer.getTime() + + if not Task:IsDone() then + + if Task:Goal() then + Task:ShowGoalProgress( Mission, Client ) + end + + --env.info( 'Scheduler: Mission = ' .. Mission.Name .. ' / Client = ' .. Client.ClientName .. ' / Task = ' .. Task.Name .. ' / Stage = ' .. Task.ActiveStage .. ' - ' .. Task.Stage.Name .. ' - ' .. Task.Stage.StageType ) + + -- Action + if Task:StageExecute() then + Task.Stage:Execute( Mission, Client, Task ) + end + + -- Wait until execution is finished + if Task.ExecuteStage == _TransportExecuteStage.EXECUTING then + Task.Stage:Executing( Mission, Client, Task ) + end + + -- Validate completion or reverse to earlier stage + if Task.Time + Task.Stage.WaitTime <= TransportTime then + Task:SetStage( Task.Stage:Validate( Mission, Client, Task ) ) + end + + if Task:IsDone() then + --env.info( 'Scheduler: Mission '.. Mission.Name .. ' Task ' .. Task.Name .. ' Stage ' .. Task.Stage.Name .. ' done. TaskComplete = ' .. string.format ( "%s", TaskComplete and "true" or "false" ) ) + TaskComplete = true -- when a task is not yet completed, a mission cannot be completed + + else + -- break only if this task is not yet done, so that future task are not yet activated. + TaskComplete = false -- when a task is not yet completed, a mission cannot be completed + --env.info( 'Scheduler: Mission "'.. Mission.Name .. '" Task "' .. Task.Name .. '" Stage "' .. Task.Stage.Name .. '" break. TaskComplete = ' .. string.format ( "%s", TaskComplete and "true" or "false" ) ) + break + end + + if TaskComplete then + + if Mission.GoalFunction ~= nil then + Mission.GoalFunction( Mission, Client ) + end + if MISSIONSCHEDULER.Scoring then + MISSIONSCHEDULER.Scoring:_AddMissionTaskScore( Client:GetClientGroupDCSUnit(), Mission.Name, 25 ) + end + +-- if not Mission:IsCompleted() then +-- end + end + end + end + + local MissionComplete = true + for TaskNumber, Task in pairs( Mission._Tasks ) do + if Task:Goal() then +-- Task:ShowGoalProgress( Mission, Client ) + if Task:IsGoalReached() then + else + MissionComplete = false + end + else + MissionComplete = false -- If there is no goal, the mission should never be ended. The goal status will be set somewhere else. + end + end + + if MissionComplete then + Mission:Completed() + if MISSIONSCHEDULER.Scoring then + MISSIONSCHEDULER.Scoring:_AddMissionScore( Mission.Name, 100 ) + end + else + if TaskComplete then + -- Reset for new tasking of active client + Client.ClientAlive = false -- Reset the client tasks. + end + end + + + else + if Client.ClientAlive then + env.info( 'Scheduler: Client "' .. Client.ClientName .. '" is inactive.' ) + Client.ClientAlive = false + + -- This is tricky. If we sanitize Client._Tasks before sanitizing Client._Tasks[TaskNumber].MissionTask, then the original MissionTask will be sanitized, and will be lost within the garbage collector. + -- So first sanitize Client._Tasks[TaskNumber].MissionTask, after that, sanitize only the whole _Tasks structure... + --Client._Tasks[TaskNumber].MissionTask = nil + --Client._Tasks = nil + end + end + end + + -- If all Clients of this Mission are not activated, then the Mission status needs to be put back into Pending status. + -- But only if the Mission was Ongoing. In case the Mission is Completed or Failed, the Mission status may not be changed. In these cases, this will be the last run of this Mission in the Scheduler. + if ClientsAlive == false then + if Mission:IsOngoing() then + -- Mission status back to pending... + Mission:Pending() + end + end + end + + Mission:StatusToClients() + + if Mission:ReportTrigger() then + Mission:ReportToAll() + end + end + + return true +end + +--- Start the MISSIONSCHEDULER. +function MISSIONSCHEDULER.Start() + if MISSIONSCHEDULER ~= nil then + --MISSIONSCHEDULER.SchedulerId = routines.scheduleFunction( MISSIONSCHEDULER.Scheduler, { }, 0, 2 ) + MISSIONSCHEDULER.SchedulerId = SCHEDULER:New( nil, MISSIONSCHEDULER.Scheduler, { }, 0, 2 ) + end +end + +--- Stop the MISSIONSCHEDULER. +function MISSIONSCHEDULER.Stop() + if MISSIONSCHEDULER.SchedulerId then + routines.removeFunction(MISSIONSCHEDULER.SchedulerId) + MISSIONSCHEDULER.SchedulerId = nil + end +end + +--- This is the main MISSION declaration method. Each Mission is like the master or a Mission orchestration between, Clients, Tasks, Stages etc. +-- @param Mission is the MISSION object instantiated by @{MISSION:New}. +-- @return MISSION +-- @usage +-- -- Declare a mission. +-- Mission = MISSION:New( 'Russia Transport Troops SA-6', +-- 'Operational', +-- 'Transport troops from the control center to one of the SA-6 SAM sites to activate their operation.', +-- 'Russia' ) +-- MISSIONSCHEDULER:AddMission( Mission ) +function MISSIONSCHEDULER.AddMission( Mission ) + MISSIONSCHEDULER.Missions[Mission.Name] = Mission + MISSIONSCHEDULER.MissionCount = MISSIONSCHEDULER.MissionCount + 1 + -- Add an overall AI Client for the AI tasks... This AI Client will facilitate the Events in the background for each Task. + --MissionAdd:AddClient( CLIENT:Register( 'AI' ) ) + + return Mission +end + +--- Remove a MISSION from the MISSIONSCHEDULER. +-- @param MissionName is the name of the MISSION given at declaration using @{AddMission}. +-- @usage +-- -- Declare a mission. +-- Mission = MISSION:New( 'Russia Transport Troops SA-6', +-- 'Operational', +-- 'Transport troops from the control center to one of the SA-6 SAM sites to activate their operation.', +-- 'Russia' ) +-- MISSIONSCHEDULER:AddMission( Mission ) +-- +-- -- Now remove the Mission. +-- MISSIONSCHEDULER:RemoveMission( 'Russia Transport Troops SA-6' ) +function MISSIONSCHEDULER.RemoveMission( MissionName ) + MISSIONSCHEDULER.Missions[MissionName] = nil + MISSIONSCHEDULER.MissionCount = MISSIONSCHEDULER.MissionCount - 1 +end + +--- Find a MISSION within the MISSIONSCHEDULER. +-- @param MissionName is the name of the MISSION given at declaration using @{AddMission}. +-- @return MISSION +-- @usage +-- -- Declare a mission. +-- Mission = MISSION:New( 'Russia Transport Troops SA-6', +-- 'Operational', +-- 'Transport troops from the control center to one of the SA-6 SAM sites to activate their operation.', +-- 'Russia' ) +-- MISSIONSCHEDULER:AddMission( Mission ) +-- +-- -- Now find the Mission. +-- MissionFind = MISSIONSCHEDULER:FindMission( 'Russia Transport Troops SA-6' ) +function MISSIONSCHEDULER.FindMission( MissionName ) + return MISSIONSCHEDULER.Missions[MissionName] +end + +-- Internal function used by the MISSIONSCHEDULER menu. +function MISSIONSCHEDULER.ReportMissionsShow( ) + for MissionName, Mission in pairs( MISSIONSCHEDULER.Missions ) do + Mission.MissionReportShow = true + Mission.MissionReportFlash = false + end +end + +-- Internal function used by the MISSIONSCHEDULER menu. +function MISSIONSCHEDULER.ReportMissionsFlash( TimeInterval ) + local Count = 0 + for MissionName, Mission in pairs( MISSIONSCHEDULER.Missions ) do + Mission.MissionReportShow = false + Mission.MissionReportFlash = true + Mission.MissionReportTrigger = timer.getTime() + Count * TimeInterval + Mission.MissionTimeInterval = MISSIONSCHEDULER.MissionCount * TimeInterval + env.info( "TimeInterval = " .. Mission.MissionTimeInterval ) + Count = Count + 1 + end +end + +-- Internal function used by the MISSIONSCHEDULER menu. +function MISSIONSCHEDULER.ReportMissionsHide( Prm ) + for MissionName, Mission in pairs( MISSIONSCHEDULER.Missions ) do + Mission.MissionReportShow = false + Mission.MissionReportFlash = false + end +end + +--- Enables a MENU option in the communications menu under F10 to control the status of the active missions. +-- This function should be called only once when starting the MISSIONSCHEDULER. +function MISSIONSCHEDULER.ReportMenu() + local ReportMenu = SUBMENU:New( 'Status' ) + local ReportMenuShow = COMMANDMENU:New( 'Show Report Missions', ReportMenu, MISSIONSCHEDULER.ReportMissionsShow, 0 ) + local ReportMenuFlash = COMMANDMENU:New('Flash Report Missions', ReportMenu, MISSIONSCHEDULER.ReportMissionsFlash, 120 ) + local ReportMenuHide = COMMANDMENU:New( 'Hide Report Missions', ReportMenu, MISSIONSCHEDULER.ReportMissionsHide, 0 ) +end + +--- Show the remaining mission time. +function MISSIONSCHEDULER:TimeShow() + self.TimeIntervalCount = self.TimeIntervalCount + 1 + if self.TimeIntervalCount >= self.TimeTriggerShow then + local TimeMsg = string.format("%00d", ( self.TimeSeconds / 60 ) - ( timer.getTime() / 60 )) .. ' minutes left until mission reload.' + MESSAGE:New( TimeMsg, "Mission time", self.TimeShow, '/TimeMsg' ):ToAll() + self.TimeIntervalCount = 0 + end +end + +function MISSIONSCHEDULER:Time( TimeSeconds, TimeIntervalShow, TimeShow ) + + self.TimeIntervalCount = 0 + self.TimeSeconds = TimeSeconds + self.TimeIntervalShow = TimeIntervalShow + self.TimeShow = TimeShow +end + +--- Adds a mission scoring to the game. +function MISSIONSCHEDULER:Scoring( Scoring ) + + self.Scoring = Scoring +end + +--- The CLEANUP class keeps an area clean of crashing or colliding airplanes. It also prevents airplanes from firing within this area. +-- @module CleanUp +-- @author Flightcontrol + +Include.File( "Routines" ) +Include.File( "Base" ) +Include.File( "Mission" ) +Include.File( "Client" ) +Include.File( "Task" ) + +--- The CLEANUP class. +-- @type CLEANUP +-- @extends Base#BASE +CLEANUP = { + ClassName = "CLEANUP", + ZoneNames = {}, + TimeInterval = 300, + CleanUpList = {}, +} + +--- Creates the main object which is handling the cleaning of the debris within the given Zone Names. +-- @param #CLEANUP self +-- @param #table ZoneNames Is a table of zone names where the debris should be cleaned. Also a single string can be passed with one zone name. +-- @param #number TimeInterval The interval in seconds when the clean activity takes place. The default is 300 seconds, thus every 5 minutes. +-- @return #CLEANUP +-- @usage +-- -- Clean these Zones. +-- CleanUpAirports = CLEANUP:New( { 'CLEAN Tbilisi', 'CLEAN Kutaisi' }, 150 ) +-- or +-- CleanUpTbilisi = CLEANUP:New( 'CLEAN Tbilisi', 150 ) +-- CleanUpKutaisi = CLEANUP:New( 'CLEAN Kutaisi', 600 ) +function CLEANUP:New( ZoneNames, TimeInterval ) local self = BASE:Inherit( self, BASE:New() ) + self:F( { ZoneNames, TimeInterval } ) + + if type( ZoneNames ) == 'table' then + self.ZoneNames = ZoneNames + else + self.ZoneNames = { ZoneNames } + end + if TimeInterval then + self.TimeInterval = TimeInterval + end + + _EVENTDISPATCHER:OnBirth( self._OnEventBirth, self ) + + --self.CleanUpScheduler = routines.scheduleFunction( self._CleanUpScheduler, { self }, timer.getTime() + 1, TimeInterval ) + self.CleanUpScheduler = SCHEDULER:New( self, self._CleanUpScheduler, {}, 1, TimeInterval ) + + return self +end + + +--- Destroys a group from the simulator, but checks first if it is still existing! +-- @param #CLEANUP self +-- @param DCSGroup#Group GroupObject The object to be destroyed. +-- @param #string CleanUpGroupName The groupname... +function CLEANUP:_DestroyGroup( GroupObject, CleanUpGroupName ) + self:F( { GroupObject, CleanUpGroupName } ) + + if GroupObject then -- and GroupObject:isExist() then + --MESSAGE:New( "Destroy Group " .. CleanUpGroupName, CleanUpGroupName, 1, CleanUpGroupName ):ToAll() + trigger.action.deactivateGroup(GroupObject) + self:T( { "GroupObject Destroyed", GroupObject } ) + end +end + +--- Destroys a @{DCSUnit#Unit} from the simulator, but checks first if it is still existing! +-- @param #CLEANUP self +-- @param DCSUnit#Unit CleanUpUnit The object to be destroyed. +-- @param #string CleanUpUnitName The Unit name ... +function CLEANUP:_DestroyUnit( CleanUpUnit, CleanUpUnitName ) + self:F( { CleanUpUnit, CleanUpUnitName } ) + + if CleanUpUnit then + --MESSAGE:New( "Destroy " .. CleanUpUnitName, CleanUpUnitName, 1, CleanUpUnitName ):ToAll() + local CleanUpGroup = Unit.getGroup(CleanUpUnit) + -- TODO Client bug in 1.5.3 + if CleanUpGroup and CleanUpGroup:isExist() then + local CleanUpGroupUnits = CleanUpGroup:getUnits() + if #CleanUpGroupUnits == 1 then + local CleanUpGroupName = CleanUpGroup:getName() + --self:CreateEventCrash( timer.getTime(), CleanUpUnit ) + CleanUpGroup:destroy() + self:T( { "Destroyed Group:", CleanUpGroupName } ) + else + CleanUpUnit:destroy() + self:T( { "Destroyed Unit:", CleanUpUnitName } ) + end + self.CleanUpList[CleanUpUnitName] = nil -- Cleaning from the list + CleanUpUnit = nil + end + end +end + +-- TODO check DCSTypes#Weapon +--- Destroys a missile from the simulator, but checks first if it is still existing! +-- @param #CLEANUP self +-- @param DCSTypes#Weapon MissileObject +function CLEANUP:_DestroyMissile( MissileObject ) + self:F( { MissileObject } ) + + if MissileObject and MissileObject:isExist() then + MissileObject:destroy() + self:T( "MissileObject Destroyed") + end +end + +function CLEANUP:_OnEventBirth( Event ) + self:F( { Event } ) + + self.CleanUpList[Event.IniDCSUnitName] = {} + self.CleanUpList[Event.IniDCSUnitName].CleanUpUnit = Event.IniDCSUnit + self.CleanUpList[Event.IniDCSUnitName].CleanUpGroup = Event.IniDCSGroup + self.CleanUpList[Event.IniDCSUnitName].CleanUpGroupName = Event.IniDCSGroupName + self.CleanUpList[Event.IniDCSUnitName].CleanUpUnitName = Event.IniDCSUnitName + + _EVENTDISPATCHER:OnEngineShutDownForUnit( Event.IniDCSUnitName, self._EventAddForCleanUp, self ) + _EVENTDISPATCHER:OnEngineStartUpForUnit( Event.IniDCSUnitName, self._EventAddForCleanUp, self ) + _EVENTDISPATCHER:OnHitForUnit( Event.IniDCSUnitName, self._EventAddForCleanUp, self ) + _EVENTDISPATCHER:OnPilotDeadForUnit( Event.IniDCSUnitName, self._EventCrash, self ) + _EVENTDISPATCHER:OnDeadForUnit( Event.IniDCSUnitName, self._EventCrash, self ) + _EVENTDISPATCHER:OnCrashForUnit( Event.IniDCSUnitName, self._EventCrash, self ) + _EVENTDISPATCHER:OnShotForUnit( Event.IniDCSUnitName, self._EventShot, self ) + + --self:AddEvent( world.event.S_EVENT_ENGINE_SHUTDOWN, self._EventAddForCleanUp ) + --self:AddEvent( world.event.S_EVENT_ENGINE_STARTUP, self._EventAddForCleanUp ) +-- self:AddEvent( world.event.S_EVENT_HIT, self._EventAddForCleanUp ) -- , self._EventHitCleanUp ) +-- self:AddEvent( world.event.S_EVENT_CRASH, self._EventCrash ) -- , self._EventHitCleanUp ) +-- --self:AddEvent( world.event.S_EVENT_DEAD, self._EventCrash ) +-- self:AddEvent( world.event.S_EVENT_SHOT, self._EventShot ) +-- +-- self:EnableEvents() + + +end + +--- Detects if a crash event occurs. +-- Crashed units go into a CleanUpList for removal. +-- @param #CLEANUP self +-- @param DCSTypes#Event event +function CLEANUP:_EventCrash( Event ) + self:F( { Event } ) + + --TODO: This stuff is not working due to a DCS bug. Burning units cannot be destroyed. + --MESSAGE:New( "Crash ", "Crash", 10, "Crash" ):ToAll() + -- self:T("before getGroup") + -- local _grp = Unit.getGroup(event.initiator)-- Identify the group that fired + -- self:T("after getGroup") + -- _grp:destroy() + -- self:T("after deactivateGroup") + -- event.initiator:destroy() + + self.CleanUpList[Event.IniDCSUnitName] = {} + self.CleanUpList[Event.IniDCSUnitName].CleanUpUnit = Event.IniDCSUnit + self.CleanUpList[Event.IniDCSUnitName].CleanUpGroup = Event.IniDCSGroup + self.CleanUpList[Event.IniDCSUnitName].CleanUpGroupName = Event.IniDCSGroupName + self.CleanUpList[Event.IniDCSUnitName].CleanUpUnitName = Event.IniDCSUnitName + +end + +--- Detects if a unit shoots a missile. +-- If this occurs within one of the zones, then the weapon used must be destroyed. +-- @param #CLEANUP self +-- @param DCSTypes#Event event +function CLEANUP:_EventShot( Event ) + self:F( { Event } ) + + -- Test if the missile was fired within one of the CLEANUP.ZoneNames. + local CurrentLandingZoneID = 0 + CurrentLandingZoneID = routines.IsUnitInZones( Event.IniDCSUnit, self.ZoneNames ) + if ( CurrentLandingZoneID ) then + -- Okay, the missile was fired within the CLEANUP.ZoneNames, destroy the fired weapon. + --_SEADmissile:destroy() + --routines.scheduleFunction( CLEANUP._DestroyMissile, { self, Event.Weapon }, timer.getTime() + 0.1) + SCHEDULER:New( self, CLEANUP._DestroyMissile, { Event.Weapon }, 0.1 ) + end +end + + +--- Detects if the Unit has an S_EVENT_HIT within the given ZoneNames. If this is the case, destroy the unit. +-- @param #CLEANUP self +-- @param DCSTypes#Event event +function CLEANUP:_EventHitCleanUp( Event ) + self:F( { Event } ) + + if Event.IniDCSUnit then + if routines.IsUnitInZones( Event.IniDCSUnit, self.ZoneNames ) ~= nil then + self:T( { "Life: ", Event.IniDCSUnitName, ' = ', Event.IniDCSUnit:getLife(), "/", Event.IniDCSUnit:getLife0() } ) + if Event.IniDCSUnit:getLife() < Event.IniDCSUnit:getLife0() then + self:T( "CleanUp: Destroy: " .. Event.IniDCSUnitName ) + --routines.scheduleFunction( CLEANUP._DestroyUnit, { self, Event.IniDCSUnit }, timer.getTime() + 0.1) + SCHEDULER:New( self, CLEANUP._DestroyUnit, { Event.IniDCSUnit }, 0.1 ) + end + end + end + + if Event.TgtDCSUnit then + if routines.IsUnitInZones( Event.TgtDCSUnit, self.ZoneNames ) ~= nil then + self:T( { "Life: ", Event.TgtDCSUnitName, ' = ', Event.TgtDCSUnit:getLife(), "/", Event.TgtDCSUnit:getLife0() } ) + if Event.TgtDCSUnit:getLife() < Event.TgtDCSUnit:getLife0() then + self:T( "CleanUp: Destroy: " .. Event.TgtDCSUnitName ) + --routines.scheduleFunction( CLEANUP._DestroyUnit, { self, Event.TgtDCSUnit }, timer.getTime() + 0.1 ) + SCHEDULER:New( self, CLEANUP._DestroyUnit, { Event.TgtDCSUnit }, 0.1 ) + end + end + end +end + +--- Add the @{DCSUnit#Unit} to the CleanUpList for CleanUp. +function CLEANUP:_AddForCleanUp( CleanUpUnit, CleanUpUnitName ) + self:F( { CleanUpUnit, CleanUpUnitName } ) + + self.CleanUpList[CleanUpUnitName] = {} + self.CleanUpList[CleanUpUnitName].CleanUpUnit = CleanUpUnit + self.CleanUpList[CleanUpUnitName].CleanUpUnitName = CleanUpUnitName + self.CleanUpList[CleanUpUnitName].CleanUpGroup = Unit.getGroup(CleanUpUnit) + self.CleanUpList[CleanUpUnitName].CleanUpGroupName = Unit.getGroup(CleanUpUnit):getName() + self.CleanUpList[CleanUpUnitName].CleanUpTime = timer.getTime() + self.CleanUpList[CleanUpUnitName].CleanUpMoved = false + + self:T( { "CleanUp: Add to CleanUpList: ", Unit.getGroup(CleanUpUnit):getName(), CleanUpUnitName } ) + +end + +--- Detects if the Unit has an S_EVENT_ENGINE_SHUTDOWN or an S_EVENT_HIT within the given ZoneNames. If this is the case, add the Group to the CLEANUP List. +-- @param #CLEANUP self +-- @param DCSTypes#Event event +function CLEANUP:_EventAddForCleanUp( Event ) + + if Event.IniDCSUnit then + if self.CleanUpList[Event.IniDCSUnitName] == nil then + if routines.IsUnitInZones( Event.IniDCSUnit, self.ZoneNames ) ~= nil then + self:_AddForCleanUp( Event.IniDCSUnit, Event.IniDCSUnitName ) + end + end + end + + if Event.TgtDCSUnit then + if self.CleanUpList[Event.TgtDCSUnitName] == nil then + if routines.IsUnitInZones( Event.TgtDCSUnit, self.ZoneNames ) ~= nil then + self:_AddForCleanUp( Event.TgtDCSUnit, Event.TgtDCSUnitName ) + end + end + end + +end + +local CleanUpSurfaceTypeText = { + "LAND", + "SHALLOW_WATER", + "WATER", + "ROAD", + "RUNWAY" + } + +--- At the defined time interval, CleanUp the Groups within the CleanUpList. +-- @param #CLEANUP self +function CLEANUP:_CleanUpScheduler() + self:F( { "CleanUp Scheduler" } ) + + local CleanUpCount = 0 + for CleanUpUnitName, UnitData in pairs( self.CleanUpList ) do + CleanUpCount = CleanUpCount + 1 + + self:T( { CleanUpUnitName, UnitData } ) + local CleanUpUnit = Unit.getByName(UnitData.CleanUpUnitName) + local CleanUpGroupName = UnitData.CleanUpGroupName + local CleanUpUnitName = UnitData.CleanUpUnitName + if CleanUpUnit then + self:T( { "CleanUp Scheduler", "Checking:", CleanUpUnitName } ) + if _DATABASE:GetStatusGroup( CleanUpGroupName ) ~= "ReSpawn" then + local CleanUpUnitVec3 = CleanUpUnit:getPoint() + --self:T( CleanUpUnitVec3 ) + local CleanUpUnitVec2 = {} + CleanUpUnitVec2.x = CleanUpUnitVec3.x + CleanUpUnitVec2.y = CleanUpUnitVec3.z + --self:T( CleanUpUnitVec2 ) + local CleanUpSurfaceType = land.getSurfaceType(CleanUpUnitVec2) + --self:T( CleanUpSurfaceType ) + --MESSAGE:New( "Surface " .. CleanUpUnitName .. " = " .. CleanUpSurfaceTypeText[CleanUpSurfaceType], CleanUpUnitName, 10, CleanUpUnitName ):ToAll() + + if CleanUpUnit and CleanUpUnit:getLife() <= CleanUpUnit:getLife0() * 0.95 then + if CleanUpSurfaceType == land.SurfaceType.RUNWAY then + if CleanUpUnit:inAir() then + local CleanUpLandHeight = land.getHeight(CleanUpUnitVec2) + local CleanUpUnitHeight = CleanUpUnitVec3.y - CleanUpLandHeight + self:T( { "CleanUp Scheduler", "Height = " .. CleanUpUnitHeight } ) + if CleanUpUnitHeight < 30 then + self:T( { "CleanUp Scheduler", "Destroy " .. CleanUpUnitName .. " because below safe height and damaged." } ) + self:_DestroyUnit(CleanUpUnit, CleanUpUnitName) + end + else + self:T( { "CleanUp Scheduler", "Destroy " .. CleanUpUnitName .. " because on runway and damaged." } ) + self:_DestroyUnit(CleanUpUnit, CleanUpUnitName) + end + end + end + -- Clean Units which are waiting for a very long time in the CleanUpZone. + if CleanUpUnit then + local CleanUpUnitVelocity = CleanUpUnit:getVelocity() + local CleanUpUnitVelocityTotal = math.abs(CleanUpUnitVelocity.x) + math.abs(CleanUpUnitVelocity.y) + math.abs(CleanUpUnitVelocity.z) + if CleanUpUnitVelocityTotal < 1 then + if UnitData.CleanUpMoved then + if UnitData.CleanUpTime + 180 <= timer.getTime() then + self:T( { "CleanUp Scheduler", "Destroy due to not moving anymore " .. CleanUpUnitName } ) + self:_DestroyUnit(CleanUpUnit, CleanUpUnitName) + end + end + else + UnitData.CleanUpTime = timer.getTime() + UnitData.CleanUpMoved = true + --MESSAGE:New( "Moved " .. CleanUpUnitName, CleanUpUnitName, 10, CleanUpUnitName ):ToAll() + end + end + + else + -- Do nothing ... + self.CleanUpList[CleanUpUnitName] = nil -- Not anymore in the DCSRTE + end + else + self:T( "CleanUp: Group " .. CleanUpUnitName .. " cannot be found in DCS RTE, removing ..." ) + self.CleanUpList[CleanUpUnitName] = nil -- Not anymore in the DCSRTE + end + end + self:T(CleanUpCount) + + return true +end + +--- Dynamic spawning of groups (and units). +-- +-- @{#SPAWN} class +-- =============== +-- The @{#SPAWN} class allows to spawn dynamically new groups, based on pre-defined initialization settings, modifying the behaviour when groups are spawned. +-- For each group to be spawned, within the mission editor, a group has to be created with the "late activation flag" set. We call this group the *"Spawn Template"* of the SPAWN object. +-- A reference to this Spawn Template needs to be provided when constructing the SPAWN object, by indicating the name of the group within the mission editor in the constructor methods. +-- +-- Within the SPAWN object, there is an internal index that keeps track of which group from the internal group list was spawned. +-- When new groups get spawned by using the SPAWN functions (see below), it will be validated whether the Limits (@{#SPAWN.Limit}) of the SPAWN object are not reached. +-- When all is valid, a new group will be created by the spawning methods, and the internal index will be increased with 1. +-- +-- Regarding the name of new spawned groups, a _SpawnPrefix_ will be assigned for each new group created. +-- If you want to have the Spawn Template name to be used as the _SpawnPrefix_ name, use the @{#SPAWN.New} constructor. +-- However, when the @{#SPAWN.NewWithAlias} constructor was used, the Alias name will define the _SpawnPrefix_ name. +-- Groups will follow the following naming structure when spawned at run-time: +-- +-- 1. Spawned groups will have the name _SpawnPrefix_#ggg, where ggg is a counter from 0 to 999. +-- 2. Spawned units will have the name _SpawnPrefix_#ggg-uu, where uu is a counter from 0 to 99 for each new spawned unit belonging to the group. +-- +-- Some additional notes that need to be remembered: +-- +-- * Templates are actually groups defined within the mission editor, with the flag "Late Activation" set. As such, these groups are never used within the mission, but are used by the @{#SPAWN} module. +-- * It is important to defined BEFORE you spawn new groups, a proper initialization of the SPAWN instance is done with the options you want to use. +-- * When designing a mission, NEVER name groups using a "#" within the name of the group Spawn Template(s), or the SPAWN module logic won't work anymore. +-- +-- SPAWN construction methods: +-- =========================== +-- Create a new SPAWN object with the @{#SPAWN.New} or the @{#SPAWN.NewWithAlias} methods: +-- +-- * @{#SPAWN.New}: Creates a new SPAWN object taking the name of the group that functions as the Template. +-- +-- It is important to understand how the SPAWN class works internally. The SPAWN object created will contain internally a list of groups that will be spawned and that are already spawned. +-- The initialization functions will modify this list of groups so that when a group gets spawned, ALL information is already prepared when spawning. This is done for performance reasons. +-- So in principle, the group list will contain all parameters and configurations after initialization, and when groups get actually spawned, this spawning can be done quickly and efficient. +-- +-- SPAWN initialization methods: +-- ============================= +-- A spawn object will behave differently based on the usage of initialization methods: +-- +-- * @{#SPAWN.Limit}: Limits the amount of groups that can be alive at the same time and that can be dynamically spawned. +-- * @{#SPAWN.RandomizeRoute}: Randomize the routes of spawned groups. +-- * @{#SPAWN.RandomizeTemplate}: Randomize the group templates so that when a new group is spawned, a random group template is selected from one of the templates defined. +-- * @{#SPAWN.Uncontrolled}: Spawn plane groups uncontrolled. +-- * @{#SPAWN.Array}: Make groups visible before they are actually activated, and order these groups like a batallion in an array. +-- * @{#SPAWN.InitRepeat}: Re-spawn groups when they land at the home base. Similar functions are @{#SPAWN.InitRepeatOnLanding} and @{#SPAWN.InitRepeatOnEngineShutDown}. +-- +-- SPAWN spawning methods: +-- ======================= +-- Groups can be spawned at different times and methods: +-- +-- * @{#SPAWN.Spawn}: Spawn one new group based on the last spawned index. +-- * @{#SPAWN.ReSpawn}: Re-spawn a group based on a given index. +-- * @{#SPAWN.SpawnScheduled}: Spawn groups at scheduled but randomized intervals. You can use @{#SPAWN.SpawnScheduleStart} and @{#SPAWN.SpawnScheduleStop} to start and stop the schedule respectively. +-- * @{#SPAWN.SpawnFromUnit}: Spawn a new group taking the position of a @{UNIT}. +-- * @{#SPAWN.SpawnInZone}: Spawn a new group in a @{ZONE}. +-- +-- Note that @{#SPAWN.Spawn} and @{#SPAWN.ReSpawn} return a @{GROUP#GROUP.New} object, that contains a reference to the DCSGroup object. +-- You can use the @{GROUP} object to do further actions with the DCSGroup. +-- +-- SPAWN object cleaning: +-- ========================= +-- Sometimes, it will occur during a mission run-time, that ground or especially air objects get damaged, and will while being damged stop their activities, while remaining alive. +-- In such cases, the SPAWN object will just sit there and wait until that group gets destroyed, but most of the time it won't, +-- and it may occur that no new groups are or can be spawned as limits are reached. +-- To prevent this, a @{#SPAWN.CleanUp} initialization method has been defined that will silently monitor the status of each spawned group. +-- Once a group has a velocity = 0, and has been waiting for a defined interval, that group will be cleaned or removed from run-time. +-- There is a catch however :-) If a damaged group has returned to an airbase within the coalition, that group will not be considered as "lost"... +-- In such a case, when the inactive group is cleaned, a new group will Re-spawned automatically. +-- This models AI that has succesfully returned to their airbase, to restart their combat activities. +-- Check the @{#SPAWN.CleanUp} for further info. +-- +-- ==== +-- @module Spawn +-- @author FlightControl + +Include.File( "Routines" ) +Include.File( "Base" ) +Include.File( "Database" ) +Include.File( "Group" ) +Include.File( "Zone" ) +Include.File( "Event" ) +Include.File( "Scheduler" ) + +--- SPAWN Class +-- @type SPAWN +-- @extends Base#BASE +-- @field ClassName +-- @field #string SpawnTemplatePrefix +-- @field #string SpawnAliasPrefix +SPAWN = { + ClassName = "SPAWN", + SpawnTemplatePrefix = nil, + SpawnAliasPrefix = nil, +} + + + +--- Creates the main object to spawn a GROUP defined in the DCS ME. +-- @param #SPAWN self +-- @param #string SpawnTemplatePrefix is the name of the Group in the ME that defines the Template. Each new group will have the name starting with SpawnTemplatePrefix. +-- @return #SPAWN +-- @usage +-- -- NATO helicopters engaging in the battle field. +-- Spawn_BE_KA50 = SPAWN:New( 'BE KA-50@RAMP-Ground Defense' ) +-- @usage local Plane = SPAWN:New( "Plane" ) -- Creates a new local variable that can initiate new planes with the name "Plane#ddd" using the template "Plane" as defined within the ME. +function SPAWN:New( SpawnTemplatePrefix ) + local self = BASE:Inherit( self, BASE:New() ) + self:F( { SpawnTemplatePrefix } ) + + local TemplateGroup = Group.getByName( SpawnTemplatePrefix ) + if TemplateGroup then + self.SpawnTemplatePrefix = SpawnTemplatePrefix + self.SpawnIndex = 0 + self.SpawnCount = 0 -- The internal counter of the amount of spawning the has happened since SpawnStart. + self.AliveUnits = 0 -- Contains the counter how many units are currently alive + self.SpawnIsScheduled = false -- Reflects if the spawning for this SpawnTemplatePrefix is going to be scheduled or not. + self.SpawnTemplate = self._GetTemplate( self, SpawnTemplatePrefix ) -- Contains the template structure for a Group Spawn from the Mission Editor. Note that this group must have lateActivation always on!!! + self.Repeat = false -- Don't repeat the group from Take-Off till Landing and back Take-Off by ReSpawning. + self.UnControlled = false -- When working in UnControlled mode, all planes are Spawned in UnControlled mode before the scheduler starts. + self.SpawnMaxUnitsAlive = 0 -- The maximum amount of groups that can be alive of SpawnTemplatePrefix at the same time. + self.SpawnMaxGroups = 0 -- The maximum amount of groups that can be spawned. + self.SpawnRandomize = false -- Sets the randomization flag of new Spawned units to false. + self.SpawnVisible = false -- Flag that indicates if all the Groups of the SpawnGroup need to be visible when Spawned. + + self.SpawnGroups = {} -- Array containing the descriptions of each Group to be Spawned. + else + error( "SPAWN:New: There is no group declared in the mission editor with SpawnTemplatePrefix = '" .. SpawnTemplatePrefix .. "'" ) + end + + return self +end + +--- Creates a new SPAWN instance to create new groups based on the defined template and using a new alias for each new group. +-- @param #SPAWN self +-- @param #string SpawnTemplatePrefix is the name of the Group in the ME that defines the Template. +-- @param #string SpawnAliasPrefix is the name that will be given to the Group at runtime. +-- @return #SPAWN +-- @usage +-- -- NATO helicopters engaging in the battle field. +-- Spawn_BE_KA50 = SPAWN:NewWithAlias( 'BE KA-50@RAMP-Ground Defense', 'Helicopter Attacking a City' ) +-- @usage local PlaneWithAlias = SPAWN:NewWithAlias( "Plane", "Bomber" ) -- Creates a new local variable that can instantiate new planes with the name "Bomber#ddd" using the template "Plane" as defined within the ME. +function SPAWN:NewWithAlias( SpawnTemplatePrefix, SpawnAliasPrefix ) + local self = BASE:Inherit( self, BASE:New() ) + self:F( { SpawnTemplatePrefix, SpawnAliasPrefix } ) + + local TemplateGroup = Group.getByName( SpawnTemplatePrefix ) + if TemplateGroup then + self.SpawnTemplatePrefix = SpawnTemplatePrefix + self.SpawnAliasPrefix = SpawnAliasPrefix + self.SpawnIndex = 0 + self.SpawnCount = 0 -- The internal counter of the amount of spawning the has happened since SpawnStart. + self.AliveUnits = 0 -- Contains the counter how many units are currently alive + self.SpawnIsScheduled = false -- Reflects if the spawning for this SpawnTemplatePrefix is going to be scheduled or not. + self.SpawnTemplate = self._GetTemplate( self, SpawnTemplatePrefix ) -- Contains the template structure for a Group Spawn from the Mission Editor. Note that this group must have lateActivation always on!!! + self.Repeat = false -- Don't repeat the group from Take-Off till Landing and back Take-Off by ReSpawning. + self.UnControlled = false -- When working in UnControlled mode, all planes are Spawned in UnControlled mode before the scheduler starts. + self.SpawnMaxUnitsAlive = 0 -- The maximum amount of groups that can be alive of SpawnTemplatePrefix at the same time. + self.SpawnMaxGroups = 0 -- The maximum amount of groups that can be spawned. + self.SpawnRandomize = false -- Sets the randomization flag of new Spawned units to false. + self.SpawnVisible = false -- Flag that indicates if all the Groups of the SpawnGroup need to be visible when Spawned. + + self.SpawnGroups = {} -- Array containing the descriptions of each Group to be Spawned. + else + error( "SPAWN:New: There is no group declared in the mission editor with SpawnTemplatePrefix = '" .. SpawnTemplatePrefix .. "'" ) + end + + return self +end + + +--- Limits the Maximum amount of Units that can be alive at the same time, and the maximum amount of groups that can be spawned. +-- Note that this method is exceptionally important to balance the performance of the mission. Depending on the machine etc, a mission can only process a maximum amount of units. +-- If the time interval must be short, but there should not be more Units or Groups alive than a maximum amount of units, then this function should be used... +-- When a @{#SPAWN.New} is executed and the limit of the amount of units alive is reached, then no new spawn will happen of the group, until some of these units of the spawn object will be destroyed. +-- @param #SPAWN self +-- @param #number SpawnMaxUnitsAlive The maximum amount of units that can be alive at runtime. +-- @param #number SpawnMaxGroups The maximum amount of groups that can be spawned. When the limit is reached, then no more actual spawns will happen of the group. +-- This parameter is useful to define a maximum amount of airplanes, ground troops, helicopters, ships etc within a supply area. +-- This parameter accepts the value 0, which defines that there are no maximum group limits, but there are limits on the maximum of units that can be alive at the same time. +-- @return #SPAWN self +-- @usage +-- -- NATO helicopters engaging in the battle field. +-- -- This helicopter group consists of one Unit. So, this group will SPAWN maximum 2 groups simultaneously within the DCSRTE. +-- -- There will be maximum 24 groups spawned during the whole mission lifetime. +-- Spawn_BE_KA50 = SPAWN:New( 'BE KA-50@RAMP-Ground Defense' ):Limit( 2, 24 ) +function SPAWN:Limit( SpawnMaxUnitsAlive, SpawnMaxGroups ) + self:F( { self.SpawnTemplatePrefix, SpawnMaxUnitsAlive, SpawnMaxGroups } ) + + self.SpawnMaxUnitsAlive = SpawnMaxUnitsAlive -- The maximum amount of groups that can be alive of SpawnTemplatePrefix at the same time. + self.SpawnMaxGroups = SpawnMaxGroups -- The maximum amount of groups that can be spawned. + + for SpawnGroupID = 1, self.SpawnMaxGroups do + self:_InitializeSpawnGroups( SpawnGroupID ) + end + + return self +end + + +--- Randomizes the defined route of the SpawnTemplatePrefix group in the ME. This is very useful to define extra variation of the behaviour of groups. +-- @param #SPAWN self +-- @param #number SpawnStartPoint is the waypoint where the randomization begins. +-- Note that the StartPoint = 0 equaling the point where the group is spawned. +-- @param #number SpawnEndPoint is the waypoint where the randomization ends counting backwards. +-- This parameter is useful to avoid randomization to end at a waypoint earlier than the last waypoint on the route. +-- @param #number SpawnRadius is the radius in meters in which the randomization of the new waypoints, with the original waypoint of the original template located in the middle ... +-- @return #SPAWN +-- @usage +-- -- NATO helicopters engaging in the battle field. +-- -- The KA-50 has waypoints Start point ( =0 or SP ), 1, 2, 3, 4, End point (= 5 or DP). +-- -- Waypoints 2 and 3 will only be randomized. The others will remain on their original position with each new spawn of the helicopter. +-- -- The randomization of waypoint 2 and 3 will take place within a radius of 2000 meters. +-- Spawn_BE_KA50 = SPAWN:New( 'BE KA-50@RAMP-Ground Defense' ):RandomizeRoute( 2, 2, 2000 ) +function SPAWN:RandomizeRoute( SpawnStartPoint, SpawnEndPoint, SpawnRadius ) + self:F( { self.SpawnTemplatePrefix, SpawnStartPoint, SpawnEndPoint, SpawnRadius } ) + + self.SpawnRandomizeRoute = true + self.SpawnRandomizeRouteStartPoint = SpawnStartPoint + self.SpawnRandomizeRouteEndPoint = SpawnEndPoint + self.SpawnRandomizeRouteRadius = SpawnRadius + + for GroupID = 1, self.SpawnMaxGroups do + self:_RandomizeRoute( GroupID ) + end + + return self +end + + +--- This function is rather complicated to understand. But I'll try to explain. +-- This function becomes useful when you need to spawn groups with random templates of groups defined within the mission editor, +-- but they will all follow the same Template route and have the same prefix name. +-- In other words, this method randomizes between a defined set of groups the template to be used for each new spawn of a group. +-- @param #SPAWN self +-- @param #string SpawnTemplatePrefixTable A table with the names of the groups defined within the mission editor, from which one will be choosen when a new group will be spawned. +-- @return #SPAWN +-- @usage +-- -- NATO Tank Platoons invading Gori. +-- -- Choose between 13 different 'US Tank Platoon' configurations for each new SPAWN the Group to be spawned for the +-- -- 'US Tank Platoon Left', 'US Tank Platoon Middle' and 'US Tank Platoon Right' SpawnTemplatePrefixes. +-- -- Each new SPAWN will randomize the route, with a defined time interval of 200 seconds with 40% time variation (randomization) and +-- -- with a limit set of maximum 12 Units alive simulteneously and 150 Groups to be spawned during the whole mission. +-- Spawn_US_Platoon = { 'US Tank Platoon 1', 'US Tank Platoon 2', 'US Tank Platoon 3', 'US Tank Platoon 4', 'US Tank Platoon 5', +-- 'US Tank Platoon 6', 'US Tank Platoon 7', 'US Tank Platoon 8', 'US Tank Platoon 9', 'US Tank Platoon 10', +-- 'US Tank Platoon 11', 'US Tank Platoon 12', 'US Tank Platoon 13' } +-- Spawn_US_Platoon_Left = SPAWN:New( 'US Tank Platoon Left' ):Limit( 12, 150 ):Schedule( 200, 0.4 ):RandomizeTemplate( Spawn_US_Platoon ):RandomizeRoute( 3, 3, 2000 ) +-- Spawn_US_Platoon_Middle = SPAWN:New( 'US Tank Platoon Middle' ):Limit( 12, 150 ):Schedule( 200, 0.4 ):RandomizeTemplate( Spawn_US_Platoon ):RandomizeRoute( 3, 3, 2000 ) +-- Spawn_US_Platoon_Right = SPAWN:New( 'US Tank Platoon Right' ):Limit( 12, 150 ):Schedule( 200, 0.4 ):RandomizeTemplate( Spawn_US_Platoon ):RandomizeRoute( 3, 3, 2000 ) +function SPAWN:RandomizeTemplate( SpawnTemplatePrefixTable ) + self:F( { self.SpawnTemplatePrefix, SpawnTemplatePrefixTable } ) + + self.SpawnTemplatePrefixTable = SpawnTemplatePrefixTable + self.SpawnRandomizeTemplate = true + + for SpawnGroupID = 1, self.SpawnMaxGroups do + self:_RandomizeTemplate( SpawnGroupID ) + end + + return self +end + + + + + +--- For planes and helicopters, when these groups go home and land on their home airbases and farps, they normally would taxi to the parking spot, shut-down their engines and wait forever until the Group is removed by the runtime environment. +-- This function is used to re-spawn automatically (so no extra call is needed anymore) the same group after it has landed. +-- This will enable a spawned group to be re-spawned after it lands, until it is destroyed... +-- Note: When the group is respawned, it will re-spawn from the original airbase where it took off. +-- So ensure that the routes for groups that respawn, always return to the original airbase, or players may get confused ... +-- @param #SPAWN self +-- @return #SPAWN self +-- @usage +-- -- RU Su-34 - AI Ship Attack +-- -- Re-SPAWN the Group(s) after each landing and Engine Shut-Down automatically. +-- SpawnRU_SU34 = SPAWN:New( 'TF1 RU Su-34 Krymsk@AI - Attack Ships' ):Schedule( 2, 3, 1800, 0.4 ):SpawnUncontrolled():RandomizeRoute( 1, 1, 3000 ):RepeatOnEngineShutDown() +function SPAWN:InitRepeat() + self:F( { self.SpawnTemplatePrefix, self.SpawnIndex } ) + + self.Repeat = true + self.RepeatOnEngineShutDown = false + self.RepeatOnLanding = true + + return self +end + +--- Respawn group after landing. +-- @param #SPAWN self +-- @return #SPAWN self +function SPAWN:InitRepeatOnLanding() + self:F( { self.SpawnTemplatePrefix } ) + + self:InitRepeat() + self.RepeatOnEngineShutDown = false + self.RepeatOnLanding = true + + return self +end + + +--- Respawn after landing when its engines have shut down. +-- @param #SPAWN self +-- @return #SPAWN self +function SPAWN:InitRepeatOnEngineShutDown() + self:F( { self.SpawnTemplatePrefix } ) + + self:InitRepeat() + self.RepeatOnEngineShutDown = true + self.RepeatOnLanding = false + + return self +end + + +--- CleanUp groups when they are still alive, but inactive. +-- When groups are still alive and have become inactive due to damage and are unable to contribute anything, then this group will be removed at defined intervals in seconds. +-- @param #SPAWN self +-- @param #string SpawnCleanUpInterval The interval to check for inactive groups within seconds. +-- @return #SPAWN self +-- @usage Spawn_Helicopter:CleanUp( 20 ) -- CleanUp the spawning of the helicopters every 20 seconds when they become inactive. +function SPAWN:CleanUp( SpawnCleanUpInterval ) + self:F( { self.SpawnTemplatePrefix, SpawnCleanUpInterval } ) + + self.SpawnCleanUpInterval = SpawnCleanUpInterval + self.SpawnCleanUpTimeStamps = {} + --self.CleanUpFunction = routines.scheduleFunction( self._SpawnCleanUpScheduler, { self }, timer.getTime() + 1, SpawnCleanUpInterval ) + self.CleanUpScheduler = SCHEDULER:New( self, self._SpawnCleanUpScheduler, {}, 1, SpawnCleanUpInterval, 0.2 ) + return self +end + + + +--- Makes the groups visible before start (like a batallion). +-- The method will take the position of the group as the first position in the array. +-- @param #SPAWN self +-- @param #number SpawnAngle The angle in degrees how the groups and each unit of the group will be positioned. +-- @param #number SpawnWidth The amount of Groups that will be positioned on the X axis. +-- @param #number SpawnDeltaX The space between each Group on the X-axis. +-- @param #number SpawnDeltaY The space between each Group on the Y-axis. +-- @return #SPAWN self +-- @usage +-- -- Define an array of Groups. +-- Spawn_BE_Ground = SPAWN:New( 'BE Ground' ):Limit( 2, 24 ):Visible( 90, "Diamond", 10, 100, 50 ) +function SPAWN:Array( SpawnAngle, SpawnWidth, SpawnDeltaX, SpawnDeltaY ) + self:F( { self.SpawnTemplatePrefix, SpawnAngle, SpawnWidth, SpawnDeltaX, SpawnDeltaY } ) + + self.SpawnVisible = true -- When the first Spawn executes, all the Groups need to be made visible before start. + + local SpawnX = 0 + local SpawnY = 0 + local SpawnXIndex = 0 + local SpawnYIndex = 0 + + for SpawnGroupID = 1, self.SpawnMaxGroups do + self:T( { SpawnX, SpawnY, SpawnXIndex, SpawnYIndex } ) + + self.SpawnGroups[SpawnGroupID].Visible = true + self.SpawnGroups[SpawnGroupID].Spawned = false + + SpawnXIndex = SpawnXIndex + 1 + if SpawnWidth and SpawnWidth ~= 0 then + if SpawnXIndex >= SpawnWidth then + SpawnXIndex = 0 + SpawnYIndex = SpawnYIndex + 1 + end + end + + local SpawnRootX = self.SpawnGroups[SpawnGroupID].SpawnTemplate.x + local SpawnRootY = self.SpawnGroups[SpawnGroupID].SpawnTemplate.y + + self:_TranslateRotate( SpawnGroupID, SpawnRootX, SpawnRootY, SpawnX, SpawnY, SpawnAngle ) + + self.SpawnGroups[SpawnGroupID].SpawnTemplate.lateActivation = true + self.SpawnGroups[SpawnGroupID].SpawnTemplate.visible = true + + self.SpawnGroups[SpawnGroupID].Visible = true + + _EVENTDISPATCHER:OnBirthForTemplate( self.SpawnGroups[SpawnGroupID].SpawnTemplate, self._OnBirth, self ) + _EVENTDISPATCHER:OnCrashForTemplate( self.SpawnGroups[SpawnGroupID].SpawnTemplate, self._OnDeadOrCrash, self ) + _EVENTDISPATCHER:OnDeadForTemplate( self.SpawnGroups[SpawnGroupID].SpawnTemplate, self._OnDeadOrCrash, self ) + + if self.Repeat then + _EVENTDISPATCHER:OnTakeOffForTemplate( self.SpawnGroups[SpawnGroupID].SpawnTemplate, self._OnTakeOff, self ) + _EVENTDISPATCHER:OnLandForTemplate( self.SpawnGroups[SpawnGroupID].SpawnTemplate, self._OnLand, self ) + end + if self.RepeatOnEngineShutDown then + _EVENTDISPATCHER:OnEngineShutDownForTemplate( self.SpawnGroups[SpawnGroupID].SpawnTemplate, self._OnEngineShutDown, self ) + end + + self.SpawnGroups[SpawnGroupID].Group = _DATABASE:Spawn( self.SpawnGroups[SpawnGroupID].SpawnTemplate ) + + SpawnX = SpawnXIndex * SpawnDeltaX + SpawnY = SpawnYIndex * SpawnDeltaY + end + + return self +end + + + +--- Will spawn a group based on the internal index. +-- Note: Uses @{DATABASE} module defined in MOOSE. +-- @param #SPAWN self +-- @return Group#GROUP The group that was spawned. You can use this group for further actions. +function SPAWN:Spawn() + self:F( { self.SpawnTemplatePrefix, self.SpawnIndex } ) + + return self:SpawnWithIndex( self.SpawnIndex + 1 ) +end + +--- Will re-spawn a group based on a given index. +-- Note: Uses @{DATABASE} module defined in MOOSE. +-- @param #SPAWN self +-- @param #string SpawnIndex The index of the group to be spawned. +-- @return Group#GROUP The group that was spawned. You can use this group for further actions. +function SPAWN:ReSpawn( SpawnIndex ) + self:F( { self.SpawnTemplatePrefix, SpawnIndex } ) + + if not SpawnIndex then + SpawnIndex = 1 + end + +-- TODO: This logic makes DCS crash and i don't know why (yet). + local SpawnGroup = self:GetGroupFromIndex( SpawnIndex ) + if SpawnGroup then + local SpawnDCSGroup = SpawnGroup:GetDCSGroup() + if SpawnDCSGroup then + SpawnGroup:Destroy() + end + end + + return self:SpawnWithIndex( SpawnIndex ) +end + +--- Will spawn a group with a specified index number. +-- Uses @{DATABASE} global object defined in MOOSE. +-- @param #SPAWN self +-- @return Group#GROUP The group that was spawned. You can use this group for further actions. +function SPAWN:SpawnWithIndex( SpawnIndex ) + self:F( { self.SpawnTemplatePrefix, SpawnIndex, self.SpawnMaxGroups } ) + + if self:_GetSpawnIndex( SpawnIndex ) then + + if self.SpawnGroups[self.SpawnIndex].Visible then + self.SpawnGroups[self.SpawnIndex].Group:Activate() + else + self:T( self.SpawnGroups[self.SpawnIndex].SpawnTemplate ) + _EVENTDISPATCHER:OnBirthForTemplate( self.SpawnGroups[self.SpawnIndex].SpawnTemplate, self._OnBirth, self ) + _EVENTDISPATCHER:OnCrashForTemplate( self.SpawnGroups[self.SpawnIndex].SpawnTemplate, self._OnDeadOrCrash, self ) + _EVENTDISPATCHER:OnDeadForTemplate( self.SpawnGroups[self.SpawnIndex].SpawnTemplate, self._OnDeadOrCrash, self ) + + if self.Repeat then + _EVENTDISPATCHER:OnTakeOffForTemplate( self.SpawnGroups[self.SpawnIndex].SpawnTemplate, self._OnTakeOff, self ) + _EVENTDISPATCHER:OnLandForTemplate( self.SpawnGroups[self.SpawnIndex].SpawnTemplate, self._OnLand, self ) + end + if self.RepeatOnEngineShutDown then + _EVENTDISPATCHER:OnEngineShutDownForTemplate( self.SpawnGroups[self.SpawnIndex].SpawnTemplate, self._OnEngineShutDown, self ) + end + + self:T( self.SpawnGroups[self.SpawnIndex].SpawnTemplate ) + + self.SpawnGroups[self.SpawnIndex].Group = _DATABASE:Spawn( self.SpawnGroups[self.SpawnIndex].SpawnTemplate ) + + -- If there is a SpawnFunction hook defined, call it. + if self.SpawnFunctionHook then + self.SpawnFunctionHook( self.SpawnGroups[self.SpawnIndex].Group, unpack( self.SpawnFunctionArguments ) ) + end + -- TODO: Need to fix this by putting an "R" in the name of the group when the group repeats. + --if self.Repeat then + -- _DATABASE:SetStatusGroup( SpawnTemplate.name, "ReSpawn" ) + --end + end + + self.SpawnGroups[self.SpawnIndex].Spawned = true + return self.SpawnGroups[self.SpawnIndex].Group + else + --self:E( { self.SpawnTemplatePrefix, "No more Groups to Spawn:", SpawnIndex, self.SpawnMaxGroups } ) + end + + return nil +end + +--- Spawns new groups at varying time intervals. +-- This is useful if you want to have continuity within your missions of certain (AI) groups to be present (alive) within your missions. +-- @param #SPAWN self +-- @param #number SpawnTime The time interval defined in seconds between each new spawn of new groups. +-- @param #number SpawnTimeVariation The variation to be applied on the defined time interval between each new spawn. +-- The variation is a number between 0 and 1, representing the %-tage of variation to be applied on the time interval. +-- @return #SPAWN self +-- @usage +-- -- NATO helicopters engaging in the battle field. +-- -- The time interval is set to SPAWN new helicopters between each 600 seconds, with a time variation of 50%. +-- -- The time variation in this case will be between 450 seconds and 750 seconds. +-- -- This is calculated as follows: +-- -- Low limit: 600 * ( 1 - 0.5 / 2 ) = 450 +-- -- High limit: 600 * ( 1 + 0.5 / 2 ) = 750 +-- -- Between these two values, a random amount of seconds will be choosen for each new spawn of the helicopters. +-- Spawn_BE_KA50 = SPAWN:New( 'BE KA-50@RAMP-Ground Defense' ):Schedule( 600, 0.5 ) +function SPAWN:SpawnScheduled( SpawnTime, SpawnTimeVariation ) + self:F( { SpawnTime, SpawnTimeVariation } ) + + if SpawnTime ~= nil and SpawnTimeVariation ~= nil then + self.SpawnScheduler = SCHEDULER:New( self, self._Scheduler, {}, 1, SpawnTime, SpawnTimeVariation ) + end + + return self +end + +--- Will re-start the spawning scheduler. +-- Note: This function is only required to be called when the schedule was stopped. +function SPAWN:SpawnScheduleStart() + self:F( { self.SpawnTemplatePrefix } ) + + self.SpawnScheduler:Start() +end + +--- Will stop the scheduled spawning scheduler. +function SPAWN:SpawnScheduleStop() + self:F( { self.SpawnTemplatePrefix } ) + + self.SpawnScheduler:Stop() +end + + +--- Allows to place a CallFunction hook when a new group spawns. +-- The provided function will be called when a new group is spawned, including its given parameters. +-- The first parameter of the SpawnFunction is the @{Group#GROUP} that was spawned. +-- @param #SPAWN self +-- @param #function SpawnFunctionHook The function to be called when a group spawns. +-- @param SpawnFunctionArguments A random amount of arguments to be provided to the function when the group spawns. +-- @return #SPAWN +function SPAWN:SpawnFunction( SpawnFunctionHook, ... ) + self:F( SpawnFunction ) + + self.SpawnFunctionHook = SpawnFunctionHook + self.SpawnFunctionArguments = {} + if arg then + self.SpawnFunctionArguments = arg + end + + return self +end + + + + +--- Will spawn a group from a hosting unit. This function is mostly advisable to be used if you want to simulate spawning from air units, like helicopters, which are dropping infantry into a defined Landing Zone. +-- Note that each point in the route assigned to the spawning group is reset to the point of the spawn. +-- You can use the returned group to further define the route to be followed. +-- @param #SPAWN self +-- @param Unit#UNIT HostUnit The air or ground unit dropping or unloading the group. +-- @param #number OuterRadius The outer radius in meters where the new group will be spawned. +-- @param #number InnerRadius The inner radius in meters where the new group will NOT be spawned. +-- @param #number SpawnIndex (Optional) The index which group to spawn within the given zone. +-- @return Group#GROUP that was spawned. +-- @return #nil Nothing was spawned. +function SPAWN:SpawnFromUnit( HostUnit, OuterRadius, InnerRadius, SpawnIndex ) + self:F( { self.SpawnTemplatePrefix, HostUnit, OuterRadius, InnerRadius, SpawnIndex } ) + + if HostUnit and HostUnit:IsAlive() then -- and HostUnit:getUnit(1):inAir() == false then + + if SpawnIndex then + else + SpawnIndex = self.SpawnIndex + 1 + end + + if self:_GetSpawnIndex( SpawnIndex ) then + + local SpawnTemplate = self.SpawnGroups[self.SpawnIndex].SpawnTemplate + + if SpawnTemplate then + + local UnitPoint = HostUnit:GetPointVec2() + + self:T( { "Current point of ", self.SpawnTemplatePrefix, UnitPoint } ) + + --for PointID, Point in pairs( SpawnTemplate.route.points ) do + --Point.x = UnitPoint.x + --Point.y = UnitPoint.y + --Point.alt = nil + --Point.alt_type = nil + --end + + SpawnTemplate.route.points[1].x = UnitPoint.x + SpawnTemplate.route.points[1].y = UnitPoint.y + + if not InnerRadius then + InnerRadius = 10 + end + + if not OuterRadius then + OuterRadius = 50 + end + + -- Apply SpawnFormation + for UnitID = 1, #SpawnTemplate.units do + if InnerRadius == 0 then + SpawnTemplate.units[UnitID].x = UnitPoint.x + SpawnTemplate.units[UnitID].y = UnitPoint.y + else + local CirclePos = routines.getRandPointInCircle( UnitPoint, OuterRadius, InnerRadius ) + SpawnTemplate.units[UnitID].x = CirclePos.x + SpawnTemplate.units[UnitID].y = CirclePos.y + end + self:T( 'SpawnTemplate.units['..UnitID..'].x = ' .. SpawnTemplate.units[UnitID].x .. ', SpawnTemplate.units['..UnitID..'].y = ' .. SpawnTemplate.units[UnitID].y ) + end + + local SpawnPos = routines.getRandPointInCircle( UnitPoint, OuterRadius, InnerRadius ) + local Point = {} + Point.type = "Turning Point" + Point.x = SpawnPos.x + Point.y = SpawnPos.y + Point.action = "Cone" + Point.speed = 5 + + table.insert( SpawnTemplate.route.points, 2, Point ) + + return self:SpawnWithIndex( self.SpawnIndex ) + end + end + end + + return nil +end + +--- Will spawn a Group within a given @{Zone#ZONE}. +-- Once the group is spawned within the zone, it will continue on its route. +-- The first waypoint (where the group is spawned) is replaced with the zone coordinates. +-- @param #SPAWN self +-- @param Zone#ZONE Zone The zone where the group is to be spawned. +-- @param #number ZoneRandomize (Optional) Set to true if you want to randomize the starting point in the zone. +-- @param #number SpawnIndex (Optional) The index which group to spawn within the given zone. +-- @return Group#GROUP that was spawned. +-- @return #nil when nothing was spawned. +function SPAWN:SpawnInZone( Zone, ZoneRandomize, SpawnIndex ) + self:F( { self.SpawnTemplatePrefix, Zone, ZoneRandomize, SpawnIndex } ) + + if Zone then + + if SpawnIndex then + else + SpawnIndex = self.SpawnIndex + 1 + end + + if self:_GetSpawnIndex( SpawnIndex ) then + + local SpawnTemplate = self.SpawnGroups[self.SpawnIndex].SpawnTemplate + + if SpawnTemplate then + + local ZonePoint + + if ZoneRandomize == true then + ZonePoint = Zone:GetRandomPointVec2() + else + ZonePoint = Zone:GetPointVec2() + end + + SpawnTemplate.route.points[1].x = ZonePoint.x + SpawnTemplate.route.points[1].y = ZonePoint.y + + -- Apply SpawnFormation + for UnitID = 1, #SpawnTemplate.units do + local ZonePointUnit = Zone:GetRandomPointVec2() + SpawnTemplate.units[UnitID].x = ZonePointUnit.x + SpawnTemplate.units[UnitID].y = ZonePointUnit.y + self:T( 'SpawnTemplate.units['..UnitID..'].x = ' .. SpawnTemplate.units[UnitID].x .. ', SpawnTemplate.units['..UnitID..'].y = ' .. SpawnTemplate.units[UnitID].y ) + end + + return self:SpawnWithIndex( self.SpawnIndex ) + end + end + end + + return nil +end + + + + +--- Will spawn a plane group in uncontrolled mode... +-- This will be similar to the uncontrolled flag setting in the ME. +-- @return #SPAWN self +function SPAWN:UnControlled() + self:F( { self.SpawnTemplatePrefix } ) + + self.SpawnUnControlled = true + + for SpawnGroupID = 1, self.SpawnMaxGroups do + self.SpawnGroups[SpawnGroupID].UnControlled = true + end + + return self +end + + + +--- Will return the SpawnGroupName either with with a specific count number or without any count. +-- @param #SPAWN self +-- @param #number SpawnIndex Is the number of the Group that is to be spawned. +-- @return #string SpawnGroupName +function SPAWN:SpawnGroupName( SpawnIndex ) + self:F( { self.SpawnTemplatePrefix, SpawnIndex } ) + + local SpawnPrefix = self.SpawnTemplatePrefix + if self.SpawnAliasPrefix then + SpawnPrefix = self.SpawnAliasPrefix + end + + if SpawnIndex then + local SpawnName = string.format( '%s#%03d', SpawnPrefix, SpawnIndex ) + self:T( SpawnName ) + return SpawnName + else + self:T( SpawnPrefix ) + return SpawnPrefix + end + +end + +--- Find the first alive group. +-- @param #SPAWN self +-- @param #number SpawnCursor A number holding the index from where to find the first group from. +-- @return Group#GROUP, #number The group found, the new index where the group was found. +-- @return #nil, #nil When no group is found, #nil is returned. +function SPAWN:GetFirstAliveGroup( SpawnCursor ) + self:F( { self.SpawnTemplatePrefix, self.SpawnAliasPrefix, SpawnCursor } ) + + for SpawnIndex = 1, self.SpawnCount do + local SpawnGroup = self:GetGroupFromIndex( SpawnIndex ) + if SpawnGroup and SpawnGroup:IsAlive() then + SpawnCursor = SpawnIndex + return SpawnGroup, SpawnCursor + end + end + + return nil, nil +end + + +--- Find the next alive group. +-- @param #SPAWN self +-- @param #number SpawnCursor A number holding the last found previous index. +-- @return Group#GROUP, #number The group found, the new index where the group was found. +-- @return #nil, #nil When no group is found, #nil is returned. +function SPAWN:GetNextAliveGroup( SpawnCursor ) + self:F( { self.SpawnTemplatePrefix, self.SpawnAliasPrefix, SpawnCursor } ) + + SpawnCursor = SpawnCursor + 1 + for SpawnIndex = SpawnCursor, self.SpawnCount do + local SpawnGroup = self:GetGroupFromIndex( SpawnIndex ) + if SpawnGroup and SpawnGroup:IsAlive() then + SpawnCursor = SpawnIndex + return SpawnGroup, SpawnCursor + end + end + + return nil, nil +end + +--- Find the last alive group during runtime. +function SPAWN:GetLastAliveGroup() + self:F( { self.SpawnTemplatePrefixself.SpawnAliasPrefix } ) + + self.SpawnIndex = self:_GetLastIndex() + for SpawnIndex = self.SpawnIndex, 1, -1 do + local SpawnGroup = self:GetGroupFromIndex( SpawnIndex ) + if SpawnGroup and SpawnGroup:IsAlive() then + self.SpawnIndex = SpawnIndex + return SpawnGroup + end + end + + self.SpawnIndex = nil + return nil +end + + + +--- Get the group from an index. +-- Returns the group from the SpawnGroups list. +-- If no index is given, it will return the first group in the list. +-- @param #SPAWN self +-- @param #number SpawnIndex The index of the group to return. +-- @return Group#GROUP +function SPAWN:GetGroupFromIndex( SpawnIndex ) + self:F( { self.SpawnTemplatePrefix, self.SpawnAliasPrefix, SpawnIndex } ) + + if not SpawnIndex then + SpawnIndex = 1 + end + + if self.SpawnGroups and self.SpawnGroups[SpawnIndex] then + local SpawnGroup = self.SpawnGroups[SpawnIndex].Group + return SpawnGroup + else + return nil + end +end + +--- Get the group index from a DCSUnit. +-- The method will search for a #-mark, and will return the index behind the #-mark of the DCSUnit. +-- It will return nil of no prefix was found. +-- @param #SPAWN self +-- @param DCSUnit The DCS unit to be searched. +-- @return #string The prefix +-- @return #nil Nothing found +function SPAWN:_GetGroupIndexFromDCSUnit( DCSUnit ) + self:F( { self.SpawnTemplatePrefix, self.SpawnAliasPrefix, DCSUnit } ) + + if DCSUnit and DCSUnit:getName() then + local IndexString = string.match( DCSUnit:getName(), "#.*-" ):sub( 2, -2 ) + self:T( IndexString ) + + if IndexString then + local Index = tonumber( IndexString ) + self:T( { "Index:", IndexString, Index } ) + return Index + end + end + + return nil +end + +--- Return the prefix of a DCSUnit. +-- The method will search for a #-mark, and will return the text before the #-mark. +-- It will return nil of no prefix was found. +-- @param #SPAWN self +-- @param DCSUnit The DCS unit to be searched. +-- @return #string The prefix +-- @return #nil Nothing found +function SPAWN:_GetPrefixFromDCSUnit( DCSUnit ) + self:F( { self.SpawnTemplatePrefix, self.SpawnAliasPrefix, DCSUnit } ) + + if DCSUnit and DCSUnit:getName() then + local SpawnPrefix = string.match( DCSUnit:getName(), ".*#" ) + if SpawnPrefix then + SpawnPrefix = SpawnPrefix:sub( 1, -2 ) + end + self:T( SpawnPrefix ) + return SpawnPrefix + end + + return nil +end + +--- Return the group within the SpawnGroups collection with input a DCSUnit. +function SPAWN:_GetGroupFromDCSUnit( DCSUnit ) + self:F( { self.SpawnTemplatePrefix, self.SpawnAliasPrefix, DCSUnit } ) + + if DCSUnit then + local SpawnPrefix = self:_GetPrefixFromDCSUnit( DCSUnit ) + + if self.SpawnTemplatePrefix == SpawnPrefix or ( self.SpawnAliasPrefix and self.SpawnAliasPrefix == SpawnPrefix ) then + local SpawnGroupIndex = self:_GetGroupIndexFromDCSUnit( DCSUnit ) + local SpawnGroup = self.SpawnGroups[SpawnGroupIndex].Group + self:T( SpawnGroup ) + return SpawnGroup + end + end + + return nil +end + + +--- Get the index from a given group. +-- The function will search the name of the group for a #, and will return the number behind the #-mark. +function SPAWN:GetSpawnIndexFromGroup( SpawnGroup ) + self:F( { self.SpawnTemplatePrefix, self.SpawnAliasPrefix, SpawnGroup } ) + + local IndexString = string.match( SpawnGroup:GetName(), "#.*$" ):sub( 2 ) + local Index = tonumber( IndexString ) + + self:T( IndexString, Index ) + return Index + +end + +--- Return the last maximum index that can be used. +function SPAWN:_GetLastIndex() + self:F( { self.SpawnTemplatePrefix, self.SpawnAliasPrefix } ) + + return self.SpawnMaxGroups +end + +--- Initalize the SpawnGroups collection. +function SPAWN:_InitializeSpawnGroups( SpawnIndex ) + self:F( { self.SpawnTemplatePrefix, self.SpawnAliasPrefix, SpawnIndex } ) + + if not self.SpawnGroups[SpawnIndex] then + self.SpawnGroups[SpawnIndex] = {} + self.SpawnGroups[SpawnIndex].Visible = false + self.SpawnGroups[SpawnIndex].Spawned = false + self.SpawnGroups[SpawnIndex].UnControlled = false + self.SpawnGroups[SpawnIndex].SpawnTime = 0 + + self.SpawnGroups[SpawnIndex].SpawnTemplatePrefix = self.SpawnTemplatePrefix + self.SpawnGroups[SpawnIndex].SpawnTemplate = self:_Prepare( self.SpawnGroups[SpawnIndex].SpawnTemplatePrefix, SpawnIndex ) + end + + self:_RandomizeTemplate( SpawnIndex ) + self:_RandomizeRoute( SpawnIndex ) + --self:_TranslateRotate( SpawnIndex ) + + return self.SpawnGroups[SpawnIndex] +end + + + +--- Gets the CategoryID of the Group with the given SpawnPrefix +function SPAWN:_GetGroupCategoryID( SpawnPrefix ) + local TemplateGroup = Group.getByName( SpawnPrefix ) + + if TemplateGroup then + return TemplateGroup:getCategory() + else + return nil + end +end + +--- Gets the CoalitionID of the Group with the given SpawnPrefix +function SPAWN:_GetGroupCoalitionID( SpawnPrefix ) + local TemplateGroup = Group.getByName( SpawnPrefix ) + + if TemplateGroup then + return TemplateGroup:getCoalition() + else + return nil + end +end + +--- Gets the CountryID of the Group with the given SpawnPrefix +function SPAWN:_GetGroupCountryID( SpawnPrefix ) + self:F( { self.SpawnTemplatePrefix, self.SpawnAliasPrefix, SpawnPrefix } ) + + local TemplateGroup = Group.getByName( SpawnPrefix ) + + if TemplateGroup then + local TemplateUnits = TemplateGroup:getUnits() + return TemplateUnits[1]:getCountry() + else + return nil + end +end + +--- Gets the Group Template from the ME environment definition. +-- This method used the @{DATABASE} object, which contains ALL initial and new spawned object in MOOSE. +-- @param #SPAWN self +-- @param #string SpawnTemplatePrefix +-- @return @SPAWN self +function SPAWN:_GetTemplate( SpawnTemplatePrefix ) + self:F( { self.SpawnTemplatePrefix, self.SpawnAliasPrefix, SpawnTemplatePrefix } ) + + local SpawnTemplate = nil + + SpawnTemplate = routines.utils.deepCopy( _DATABASE.Templates.Groups[SpawnTemplatePrefix].Template ) + + if SpawnTemplate == nil then + error( 'No Template returned for SpawnTemplatePrefix = ' .. SpawnTemplatePrefix ) + end + + SpawnTemplate.SpawnCoalitionID = self:_GetGroupCoalitionID( SpawnTemplatePrefix ) + SpawnTemplate.SpawnCategoryID = self:_GetGroupCategoryID( SpawnTemplatePrefix ) + SpawnTemplate.SpawnCountryID = self:_GetGroupCountryID( SpawnTemplatePrefix ) + + self:T( { SpawnTemplate } ) + return SpawnTemplate +end + +--- Prepares the new Group Template. +-- @param #SPAWN self +-- @param #string SpawnTemplatePrefix +-- @param #number SpawnIndex +-- @return #SPAWN self +function SPAWN:_Prepare( SpawnTemplatePrefix, SpawnIndex ) + self:F( { self.SpawnTemplatePrefix, self.SpawnAliasPrefix } ) + + local SpawnTemplate = self:_GetTemplate( SpawnTemplatePrefix ) + SpawnTemplate.name = self:SpawnGroupName( SpawnIndex ) + + SpawnTemplate.groupId = nil + SpawnTemplate.lateActivation = false + + if SpawnTemplate.SpawnCategoryID == Group.Category.GROUND then + self:T( "For ground units, visible needs to be false..." ) + SpawnTemplate.visible = false + end + + if SpawnTemplate.SpawnCategoryID == Group.Category.HELICOPTER or SpawnTemplate.SpawnCategoryID == Group.Category.AIRPLANE then + SpawnTemplate.uncontrolled = false + end + + for UnitID = 1, #SpawnTemplate.units do + SpawnTemplate.units[UnitID].name = string.format( SpawnTemplate.name .. '-%02d', UnitID ) + SpawnTemplate.units[UnitID].unitId = nil + SpawnTemplate.units[UnitID].x = SpawnTemplate.route.points[1].x + SpawnTemplate.units[UnitID].y = SpawnTemplate.route.points[1].y + end + + self:T( { "Template:", SpawnTemplate } ) + return SpawnTemplate + +end + +--- Private method randomizing the routes. +-- @param #SPAWN self +-- @param #number SpawnIndex The index of the group to be spawned. +-- @return #SPAWN +function SPAWN:_RandomizeRoute( SpawnIndex ) + self:F( { self.SpawnTemplatePrefix, SpawnIndex, self.SpawnRandomizeRoute, self.SpawnRandomizeRouteStartPoint, self.SpawnRandomizeRouteEndPoint, self.SpawnRandomizeRouteRadius } ) + + if self.SpawnRandomizeRoute then + local SpawnTemplate = self.SpawnGroups[SpawnIndex].SpawnTemplate + local RouteCount = #SpawnTemplate.route.points + + for t = self.SpawnRandomizeRouteStartPoint + 1, ( RouteCount - self.SpawnRandomizeRouteEndPoint ) do + SpawnTemplate.route.points[t].x = SpawnTemplate.route.points[t].x + math.random( self.SpawnRandomizeRouteRadius * -1, self.SpawnRandomizeRouteRadius ) + SpawnTemplate.route.points[t].y = SpawnTemplate.route.points[t].y + math.random( self.SpawnRandomizeRouteRadius * -1, self.SpawnRandomizeRouteRadius ) + -- TODO: manage altitude for airborne units ... + SpawnTemplate.route.points[t].alt = nil + --SpawnGroup.route.points[t].alt_type = nil + self:T( 'SpawnTemplate.route.points[' .. t .. '].x = ' .. SpawnTemplate.route.points[t].x .. ', SpawnTemplate.route.points[' .. t .. '].y = ' .. SpawnTemplate.route.points[t].y ) + end + end + + return self +end + +--- Private method that randomizes the template of the group. +-- @param #SPAWN self +-- @param #number SpawnIndex +-- @return #SPAWN self +function SPAWN:_RandomizeTemplate( SpawnIndex ) + self:F( { self.SpawnTemplatePrefix, SpawnIndex } ) + + if self.SpawnRandomizeTemplate then + self.SpawnGroups[SpawnIndex].SpawnTemplatePrefix = self.SpawnTemplatePrefixTable[ math.random( 1, #self.SpawnTemplatePrefixTable ) ] + self.SpawnGroups[SpawnIndex].SpawnTemplate = self:_Prepare( self.SpawnGroups[SpawnIndex].SpawnTemplatePrefix, SpawnIndex ) + self.SpawnGroups[SpawnIndex].SpawnTemplate.route = routines.utils.deepCopy( self.SpawnTemplate.route ) + self.SpawnGroups[SpawnIndex].SpawnTemplate.x = self.SpawnTemplate.x + self.SpawnGroups[SpawnIndex].SpawnTemplate.y = self.SpawnTemplate.y + self.SpawnGroups[SpawnIndex].SpawnTemplate.start_time = self.SpawnTemplate.start_time + for UnitID = 1, #self.SpawnGroups[SpawnIndex].SpawnTemplate.units do + self.SpawnGroups[SpawnIndex].SpawnTemplate.units[UnitID].heading = self.SpawnTemplate.units[1].heading + end + end + + self:_RandomizeRoute( SpawnIndex ) + + return self +end + +function SPAWN:_TranslateRotate( SpawnIndex, SpawnRootX, SpawnRootY, SpawnX, SpawnY, SpawnAngle ) + self:F( { self.SpawnTemplatePrefix, SpawnIndex, SpawnRootX, SpawnRootY, SpawnX, SpawnY, SpawnAngle } ) + + -- Translate + local TranslatedX = SpawnX + local TranslatedY = SpawnY + + -- Rotate + -- From Wikipedia: https://en.wikipedia.org/wiki/Rotation_matrix#Common_rotations + -- x' = x \cos \theta - y \sin \theta\ + -- y' = x \sin \theta + y \cos \theta\ + local RotatedX = - TranslatedX * math.cos( math.rad( SpawnAngle ) ) + + TranslatedY * math.sin( math.rad( SpawnAngle ) ) + local RotatedY = TranslatedX * math.sin( math.rad( SpawnAngle ) ) + + TranslatedY * math.cos( math.rad( SpawnAngle ) ) + + -- Assign + self.SpawnGroups[SpawnIndex].SpawnTemplate.x = SpawnRootX - RotatedX + self.SpawnGroups[SpawnIndex].SpawnTemplate.y = SpawnRootY + RotatedY + + + local SpawnUnitCount = table.getn( self.SpawnGroups[SpawnIndex].SpawnTemplate.units ) + for u = 1, SpawnUnitCount do + + -- Translate + local TranslatedX = SpawnX + local TranslatedY = SpawnY - 10 * ( u - 1 ) + + -- Rotate + local RotatedX = - TranslatedX * math.cos( math.rad( SpawnAngle ) ) + + TranslatedY * math.sin( math.rad( SpawnAngle ) ) + local RotatedY = TranslatedX * math.sin( math.rad( SpawnAngle ) ) + + TranslatedY * math.cos( math.rad( SpawnAngle ) ) + + -- Assign + self.SpawnGroups[SpawnIndex].SpawnTemplate.units[u].x = SpawnRootX - RotatedX + self.SpawnGroups[SpawnIndex].SpawnTemplate.units[u].y = SpawnRootY + RotatedY + self.SpawnGroups[SpawnIndex].SpawnTemplate.units[u].heading = self.SpawnGroups[SpawnIndex].SpawnTemplate.units[u].heading + math.rad( SpawnAngle ) + end + + return self +end + +--- Get the next index of the groups to be spawned. This function is complicated, as it is used at several spaces. +function SPAWN:_GetSpawnIndex( SpawnIndex ) + self:F( { self.SpawnTemplatePrefix, SpawnIndex, self.SpawnMaxGroups, self.SpawnMaxUnitsAlive, self.AliveUnits, #self.SpawnTemplate.units } ) + + + if ( self.SpawnMaxGroups == 0 ) or ( SpawnIndex <= self.SpawnMaxGroups ) then + if ( self.SpawnMaxUnitsAlive == 0 ) or ( self.AliveUnits < self.SpawnMaxUnitsAlive * #self.SpawnTemplate.units ) or self.UnControlled then + if SpawnIndex and SpawnIndex >= self.SpawnCount + 1 then + self.SpawnCount = self.SpawnCount + 1 + SpawnIndex = self.SpawnCount + end + self.SpawnIndex = SpawnIndex + if not self.SpawnGroups[self.SpawnIndex] then + self:_InitializeSpawnGroups( self.SpawnIndex ) + end + else + return nil + end + else + return nil + end + + return self.SpawnIndex +end + + +-- TODO Need to delete this... _DATABASE does this now ... +function SPAWN:_OnBirth( event ) + + if timer.getTime0() < timer.getAbsTime() then -- dont need to add units spawned in at the start of the mission if mist is loaded in init line + if event.initiator and event.initiator:getName() then + local EventPrefix = self:_GetPrefixFromDCSUnit( event.initiator ) + if EventPrefix == self.SpawnTemplatePrefix or ( self.SpawnAliasPrefix and EventPrefix == self.SpawnAliasPrefix ) then + self:T( { "Birth event: " .. event.initiator:getName(), event } ) + --MessageToAll( "Mission command: unit " .. SpawnTemplatePrefix .. " spawned." , 5, EventPrefix .. '/Event') + self.AliveUnits = self.AliveUnits + 1 + self:T( "Alive Units: " .. self.AliveUnits ) + end + end + end + +end + +--- Obscolete +-- @todo Need to delete this... _DATABASE does this now ... +function SPAWN:_OnDeadOrCrash( event ) + self:F( self.SpawnTemplatePrefix, event ) + + if event.initiator and event.initiator:getName() then + local EventPrefix = self:_GetPrefixFromDCSUnit( event.initiator ) + if EventPrefix == self.SpawnTemplatePrefix or ( self.SpawnAliasPrefix and EventPrefix == self.SpawnAliasPrefix ) then + self:T( { "Dead event: " .. event.initiator:getName(), event } ) +-- local DestroyedUnit = Unit.getByName( EventPrefix ) +-- if DestroyedUnit and DestroyedUnit.getLife() <= 1.0 then + --MessageToAll( "Mission command: unit " .. SpawnTemplatePrefix .. " crashed." , 5, EventPrefix .. '/Event') + self.AliveUnits = self.AliveUnits - 1 + self:T( "Alive Units: " .. self.AliveUnits ) +-- end + end + end +end + +--- Will detect AIR Units taking off... When the event takes place, the spawned Group is registered as airborne... +-- This is needed to ensure that Re-SPAWNing only is done for landed AIR Groups. +-- @todo Need to test for AIR Groups only... +function SPAWN:_OnTakeOff( event ) + self:F( self.SpawnTemplatePrefix, event ) + + if event.initiator and event.initiator:getName() then + local SpawnGroup = self:_GetGroupFromDCSUnit( event.initiator ) + if SpawnGroup then + self:T( { "TakeOff event: " .. event.initiator:getName(), event } ) + self:T( "self.Landed = false" ) + self.Landed = false + end + end +end + +--- Will detect AIR Units landing... When the event takes place, the spawned Group is registered as landed. +-- This is needed to ensure that Re-SPAWNing is only done for landed AIR Groups. +-- @todo Need to test for AIR Groups only... +function SPAWN:_OnLand( event ) + self:F( self.SpawnTemplatePrefix, event ) + + local SpawnUnit = event.initiator + if SpawnUnit and SpawnUnit:isExist() and Object.getCategory(SpawnUnit) == Object.Category.UNIT then + local SpawnGroup = self:_GetGroupFromDCSUnit( SpawnUnit ) + if SpawnGroup then + self:T( { "Landed event:" .. SpawnUnit:getName(), event } ) + self.Landed = true + self:T( "self.Landed = true" ) + if self.Landed and self.RepeatOnLanding then + local SpawnGroupIndex = self:GetSpawnIndexFromGroup( SpawnGroup ) + self:T( { "Landed:", "ReSpawn:", SpawnGroup:GetName(), SpawnGroupIndex } ) + self:ReSpawn( SpawnGroupIndex ) + end + end + end +end + +--- Will detect AIR Units shutting down their engines ... +-- When the event takes place, and the method @{RepeatOnEngineShutDown} was called, the spawned Group will Re-SPAWN. +-- But only when the Unit was registered to have landed. +-- @param #SPAWN self +-- @see _OnTakeOff +-- @see _OnLand +-- @todo Need to test for AIR Groups only... +function SPAWN:_OnEngineShutDown( event ) + self:F( self.SpawnTemplatePrefix, event ) + + local SpawnUnit = event.initiator + if SpawnUnit and SpawnUnit:isExist() and Object.getCategory(SpawnUnit) == Object.Category.UNIT then + local SpawnGroup = self:_GetGroupFromDCSUnit( SpawnUnit ) + if SpawnGroup then + self:T( { "EngineShutDown event: " .. SpawnUnit:getName(), event } ) + if self.Landed and self.RepeatOnEngineShutDown then + local SpawnGroupIndex = self:GetSpawnIndexFromGroup( SpawnGroup ) + self:T( { "EngineShutDown: ", "ReSpawn:", SpawnGroup:GetName(), SpawnGroupIndex } ) + self:ReSpawn( SpawnGroupIndex ) + end + end + end +end + +--- This function is called automatically by the Spawning scheduler. +-- It is the internal worker method SPAWNing new Groups on the defined time intervals. +function SPAWN:_Scheduler() + self:F( { "_Scheduler", self.SpawnTemplatePrefix, self.SpawnAliasPrefix, self.SpawnIndex, self.SpawnMaxGroups, self.SpawnMaxUnitsAlive } ) + + -- Validate if there are still groups left in the batch... + self:Spawn() + + return true +end + +function SPAWN:_SpawnCleanUpScheduler() + self:F( { "CleanUp Scheduler:", self.SpawnTemplatePrefix } ) + + local SpawnCursor + local SpawnGroup, SpawnCursor = self:GetFirstAliveGroup( SpawnCursor ) + + self:T( { "CleanUp Scheduler:", SpawnGroup } ) + + while SpawnGroup do + + if SpawnGroup:AllOnGround() and SpawnGroup:GetMaxVelocity() < 1 then + if not self.SpawnCleanUpTimeStamps[SpawnGroup:GetName()] then + self.SpawnCleanUpTimeStamps[SpawnGroup:GetName()] = timer.getTime() + else + if self.SpawnCleanUpTimeStamps[SpawnGroup:GetName()] + self.SpawnCleanUpInterval < timer.getTime() then + self:T( { "CleanUp Scheduler:", "Cleaning:", SpawnGroup } ) + SpawnGroup:Destroy() + end + end + else + self.SpawnCleanUpTimeStamps[SpawnGroup:GetName()] = nil + end + + SpawnGroup, SpawnCursor = self:GetNextAliveGroup( SpawnCursor ) + + self:T( { "CleanUp Scheduler:", SpawnGroup } ) + + end + + return true -- Repeat + +end +--- Limit the simultaneous movement of Groups within a running Mission. +-- This module is defined to improve the performance in missions, and to bring additional realism for GROUND vehicles. +-- Performance: If in a DCSRTE there are a lot of moving GROUND units, then in a multi player mission, this WILL create lag if +-- the main DCS execution core of your CPU is fully utilized. So, this class will limit the amount of simultaneous moving GROUND units +-- on defined intervals (currently every minute). +-- @module MOVEMENT + +Include.File( "Routines" ) + +--- the MOVEMENT class +-- @type +MOVEMENT = { + ClassName = "MOVEMENT", +} + +--- Creates the main object which is handling the GROUND forces movement. +-- @param table{string,...}|string MovePrefixes is a table of the Prefixes (names) of the GROUND Groups that need to be controlled by the MOVEMENT Object. +-- @param number MoveMaximum is a number that defines the maximum amount of GROUND Units to be moving during one minute. +-- @return MOVEMENT +-- @usage +-- -- Limit the amount of simultaneous moving units on the ground to prevent lag. +-- Movement_US_Platoons = MOVEMENT:New( { 'US Tank Platoon Left', 'US Tank Platoon Middle', 'US Tank Platoon Right', 'US CH-47D Troops' }, 15 ) + +function MOVEMENT:New( MovePrefixes, MoveMaximum ) + local self = BASE:Inherit( self, BASE:New() ) + self:F( { MovePrefixes, MoveMaximum } ) + + if type( MovePrefixes ) == 'table' then + self.MovePrefixes = MovePrefixes + else + self.MovePrefixes = { MovePrefixes } + end + self.MoveCount = 0 -- The internal counter of the amount of Moveing the has happened since MoveStart. + self.MoveMaximum = MoveMaximum -- Contains the Maximum amount of units that are allowed to move... + self.AliveUnits = 0 -- Contains the counter how many units are currently alive + self.MoveUnits = {} -- Reflects if the Moving for this MovePrefixes is going to be scheduled or not. + + _EVENTDISPATCHER:OnBirth( self.OnBirth, self ) + +-- self:AddEvent( world.event.S_EVENT_BIRTH, self.OnBirth ) +-- +-- self:EnableEvents() + + self:ScheduleStart() + + return self +end + +--- Call this function to start the MOVEMENT scheduling. +function MOVEMENT:ScheduleStart() + self:F() + --self.MoveFunction = routines.scheduleFunction( self._Scheduler, { self }, timer.getTime() + 1, 120 ) + self.MoveFunction = SCHEDULER:New( self, self._Scheduler, {}, 1, 120 ) +end + +--- Call this function to stop the MOVEMENT scheduling. +-- @todo need to implement it ... Forgot. +function MOVEMENT:ScheduleStop() + self:F() + +end + +--- Captures the birth events when new Units were spawned. +-- @todo This method should become obsolete. The new @{DATABASE} class will handle the collection administration. +function MOVEMENT:OnBirth( Event ) + self:F( { Event } ) + + if timer.getTime0() < timer.getAbsTime() then -- dont need to add units spawned in at the start of the mission if mist is loaded in init line + if Event.IniDCSUnit then + self:T( "Birth object : " .. Event.IniDCSUnitName ) + if Event.IniDCSGroup and Event.IniDCSGroup:isExist() then + for MovePrefixID, MovePrefix in pairs( self.MovePrefixes ) do + if string.find( Event.IniDCSUnitName, MovePrefix, 1, true ) then + self.AliveUnits = self.AliveUnits + 1 + self.MoveUnits[Event.IniDCSUnitName] = Event.IniDCSGroupName + self:T( self.AliveUnits ) + end + end + end + end + _EVENTDISPATCHER:OnCrashForUnit( Event.IniDCSUnitName, self.OnDeadOrCrash, self ) + _EVENTDISPATCHER:OnDeadForUnit( Event.IniDCSUnitName, self.OnDeadOrCrash, self ) + end + +end + +--- Captures the Dead or Crash events when Units crash or are destroyed. +-- @todo This method should become obsolete. The new @{DATABASE} class will handle the collection administration. +function MOVEMENT:OnDeadOrCrash( Event ) + self:F( { Event } ) + + if Event.IniDCSUnit then + self:T( "Dead object : " .. Event.IniDCSUnitName ) + for MovePrefixID, MovePrefix in pairs( self.MovePrefixes ) do + if string.find( Event.IniDCSUnitName, MovePrefix, 1, true ) then + self.AliveUnits = self.AliveUnits - 1 + self.MoveUnits[Event.IniDCSUnitName] = nil + self:T( self.AliveUnits ) + end + end + end +end + +--- This function is called automatically by the MOVEMENT scheduler. A new function is scheduled when MoveScheduled is true. +function MOVEMENT:_Scheduler() + self:F( { self.MovePrefixes, self.MoveMaximum, self.AliveUnits, self.MovementGroups } ) + + if self.AliveUnits > 0 then + local MoveProbability = ( self.MoveMaximum * 100 ) / self.AliveUnits + self:T( 'Move Probability = ' .. MoveProbability ) + + for MovementUnitName, MovementGroupName in pairs( self.MoveUnits ) do + local MovementGroup = Group.getByName( MovementGroupName ) + if MovementGroup and MovementGroup:isExist() then + local MoveOrStop = math.random( 1, 100 ) + self:T( 'MoveOrStop = ' .. MoveOrStop ) + if MoveOrStop <= MoveProbability then + self:T( 'Group continues moving = ' .. MovementGroupName ) + trigger.action.groupContinueMoving( MovementGroup ) + else + self:T( 'Group stops moving = ' .. MovementGroupName ) + trigger.action.groupStopMoving( MovementGroup ) + end + else + self.MoveUnits[MovementUnitName] = nil + end + end + end + return true +end +--- Provides defensive behaviour to a set of SAM sites within a running Mission. +-- @module Sead +-- @author to be searched on the forum +-- @author (co) Flightcontrol (Modified and enriched with functionality) + +Include.File( "Routines" ) +Include.File( "Event" ) +Include.File( "Base" ) +Include.File( "Mission" ) +Include.File( "Client" ) +Include.File( "Task" ) + +--- The SEAD class +-- @type SEAD +-- @extends Base#BASE +SEAD = { + ClassName = "SEAD", + TargetSkill = { + Average = { Evade = 50, DelayOff = { 10, 25 }, DelayOn = { 10, 30 } } , + Good = { Evade = 30, DelayOff = { 8, 20 }, DelayOn = { 20, 40 } } , + High = { Evade = 15, DelayOff = { 5, 17 }, DelayOn = { 30, 50 } } , + Excellent = { Evade = 10, DelayOff = { 3, 10 }, DelayOn = { 30, 60 } } + }, + SEADGroupPrefixes = {} +} + +--- Creates the main object which is handling defensive actions for SA sites or moving SA vehicles. +-- When an anti radiation missile is fired (KH-58, KH-31P, KH-31A, KH-25MPU, HARM missiles), the SA will shut down their radars and will take evasive actions... +-- Chances are big that the missile will miss. +-- @param table{string,...}|string SEADGroupPrefixes which is a table of Prefixes of the SA Groups in the DCSRTE on which evasive actions need to be taken. +-- @return SEAD +-- @usage +-- -- CCCP SEAD Defenses +-- -- Defends the Russian SA installations from SEAD attacks. +-- SEAD_RU_SAM_Defenses = SEAD:New( { 'RU SA-6 Kub', 'RU SA-6 Defenses', 'RU MI-26 Troops', 'RU Attack Gori' } ) +function SEAD:New( SEADGroupPrefixes ) + local self = BASE:Inherit( self, BASE:New() ) + self:F( SEADGroupPrefixes ) + if type( SEADGroupPrefixes ) == 'table' then + for SEADGroupPrefixID, SEADGroupPrefix in pairs( SEADGroupPrefixes ) do + self.SEADGroupPrefixes[SEADGroupPrefix] = SEADGroupPrefix + end + else + self.SEADGroupNames[SEADGroupPrefixes] = SEADGroupPrefixes + end + _EVENTDISPATCHER:OnShot( self.EventShot, self ) + + return self +end + +--- Detects if an SA site was shot with an anti radiation missile. In this case, take evasive actions based on the skill level set within the ME. +-- @see SEAD +function SEAD:EventShot( Event ) + self:F( { Event } ) + + local SEADUnit = Event.IniDCSUnit + local SEADUnitName = Event.IniDCSUnitName + local SEADWeapon = Event.Weapon -- Identify the weapon fired + local SEADWeaponName = Event.WeaponName -- return weapon type + --trigger.action.outText( string.format("Alerte, depart missile " ..string.format(SEADWeaponName)), 20) --debug message + -- Start of the 2nd loop + self:T( "Missile Launched = " .. SEADWeaponName ) + if SEADWeaponName == "KH-58" or SEADWeaponName == "KH-25MPU" or SEADWeaponName == "AGM-88" or SEADWeaponName == "KH-31A" or SEADWeaponName == "KH-31P" then -- Check if the missile is a SEAD + local _evade = math.random (1,100) -- random number for chance of evading action + local _targetMim = Event.Weapon:getTarget() -- Identify target + local _targetMimname = Unit.getName(_targetMim) + local _targetMimgroup = Unit.getGroup(Weapon.getTarget(SEADWeapon)) + local _targetMimgroupName = _targetMimgroup:getName() + local _targetMimcont= _targetMimgroup:getController() + local _targetskill = _DATABASE.Templates.Units[_targetMimname].Template.skill + self:T( self.SEADGroupPrefixes ) + self:T( _targetMimgroupName ) + local SEADGroupFound = false + for SEADGroupPrefixID, SEADGroupPrefix in pairs( self.SEADGroupPrefixes ) do + if string.find( _targetMimgroupName, SEADGroupPrefix, 1, true ) then + SEADGroupFound = true + self:T( 'Group Found' ) + break + end + end + if SEADGroupFound == true then + if _targetskill == "Random" then -- when skill is random, choose a skill + local Skills = { "Average", "Good", "High", "Excellent" } + _targetskill = Skills[ math.random(1,4) ] + end + self:T( _targetskill ) -- debug message for skill check + if self.TargetSkill[_targetskill] then + if (_evade > self.TargetSkill[_targetskill].Evade) then + self:T( string.format("Evading, target skill " ..string.format(_targetskill)) ) --debug message + local _targetMim = Weapon.getTarget(SEADWeapon) + local _targetMimname = Unit.getName(_targetMim) + local _targetMimgroup = Unit.getGroup(Weapon.getTarget(SEADWeapon)) + local _targetMimcont= _targetMimgroup:getController() + routines.groupRandomDistSelf(_targetMimgroup,300,'Diamond',250,20) -- move randomly + local SuppressedGroups1 = {} -- unit suppressed radar off for a random time + local function SuppressionEnd1(id) + id.ctrl:setOption(AI.Option.Ground.id.ALARM_STATE,AI.Option.Ground.val.ALARM_STATE.GREEN) + SuppressedGroups1[id.groupName] = nil + end + local id = { + groupName = _targetMimgroup, + ctrl = _targetMimcont + } + local delay1 = math.random(self.TargetSkill[_targetskill].DelayOff[1], self.TargetSkill[_targetskill].DelayOff[2]) + if SuppressedGroups1[id.groupName] == nil then + SuppressedGroups1[id.groupName] = { + SuppressionEndTime1 = timer.getTime() + delay1, + SuppressionEndN1 = SuppressionEndCounter1 --Store instance of SuppressionEnd() scheduled function + } + Controller.setOption(_targetMimcont, AI.Option.Ground.id.ALARM_STATE,AI.Option.Ground.val.ALARM_STATE.GREEN) + timer.scheduleFunction(SuppressionEnd1, id, SuppressedGroups1[id.groupName].SuppressionEndTime1) --Schedule the SuppressionEnd() function + --trigger.action.outText( string.format("Radar Off " ..string.format(delay1)), 20) + end + + local SuppressedGroups = {} + local function SuppressionEnd(id) + id.ctrl:setOption(AI.Option.Ground.id.ALARM_STATE,AI.Option.Ground.val.ALARM_STATE.RED) + SuppressedGroups[id.groupName] = nil + end + local id = { + groupName = _targetMimgroup, + ctrl = _targetMimcont + } + local delay = math.random(self.TargetSkill[_targetskill].DelayOn[1], self.TargetSkill[_targetskill].DelayOn[2]) + if SuppressedGroups[id.groupName] == nil then + SuppressedGroups[id.groupName] = { + SuppressionEndTime = timer.getTime() + delay, + SuppressionEndN = SuppressionEndCounter --Store instance of SuppressionEnd() scheduled function + } + timer.scheduleFunction(SuppressionEnd, id, SuppressedGroups[id.groupName].SuppressionEndTime) --Schedule the SuppressionEnd() function + --trigger.action.outText( string.format("Radar On " ..string.format(delay)), 20) + end + end + end + end + end +end +--- Taking the lead of AI escorting your flight. +-- +-- @{#ESCORT} class +-- ================ +-- The @{#ESCORT} class allows you to interact with escorting AI on your flight and take the lead. +-- Each escorting group can be commanded with a whole set of radio commands (radio menu in your flight, and then F10). +-- +-- The radio commands will vary according the category of the group. The richest set of commands are with Helicopters and AirPlanes. +-- Ships and Ground troops will have a more limited set, but they can provide support through the bombing of targets designated by the other escorts. +-- +-- RADIO MENUs that can be created: +-- ================================ +-- Find a summary below of the current available commands: +-- +-- Navigation ...: +-- --------------- +-- Escort group navigation functions: +-- +-- * **"Join-Up and Follow at x meters":** The escort group fill follow you at about x meters, and they will follow you. +-- * **"Flare":** Provides menu commands to let the escort group shoot a flare in the air in a color. +-- * **"Smoke":** Provides menu commands to let the escort group smoke the air in a color. Note that smoking is only available for ground and naval troops. +-- +-- Hold position ...: +-- ------------------ +-- Escort group navigation functions: +-- +-- * **"At current location":** Stops the escort group and they will hover 30 meters above the ground at the position they stopped. +-- * **"At client location":** Stops the escort group and they will hover 30 meters above the ground at the position they stopped. +-- +-- Report targets ...: +-- ------------------- +-- Report targets will make the escort group to report any target that it identifies within a 8km range. Any detected target can be attacked using the 4. Attack nearby targets function. (see below). +-- +-- * **"Report now":** Will report the current detected targets. +-- * **"Report targets on":** Will make the escort group to report detected targets and will fill the "Attack nearby targets" menu list. +-- * **"Report targets off":** Will stop detecting targets. +-- +-- Scan targets ...: +-- ----------------- +-- Menu items to pop-up the escort group for target scanning. After scanning, the escort group will resume with the mission or defined task. +-- +-- * **"Scan targets 30 seconds":** Scan 30 seconds for targets. +-- * **"Scan targets 60 seconds":** Scan 60 seconds for targets. +-- +-- Attack targets ...: +-- ------------------- +-- This menu item will list all detected targets within a 15km range. Depending on the level of detection (known/unknown) and visuality, the targets type will also be listed. +-- +-- Request assistance from ...: +-- ---------------------------- +-- This menu item will list all detected targets within a 15km range, as with the menu item **Attack Targets**. +-- This menu item allows to request attack support from other escorts supporting the current client group. +-- eg. the function allows a player to request support from the Ship escort to attack a target identified by the Plane escort with its Tomahawk missiles. +-- eg. the function allows a player to request support from other Planes escorting to bomb the unit with illumination missiles or bombs, so that the main plane escort can attack the area. +-- +-- ROE ...: +-- -------- +-- Sets the Rules of Engagement (ROE) of the escort group when in flight. +-- +-- * **"Hold Fire":** The escort group will hold fire. +-- * **"Return Fire":** The escort group will return fire. +-- * **"Open Fire":** The escort group will open fire on designated targets. +-- * **"Weapon Free":** The escort group will engage with any target. +-- +-- Evasion ...: +-- ------------ +-- Will define the evasion techniques that the escort group will perform during flight or combat. +-- +-- * **"Fight until death":** The escort group will have no reaction to threats. +-- * **"Use flares, chaff and jammers":** The escort group will use passive defense using flares and jammers. No evasive manoeuvres are executed. +-- * **"Evade enemy fire":** The rescort group will evade enemy fire before firing. +-- * **"Go below radar and evade fire":** The escort group will perform evasive vertical manoeuvres. +-- +-- Resume Mission ...: +-- ------------------- +-- Escort groups can have their own mission. This menu item will allow the escort group to resume their Mission from a given waypoint. +-- Note that this is really fantastic, as you now have the dynamic of taking control of the escort groups, and allowing them to resume their path or mission. +-- +-- ESCORT construction methods. +-- ============================ +-- Create a new SPAWN object with the @{#ESCORT.New} method: +-- +-- * @{#ESCORT.New}: Creates a new ESCORT object from a @{Group#GROUP} for a @{Client#CLIENT}, with an optional briefing text. +-- +-- ESCORT initialization methods. +-- ============================== +-- The following menus are created within the RADIO MENU of an active unit hosted by a player: +-- +-- * @{#ESCORT.MenuFollowAt}: Creates a menu to make the escort follow the client. +-- * @{#ESCORT.MenuHoldAtEscortPosition}: Creates a menu to hold the escort at its current position. +-- * @{#ESCORT.MenuHoldAtLeaderPosition}: Creates a menu to hold the escort at the client position. +-- * @{#ESCORT.MenuScanForTargets}: Creates a menu so that the escort scans targets. +-- * @{#ESCORT.MenuFlare}: Creates a menu to disperse flares. +-- * @{#ESCORT.MenuSmoke}: Creates a menu to disparse smoke. +-- * @{#ESCORT.MenuReportTargets}: Creates a menu so that the escort reports targets. +-- * @{#ESCORT.MenuReportPosition}: Creates a menu so that the escort reports its current position from bullseye. +-- * @{#ESCORT.MenuAssistedAttack: Creates a menu so that the escort supportes assisted attack from other escorts with the client. +-- * @{#ESCORT.MenuROE: Creates a menu structure to set the rules of engagement of the escort. +-- * @{#ESCORT.MenuEvasion: Creates a menu structure to set the evasion techniques when the escort is under threat. +-- * @{#ESCORT.MenuResumeMission}: Creates a menu structure so that the escort can resume from a waypoint. +-- +-- @module Escort +-- @author FlightControl + +Include.File( "Routines" ) +Include.File( "Base" ) +Include.File( "Database" ) +Include.File( "Group" ) +Include.File( "Zone" ) + +--- +-- @type ESCORT +-- @extends Base#BASE +-- @field Client#CLIENT EscortClient +-- @field Group#GROUP EscortGroup +-- @field #string EscortName +-- @field #ESCORT.MODE EscortMode The mode the escort is in. +-- @field #number FollowScheduler The id of the _FollowScheduler function. +-- @field #boolean ReportTargets If true, nearby targets are reported. +-- @Field DCSTypes#AI.Option.Air.val.ROE OptionROE Which ROE is set to the EscortGroup. +-- @field DCSTypes#AI.Option.Air.val.REACTION_ON_THREAT OptionReactionOnThreat Which REACTION_ON_THREAT is set to the EscortGroup. +-- @field Menu#MENU_CLIENT EscortMenuResumeMission +ESCORT = { + ClassName = "ESCORT", + EscortName = nil, -- The Escort Name + EscortClient = nil, + EscortGroup = nil, + EscortMode = nil, + MODE = { + FOLLOW = 1, + MISSION = 2, + }, + Targets = {}, -- The identified targets + FollowScheduler = nil, + ReportTargets = true, + OptionROE = AI.Option.Air.val.ROE.OPEN_FIRE, + OptionReactionOnThreat = AI.Option.Air.val.REACTION_ON_THREAT.ALLOW_ABORT_MISSION, + TaskPoints = {} +} + +--- ESCORT.Mode class +-- @type ESCORT.MODE +-- @field #number FOLLOW +-- @field #number MISSION + +--- MENUPARAM type +-- @type MENUPARAM +-- @field #ESCORT ParamSelf +-- @field #Distance ParamDistance +-- @field #function ParamFunction +-- @field #string ParamMessage + +--- ESCORT class constructor for an AI group +-- @param #ESCORT self +-- @param Client#CLIENT EscortClient The client escorted by the EscortGroup. +-- @param Group#GROUP EscortGroup The group AI escorting the EscortClient. +-- @param #string EscortName Name of the escort. +-- @return #ESCORT self +function ESCORT:New( EscortClient, EscortGroup, EscortName, EscortBriefing ) + local self = BASE:Inherit( self, BASE:New() ) + self:F( { EscortClient, EscortGroup, EscortName } ) + + self.EscortClient = EscortClient -- Client#CLIENT + self.EscortGroup = EscortGroup -- Group#GROUP + self.EscortName = EscortName + self.EscortBriefing = EscortBriefing + + self:T( EscortGroup:GetClassNameAndID() ) + + -- Set EscortGroup known at EscortClient. + if not self.EscortClient._EscortGroups then + self.EscortClient._EscortGroups = {} + end + + if not self.EscortClient._EscortGroups[EscortGroup:GetName()] then + self.EscortClient._EscortGroups[EscortGroup:GetName()] = {} + self.EscortClient._EscortGroups[EscortGroup:GetName()].EscortGroup = self.EscortGroup + self.EscortClient._EscortGroups[EscortGroup:GetName()].EscortName = self.EscortName + self.EscortClient._EscortGroups[EscortGroup:GetName()].Targets = {} + self.EscortMode = ESCORT.MODE.FOLLOW + end + + + self.EscortMenu = MENU_CLIENT:New( self.EscortClient, self.EscortName ) + + self.EscortGroup:WayPointInitialize(1) + + self.EscortGroup:OptionROTVertical() + self.EscortGroup:OptionROEOpenFire() + + EscortGroup:MessageToClient( EscortGroup:GetCategoryName() .. " '" .. EscortName .. "' (" .. EscortGroup:GetCallsign() .. ") reporting! " .. + "We're escorting your flight. " .. + "Use the Radio Menu and F10 and use the options under + " .. EscortName .. "\n", + 60, EscortClient + ) + + return self +end + + +--- Defines the default menus +-- @param #ESCORT self +-- @return #ESCORT +function ESCORT:Menus() + self:F() + + self:MenuFollowAt( 100 ) + self:MenuFollowAt( 200 ) + self:MenuFollowAt( 300 ) + self:MenuFollowAt( 400 ) + + self:MenuScanForTargets( 100, 60 ) + + self:MenuHoldAtEscortPosition( 30 ) + self:MenuHoldAtLeaderPosition( 30 ) + + self:MenuFlare() + self:MenuSmoke() + + self:MenuReportTargets( 60 ) + self:MenuAssistedAttack() + self:MenuROE() + self:MenuEvasion() + self:MenuResumeMission() + + return self +end + + + +--- Defines a menu slot to let the escort Join and Follow you at a certain distance. +-- This menu will appear under **Navigation**. +-- @param #ESCORT self +-- @param DCSTypes#Distance Distance The distance in meters that the escort needs to follow the client. +-- @return #ESCORT +function ESCORT:MenuFollowAt( Distance ) + self:F(Distance) + + if self.EscortGroup:IsAir() then + if not self.EscortMenuReportNavigation then + self.EscortMenuReportNavigation = MENU_CLIENT:New( self.EscortClient, "Navigation", self.EscortMenu ) + end + + if not self.EscortMenuJoinUpAndFollow then + self.EscortMenuJoinUpAndFollow = {} + end + + self.EscortMenuJoinUpAndFollow[#self.EscortMenuJoinUpAndFollow+1] = MENU_CLIENT_COMMAND:New( self.EscortClient, "Join-Up and Follow at " .. Distance, self.EscortMenuReportNavigation, ESCORT._JoinUpAndFollow, { ParamSelf = self, ParamDistance = Distance } ) + + self.EscortMode = ESCORT.MODE.FOLLOW + end + + return self +end + +--- Defines a menu slot to let the escort hold at their current position and stay low with a specified height during a specified time in seconds. +-- This menu will appear under **Hold position**. +-- @param #ESCORT self +-- @param DCSTypes#Distance Height Optional parameter that sets the height in meters to let the escort orbit at the current location. The default value is 30 meters. +-- @param DCSTypes#Time Seconds Optional parameter that lets the escort orbit at the current position for a specified time. (not implemented yet). The default value is 0 seconds, meaning, that the escort will orbit forever until a sequent command is given. +-- @param #string MenuTextFormat Optional parameter that shows the menu option text. The text string is formatted, and should contain two %d tokens in the string. The first for the Height, the second for the Time (if given). If no text is given, the default text will be displayed. +-- @return #ESCORT +-- TODO: Implement Seconds parameter. Challenge is to first develop the "continue from last activity" function. +function ESCORT:MenuHoldAtEscortPosition( Height, Seconds, MenuTextFormat ) + self:F( { Height, Seconds, MenuTextFormat } ) + + if self.EscortGroup:IsAir() then + + if not self.EscortMenuHold then + self.EscortMenuHold = MENU_CLIENT:New( self.EscortClient, "Hold position", self.EscortMenu ) + end + + if not Height then + Height = 30 + end + + if not Seconds then + Seconds = 0 + end + + local MenuText = "" + if not MenuTextFormat then + if Seconds == 0 then + MenuText = string.format( "Hold at %d meter", Height ) + else + MenuText = string.format( "Hold at %d meter for %d seconds", Height, Seconds ) + end + else + if Seconds == 0 then + MenuText = string.format( MenuTextFormat, Height ) + else + MenuText = string.format( MenuTextFormat, Height, Seconds ) + end + end + + if not self.EscortMenuHoldPosition then + self.EscortMenuHoldPosition = {} + end + + self.EscortMenuHoldPosition[#self.EscortMenuHoldPosition+1] = MENU_CLIENT_COMMAND + :New( + self.EscortClient, + MenuText, + self.EscortMenuHold, + ESCORT._HoldPosition, + { ParamSelf = self, + ParamOrbitGroup = self.EscortGroup, + ParamHeight = Height, + ParamSeconds = Seconds + } + ) + end + + return self +end + + +--- Defines a menu slot to let the escort hold at the client position and stay low with a specified height during a specified time in seconds. +-- This menu will appear under **Navigation**. +-- @param #ESCORT self +-- @param DCSTypes#Distance Height Optional parameter that sets the height in meters to let the escort orbit at the current location. The default value is 30 meters. +-- @param DCSTypes#Time Seconds Optional parameter that lets the escort orbit at the current position for a specified time. (not implemented yet). The default value is 0 seconds, meaning, that the escort will orbit forever until a sequent command is given. +-- @param #string MenuTextFormat Optional parameter that shows the menu option text. The text string is formatted, and should contain one or two %d tokens in the string. The first for the Height, the second for the Time (if given). If no text is given, the default text will be displayed. +-- @return #ESCORT +-- TODO: Implement Seconds parameter. Challenge is to first develop the "continue from last activity" function. +function ESCORT:MenuHoldAtLeaderPosition( Height, Seconds, MenuTextFormat ) + self:F( { Height, Seconds, MenuTextFormat } ) + + if self.EscortGroup:IsAir() then + + if not self.EscortMenuHold then + self.EscortMenuHold = MENU_CLIENT:New( self.EscortClient, "Hold position", self.EscortMenu ) + end + + if not Height then + Height = 30 + end + + if not Seconds then + Seconds = 0 + end + + local MenuText = "" + if not MenuTextFormat then + if Seconds == 0 then + MenuText = string.format( "Rejoin and hold at %d meter", Height ) + else + MenuText = string.format( "Rejoin and hold at %d meter for %d seconds", Height, Seconds ) + end + else + if Seconds == 0 then + MenuText = string.format( MenuTextFormat, Height ) + else + MenuText = string.format( MenuTextFormat, Height, Seconds ) + end + end + + if not self.EscortMenuHoldAtLeaderPosition then + self.EscortMenuHoldAtLeaderPosition = {} + end + + self.EscortMenuHoldAtLeaderPosition[#self.EscortMenuHoldAtLeaderPosition+1] = MENU_CLIENT_COMMAND + :New( + self.EscortClient, + MenuText, + self.EscortMenuHold, + ESCORT._HoldPosition, + { ParamSelf = self, + ParamOrbitGroup = self.EscortClient, + ParamHeight = Height, + ParamSeconds = Seconds + } + ) + end + + return self +end + +--- Defines a menu slot to let the escort scan for targets at a certain height for a certain time in seconds. +-- This menu will appear under **Scan targets**. +-- @param #ESCORT self +-- @param DCSTypes#Distance Height Optional parameter that sets the height in meters to let the escort orbit at the current location. The default value is 30 meters. +-- @param DCSTypes#Time Seconds Optional parameter that lets the escort orbit at the current position for a specified time. (not implemented yet). The default value is 0 seconds, meaning, that the escort will orbit forever until a sequent command is given. +-- @param #string MenuTextFormat Optional parameter that shows the menu option text. The text string is formatted, and should contain one or two %d tokens in the string. The first for the Height, the second for the Time (if given). If no text is given, the default text will be displayed. +-- @return #ESCORT +function ESCORT:MenuScanForTargets( Height, Seconds, MenuTextFormat ) + self:F( { Height, Seconds, MenuTextFormat } ) + + if self.EscortGroup:IsAir() then + if not self.EscortMenuScan then + self.EscortMenuScan = MENU_CLIENT:New( self.EscortClient, "Scan for targets", self.EscortMenu ) + end + + if not Height then + Height = 100 + end + + if not Seconds then + Seconds = 30 + end + + local MenuText = "" + if not MenuTextFormat then + if Seconds == 0 then + MenuText = string.format( "At %d meter", Height ) + else + MenuText = string.format( "At %d meter for %d seconds", Height, Seconds ) + end + else + if Seconds == 0 then + MenuText = string.format( MenuTextFormat, Height ) + else + MenuText = string.format( MenuTextFormat, Height, Seconds ) + end + end + + if not self.EscortMenuScanForTargets then + self.EscortMenuScanForTargets = {} + end + + self.EscortMenuScanForTargets[#self.EscortMenuScanForTargets+1] = MENU_CLIENT_COMMAND + :New( + self.EscortClient, + MenuText, + self.EscortMenuScan, + ESCORT._ScanTargets, + { ParamSelf = self, + ParamScanDuration = 30 + } + ) + end + + return self +end + + + +--- Defines a menu slot to let the escort disperse a flare in a certain color. +-- This menu will appear under **Navigation**. +-- The flare will be fired from the first unit in the group. +-- @param #ESCORT self +-- @param #string MenuTextFormat Optional parameter that shows the menu option text. If no text is given, the default text will be displayed. +-- @return #ESCORT +function ESCORT:MenuFlare( MenuTextFormat ) + self:F() + + if not self.EscortMenuReportNavigation then + self.EscortMenuReportNavigation = MENU_CLIENT:New( self.EscortClient, "Navigation", self.EscortMenu ) + end + + local MenuText = "" + if not MenuTextFormat then + MenuText = "Flare" + else + MenuText = MenuTextFormat + end + + if not self.EscortMenuFlare then + self.EscortMenuFlare = MENU_CLIENT:New( self.EscortClient, MenuText, self.EscortMenuReportNavigation, ESCORT._Flare, { ParamSelf = self } ) + self.EscortMenuFlareGreen = MENU_CLIENT_COMMAND:New( self.EscortClient, "Release green flare", self.EscortMenuFlare, ESCORT._Flare, { ParamSelf = self, ParamColor = UNIT.FlareColor.Green, ParamMessage = "Released a green flare!" } ) + self.EscortMenuFlareRed = MENU_CLIENT_COMMAND:New( self.EscortClient, "Release red flare", self.EscortMenuFlare, ESCORT._Flare, { ParamSelf = self, ParamColor = UNIT.FlareColor.Red, ParamMessage = "Released a red flare!" } ) + self.EscortMenuFlareWhite = MENU_CLIENT_COMMAND:New( self.EscortClient, "Release white flare", self.EscortMenuFlare, ESCORT._Flare, { ParamSelf = self, ParamColor = UNIT.FlareColor.White, ParamMessage = "Released a white flare!" } ) + self.EscortMenuFlareYellow = MENU_CLIENT_COMMAND:New( self.EscortClient, "Release yellow flare", self.EscortMenuFlare, ESCORT._Flare, { ParamSelf = self, ParamColor = UNIT.FlareColor.Yellow, ParamMessage = "Released a yellow flare!" } ) + end + + return self +end + +--- Defines a menu slot to let the escort disperse a smoke in a certain color. +-- This menu will appear under **Navigation**. +-- Note that smoke menu options will only be displayed for ships and ground units. Not for air units. +-- The smoke will be fired from the first unit in the group. +-- @param #ESCORT self +-- @param #string MenuTextFormat Optional parameter that shows the menu option text. If no text is given, the default text will be displayed. +-- @return #ESCORT +function ESCORT:MenuSmoke( MenuTextFormat ) + self:F() + + if not self.EscortGroup:IsAir() then + if not self.EscortMenuReportNavigation then + self.EscortMenuReportNavigation = MENU_CLIENT:New( self.EscortClient, "Navigation", self.EscortMenu ) + end + + local MenuText = "" + if not MenuTextFormat then + MenuText = "Smoke" + else + MenuText = MenuTextFormat + end + + if not self.EscortMenuSmoke then + self.EscortMenuSmoke = MENU_CLIENT:New( self.EscortClient, "Smoke", self.EscortMenuReportNavigation, ESCORT._Smoke, { ParamSelf = self } ) + self.EscortMenuSmokeGreen = MENU_CLIENT_COMMAND:New( self.EscortClient, "Release green smoke", self.EscortMenuSmoke, ESCORT._Smoke, { ParamSelf = self, ParamColor = UNIT.SmokeColor.Green, ParamMessage = "Releasing green smoke!" } ) + self.EscortMenuSmokeRed = MENU_CLIENT_COMMAND:New( self.EscortClient, "Release red smoke", self.EscortMenuSmoke, ESCORT._Smoke, { ParamSelf = self, ParamColor = UNIT.SmokeColor.Red, ParamMessage = "Releasing red smoke!" } ) + self.EscortMenuSmokeWhite = MENU_CLIENT_COMMAND:New( self.EscortClient, "Release white smoke", self.EscortMenuSmoke, ESCORT._Smoke, { ParamSelf = self, ParamColor = UNIT.SmokeColor.White, ParamMessage = "Releasing white smoke!" } ) + self.EscortMenuSmokeOrange = MENU_CLIENT_COMMAND:New( self.EscortClient, "Release orange smoke", self.EscortMenuSmoke, ESCORT._Smoke, { ParamSelf = self, ParamColor = UNIT.SmokeColor.Orange, ParamMessage = "Releasing orange smoke!" } ) + self.EscortMenuSmokeBlue = MENU_CLIENT_COMMAND:New( self.EscortClient, "Release blue smoke", self.EscortMenuSmoke, ESCORT._Smoke, { ParamSelf = self, ParamColor = UNIT.SmokeColor.Blue, ParamMessage = "Releasing blue smoke!" } ) + end + end + + return self +end + +--- Defines a menu slot to let the escort report their current detected targets with a specified time interval in seconds. +-- This menu will appear under **Report targets**. +-- Note that if a report targets menu is not specified, no targets will be detected by the escort, and the attack and assisted attack menus will not be displayed. +-- @param #ESCORT self +-- @param DCSTypes#Time Seconds Optional parameter that lets the escort report their current detected targets after specified time interval in seconds. The default time is 30 seconds. +-- @return #ESCORT +function ESCORT:MenuReportTargets( Seconds ) + self:F( { Seconds } ) + + if not self.EscortMenuReportNearbyTargets then + self.EscortMenuReportNearbyTargets = MENU_CLIENT:New( self.EscortClient, "Report targets", self.EscortMenu ) + end + + if not Seconds then + Seconds = 30 + end + + -- Report Targets + self.EscortMenuReportNearbyTargetsNow = MENU_CLIENT_COMMAND:New( self.EscortClient, "Report targets now!", self.EscortMenuReportNearbyTargets, ESCORT._ReportNearbyTargetsNow, { ParamSelf = self } ) + self.EscortMenuReportNearbyTargetsOn = MENU_CLIENT_COMMAND:New( self.EscortClient, "Report targets on", self.EscortMenuReportNearbyTargets, ESCORT._SwitchReportNearbyTargets, { ParamSelf = self, ParamReportTargets = true } ) + self.EscortMenuReportNearbyTargetsOff = MENU_CLIENT_COMMAND:New( self.EscortClient, "Report targets off", self.EscortMenuReportNearbyTargets, ESCORT._SwitchReportNearbyTargets, { ParamSelf = self, ParamReportTargets = false, } ) + + -- Attack Targets + self.EscortMenuAttackNearbyTargets = MENU_CLIENT:New( self.EscortClient, "Attack targets", self.EscortMenu ) + + + --self.ReportTargetsScheduler = routines.scheduleFunction( self._ReportTargetsScheduler, { self }, timer.getTime() + 1, Seconds ) + self.ReportTargetsScheduler = SCHEDULER:New( self, self._ReportTargetsScheduler, {}, 1, Seconds ) + + return self +end + +--- Defines a menu slot to let the escort attack its detected targets using assisted attack from another escort joined also with the client. +-- This menu will appear under **Request assistance from**. +-- Note that this method needs to be preceded with the method MenuReportTargets. +-- @param #ESCORT self +-- @return #ESCORT +function ESCORT:MenuAssistedAttack() + self:F() + + -- Request assistance from other escorts. + -- This is very useful to let f.e. an escorting ship attack a target detected by an escorting plane... + self.EscortMenuTargetAssistance = MENU_CLIENT:New( self.EscortClient, "Request assistance from", self.EscortMenu ) + + return self +end + +--- Defines a menu to let the escort set its rules of engagement. +-- All rules of engagement will appear under the menu **ROE**. +-- @param #ESCORT self +-- @return #ESCORT +function ESCORT:MenuROE( MenuTextFormat ) + self:F( MenuTextFormat ) + + if not self.EscortMenuROE then + -- Rules of Engagement + self.EscortMenuROE = MENU_CLIENT:New( self.EscortClient, "ROE", self.EscortMenu ) + if self.EscortGroup:OptionROEHoldFirePossible() then + self.EscortMenuROEHoldFire = MENU_CLIENT_COMMAND:New( self.EscortClient, "Hold Fire", self.EscortMenuROE, ESCORT._ROE, { ParamSelf = self, ParamFunction = self.EscortGroup:OptionROEHoldFire(), ParamMessage = "Holding weapons!" } ) + end + if self.EscortGroup:OptionROEReturnFirePossible() then + self.EscortMenuROEReturnFire = MENU_CLIENT_COMMAND:New( self.EscortClient, "Return Fire", self.EscortMenuROE, ESCORT._ROE, { ParamSelf = self, ParamFunction = self.EscortGroup:OptionROEReturnFire(), ParamMessage = "Returning fire!" } ) + end + if self.EscortGroup:OptionROEOpenFirePossible() then + self.EscortMenuROEOpenFire = MENU_CLIENT_COMMAND:New( self.EscortClient, "Open Fire", self.EscortMenuROE, ESCORT._ROE, { ParamSelf = self, ParamFunction = self.EscortGroup:OptionROEOpenFire(), ParamMessage = "Opening fire on designated targets!!" } ) + end + if self.EscortGroup:OptionROEWeaponFreePossible() then + self.EscortMenuROEWeaponFree = MENU_CLIENT_COMMAND:New( self.EscortClient, "Weapon Free", self.EscortMenuROE, ESCORT._ROE, { ParamSelf = self, ParamFunction = self.EscortGroup:OptionROEWeaponFree(), ParamMessage = "Opening fire on targets of opportunity!" } ) + end + end + + return self +end + + +--- Defines a menu to let the escort set its evasion when under threat. +-- All rules of engagement will appear under the menu **Evasion**. +-- @param #ESCORT self +-- @return #ESCORT +function ESCORT:MenuEvasion( MenuTextFormat ) + self:F( MenuTextFormat ) + + if self.EscortGroup:IsAir() then + if not self.EscortMenuEvasion then + -- Reaction to Threats + self.EscortMenuEvasion = MENU_CLIENT:New( self.EscortClient, "Evasion", self.EscortMenu ) + if self.EscortGroup:OptionROTNoReactionPossible() then + self.EscortMenuEvasionNoReaction = MENU_CLIENT_COMMAND:New( self.EscortClient, "Fight until death", self.EscortMenuEvasion, ESCORT._ROT, { ParamSelf = self, ParamFunction = self.EscortGroup:OptionROTNoReaction(), ParamMessage = "Fighting until death!" } ) + end + if self.EscortGroup:OptionROTPassiveDefensePossible() then + self.EscortMenuEvasionPassiveDefense = MENU_CLIENT_COMMAND:New( self.EscortClient, "Use flares, chaff and jammers", self.EscortMenuEvasion, ESCORT._ROT, { ParamSelf = self, ParamFunction = self.EscortGroup:OptionROTPassiveDefense(), ParamMessage = "Defending using jammers, chaff and flares!" } ) + end + if self.EscortGroup:OptionROTEvadeFirePossible() then + self.EscortMenuEvasionEvadeFire = MENU_CLIENT_COMMAND:New( self.EscortClient, "Evade enemy fire", self.EscortMenuEvasion, ESCORT._ROT, { ParamSelf = self, ParamFunction = self.EscortGroup:OptionROTEvadeFire(), ParamMessage = "Evading on enemy fire!" } ) + end + if self.EscortGroup:OptionROTVerticalPossible() then + self.EscortMenuOptionEvasionVertical = MENU_CLIENT_COMMAND:New( self.EscortClient, "Go below radar and evade fire", self.EscortMenuEvasion, ESCORT._ROT, { ParamSelf = self, ParamFunction = self.EscortGroup:OptionROTVertical(), ParamMessage = "Evading on enemy fire with vertical manoeuvres!" } ) + end + end + end + + return self +end + +--- Defines a menu to let the escort resume its mission from a waypoint on its route. +-- All rules of engagement will appear under the menu **Resume mission from**. +-- @param #ESCORT self +-- @return #ESCORT +function ESCORT:MenuResumeMission() + self:F() + + if not self.EscortMenuResumeMission then + -- Mission Resume Menu Root + self.EscortMenuResumeMission = MENU_CLIENT:New( self.EscortClient, "Resume mission from", self.EscortMenu ) + end + + return self +end + + +--- @param #MENUPARAM MenuParam +function ESCORT._HoldPosition( MenuParam ) + + local self = MenuParam.ParamSelf + local EscortGroup = self.EscortGroup + local EscortClient = self.EscortClient + + local OrbitGroup = MenuParam.ParamOrbitGroup -- Group#GROUP + local OrbitUnit = OrbitGroup:GetUnit(1) -- Unit#UNIT + local OrbitHeight = MenuParam.ParamHeight + local OrbitSeconds = MenuParam.ParamSeconds -- Not implemented yet + + routines.removeFunction( self.FollowScheduler ) + + local PointFrom = {} + local GroupPoint = EscortGroup:GetUnit(1):GetPointVec3() + PointFrom = {} + PointFrom.x = GroupPoint.x + PointFrom.y = GroupPoint.z + PointFrom.speed = 250 + PointFrom.type = AI.Task.WaypointType.TURNING_POINT + PointFrom.alt = GroupPoint.y + PointFrom.alt_type = AI.Task.AltitudeType.BARO + + local OrbitPoint = OrbitUnit:GetPointVec2() + local PointTo = {} + PointTo.x = OrbitPoint.x + PointTo.y = OrbitPoint.y + PointTo.speed = 250 + PointTo.type = AI.Task.WaypointType.TURNING_POINT + PointTo.alt = OrbitHeight + PointTo.alt_type = AI.Task.AltitudeType.BARO + PointTo.task = EscortGroup:TaskOrbitCircleAtVec2( OrbitPoint, OrbitHeight, 0 ) + + local Points = { PointFrom, PointTo } + + EscortGroup:OptionROEHoldFire() + EscortGroup:OptionROTPassiveDefense() + + EscortGroup:SetTask( EscortGroup:TaskRoute( Points ) ) + EscortGroup:MessageToClient( "Orbiting at location.", 10, EscortClient ) +end + +--- @param #MENUPARAM MenuParam +function ESCORT._JoinUpAndFollow( MenuParam ) + + local self = MenuParam.ParamSelf + local EscortGroup = self.EscortGroup + local EscortClient = self.EscortClient + + self.Distance = MenuParam.ParamDistance + + self:JoinUpAndFollow( EscortGroup, EscortClient, self.Distance ) +end + +--- JoinsUp and Follows a CLIENT. +-- @param Escort#ESCORT self +-- @param Group#GROUP EscortGroup +-- @param Client#CLIENT EscortClient +-- @param DCSTypes#Distance Distance +function ESCORT:JoinUpAndFollow( EscortGroup, EscortClient, Distance ) + self:F( { EscortGroup, EscortClient, Distance } ) + + if self.FollowScheduler then + routines.removeFunction( self.FollowScheduler ) + end + + EscortGroup:OptionROEHoldFire() + EscortGroup:OptionROTPassiveDefense() + + self.EscortMode = ESCORT.MODE.FOLLOW + + self.CT1 = 0 + self.GT1 = 0 + --self.FollowScheduler = routines.scheduleFunction( self._FollowScheduler, { self, Distance }, timer.getTime() + 1, .5 ) + self.FollowScheduler = SCHEDULER:New( self, self._FollowScheduler, { Distance }, 1, .5, .1 ) + EscortGroup:MessageToClient( "Rejoining and Following at " .. Distance .. "!", 30, EscortClient ) +end + +--- @param #MENUPARAM MenuParam +function ESCORT._Flare( MenuParam ) + + local self = MenuParam.ParamSelf + local EscortGroup = self.EscortGroup + local EscortClient = self.EscortClient + + local Color = MenuParam.ParamColor + local Message = MenuParam.ParamMessage + + EscortGroup:GetUnit(1):Flare( Color ) + EscortGroup:MessageToClient( Message, 10, EscortClient ) +end + +--- @param #MENUPARAM MenuParam +function ESCORT._Smoke( MenuParam ) + + local self = MenuParam.ParamSelf + local EscortGroup = self.EscortGroup + local EscortClient = self.EscortClient + + local Color = MenuParam.ParamColor + local Message = MenuParam.ParamMessage + + EscortGroup:GetUnit(1):Smoke( Color ) + EscortGroup:MessageToClient( Message, 10, EscortClient ) +end + + +--- @param #MENUPARAM MenuParam +function ESCORT._ReportNearbyTargetsNow( MenuParam ) + + local self = MenuParam.ParamSelf + local EscortGroup = self.EscortGroup + local EscortClient = self.EscortClient + + self:_ReportTargetsScheduler() + +end + +function ESCORT._SwitchReportNearbyTargets( MenuParam ) + + local self = MenuParam.ParamSelf + local EscortGroup = self.EscortGroup + local EscortClient = self.EscortClient + + self.ReportTargets = MenuParam.ParamReportTargets + + if self.ReportTargets then + if not self.ReportTargetsScheduler then + --self.ReportTargetsScheduler = routines.scheduleFunction( self._ReportTargetsScheduler, { self }, timer.getTime() + 1, 30 ) + self.ReportTargetsScheduler = SCHEDULER:New( self, self._ReportTargetsScheduler, {}, 1, 30 ) + end + else + routines.removeFunction( self.ReportTargetsScheduler ) + self.ReportTargetsScheduler = nil + end +end + +--- @param #MENUPARAM MenuParam +function ESCORT._ScanTargets( MenuParam ) + + local self = MenuParam.ParamSelf + local EscortGroup = self.EscortGroup + local EscortClient = self.EscortClient + + local ScanDuration = MenuParam.ParamScanDuration + + if self.FollowScheduler then + routines.removeFunction( self.FollowScheduler ) + end + + self:T( { "FollowScheduler after removefunction: ", self.FollowScheduler } ) + + if EscortGroup:IsHelicopter() then + SCHEDULER:New( EscortGroup, EscortGroup.PushTask, + { EscortGroup:TaskControlled( + EscortGroup:TaskOrbitCircle( 200, 20 ), + EscortGroup:TaskCondition( nil, nil, nil, nil, ScanDuration, nil ) + ) + }, + 1 + ) + elseif EscortGroup:IsAirPlane() then + SCHEDULER:New( EscortGroup, EscortGroup.PushTask, + { EscortGroup:TaskControlled( + EscortGroup:TaskOrbitCircle( 1000, 500 ), + EscortGroup:TaskCondition( nil, nil, nil, nil, ScanDuration, nil ) + ) + }, + 1 + ) + end + + EscortGroup:MessageToClient( "Scanning targets for " .. ScanDuration .. " seconds.", ScanDuration, EscortClient ) + + if self.EscortMode == ESCORT.MODE.FOLLOW then + --self.FollowScheduler = routines.scheduleFunction( self._FollowScheduler, { self, Distance }, timer.getTime() + ScanDuration, 1 ) + self.FollowScheduler:Start() + end + +end + +function _Resume( EscortGroup ) + env.info( '_Resume' ) + + local Escort = EscortGroup.Escort -- #ESCORT + env.info( "EscortMode = " .. Escort.EscortMode ) + if Escort.EscortMode == ESCORT.MODE.FOLLOW then + Escort:JoinUpAndFollow( EscortGroup, Escort.EscortClient, Escort.Distance ) + end + +end + +--- @param #MENUPARAM MenuParam +function ESCORT._AttackTarget( MenuParam ) + + local self = MenuParam.ParamSelf + local EscortGroup = self.EscortGroup + local EscortClient = self.EscortClient + local AttackUnit = MenuParam.ParamUnit -- Unit#UNIT + + if self.FollowScheduler then + routines.removeFunction( self.FollowScheduler ) + end + + self:T( AttackUnit ) + + if EscortGroup:IsAir() then + EscortGroup:OptionROEOpenFire() + EscortGroup:OptionROTPassiveDefense() + EscortGroup.Escort = self -- Need to do this trick to get the reference for the escort in the _Resume function. +-- routines.scheduleFunction( +-- EscortGroup.PushTask, +-- { EscortGroup, +-- EscortGroup:TaskCombo( +-- { EscortGroup:TaskAttackUnit( AttackUnit ), +-- EscortGroup:TaskFunction( 1, 2, "_Resume", {"''"} ) +-- } +-- ) +-- }, timer.getTime() + 10 +-- ) + SCHEDULER:New( EscortGroup, + EscortGroup.PushTask, + { EscortGroup:TaskCombo( + { EscortGroup:TaskAttackUnit( AttackUnit ), + EscortGroup:TaskFunction( 1, 2, "_Resume", {"''"} ) + } + ) + }, 10 + ) + else +-- routines.scheduleFunction( +-- EscortGroup.PushTask, +-- { EscortGroup, +-- EscortGroup:TaskCombo( +-- { EscortGroup:TaskFireAtPoint( AttackUnit:GetPointVec2(), 50 ) +-- } +-- ) +-- }, timer.getTime() + 10 +-- ) + SCHEDULER:New( EscortGroup, + EscortGroup.PushTask, + { EscortGroup:TaskCombo( + { EscortGroup:TaskFireAtPoint( AttackUnit:GetPointVec2(), 50 ) + } + ) + }, 10 + ) + end + EscortGroup:MessageToClient( "Engaging Designated Unit!", 10, EscortClient ) + + +end + +--- @param #MENUPARAM MenuParam +function ESCORT._AssistTarget( MenuParam ) + + local self = MenuParam.ParamSelf + local EscortGroup = self.EscortGroup + local EscortClient = self.EscortClient + local EscortGroupAttack = MenuParam.ParamEscortGroup + local AttackUnit = MenuParam.ParamUnit -- Unit#UNIT + + if self.FollowScheduler then + routines.removeFunction( self.FollowScheduler ) + end + + + self:T( AttackUnit ) + + if EscortGroupAttack:IsAir() then + EscortGroupAttack:OptionROEOpenFire() + EscortGroupAttack:OptionROTVertical() +-- routines.scheduleFunction( +-- EscortGroupAttack.PushTask, +-- { EscortGroupAttack, +-- EscortGroupAttack:TaskCombo( +-- { EscortGroupAttack:TaskAttackUnit( AttackUnit ), +-- EscortGroupAttack:TaskOrbitCircle( 500, 350 ) +-- } +-- ) +-- }, timer.getTime() + 10 +-- ) + SCHDULER:New( EscortGroupAttack, + EscortGroupAttack.PushTask, + { EscortGroupAttack:TaskCombo( + { EscortGroupAttack:TaskAttackUnit( AttackUnit ), + EscortGroupAttack:TaskOrbitCircle( 500, 350 ) + } + ) + }, 10 + ) + else +-- routines.scheduleFunction( +-- EscortGroupAttack.PushTask, +-- { EscortGroupAttack, +-- EscortGroupAttack:TaskCombo( +-- { EscortGroupAttack:TaskFireAtPoint( AttackUnit:GetPointVec2(), 50 ) +-- } +-- ) +-- }, timer.getTime() + 10 +-- ) + SCHEDULER:New( EscortGroupAttack, + EscortGroupAttack.PushTask, + { EscortGroupAttack:TaskCombo( + { EscortGroupAttack:TaskFireAtPoint( AttackUnit:GetPointVec2(), 50 ) + } + ) + }, 10 + ) + end + EscortGroupAttack:MessageToClient( "Assisting with the destroying the enemy unit!", 10, EscortClient ) + +end + +--- @param #MENUPARAM MenuParam +function ESCORT._ROE( MenuParam ) + + local self = MenuParam.ParamSelf + local EscortGroup = self.EscortGroup + local EscortClient = self.EscortClient + + local EscortROEFunction = MenuParam.ParamFunction + local EscortROEMessage = MenuParam.ParamMessage + + pcall( function() EscortROEFunction() end ) + EscortGroup:MessageToClient( EscortROEMessage, 10, EscortClient ) +end + +--- @param #MENUPARAM MenuParam +function ESCORT._ROT( MenuParam ) + + local self = MenuParam.ParamSelf + local EscortGroup = self.EscortGroup + local EscortClient = self.EscortClient + + local EscortROTFunction = MenuParam.ParamFunction + local EscortROTMessage = MenuParam.ParamMessage + + pcall( function() EscortROTFunction() end ) + EscortGroup:MessageToClient( EscortROTMessage, 10, EscortClient ) +end + +--- @param #MENUPARAM MenuParam +function ESCORT._ResumeMission( MenuParam ) + + local self = MenuParam.ParamSelf + local EscortGroup = self.EscortGroup + local EscortClient = self.EscortClient + + local WayPoint = MenuParam.ParamWayPoint + + routines.removeFunction( self.FollowScheduler ) + self.FollowScheduler = nil + + local WayPoints = EscortGroup:GetTaskRoute() + self:T( WayPoint, WayPoints ) + + for WayPointIgnore = 1, WayPoint do + table.remove( WayPoints, 1 ) + end + + --routines.scheduleFunction( EscortGroup.SetTask, {EscortGroup, EscortGroup:TaskRoute( WayPoints ) }, timer.getTime() + 1 ) + SCHEDULER:New( EscortGroup, EscortGroup.SetTask, { EscortGroup:TaskRoute( WayPoints ) }, 1 ) + + EscortGroup:MessageToClient( "Resuming mission from waypoint " .. WayPoint .. ".", 10, EscortClient ) +end + +--- Registers the waypoints +-- @param #ESCORT self +-- @return #table +function ESCORT:RegisterRoute() + self:F() + + local EscortGroup = self.EscortGroup -- Group#GROUP + + local TaskPoints = EscortGroup:GetTaskRoute() + + self:T( TaskPoints ) + + return TaskPoints +end + +--- @param Escort#ESCORT self +function ESCORT:_FollowScheduler( FollowDistance ) + self:F( { FollowDistance }) + + if self.EscortGroup:IsAlive() and self.EscortClient:IsAlive() then + + local ClientUnit = self.EscortClient:GetClientGroupUnit() + local GroupUnit = self.EscortGroup:GetUnit( 1 ) + + if self.CT1 == 0 and self.GT1 == 0 then + self.CV1 = ClientUnit:GetPointVec3() + self.CT1 = timer.getTime() + self.GV1 = GroupUnit:GetPointVec3() + self.GT1 = timer.getTime() + else + local CT1 = self.CT1 + local CT2 = timer.getTime() + local CV1 = self.CV1 + local CV2 = ClientUnit:GetPointVec3() + self.CT1 = CT2 + self.CV1 = CV2 + + local CD = ( ( CV2.x - CV1.x )^2 + ( CV2.y - CV1.y )^2 + ( CV2.z - CV1.z )^2 ) ^ 0.5 + local CT = CT2 - CT1 + + local CS = ( 3600 / CT ) * ( CD / 1000 ) + + self:T2( { "Client:", CS, CD, CT, CV2, CV1, CT2, CT1 } ) + + local GT1 = self.GT1 + local GT2 = timer.getTime() + local GV1 = self.GV1 + local GV2 = GroupUnit:GetPointVec3() + self.GT1 = GT2 + self.GV1 = GV2 + + local GD = ( ( GV2.x - GV1.x )^2 + ( GV2.y - GV1.y )^2 + ( GV2.z - GV1.z )^2 ) ^ 0.5 + local GT = GT2 - GT1 + + local GS = ( 3600 / GT ) * ( GD / 1000 ) + + self:T2( { "Group:", GS, GD, GT, GV2, GV1, GT2, GT1 } ) + + -- Calculate the group direction vector + local GV = { x = GV2.x - CV2.x, y = GV2.y - CV2.y, z = GV2.z - CV2.z } + + -- Calculate GH2, GH2 with the same height as CV2. + local GH2 = { x = GV2.x, y = CV2.y, z = GV2.z } + + -- Calculate the angle of GV to the orthonormal plane + local alpha = math.atan2( GV.z, GV.x ) + + -- Now we calculate the intersecting vector between the circle around CV2 with radius FollowDistance and GH2. + -- From the GeoGebra model: CVI = (x(CV2) + FollowDistance cos(alpha), y(GH2) + FollowDistance sin(alpha), z(CV2)) + local CVI = { x = CV2.x + FollowDistance * math.cos(alpha), + y = GH2.y, + z = CV2.z + FollowDistance * math.sin(alpha), + } + + -- Calculate the direction vector DV of the escort group. We use CVI as the base and CV2 as the direction. + local DV = { x = CV2.x - CVI.x, y = CV2.y - CVI.y, z = CV2.z - CVI.z } + + -- We now calculate the unary direction vector DVu, so that we can multiply DVu with the speed, which is expressed in meters / s. + -- We need to calculate this vector to predict the point the escort group needs to fly to according its speed. + -- The distance of the destination point should be far enough not to have the aircraft starting to swipe left to right... + local DVu = { x = DV.x / FollowDistance, y = DV.y / FollowDistance, z = DV.z / FollowDistance } + + -- Now we can calculate the group destination vector GDV. + local GDV = { x = DVu.x * CS * 8 + CVI.x, y = CVI.y, z = DVu.z * CS * 8 + CVI.z } + + --trigger.action.smoke( GDV, trigger.smokeColor.Red ) + self:T2( { "CV2:", CV2 } ) + self:T2( { "CVI:", CVI } ) + self:T2( { "GDV:", GDV } ) + + -- Measure distance between client and group + local CatchUpDistance = ( ( GDV.x - GV2.x )^2 + ( GDV.y - GV2.y )^2 + ( GDV.z - GV2.z )^2 ) ^ 0.5 + + -- The calculation of the Speed would simulate that the group would take 30 seconds to overcome + -- the requested Distance). + local Time = 10 + local CatchUpSpeed = ( CatchUpDistance - ( CS * 8.4 ) ) / Time + + local Speed = CS + CatchUpSpeed + if Speed < 0 then + Speed = 0 + end + + self:T( { "Client Speed, Escort Speed, Speed, FlyDistance, Time:", CS, GS, Speed, Distance, Time } ) + + -- Now route the escort to the desired point with the desired speed. + self.EscortGroup:TaskRouteToVec3( GDV, Speed / 3.6 ) -- DCS models speed in Mps (Miles per second) + end + return true + end + + return false +end + + +--- Report Targets Scheduler. +-- @param #ESCORT self +function ESCORT:_ReportTargetsScheduler() + self:F( self.EscortGroup:GetName() ) + + if self.EscortGroup:IsAlive() and self.EscortClient:IsAlive() then + local EscortGroupName = self.EscortGroup:GetName() + local EscortTargets = self.EscortGroup:GetDetectedTargets() + + local ClientEscortTargets = self.EscortClient._EscortGroups[EscortGroupName].Targets + + local EscortTargetMessages = "" + for EscortTargetID, EscortTarget in pairs( EscortTargets ) do + local EscortObject = EscortTarget.object + self:T( EscortObject ) + if EscortObject and EscortObject:isExist() and EscortObject.id_ < 50000000 then + + local EscortTargetUnit = UNIT:Find( EscortObject ) + local EscortTargetUnitName = EscortTargetUnit:GetName() + + + + -- local EscortTargetIsDetected, + -- EscortTargetIsVisible, + -- EscortTargetLastTime, + -- EscortTargetKnowType, + -- EscortTargetKnowDistance, + -- EscortTargetLastPos, + -- EscortTargetLastVelocity + -- = self.EscortGroup:IsTargetDetected( EscortObject ) + -- + -- self:T( { EscortTargetIsDetected, + -- EscortTargetIsVisible, + -- EscortTargetLastTime, + -- EscortTargetKnowType, + -- EscortTargetKnowDistance, + -- EscortTargetLastPos, + -- EscortTargetLastVelocity } ) + + + local EscortTargetUnitPositionVec3 = EscortTargetUnit:GetPointVec3() + local EscortPositionVec3 = self.EscortGroup:GetPointVec3() + local Distance = ( ( EscortTargetUnitPositionVec3.x - EscortPositionVec3.x )^2 + + ( EscortTargetUnitPositionVec3.y - EscortPositionVec3.y )^2 + + ( EscortTargetUnitPositionVec3.z - EscortPositionVec3.z )^2 + ) ^ 0.5 / 1000 + + self:T( { self.EscortGroup:GetName(), EscortTargetUnit:GetName(), Distance, EscortTarget } ) + + if Distance <= 15 then + + if not ClientEscortTargets[EscortTargetUnitName] then + ClientEscortTargets[EscortTargetUnitName] = {} + end + ClientEscortTargets[EscortTargetUnitName].AttackUnit = EscortTargetUnit + ClientEscortTargets[EscortTargetUnitName].visible = EscortTarget.visible + ClientEscortTargets[EscortTargetUnitName].type = EscortTarget.type + ClientEscortTargets[EscortTargetUnitName].distance = EscortTarget.distance + else + if ClientEscortTargets[EscortTargetUnitName] then + ClientEscortTargets[EscortTargetUnitName] = nil + end + end + end + end + + self:T( { "Sorting Targets Table:", ClientEscortTargets } ) + table.sort( ClientEscortTargets, function( a, b ) return a.Distance < b.Distance end ) + self:T( { "Sorted Targets Table:", ClientEscortTargets } ) + + -- Remove the sub menus of the Attack menu of the Escort for the EscortGroup. + self.EscortMenuAttackNearbyTargets:RemoveSubMenus() + + if self.EscortMenuTargetAssistance then + self.EscortMenuTargetAssistance:RemoveSubMenus() + end + + --for MenuIndex = 1, #self.EscortMenuAttackTargets do + -- self:T( { "Remove Menu:", self.EscortMenuAttackTargets[MenuIndex] } ) + -- self.EscortMenuAttackTargets[MenuIndex] = self.EscortMenuAttackTargets[MenuIndex]:Remove() + --end + + + if ClientEscortTargets then + for ClientEscortTargetUnitName, ClientEscortTargetData in pairs( ClientEscortTargets ) do + + for ClientEscortGroupName, EscortGroupData in pairs( self.EscortClient._EscortGroups ) do + + if ClientEscortTargetData and ClientEscortTargetData.AttackUnit:IsAlive() then + + local EscortTargetMessage = "" + local EscortTargetCategoryName = ClientEscortTargetData.AttackUnit:GetCategoryName() + local EscortTargetCategoryType = ClientEscortTargetData.AttackUnit:GetTypeName() + if ClientEscortTargetData.type then + EscortTargetMessage = EscortTargetMessage .. EscortTargetCategoryName .. " (" .. EscortTargetCategoryType .. ") at " + else + EscortTargetMessage = EscortTargetMessage .. "Unknown target at " + end + + local EscortTargetUnitPositionVec3 = ClientEscortTargetData.AttackUnit:GetPointVec3() + local EscortPositionVec3 = self.EscortGroup:GetPointVec3() + local Distance = ( ( EscortTargetUnitPositionVec3.x - EscortPositionVec3.x )^2 + + ( EscortTargetUnitPositionVec3.y - EscortPositionVec3.y )^2 + + ( EscortTargetUnitPositionVec3.z - EscortPositionVec3.z )^2 + ) ^ 0.5 / 1000 + + self:T( { self.EscortGroup:GetName(), ClientEscortTargetData.AttackUnit:GetName(), Distance, ClientEscortTargetData.AttackUnit } ) + if ClientEscortTargetData.visible == false then + EscortTargetMessage = EscortTargetMessage .. string.format( "%.2f", Distance ) .. " estimated km" + else + EscortTargetMessage = EscortTargetMessage .. string.format( "%.2f", Distance ) .. " km" + end + + if ClientEscortTargetData.visible then + EscortTargetMessage = EscortTargetMessage .. ", visual" + end + + if ClientEscortGroupName == EscortGroupName then + + MENU_CLIENT_COMMAND:New( self.EscortClient, + EscortTargetMessage, + self.EscortMenuAttackNearbyTargets, + ESCORT._AttackTarget, + { ParamSelf = self, + ParamUnit = ClientEscortTargetData.AttackUnit + } + ) + EscortTargetMessages = EscortTargetMessages .. "\n - " .. EscortTargetMessage + else + if self.EscortMenuTargetAssistance then + local MenuTargetAssistance = MENU_CLIENT:New( self.EscortClient, EscortGroupData.EscortName, self.EscortMenuTargetAssistance ) + MENU_CLIENT_COMMAND:New( self.EscortClient, + EscortTargetMessage, + MenuTargetAssistance, + ESCORT._AssistTarget, + { ParamSelf = self, + ParamEscortGroup = EscortGroupData.EscortGroup, + ParamUnit = ClientEscortTargetData.AttackUnit + } + ) + end + end + else + ClientEscortTargetData = nil + end + end + end + + if EscortTargetMessages ~= "" and self.ReportTargets == true then + self.EscortGroup:MessageToClient( "Detected targets within 15 km range:" .. EscortTargetMessages:gsub("\n$",""), 20, self.EscortClient ) + else + self.EscortGroup:MessageToClient( "No targets detected!", 20, self.EscortClient ) + end + end + + if self.EscortMenuResumeMission then + self.EscortMenuResumeMission:RemoveSubMenus() + + -- if self.EscortMenuResumeWayPoints then + -- for MenuIndex = 1, #self.EscortMenuResumeWayPoints do + -- self:T( { "Remove Menu:", self.EscortMenuResumeWayPoints[MenuIndex] } ) + -- self.EscortMenuResumeWayPoints[MenuIndex] = self.EscortMenuResumeWayPoints[MenuIndex]:Remove() + -- end + -- end + + local TaskPoints = self:RegisterRoute() + for WayPointID, WayPoint in pairs( TaskPoints ) do + local EscortPositionVec3 = self.EscortGroup:GetPointVec3() + local Distance = ( ( WayPoint.x - EscortPositionVec3.x )^2 + + ( WayPoint.y - EscortPositionVec3.z )^2 + ) ^ 0.5 / 1000 + MENU_CLIENT_COMMAND:New( self.EscortClient, "Waypoint " .. WayPointID .. " at " .. string.format( "%.2f", Distance ).. "km", self.EscortMenuResumeMission, ESCORT._ResumeMission, { ParamSelf = self, ParamWayPoint = WayPointID } ) + end + end + return true + end + + return false +end +--- Provides missile training functions. +-- +-- @{#MISSILETRAINER} class +-- ======================== +-- The @{#MISSILETRAINER} class uses the DCS world messaging system to be alerted of any missiles fired, and when a missile would hit your aircraft, +-- the class will destroy the missile within a certain range, to avoid damage to your aircraft. +-- It suports the following functionality: +-- +-- * Track the missiles fired at you and other players, providing bearing and range information of the missiles towards the airplanes. +-- * Provide alerts of missile launches, including detailed information of the units launching, including bearing, range … +-- * Provide alerts when a missile would have killed your aircraft. +-- * Provide alerts when the missile self destructs. +-- * Enable / Disable and Configure the Missile Trainer using the various menu options. +-- +-- When running a mission where MISSILETRAINER is used, the following radio menu structure ( 'Radio Menu' -> 'Other (F10)' -> 'MissileTrainer' ) options are available for the players: +-- +-- * **Messages**: Menu to configure all messages. +-- * **Messages On**: Show all messages. +-- * **Messages Off**: Disable all messages. +-- * **Tracking**: Menu to configure missile tracking messages. +-- * **To All**: Shows missile tracking messages to all players. +-- * **To Target**: Shows missile tracking messages only to the player where the missile is targetted at. +-- * **Tracking On**: Show missile tracking messages. +-- * **Tracking Off**: Disable missile tracking messages. +-- * **Frequency Increase**: Increases the missile tracking message frequency with one second. +-- * **Frequency Decrease**: Decreases the missile tracking message frequency with one second. +-- * **Alerts**: Menu to configure alert messages. +-- * **To All**: Shows alert messages to all players. +-- * **To Target**: Shows alert messages only to the player where the missile is (was) targetted at. +-- * **Hits On**: Show missile hit alert messages. +-- * **Hits Off**: Disable missile hit alert messages. +-- * **Launches On**: Show missile launch messages. +-- * **Launches Off**: Disable missile launch messages. +-- * **Details**: Menu to configure message details. +-- * **Range On**: Shows range information when a missile is fired to a target. +-- * **Range Off**: Disable range information when a missile is fired to a target. +-- * **Bearing On**: Shows bearing information when a missile is fired to a target. +-- * **Bearing Off**: Disable bearing information when a missile is fired to a target. +-- * **Distance**: Menu to configure the distance when a missile needs to be destroyed when near to a player, during tracking. This will improve/influence hit calculation accuracy, but has the risk of damaging the aircraft when the missile reaches the aircraft before the distance is measured. +-- * **50 meter**: Destroys the missile when the distance to the aircraft is below or equal to 50 meter. +-- * **100 meter**: Destroys the missile when the distance to the aircraft is below or equal to 100 meter. +-- * **150 meter**: Destroys the missile when the distance to the aircraft is below or equal to 150 meter. +-- * **200 meter**: Destroys the missile when the distance to the aircraft is below or equal to 200 meter. +-- +-- +-- MISSILETRAINER construction methods: +-- ==================================== +-- Create a new MISSILETRAINER object with the @{#MISSILETRAINER.New} method: +-- +-- * @{#MISSILETRAINER.New}: Creates a new MISSILETRAINER object taking the maximum distance to your aircraft to evaluate when a missile needs to be destroyed. +-- +-- MISSILETRAINER will collect each unit declared in the mission with a skill level "Client" and "Player", and will monitor the missiles shot at those. +-- +-- MISSILETRAINER initialization methods: +-- ====================================== +-- A MISSILETRAINER object will behave differently based on the usage of initialization methods: +-- +-- * @{#MISSILETRAINER.InitMessagesOnOff}: Sets by default the display of any message to be ON or OFF. +-- * @{#MISSILETRAINER.InitTrackingToAll}: Sets by default the missile tracking report for all players or only for those missiles targetted to you. +-- * @{#MISSILETRAINER.InitTrackingOnOff}: Sets by default the display of missile tracking report to be ON or OFF. +-- * @{#MISSILETRAINER.InitTrackingFrequency}: Increases, decreases the missile tracking message display frequency with the provided time interval in seconds. +-- * @{#MISSILETRAINER.InitAlertsToAll}: Sets by default the display of alerts to be shown to all players or only to you. +-- * @{#MISSILETRAINER.InitAlertsHitsOnOff}: Sets by default the display of hit alerts ON or OFF. +-- * @{#MISSILETRAINER.InitAlertsLaunchesOnOff}: Sets by default the display of launch alerts ON or OFF. +-- * @{#MISSILETRAINER.InitRangeOnOff}: Sets by default the display of range information of missiles ON of OFF. +-- * @{#MISSILETRAINER.InitBearingOnOff}: Sets by default the display of bearing information of missiles ON of OFF. +-- * @{#MISSILETRAINER.InitMenusOnOff}: Allows to configure the options through the radio menu. +-- +-- @module MissileTrainer +-- @author FlightControl + + +Include.File( "Client" ) +Include.File( "Scheduler" ) + +--- The MISSILETRAINER class +-- @type MISSILETRAINER +-- @extends Base#BASE +MISSILETRAINER = { + ClassName = "MISSILETRAINER", +} + +--- Creates the main object which is handling missile tracking. +-- When a missile is fired a SCHEDULER is set off that follows the missile. When near a certain a client player, the missile will be destroyed. +-- @param #MISSILETRAINER self +-- @param #number Distance The distance in meters when a tracked missile needs to be destroyed when close to a player. +-- @param #string Briefing (Optional) Will show a text to the players when starting their mission. Can be used for briefing purposes. +-- @return #MISSILETRAINER +function MISSILETRAINER:New( Distance, Briefing ) + local self = BASE:Inherit( self, BASE:New() ) + self:F( Distance ) + + if Briefing then + self.Briefing = Briefing + end + + self.Schedulers = {} + self.SchedulerID = 0 + + self.MessageInterval = 2 + self.MessageLastTime = timer.getTime() + + self.Distance = Distance / 1000 + + _EVENTDISPATCHER:OnShot( self._EventShot, self ) + + self.DB = DATABASE:New():FilterStart() + self.DBClients = self.DB.Clients + self.DBUnits = self.DB.Units + + for ClientID, Client in pairs( self.DBClients ) do + + local function _Alive( Client ) + + if self.Briefing then + Client:Message( self.Briefing, 15, "HELLO WORLD", "Trainer" ) + end + + if self.MenusOnOff == true then + Client:Message( "Use the 'Radio Menu' -> 'Other (F10)' -> 'Missile Trainer' menu options to change the Missile Trainer settings (for all players).", 15, "MENU", "Trainer" ) + + Client.MainMenu = MENU_CLIENT:New( Client, "Missile Trainer", nil ) -- Menu#MENU_CLIENT + + Client.MenuMessages = MENU_CLIENT:New( Client, "Messages", Client.MainMenu ) + Client.MenuOn = MENU_CLIENT_COMMAND:New( Client, "Messages On", Client.MenuMessages, self._MenuMessages, { MenuSelf = self, MessagesOnOff = true } ) + Client.MenuOff = MENU_CLIENT_COMMAND:New( Client, "Messages Off", Client.MenuMessages, self._MenuMessages, { MenuSelf = self, MessagesOnOff = false } ) + + Client.MenuTracking = MENU_CLIENT:New( Client, "Tracking", Client.MainMenu ) + Client.MenuTrackingToAll = MENU_CLIENT_COMMAND:New( Client, "To All", Client.MenuTracking, self._MenuMessages, { MenuSelf = self, TrackingToAll = true } ) + Client.MenuTrackingToTarget = MENU_CLIENT_COMMAND:New( Client, "To Target", Client.MenuTracking, self._MenuMessages, { MenuSelf = self, TrackingToAll = false } ) + Client.MenuTrackOn = MENU_CLIENT_COMMAND:New( Client, "Tracking On", Client.MenuTracking, self._MenuMessages, { MenuSelf = self, TrackingOnOff = true } ) + Client.MenuTrackOff = MENU_CLIENT_COMMAND:New( Client, "Tracking Off", Client.MenuTracking, self._MenuMessages, { MenuSelf = self, TrackingOnOff = false } ) + Client.MenuTrackIncrease = MENU_CLIENT_COMMAND:New( Client, "Frequency Increase", Client.MenuTracking, self._MenuMessages, { MenuSelf = self, TrackingFrequency = -1 } ) + Client.MenuTrackDecrease = MENU_CLIENT_COMMAND:New( Client, "Frequency Decrease", Client.MenuTracking, self._MenuMessages, { MenuSelf = self, TrackingFrequency = 1 } ) + + Client.MenuAlerts = MENU_CLIENT:New( Client, "Alerts", Client.MainMenu ) + Client.MenuAlertsToAll = MENU_CLIENT_COMMAND:New( Client, "To All", Client.MenuAlerts, self._MenuMessages, { MenuSelf = self, AlertsToAll = true } ) + Client.MenuAlertsToTarget = MENU_CLIENT_COMMAND:New( Client, "To Target", Client.MenuAlerts, self._MenuMessages, { MenuSelf = self, AlertsToAll = false } ) + Client.MenuHitsOn = MENU_CLIENT_COMMAND:New( Client, "Hits On", Client.MenuAlerts, self._MenuMessages, { MenuSelf = self, AlertsHitsOnOff = true } ) + Client.MenuHitsOff = MENU_CLIENT_COMMAND:New( Client, "Hits Off", Client.MenuAlerts, self._MenuMessages, { MenuSelf = self, AlertsHitsOnOff = false } ) + Client.MenuLaunchesOn = MENU_CLIENT_COMMAND:New( Client, "Launches On", Client.MenuAlerts, self._MenuMessages, { MenuSelf = self, AlertsLaunchesOnOff = true } ) + Client.MenuLaunchesOff = MENU_CLIENT_COMMAND:New( Client, "Launches Off", Client.MenuAlerts, self._MenuMessages, { MenuSelf = self, AlertsLaunchesOnOff = false } ) + + Client.MenuDetails = MENU_CLIENT:New( Client, "Details", Client.MainMenu ) + Client.MenuDetailsDistanceOn = MENU_CLIENT_COMMAND:New( Client, "Range On", Client.MenuDetails, self._MenuMessages, { MenuSelf = self, DetailsRangeOnOff = true } ) + Client.MenuDetailsDistanceOff = MENU_CLIENT_COMMAND:New( Client, "Range Off", Client.MenuDetails, self._MenuMessages, { MenuSelf = self, DetailsRangeOnOff = false } ) + Client.MenuDetailsBearingOn = MENU_CLIENT_COMMAND:New( Client, "Bearing On", Client.MenuDetails, self._MenuMessages, { MenuSelf = self, DetailsBearingOnOff = true } ) + Client.MenuDetailsBearingOff = MENU_CLIENT_COMMAND:New( Client, "Bearing Off", Client.MenuDetails, self._MenuMessages, { MenuSelf = self, DetailsBearingOnOff = false } ) + + Client.MenuDistance = MENU_CLIENT:New( Client, "Set distance to plane", Client.MainMenu ) + Client.MenuDistance50 = MENU_CLIENT_COMMAND:New( Client, "50 meter", Client.MenuDistance, self._MenuMessages, { MenuSelf = self, Distance = 50 / 1000 } ) + Client.MenuDistance100 = MENU_CLIENT_COMMAND:New( Client, "100 meter", Client.MenuDistance, self._MenuMessages, { MenuSelf = self, Distance = 100 / 1000 } ) + Client.MenuDistance150 = MENU_CLIENT_COMMAND:New( Client, "150 meter", Client.MenuDistance, self._MenuMessages, { MenuSelf = self, Distance = 150 / 1000 } ) + Client.MenuDistance200 = MENU_CLIENT_COMMAND:New( Client, "200 meter", Client.MenuDistance, self._MenuMessages, { MenuSelf = self, Distance = 200 / 1000 } ) + else + if Client.MainMenu then + Client.MainMenu:Remove() + end + end + + + local ClientID = Client:GetID() + self:T( ClientID ) + if not self.TrackingMissiles[ClientID] then + self.TrackingMissiles[ClientID] = {} + end + self.TrackingMissiles[ClientID].Client = Client + if not self.TrackingMissiles[ClientID].MissileData then + self.TrackingMissiles[ClientID].MissileData = {} + end + end + + Client:Alive( _Alive ) + + end + +-- self.DB:ForEachClient( +-- --- @param Client#CLIENT Client +-- function( Client ) +-- +-- ... actions ... +-- +-- end +-- ) + + self.MessagesOnOff = true + + self.TrackingToAll = false + self.TrackingOnOff = true + self.TrackingFrequency = 3 + + self.AlertsToAll = true + self.AlertsHitsOnOff = true + self.AlertsLaunchesOnOff = true + + self.DetailsRangeOnOff = true + self.DetailsBearingOnOff = true + + self.MenusOnOff = true + + self.TrackingMissiles = {} + + self.TrackingScheduler = SCHEDULER:New( self, self._TrackMissiles, {}, 0.5, 0.05, 0 ) + + return self +end + +-- Initialization methods. + + +--- Sets by default the display of any message to be ON or OFF. +-- @param #MISSILETRAINER self +-- @param #boolean MessagesOnOff true or false +-- @return #MISSILETRAINER self +function MISSILETRAINER:InitMessagesOnOff( MessagesOnOff ) + self:F( MessagesOnOff ) + + self.MessagesOnOff = MessagesOnOff + if self.MessagesOnOff == true then + MESSAGE:New( "Messages ON", "Menu", 15, "ID" ):ToAll() + else + MESSAGE:New( "Messages OFF", "Menu", 15, "ID" ):ToAll() + end + + return self +end + +--- Sets by default the missile tracking report for all players or only for those missiles targetted to you. +-- @param #MISSILETRAINER self +-- @param #boolean TrackingToAll true or false +-- @return #MISSILETRAINER self +function MISSILETRAINER:InitTrackingToAll( TrackingToAll ) + self:F( TrackingToAll ) + + self.TrackingToAll = TrackingToAll + if self.TrackingToAll == true then + MESSAGE:New( "Missile tracking to all players ON", "Menu", 15, "ID" ):ToAll() + else + MESSAGE:New( "Missile tracking to all players OFF", "Menu", 15, "ID" ):ToAll() + end + + return self +end + +--- Sets by default the display of missile tracking report to be ON or OFF. +-- @param #MISSILETRAINER self +-- @param #boolean TrackingOnOff true or false +-- @return #MISSILETRAINER self +function MISSILETRAINER:InitTrackingOnOff( TrackingOnOff ) + self:F( TrackingOnOff ) + + self.TrackingOnOff = TrackingOnOff + if self.TrackingOnOff == true then + MESSAGE:New( "Missile tracking ON", "Menu", 15, "ID" ):ToAll() + else + MESSAGE:New( "Missile tracking OFF", "Menu", 15, "ID" ):ToAll() + end + + return self +end + +--- Increases, decreases the missile tracking message display frequency with the provided time interval in seconds. +-- The default frequency is a 3 second interval, so the Tracking Frequency parameter specifies the increase or decrease from the default 3 seconds or the last frequency update. +-- @param #MISSILETRAINER self +-- @param #number TrackingFrequency Provide a negative or positive value in seconds to incraese or decrease the display frequency. +-- @return #MISSILETRAINER self +function MISSILETRAINER:InitTrackingFrequency( TrackingFrequency ) + self:F( TrackingFrequency ) + + self.TrackingFrequency = self.TrackingFrequency + TrackingFrequency + if self.TrackingFrequency < 0.5 then + self.TrackingFrequency = 0.5 + end + if self.TrackingFrequency then + MESSAGE:New( "Missile tracking frequency is " .. self.TrackingFrequency .. " seconds.", "Menu", 15, "ID" ):ToAll() + end + + return self +end + +--- Sets by default the display of alerts to be shown to all players or only to you. +-- @param #MISSILETRAINER self +-- @param #boolean AlertsToAll true or false +-- @return #MISSILETRAINER self +function MISSILETRAINER:InitAlertsToAll( AlertsToAll ) + self:F( AlertsToAll ) + + self.AlertsToAll = AlertsToAll + if self.AlertsToAll == true then + MESSAGE:New( "Alerts to all players ON", "Menu", 15, "ID" ):ToAll() + else + MESSAGE:New( "Alerts to all players OFF", "Menu", 15, "ID" ):ToAll() + end + + return self +end + +--- Sets by default the display of hit alerts ON or OFF. +-- @param #MISSILETRAINER self +-- @param #boolean AlertsHitsOnOff true or false +-- @return #MISSILETRAINER self +function MISSILETRAINER:InitAlertsHitsOnOff( AlertsHitsOnOff ) + self:F( AlertsHitsOnOff ) + + self.AlertsHitsOnOff = AlertsHitsOnOff + if self.AlertsHitsOnOff == true then + MESSAGE:New( "Alerts Hits ON", "Menu", 15, "ID" ):ToAll() + else + MESSAGE:New( "Alerts Hits OFF", "Menu", 15, "ID" ):ToAll() + end + + return self +end + +--- Sets by default the display of launch alerts ON or OFF. +-- @param #MISSILETRAINER self +-- @param #boolean AlertsLaunchesOnOff true or false +-- @return #MISSILETRAINER self +function MISSILETRAINER:InitAlertsLaunchesOnOff( AlertsLaunchesOnOff ) + self:F( AlertsLaunchesOnOff ) + + self.AlertsLaunchesOnOff = AlertsLaunchesOnOff + if self.AlertsLaunchesOnOff == true then + MESSAGE:New( "Alerts Launches ON", "Menu", 15, "ID" ):ToAll() + else + MESSAGE:New( "Alerts Launches OFF", "Menu", 15, "ID" ):ToAll() + end + + return self +end + +--- Sets by default the display of range information of missiles ON of OFF. +-- @param #MISSILETRAINER self +-- @param #boolean DetailsRangeOnOff true or false +-- @return #MISSILETRAINER self +function MISSILETRAINER:InitRangeOnOff( DetailsRangeOnOff ) + self:F( DetailsRangeOnOff ) + + self.DetailsRangeOnOff = DetailsRangeOnOff + if self.DetailsRangeOnOff == true then + MESSAGE:New( "Range display ON", "Menu", 15, "ID" ):ToAll() + else + MESSAGE:New( "Range display OFF", "Menu", 15, "ID" ):ToAll() + end + + return self +end + +--- Sets by default the display of bearing information of missiles ON of OFF. +-- @param #MISSILETRAINER self +-- @param #boolean DetailsBearingOnOff true or false +-- @return #MISSILETRAINER self +function MISSILETRAINER:InitBearingOnOff( DetailsBearingOnOff ) + self:F( DetailsBearingOnOff ) + + self.DetailsBearingOnOff = DetailsBearingOnOff + if self.DetailsBearingOnOff == true then + MESSAGE:New( "Bearing display OFF", "Menu", 15, "ID" ):ToAll() + else + MESSAGE:New( "Bearing display OFF", "Menu", 15, "ID" ):ToAll() + end + + return self +end + +--- Enables / Disables the menus. +-- @param #MISSILETRAINER self +-- @param #boolean MenusOnOff true or false +-- @return #MISSILETRAINER self +function MISSILETRAINER:InitMenusOnOff( MenusOnOff ) + self:F( MenusOnOff ) + + self.MenusOnOff = MenusOnOff + if self.MenusOnOff == true then + MESSAGE:New( "Menus are ENABLED (only when a player rejoins a slot)", "Menu", 15, "ID" ):ToAll() + else + MESSAGE:New( "Menus are DISABLED", "Menu", 15, "ID" ):ToAll() + end + + return self +end + + +-- Menu functions + +function MISSILETRAINER._MenuMessages( MenuParameters ) + + local self = MenuParameters.MenuSelf + + if MenuParameters.MessagesOnOff ~= nil then + self:InitMessagesOnOff( MenuParameters.MessagesOnOff ) + end + + if MenuParameters.TrackingToAll ~= nil then + self:InitTrackingToAll( MenuParameters.TrackingToAll ) + end + + if MenuParameters.TrackingOnOff ~= nil then + self:InitTrackingOnOff( MenuParameters.TrackingOnOff ) + end + + if MenuParameters.TrackingFrequency ~= nil then + self:InitTrackingFrequency( MenuParameters.TrackingFrequency ) + end + + if MenuParameters.AlertsToAll ~= nil then + self:InitAlertsToAll( MenuParameters.AlertsToAll ) + end + + if MenuParameters.AlertsHitsOnOff ~= nil then + self:InitAlertsHitsOnOff( MenuParameters.AlertsHitsOnOff ) + end + + if MenuParameters.AlertsLaunchesOnOff ~= nil then + self:InitAlertsLaunchesOnOff( MenuParameters.AlertsLaunchesOnOff ) + end + + if MenuParameters.DetailsRangeOnOff ~= nil then + self:InitRangeOnOff( MenuParameters.DetailsRangeOnOff ) + end + + if MenuParameters.DetailsBearingOnOff ~= nil then + self:InitBearingOnOff( MenuParameters.DetailsBearingOnOff ) + end + + if MenuParameters.Distance ~= nil then + self.Distance = MenuParameters.Distance + MESSAGE:New( "Hit detection distance set to " .. self.Distance .. " meters", "Menu", 15, "ID" ):ToAll() + end + +end + +--- Detects if an SA site was shot with an anti radiation missile. In this case, take evasive actions based on the skill level set within the ME. +-- @param #MISSILETRAINER self +-- @param Event#EVENTDATA Event +function MISSILETRAINER:_EventShot( Event ) + self:F( { Event } ) + + local TrainerSourceDCSUnit = Event.IniDCSUnit + local TrainerSourceDCSUnitName = Event.IniDCSUnitName + local TrainerWeapon = Event.Weapon -- Identify the weapon fired + local TrainerWeaponName = Event.WeaponName -- return weapon type + + self:T( "Missile Launched = " .. TrainerWeaponName ) + + local TrainerTargetDCSUnit = TrainerWeapon:getTarget() -- Identify target + local TrainerTargetDCSUnitName = Unit.getName( TrainerTargetDCSUnit ) + local TrainerTargetSkill = _DATABASE.Templates.Units[TrainerTargetDCSUnitName].Template.skill + + self:T(TrainerTargetDCSUnitName ) + + local Client = self.DBClients[TrainerTargetDCSUnitName] + if Client then + + local TrainerSourceUnit = UNIT:Find( TrainerSourceDCSUnit ) + local TrainerTargetUnit = UNIT:Find( TrainerTargetDCSUnit ) + + if self.MessagesOnOff == true and self.AlertsLaunchesOnOff == true then + + local Message = MESSAGE:New( + string.format( "%s launched a %s", + TrainerSourceUnit:GetTypeName(), + TrainerWeaponName + ) .. self:_AddRange( Client, TrainerWeapon ) .. self:_AddBearing( Client, TrainerWeapon ),"Launch Alert", 5, "ID" ) + + if self.AlertsToAll then + Message:ToAll() + else + Message:ToClient( Client ) + end + end + + local ClientID = Client:GetID() + local MissileData = {} + MissileData.TrainerSourceUnit = TrainerSourceUnit + MissileData.TrainerWeapon = TrainerWeapon + MissileData.TrainerTargetUnit = TrainerTargetUnit + MissileData.TrainerWeaponTypeName = TrainerWeapon:getTypeName() + MissileData.TrainerWeaponLaunched = true + table.insert( self.TrackingMissiles[ClientID].MissileData, MissileData ) + --self:T( self.TrackingMissiles ) + end +end + +function MISSILETRAINER:_AddRange( Client, TrainerWeapon ) + + local RangeText = "" + + if self.DetailsRangeOnOff then + + local PositionMissile = TrainerWeapon:getPoint() + local PositionTarget = Client:GetPointVec3() + + local Range = ( ( PositionMissile.x - PositionTarget.x )^2 + + ( PositionMissile.y - PositionTarget.y )^2 + + ( PositionMissile.z - PositionTarget.z )^2 + ) ^ 0.5 / 1000 + + RangeText = string.format( ", at %4.2fkm", Range ) + end + + return RangeText +end + +function MISSILETRAINER:_AddBearing( Client, TrainerWeapon ) + + local BearingText = "" + + if self.DetailsBearingOnOff then + + local PositionMissile = TrainerWeapon:getPoint() + local PositionTarget = Client:GetPointVec3() + + self:T2( { PositionTarget, PositionMissile }) + + local DirectionVector = { x = PositionMissile.x - PositionTarget.x, y = PositionMissile.y - PositionTarget.y, z = PositionMissile.z - PositionTarget.z } + local DirectionRadians = math.atan2( DirectionVector.z, DirectionVector.x ) + --DirectionRadians = DirectionRadians + routines.getNorthCorrection( PositionTarget ) + if DirectionRadians < 0 then + DirectionRadians = DirectionRadians + 2 * math.pi + end + local DirectionDegrees = DirectionRadians * 180 / math.pi + + BearingText = string.format( ", %d degrees", DirectionDegrees ) + end + + return BearingText +end + + +function MISSILETRAINER:_TrackMissiles() + self:F2() + + + local ShowMessages = false + if self.MessagesOnOff and self.MessageLastTime + self.TrackingFrequency <= timer.getTime() then + self.MessageLastTime = timer.getTime() + ShowMessages = true + end + + -- ALERTS PART + + -- Loop for all Player Clients to check the alerts and deletion of missiles. + for ClientDataID, ClientData in pairs( self.TrackingMissiles ) do + + local Client = ClientData.Client + self:T2( { Client:GetName() } ) + + for MissileDataID, MissileData in pairs( ClientData.MissileData ) do + self:T3( MissileDataID ) + + local TrainerSourceUnit = MissileData.TrainerSourceUnit + local TrainerWeapon = MissileData.TrainerWeapon + local TrainerTargetUnit = MissileData.TrainerTargetUnit + local TrainerWeaponTypeName = MissileData.TrainerWeaponTypeName + local TrainerWeaponLaunched = MissileData.TrainerWeaponLaunched + + if Client and Client:IsAlive() and TrainerSourceUnit and TrainerSourceUnit:IsAlive() and TrainerWeapon and TrainerWeapon:isExist() and TrainerTargetUnit and TrainerTargetUnit:IsAlive() then + local PositionMissile = TrainerWeapon:getPosition().p + local PositionTarget = Client:GetPointVec3() + + local Distance = ( ( PositionMissile.x - PositionTarget.x )^2 + + ( PositionMissile.y - PositionTarget.y )^2 + + ( PositionMissile.z - PositionTarget.z )^2 + ) ^ 0.5 / 1000 + + if Distance <= self.Distance then + -- Hit alert + TrainerWeapon:destroy() + if self.MessagesOnOff == true and self.AlertsHitsOnOff == true then + + self:T( "killed" ) + + local Message = MESSAGE:New( + string.format( "%s launched by %s killed %s", + TrainerWeapon:getTypeName(), + TrainerSourceUnit:GetTypeName(), + TrainerTargetUnit:GetPlayerName() + ),"Hit Alert", 15, "ID" ) + + if self.AlertsToAll == true then + Message:ToAll() + else + Message:ToClient( Client ) + end + + MissileData = nil + table.remove( ClientData.MissileData, MissileDataID ) + self:T(ClientData.MissileData) + end + end + else + if not ( TrainerWeapon and TrainerWeapon:isExist() ) then + if self.MessagesOnOff == true and self.AlertsLaunchesOnOff == true then + -- Weapon does not exist anymore. Delete from Table + local Message = MESSAGE:New( + string.format( "%s launched by %s self destructed!", + TrainerWeaponTypeName, + TrainerSourceUnit:GetTypeName() + ),"Tracking", 5, "ID" ) + + if self.AlertsToAll == true then + Message:ToAll() + else + Message:ToClient( Client ) + end + end + MissileData = nil + table.remove( ClientData.MissileData, MissileDataID ) + self:T( ClientData.MissileData ) + end + end + end + end + + if ShowMessages == true and self.MessagesOnOff == true and self.TrackingOnOff == true then -- Only do this when tracking information needs to be displayed. + + -- TRACKING PART + + -- For the current client, the missile range and bearing details are displayed To the Player Client. + -- For the other clients, the missile range and bearing details are displayed To the other Player Clients. + -- To achieve this, a cross loop is done for each Player Client <-> Other Player Client missile information. + + -- Main Player Client loop + for ClientDataID, ClientData in pairs( self.TrackingMissiles ) do + + local Client = ClientData.Client + self:T2( { Client:GetName() } ) + + + ClientData.MessageToClient = "" + ClientData.MessageToAll = "" + + -- Other Players Client loop + for TrackingDataID, TrackingData in pairs( self.TrackingMissiles ) do + + for MissileDataID, MissileData in pairs( TrackingData.MissileData ) do + self:T3( MissileDataID ) + + local TrainerSourceUnit = MissileData.TrainerSourceUnit + local TrainerWeapon = MissileData.TrainerWeapon + local TrainerTargetUnit = MissileData.TrainerTargetUnit + local TrainerWeaponTypeName = MissileData.TrainerWeaponTypeName + local TrainerWeaponLaunched = MissileData.TrainerWeaponLaunched + + if Client and Client:IsAlive() and TrainerSourceUnit and TrainerSourceUnit:IsAlive() and TrainerWeapon and TrainerWeapon:isExist() and TrainerTargetUnit and TrainerTargetUnit:IsAlive() then + + if ShowMessages == true then + local TrackingTo + TrackingTo = string.format( " -> %s", + TrainerWeaponTypeName + ) + + if ClientDataID == TrackingDataID then + if ClientData.MessageToClient == "" then + ClientData.MessageToClient = "Missiles to You:\n" + end + ClientData.MessageToClient = ClientData.MessageToClient .. TrackingTo .. self:_AddRange( ClientData.Client, TrainerWeapon ) .. self:_AddBearing( ClientData.Client, TrainerWeapon ) .. "\n" + else + if self.TrackingToAll == true then + if ClientData.MessageToAll == "" then + ClientData.MessageToAll = "Missiles to other Players:\n" + end + ClientData.MessageToAll = ClientData.MessageToAll .. TrackingTo .. self:_AddRange( ClientData.Client, TrainerWeapon ) .. self:_AddBearing( ClientData.Client, TrainerWeapon ) .. " ( " .. TrainerTargetUnit:GetPlayerName() .. " )\n" + end + end + end + end + end + end + + -- Once the Player Client and the Other Player Client tracking messages are prepared, show them. + if ClientData.MessageToClient ~= "" or ClientData.MessageToAll ~= "" then + local Message = MESSAGE:New( ClientData.MessageToClient .. ClientData.MessageToAll, "Tracking", 1, "ID" ):ToClient( Client ) + end + end + end + + return true +end +env.info( '*** MOOSE INCLUDE END *** ' ) diff --git a/Moose Mission Setup/Moose.lua b/Moose Mission Setup/Moose.lua index dc9f9f58b..7db8a5175 100644 --- a/Moose Mission Setup/Moose.lua +++ b/Moose Mission Setup/Moose.lua @@ -1,6 +1,5 @@ -env.info( '*** MOOSE DYNAMIC INCLUDE START *** ' ) -env.info( 'Moose Generation Timestamp: 20160604_1716' ) - +env.info( '*** MOOSE STATIC INCLUDE START *** ' ) +env.info( 'Moose Generation Timestamp: 20160605_0003' ) local base = _G env.info("Loading MOOSE " .. base.timer.getAbsTime() ) @@ -12,27 +11,9 @@ Include.Path = function() end Include.File = function( IncludeFile ) - if not Include.Files[ IncludeFile ] then - Include.Files[IncludeFile] = IncludeFile - env.info( "Include:" .. IncludeFile .. " from " .. Include.ProgramPath ) - local f = assert( base.loadfile( Include.ProgramPath .. IncludeFile .. ".lua" ) ) - if f == nil then - env.info( "Include:" .. IncludeFile .. " from " .. Include.MissionPath ) - local f = assert( base.loadfile( Include.MissionPath .. IncludeFile .. ".lua" ) ) - if f == nil then - error ("Could not load MOOSE file " .. IncludeFile .. ".lua" ) - else - env.info( "Include:" .. IncludeFile .. " loaded from " .. Include.MissionPath ) - return f() - end - else - env.info( "Include:" .. IncludeFile .. " loaded from " .. Include.ProgramPath ) - return f() - end - end end -Include.ProgramPath = "Scripts/Moose/" +Include.ProgramPath = "Scripts/Moose/Moose/" Include.MissionPath = Include.Path() env.info( "Include.ProgramPath = " .. Include.ProgramPath) @@ -42,4 +23,17596 @@ Include.Files = {} Include.File( "Moose" ) -env.info("Loaded MOOSE Include Engine")env.info( '*** MOOSE INCLUDE END *** ' ) +env.info("Loaded MOOSE Include Engine") +--- Various routines +-- @module routines +-- @author Flightcontrol + +--Include.File( "Trace" ) +--Include.File( "Message" ) + + +env.setErrorMessageBoxEnabled(false) + +--- Extract of MIST functions. +-- @author Grimes + +routines = {} + + +-- don't change these +routines.majorVersion = 3 +routines.minorVersion = 3 +routines.build = 22 + +----------------------------------------------------------------------------------------------------------------- + +---------------------------------------------------------------------------------------------- +-- Utils- conversion, Lua utils, etc. +routines.utils = {} + +--from http://lua-users.org/wiki/CopyTable +routines.utils.deepCopy = function(object) + local lookup_table = {} + local function _copy(object) + if type(object) ~= "table" then + return object + elseif lookup_table[object] then + return lookup_table[object] + end + local new_table = {} + lookup_table[object] = new_table + for index, value in pairs(object) do + new_table[_copy(index)] = _copy(value) + end + return setmetatable(new_table, getmetatable(object)) + end + local objectreturn = _copy(object) + return objectreturn +end + + +-- porting in Slmod's serialize_slmod2 +routines.utils.oneLineSerialize = function(tbl) -- serialization of a table all on a single line, no comments, made to replace old get_table_string function + + lookup_table = {} + + local function _Serialize( tbl ) + + if type(tbl) == 'table' then --function only works for tables! + + if lookup_table[tbl] then + return lookup_table[object] + end + + local tbl_str = {} + + lookup_table[tbl] = tbl_str + + tbl_str[#tbl_str + 1] = '{' + + for ind,val in pairs(tbl) do -- serialize its fields + local ind_str = {} + if type(ind) == "number" then + ind_str[#ind_str + 1] = '[' + ind_str[#ind_str + 1] = tostring(ind) + ind_str[#ind_str + 1] = ']=' + else --must be a string + ind_str[#ind_str + 1] = '[' + ind_str[#ind_str + 1] = routines.utils.basicSerialize(ind) + ind_str[#ind_str + 1] = ']=' + end + + local val_str = {} + if ((type(val) == 'number') or (type(val) == 'boolean')) then + val_str[#val_str + 1] = tostring(val) + val_str[#val_str + 1] = ',' + tbl_str[#tbl_str + 1] = table.concat(ind_str) + tbl_str[#tbl_str + 1] = table.concat(val_str) + elseif type(val) == 'string' then + val_str[#val_str + 1] = routines.utils.basicSerialize(val) + val_str[#val_str + 1] = ',' + tbl_str[#tbl_str + 1] = table.concat(ind_str) + tbl_str[#tbl_str + 1] = table.concat(val_str) + elseif type(val) == 'nil' then -- won't ever happen, right? + val_str[#val_str + 1] = 'nil,' + tbl_str[#tbl_str + 1] = table.concat(ind_str) + tbl_str[#tbl_str + 1] = table.concat(val_str) + elseif type(val) == 'table' then + if ind == "__index" then + -- tbl_str[#tbl_str + 1] = "__index" + -- tbl_str[#tbl_str + 1] = ',' --I think this is right, I just added it + else + + val_str[#val_str + 1] = _Serialize(val) + val_str[#val_str + 1] = ',' --I think this is right, I just added it + tbl_str[#tbl_str + 1] = table.concat(ind_str) + tbl_str[#tbl_str + 1] = table.concat(val_str) + end + elseif type(val) == 'function' then + -- tbl_str[#tbl_str + 1] = "function " .. tostring(ind) + -- tbl_str[#tbl_str + 1] = ',' --I think this is right, I just added it + else +-- env.info('unable to serialize value type ' .. routines.utils.basicSerialize(type(val)) .. ' at index ' .. tostring(ind)) +-- env.info( debug.traceback() ) + end + + end + tbl_str[#tbl_str + 1] = '}' + return table.concat(tbl_str) + else + return tostring(tbl) + end + end + + local objectreturn = _Serialize(tbl) + return objectreturn +end + +--porting in Slmod's "safestring" basic serialize +routines.utils.basicSerialize = function(s) + if s == nil then + return "\"\"" + else + if ((type(s) == 'number') or (type(s) == 'boolean') or (type(s) == 'function') or (type(s) == 'table') or (type(s) == 'userdata') ) then + return tostring(s) + elseif type(s) == 'string' then + s = string.format('%q', s) + return s + end + end +end + + +routines.utils.toDegree = function(angle) + return angle*180/math.pi +end + +routines.utils.toRadian = function(angle) + return angle*math.pi/180 +end + +routines.utils.metersToNM = function(meters) + return meters/1852 +end + +routines.utils.metersToFeet = function(meters) + return meters/0.3048 +end + +routines.utils.NMToMeters = function(NM) + return NM*1852 +end + +routines.utils.feetToMeters = function(feet) + return feet*0.3048 +end + +routines.utils.mpsToKnots = function(mps) + return mps*3600/1852 +end + +routines.utils.mpsToKmph = function(mps) + return mps*3.6 +end + +routines.utils.knotsToMps = function(knots) + return knots*1852/3600 +end + +routines.utils.kmphToMps = function(kmph) + return kmph/3.6 +end + +function routines.utils.makeVec2(Vec3) + if Vec3.z then + return {x = Vec3.x, y = Vec3.z} + else + return {x = Vec3.x, y = Vec3.y} -- it was actually already vec2. + end +end + +function routines.utils.makeVec3(Vec2, y) + if not Vec2.z then + if not y then + y = 0 + end + return {x = Vec2.x, y = y, z = Vec2.y} + else + return {x = Vec2.x, y = Vec2.y, z = Vec2.z} -- it was already Vec3, actually. + end +end + +function routines.utils.makeVec3GL(Vec2, offset) + local adj = offset or 0 + + if not Vec2.z then + return {x = Vec2.x, y = (land.getHeight(Vec2) + adj), z = Vec2.y} + else + return {x = Vec2.x, y = (land.getHeight({x = Vec2.x, y = Vec2.z}) + adj), z = Vec2.z} + end +end + +routines.utils.zoneToVec3 = function(zone) + local new = {} + if type(zone) == 'table' and zone.point then + new.x = zone.point.x + new.y = zone.point.y + new.z = zone.point.z + return new + elseif type(zone) == 'string' then + zone = trigger.misc.getZone(zone) + if zone then + new.x = zone.point.x + new.y = zone.point.y + new.z = zone.point.z + return new + end + end +end + +-- gets heading-error corrected direction from point along vector vec. +function routines.utils.getDir(vec, point) + local dir = math.atan2(vec.z, vec.x) + dir = dir + routines.getNorthCorrection(point) + if dir < 0 then + dir = dir + 2*math.pi -- put dir in range of 0 to 2*pi + end + return dir +end + +-- gets distance in meters between two points (2 dimensional) +function routines.utils.get2DDist(point1, point2) + point1 = routines.utils.makeVec3(point1) + point2 = routines.utils.makeVec3(point2) + return routines.vec.mag({x = point1.x - point2.x, y = 0, z = point1.z - point2.z}) +end + +-- gets distance in meters between two points (3 dimensional) +function routines.utils.get3DDist(point1, point2) + return routines.vec.mag({x = point1.x - point2.x, y = point1.y - point2.y, z = point1.z - point2.z}) +end + + + +-- From http://lua-users.org/wiki/SimpleRound +-- use negative idp for rounding ahead of decimal place, positive for rounding after decimal place +routines.utils.round = function(num, idp) + local mult = 10^(idp or 0) + return math.floor(num * mult + 0.5) / mult +end + +-- porting in Slmod's dostring +routines.utils.dostring = function(s) + local f, err = loadstring(s) + if f then + return true, f() + else + return false, err + end +end + + +--3D Vector manipulation +routines.vec = {} + +routines.vec.add = function(vec1, vec2) + return {x = vec1.x + vec2.x, y = vec1.y + vec2.y, z = vec1.z + vec2.z} +end + +routines.vec.sub = function(vec1, vec2) + return {x = vec1.x - vec2.x, y = vec1.y - vec2.y, z = vec1.z - vec2.z} +end + +routines.vec.scalarMult = function(vec, mult) + return {x = vec.x*mult, y = vec.y*mult, z = vec.z*mult} +end + +routines.vec.scalar_mult = routines.vec.scalarMult + +routines.vec.dp = function(vec1, vec2) + return vec1.x*vec2.x + vec1.y*vec2.y + vec1.z*vec2.z +end + +routines.vec.cp = function(vec1, vec2) + return { x = vec1.y*vec2.z - vec1.z*vec2.y, y = vec1.z*vec2.x - vec1.x*vec2.z, z = vec1.x*vec2.y - vec1.y*vec2.x} +end + +routines.vec.mag = function(vec) + return (vec.x^2 + vec.y^2 + vec.z^2)^0.5 +end + +routines.vec.getUnitVec = function(vec) + local mag = routines.vec.mag(vec) + return { x = vec.x/mag, y = vec.y/mag, z = vec.z/mag } +end + +routines.vec.rotateVec2 = function(vec2, theta) + return { x = vec2.x*math.cos(theta) - vec2.y*math.sin(theta), y = vec2.x*math.sin(theta) + vec2.y*math.cos(theta)} +end +--------------------------------------------------------------------------------------------------------------------------- + + + + +-- acc- the accuracy of each easting/northing. 0, 1, 2, 3, 4, or 5. +routines.tostringMGRS = function(MGRS, acc) + if acc == 0 then + return MGRS.UTMZone .. ' ' .. MGRS.MGRSDigraph + else + return MGRS.UTMZone .. ' ' .. MGRS.MGRSDigraph .. ' ' .. string.format('%0' .. acc .. 'd', routines.utils.round(MGRS.Easting/(10^(5-acc)), 0)) + .. ' ' .. string.format('%0' .. acc .. 'd', routines.utils.round(MGRS.Northing/(10^(5-acc)), 0)) + end +end + +--[[acc: +in DM: decimal point of minutes. +In DMS: decimal point of seconds. +position after the decimal of the least significant digit: +So: +42.32 - acc of 2. +]] +routines.tostringLL = function(lat, lon, acc, DMS) + + local latHemi, lonHemi + if lat > 0 then + latHemi = 'N' + else + latHemi = 'S' + end + + if lon > 0 then + lonHemi = 'E' + else + lonHemi = 'W' + end + + lat = math.abs(lat) + lon = math.abs(lon) + + local latDeg = math.floor(lat) + local latMin = (lat - latDeg)*60 + + local lonDeg = math.floor(lon) + local lonMin = (lon - lonDeg)*60 + + if DMS then -- degrees, minutes, and seconds. + local oldLatMin = latMin + latMin = math.floor(latMin) + local latSec = routines.utils.round((oldLatMin - latMin)*60, acc) + + local oldLonMin = lonMin + lonMin = math.floor(lonMin) + local lonSec = routines.utils.round((oldLonMin - lonMin)*60, acc) + + if latSec == 60 then + latSec = 0 + latMin = latMin + 1 + end + + if lonSec == 60 then + lonSec = 0 + lonMin = lonMin + 1 + end + + local secFrmtStr -- create the formatting string for the seconds place + if acc <= 0 then -- no decimal place. + secFrmtStr = '%02d' + else + local width = 3 + acc -- 01.310 - that's a width of 6, for example. + secFrmtStr = '%0' .. width .. '.' .. acc .. 'f' + end + + return string.format('%02d', latDeg) .. ' ' .. string.format('%02d', latMin) .. '\' ' .. string.format(secFrmtStr, latSec) .. '"' .. latHemi .. ' ' + .. string.format('%02d', lonDeg) .. ' ' .. string.format('%02d', lonMin) .. '\' ' .. string.format(secFrmtStr, lonSec) .. '"' .. lonHemi + + else -- degrees, decimal minutes. + latMin = routines.utils.round(latMin, acc) + lonMin = routines.utils.round(lonMin, acc) + + if latMin == 60 then + latMin = 0 + latDeg = latDeg + 1 + end + + if lonMin == 60 then + lonMin = 0 + lonDeg = lonDeg + 1 + end + + local minFrmtStr -- create the formatting string for the minutes place + if acc <= 0 then -- no decimal place. + minFrmtStr = '%02d' + else + local width = 3 + acc -- 01.310 - that's a width of 6, for example. + minFrmtStr = '%0' .. width .. '.' .. acc .. 'f' + end + + return string.format('%02d', latDeg) .. ' ' .. string.format(minFrmtStr, latMin) .. '\'' .. latHemi .. ' ' + .. string.format('%02d', lonDeg) .. ' ' .. string.format(minFrmtStr, lonMin) .. '\'' .. lonHemi + + end +end + +--[[ required: az - radian + required: dist - meters + optional: alt - meters (set to false or nil if you don't want to use it). + optional: metric - set true to get dist and alt in km and m. + precision will always be nearest degree and NM or km.]] +routines.tostringBR = function(az, dist, alt, metric) + az = routines.utils.round(routines.utils.toDegree(az), 0) + + if metric then + dist = routines.utils.round(dist/1000, 2) + else + dist = routines.utils.round(routines.utils.metersToNM(dist), 2) + end + + local s = string.format('%03d', az) .. ' for ' .. dist + + if alt then + if metric then + s = s .. ' at ' .. routines.utils.round(alt, 0) + else + s = s .. ' at ' .. routines.utils.round(routines.utils.metersToFeet(alt), 0) + end + end + return s +end + +routines.getNorthCorrection = function(point) --gets the correction needed for true north + if not point.z then --Vec2; convert to Vec3 + point.z = point.y + point.y = 0 + end + local lat, lon = coord.LOtoLL(point) + local north_posit = coord.LLtoLO(lat + 1, lon) + return math.atan2(north_posit.z - point.z, north_posit.x - point.x) +end + + +-- the main area +do + -- THE MAIN FUNCTION -- Accessed 100 times/sec. + routines.main = function() + timer.scheduleFunction(routines.main, {}, timer.getTime() + 2) --reschedule first in case of Lua error + ---------------------------------------------------------------------------------------------------------- + --area to add new stuff in + + routines.do_scheduled_functions() + end -- end of routines.main + + timer.scheduleFunction(routines.main, {}, timer.getTime() + 2) + +end + + +do + local idNum = 0 + + --Simplified event handler + routines.addEventHandler = function(f) --id is optional! + local handler = {} + idNum = idNum + 1 + handler.id = idNum + handler.f = f + handler.onEvent = function(self, event) + self.f(event) + end + world.addEventHandler(handler) + end + + routines.removeEventHandler = function(id) + for key, handler in pairs(world.eventHandlers) do + if handler.id and handler.id == id then + world.eventHandlers[key] = nil + return true + end + end + return false + end +end + +-- need to return a Vec3 or Vec2? +function routines.getRandPointInCircle(point, radius, innerRadius) + local theta = 2*math.pi*math.random() + local rad = math.random() + math.random() + if rad > 1 then + rad = 2 - rad + end + + local radMult + if innerRadius and innerRadius <= radius then + radMult = (radius - innerRadius)*rad + innerRadius + else + radMult = radius*rad + end + + if not point.z then --might as well work with vec2/3 + point.z = point.y + end + + local rndCoord + if radius > 0 then + rndCoord = {x = math.cos(theta)*radMult + point.x, y = math.sin(theta)*radMult + point.z} + else + rndCoord = {x = point.x, y = point.z} + end + return rndCoord +end + +routines.goRoute = function(group, path) + local misTask = { + id = 'Mission', + params = { + route = { + points = routines.utils.deepCopy(path), + }, + }, + } + if type(group) == 'string' then + group = Group.getByName(group) + end + local groupCon = group:getController() + if groupCon then + groupCon:setTask(misTask) + return true + end + + Controller.setTask(groupCon, misTask) + return false +end + + +-- Useful atomic functions from mist, ported. + +routines.ground = {} +routines.fixedWing = {} +routines.heli = {} + +routines.ground.buildWP = function(point, overRideForm, overRideSpeed) + + local wp = {} + wp.x = point.x + + if point.z then + wp.y = point.z + else + wp.y = point.y + end + local form, speed + + if point.speed and not overRideSpeed then + wp.speed = point.speed + elseif type(overRideSpeed) == 'number' then + wp.speed = overRideSpeed + else + wp.speed = routines.utils.kmphToMps(20) + end + + if point.form and not overRideForm then + form = point.form + else + form = overRideForm + end + + if not form then + wp.action = 'Cone' + else + form = string.lower(form) + if form == 'off_road' or form == 'off road' then + wp.action = 'Off Road' + elseif form == 'on_road' or form == 'on road' then + wp.action = 'On Road' + elseif form == 'rank' or form == 'line_abrest' or form == 'line abrest' or form == 'lineabrest'then + wp.action = 'Rank' + elseif form == 'cone' then + wp.action = 'Cone' + elseif form == 'diamond' then + wp.action = 'Diamond' + elseif form == 'vee' then + wp.action = 'Vee' + elseif form == 'echelon_left' or form == 'echelon left' or form == 'echelonl' then + wp.action = 'EchelonL' + elseif form == 'echelon_right' or form == 'echelon right' or form == 'echelonr' then + wp.action = 'EchelonR' + else + wp.action = 'Cone' -- if nothing matched + end + end + + wp.type = 'Turning Point' + + return wp + +end + +routines.fixedWing.buildWP = function(point, WPtype, speed, alt, altType) + + local wp = {} + wp.x = point.x + + if point.z then + wp.y = point.z + else + wp.y = point.y + end + + if alt and type(alt) == 'number' then + wp.alt = alt + else + wp.alt = 2000 + end + + if altType then + altType = string.lower(altType) + if altType == 'radio' or 'agl' then + wp.alt_type = 'RADIO' + elseif altType == 'baro' or 'asl' then + wp.alt_type = 'BARO' + end + else + wp.alt_type = 'RADIO' + end + + if point.speed then + speed = point.speed + end + + if point.type then + WPtype = point.type + end + + if not speed then + wp.speed = routines.utils.kmphToMps(500) + else + wp.speed = speed + end + + if not WPtype then + wp.action = 'Turning Point' + else + WPtype = string.lower(WPtype) + if WPtype == 'flyover' or WPtype == 'fly over' or WPtype == 'fly_over' then + wp.action = 'Fly Over Point' + elseif WPtype == 'turningpoint' or WPtype == 'turning point' or WPtype == 'turning_point' then + wp.action = 'Turning Point' + else + wp.action = 'Turning Point' + end + end + + wp.type = 'Turning Point' + return wp +end + +routines.heli.buildWP = function(point, WPtype, speed, alt, altType) + + local wp = {} + wp.x = point.x + + if point.z then + wp.y = point.z + else + wp.y = point.y + end + + if alt and type(alt) == 'number' then + wp.alt = alt + else + wp.alt = 500 + end + + if altType then + altType = string.lower(altType) + if altType == 'radio' or 'agl' then + wp.alt_type = 'RADIO' + elseif altType == 'baro' or 'asl' then + wp.alt_type = 'BARO' + end + else + wp.alt_type = 'RADIO' + end + + if point.speed then + speed = point.speed + end + + if point.type then + WPtype = point.type + end + + if not speed then + wp.speed = routines.utils.kmphToMps(200) + else + wp.speed = speed + end + + if not WPtype then + wp.action = 'Turning Point' + else + WPtype = string.lower(WPtype) + if WPtype == 'flyover' or WPtype == 'fly over' or WPtype == 'fly_over' then + wp.action = 'Fly Over Point' + elseif WPtype == 'turningpoint' or WPtype == 'turning point' or WPtype == 'turning_point' then + wp.action = 'Turning Point' + else + wp.action = 'Turning Point' + end + end + + wp.type = 'Turning Point' + return wp +end + +routines.groupToRandomPoint = function(vars) + local group = vars.group --Required + local point = vars.point --required + local radius = vars.radius or 0 + local innerRadius = vars.innerRadius + local form = vars.form or 'Cone' + local heading = vars.heading or math.random()*2*math.pi + local headingDegrees = vars.headingDegrees + local speed = vars.speed or routines.utils.kmphToMps(20) + + + local useRoads + if not vars.disableRoads then + useRoads = true + else + useRoads = false + end + + local path = {} + + if headingDegrees then + heading = headingDegrees*math.pi/180 + end + + if heading >= 2*math.pi then + heading = heading - 2*math.pi + end + + local rndCoord = routines.getRandPointInCircle(point, radius, innerRadius) + + local offset = {} + local posStart = routines.getLeadPos(group) + + offset.x = routines.utils.round(math.sin(heading - (math.pi/2)) * 50 + rndCoord.x, 3) + offset.z = routines.utils.round(math.cos(heading + (math.pi/2)) * 50 + rndCoord.y, 3) + path[#path + 1] = routines.ground.buildWP(posStart, form, speed) + + + if useRoads == true and ((point.x - posStart.x)^2 + (point.z - posStart.z)^2)^0.5 > radius * 1.3 then + path[#path + 1] = routines.ground.buildWP({['x'] = posStart.x + 11, ['z'] = posStart.z + 11}, 'off_road', speed) + path[#path + 1] = routines.ground.buildWP(posStart, 'on_road', speed) + path[#path + 1] = routines.ground.buildWP(offset, 'on_road', speed) + else + path[#path + 1] = routines.ground.buildWP({['x'] = posStart.x + 25, ['z'] = posStart.z + 25}, form, speed) + end + + path[#path + 1] = routines.ground.buildWP(offset, form, speed) + path[#path + 1] = routines.ground.buildWP(rndCoord, form, speed) + + routines.goRoute(group, path) + + return +end + +routines.groupRandomDistSelf = function(gpData, dist, form, heading, speed) + local pos = routines.getLeadPos(gpData) + local fakeZone = {} + fakeZone.radius = dist or math.random(300, 1000) + fakeZone.point = {x = pos.x, y, pos.y, z = pos.z} + routines.groupToRandomZone(gpData, fakeZone, form, heading, speed) + + return +end + +routines.groupToRandomZone = function(gpData, zone, form, heading, speed) + if type(gpData) == 'string' then + gpData = Group.getByName(gpData) + end + + if type(zone) == 'string' then + zone = trigger.misc.getZone(zone) + elseif type(zone) == 'table' and not zone.radius then + zone = trigger.misc.getZone(zone[math.random(1, #zone)]) + end + + if speed then + speed = routines.utils.kmphToMps(speed) + end + + local vars = {} + vars.group = gpData + vars.radius = zone.radius + vars.form = form + vars.headingDegrees = heading + vars.speed = speed + vars.point = routines.utils.zoneToVec3(zone) + + routines.groupToRandomPoint(vars) + + return +end + +routines.isTerrainValid = function(coord, terrainTypes) -- vec2/3 and enum or table of acceptable terrain types + if coord.z then + coord.y = coord.z + end + local typeConverted = {} + + if type(terrainTypes) == 'string' then -- if its a string it does this check + for constId, constData in pairs(land.SurfaceType) do + if string.lower(constId) == string.lower(terrainTypes) or string.lower(constData) == string.lower(terrainTypes) then + table.insert(typeConverted, constId) + end + end + elseif type(terrainTypes) == 'table' then -- if its a table it does this check + for typeId, typeData in pairs(terrainTypes) do + for constId, constData in pairs(land.SurfaceType) do + if string.lower(constId) == string.lower(typeData) or string.lower(constData) == string.lower(typeId) then + table.insert(typeConverted, constId) + end + end + end + end + for validIndex, validData in pairs(typeConverted) do + if land.getSurfaceType(coord) == land.SurfaceType[validData] then + return true + end + end + return false +end + +routines.groupToPoint = function(gpData, point, form, heading, speed, useRoads) + if type(point) == 'string' then + point = trigger.misc.getZone(point) + end + if speed then + speed = routines.utils.kmphToMps(speed) + end + + local vars = {} + vars.group = gpData + vars.form = form + vars.headingDegrees = heading + vars.speed = speed + vars.disableRoads = useRoads + vars.point = routines.utils.zoneToVec3(point) + routines.groupToRandomPoint(vars) + + return +end + + +routines.getLeadPos = function(group) + if type(group) == 'string' then -- group name + group = Group.getByName(group) + end + + local units = group:getUnits() + + local leader = units[1] + if not leader then -- SHOULD be good, but if there is a bug, this code future-proofs it then. + local lowestInd = math.huge + for ind, unit in pairs(units) do + if ind < lowestInd then + lowestInd = ind + leader = unit + end + end + end + if leader and Unit.isExist(leader) then -- maybe a little too paranoid now... + return leader:getPosition().p + end +end + +--[[ vars for routines.getMGRSString: +vars.units - table of unit names (NOT unitNameTable- maybe this should change). +vars.acc - integer between 0 and 5, inclusive +]] +routines.getMGRSString = function(vars) + local units = vars.units + local acc = vars.acc or 5 + local avgPos = routines.getAvgPos(units) + if avgPos then + return routines.tostringMGRS(coord.LLtoMGRS(coord.LOtoLL(avgPos)), acc) + end +end + +--[[ vars for routines.getLLString +vars.units - table of unit names (NOT unitNameTable- maybe this should change). +vars.acc - integer, number of numbers after decimal place +vars.DMS - if true, output in degrees, minutes, seconds. Otherwise, output in degrees, minutes. + + +]] +routines.getLLString = function(vars) + local units = vars.units + local acc = vars.acc or 3 + local DMS = vars.DMS + local avgPos = routines.getAvgPos(units) + if avgPos then + local lat, lon = coord.LOtoLL(avgPos) + return routines.tostringLL(lat, lon, acc, DMS) + end +end + +--[[ +vars.zone - table of a zone name. +vars.ref - vec3 ref point, maybe overload for vec2 as well? +vars.alt - boolean, if used, includes altitude in string +vars.metric - boolean, gives distance in km instead of NM. +]] +routines.getBRStringZone = function(vars) + local zone = trigger.misc.getZone( vars.zone ) + local ref = routines.utils.makeVec3(vars.ref, 0) -- turn it into Vec3 if it is not already. + local alt = vars.alt + local metric = vars.metric + if zone then + local vec = {x = zone.point.x - ref.x, y = zone.point.y - ref.y, z = zone.point.z - ref.z} + local dir = routines.utils.getDir(vec, ref) + local dist = routines.utils.get2DDist(zone.point, ref) + if alt then + alt = zone.y + end + return routines.tostringBR(dir, dist, alt, metric) + else + env.info( 'routines.getBRStringZone: error: zone is nil' ) + end +end + +--[[ +vars.units- table of unit names (NOT unitNameTable- maybe this should change). +vars.ref - vec3 ref point, maybe overload for vec2 as well? +vars.alt - boolean, if used, includes altitude in string +vars.metric - boolean, gives distance in km instead of NM. +]] +routines.getBRString = function(vars) + local units = vars.units + local ref = routines.utils.makeVec3(vars.ref, 0) -- turn it into Vec3 if it is not already. + local alt = vars.alt + local metric = vars.metric + local avgPos = routines.getAvgPos(units) + if avgPos then + local vec = {x = avgPos.x - ref.x, y = avgPos.y - ref.y, z = avgPos.z - ref.z} + local dir = routines.utils.getDir(vec, ref) + local dist = routines.utils.get2DDist(avgPos, ref) + if alt then + alt = avgPos.y + end + return routines.tostringBR(dir, dist, alt, metric) + end +end + + +-- Returns the Vec3 coordinates of the average position of the concentration of units most in the heading direction. +--[[ vars for routines.getLeadingPos: +vars.units - table of unit names +vars.heading - direction +vars.radius - number +vars.headingDegrees - boolean, switches heading to degrees +]] +routines.getLeadingPos = function(vars) + local units = vars.units + local heading = vars.heading + local radius = vars.radius + if vars.headingDegrees then + heading = routines.utils.toRadian(vars.headingDegrees) + end + + local unitPosTbl = {} + for i = 1, #units do + local unit = Unit.getByName(units[i]) + if unit and unit:isExist() then + unitPosTbl[#unitPosTbl + 1] = unit:getPosition().p + end + end + if #unitPosTbl > 0 then -- one more more units found. + -- first, find the unit most in the heading direction + local maxPos = -math.huge + + local maxPosInd -- maxPos - the furthest in direction defined by heading; maxPosInd = + for i = 1, #unitPosTbl do + local rotatedVec2 = routines.vec.rotateVec2(routines.utils.makeVec2(unitPosTbl[i]), heading) + if (not maxPos) or maxPos < rotatedVec2.x then + maxPos = rotatedVec2.x + maxPosInd = i + end + end + + --now, get all the units around this unit... + local avgPos + if radius then + local maxUnitPos = unitPosTbl[maxPosInd] + local avgx, avgy, avgz, totNum = 0, 0, 0, 0 + for i = 1, #unitPosTbl do + if routines.utils.get2DDist(maxUnitPos, unitPosTbl[i]) <= radius then + avgx = avgx + unitPosTbl[i].x + avgy = avgy + unitPosTbl[i].y + avgz = avgz + unitPosTbl[i].z + totNum = totNum + 1 + end + end + avgPos = { x = avgx/totNum, y = avgy/totNum, z = avgz/totNum} + else + avgPos = unitPosTbl[maxPosInd] + end + + return avgPos + end +end + + +--[[ vars for routines.getLeadingMGRSString: +vars.units - table of unit names +vars.heading - direction +vars.radius - number +vars.headingDegrees - boolean, switches heading to degrees +vars.acc - number, 0 to 5. +]] +routines.getLeadingMGRSString = function(vars) + local pos = routines.getLeadingPos(vars) + if pos then + local acc = vars.acc or 5 + return routines.tostringMGRS(coord.LLtoMGRS(coord.LOtoLL(pos)), acc) + end +end + +--[[ vars for routines.getLeadingLLString: +vars.units - table of unit names +vars.heading - direction, number +vars.radius - number +vars.headingDegrees - boolean, switches heading to degrees +vars.acc - number of digits after decimal point (can be negative) +vars.DMS - boolean, true if you want DMS. +]] +routines.getLeadingLLString = function(vars) + local pos = routines.getLeadingPos(vars) + if pos then + local acc = vars.acc or 3 + local DMS = vars.DMS + local lat, lon = coord.LOtoLL(pos) + return routines.tostringLL(lat, lon, acc, DMS) + end +end + + + +--[[ vars for routines.getLeadingBRString: +vars.units - table of unit names +vars.heading - direction, number +vars.radius - number +vars.headingDegrees - boolean, switches heading to degrees +vars.metric - boolean, if true, use km instead of NM. +vars.alt - boolean, if true, include altitude. +vars.ref - vec3/vec2 reference point. +]] +routines.getLeadingBRString = function(vars) + local pos = routines.getLeadingPos(vars) + if pos then + local ref = vars.ref + local alt = vars.alt + local metric = vars.metric + + local vec = {x = pos.x - ref.x, y = pos.y - ref.y, z = pos.z - ref.z} + local dir = routines.utils.getDir(vec, ref) + local dist = routines.utils.get2DDist(pos, ref) + if alt then + alt = pos.y + end + return routines.tostringBR(dir, dist, alt, metric) + end +end + +--[[ vars for routines.message.add + vars.text = 'Hello World' + vars.displayTime = 20 + vars.msgFor = {coa = {'red'}, countries = {'Ukraine', 'Georgia'}, unitTypes = {'A-10C'}} + +]] + +--[[ vars for routines.msgMGRS +vars.units - table of unit names (NOT unitNameTable- maybe this should change). +vars.acc - integer between 0 and 5, inclusive +vars.text - text in the message +vars.displayTime - self explanatory +vars.msgFor - scope +]] +routines.msgMGRS = function(vars) + local units = vars.units + local acc = vars.acc + local text = vars.text + local displayTime = vars.displayTime + local msgFor = vars.msgFor + + local s = routines.getMGRSString{units = units, acc = acc} + local newText + if string.find(text, '%%s') then -- look for %s + newText = string.format(text, s) -- insert the coordinates into the message + else -- else, just append to the end. + newText = text .. s + end + + routines.message.add{ + text = newText, + displayTime = displayTime, + msgFor = msgFor + } +end + +--[[ vars for routines.msgLL +vars.units - table of unit names (NOT unitNameTable- maybe this should change) (Yes). +vars.acc - integer, number of numbers after decimal place +vars.DMS - if true, output in degrees, minutes, seconds. Otherwise, output in degrees, minutes. +vars.text - text in the message +vars.displayTime - self explanatory +vars.msgFor - scope +]] +routines.msgLL = function(vars) + local units = vars.units -- technically, I don't really need to do this, but it helps readability. + local acc = vars.acc + local DMS = vars.DMS + local text = vars.text + local displayTime = vars.displayTime + local msgFor = vars.msgFor + + local s = routines.getLLString{units = units, acc = acc, DMS = DMS} + local newText + if string.find(text, '%%s') then -- look for %s + newText = string.format(text, s) -- insert the coordinates into the message + else -- else, just append to the end. + newText = text .. s + end + + routines.message.add{ + text = newText, + displayTime = displayTime, + msgFor = msgFor + } + +end + + +--[[ +vars.units- table of unit names (NOT unitNameTable- maybe this should change). +vars.ref - vec3 ref point, maybe overload for vec2 as well? +vars.alt - boolean, if used, includes altitude in string +vars.metric - boolean, gives distance in km instead of NM. +vars.text - text of the message +vars.displayTime +vars.msgFor - scope +]] +routines.msgBR = function(vars) + local units = vars.units -- technically, I don't really need to do this, but it helps readability. + local ref = vars.ref -- vec2/vec3 will be handled in routines.getBRString + local alt = vars.alt + local metric = vars.metric + local text = vars.text + local displayTime = vars.displayTime + local msgFor = vars.msgFor + + local s = routines.getBRString{units = units, ref = ref, alt = alt, metric = metric} + local newText + if string.find(text, '%%s') then -- look for %s + newText = string.format(text, s) -- insert the coordinates into the message + else -- else, just append to the end. + newText = text .. s + end + + routines.message.add{ + text = newText, + displayTime = displayTime, + msgFor = msgFor + } + +end + + +-------------------------------------------------------------------------------------------- +-- basically, just sub-types of routines.msgBR... saves folks the work of getting the ref point. +--[[ +vars.units- table of unit names (NOT unitNameTable- maybe this should change). +vars.ref - string red, blue +vars.alt - boolean, if used, includes altitude in string +vars.metric - boolean, gives distance in km instead of NM. +vars.text - text of the message +vars.displayTime +vars.msgFor - scope +]] +routines.msgBullseye = function(vars) + if string.lower(vars.ref) == 'red' then + vars.ref = routines.DBs.missionData.bullseye.red + routines.msgBR(vars) + elseif string.lower(vars.ref) == 'blue' then + vars.ref = routines.DBs.missionData.bullseye.blue + routines.msgBR(vars) + end +end + +--[[ +vars.units- table of unit names (NOT unitNameTable- maybe this should change). +vars.ref - unit name of reference point +vars.alt - boolean, if used, includes altitude in string +vars.metric - boolean, gives distance in km instead of NM. +vars.text - text of the message +vars.displayTime +vars.msgFor - scope +]] + +routines.msgBRA = function(vars) + if Unit.getByName(vars.ref) then + vars.ref = Unit.getByName(vars.ref):getPosition().p + if not vars.alt then + vars.alt = true + end + routines.msgBR(vars) + end +end +-------------------------------------------------------------------------------------------- + +--[[ vars for routines.msgLeadingMGRS: +vars.units - table of unit names +vars.heading - direction +vars.radius - number +vars.headingDegrees - boolean, switches heading to degrees (optional) +vars.acc - number, 0 to 5. +vars.text - text of the message +vars.displayTime +vars.msgFor - scope +]] +routines.msgLeadingMGRS = function(vars) + local units = vars.units -- technically, I don't really need to do this, but it helps readability. + local heading = vars.heading + local radius = vars.radius + local headingDegrees = vars.headingDegrees + local acc = vars.acc + local text = vars.text + local displayTime = vars.displayTime + local msgFor = vars.msgFor + + local s = routines.getLeadingMGRSString{units = units, heading = heading, radius = radius, headingDegrees = headingDegrees, acc = acc} + local newText + if string.find(text, '%%s') then -- look for %s + newText = string.format(text, s) -- insert the coordinates into the message + else -- else, just append to the end. + newText = text .. s + end + + routines.message.add{ + text = newText, + displayTime = displayTime, + msgFor = msgFor + } + + +end +--[[ vars for routines.msgLeadingLL: +vars.units - table of unit names +vars.heading - direction, number +vars.radius - number +vars.headingDegrees - boolean, switches heading to degrees (optional) +vars.acc - number of digits after decimal point (can be negative) +vars.DMS - boolean, true if you want DMS. (optional) +vars.text - text of the message +vars.displayTime +vars.msgFor - scope +]] +routines.msgLeadingLL = function(vars) + local units = vars.units -- technically, I don't really need to do this, but it helps readability. + local heading = vars.heading + local radius = vars.radius + local headingDegrees = vars.headingDegrees + local acc = vars.acc + local DMS = vars.DMS + local text = vars.text + local displayTime = vars.displayTime + local msgFor = vars.msgFor + + local s = routines.getLeadingLLString{units = units, heading = heading, radius = radius, headingDegrees = headingDegrees, acc = acc, DMS = DMS} + local newText + if string.find(text, '%%s') then -- look for %s + newText = string.format(text, s) -- insert the coordinates into the message + else -- else, just append to the end. + newText = text .. s + end + + routines.message.add{ + text = newText, + displayTime = displayTime, + msgFor = msgFor + } + +end + +--[[ +vars.units - table of unit names +vars.heading - direction, number +vars.radius - number +vars.headingDegrees - boolean, switches heading to degrees (optional) +vars.metric - boolean, if true, use km instead of NM. (optional) +vars.alt - boolean, if true, include altitude. (optional) +vars.ref - vec3/vec2 reference point. +vars.text - text of the message +vars.displayTime +vars.msgFor - scope +]] +routines.msgLeadingBR = function(vars) + local units = vars.units -- technically, I don't really need to do this, but it helps readability. + local heading = vars.heading + local radius = vars.radius + local headingDegrees = vars.headingDegrees + local metric = vars.metric + local alt = vars.alt + local ref = vars.ref -- vec2/vec3 will be handled in routines.getBRString + local text = vars.text + local displayTime = vars.displayTime + local msgFor = vars.msgFor + + local s = routines.getLeadingBRString{units = units, heading = heading, radius = radius, headingDegrees = headingDegrees, metric = metric, alt = alt, ref = ref} + local newText + if string.find(text, '%%s') then -- look for %s + newText = string.format(text, s) -- insert the coordinates into the message + else -- else, just append to the end. + newText = text .. s + end + + routines.message.add{ + text = newText, + displayTime = displayTime, + msgFor = msgFor + } +end + + +function spairs(t, order) + -- collect the keys + local keys = {} + for k in pairs(t) do keys[#keys+1] = k end + + -- if order function given, sort by it by passing the table and keys a, b, + -- otherwise just sort the keys + if order then + table.sort(keys, function(a,b) return order(t, a, b) end) + else + table.sort(keys) + end + + -- return the iterator function + local i = 0 + return function() + i = i + 1 + if keys[i] then + return keys[i], t[keys[i]] + end + end +end + + +function routines.IsPartOfGroupInZones( CargoGroup, LandingZones ) +--trace.f() + + local CurrentZoneID = nil + + if CargoGroup then + local CargoUnits = CargoGroup:getUnits() + for CargoUnitID, CargoUnit in pairs( CargoUnits ) do + if CargoUnit and CargoUnit:getLife() >= 1.0 then + CurrentZoneID = routines.IsUnitInZones( CargoUnit, LandingZones ) + if CurrentZoneID then + break + end + end + end + end + +--trace.r( "", "", { CurrentZoneID } ) + return CurrentZoneID +end + + + +function routines.IsUnitInZones( TransportUnit, LandingZones ) +--trace.f("", "routines.IsUnitInZones" ) + + local TransportZoneResult = nil + local TransportZonePos = nil + local TransportZone = nil + + -- fill-up some local variables to support further calculations to determine location of units within the zone. + if TransportUnit then + local TransportUnitPos = TransportUnit:getPosition().p + if type( LandingZones ) == "table" then + for LandingZoneID, LandingZoneName in pairs( LandingZones ) do + TransportZone = trigger.misc.getZone( LandingZoneName ) + if TransportZone then + TransportZonePos = {radius = TransportZone.radius, x = TransportZone.point.x, y = TransportZone.point.y, z = TransportZone.point.z} + if ((( TransportUnitPos.x - TransportZonePos.x)^2 + (TransportUnitPos.z - TransportZonePos.z)^2)^0.5 <= TransportZonePos.radius) then + TransportZoneResult = LandingZoneID + break + end + end + end + else + TransportZone = trigger.misc.getZone( LandingZones ) + TransportZonePos = {radius = TransportZone.radius, x = TransportZone.point.x, y = TransportZone.point.y, z = TransportZone.point.z} + if ((( TransportUnitPos.x - TransportZonePos.x)^2 + (TransportUnitPos.z - TransportZonePos.z)^2)^0.5 <= TransportZonePos.radius) then + TransportZoneResult = 1 + end + end + if TransportZoneResult then + --trace.i( "routines", "TransportZone:" .. TransportZoneResult ) + else + --trace.i( "routines", "TransportZone:nil logic" ) + end + return TransportZoneResult + else + --trace.i( "routines", "TransportZone:nil hard" ) + return nil + end +end + +function routines.IsUnitNearZonesRadius( TransportUnit, LandingZones, ZoneRadius ) +--trace.f("", "routines.IsUnitInZones" ) + + local TransportZoneResult = nil + local TransportZonePos = nil + local TransportZone = nil + + -- fill-up some local variables to support further calculations to determine location of units within the zone. + if TransportUnit then + local TransportUnitPos = TransportUnit:getPosition().p + if type( LandingZones ) == "table" then + for LandingZoneID, LandingZoneName in pairs( LandingZones ) do + TransportZone = trigger.misc.getZone( LandingZoneName ) + if TransportZone then + TransportZonePos = {radius = TransportZone.radius, x = TransportZone.point.x, y = TransportZone.point.y, z = TransportZone.point.z} + if ((( TransportUnitPos.x - TransportZonePos.x)^2 + (TransportUnitPos.z - TransportZonePos.z)^2)^0.5 <= ZoneRadius ) then + TransportZoneResult = LandingZoneID + break + end + end + end + else + TransportZone = trigger.misc.getZone( LandingZones ) + TransportZonePos = {radius = TransportZone.radius, x = TransportZone.point.x, y = TransportZone.point.y, z = TransportZone.point.z} + if ((( TransportUnitPos.x - TransportZonePos.x)^2 + (TransportUnitPos.z - TransportZonePos.z)^2)^0.5 <= ZoneRadius ) then + TransportZoneResult = 1 + end + end + if TransportZoneResult then + --trace.i( "routines", "TransportZone:" .. TransportZoneResult ) + else + --trace.i( "routines", "TransportZone:nil logic" ) + end + return TransportZoneResult + else + --trace.i( "routines", "TransportZone:nil hard" ) + return nil + end +end + + +function routines.IsStaticInZones( TransportStatic, LandingZones ) +--trace.f() + + local TransportZoneResult = nil + local TransportZonePos = nil + local TransportZone = nil + + -- fill-up some local variables to support further calculations to determine location of units within the zone. + local TransportStaticPos = TransportStatic:getPosition().p + if type( LandingZones ) == "table" then + for LandingZoneID, LandingZoneName in pairs( LandingZones ) do + TransportZone = trigger.misc.getZone( LandingZoneName ) + if TransportZone then + TransportZonePos = {radius = TransportZone.radius, x = TransportZone.point.x, y = TransportZone.point.y, z = TransportZone.point.z} + if ((( TransportStaticPos.x - TransportZonePos.x)^2 + (TransportStaticPos.z - TransportZonePos.z)^2)^0.5 <= TransportZonePos.radius) then + TransportZoneResult = LandingZoneID + break + end + end + end + else + TransportZone = trigger.misc.getZone( LandingZones ) + TransportZonePos = {radius = TransportZone.radius, x = TransportZone.point.x, y = TransportZone.point.y, z = TransportZone.point.z} + if ((( TransportStaticPos.x - TransportZonePos.x)^2 + (TransportStaticPos.z - TransportZonePos.z)^2)^0.5 <= TransportZonePos.radius) then + TransportZoneResult = 1 + end + end + +--trace.r( "", "", { TransportZoneResult } ) + return TransportZoneResult +end + + +function routines.IsUnitInRadius( CargoUnit, ReferencePosition, Radius ) +--trace.f() + + local Valid = true + + -- fill-up some local variables to support further calculations to determine location of units within the zone. + local CargoPos = CargoUnit:getPosition().p + local ReferenceP = ReferencePosition.p + + if (((CargoPos.x - ReferenceP.x)^2 + (CargoPos.z - ReferenceP.z)^2)^0.5 <= Radius) then + else + Valid = false + end + + return Valid +end + +function routines.IsPartOfGroupInRadius( CargoGroup, ReferencePosition, Radius ) +--trace.f() + + local Valid = true + + Valid = routines.ValidateGroup( CargoGroup, "CargoGroup", Valid ) + + -- fill-up some local variables to support further calculations to determine location of units within the zone + local CargoUnits = CargoGroup:getUnits() + for CargoUnitId, CargoUnit in pairs( CargoUnits ) do + local CargoUnitPos = CargoUnit:getPosition().p +-- env.info( 'routines.IsPartOfGroupInRadius: CargoUnitPos.x = ' .. CargoUnitPos.x .. ' CargoUnitPos.z = ' .. CargoUnitPos.z ) + local ReferenceP = ReferencePosition.p +-- env.info( 'routines.IsPartOfGroupInRadius: ReferenceGroupPos.x = ' .. ReferenceGroupPos.x .. ' ReferenceGroupPos.z = ' .. ReferenceGroupPos.z ) + + if ((( CargoUnitPos.x - ReferenceP.x)^2 + (CargoUnitPos.z - ReferenceP.z)^2)^0.5 <= Radius) then + else + Valid = false + break + end + end + + return Valid +end + + +function routines.ValidateString( Variable, VariableName, Valid ) +--trace.f() + + if type( Variable ) == "string" then + if Variable == "" then + error( "routines.ValidateString: error: " .. VariableName .. " must be filled out!" ) + Valid = false + end + else + error( "routines.ValidateString: error: " .. VariableName .. " is not a string." ) + Valid = false + end + +--trace.r( "", "", { Valid } ) + return Valid +end + +function routines.ValidateNumber( Variable, VariableName, Valid ) +--trace.f() + + if type( Variable ) == "number" then + else + error( "routines.ValidateNumber: error: " .. VariableName .. " is not a number." ) + Valid = false + end + +--trace.r( "", "", { Valid } ) + return Valid + +end + +function routines.ValidateGroup( Variable, VariableName, Valid ) +--trace.f() + + if Variable == nil then + error( "routines.ValidateGroup: error: " .. VariableName .. " is a nil value!" ) + Valid = false + end + +--trace.r( "", "", { Valid } ) + return Valid +end + +function routines.ValidateZone( LandingZones, VariableName, Valid ) +--trace.f() + + if LandingZones == nil then + error( "routines.ValidateGroup: error: " .. VariableName .. " is a nil value!" ) + Valid = false + end + + if type( LandingZones ) == "table" then + for LandingZoneID, LandingZoneName in pairs( LandingZones ) do + if trigger.misc.getZone( LandingZoneName ) == nil then + error( "routines.ValidateGroup: error: Zone " .. LandingZoneName .. " does not exist!" ) + Valid = false + break + end + end + else + if trigger.misc.getZone( LandingZones ) == nil then + error( "routines.ValidateGroup: error: Zone " .. LandingZones .. " does not exist!" ) + Valid = false + end + end + +--trace.r( "", "", { Valid } ) + return Valid +end + +function routines.ValidateEnumeration( Variable, VariableName, Enum, Valid ) +--trace.f() + + local ValidVariable = false + + for EnumId, EnumData in pairs( Enum ) do + if Variable == EnumData then + ValidVariable = true + break + end + end + + if ValidVariable then + else + error( 'TransportValidateEnum: " .. VariableName .. " is not a valid type.' .. Variable ) + Valid = false + end + +--trace.r( "", "", { Valid } ) + return Valid +end + +function routines.getGroupRoute(groupIdent, task) -- same as getGroupPoints but returns speed and formation type along with vec2 of point} + -- refactor to search by groupId and allow groupId and groupName as inputs + local gpId = groupIdent + if type(groupIdent) == 'string' and not tonumber(groupIdent) then + gpId = _DATABASE.Templates.Groups[groupIdent].groupId + end + + for coa_name, coa_data in pairs(env.mission.coalition) do + if (coa_name == 'red' or coa_name == 'blue') and type(coa_data) == 'table' then + if coa_data.country then --there is a country table + for cntry_id, cntry_data in pairs(coa_data.country) do + for obj_type_name, obj_type_data in pairs(cntry_data) do + if obj_type_name == "helicopter" or obj_type_name == "ship" or obj_type_name == "plane" or obj_type_name == "vehicle" then -- only these types have points + if ((type(obj_type_data) == 'table') and obj_type_data.group and (type(obj_type_data.group) == 'table') and (#obj_type_data.group > 0)) then --there's a group! + for group_num, group_data in pairs(obj_type_data.group) do + if group_data and group_data.groupId == gpId then -- this is the group we are looking for + if group_data.route and group_data.route.points and #group_data.route.points > 0 then + local points = {} + + for point_num, point in pairs(group_data.route.points) do + local routeData = {} + if not point.point then + routeData.x = point.x + routeData.y = point.y + else + routeData.point = point.point --it's possible that the ME could move to the point = Vec2 notation. + end + routeData.form = point.action + routeData.speed = point.speed + routeData.alt = point.alt + routeData.alt_type = point.alt_type + routeData.airdromeId = point.airdromeId + routeData.helipadId = point.helipadId + routeData.type = point.type + routeData.action = point.action + if task then + routeData.task = point.task + end + points[point_num] = routeData + end + + return points + end + return + end --if group_data and group_data.name and group_data.name == 'groupname' + end --for group_num, group_data in pairs(obj_type_data.group) do + end --if ((type(obj_type_data) == 'table') and obj_type_data.group and (type(obj_type_data.group) == 'table') and (#obj_type_data.group > 0)) then + end --if obj_type_name == "helicopter" or obj_type_name == "ship" or obj_type_name == "plane" or obj_type_name == "vehicle" or obj_type_name == "static" then + end --for obj_type_name, obj_type_data in pairs(cntry_data) do + end --for cntry_id, cntry_data in pairs(coa_data.country) do + end --if coa_data.country then --there is a country table + end --if coa_name == 'red' or coa_name == 'blue' and type(coa_data) == 'table' then + end --for coa_name, coa_data in pairs(mission.coalition) do +end + +routines.ground.patrolRoute = function(vars) + + + local tempRoute = {} + local useRoute = {} + local gpData = vars.gpData + if type(gpData) == 'string' then + gpData = Group.getByName(gpData) + end + + local useGroupRoute + if not vars.useGroupRoute then + useGroupRoute = vars.gpData + else + useGroupRoute = vars.useGroupRoute + end + local routeProvided = false + if not vars.route then + if useGroupRoute then + tempRoute = routines.getGroupRoute(useGroupRoute) + end + else + useRoute = vars.route + local posStart = routines.getLeadPos(gpData) + useRoute[1] = routines.ground.buildWP(posStart, useRoute[1].action, useRoute[1].speed) + routeProvided = true + end + + + local overRideSpeed = vars.speed or 'default' + local pType = vars.pType + local offRoadForm = vars.offRoadForm or 'default' + local onRoadForm = vars.onRoadForm or 'default' + + if routeProvided == false and #tempRoute > 0 then + local posStart = routines.getLeadPos(gpData) + + + useRoute[#useRoute + 1] = routines.ground.buildWP(posStart, offRoadForm, overRideSpeed) + for i = 1, #tempRoute do + local tempForm = tempRoute[i].action + local tempSpeed = tempRoute[i].speed + + if offRoadForm == 'default' then + tempForm = tempRoute[i].action + end + if onRoadForm == 'default' then + onRoadForm = 'On Road' + end + if (string.lower(tempRoute[i].action) == 'on road' or string.lower(tempRoute[i].action) == 'onroad' or string.lower(tempRoute[i].action) == 'on_road') then + tempForm = onRoadForm + else + tempForm = offRoadForm + end + + if type(overRideSpeed) == 'number' then + tempSpeed = overRideSpeed + end + + + useRoute[#useRoute + 1] = routines.ground.buildWP(tempRoute[i], tempForm, tempSpeed) + end + + if pType and string.lower(pType) == 'doubleback' then + local curRoute = routines.utils.deepCopy(useRoute) + for i = #curRoute, 2, -1 do + useRoute[#useRoute + 1] = routines.ground.buildWP(curRoute[i], curRoute[i].action, curRoute[i].speed) + end + end + + useRoute[1].action = useRoute[#useRoute].action -- make it so the first WP matches the last WP + end + + local cTask3 = {} + local newPatrol = {} + newPatrol.route = useRoute + newPatrol.gpData = gpData:getName() + cTask3[#cTask3 + 1] = 'routines.ground.patrolRoute(' + cTask3[#cTask3 + 1] = routines.utils.oneLineSerialize(newPatrol) + cTask3[#cTask3 + 1] = ')' + cTask3 = table.concat(cTask3) + local tempTask = { + id = 'WrappedAction', + params = { + action = { + id = 'Script', + params = { + command = cTask3, + + }, + }, + }, + } + + + useRoute[#useRoute].task = tempTask + routines.goRoute(gpData, useRoute) + + return +end + +routines.ground.patrol = function(gpData, pType, form, speed) + local vars = {} + + if type(gpData) == 'table' and gpData:getName() then + gpData = gpData:getName() + end + + vars.useGroupRoute = gpData + vars.gpData = gpData + vars.pType = pType + vars.offRoadForm = form + vars.speed = speed + + routines.ground.patrolRoute(vars) + + return +end + +function routines.GetUnitHeight( CheckUnit ) +--trace.f( "routines" ) + + local UnitPoint = CheckUnit:getPoint() + local UnitPosition = { x = UnitPoint.x, y = UnitPoint.z } + local UnitHeight = UnitPoint.y + + local LandHeight = land.getHeight( UnitPosition ) + + --env.info(( 'CarrierHeight: LandHeight = ' .. LandHeight .. ' CarrierHeight = ' .. CarrierHeight )) + + --trace.f( "routines", "Unit Height = " .. UnitHeight - LandHeight ) + + return UnitHeight - LandHeight + +end + + + +Su34Status = { status = {} } +boardMsgRed = { statusMsg = "" } +boardMsgAll = { timeMsg = "" } +SpawnSettings = {} +Su34MenuPath = {} +Su34Menus = 0 + + +function Su34AttackCarlVinson(groupName) +--trace.menu("", "Su34AttackCarlVinson") + local groupSu34 = Group.getByName( groupName ) + local controllerSu34 = groupSu34.getController(groupSu34) + local groupCarlVinson = Group.getByName("US Carl Vinson #001") + controllerSu34.setOption( controllerSu34, AI.Option.Air.id.ROE, AI.Option.Air.val.ROE.OPEN_FIRE ) + controllerSu34.setOption( controllerSu34, AI.Option.Air.id.REACTION_ON_THREAT, AI.Option.Air.val.REACTION_ON_THREAT.EVADE_FIRE ) + if groupCarlVinson ~= nil then + controllerSu34.pushTask(controllerSu34,{id = 'AttackGroup', params = { groupId = groupCarlVinson:getID(), expend = AI.Task.WeaponExpend.ALL, attackQtyLimit = true}}) + end + Su34Status.status[groupName] = 1 + MessageToRed( string.format('%s: ',groupName) .. 'Attacking carrier Carl Vinson. ', 10, 'RedStatus' .. groupName ) +end + +function Su34AttackWest(groupName) +--trace.f("","Su34AttackWest") + local groupSu34 = Group.getByName( groupName ) + local controllerSu34 = groupSu34.getController(groupSu34) + local groupShipWest1 = Group.getByName("US Ship West #001") + local groupShipWest2 = Group.getByName("US Ship West #002") + controllerSu34.setOption( controllerSu34, AI.Option.Air.id.ROE, AI.Option.Air.val.ROE.OPEN_FIRE ) + controllerSu34.setOption( controllerSu34, AI.Option.Air.id.REACTION_ON_THREAT, AI.Option.Air.val.REACTION_ON_THREAT.EVADE_FIRE ) + if groupShipWest1 ~= nil then + controllerSu34.pushTask(controllerSu34,{id = 'AttackGroup', params = { groupId = groupShipWest1:getID(), expend = AI.Task.WeaponExpend.ALL, attackQtyLimit = true}}) + end + if groupShipWest2 ~= nil then + controllerSu34.pushTask(controllerSu34,{id = 'AttackGroup', params = { groupId = groupShipWest2:getID(), expend = AI.Task.WeaponExpend.ALL, attackQtyLimit = true}}) + end + Su34Status.status[groupName] = 2 + MessageToRed( string.format('%s: ',groupName) .. 'Attacking invading ships in the west. ', 10, 'RedStatus' .. groupName ) +end + +function Su34AttackNorth(groupName) +--trace.menu("","Su34AttackNorth") + local groupSu34 = Group.getByName( groupName ) + local controllerSu34 = groupSu34.getController(groupSu34) + local groupShipNorth1 = Group.getByName("US Ship North #001") + local groupShipNorth2 = Group.getByName("US Ship North #002") + local groupShipNorth3 = Group.getByName("US Ship North #003") + controllerSu34.setOption( controllerSu34, AI.Option.Air.id.ROE, AI.Option.Air.val.ROE.OPEN_FIRE ) + controllerSu34.setOption( controllerSu34, AI.Option.Air.id.REACTION_ON_THREAT, AI.Option.Air.val.REACTION_ON_THREAT.EVADE_FIRE ) + if groupShipNorth1 ~= nil then + controllerSu34.pushTask(controllerSu34,{id = 'AttackGroup', params = { groupId = groupShipNorth1:getID(), expend = AI.Task.WeaponExpend.ALL, attackQtyLimit = false}}) + end + if groupShipNorth2 ~= nil then + controllerSu34.pushTask(controllerSu34,{id = 'AttackGroup', params = { groupId = groupShipNorth2:getID(), expend = AI.Task.WeaponExpend.ALL, attackQtyLimit = false}}) + end + if groupShipNorth3 ~= nil then + controllerSu34.pushTask(controllerSu34,{id = 'AttackGroup', params = { groupId = groupShipNorth3:getID(), expend = AI.Task.WeaponExpend.ALL, attackQtyLimit = false}}) + end + Su34Status.status[groupName] = 3 + MessageToRed( string.format('%s: ',groupName) .. 'Attacking invading ships in the north. ', 10, 'RedStatus' .. groupName ) +end + +function Su34Orbit(groupName) +--trace.menu("","Su34Orbit") + local groupSu34 = Group.getByName( groupName ) + local controllerSu34 = groupSu34:getController() + controllerSu34.setOption( controllerSu34, AI.Option.Air.id.ROE, AI.Option.Air.val.ROE.WEAPON_HOLD ) + controllerSu34.setOption( controllerSu34, AI.Option.Air.id.REACTION_ON_THREAT, AI.Option.Air.val.REACTION_ON_THREAT.EVADE_FIRE ) + controllerSu34:pushTask( {id = 'ControlledTask', params = { task = { id = 'Orbit', params = { pattern = AI.Task.OrbitPattern.RACE_TRACK } }, stopCondition = { duration = 600 } } } ) + Su34Status.status[groupName] = 4 + MessageToRed( string.format('%s: ',groupName) .. 'In orbit and awaiting further instructions. ', 10, 'RedStatus' .. groupName ) +end + +function Su34TakeOff(groupName) +--trace.menu("","Su34TakeOff") + local groupSu34 = Group.getByName( groupName ) + local controllerSu34 = groupSu34:getController() + controllerSu34.setOption( controllerSu34, AI.Option.Air.id.ROE, AI.Option.Air.val.ROE.WEAPON_HOLD ) + controllerSu34.setOption( controllerSu34, AI.Option.Air.id.REACTION_ON_THREAT, AI.Option.Air.val.REACTION_ON_THREAT.BYPASS_AND_ESCAPE ) + Su34Status.status[groupName] = 8 + MessageToRed( string.format('%s: ',groupName) .. 'Take-Off. ', 10, 'RedStatus' .. groupName ) +end + +function Su34Hold(groupName) +--trace.menu("","Su34Hold") + local groupSu34 = Group.getByName( groupName ) + local controllerSu34 = groupSu34:getController() + controllerSu34.setOption( controllerSu34, AI.Option.Air.id.ROE, AI.Option.Air.val.ROE.WEAPON_HOLD ) + controllerSu34.setOption( controllerSu34, AI.Option.Air.id.REACTION_ON_THREAT, AI.Option.Air.val.REACTION_ON_THREAT.BYPASS_AND_ESCAPE ) + Su34Status.status[groupName] = 5 + MessageToRed( string.format('%s: ',groupName) .. 'Holding Weapons. ', 10, 'RedStatus' .. groupName ) +end + +function Su34RTB(groupName) +--trace.menu("","Su34RTB") + Su34Status.status[groupName] = 6 + MessageToRed( string.format('%s: ',groupName) .. 'Return to Krasnodar. ', 10, 'RedStatus' .. groupName ) +end + +function Su34Destroyed(groupName) +--trace.menu("","Su34Destroyed") + Su34Status.status[groupName] = 7 + MessageToRed( string.format('%s: ',groupName) .. 'Destroyed. ', 30, 'RedStatus' .. groupName ) +end + +function GroupAlive( groupName ) +--trace.menu("","GroupAlive") + local groupTest = Group.getByName( groupName ) + + local groupExists = false + + if groupTest then + groupExists = groupTest:isExist() + end + + --trace.r( "", "", { groupExists } ) + return groupExists +end + +function Su34IsDead() +--trace.f() + +end + +function Su34OverviewStatus() +--trace.menu("","Su34OverviewStatus") + local msg = "" + local currentStatus = 0 + local Exists = false + + for groupName, currentStatus in pairs(Su34Status.status) do + + env.info(('Su34 Overview Status: GroupName = ' .. groupName )) + Alive = GroupAlive( groupName ) + + if Alive then + if currentStatus == 1 then + msg = msg .. string.format("%s: ",groupName) + msg = msg .. "Attacking carrier Carl Vinson. " + elseif currentStatus == 2 then + msg = msg .. string.format("%s: ",groupName) + msg = msg .. "Attacking supporting ships in the west. " + elseif currentStatus == 3 then + msg = msg .. string.format("%s: ",groupName) + msg = msg .. "Attacking invading ships in the north. " + elseif currentStatus == 4 then + msg = msg .. string.format("%s: ",groupName) + msg = msg .. "In orbit and awaiting further instructions. " + elseif currentStatus == 5 then + msg = msg .. string.format("%s: ",groupName) + msg = msg .. "Holding Weapons. " + elseif currentStatus == 6 then + msg = msg .. string.format("%s: ",groupName) + msg = msg .. "Return to Krasnodar. " + elseif currentStatus == 7 then + msg = msg .. string.format("%s: ",groupName) + msg = msg .. "Destroyed. " + elseif currentStatus == 8 then + msg = msg .. string.format("%s: ",groupName) + msg = msg .. "Take-Off. " + end + else + if currentStatus == 7 then + msg = msg .. string.format("%s: ",groupName) + msg = msg .. "Destroyed. " + else + Su34Destroyed(groupName) + end + end + end + + boardMsgRed.statusMsg = msg +end + + +function UpdateBoardMsg() +--trace.f() + Su34OverviewStatus() + MessageToRed( boardMsgRed.statusMsg, 15, 'RedStatus' ) +end + +function MusicReset( flg ) +--trace.f() + trigger.action.setUserFlag(95,flg) +end + +function PlaneActivate(groupNameFormat, flg) +--trace.f() + local groupName = groupNameFormat .. string.format("#%03d", trigger.misc.getUserFlag(flg)) + --trigger.action.outText(groupName,10) + trigger.action.activateGroup(Group.getByName(groupName)) +end + +function Su34Menu(groupName) +--trace.f() + + --env.info(( 'Su34Menu(' .. groupName .. ')' )) + local groupSu34 = Group.getByName( groupName ) + + if Su34Status.status[groupName] == 1 or + Su34Status.status[groupName] == 2 or + Su34Status.status[groupName] == 3 or + Su34Status.status[groupName] == 4 or + Su34Status.status[groupName] == 5 then + if Su34MenuPath[groupName] == nil then + if planeMenuPath == nil then + planeMenuPath = missionCommands.addSubMenuForCoalition( + coalition.side.RED, + "SU-34 anti-ship flights", + nil + ) + end + Su34MenuPath[groupName] = missionCommands.addSubMenuForCoalition( + coalition.side.RED, + "Flight " .. groupName, + planeMenuPath + ) + + missionCommands.addCommandForCoalition( + coalition.side.RED, + "Attack carrier Carl Vinson", + Su34MenuPath[groupName], + Su34AttackCarlVinson, + groupName + ) + + missionCommands.addCommandForCoalition( + coalition.side.RED, + "Attack ships in the west", + Su34MenuPath[groupName], + Su34AttackWest, + groupName + ) + + missionCommands.addCommandForCoalition( + coalition.side.RED, + "Attack ships in the north", + Su34MenuPath[groupName], + Su34AttackNorth, + groupName + ) + + missionCommands.addCommandForCoalition( + coalition.side.RED, + "Hold position and await instructions", + Su34MenuPath[groupName], + Su34Orbit, + groupName + ) + + missionCommands.addCommandForCoalition( + coalition.side.RED, + "Report status", + Su34MenuPath[groupName], + Su34OverviewStatus + ) + end + else + if Su34MenuPath[groupName] then + missionCommands.removeItemForCoalition(coalition.side.RED, Su34MenuPath[groupName]) + end + end +end + +--- Obsolete function, but kept to rework in framework. + +function ChooseInfantry ( TeleportPrefixTable, TeleportMax ) +--trace.f("Spawn") + --env.info(( 'ChooseInfantry: ' )) + + TeleportPrefixTableCount = #TeleportPrefixTable + TeleportPrefixTableIndex = math.random( 1, TeleportPrefixTableCount ) + + --env.info(( 'ChooseInfantry: TeleportPrefixTableIndex = ' .. TeleportPrefixTableIndex .. ' TeleportPrefixTableCount = ' .. TeleportPrefixTableCount .. ' TeleportMax = ' .. TeleportMax )) + + local TeleportFound = false + local TeleportLoop = true + local Index = TeleportPrefixTableIndex + local TeleportPrefix = '' + + while TeleportLoop do + TeleportPrefix = TeleportPrefixTable[Index] + if SpawnSettings[TeleportPrefix] then + if SpawnSettings[TeleportPrefix]['SpawnCount'] - 1 < TeleportMax then + SpawnSettings[TeleportPrefix]['SpawnCount'] = SpawnSettings[TeleportPrefix]['SpawnCount'] + 1 + TeleportFound = true + else + TeleportFound = false + end + else + SpawnSettings[TeleportPrefix] = {} + SpawnSettings[TeleportPrefix]['SpawnCount'] = 0 + TeleportFound = true + end + if TeleportFound then + TeleportLoop = false + else + if Index < TeleportPrefixTableCount then + Index = Index + 1 + else + TeleportLoop = false + end + end + --env.info(( 'ChooseInfantry: Loop 1 - TeleportPrefix = ' .. TeleportPrefix .. ' Index = ' .. Index )) + end + + if TeleportFound == false then + TeleportLoop = true + Index = 1 + while TeleportLoop do + TeleportPrefix = TeleportPrefixTable[Index] + if SpawnSettings[TeleportPrefix] then + if SpawnSettings[TeleportPrefix]['SpawnCount'] - 1 < TeleportMax then + SpawnSettings[TeleportPrefix]['SpawnCount'] = SpawnSettings[TeleportPrefix]['SpawnCount'] + 1 + TeleportFound = true + else + TeleportFound = false + end + else + SpawnSettings[TeleportPrefix] = {} + SpawnSettings[TeleportPrefix]['SpawnCount'] = 0 + TeleportFound = true + end + if TeleportFound then + TeleportLoop = false + else + if Index < TeleportPrefixTableIndex then + Index = Index + 1 + else + TeleportLoop = false + end + end + --env.info(( 'ChooseInfantry: Loop 2 - TeleportPrefix = ' .. TeleportPrefix .. ' Index = ' .. Index )) + end + end + + local TeleportGroupName = '' + if TeleportFound == true then + TeleportGroupName = TeleportPrefix .. string.format("#%03d", SpawnSettings[TeleportPrefix]['SpawnCount'] ) + else + TeleportGroupName = '' + end + + --env.info(('ChooseInfantry: TeleportGroupName = ' .. TeleportGroupName )) + --env.info(('ChooseInfantry: return')) + + return TeleportGroupName +end + +SpawnedInfantry = 0 + +function LandCarrier ( CarrierGroup, LandingZonePrefix ) +--trace.f() + --env.info(( 'LandCarrier: ' )) + --env.info(( 'LandCarrier: CarrierGroup = ' .. CarrierGroup:getName() )) + --env.info(( 'LandCarrier: LandingZone = ' .. LandingZonePrefix )) + + local controllerGroup = CarrierGroup:getController() + + local LandingZone = trigger.misc.getZone(LandingZonePrefix) + local LandingZonePos = {} + LandingZonePos.x = LandingZone.point.x + math.random(LandingZone.radius * -1, LandingZone.radius) + LandingZonePos.y = LandingZone.point.z + math.random(LandingZone.radius * -1, LandingZone.radius) + + controllerGroup:pushTask( { id = 'Land', params = { point = LandingZonePos, durationFlag = true, duration = 10 } } ) + + --env.info(( 'LandCarrier: end' )) +end + +EscortCount = 0 +function EscortCarrier ( CarrierGroup, EscortPrefix, EscortLastWayPoint, EscortEngagementDistanceMax, EscortTargetTypes ) +--trace.f() + --env.info(( 'EscortCarrier: ' )) + --env.info(( 'EscortCarrier: CarrierGroup = ' .. CarrierGroup:getName() )) + --env.info(( 'EscortCarrier: EscortPrefix = ' .. EscortPrefix )) + + local CarrierName = CarrierGroup:getName() + + local EscortMission = {} + local CarrierMission = {} + + local EscortMission = SpawnMissionGroup( EscortPrefix ) + local CarrierMission = SpawnMissionGroup( CarrierGroup:getName() ) + + if EscortMission ~= nil and CarrierMission ~= nil then + + EscortCount = EscortCount + 1 + EscortMissionName = string.format( EscortPrefix .. '#Escort %s', CarrierName ) + EscortMission.name = EscortMissionName + EscortMission.groupId = nil + EscortMission.lateActivation = false + EscortMission.taskSelected = false + + local EscortUnits = #EscortMission.units + for u = 1, EscortUnits do + EscortMission.units[u].name = string.format( EscortPrefix .. '#Escort %s %02d', CarrierName, u ) + EscortMission.units[u].unitId = nil + end + + + EscortMission.route.points[1].task = { id = "ComboTask", + params = + { + tasks = + { + [1] = + { + enabled = true, + auto = false, + id = "Escort", + number = 1, + params = + { + lastWptIndexFlagChangedManually = false, + groupId = CarrierGroup:getID(), + lastWptIndex = nil, + lastWptIndexFlag = false, + engagementDistMax = EscortEngagementDistanceMax, + targetTypes = EscortTargetTypes, + pos = + { + y = 20, + x = 20, + z = 0, + } -- end of ["pos"] + } -- end of ["params"] + } -- end of [1] + } -- end of ["tasks"] + } -- end of ["params"] + } -- end of ["task"] + + SpawnGroupAdd( EscortPrefix, EscortMission ) + + end +end + +function SendMessageToCarrier( CarrierGroup, CarrierMessage ) +--trace.f() + + if CarrierGroup ~= nil then + MessageToGroup( CarrierGroup, CarrierMessage, 30, 'Carrier/' .. CarrierGroup:getName() ) + end + +end + +function MessageToGroup( MsgGroup, MsgText, MsgTime, MsgName ) +--trace.f() + + if type(MsgGroup) == 'string' then + --env.info( 'MessageToGroup: Converted MsgGroup string "' .. MsgGroup .. '" into a Group structure.' ) + MsgGroup = Group.getByName( MsgGroup ) + end + + if MsgGroup ~= nil then + local MsgTable = {} + MsgTable.text = MsgText + MsgTable.displayTime = MsgTime + MsgTable.msgFor = { units = { MsgGroup:getUnits()[1]:getName() } } + MsgTable.name = MsgName + --routines.message.add( MsgTable ) + --env.info(('MessageToGroup: Message sent to ' .. MsgGroup:getUnits()[1]:getName() .. ' -> ' .. MsgText )) + end +end + +function MessageToUnit( UnitName, MsgText, MsgTime, MsgName ) +--trace.f() + + if UnitName ~= nil then + local MsgTable = {} + MsgTable.text = MsgText + MsgTable.displayTime = MsgTime + MsgTable.msgFor = { units = { UnitName } } + MsgTable.name = MsgName + --routines.message.add( MsgTable ) + end +end + +function MessageToAll( MsgText, MsgTime, MsgName ) +--trace.f() + + MESSAGE:New( MsgText, "Message", MsgTime, MsgName ):ToCoalition( coalition.side.RED ):ToCoalition( coalition.side.BLUE ) +end + +function MessageToRed( MsgText, MsgTime, MsgName ) +--trace.f() + + MESSAGE:New( MsgText, "To Red Coalition", MsgTime, MsgName ):ToCoalition( coalition.side.RED ) +end + +function MessageToBlue( MsgText, MsgTime, MsgName ) +--trace.f() + + MESSAGE:New( MsgText, "To Blue Coalition", MsgTime, MsgName ):ToCoalition( coalition.side.RED ) +end + +function getCarrierHeight( CarrierGroup ) +--trace.f() + + if CarrierGroup ~= nil then + if table.getn(CarrierGroup:getUnits()) == 1 then + local CarrierUnit = CarrierGroup:getUnits()[1] + local CurrentPoint = CarrierUnit:getPoint() + + local CurrentPosition = { x = CurrentPoint.x, y = CurrentPoint.z } + local CarrierHeight = CurrentPoint.y + + local LandHeight = land.getHeight( CurrentPosition ) + + --env.info(( 'CarrierHeight: LandHeight = ' .. LandHeight .. ' CarrierHeight = ' .. CarrierHeight )) + + return CarrierHeight - LandHeight + else + return 999999 + end + else + return 999999 + end + +end + +function GetUnitHeight( CheckUnit ) +--trace.f() + + local UnitPoint = CheckUnit:getPoint() + local UnitPosition = { x = CurrentPoint.x, y = CurrentPoint.z } + local UnitHeight = CurrentPoint.y + + local LandHeight = land.getHeight( CurrentPosition ) + + --env.info(( 'CarrierHeight: LandHeight = ' .. LandHeight .. ' CarrierHeight = ' .. CarrierHeight )) + + return UnitHeight - LandHeight + +end + + +_MusicTable = {} +_MusicTable.Files = {} +_MusicTable.Queue = {} +_MusicTable.FileCnt = 0 + + +function MusicRegister( SndRef, SndFile, SndTime ) +--trace.f() + + env.info(( 'MusicRegister: SndRef = ' .. SndRef )) + env.info(( 'MusicRegister: SndFile = ' .. SndFile )) + env.info(( 'MusicRegister: SndTime = ' .. SndTime )) + + + _MusicTable.FileCnt = _MusicTable.FileCnt + 1 + + _MusicTable.Files[_MusicTable.FileCnt] = {} + _MusicTable.Files[_MusicTable.FileCnt].Ref = SndRef + _MusicTable.Files[_MusicTable.FileCnt].File = SndFile + _MusicTable.Files[_MusicTable.FileCnt].Time = SndTime + + if not _MusicTable.Function then + _MusicTable.Function = routines.scheduleFunction( MusicScheduler, { }, timer.getTime() + 10, 10) + end + +end + +function MusicToPlayer( SndRef, PlayerName, SndContinue ) +--trace.f() + + --env.info(( 'MusicToPlayer: SndRef = ' .. SndRef )) + + local PlayerUnits = AlivePlayerUnits() + for PlayerUnitIdx, PlayerUnit in pairs(PlayerUnits) do + local PlayerUnitName = PlayerUnit:getPlayerName() + --env.info(( 'MusicToPlayer: PlayerUnitName = ' .. PlayerUnitName )) + if PlayerName == PlayerUnitName then + PlayerGroup = PlayerUnit:getGroup() + if PlayerGroup then + --env.info(( 'MusicToPlayer: PlayerGroup = ' .. PlayerGroup:getName() )) + MusicToGroup( SndRef, PlayerGroup, SndContinue ) + end + break + end + end + + --env.info(( 'MusicToPlayer: end' )) + +end + +function MusicToGroup( SndRef, SndGroup, SndContinue ) +--trace.f() + + --env.info(( 'MusicToGroup: SndRef = ' .. SndRef )) + + if SndGroup ~= nil then + if _MusicTable and _MusicTable.FileCnt > 0 then + if SndGroup:isExist() then + if MusicCanStart(SndGroup:getUnit(1):getPlayerName()) then + --env.info(( 'MusicToGroup: OK for Sound.' )) + local SndIdx = 0 + if SndRef == '' then + --env.info(( 'MusicToGroup: SndRef as empty. Queueing at random.' )) + SndIdx = math.random( 1, _MusicTable.FileCnt ) + else + for SndIdx = 1, _MusicTable.FileCnt do + if _MusicTable.Files[SndIdx].Ref == SndRef then + break + end + end + end + --env.info(( 'MusicToGroup: SndIdx = ' .. SndIdx )) + --env.info(( 'MusicToGroup: Queueing Music ' .. _MusicTable.Files[SndIdx].File .. ' for Group ' .. SndGroup:getID() )) + trigger.action.outSoundForGroup( SndGroup:getID(), _MusicTable.Files[SndIdx].File ) + MessageToGroup( SndGroup, 'Playing ' .. _MusicTable.Files[SndIdx].File, 15, 'Music-' .. SndGroup:getUnit(1):getPlayerName() ) + + local SndQueueRef = SndGroup:getUnit(1):getPlayerName() + if _MusicTable.Queue[SndQueueRef] == nil then + _MusicTable.Queue[SndQueueRef] = {} + end + _MusicTable.Queue[SndQueueRef].Start = timer.getTime() + _MusicTable.Queue[SndQueueRef].PlayerName = SndGroup:getUnit(1):getPlayerName() + _MusicTable.Queue[SndQueueRef].Group = SndGroup + _MusicTable.Queue[SndQueueRef].ID = SndGroup:getID() + _MusicTable.Queue[SndQueueRef].Ref = SndIdx + _MusicTable.Queue[SndQueueRef].Continue = SndContinue + _MusicTable.Queue[SndQueueRef].Type = Group + end + end + end + end +end + +function MusicCanStart(PlayerName) +--trace.f() + + --env.info(( 'MusicCanStart:' )) + + local MusicOut = false + + if _MusicTable['Queue'] ~= nil and _MusicTable.FileCnt > 0 then + --env.info(( 'MusicCanStart: PlayerName = ' .. PlayerName )) + local PlayerFound = false + local MusicStart = 0 + local MusicTime = 0 + for SndQueueIdx, SndQueue in pairs( _MusicTable.Queue ) do + if SndQueue.PlayerName == PlayerName then + PlayerFound = true + MusicStart = SndQueue.Start + MusicTime = _MusicTable.Files[SndQueue.Ref].Time + break + end + end + if PlayerFound then + --env.info(( 'MusicCanStart: MusicStart = ' .. MusicStart )) + --env.info(( 'MusicCanStart: MusicTime = ' .. MusicTime )) + --env.info(( 'MusicCanStart: timer.getTime() = ' .. timer.getTime() )) + + if MusicStart + MusicTime <= timer.getTime() then + MusicOut = true + end + else + MusicOut = true + end + end + + if MusicOut then + --env.info(( 'MusicCanStart: true' )) + else + --env.info(( 'MusicCanStart: false' )) + end + + return MusicOut +end + +function MusicScheduler() +--trace.scheduled("", "MusicScheduler") + + --env.info(( 'MusicScheduler:' )) + if _MusicTable['Queue'] ~= nil and _MusicTable.FileCnt > 0 then + --env.info(( 'MusicScheduler: Walking Sound Queue.')) + for SndQueueIdx, SndQueue in pairs( _MusicTable.Queue ) do + if SndQueue.Continue then + if MusicCanStart(SndQueue.PlayerName) then + --env.info(('MusicScheduler: MusicToGroup')) + MusicToPlayer( '', SndQueue.PlayerName, true ) + end + end + end + end + +end + + +env.info(( 'Init: Scripts Loaded v1.1' )) + +--- BASE classes. +-- +-- @{#BASE} class +-- ============== +-- The @{#BASE} class is the super class for most of the classes defined within MOOSE. +-- +-- It handles: +-- +-- * The construction and inheritance of child classes. +-- * The tracing of objects during mission execution within the DCS.log file (under saved games folder). +-- +-- Note: Normally you would not use the BASE class unless you are extending the MOOSE framework with new classes. +-- +-- BASE Trace functionality +-- ======================== +-- The BASE class contains trace methods to trace progress within a mission execution of a certain object. +-- Note that these trace methods are inherited by each MOOSE class interiting BASE. +-- As such, each object created from derived class from BASE can use the tracing functions to trace its execution. +-- +-- Trace a function call +-- --------------------- +-- There are basically 3 types of tracing methods available within BASE: +-- +-- * @{#BASE.F}: Trace the beginning of a function and its given parameters. +-- * @{#BASE.T}: Trace further logic within a function giving optional variables or parameters. +-- * @{#BASE.E}: Trace an execption within a function giving optional variables or parameters. An exception will always be traced. +-- +-- Tracing levels +-- -------------- +-- There are 3 tracing levels within MOOSE. +-- These tracing levels were defined to avoid bulks of tracing to be generated by lots of objects. +-- +-- As such, the F and T methods have additional variants to trace level 2 and 3 respectively: +-- +-- * @{#BASE.F2}: Trace the beginning of a function and its given parameters with tracing level 2. +-- * @{#BASE.F3}: Trace the beginning of a function and its given parameters with tracing level 3. +-- * @{#BASE.T2}: Trace further logic within a function giving optional variables or parameters with tracing level 2. +-- * @{#BASE.T3}: Trace further logic within a function giving optional variables or parameters with tracing level 3. +-- +-- BASE Inheritance support +-- ======================== +-- The following methods are available to support inheritance: +-- +-- * @{#BASE.Inherit}: Inherits from a class. +-- * @{#BASE.Inherited}: Returns the parent class from the class. +-- +-- Future +-- ====== +-- Further methods may be added to BASE whenever there is a need to make "overall" functions available within MOOSE. +-- +-- ==== +-- +-- @module Base +-- @author FlightControl + +Include.File( "Routines" ) + +local _TraceOn = true +local _TraceLevel = 1 +local _TraceClass = { + --DATABASE = true, + --SEAD = true, + --DESTROYBASETASK = true, + --MOVEMENT = true, + --SPAWN = true, + --STAGE = true, + --ZONE = true, + --GROUP = true, + --UNIT = true, + --CLIENT = true, + --CARGO = true, + --CARGO_GROUP = true, + --CARGO_PACKAGE = true, + --CARGO_SLINGLOAD = true, + --CARGO_ZONE = true, + --CLEANUP = true, + --MENU_CLIENT = true, + --MENU_CLIENT_COMMAND = true, + --ESCORT = true, + } +local _TraceClassMethod = {} + +--- The BASE Class +-- @type BASE +-- @field ClassName The name of the class. +-- @field ClassID The ID number of the class. +BASE = { + ClassName = "BASE", + ClassID = 0, + Events = {} +} + +--- The Formation Class +-- @type FORMATION +-- @field Cone A cone formation. +FORMATION = { + Cone = "Cone" +} + + + +--- The base constructor. This is the top top class of all classed defined within the MOOSE. +-- Any new class needs to be derived from this class for proper inheritance. +-- @param #BASE self +-- @return #BASE The new instance of the BASE class. +-- @usage +-- function TASK:New() +-- +-- local self = BASE:Inherit( self, BASE:New() ) +-- +-- -- assign Task default values during construction +-- self.TaskBriefing = "Task: No Task." +-- self.Time = timer.getTime() +-- self.ExecuteStage = _TransportExecuteStage.NONE +-- +-- return self +-- end +-- @todo need to investigate if the deepCopy is really needed... Don't think so. +function BASE:New() + local Child = routines.utils.deepCopy( self ) + local Parent = {} + setmetatable( Child, Parent ) + Child.__index = Child + self.ClassID = self.ClassID + 1 + Child.ClassID = self.ClassID + --Child.AddEvent( Child, S_EVENT_BIRTH, Child.EventBirth ) + return Child +end + +--- This is the worker method to inherit from a parent class. +-- @param #BASE self +-- @param Child is the Child class that inherits. +-- @param #BASE Parent is the Parent class that the Child inherits from. +-- @return #BASE Child +function BASE:Inherit( Child, Parent ) + local Child = routines.utils.deepCopy( Child ) + local Parent = routines.utils.deepCopy( Parent ) + if Child ~= nil then + setmetatable( Child, Parent ) + Child.__index = Child + end + --Child.ClassName = Child.ClassName .. '.' .. Child.ClassID + self:T( 'Inherited from ' .. Parent.ClassName ) + return Child +end + +--- This is the worker method to retrieve the Parent class. +-- @param #BASE self +-- @param #BASE Child is the Child class from which the Parent class needs to be retrieved. +-- @return #BASE +function BASE:Inherited( Child ) + local Parent = getmetatable( Child ) +-- env.info('Inherited class of ' .. Child.ClassName .. ' is ' .. Parent.ClassName ) + return Parent +end + +--- Get the ClassName + ClassID of the class instance. +-- The ClassName + ClassID is formatted as '%s#%09d'. +-- @param #BASE self +-- @return #string The ClassName + ClassID of the class instance. +function BASE:GetClassNameAndID() + return string.format( '%s#%09d', self:GetClassName(), self:GetClassID() ) +end + +--- Get the ClassName of the class instance. +-- @param #BASE self +-- @return #string The ClassName of the class instance. +function BASE:GetClassName() + return self.ClassName +end + +--- Get the ClassID of the class instance. +-- @param #BASE self +-- @return #string The ClassID of the class instance. +function BASE:GetClassID() + return self.ClassID +end + +--- Set a new listener for the class. +-- @param self +-- @param DCSTypes#Event Event +-- @param #function EventFunction +-- @return #BASE +function BASE:AddEvent( Event, EventFunction ) + self:F( Event ) + + self.Events[#self.Events+1] = {} + self.Events[#self.Events].Event = Event + self.Events[#self.Events].EventFunction = EventFunction + self.Events[#self.Events].EventEnabled = false + + return self +end + +--- Returns the event dispatcher +-- @param #BASE self +-- @return Event#EVENT +function BASE:Event() + + return _EVENTDISPATCHER +end + + + + + +--- Enable the event listeners for the class. +-- @param #BASE self +-- @return #BASE +function BASE:EnableEvents() + self:F( #self.Events ) + + for EventID, Event in pairs( self.Events ) do + Event.Self = self + Event.EventEnabled = true + end + self.Events.Handler = world.addEventHandler( self ) + + return self +end + + +--- Disable the event listeners for the class. +-- @param #BASE self +-- @return #BASE +function BASE:DisableEvents() + self:F() + + world.removeEventHandler( self ) + for EventID, Event in pairs( self.Events ) do + Event.Self = nil + Event.EventEnabled = false + end + + return self +end + + +local BaseEventCodes = { + "S_EVENT_SHOT", + "S_EVENT_HIT", + "S_EVENT_TAKEOFF", + "S_EVENT_LAND", + "S_EVENT_CRASH", + "S_EVENT_EJECTION", + "S_EVENT_REFUELING", + "S_EVENT_DEAD", + "S_EVENT_PILOT_DEAD", + "S_EVENT_BASE_CAPTURED", + "S_EVENT_MISSION_START", + "S_EVENT_MISSION_END", + "S_EVENT_TOOK_CONTROL", + "S_EVENT_REFUELING_STOP", + "S_EVENT_BIRTH", + "S_EVENT_HUMAN_FAILURE", + "S_EVENT_ENGINE_STARTUP", + "S_EVENT_ENGINE_SHUTDOWN", + "S_EVENT_PLAYER_ENTER_UNIT", + "S_EVENT_PLAYER_LEAVE_UNIT", + "S_EVENT_PLAYER_COMMENT", + "S_EVENT_SHOOTING_START", + "S_EVENT_SHOOTING_END", + "S_EVENT_MAX", +} + +--onEvent( {[1]="S_EVENT_BIRTH",[2]={["subPlace"]=5,["time"]=0,["initiator"]={["id_"]=16884480,},["place"]={["id_"]=5000040,},["id"]=15,["IniUnitName"]="US F-15C@RAMP-Air Support Mountains#001-01",},} +-- Event = { +-- id = enum world.event, +-- time = Time, +-- initiator = Unit, +-- target = Unit, +-- place = Unit, +-- subPlace = enum world.BirthPlace, +-- weapon = Weapon +-- } + +--- Creation of a Birth Event. +-- @param #BASE self +-- @param DCSTypes#Time EventTime The time stamp of the event. +-- @param DCSObject#Object Initiator The initiating object of the event. +-- @param #string IniUnitName The initiating unit name. +-- @param place +-- @param subplace +function BASE:CreateEventBirth( EventTime, Initiator, IniUnitName, place, subplace ) + self:F( { EventTime, Initiator, IniUnitName, place, subplace } ) + + local Event = { + id = world.event.S_EVENT_BIRTH, + time = EventTime, + initiator = Initiator, + IniUnitName = IniUnitName, + place = place, + subplace = subplace + } + + world.onEvent( Event ) +end + +--- Creation of a Crash Event. +-- @param #BASE self +-- @param DCSTypes#Time EventTime The time stamp of the event. +-- @param DCSObject#Object Initiator The initiating object of the event. +function BASE:CreateEventCrash( EventTime, Initiator ) + self:F( { EventTime, Initiator } ) + + local Event = { + id = world.event.S_EVENT_CRASH, + time = EventTime, + initiator = Initiator, + } + + world.onEvent( Event ) +end + +-- TODO: Complete DCSTypes#Event structure. +--- The main event handling function... This function captures all events generated for the class. +-- @param #BASE self +-- @param DCSTypes#Event event +function BASE:onEvent(event) + --self:F( { BaseEventCodes[event.id], event } ) + + if self then + for EventID, EventObject in pairs( self.Events ) do + if EventObject.EventEnabled then + --env.info( 'onEvent Table EventObject.Self = ' .. tostring(EventObject.Self) ) + --env.info( 'onEvent event.id = ' .. tostring(event.id) ) + --env.info( 'onEvent EventObject.Event = ' .. tostring(EventObject.Event) ) + if event.id == EventObject.Event then + if self == EventObject.Self then + if event.initiator and event.initiator:isExist() then + event.IniUnitName = event.initiator:getName() + end + if event.target and event.target:isExist() then + event.TgtUnitName = event.target:getName() + end + --self:T( { BaseEventCodes[event.id], event } ) + --EventObject.EventFunction( self, event ) + end + end + end + end + end +end + +-- Trace section + +-- Log a trace (only shown when trace is on) +-- TODO: Make trace function using variable parameters. + +--- Set trace level +-- @param #BASE self +-- @param #number Level +function BASE:TraceLevel( Level ) + _TraceLevel = Level + self:E( "Tracing level " .. Level ) +end + +--- Set tracing for a class +-- @param #BASE self +-- @param #string Class +function BASE:TraceClass( Class ) + _TraceClass[Class] = true + _TraceClassMethod[Class] = {} + self:E( "Tracing class " .. Class ) +end + +--- Set tracing for a specific method of class +-- @param #BASE self +-- @param #string Class +-- @param #string Method +function BASE:TraceClassMethod( Class, Method ) + if not _TraceClassMethod[Class] then + _TraceClassMethod[Class] = {} + _TraceClassMethod[Class].Method = {} + end + _TraceClassMethod[Class].Method[Method] = true + self:E( "Tracing method " .. Method .. " of class " .. Class ) +end + +--- Trace a function call. Must be at the beginning of the function logic. +-- @param #BASE self +-- @param Arguments A #table or any field. +function BASE:F( Arguments ) + + if _TraceOn and ( _TraceClass[self.ClassName] or _TraceClassMethod[self.ClassName] ) then + + local DebugInfoCurrent = debug.getinfo( 2, "nl" ) + local DebugInfoFrom = debug.getinfo( 3, "l" ) + + local Function = "function" + if DebugInfoCurrent.name then + Function = DebugInfoCurrent.name + end + + if _TraceClass[self.ClassName] or _TraceClassMethod[self.ClassName].Method[Function] then + local LineCurrent = DebugInfoCurrent.currentline + local LineFrom = 0 + if DebugInfoFrom then + LineFrom = DebugInfoFrom.currentline + end + env.info( string.format( "%6d(%6d)/%1s:%20s%05d.%s(%s)" , LineCurrent, LineFrom, "F", self.ClassName, self.ClassID, Function, routines.utils.oneLineSerialize( Arguments ) ) ) + end + end +end + +--- Trace a function call level 2. Must be at the beginning of the function logic. +-- @param #BASE self +-- @param Arguments A #table or any field. +function BASE:F2( Arguments ) + + if _TraceLevel >= 2 then + self:F( Arguments ) + end + +end + +--- Trace a function call level 3. Must be at the beginning of the function logic. +-- @param #BASE self +-- @param Arguments A #table or any field. +function BASE:F3( Arguments ) + + if _TraceLevel >= 3 then + self:F( Arguments ) + end + +end + +--- Trace a function logic. Can be anywhere within the function logic. +-- @param #BASE self +-- @param Arguments A #table or any field. +function BASE:T( Arguments ) + + if _TraceOn and ( _TraceClass[self.ClassName] or _TraceClassMethod[self.ClassName] ) then + + local DebugInfoCurrent = debug.getinfo( 2, "nl" ) + local DebugInfoFrom = debug.getinfo( 3, "l" ) + + local Function = "function" + if DebugInfoCurrent.name then + Function = DebugInfoCurrent.name + end + + if _TraceClass[self.ClassName] or _TraceClassMethod[self.ClassName].Method[Function] then + local LineCurrent = DebugInfoCurrent.currentline + local LineFrom = 0 + if DebugInfoFrom then + LineFrom = DebugInfoFrom.currentline + end + env.info( string.format( "%6d(%6d)/%1s:%20s%05d.%s" , LineCurrent, LineFrom, "T", self.ClassName, self.ClassID, routines.utils.oneLineSerialize( Arguments ) ) ) + end + end +end + +--- Trace a function logic level 2. Can be anywhere within the function logic. +-- @param #BASE self +-- @param Arguments A #table or any field. +function BASE:T2( Arguments ) + + if _TraceLevel >= 2 then + self:T( Arguments ) + end + +end + +--- Trace a function logic level 3. Can be anywhere within the function logic. +-- @param #BASE self +-- @param Arguments A #table or any field. +function BASE:T3( Arguments ) + + if _TraceLevel >= 3 then + self:T( Arguments ) + end + +end + +--- Log an exception which will be traced always. Can be anywhere within the function logic. +-- @param #BASE self +-- @param Arguments A #table or any field. +function BASE:E( Arguments ) + + local DebugInfoCurrent = debug.getinfo( 2, "nl" ) + local DebugInfoFrom = debug.getinfo( 3, "l" ) + + local Function = "function" + if DebugInfoCurrent.name then + Function = DebugInfoCurrent.name + end + + local LineCurrent = DebugInfoCurrent.currentline + local LineFrom = -1 + if DebugInfoFrom then + LineFrom = DebugInfoFrom.currentline + end + + env.info( string.format( "%6d(%6d)/%1s:%20s%05d.%s(%s)" , LineCurrent, LineFrom, "E", self.ClassName, self.ClassID, Function, routines.utils.oneLineSerialize( Arguments ) ) ) +end + + + +--- Models time events calling event handing functions. +-- +-- @{SCHEDULER} class +-- =================== +-- The @{SCHEDULER} class models time events calling given event handling functions. +-- +-- SCHEDULER constructor +-- ===================== +-- The SCHEDULER class is quite easy to use: +-- +-- * @{#SCHEDULER.New}: Setup a new scheduler and start it with the specified parameters. +-- +-- SCHEDULER timer methods +-- ======================= +-- The SCHEDULER can be stopped and restarted with the following methods: +-- +-- * @{#SCHEDULER.Start}: (Re-)Start the scheduler. +-- * @{#SCHEDULER.Start}: Stop the scheduler. +-- +-- @module Scheduler +-- @author FlightControl + +Include.File( "Routines" ) +Include.File( "Base" ) + + +--- The SCHEDULER class +-- @type SCHEDULER +-- @extends Base#BASE +SCHEDULER = { + ClassName = "SCHEDULER", +} + + +--- Constructor. +-- @param #SCHEDULER self +-- @param #table TimeEventObject Specified for which Moose object the timer is setup. If a value of nil is provided, a scheduler will be setup without an object reference. +-- @param #function TimeEventFunction The event function to be called when a timer event occurs. The event function needs to accept the parameters specified in TimeEventFunctionArguments. +-- @param #table TimeEventFunctionArguments Optional arguments that can be given as part of scheduler. The arguments need to be given as a table { param1, param 2, ... }. +-- @param #number StartSeconds Specifies the amount of seconds that will be waited before the scheduling is started, and the event function is called. +-- @param #number RepeatSecondsInterval Specifies the interval in seconds when the scheduler will call the event function. +-- @param #number RandomizationFactor Specifies a randomization factor between 0 and 1 to randomize the RepeatSecondsInterval. +-- @param #number StopSeconds Specifies the amount of seconds when the scheduler will be stopped. +-- @return #SCHEDULER self +function SCHEDULER:New( TimeEventObject, TimeEventFunction, TimeEventFunctionArguments, StartSeconds, RepeatSecondsInterval, RandomizationFactor, StopSeconds ) + local self = BASE:Inherit( self, BASE:New() ) + self:F2( { TimeEventObject, TimeEventFunction, TimeEventFunctionArguments, StartSeconds, RepeatSecondsInterval, RandomizationFactor, StopSeconds } ) + + self.TimeEventObject = TimeEventObject + self.TimeEventFunction = TimeEventFunction + self.TimeEventFunctionArguments = TimeEventFunctionArguments + self.StartSeconds = StartSeconds + + if RepeatSecondsInterval then + self.RepeatSecondsInterval = RepeatSecondsInterval + else + self.RepeatSecondsInterval = 0 + end + + if RandomizationFactor then + self.RandomizationFactor = RandomizationFactor + else + self.RandomizationFactor = 0 + end + + if StopSeconds then + self.StopSeconds = StopSeconds + end + + self.Repeat = false + + self.StartTime = timer.getTime() + + self:Start() + + return self +end + +--- (Re-)Starts the scheduler. +-- @param #SCHEDULER self +-- @return #SCHEDULER self +function SCHEDULER:Start() + self:F2( self.TimeEventObject ) + + self.Repeat = true + timer.scheduleFunction( self._Scheduler, self, timer.getTime() + self.StartSeconds + .01 ) + + return self +end + +--- Stops the scheduler. +-- @param #SCHEDULER self +-- @return #SCHEDULER self +function SCHEDULER:Stop() + self:F2( self.TimeEventObject ) + + self.Repeat = false + + return self +end + +-- Private Functions + +function SCHEDULER:_Scheduler() + self:F2( self.TimeEventFunctionArguments ) + + local ErrorHandler = function( errmsg ) + + env.info( "Error in SCHEDULER function:" .. errmsg ) + env.info( debug.traceback() ) + + return errmsg + end + + local Status, Result + if self.TimeEventObject then + Status, Result = xpcall( function() return self.TimeEventFunction( self.TimeEventObject, unpack( self.TimeEventFunctionArguments ) ) end, ErrorHandler ) + else + Status, Result = xpcall( function() return self.TimeEventFunction( unpack( self.TimeEventFunctionArguments ) ) end, ErrorHandler ) + end + + self:T( { Status, Result } ) + + if Status and ( ( not Result ) or ( Result and Result ~= false ) ) then + if self.Repeat and ( not self.StopSeconds or ( self.StopSeconds and timer.getTime() <= self.StartTime + self.StopSeconds ) ) then + timer.scheduleFunction( + self._Scheduler, + self, + timer.getTime() + self.RepeatSecondsInterval + math.random( - ( self.RandomizationFactor * self.RepeatSecondsInterval / 2 ), ( self.RandomizationFactor * self.RepeatSecondsInterval / 2 ) ) + 0.01 + ) + end + end + +end + + + + + + + + +--- The EVENT class models an efficient event handling process between other classes and its units, weapons. +-- @module Event +-- @author FlightControl + +Include.File( "Routines" ) +Include.File( "Base" ) + +--- The EVENT structure +-- @type EVENT +-- @field #EVENT.Events Events +EVENT = { + ClassName = "EVENT", + ClassID = 0, +} + +local _EVENTCODES = { + "S_EVENT_SHOT", + "S_EVENT_HIT", + "S_EVENT_TAKEOFF", + "S_EVENT_LAND", + "S_EVENT_CRASH", + "S_EVENT_EJECTION", + "S_EVENT_REFUELING", + "S_EVENT_DEAD", + "S_EVENT_PILOT_DEAD", + "S_EVENT_BASE_CAPTURED", + "S_EVENT_MISSION_START", + "S_EVENT_MISSION_END", + "S_EVENT_TOOK_CONTROL", + "S_EVENT_REFUELING_STOP", + "S_EVENT_BIRTH", + "S_EVENT_HUMAN_FAILURE", + "S_EVENT_ENGINE_STARTUP", + "S_EVENT_ENGINE_SHUTDOWN", + "S_EVENT_PLAYER_ENTER_UNIT", + "S_EVENT_PLAYER_LEAVE_UNIT", + "S_EVENT_PLAYER_COMMENT", + "S_EVENT_SHOOTING_START", + "S_EVENT_SHOOTING_END", + "S_EVENT_MAX", +} + +--- The Event structure +-- @type EVENTDATA +-- @field id +-- @field initiator +-- @field target +-- @field weapon +-- @field IniDCSUnit +-- @field IniDCSUnitName +-- @field IniDCSGroup +-- @field IniDCSGroupName +-- @field TgtDCSUnit +-- @field TgtDCSUnitName +-- @field TgtDCSGroup +-- @field TgtDCSGroupName +-- @field Weapon +-- @field WeaponName +-- @field WeaponTgtDCSUnit + +--- The Events structure +-- @type EVENT.Events +-- @field #number IniUnit + +function EVENT:New() + local self = BASE:Inherit( self, BASE:New() ) + self:F2() + self.EventHandler = world.addEventHandler( self ) + return self +end + +function EVENT:EventText( EventID ) + + local EventText = _EVENTCODES[EventID] + + return EventText +end + + +--- Initializes the Events structure for the event +-- @param #EVENT self +-- @param DCSWorld#world.event EventID +-- @param #string EventClass +-- @return #EVENT.Events +function EVENT:Init( EventID, EventClass ) + self:F3( { _EVENTCODES[EventID], EventClass } ) + if not self.Events[EventID] then + self.Events[EventID] = {} + end + if not self.Events[EventID][EventClass] then + self.Events[EventID][EventClass] = {} + end + return self.Events[EventID][EventClass] +end + + +--- Create an OnDead event handler for a group +-- @param #EVENT self +-- @param #table EventTemplate +-- @param #function EventFunction The function to be called when the event occurs for the unit. +-- @param EventSelf The self instance of the class for which the event is. +-- @param #function OnEventFunction +-- @return #EVENT +function EVENT:OnEventForTemplate( EventTemplate, EventFunction, EventSelf, OnEventFunction ) + self:F2( EventTemplate.name ) + + for EventUnitID, EventUnit in pairs( EventTemplate.units ) do + OnEventFunction( self, EventUnit.name, EventFunction, EventSelf ) + end + return self +end + +--- Set a new listener for an S_EVENT_X event independent from a unit or a weapon. +-- @param #EVENT self +-- @param #function EventFunction The function to be called when the event occurs for the unit. +-- @param Base#BASE EventSelf The self instance of the class for which the event is. +-- @param EventID +-- @return #EVENT +function EVENT:OnEventGeneric( EventFunction, EventSelf, EventID ) + self:F2( { EventID } ) + + local Event = self:Init( EventID, EventSelf:GetClassNameAndID() ) + Event.EventFunction = EventFunction + Event.EventSelf = EventSelf + return self +end + + +--- Set a new listener for an S_EVENT_X event +-- @param #EVENT self +-- @param #string EventDCSUnitName +-- @param #function EventFunction The function to be called when the event occurs for the unit. +-- @param Base#BASE EventSelf The self instance of the class for which the event is. +-- @param EventID +-- @return #EVENT +function EVENT:OnEventForUnit( EventDCSUnitName, EventFunction, EventSelf, EventID ) + self:F2( EventDCSUnitName ) + + local Event = self:Init( EventID, EventSelf:GetClassNameAndID() ) + if not Event.IniUnit then + Event.IniUnit = {} + end + Event.IniUnit[EventDCSUnitName] = {} + Event.IniUnit[EventDCSUnitName].EventFunction = EventFunction + Event.IniUnit[EventDCSUnitName].EventSelf = EventSelf + return self +end + + +--- Create an OnBirth event handler for a group +-- @param #EVENT self +-- @param Group#GROUP EventGroup +-- @param #function EventFunction The function to be called when the event occurs for the unit. +-- @param EventSelf The self instance of the class for which the event is. +-- @return #EVENT +function EVENT:OnBirthForTemplate( EventTemplate, EventFunction, EventSelf ) + self:F2( EventTemplate.name ) + + self:OnEventForTemplate( EventTemplate, EventFunction, EventSelf, self.OnBirthForUnit ) + + return self +end + +--- Set a new listener for an S_EVENT_BIRTH event, and registers the unit born. +-- @param #EVENT self +-- @param #function EventFunction The function to be called when the event occurs for the unit. +-- @param Base#BASE EventSelf +-- @return #EVENT +function EVENT:OnBirth( EventFunction, EventSelf ) + self:F2() + + self:OnEventGeneric( EventFunction, EventSelf, world.event.S_EVENT_BIRTH ) + + return self +end + +--- Set a new listener for an S_EVENT_BIRTH event. +-- @param #EVENT self +-- @param #string EventDCSUnitName The id of the unit for the event to be handled. +-- @param #function EventFunction The function to be called when the event occurs for the unit. +-- @param Base#BASE EventSelf +-- @return #EVENT +function EVENT:OnBirthForUnit( EventDCSUnitName, EventFunction, EventSelf ) + self:F2( EventDCSUnitName ) + + self:OnEventForUnit( EventDCSUnitName, EventFunction, EventSelf, world.event.S_EVENT_BIRTH ) + + return self +end + +--- Create an OnCrash event handler for a group +-- @param #EVENT self +-- @param Group#GROUP EventGroup +-- @param #function EventFunction The function to be called when the event occurs for the unit. +-- @param EventSelf The self instance of the class for which the event is. +-- @return #EVENT +function EVENT:OnCrashForTemplate( EventTemplate, EventFunction, EventSelf ) + self:F2( EventTemplate.name ) + + self:OnEventForTemplate( EventTemplate, EventFunction, EventSelf, self.OnCrashForUnit ) + + return self +end + +--- Set a new listener for an S_EVENT_CRASH event. +-- @param #EVENT self +-- @param #function EventFunction The function to be called when the event occurs for the unit. +-- @param Base#BASE EventSelf +-- @return #EVENT +function EVENT:OnCrash( EventFunction, EventSelf ) + self:F2() + + self:OnEventGeneric( EventFunction, EventSelf, world.event.S_EVENT_CRASH ) + + return self +end + +--- Set a new listener for an S_EVENT_CRASH event. +-- @param #EVENT self +-- @param #string EventDCSUnitName +-- @param #function EventFunction The function to be called when the event occurs for the unit. +-- @param Base#BASE EventSelf The self instance of the class for which the event is. +-- @return #EVENT +function EVENT:OnCrashForUnit( EventDCSUnitName, EventFunction, EventSelf ) + self:F2( EventDCSUnitName ) + + self:OnEventForUnit( EventDCSUnitName, EventFunction, EventSelf, world.event.S_EVENT_CRASH ) + + return self +end + +--- Create an OnDead event handler for a group +-- @param #EVENT self +-- @param Group#GROUP EventGroup +-- @param #function EventFunction The function to be called when the event occurs for the unit. +-- @param EventSelf The self instance of the class for which the event is. +-- @return #EVENT +function EVENT:OnDeadForTemplate( EventTemplate, EventFunction, EventSelf ) + self:F2( EventTemplate.name ) + + self:OnEventForTemplate( EventTemplate, EventFunction, EventSelf, self.OnDeadForUnit ) + + return self +end + +--- Set a new listener for an S_EVENT_DEAD event. +-- @param #EVENT self +-- @param #function EventFunction The function to be called when the event occurs for the unit. +-- @param Base#BASE EventSelf +-- @return #EVENT +function EVENT:OnDead( EventFunction, EventSelf ) + self:F2() + + self:OnEventGeneric( EventFunction, EventSelf, world.event.S_EVENT_DEAD ) + + return self +end + + +--- Set a new listener for an S_EVENT_DEAD event. +-- @param #EVENT self +-- @param #string EventDCSUnitName +-- @param #function EventFunction The function to be called when the event occurs for the unit. +-- @param Base#BASE EventSelf The self instance of the class for which the event is. +-- @return #EVENT +function EVENT:OnDeadForUnit( EventDCSUnitName, EventFunction, EventSelf ) + self:F2( EventDCSUnitName ) + + self:OnEventForUnit( EventDCSUnitName, EventFunction, EventSelf, world.event.S_EVENT_DEAD ) + + return self +end + +--- Set a new listener for an S_EVENT_PILOT_DEAD event. +-- @param #EVENT self +-- @param #string EventDCSUnitName +-- @param #function EventFunction The function to be called when the event occurs for the unit. +-- @param Base#BASE EventSelf The self instance of the class for which the event is. +-- @return #EVENT +function EVENT:OnPilotDeadForUnit( EventDCSUnitName, EventFunction, EventSelf ) + self:F2( EventDCSUnitName ) + + self:OnEventForUnit( EventDCSUnitName, EventFunction, EventSelf, world.event.S_EVENT_PILOT_DEAD ) + + return self +end + +--- Create an OnDead event handler for a group +-- @param #EVENT self +-- @param #table EventTemplate +-- @param #function EventFunction The function to be called when the event occurs for the unit. +-- @param EventSelf The self instance of the class for which the event is. +-- @return #EVENT +function EVENT:OnLandForTemplate( EventTemplate, EventFunction, EventSelf ) + self:F2( EventTemplate.name ) + + self:OnEventForTemplate( EventTemplate, EventFunction, EventSelf, self.OnLandForUnit ) + + return self +end + +--- Set a new listener for an S_EVENT_LAND event. +-- @param #EVENT self +-- @param #string EventDCSUnitName +-- @param #function EventFunction The function to be called when the event occurs for the unit. +-- @param Base#BASE EventSelf The self instance of the class for which the event is. +-- @return #EVENT +function EVENT:OnLandForUnit( EventDCSUnitName, EventFunction, EventSelf ) + self:F2( EventDCSUnitName ) + + self:OnEventForUnit( EventDCSUnitName, EventFunction, EventSelf, world.event.S_EVENT_LAND ) + + return self +end + +--- Create an OnDead event handler for a group +-- @param #EVENT self +-- @param #table EventTemplate +-- @param #function EventFunction The function to be called when the event occurs for the unit. +-- @param EventSelf The self instance of the class for which the event is. +-- @return #EVENT +function EVENT:OnTakeOffForTemplate( EventTemplate, EventFunction, EventSelf ) + self:F2( EventTemplate.name ) + + self:OnEventForTemplate( EventTemplate, EventFunction, EventSelf, self.OnTakeOffForUnit ) + + return self +end + +--- Set a new listener for an S_EVENT_TAKEOFF event. +-- @param #EVENT self +-- @param #string EventDCSUnitName +-- @param #function EventFunction The function to be called when the event occurs for the unit. +-- @param Base#BASE EventSelf The self instance of the class for which the event is. +-- @return #EVENT +function EVENT:OnTakeOffForUnit( EventDCSUnitName, EventFunction, EventSelf ) + self:F2( EventDCSUnitName ) + + self:OnEventForUnit( EventDCSUnitName, EventFunction, EventSelf, world.event.S_EVENT_TAKEOFF ) + + return self +end + +--- Create an OnDead event handler for a group +-- @param #EVENT self +-- @param #table EventTemplate +-- @param #function EventFunction The function to be called when the event occurs for the unit. +-- @param EventSelf The self instance of the class for which the event is. +-- @return #EVENT +function EVENT:OnEngineShutDownForTemplate( EventTemplate, EventFunction, EventSelf ) + self:F2( EventTemplate.name ) + + self:OnEventForTemplate( EventTemplate, EventFunction, EventSelf, self.OnEngineShutDownForUnit ) + + return self +end + +--- Set a new listener for an S_EVENT_ENGINE_SHUTDOWN event. +-- @param #EVENT self +-- @param #string EventDCSUnitName +-- @param #function EventFunction The function to be called when the event occurs for the unit. +-- @param Base#BASE EventSelf The self instance of the class for which the event is. +-- @return #EVENT +function EVENT:OnEngineShutDownForUnit( EventDCSUnitName, EventFunction, EventSelf ) + self:F2( EventDCSUnitName ) + + self:OnEventForUnit( EventDCSUnitName, EventFunction, EventSelf, world.event.S_EVENT_ENGINE_SHUTDOWN ) + + return self +end + +--- Set a new listener for an S_EVENT_ENGINE_STARTUP event. +-- @param #EVENT self +-- @param #string EventDCSUnitName +-- @param #function EventFunction The function to be called when the event occurs for the unit. +-- @param Base#BASE EventSelf The self instance of the class for which the event is. +-- @return #EVENT +function EVENT:OnEngineStartUpForUnit( EventDCSUnitName, EventFunction, EventSelf ) + self:F2( EventDCSUnitName ) + + self:OnEventForUnit( EventDCSUnitName, EventFunction, EventSelf, world.event.S_EVENT_ENGINE_STARTUP ) + + return self +end + +--- Set a new listener for an S_EVENT_SHOT event. +-- @param #EVENT self +-- @param #function EventFunction The function to be called when the event occurs for the unit. +-- @param Base#BASE EventSelf The self instance of the class for which the event is. +-- @return #EVENT +function EVENT:OnShot( EventFunction, EventSelf ) + self:F2() + + self:OnEventGeneric( EventFunction, EventSelf, world.event.S_EVENT_SHOT ) + + return self +end + +--- Set a new listener for an S_EVENT_SHOT event for a unit. +-- @param #EVENT self +-- @param #string EventDCSUnitName +-- @param #function EventFunction The function to be called when the event occurs for the unit. +-- @param Base#BASE EventSelf The self instance of the class for which the event is. +-- @return #EVENT +function EVENT:OnShotForUnit( EventDCSUnitName, EventFunction, EventSelf ) + self:F2( EventDCSUnitName ) + + self:OnEventForUnit( EventDCSUnitName, EventFunction, EventSelf, world.event.S_EVENT_SHOT ) + + return self +end + +--- Set a new listener for an S_EVENT_HIT event. +-- @param #EVENT self +-- @param #function EventFunction The function to be called when the event occurs for the unit. +-- @param Base#BASE EventSelf The self instance of the class for which the event is. +-- @return #EVENT +function EVENT:OnHit( EventFunction, EventSelf ) + self:F2() + + self:OnEventGeneric( EventFunction, EventSelf, world.event.S_EVENT_HIT ) + + return self +end + +--- Set a new listener for an S_EVENT_HIT event. +-- @param #EVENT self +-- @param #string EventDCSUnitName +-- @param #function EventFunction The function to be called when the event occurs for the unit. +-- @param Base#BASE EventSelf The self instance of the class for which the event is. +-- @return #EVENT +function EVENT:OnHitForUnit( EventDCSUnitName, EventFunction, EventSelf ) + self:F2( EventDCSUnitName ) + + self:OnEventForUnit( EventDCSUnitName, EventFunction, EventSelf, world.event.S_EVENT_HIT ) + + return self +end + +--- Set a new listener for an S_EVENT_PLAYER_ENTER_UNIT event. +-- @param #EVENT self +-- @param #function EventFunction The function to be called when the event occurs for the unit. +-- @param Base#BASE EventSelf The self instance of the class for which the event is. +-- @return #EVENT +function EVENT:OnPlayerEnterUnit( EventFunction, EventSelf ) + self:F2() + + self:OnEventGeneric( EventFunction, EventSelf, world.event.S_EVENT_PLAYER_ENTER_UNIT ) + + return self +end + +--- Set a new listener for an S_EVENT_PLAYER_LEAVE_UNIT event. +-- @param #EVENT self +-- @param #function EventFunction The function to be called when the event occurs for the unit. +-- @param Base#BASE EventSelf The self instance of the class for which the event is. +-- @return #EVENT +function EVENT:OnPlayerLeaveUnit( EventFunction, EventSelf ) + self:F2() + + self:OnEventGeneric( EventFunction, EventSelf, world.event.S_EVENT_PLAYER_LEAVE_UNIT ) + + return self +end + + + +function EVENT:onEvent( Event ) + self:F2( { _EVENTCODES[Event.id], Event } ) + + if self and self.Events and self.Events[Event.id] then + if Event.initiator and Event.initiator:getCategory() == Object.Category.UNIT then + Event.IniDCSUnit = Event.initiator + Event.IniDCSGroup = Event.IniDCSUnit:getGroup() + Event.IniDCSUnitName = Event.IniDCSUnit:getName() + Event.IniDCSGroupName = "" + if Event.IniDCSGroup and Event.IniDCSGroup:isExist() then + Event.IniDCSGroupName = Event.IniDCSGroup:getName() + end + end + if Event.target then + if Event.target and Event.target:getCategory() == Object.Category.UNIT then + Event.TgtDCSUnit = Event.target + Event.TgtDCSGroup = Event.TgtDCSUnit:getGroup() + Event.TgtDCSUnitName = Event.TgtDCSUnit:getName() + Event.TgtDCSGroupName = "" + if Event.TgtDCSGroup and Event.TgtDCSGroup:isExist() then + Event.TgtDCSGroupName = Event.TgtDCSGroup:getName() + end + end + end + if Event.weapon then + Event.Weapon = Event.weapon + Event.WeaponName = Event.Weapon:getTypeName() + --Event.WeaponTgtDCSUnit = Event.Weapon:getTarget() + end + self:E( { _EVENTCODES[Event.id], Event } ) + for ClassName, EventData in pairs( self.Events[Event.id] ) do + if Event.IniDCSUnitName and EventData.IniUnit and EventData.IniUnit[Event.IniDCSUnitName] then + self:T2( { "Calling event function for class ", ClassName, " unit ", Event.IniDCSUnitName } ) + EventData.IniUnit[Event.IniDCSUnitName].EventFunction( EventData.IniUnit[Event.IniDCSUnitName].EventSelf, Event ) + else + if Event.IniDCSUnit and not EventData.IniUnit then + self:T2( { "Calling event function for class ", ClassName } ) + EventData.EventFunction( EventData.EventSelf, Event ) + end + end + end + end +end + +--- Encapsulation of DCS World Menu system in a set of MENU classes. +-- @module Menu + +Include.File( "Routines" ) +Include.File( "Base" ) + +--- The MENU class +-- @type MENU +-- @extends Base#BASE +MENU = { + ClassName = "MENU", + MenuPath = nil, + MenuText = "", + MenuParentPath = nil +} + +--- +function MENU:New( MenuText, MenuParentPath ) + + -- Arrange meta tables + local Child = BASE:Inherit( self, BASE:New() ) + + Child.MenuPath = nil + Child.MenuText = MenuText + Child.MenuParentPath = MenuParentPath + return Child +end + +--- The COMMANDMENU class +-- @type COMMANDMENU +-- @extends Menu#MENU +COMMANDMENU = { + ClassName = "COMMANDMENU", + CommandMenuFunction = nil, + CommandMenuArgument = nil +} + +function COMMANDMENU:New( MenuText, ParentMenu, CommandMenuFunction, CommandMenuArgument ) + + -- Arrange meta tables + + local MenuParentPath = nil + if ParentMenu ~= nil then + MenuParentPath = ParentMenu.MenuPath + end + + local Child = BASE:Inherit( self, MENU:New( MenuText, MenuParentPath ) ) + + Child.MenuPath = missionCommands.addCommand( MenuText, MenuParentPath, CommandMenuFunction, CommandMenuArgument ) + Child.CommandMenuFunction = CommandMenuFunction + Child.CommandMenuArgument = CommandMenuArgument + return Child +end + +--- The SUBMENU class +-- @type SUBMENU +-- @extends Menu#MENU +SUBMENU = { + ClassName = "SUBMENU" +} + +function SUBMENU:New( MenuText, ParentMenu ) + + -- Arrange meta tables + local MenuParentPath = nil + if ParentMenu ~= nil then + MenuParentPath = ParentMenu.MenuPath + end + + local Child = BASE:Inherit( self, MENU:New( MenuText, MenuParentPath ) ) + + Child.MenuPath = missionCommands.addSubMenu( MenuText, MenuParentPath ) + return Child +end + +-- This local variable is used to cache the menus registered under clients. +-- Menus don't dissapear when clients are destroyed and restarted. +-- So every menu for a client created must be tracked so that program logic accidentally does not create +-- the same menus twice during initialization logic. +-- These menu classes are handling this logic with this variable. +local _MENUCLIENTS = {} + +--- The MENU_CLIENT class +-- @type MENU_CLIENT +-- @extends Menu#MENU +MENU_CLIENT = { + ClassName = "MENU_CLIENT" +} + +--- Creates a new menu item for a group +-- @param self +-- @param Client#CLIENT MenuClient The Client owning the menu. +-- @param #string MenuText The text for the menu. +-- @param #table ParentMenu The parent menu. +-- @return #MENU_CLIENT self +function MENU_CLIENT:New( MenuClient, MenuText, ParentMenu ) + + -- Arrange meta tables + local MenuParentPath = {} + if ParentMenu ~= nil then + MenuParentPath = ParentMenu.MenuPath + end + + local self = BASE:Inherit( self, MENU:New( MenuText, MenuParentPath ) ) + self:F( { MenuClient, MenuText, ParentMenu } ) + + self.MenuClient = MenuClient + self.MenuClientGroupID = MenuClient:GetClientGroupID() + self.MenuParentPath = MenuParentPath + self.MenuText = MenuText + self.ParentMenu = ParentMenu + + self.Menus = {} + + if not _MENUCLIENTS[self.MenuClientGroupID] then + _MENUCLIENTS[self.MenuClientGroupID] = {} + end + + local MenuPath = _MENUCLIENTS[self.MenuClientGroupID] + + self:T( { MenuClient:GetClientGroupName(), MenuPath[table.concat(MenuParentPath)], MenuParentPath, MenuText } ) + + local MenuPathID = table.concat(MenuParentPath) .. "/" .. MenuText + if MenuPath[MenuPathID] then + missionCommands.removeItemForGroup( self.MenuClient:GetClientGroupID(), MenuPath[MenuPathID] ) + end + + self.MenuPath = missionCommands.addSubMenuForGroup( self.MenuClient:GetClientGroupID(), MenuText, MenuParentPath ) + MenuPath[MenuPathID] = self.MenuPath + + self:T( { MenuClient:GetClientGroupName(), self.MenuPath } ) + + if ParentMenu and ParentMenu.Menus then + ParentMenu.Menus[self.MenuPath] = self + end + return self +end + +--- Removes the sub menus recursively of this MENU_CLIENT. +-- @param #MENU_CLIENT self +-- @return #MENU_CLIENT self +function MENU_CLIENT:RemoveSubMenus() + self:F( self.MenuPath ) + + for MenuID, Menu in pairs( self.Menus ) do + Menu:Remove() + end + +end + +--- Removes the sub menus recursively of this MENU_CLIENT. +-- @param #MENU_CLIENT self +-- @return #MENU_CLIENT self +function MENU_CLIENT:Remove() + self:F( self.MenuPath ) + + self:RemoveSubMenus() + + if not _MENUCLIENTS[self.MenuClientGroupID] then + _MENUCLIENTS[self.MenuClientGroupID] = {} + end + + local MenuPath = _MENUCLIENTS[self.MenuClientGroupID] + + if MenuPath[table.concat(self.MenuParentPath) .. "/" .. self.MenuText] then + MenuPath[table.concat(self.MenuParentPath) .. "/" .. self.MenuText] = nil + end + + missionCommands.removeItemForGroup( self.MenuClient:GetClientGroupID(), self.MenuPath ) + self.ParentMenu.Menus[self.MenuPath] = nil + return nil +end + + +--- The MENU_CLIENT_COMMAND class +-- @type MENU_CLIENT_COMMAND +-- @extends Menu#MENU +MENU_CLIENT_COMMAND = { + ClassName = "MENU_CLIENT_COMMAND" +} + +--- Creates a new radio command item for a group +-- @param self +-- @param Client#CLIENT MenuClient The Client owning the menu. +-- @param MenuText The text for the menu. +-- @param ParentMenu The parent menu. +-- @param CommandMenuFunction A function that is called when the menu key is pressed. +-- @param CommandMenuArgument An argument for the function. +-- @return Menu#MENU_CLIENT_COMMAND self +function MENU_CLIENT_COMMAND:New( MenuClient, MenuText, ParentMenu, CommandMenuFunction, CommandMenuArgument ) + + -- Arrange meta tables + + local MenuParentPath = {} + if ParentMenu ~= nil then + MenuParentPath = ParentMenu.MenuPath + end + + local self = BASE:Inherit( self, MENU:New( MenuText, MenuParentPath ) ) + + self.MenuClient = MenuClient + self.MenuClientGroupID = MenuClient:GetClientGroupID() + self.MenuParentPath = MenuParentPath + self.MenuText = MenuText + self.ParentMenu = ParentMenu + + if not _MENUCLIENTS[self.MenuClientGroupID] then + _MENUCLIENTS[self.MenuClientGroupID] = {} + end + + local MenuPath = _MENUCLIENTS[self.MenuClientGroupID] + + self:T( { MenuClient:GetClientGroupName(), MenuPath[table.concat(MenuParentPath)], MenuParentPath, MenuText, CommandMenuFunction, CommandMenuArgument } ) + + local MenuPathID = table.concat(MenuParentPath) .. "/" .. MenuText + if MenuPath[MenuPathID] then + missionCommands.removeItemForGroup( self.MenuClient:GetClientGroupID(), MenuPath[MenuPathID] ) + end + + self.MenuPath = missionCommands.addCommandForGroup( self.MenuClient:GetClientGroupID(), MenuText, MenuParentPath, CommandMenuFunction, CommandMenuArgument ) + MenuPath[MenuPathID] = self.MenuPath + + self.CommandMenuFunction = CommandMenuFunction + self.CommandMenuArgument = CommandMenuArgument + + ParentMenu.Menus[self.MenuPath] = self + + return self +end + +function MENU_CLIENT_COMMAND:Remove() + self:F( self.MenuPath ) + + if not _MENUCLIENTS[self.MenuClientGroupID] then + _MENUCLIENTS[self.MenuClientGroupID] = {} + end + + local MenuPath = _MENUCLIENTS[self.MenuClientGroupID] + + if MenuPath[table.concat(self.MenuParentPath) .. "/" .. self.MenuText] then + MenuPath[table.concat(self.MenuParentPath) .. "/" .. self.MenuText] = nil + end + + missionCommands.removeItemForGroup( self.MenuClient:GetClientGroupID(), self.MenuPath ) + self.ParentMenu.Menus[self.MenuPath] = nil + return nil +end + + +--- The MENU_COALITION class +-- @type MENU_COALITION +-- @extends Menu#MENU +MENU_COALITION = { + ClassName = "MENU_COALITION" +} + +--- Creates a new coalition menu item +-- @param #MENU_COALITION self +-- @param DCSCoalition#coalition.side MenuCoalition The coalition owning the menu. +-- @param #string MenuText The text for the menu. +-- @param #table ParentMenu The parent menu. +-- @return #MENU_COALITION self +function MENU_COALITION:New( MenuCoalition, MenuText, ParentMenu ) + + -- Arrange meta tables + local MenuParentPath = {} + if ParentMenu ~= nil then + MenuParentPath = ParentMenu.MenuPath + end + + local self = BASE:Inherit( self, MENU:New( MenuText, MenuParentPath ) ) + self:F( { MenuCoalition, MenuText, ParentMenu } ) + + self.MenuCoalition = MenuCoalition + self.MenuParentPath = MenuParentPath + self.MenuText = MenuText + self.ParentMenu = ParentMenu + + self.Menus = {} + + self:T( { MenuParentPath, MenuText } ) + + self.MenuPath = missionCommands.addSubMenuForCoalition( self.MenuCoalition, MenuText, MenuParentPath ) + + self:T( { self.MenuPath } ) + + if ParentMenu and ParentMenu.Menus then + ParentMenu.Menus[self.MenuPath] = self + end + return self +end + +--- Removes the sub menus recursively of this MENU_COALITION. +-- @param #MENU_COALITION self +-- @return #MENU_COALITION self +function MENU_COALITION:RemoveSubMenus() + self:F( self.MenuPath ) + + for MenuID, Menu in pairs( self.Menus ) do + Menu:Remove() + end + +end + +--- Removes the sub menus recursively of this MENU_COALITION. +-- @param #MENU_COALITION self +-- @return #MENU_COALITION self +function MENU_COALITION:Remove() + self:F( self.MenuPath ) + + self:RemoveSubMenus() + missionCommands.removeItemForCoalition( self.MenuCoalition, self.MenuPath ) + self.ParentMenu.Menus[self.MenuPath] = nil + + return nil +end + + +--- The MENU_COALITION_COMMAND class +-- @type MENU_COALITION_COMMAND +-- @extends Menu#MENU +MENU_COALITION_COMMAND = { + ClassName = "MENU_COALITION_COMMAND" +} + +--- Creates a new radio command item for a group +-- @param #MENU_COALITION_COMMAND self +-- @param DCSCoalition#coalition.side MenuCoalition The coalition owning the menu. +-- @param MenuText The text for the menu. +-- @param ParentMenu The parent menu. +-- @param CommandMenuFunction A function that is called when the menu key is pressed. +-- @param CommandMenuArgument An argument for the function. +-- @return #MENU_COALITION_COMMAND self +function MENU_COALITION_COMMAND:New( MenuCoalition, MenuText, ParentMenu, CommandMenuFunction, CommandMenuArgument ) + + -- Arrange meta tables + + local MenuParentPath = {} + if ParentMenu ~= nil then + MenuParentPath = ParentMenu.MenuPath + end + + local self = BASE:Inherit( self, MENU:New( MenuText, MenuParentPath ) ) + + self.MenuCoalition = MenuCoalition + self.MenuParentPath = MenuParentPath + self.MenuText = MenuText + self.ParentMenu = ParentMenu + + self:T( { MenuParentPath, MenuText, CommandMenuFunction, CommandMenuArgument } ) + + self.MenuPath = missionCommands.addCommandForCoalition( self.MenuCoalition, MenuText, MenuParentPath, CommandMenuFunction, CommandMenuArgument ) + + self.CommandMenuFunction = CommandMenuFunction + self.CommandMenuArgument = CommandMenuArgument + + ParentMenu.Menus[self.MenuPath] = self + + return self +end + +--- Removes a radio command item for a coalition +-- @param #MENU_COALITION_COMMAND self +-- @return #MENU_COALITION_COMMAND self +function MENU_COALITION_COMMAND:Remove() + self:F( self.MenuPath ) + + missionCommands.removeItemForCoalition( self.MenuCoalition, self.MenuPath ) + self.ParentMenu.Menus[self.MenuPath] = nil + return nil +end +--- GROUP class. +-- +-- @{GROUP} class +-- ============== +-- The @{GROUP} class is a wrapper class to handle the DCS Group objects: +-- +-- * Support all DCS Group APIs. +-- * Enhance with Group specific APIs not in the DCS Group API set. +-- * Handle local Group Controller. +-- * Manage the "state" of the DCS Group. +-- +-- +-- GROUP reference methods +-- ======================= +-- For each DCS Group object alive within a running mission, a GROUP wrapper object (instance) will be created within the _@{DATABASE} object. +-- This is done at the beginning of the mission (when the mission starts), and dynamically when new DCS Group objects are spawned (using the @{SPAWN} class). +-- +-- The GROUP class does not contain a :New() method, rather it provides :Find() methods to retrieve the object reference +-- using the DCS Group or the DCS GroupName. +-- +-- Another thing to know is that GROUP objects do not "contain" the DCS Group object. +-- The GROUP methods will reference the DCS Group object by name when it is needed during API execution. +-- If the DCS Group object does not exist or is nil, the GROUP methods will return nil and log an exception in the DCS.log file. +-- +-- The GROUP class provides the following functions to retrieve quickly the relevant GROUP instance: +-- +-- * @{#GROUP.Find}(): Find a GROUP instance from the _DATABASE object using a DCS Group object. +-- * @{#GROUP.FindByName}(): Find a GROUP instance from the _DATABASE object using a DCS Group name. +-- +-- IMPORTANT: ONE SHOULD NEVER SANATIZE these GROUP OBJECT REFERENCES! (make the GROUP object references nil). +-- @module Group +-- @author FlightControl + +Include.File( "Routines" ) +Include.File( "Base" ) +Include.File( "Message" ) +Include.File( "Unit" ) + +--- The GROUP class +-- @type GROUP +-- @extends Base#BASE +-- @field DCSGroup#Group DCSGroup The DCS group class. +-- @field #string GroupName The name of the group. +GROUP = { + ClassName = "GROUP", + GroupName = "", + GroupID = 0, + Controller = nil, + DCSGroup = nil, + WayPointFunctions = {}, +} + +--- A DCSGroup +-- @type DCSGroup +-- @field id_ The ID of the group in DCS + +--- Create a new GROUP from a DCSGroup +-- @param #GROUP self +-- @param DCSGroup#Group GroupName The DCS Group name +-- @return #GROUP self +function GROUP:Register( GroupName ) + local self = BASE:Inherit( self, BASE:New() ) + self:F2( GroupName ) + self.GroupName = GroupName + return self +end + +-- Reference methods. + +--- Find the GROUP wrapper class instance using the DCS Group. +-- @param #GROUP self +-- @param DCSGroup#Group DCSGroup The DCS Group. +-- @return #GROUP The GROUP. +function GROUP:Find( DCSGroup ) + + local GroupName = DCSGroup:getName() -- Group#GROUP + local GroupFound = _DATABASE:FindGroup( GroupName ) + return GroupFound +end + +--- Find the created GROUP using the DCS Group Name. +-- @param #GROUP self +-- @param #string GroupName The DCS Group Name. +-- @return #GROUP The GROUP. +function GROUP:FindByName( GroupName ) + + local GroupFound = _DATABASE:FindGroup( GroupName ) + return GroupFound +end + +-- DCS Group methods support. + +--- Returns the DCS Group. +-- @param #GROUP self +-- @return DCSGroup#Group The DCS Group. +function GROUP:GetDCSGroup() + local DCSGroup = Group.getByName( self.GroupName ) + + if DCSGroup then + return DCSGroup + end + + return nil +end + + +--- Returns if the DCS Group is alive. +-- When the group exists at run-time, this method will return true, otherwise false. +-- @param #GROUP self +-- @return #boolean true if the DCS Group is alive. +function GROUP:IsAlive() + self:F2( self.GroupName ) + + local DCSGroup = self:GetDCSGroup() + + if DCSGroup then + local GroupIsAlive = DCSGroup:isExist() + self:T3( GroupIsAlive ) + return GroupIsAlive + end + + return nil +end + +--- Destroys the DCS Group and all of its DCS Units. +-- Note that this destroy method also raises a destroy event at run-time. +-- So all event listeners will catch the destroy event of this DCS Group. +-- @param #GROUP self +function GROUP:Destroy() + self:F2( self.GroupName ) + + local DCSGroup = self:GetDCSGroup() + + if DCSGroup then + for Index, UnitData in pairs( DCSGroup:getUnits() ) do + self:CreateEventCrash( timer.getTime(), UnitData ) + end + DCSGroup:destroy() + DCSGroup = nil + end + + return nil +end + +--- Returns category of the DCS Group. +-- @param #GROUP self +-- @return DCSGroup#Group.Category The category ID +function GROUP:GetCategory() + self:F2( self.GroupName ) + + local DCSGroup = self:GetDCSGroup() + if DCSGroup then + local GroupCategory = DCSGroup:getCategory() + self:T3( GroupCategory ) + return GroupCategory + end + + return nil +end + +--- Returns the category name of the DCS Group. +-- @param #GROUP self +-- @return #string Category name = Helicopter, Airplane, Ground Unit, Ship +function GROUP:GetCategoryName() + self:F2( self.GroupName ) + + local DCSGroup = self:GetDCSGroup() + if DCSGroup then + local CategoryNames = { + [Group.Category.AIRPLANE] = "Airplane", + [Group.Category.HELICOPTER] = "Helicopter", + [Group.Category.GROUND] = "Ground Unit", + [Group.Category.SHIP] = "Ship", + } + local GroupCategory = DCSGroup:getCategory() + self:T3( GroupCategory ) + + return CategoryNames[GroupCategory] + end + + return nil +end + + +--- Returns the coalition of the DCS Group. +-- @param #GROUP self +-- @return DCSCoalitionObject#coalition.side The coalition side of the DCS Group. +function GROUP:GetCoalition() + self:F2( self.GroupName ) + + local DCSGroup = self:GetDCSGroup() + if DCSGroup then + local GroupCoalition = DCSGroup:getCoalition() + self:T3( GroupCoalition ) + return GroupCoalition + end + + return nil +end + +--- Returns the country of the DCS Group. +-- @param #GROUP self +-- @return DCScountry#country.id The country identifier. +-- @return #nil The DCS Group is not existing or alive. +function GROUP:GetCountry() + self:F2( self.GroupName ) + + local DCSGroup = self:GetDCSGroup() + if DCSGroup then + local GroupCountry = DCSGroup:getUnit(1):getCountry() + self:T3( GroupCountry ) + return GroupCountry + end + + return nil +end + +--- Returns the name of the DCS Group. +-- @param #GROUP self +-- @return #string The DCS Group name. +function GROUP:GetName() + self:F2( self.GroupName ) + + local DCSGroup = self:GetDCSGroup() + + if DCSGroup then + local GroupName = DCSGroup:getName() + self:T3( GroupName ) + return GroupName + end + + return nil +end + +--- Returns the DCS Group identifier. +-- @param #GROUP self +-- @return #number The identifier of the DCS Group. +function GROUP:GetID() + self:F2( self.GroupName ) + + local DCSGroup = self:GetDCSGroup() + + if DCSGroup then + local GroupID = DCSGroup:getID() + self:T3( GroupID ) + return GroupID + end + + return nil +end + +--- Returns the UNIT wrapper class with number UnitNumber. +-- If the underlying DCS Unit does not exist, the method will return nil. . +-- @param #GROUP self +-- @param #number UnitNumber The number of the UNIT wrapper class to be returned. +-- @return Unit#UNIT The UNIT wrapper class. +function GROUP:GetUnit( UnitNumber ) + self:F2( { self.GroupName, UnitNumber } ) + + local DCSGroup = self:GetDCSGroup() + + if DCSGroup then + local UnitFound = UNIT:Find( DCSGroup:getUnit( UnitNumber ) ) + self:T3( UnitFound.UnitName ) + self:T2( UnitFound ) + return UnitFound + end + + return nil +end + +--- Returns the DCS Unit with number UnitNumber. +-- If the underlying DCS Unit does not exist, the method will return nil. . +-- @param #GROUP self +-- @param #number UnitNumber The number of the DCS Unit to be returned. +-- @return DCSUnit#Unit The DCS Unit. +function GROUP:GetDCSUnit( UnitNumber ) + self:F2( { self.GroupName, UnitNumber } ) + + local DCSGroup = self:GetDCSGroup() + + if DCSGroup then + local DCSUnitFound = DCSGroup:getUnit( UnitNumber ) + self:T3( DCSUnitFound ) + return DCSUnitFound + end + + return nil +end + +--- Returns current size of the DCS Group. +-- If some of the DCS Units of the DCS Group are destroyed the size of the DCS Group is changed. +-- @param #GROUP self +-- @return #number The DCS Group size. +function GROUP:GetSize() + self:F2( { self.GroupName } ) + local DCSGroup = self:GetDCSGroup() + + if DCSGroup then + local GroupSize = DCSGroup:getSize() + self:T3( GroupSize ) + return GroupSize + end + + return nil +end + +--- +--- Returns the initial size of the DCS Group. +-- If some of the DCS Units of the DCS Group are destroyed, the initial size of the DCS Group is unchanged. +-- @param #GROUP self +-- @return #number The DCS Group initial size. +function GROUP:GetInitialSize() + self:F2( { self.GroupName } ) + local DCSGroup = self:GetDCSGroup() + + if DCSGroup then + local GroupInitialSize = DCSGroup:getInitialSize() + self:T3( GroupInitialSize ) + return GroupInitialSize + end + + return nil +end + +--- Returns the UNITs wrappers of the DCS Units of the DCS Group. +-- @param #GROUP self +-- @return #table The UNITs wrappers. +function GROUP:GetUnits() + self:F2( { self.GroupName } ) + local DCSGroup = self:GetDCSGroup() + + if DCSGroup then + local DCSUnits = DCSGroup:getUnits() + local Units = {} + for Index, UnitData in pairs( DCSUnits ) do + Units[#Units+1] = UNIT:Find( UnitData ) + end + self:T3( Units ) + return Units + end + + return nil +end + + +--- Returns the DCS Units of the DCS Group. +-- @param #GROUP self +-- @return #table The DCS Units. +function GROUP:GetDCSUnits() + self:F2( { self.GroupName } ) + local DCSGroup = self:GetDCSGroup() + + if DCSGroup then + local DCSUnits = DCSGroup:getUnits() + self:T3( DCSUnits ) + return DCSUnits + end + + return nil +end + +--- Get the controller for the GROUP. +-- @param #GROUP self +-- @return DCSController#Controller +function GROUP:_GetController() + self:F2( { self.GroupName } ) + local DCSGroup = self:GetDCSGroup() + + if DCSGroup then + local GroupController = DCSGroup:getController() + self:T3( GroupController ) + return GroupController + end + + return nil +end + + +--- Retrieve the group mission and allow to place function hooks within the mission waypoint plan. +-- Use the method @{Group#GROUP:WayPointFunction} to define the hook functions for specific waypoints. +-- Use the method @{Group@GROUP:WayPointExecute) to start the execution of the new mission plan. +-- Note that when WayPointInitialize is called, the Mission of the group is RESTARTED! +-- @param #GROUP self +-- @return #GROUP +function GROUP:WayPointInitialize() + + self.WayPoints = self:GetTaskRoute() + + return self +end + + +--- Registers a waypoint function that will be executed when the group moves over the WayPoint. +-- @param #GROUP self +-- @param #number WayPoint The waypoint number. Note that the start waypoint on the route is WayPoint 1! +-- @param #number WayPointIndex When defining multiple WayPoint functions for one WayPoint, use WayPointIndex to set the sequence of actions. +-- @param #function WayPointFunction The waypoint function to be called when the group moves over the waypoint. The waypoint function takes variable parameters. +-- @return #GROUP +function GROUP:WayPointFunction( WayPoint, WayPointIndex, WayPointFunction, ... ) + self:F2( { WayPoint, WayPointIndex, WayPointFunction } ) + + table.insert( self.WayPoints[WayPoint].task.params.tasks, WayPointIndex ) + self.WayPoints[WayPoint].task.params.tasks[WayPointIndex] = self:TaskFunction( WayPoint, WayPointIndex, WayPointFunction, arg ) + return self +end + + +function GROUP:TaskFunction( WayPoint, WayPointIndex, FunctionString, FunctionArguments ) + + local DCSTask + + local DCSScript = {} + DCSScript[#DCSScript+1] = "local MissionGroup = GROUP:Find( ... ) " + + if FunctionArguments.n > 0 then + DCSScript[#DCSScript+1] = FunctionString .. "( MissionGroup, " .. table.concat( FunctionArguments, "," ) .. ")" + else + DCSScript[#DCSScript+1] = FunctionString .. "( MissionGroup )" + end + + DCSTask = self:TaskWrappedAction( + self:CommandDoScript( + table.concat( DCSScript ) + ), WayPointIndex + ) + + self:T3( DCSTask ) + + return DCSTask + +end + + + +--- Executes the WayPoint plan. +-- The function gets a WayPoint parameter, that you can use to restart the mission at a specific WayPoint. +-- Note that when the WayPoint parameter is used, the new start mission waypoint of the group will be 1! +-- @param #GROUP self +-- @param #number WayPoint The WayPoint from where to execute the mission. +-- @param #number WaitTime The amount seconds to wait before initiating the mission. +-- @return #GROUP +function GROUP:WayPointExecute( WayPoint, WaitTime ) + + if not WayPoint then + WayPoint = 1 + end + + -- When starting the mission from a certain point, the TaskPoints need to be deleted before the given WayPoint. + for TaskPointID = 1, WayPoint - 1 do + table.remove( self.WayPoints, 1 ) + end + + self:T3( self.WayPoints ) + + self:SetTask( self:TaskRoute( self.WayPoints ), WaitTime ) + + return self +end + + +--- Activates a GROUP. +-- @param #GROUP self +function GROUP:Activate() + self:F2( { self.GroupName } ) + trigger.action.activateGroup( self:GetDCSGroup() ) + return self:GetDCSGroup() +end + + +--- Gets the type name of the group. +-- @param #GROUP self +-- @return #string The type name of the group. +function GROUP:GetTypeName() + self:F2( self.GroupName ) + + local DCSGroup = self:GetDCSGroup() + + if DCSGroup then + local GroupTypeName = DCSGroup:getUnit(1):getTypeName() + self:T3( GroupTypeName ) + return( GroupTypeName ) + end + + return nil +end + +--- Gets the CallSign of the first DCS Unit of the DCS Group. +-- @param #GROUP self +-- @return #string The CallSign of the first DCS Unit of the DCS Group. +function GROUP:GetCallsign() + self:F2( self.GroupName ) + + local DCSGroup = self:GetDCSGroup() + + if DCSGroup then + local GroupCallSign = DCSGroup:getUnit(1):getCallsign() + self:T3( GroupCallSign ) + return GroupCallSign + end + + return nil +end + +--- Returns the current point (Vec2 vector) of the first DCS Unit in the DCS Group. +-- @return DCSTypes#Vec2 Current Vec2 point of the first DCS Unit of the DCS Group. +function GROUP:GetPointVec2() + self:F2( self.GroupName ) + + local GroupPointVec2 = self:GetUnit(1):GetPointVec2() + self:T3( GroupPointVec2 ) + return GroupPointVec2 +end + +--- Returns the current point (Vec3 vector) of the first DCS Unit in the DCS Group. +-- @return DCSTypes#Vec3 Current Vec3 point of the first DCS Unit of the DCS Group. +function GROUP:GetPointVec3() + self:F2( self.GroupName ) + + local GroupPointVec3 = self:GetUnit(1):GetPointVec3() + self:T3( GroupPointVec3 ) + return GroupPointVec3 +end + + + +-- Is Functions + +--- Returns if all units of the group are within a @{Zone#ZONE}. +-- @param #GROUP self +-- @param Zone#ZONE_BASE Zone The zone to test. +-- @return #boolean Returns true if the Group is completely within the @{Zone#ZONE} +function GROUP:IsCompletelyInZone( Zone ) + self:F2( { self.GroupName, Zone } ) + + for UnitID, UnitData in pairs( self:GetUnits() ) do + local Unit = UnitData -- Unit#UNIT + if Zone:IsPointVec3InZone( Unit:GetPointVec3() ) then + else + return false + end + end + + return true +end + +--- Returns if the group is of an air category. +-- If the group is a helicopter or a plane, then this method will return true, otherwise false. +-- @param #GROUP self +-- @return #boolean Air category evaluation result. +function GROUP:IsAir() + self:F2( self.GroupName ) + + local DCSGroup = self:GetDCSGroup() + + if DCSGroup then + local IsAirResult = DCSGroup:getCategory() == Group.Category.AIRPLANE or DCSGroup:getCategory() == Group.Category.HELICOPTER + self:T3( IsAirResult ) + return IsAirResult + end + + return nil +end + +--- Returns if the DCS Group contains Helicopters. +-- @param #GROUP self +-- @return #boolean true if DCS Group contains Helicopters. +function GROUP:IsHelicopter() + self:F2( self.GroupName ) + + local DCSGroup = self:GetDCSGroup() + + if DCSGroup then + local GroupCategory = DCSGroup:getCategory() + self:T2( GroupCategory ) + return GroupCategory == Group.Category.HELICOPTER + end + + return nil +end + +--- Returns if the DCS Group contains AirPlanes. +-- @param #GROUP self +-- @return #boolean true if DCS Group contains AirPlanes. +function GROUP:IsAirPlane() + self:F2() + + local DCSGroup = self:GetDCSGroup() + + if DCSGroup then + local GroupCategory = DCSGroup:getCategory() + self:T2( GroupCategory ) + return GroupCategory == Group.Category.AIRPLANE + end + + return nil +end + +--- Returns if the DCS Group contains Ground troops. +-- @param #GROUP self +-- @return #boolean true if DCS Group contains Ground troops. +function GROUP:IsGround() + self:F2() + + local DCSGroup = self:GetDCSGroup() + + if DCSGroup then + local GroupCategory = DCSGroup:getCategory() + self:T2( GroupCategory ) + return GroupCategory == Group.Category.GROUND + end + + return nil +end + +--- Returns if the DCS Group contains Ships. +-- @param #GROUP self +-- @return #boolean true if DCS Group contains Ships. +function GROUP:IsShip() + self:F2() + + local DCSGroup = self:GetDCSGroup() + + if DCSGroup then + local GroupCategory = DCSGroup:getCategory() + self:T2( GroupCategory ) + return GroupCategory == Group.Category.SHIP + end + + return nil +end + +--- Returns if all units of the group are on the ground or landed. +-- If all units of this group are on the ground, this function will return true, otherwise false. +-- @param #GROUP self +-- @return #boolean All units on the ground result. +function GROUP:AllOnGround() + self:F2() + + local DCSGroup = self:GetDCSGroup() + + if DCSGroup then + local AllOnGroundResult = true + + for Index, UnitData in pairs( DCSGroup:getUnits() ) do + if UnitData:inAir() then + AllOnGroundResult = false + end + end + + self:T3( AllOnGroundResult ) + return AllOnGroundResult + end + + return nil +end + +--- Returns the current maximum velocity of the group. +-- Each unit within the group gets evaluated, and the maximum velocity (= the unit which is going the fastest) is returned. +-- @param #GROUP self +-- @return #number Maximum velocity found. +function GROUP:GetMaxVelocity() + self:F2() + + local DCSGroup = self:GetDCSGroup() + + if DCSGroup then + local MaxVelocity = 0 + + for Index, UnitData in pairs( DCSGroup:getUnits() ) do + + local Velocity = UnitData:getVelocity() + local VelocityTotal = math.abs( Velocity.x ) + math.abs( Velocity.y ) + math.abs( Velocity.z ) + + if VelocityTotal < MaxVelocity then + MaxVelocity = VelocityTotal + end + end + + return MaxVelocity + end + + return nil +end + +--- Returns the current minimum height of the group. +-- Each unit within the group gets evaluated, and the minimum height (= the unit which is the lowest elevated) is returned. +-- @param #GROUP self +-- @return #number Minimum height found. +function GROUP:GetMinHeight() + self:F2() + +end + +--- Returns the current maximum height of the group. +-- Each unit within the group gets evaluated, and the maximum height (= the unit which is the highest elevated) is returned. +-- @param #GROUP self +-- @return #number Maximum height found. +function GROUP:GetMaxHeight() + self:F2() + +end + +-- Tasks + +--- Popping current Task from the group. +-- @param #GROUP self +-- @return Group#GROUP self +function GROUP:PopCurrentTask() + self:F2() + + local DCSGroup = self:GetDCSGroup() + + if DCSGroup then + local Controller = self:_GetController() + Controller:popTask() + return self + end + + return nil +end + +--- Pushing Task on the queue from the group. +-- @param #GROUP self +-- @return Group#GROUP self +function GROUP:PushTask( DCSTask, WaitTime ) + self:F2() + + local DCSGroup = self:GetDCSGroup() + + if DCSGroup then + local Controller = self:_GetController() + + -- When a group SPAWNs, it takes about a second to get the group in the simulator. Setting tasks to unspawned groups provides unexpected results. + -- Therefore we schedule the functions to set the mission and options for the Group. + -- Controller:pushTask( DCSTask ) + + if WaitTime then + --routines.scheduleFunction( Controller.pushTask, { Controller, DCSTask }, timer.getTime() + WaitTime ) + SCHEDULER:New( Controller, Controller.pushTask, { DCSTask }, WaitTime ) + else + Controller:pushTask( DCSTask ) + end + + return self + end + + return nil +end + +--- Clearing the Task Queue and Setting the Task on the queue from the group. +-- @param #GROUP self +-- @return Group#GROUP self +function GROUP:SetTask( DCSTask, WaitTime ) + self:F2( { DCSTask } ) + + local DCSGroup = self:GetDCSGroup() + + if DCSGroup then + + local Controller = self:_GetController() + + -- When a group SPAWNs, it takes about a second to get the group in the simulator. Setting tasks to unspawned groups provides unexpected results. + -- Therefore we schedule the functions to set the mission and options for the Group. + -- Controller.setTask( Controller, DCSTask ) + + if not WaitTime then + WaitTime = 1 + end + --routines.scheduleFunction( Controller.setTask, { Controller, DCSTask }, timer.getTime() + WaitTime ) + SCHEDULER:New( Controller, Controller.setTask, { DCSTask }, WaitTime ) + + return self + end + + return nil +end + + +--- Return a condition section for a controlled task +-- @param #GROUP self +-- @param DCSTime#Time time +-- @param #string userFlag +-- @param #boolean userFlagValue +-- @param #string condition +-- @param DCSTime#Time duration +-- @param #number lastWayPoint +-- return DCSTask#Task +function GROUP:TaskCondition( time, userFlag, userFlagValue, condition, duration, lastWayPoint ) + self:F2( { time, userFlag, userFlagValue, condition, duration, lastWayPoint } ) + + local DCSStopCondition = {} + DCSStopCondition.time = time + DCSStopCondition.userFlag = userFlag + DCSStopCondition.userFlagValue = userFlagValue + DCSStopCondition.condition = condition + DCSStopCondition.duration = duration + DCSStopCondition.lastWayPoint = lastWayPoint + + self:T3( { DCSStopCondition } ) + return DCSStopCondition +end + +--- Return a Controlled Task taking a Task and a TaskCondition +-- @param #GROUP self +-- @param DCSTask#Task DCSTask +-- @param #DCSStopCondition DCSStopCondition +-- @return DCSTask#Task +function GROUP:TaskControlled( DCSTask, DCSStopCondition ) + self:F2( { DCSTask, DCSStopCondition } ) + + local DCSTaskControlled + + DCSTaskControlled = { + id = 'ControlledTask', + params = { + task = DCSTask, + stopCondition = DCSStopCondition + } + } + + self:T3( { DCSTaskControlled } ) + return DCSTaskControlled +end + +--- Return a Combo Task taking an array of Tasks +-- @param #GROUP self +-- @param DCSTask#TaskArray DCSTasks Array of @{DCSTask#Task} +-- @return DCSTask#Task +function GROUP:TaskCombo( DCSTasks ) + self:F2( { DCSTasks } ) + + local DCSTaskCombo + + DCSTaskCombo = { + id = 'ComboTask', + params = { + tasks = DCSTasks + } + } + + self:T3( { DCSTaskCombo } ) + return DCSTaskCombo +end + +--- Return a WrappedAction Task taking a Command +-- @param #GROUP self +-- @param DCSCommand#Command DCSCommand +-- @return DCSTask#Task +function GROUP:TaskWrappedAction( DCSCommand, Index ) + self:F2( { DCSCommand } ) + + local DCSTaskWrappedAction + + DCSTaskWrappedAction = { + id = "WrappedAction", + enabled = true, + number = Index, + auto = false, + params = { + action = DCSCommand, + }, + } + + self:T3( { DCSTaskWrappedAction } ) + return DCSTaskWrappedAction +end + +--- Executes a command action +-- @param #GROUP self +-- @param DCSCommand#Command DCSCommand +-- @return #GROUP self +function GROUP:SetCommand( DCSCommand ) + self:F2( DCSCommand ) + + local DCSGroup = self:GetDCSGroup() + + if DCSGroup then + local Controller = self:_GetController() + Controller:setCommand( DCSCommand ) + return self + end + + return nil +end + +--- Perform a switch waypoint command +-- @param #GROUP self +-- @param #number FromWayPoint +-- @param #number ToWayPoint +-- @return DCSTask#Task +function GROUP:CommandSwitchWayPoint( FromWayPoint, ToWayPoint, Index ) + self:F2( { FromWayPoint, ToWayPoint, Index } ) + + local CommandSwitchWayPoint = { + id = 'SwitchWaypoint', + params = { + fromWaypointIndex = FromWayPoint, + goToWaypointIndex = ToWayPoint, + }, + } + + self:T3( { CommandSwitchWayPoint } ) + return CommandSwitchWayPoint +end + + +-- TASKS FOR AIR GROUPS + + +--- (AIR) Attack a Group. +-- @param #GROUP self +-- @param Group#GROUP AttackGroup The Group to be attacked. +-- @param #number WeaponType (optional) Bitmask of weapon types those allowed to use. If parameter is not defined that means no limits on weapon usage. +-- @param DCSTypes#AI.Task.WeaponExpend WeaponExpend (optional) Determines how much weapon will be released at each attack. If parameter is not defined the unit / group will choose expend on its own discretion. +-- @param #number AttackQty (optional) This parameter limits maximal quantity of attack. The aicraft/group will not make more attack than allowed even if the target group not destroyed and the aicraft/group still have ammo. If not defined the aircraft/group will attack target until it will be destroyed or until the aircraft/group will run out of ammo. +-- @param DCSTypes#Azimuth Direction (optional) Desired ingress direction from the target to the attacking aircraft. Group/aircraft will make its attacks from the direction. Of course if there is no way to attack from the direction due the terrain group/aircraft will choose another direction. +-- @param DCSTypes#Distance Altitude (optional) Desired attack start altitude. Group/aircraft will make its attacks from the altitude. If the altitude is too low or too high to use weapon aircraft/group will choose closest altitude to the desired attack start altitude. If the desired altitude is defined group/aircraft will not attack from safe altitude. +-- @param #boolean AttackQtyLimit (optional) The flag determines how to interpret attackQty parameter. If the flag is true then attackQty is a limit on maximal attack quantity for "AttackGroup" and "AttackUnit" tasks. If the flag is false then attackQty is a desired attack quantity for "Bombing" and "BombingRunway" tasks. +-- @return DCSTask#Task The DCS task structure. +function GROUP:TaskAttackGroup( AttackGroup, WeaponType, WeaponExpend, AttackQty, Direction, Altitude, AttackQtyLimit ) + self:F2( { self.GroupName, AttackGroup, WeaponType, WeaponExpend, AttackQty, Direction, Altitude, AttackQtyLimit } ) + + -- AttackGroup = { + -- id = 'AttackGroup', + -- params = { + -- groupId = Group.ID, + -- weaponType = number, + -- expend = enum AI.Task.WeaponExpend, + -- attackQty = number, + -- directionEnabled = boolean, + -- direction = Azimuth, + -- altitudeEnabled = boolean, + -- altitude = Distance, + -- attackQtyLimit = boolean, + -- } + -- } + + local DirectionEnabled = nil + if Direction then + DirectionEnabled = true + end + + local AltitudeEnabled = nil + if Altitude then + AltitudeEnabled = true + end + + local DCSTask + DCSTask = { id = 'AttackGroup', + params = { + groupId = AttackGroup:GetID(), + weaponType = WeaponType, + expend = WeaponExpend, + attackQty = AttackQty, + directionEnabled = DirectionEnabled, + direction = Direction, + altitudeEnabled = AltitudeEnabled, + altitude = Altitude, + attackQtyLimit = AttackQtyLimit, + }, + }, + + self:T3( { DCSTask } ) + return DCSTask +end + + +--- (AIR) Attack the Unit. +-- @param #GROUP self +-- @param Unit#UNIT AttackUnit The unit. +-- @param #number WeaponType (optional) Bitmask of weapon types those allowed to use. If parameter is not defined that means no limits on weapon usage. +-- @param DCSTypes#AI.Task.WeaponExpend WeaponExpend (optional) Determines how much weapon will be released at each attack. If parameter is not defined the unit / group will choose expend on its own discretion. +-- @param #number AttackQty (optional) This parameter limits maximal quantity of attack. The aicraft/group will not make more attack than allowed even if the target group not destroyed and the aicraft/group still have ammo. If not defined the aircraft/group will attack target until it will be destroyed or until the aircraft/group will run out of ammo. +-- @param DCSTypes#Azimuth Direction (optional) Desired ingress direction from the target to the attacking aircraft. Group/aircraft will make its attacks from the direction. Of course if there is no way to attack from the direction due the terrain group/aircraft will choose another direction. +-- @param #boolean AttackQtyLimit (optional) The flag determines how to interpret attackQty parameter. If the flag is true then attackQty is a limit on maximal attack quantity for "AttackGroup" and "AttackUnit" tasks. If the flag is false then attackQty is a desired attack quantity for "Bombing" and "BombingRunway" tasks. +-- @param #boolean GroupAttack (optional) Flag indicates that the target must be engaged by all aircrafts of the group. Has effect only if the task is assigned to a group, not to a single aircraft. +-- @return DCSTask#Task The DCS task structure. +function GROUP:TaskAttackUnit( AttackUnit, WeaponType, WeaponExpend, AttackQty, Direction, AttackQtyLimit, GroupAttack ) + self:F2( { self.GroupName, AttackUnit, WeaponType, WeaponExpend, AttackQty, Direction, AttackQtyLimit, GroupAttack } ) + + -- AttackUnit = { + -- id = 'AttackUnit', + -- params = { + -- unitId = Unit.ID, + -- weaponType = number, + -- expend = enum AI.Task.WeaponExpend + -- attackQty = number, + -- direction = Azimuth, + -- attackQtyLimit = boolean, + -- groupAttack = boolean, + -- } + -- } + + local DCSTask + DCSTask = { id = 'AttackUnit', + params = { + unitId = AttackUnit:GetID(), + weaponType = WeaponType, + expend = WeaponExpend, + attackQty = AttackQty, + direction = Direction, + attackQtyLimit = AttackQtyLimit, + groupAttack = GroupAttack, + }, + }, + + self:T3( { DCSTask } ) + return DCSTask +end + + +--- (AIR) Delivering weapon at the point on the ground. +-- @param #GROUP self +-- @param DCSTypes#Vec2 PointVec2 2D-coordinates of the point to deliver weapon at. +-- @param #number WeaponType (optional) Bitmask of weapon types those allowed to use. If parameter is not defined that means no limits on weapon usage. +-- @param DCSTypes#AI.Task.WeaponExpend WeaponExpend (optional) Determines how much weapon will be released at each attack. If parameter is not defined the unit / group will choose expend on its own discretion. +-- @param #number AttackQty (optional) Desired quantity of passes. The parameter is not the same in AttackGroup and AttackUnit tasks. +-- @param DCSTypes#Azimuth Direction (optional) Desired ingress direction from the target to the attacking aircraft. Group/aircraft will make its attacks from the direction. Of course if there is no way to attack from the direction due the terrain group/aircraft will choose another direction. +-- @param #boolean GroupAttack (optional) Flag indicates that the target must be engaged by all aircrafts of the group. Has effect only if the task is assigned to a group, not to a single aircraft. +-- @return DCSTask#Task The DCS task structure. +function GROUP:TaskBombing( PointVec2, WeaponType, WeaponExpend, AttackQty, Direction, GroupAttack ) + self:F2( { self.GroupName, PointVec2, WeaponType, WeaponExpend, AttackQty, Direction, GroupAttack } ) + +-- Bombing = { +-- id = 'Bombing', +-- params = { +-- point = Vec2, +-- weaponType = number, +-- expend = enum AI.Task.WeaponExpend, +-- attackQty = number, +-- direction = Azimuth, +-- groupAttack = boolean, +-- } +-- } + + local DCSTask + DCSTask = { id = 'Bombing', + params = { + point = PointVec2, + weaponType = WeaponType, + expend = WeaponExpend, + attackQty = AttackQty, + direction = Direction, + groupAttack = GroupAttack, + }, + }, + + self:T3( { DCSTask } ) + return DCSTask +end + +--- (AIR) Orbit at a specified position at a specified alititude during a specified duration with a specified speed. +-- @param #GROUP self +-- @param DCSTypes#Vec2 Point The point to hold the position. +-- @param #number Altitude The altitude to hold the position. +-- @param #number Speed The speed flying when holding the position. +-- @return #GROUP self +function GROUP:TaskOrbitCircleAtVec2( Point, Altitude, Speed ) + self:F2( { self.GroupName, Point, Altitude, Speed } ) + + -- pattern = enum AI.Task.OribtPattern, + -- point = Vec2, + -- point2 = Vec2, + -- speed = Distance, + -- altitude = Distance + + local LandHeight = land.getHeight( Point ) + + self:T3( { LandHeight } ) + + local DCSTask = { id = 'Orbit', + params = { pattern = AI.Task.OrbitPattern.CIRCLE, + point = Point, + speed = Speed, + altitude = Altitude + LandHeight + } + } + + + -- local AITask = { id = 'ControlledTask', + -- params = { task = { id = 'Orbit', + -- params = { pattern = AI.Task.OrbitPattern.CIRCLE, + -- point = Point, + -- speed = Speed, + -- altitude = Altitude + LandHeight + -- } + -- }, + -- stopCondition = { duration = Duration + -- } + -- } + -- } + -- ) + + return DCSTask +end + +--- (AIR) Orbit at the current position of the first unit of the group at a specified alititude +-- @param #GROUP self +-- @param #number Altitude The altitude to hold the position. +-- @param #number Speed The speed flying when holding the position. +-- @return #GROUP self +function GROUP:TaskOrbitCircle( Altitude, Speed ) + self:F2( { self.GroupName, Altitude, Speed } ) + + local DCSGroup = self:GetDCSGroup() + + if DCSGroup then + local GroupPoint = self:GetPointVec2() + return self:TaskOrbitCircleAtVec2( GroupPoint, Altitude, Speed ) + end + + return nil +end + + + +--- (AIR) Hold position at the current position of the first unit of the group. +-- @param #GROUP self +-- @param #number Duration The maximum duration in seconds to hold the position. +-- @return #GROUP self +function GROUP:TaskHoldPosition() + self:F2( { self.GroupName } ) + + return self:TaskOrbitCircle( 30, 10 ) +end + + + + +--- (AIR) Attacking the map object (building, structure, e.t.c). +-- @param #GROUP self +-- @param DCSTypes#Vec2 PointVec2 2D-coordinates of the point the map object is closest to. The distance between the point and the map object must not be greater than 2000 meters. Object id is not used here because Mission Editor doesn't support map object identificators. +-- @param #number WeaponType (optional) Bitmask of weapon types those allowed to use. If parameter is not defined that means no limits on weapon usage. +-- @param DCSTypes#AI.Task.WeaponExpend WeaponExpend (optional) Determines how much weapon will be released at each attack. If parameter is not defined the unit / group will choose expend on its own discretion. +-- @param #number AttackQty (optional) This parameter limits maximal quantity of attack. The aicraft/group will not make more attack than allowed even if the target group not destroyed and the aicraft/group still have ammo. If not defined the aircraft/group will attack target until it will be destroyed or until the aircraft/group will run out of ammo. +-- @param DCSTypes#Azimuth Direction (optional) Desired ingress direction from the target to the attacking aircraft. Group/aircraft will make its attacks from the direction. Of course if there is no way to attack from the direction due the terrain group/aircraft will choose another direction. +-- @param #boolean GroupAttack (optional) Flag indicates that the target must be engaged by all aircrafts of the group. Has effect only if the task is assigned to a group, not to a single aircraft. +-- @return DCSTask#Task The DCS task structure. +function GROUP:TaskAttackMapObject( PointVec2, WeaponType, WeaponExpend, AttackQty, Direction, GroupAttack ) + self:F2( { self.GroupName, PointVec2, WeaponType, WeaponExpend, AttackQty, Direction, GroupAttack } ) + +-- AttackMapObject = { +-- id = 'AttackMapObject', +-- params = { +-- point = Vec2, +-- weaponType = number, +-- expend = enum AI.Task.WeaponExpend, +-- attackQty = number, +-- direction = Azimuth, +-- groupAttack = boolean, +-- } +-- } + + local DCSTask + DCSTask = { id = 'AttackMapObject', + params = { + point = PointVec2, + weaponType = WeaponType, + expend = WeaponExpend, + attackQty = AttackQty, + direction = Direction, + groupAttack = GroupAttack, + }, + }, + + self:T3( { DCSTask } ) + return DCSTask +end + + +--- (AIR) Delivering weapon on the runway. +-- @param #GROUP self +-- @param Airbase#AIRBASE Airbase Airbase to attack. +-- @param #number WeaponType (optional) Bitmask of weapon types those allowed to use. If parameter is not defined that means no limits on weapon usage. +-- @param DCSTypes#AI.Task.WeaponExpend WeaponExpend (optional) Determines how much weapon will be released at each attack. If parameter is not defined the unit / group will choose expend on its own discretion. +-- @param #number AttackQty (optional) This parameter limits maximal quantity of attack. The aicraft/group will not make more attack than allowed even if the target group not destroyed and the aicraft/group still have ammo. If not defined the aircraft/group will attack target until it will be destroyed or until the aircraft/group will run out of ammo. +-- @param DCSTypes#Azimuth Direction (optional) Desired ingress direction from the target to the attacking aircraft. Group/aircraft will make its attacks from the direction. Of course if there is no way to attack from the direction due the terrain group/aircraft will choose another direction. +-- @param #boolean GroupAttack (optional) Flag indicates that the target must be engaged by all aircrafts of the group. Has effect only if the task is assigned to a group, not to a single aircraft. +-- @return DCSTask#Task The DCS task structure. +function GROUP:TaskBombingRunway( Airbase, WeaponType, WeaponExpend, AttackQty, Direction, GroupAttack ) + self:F2( { self.GroupName, Airbase, WeaponType, WeaponExpend, AttackQty, Direction, GroupAttack } ) + +-- BombingRunway = { +-- id = 'BombingRunway', +-- params = { +-- runwayId = AirdromeId, +-- weaponType = number, +-- expend = enum AI.Task.WeaponExpend, +-- attackQty = number, +-- direction = Azimuth, +-- groupAttack = boolean, +-- } +-- } + + local DCSTask + DCSTask = { id = 'BombingRunway', + params = { + point = Airbase:GetID(), + weaponType = WeaponType, + expend = WeaponExpend, + attackQty = AttackQty, + direction = Direction, + groupAttack = GroupAttack, + }, + }, + + self:T3( { DCSTask } ) + return DCSTask +end + + +--- (AIR) Refueling from the nearest tanker. No parameters. +-- @param #GROUP self +-- @return DCSTask#Task The DCS task structure. +function GROUP:TaskRefueling() + self:F2( { self.GroupName } ) + +-- Refueling = { +-- id = 'Refueling', +-- params = {} +-- } + + local DCSTask + DCSTask = { id = 'Refueling', + params = { + }, + }, + + self:T3( { DCSTask } ) + return DCSTask +end + + +--- (AIR HELICOPTER) Landing at the ground. For helicopters only. +-- @param #GROUP self +-- @param DCSTypes#Vec2 Point The point where to land. +-- @param #number Duration The duration in seconds to stay on the ground. +-- @return #GROUP self +function GROUP:TaskLandAtVec2( Point, Duration ) + self:F2( { self.GroupName, Point, Duration } ) + +-- Land = { +-- id= 'Land', +-- params = { +-- point = Vec2, +-- durationFlag = boolean, +-- duration = Time +-- } +-- } + + local DCSTask + if Duration and Duration > 0 then + DCSTask = { id = 'Land', + params = { + point = Point, + durationFlag = true, + duration = Duration, + }, + } + else + DCSTask = { id = 'Land', + params = { + point = Point, + durationFlag = false, + }, + } + end + + self:T3( DCSTask ) + return DCSTask +end + +--- (AIR) Land the group at a @{Zone#ZONE). +-- @param #GROUP self +-- @param Zone#ZONE Zone The zone where to land. +-- @param #number Duration The duration in seconds to stay on the ground. +-- @return #GROUP self +function GROUP:TaskLandAtZone( Zone, Duration, RandomPoint ) + self:F2( { self.GroupName, Zone, Duration, RandomPoint } ) + + local Point + if RandomPoint then + Point = Zone:GetRandomPointVec2() + else + Point = Zone:GetPointVec2() + end + + local DCSTask = self:TaskLandAtVec2( Point, Duration ) + + self:T3( DCSTask ) + return DCSTask +end + +--- (AIR) Following another airborne group. +-- The unit / group will follow lead unit of another group, wingmens of both groups will continue following their leaders. +-- If another group is on land the unit / group will orbit around. +-- @param #GROUP self +-- @param Group#GROUP FollowGroup The group to be followed. +-- @param DCSTypes#Vec3 PointVec3 Position of the unit / lead unit of the group relative lead unit of another group in frame reference oriented by course of lead unit of another group. If another group is on land the unit / group will orbit around. +-- @param #number LastWaypointIndex Detach waypoint of another group. Once reached the unit / group Follow task is finished. +-- @return DCSTask#Task The DCS task structure. +function GROUP:TaskFollow( FollowGroup, PointVec3, LastWaypointIndex ) + self:F2( { self.GroupName, FollowGroup, PointVec3, LastWaypointIndex } ) + +-- Follow = { +-- id = 'Follow', +-- params = { +-- groupId = Group.ID, +-- pos = Vec3, +-- lastWptIndexFlag = boolean, +-- lastWptIndex = number +-- } +-- } + + local LastWaypointIndexFlag = nil + if LastWaypointIndex then + LastWaypointIndexFlag = true + end + + local DCSTask + DCSTask = { id = 'Follow', + params = { + groupId = FollowGroup:GetID(), + pos = PointVec3, + lastWptIndexFlag = LastWaypointIndexFlag, + lastWptIndex = LastWaypointIndex, + }, + }, + + self:T3( { DCSTask } ) + return DCSTask +end + + +--- (AIR) Escort another airborne group. +-- The unit / group will follow lead unit of another group, wingmens of both groups will continue following their leaders. +-- The unit / group will also protect that group from threats of specified types. +-- @param #GROUP self +-- @param Group#GROUP EscortGroup The group to be escorted. +-- @param DCSTypes#Vec3 PointVec3 Position of the unit / lead unit of the group relative lead unit of another group in frame reference oriented by course of lead unit of another group. If another group is on land the unit / group will orbit around. +-- @param #number LastWaypointIndex Detach waypoint of another group. Once reached the unit / group Follow task is finished. +-- @param #number EngagementDistanceMax Maximal distance from escorted group to threat. If the threat is already engaged by escort escort will disengage if the distance becomes greater than 1.5 * engagementDistMax. +-- @param DCSTypes#AttributeNameArray TargetTypes Array of AttributeName that is contains threat categories allowed to engage. +-- @return DCSTask#Task The DCS task structure. +function GROUP:TaskEscort( FollowGroup, PointVec3, LastWaypointIndex, EngagementDistance, TargetTypes ) + self:F2( { self.GroupName, FollowGroup, PointVec3, LastWaypointIndex, EngagementDistance, TargetTypes } ) + +-- Escort = { +-- id = 'Escort', +-- params = { +-- groupId = Group.ID, +-- pos = Vec3, +-- lastWptIndexFlag = boolean, +-- lastWptIndex = number, +-- engagementDistMax = Distance, +-- targetTypes = array of AttributeName, +-- } +-- } + + local LastWaypointIndexFlag = nil + if LastWaypointIndex then + LastWaypointIndexFlag = true + end + + local DCSTask + DCSTask = { id = 'Follow', + params = { + groupId = FollowGroup:GetID(), + pos = PointVec3, + lastWptIndexFlag = LastWaypointIndexFlag, + lastWptIndex = LastWaypointIndex, + engagementDistMax = EngagementDistance, + targetTypes = TargetTypes, + }, + }, + + self:T3( { DCSTask } ) + return DCSTask +end + + +-- GROUND TASKS + +--- (GROUND) Fire at a VEC2 point until ammunition is finished. +-- @param #GROUP self +-- @param DCSTypes#Vec2 PointVec2 The point to fire at. +-- @param DCSTypes#Distance Radius The radius of the zone to deploy the fire at. +-- @return DCSTask#Task The DCS task structure. +function GROUP:TaskFireAtPoint( PointVec2, Radius ) + self:F2( { self.GroupName, PointVec2, Radius } ) + + -- FireAtPoint = { + -- id = 'FireAtPoint', + -- params = { + -- point = Vec2, + -- radius = Distance, + -- } + -- } + + local DCSTask + DCSTask = { id = 'FireAtPoint', + params = { + point = PointVec2, + radius = Radius, + } + } + + self:T3( { DCSTask } ) + return DCSTask +end + +--- (GROUND) Hold ground group from moving. +-- @param #GROUP self +-- @return DCSTask#Task The DCS task structure. +function GROUP:TaskHold() + self:F2( { self.GroupName } ) + +-- Hold = { +-- id = 'Hold', +-- params = { +-- } +-- } + + local DCSTask + DCSTask = { id = 'Hold', + params = { + } + } + + self:T3( { DCSTask } ) + return DCSTask +end + +-- TASKS FOR AIRBORNE AND GROUND UNITS/GROUPS + +--- (AIR + GROUND) The task makes the group/unit a FAC and orders the FAC to control the target (enemy ground group) destruction. +-- The killer is player-controlled allied CAS-aircraft that is in contact with the FAC. +-- If the task is assigned to the group lead unit will be a FAC. +-- @param #GROUP self +-- @param Group#GROUP AttackGroup Target GROUP. +-- @param #number WeaponType Bitmask of weapon types those allowed to use. If parameter is not defined that means no limits on weapon usage. +-- @param DCSTypes#AI.Task.Designation Designation (optional) Designation type. +-- @param #boolean Datalink (optional) Allows to use datalink to send the target information to attack aircraft. Enabled by default. +-- @return DCSTask#Task The DCS task structure. +function GROUP:TaskFAC_AttackGroup( AttackGroup, WeaponType, Designation, Datalink ) + self:F2( { self.GroupName, AttackGroup, WeaponType, Designation, Datalink } ) + +-- FAC_AttackGroup = { +-- id = 'FAC_AttackGroup', +-- params = { +-- groupId = Group.ID, +-- weaponType = number, +-- designation = enum AI.Task.Designation, +-- datalink = boolean +-- } +-- } + + local DCSTask + DCSTask = { id = 'FAC_AttackGroup', + params = { + groupId = AttackGroup:GetID(), + weaponType = WeaponType, + designation = Designation, + datalink = Datalink, + } + } + + self:T3( { DCSTask } ) + return DCSTask +end + +-- EN-ROUTE TASKS FOR AIRBORNE GROUPS + +--- (AIR) Engaging targets of defined types. +-- @param #GROUP self +-- @param DCSTypes#Distance Distance Maximal distance from the target to a route leg. If the target is on a greater distance it will be ignored. +-- @param DCSTypes#AttributeNameArray TargetTypes Array of target categories allowed to engage. +-- @param #number Priority All enroute tasks have the priority parameter. This is a number (less value - higher priority) that determines actions related to what task will be performed first. +-- @return DCSTask#Task The DCS task structure. +function GROUP:EnRouteTaskEngageTargets( Distance, TargetTypes, Priority ) + self:F2( { self.GroupName, Distance, TargetTypes, Priority } ) + +-- EngageTargets ={ +-- id = 'EngageTargets', +-- params = { +-- maxDist = Distance, +-- targetTypes = array of AttributeName, +-- priority = number +-- } +-- } + + local DCSTask + DCSTask = { id = 'EngageTargets', + params = { + maxDist = Distance, + targetTypes = TargetTypes, + priority = Priority + } + } + + self:T3( { DCSTask } ) + return DCSTask +end + + +--- (AIR) Engaging a targets of defined types at circle-shaped zone. +-- @param #GROUP self +-- @param DCSTypes#Vec2 PointVec2 2D-coordinates of the zone. +-- @param DCSTypes#Distance Radius Radius of the zone. +-- @param DCSTypes#AttributeNameArray TargetTypes Array of target categories allowed to engage. +-- @param #number Priority All en-route tasks have the priority parameter. This is a number (less value - higher priority) that determines actions related to what task will be performed first. +-- @return DCSTask#Task The DCS task structure. +function GROUP:EnRouteTaskEngageTargets( PointVec2, Radius, TargetTypes, Priority ) + self:F2( { self.GroupName, PointVec2, Radius, TargetTypes, Priority } ) + +-- EngageTargetsInZone = { +-- id = 'EngageTargetsInZone', +-- params = { +-- point = Vec2, +-- zoneRadius = Distance, +-- targetTypes = array of AttributeName, +-- priority = number +-- } +-- } + + local DCSTask + DCSTask = { id = 'EngageTargetsInZone', + params = { + point = PointVec2, + zoneRadius = Radius, + targetTypes = TargetTypes, + priority = Priority + } + } + + self:T3( { DCSTask } ) + return DCSTask +end + +--- (AIR) Engaging a group. The task does not assign the target group to the unit/group to attack now; it just allows the unit/group to engage the target group as well as other assigned targets. +-- @param #GROUP self +-- @param Group#GROUP AttackGroup The Group to be attacked. +-- @param #number Priority All en-route tasks have the priority parameter. This is a number (less value - higher priority) that determines actions related to what task will be performed first. +-- @param #number WeaponType (optional) Bitmask of weapon types those allowed to use. If parameter is not defined that means no limits on weapon usage. +-- @param DCSTypes#AI.Task.WeaponExpend WeaponExpend (optional) Determines how much weapon will be released at each attack. If parameter is not defined the unit / group will choose expend on its own discretion. +-- @param #number AttackQty (optional) This parameter limits maximal quantity of attack. The aicraft/group will not make more attack than allowed even if the target group not destroyed and the aicraft/group still have ammo. If not defined the aircraft/group will attack target until it will be destroyed or until the aircraft/group will run out of ammo. +-- @param DCSTypes#Azimuth Direction (optional) Desired ingress direction from the target to the attacking aircraft. Group/aircraft will make its attacks from the direction. Of course if there is no way to attack from the direction due the terrain group/aircraft will choose another direction. +-- @param DCSTypes#Distance Altitude (optional) Desired attack start altitude. Group/aircraft will make its attacks from the altitude. If the altitude is too low or too high to use weapon aircraft/group will choose closest altitude to the desired attack start altitude. If the desired altitude is defined group/aircraft will not attack from safe altitude. +-- @param #boolean AttackQtyLimit (optional) The flag determines how to interpret attackQty parameter. If the flag is true then attackQty is a limit on maximal attack quantity for "AttackGroup" and "AttackUnit" tasks. If the flag is false then attackQty is a desired attack quantity for "Bombing" and "BombingRunway" tasks. +-- @return DCSTask#Task The DCS task structure. +function GROUP:EnRouteTaskEngageGroup( AttackGroup, Priority, WeaponType, WeaponExpend, AttackQty, Direction, Altitude, AttackQtyLimit ) + self:F2( { self.GroupName, AttackGroup, Priority, WeaponType, WeaponExpend, AttackQty, Direction, Altitude, AttackQtyLimit } ) + + -- EngageGroup = { + -- id = 'EngageGroup ', + -- params = { + -- groupId = Group.ID, + -- weaponType = number, + -- expend = enum AI.Task.WeaponExpend, + -- attackQty = number, + -- directionEnabled = boolean, + -- direction = Azimuth, + -- altitudeEnabled = boolean, + -- altitude = Distance, + -- attackQtyLimit = boolean, + -- priority = number, + -- } + -- } + + local DirectionEnabled = nil + if Direction then + DirectionEnabled = true + end + + local AltitudeEnabled = nil + if Altitude then + AltitudeEnabled = true + end + + local DCSTask + DCSTask = { id = 'EngageGroup', + params = { + groupId = AttackGroup:GetID(), + weaponType = WeaponType, + expend = WeaponExpend, + attackQty = AttackQty, + directionEnabled = DirectionEnabled, + direction = Direction, + altitudeEnabled = AltitudeEnabled, + altitude = Altitude, + attackQtyLimit = AttackQtyLimit, + priority = Priority, + }, + }, + + self:T3( { DCSTask } ) + return DCSTask +end + + +--- (AIR) Attack the Unit. +-- @param #GROUP self +-- @param Unit#UNIT AttackUnit The UNIT. +-- @param #number Priority All en-route tasks have the priority parameter. This is a number (less value - higher priority) that determines actions related to what task will be performed first. +-- @param #number WeaponType (optional) Bitmask of weapon types those allowed to use. If parameter is not defined that means no limits on weapon usage. +-- @param DCSTypes#AI.Task.WeaponExpend WeaponExpend (optional) Determines how much weapon will be released at each attack. If parameter is not defined the unit / group will choose expend on its own discretion. +-- @param #number AttackQty (optional) This parameter limits maximal quantity of attack. The aicraft/group will not make more attack than allowed even if the target group not destroyed and the aicraft/group still have ammo. If not defined the aircraft/group will attack target until it will be destroyed or until the aircraft/group will run out of ammo. +-- @param DCSTypes#Azimuth Direction (optional) Desired ingress direction from the target to the attacking aircraft. Group/aircraft will make its attacks from the direction. Of course if there is no way to attack from the direction due the terrain group/aircraft will choose another direction. +-- @param #boolean AttackQtyLimit (optional) The flag determines how to interpret attackQty parameter. If the flag is true then attackQty is a limit on maximal attack quantity for "AttackGroup" and "AttackUnit" tasks. If the flag is false then attackQty is a desired attack quantity for "Bombing" and "BombingRunway" tasks. +-- @param #boolean GroupAttack (optional) Flag indicates that the target must be engaged by all aircrafts of the group. Has effect only if the task is assigned to a group, not to a single aircraft. +-- @return DCSTask#Task The DCS task structure. +function GROUP:EnRouteTaskEngageUnit( AttackUnit, Priority, WeaponType, WeaponExpend, AttackQty, Direction, AttackQtyLimit, GroupAttack ) + self:F2( { self.GroupName, AttackUnit, Priority, WeaponType, WeaponExpend, AttackQty, Direction, AttackQtyLimit, GroupAttack } ) + + -- EngageUnit = { + -- id = 'EngageUnit', + -- params = { + -- unitId = Unit.ID, + -- weaponType = number, + -- expend = enum AI.Task.WeaponExpend + -- attackQty = number, + -- direction = Azimuth, + -- attackQtyLimit = boolean, + -- groupAttack = boolean, + -- priority = number, + -- } + -- } + + local DCSTask + DCSTask = { id = 'EngageUnit', + params = { + unitId = AttackUnit:GetID(), + weaponType = WeaponType, + expend = WeaponExpend, + attackQty = AttackQty, + direction = Direction, + attackQtyLimit = AttackQtyLimit, + groupAttack = GroupAttack, + priority = Priority, + }, + }, + + self:T3( { DCSTask } ) + return DCSTask +end + + +--- (AIR) Aircraft will act as an AWACS for friendly units (will provide them with information about contacts). No parameters. +-- @param #GROUP self +-- @return DCSTask#Task The DCS task structure. +function GROUP:EnRouteTaskAWACS( ) + self:F2( { self.GroupName } ) + +-- AWACS = { +-- id = 'AWACS', +-- params = { +-- } +-- } + + local DCSTask + DCSTask = { id = 'AWACS', + params = { + } + } + + self:T3( { DCSTask } ) + return DCSTask +end + + +--- (AIR) Aircraft will act as a tanker for friendly units. No parameters. +-- @param #GROUP self +-- @return DCSTask#Task The DCS task structure. +function GROUP:EnRouteTaskTanker( ) + self:F2( { self.GroupName } ) + +-- Tanker = { +-- id = 'Tanker', +-- params = { +-- } +-- } + + local DCSTask + DCSTask = { id = 'Tanker', + params = { + } + } + + self:T3( { DCSTask } ) + return DCSTask +end + + +-- En-route tasks for ground units/groups + +--- (GROUND) Ground unit (EW-radar) will act as an EWR for friendly units (will provide them with information about contacts). No parameters. +-- @param #GROUP self +-- @return DCSTask#Task The DCS task structure. +function GROUP:EnRouteTaskEWR( ) + self:F2( { self.GroupName } ) + +-- EWR = { +-- id = 'EWR', +-- params = { +-- } +-- } + + local DCSTask + DCSTask = { id = 'EWR', + params = { + } + } + + self:T3( { DCSTask } ) + return DCSTask +end + + +-- En-route tasks for airborne and ground units/groups + +--- (AIR + GROUND) The task makes the group/unit a FAC and lets the FAC to choose the target (enemy ground group) as well as other assigned targets. +-- The killer is player-controlled allied CAS-aircraft that is in contact with the FAC. +-- If the task is assigned to the group lead unit will be a FAC. +-- @param #GROUP self +-- @param Group#GROUP AttackGroup Target GROUP. +-- @param #number Priority All en-route tasks have the priority parameter. This is a number (less value - higher priority) that determines actions related to what task will be performed first. +-- @param #number WeaponType Bitmask of weapon types those allowed to use. If parameter is not defined that means no limits on weapon usage. +-- @param DCSTypes#AI.Task.Designation Designation (optional) Designation type. +-- @param #boolean Datalink (optional) Allows to use datalink to send the target information to attack aircraft. Enabled by default. +-- @return DCSTask#Task The DCS task structure. +function GROUP:EnRouteTaskFAC_EngageGroup( AttackGroup, Priority, WeaponType, Designation, Datalink ) + self:F2( { self.GroupName, AttackGroup, WeaponType, Priority, Designation, Datalink } ) + +-- FAC_EngageGroup = { +-- id = 'FAC_EngageGroup', +-- params = { +-- groupId = Group.ID, +-- weaponType = number, +-- designation = enum AI.Task.Designation, +-- datalink = boolean, +-- priority = number, +-- } +-- } + + local DCSTask + DCSTask = { id = 'FAC_EngageGroup', + params = { + groupId = AttackGroup:GetID(), + weaponType = WeaponType, + designation = Designation, + datalink = Datalink, + priority = Priority, + } + } + + self:T3( { DCSTask } ) + return DCSTask +end + + +--- (AIR + GROUND) The task makes the group/unit a FAC and lets the FAC to choose a targets (enemy ground group) around as well as other assigned targets. +-- The killer is player-controlled allied CAS-aircraft that is in contact with the FAC. +-- If the task is assigned to the group lead unit will be a FAC. +-- @param #GROUP self +-- @param DCSTypes#Distance Radius The maximal distance from the FAC to a target. +-- @param #number Priority All en-route tasks have the priority parameter. This is a number (less value - higher priority) that determines actions related to what task will be performed first. +-- @return DCSTask#Task The DCS task structure. +function GROUP:EnRouteTaskFAC( Radius, Priority ) + self:F2( { self.GroupName, Radius, Priority } ) + +-- FAC = { +-- id = 'FAC', +-- params = { +-- radius = Distance, +-- priority = number +-- } +-- } + + local DCSTask + DCSTask = { id = 'FAC', + params = { + radius = Radius, + priority = Priority + } + } + + self:T3( { DCSTask } ) + return DCSTask +end + + + + +--- Move the group to a Vec2 Point, wait for a defined duration and embark a group. +-- @param #GROUP self +-- @param DCSTypes#Vec2 Point The point where to wait. +-- @param #number Duration The duration in seconds to wait. +-- @param #GROUP EmbarkingGroup The group to be embarked. +-- @return DCSTask#Task The DCS task structure +function GROUP:TaskEmbarkingAtVec2( Point, Duration, EmbarkingGroup ) + self:F2( { self.GroupName, Point, Duration, EmbarkingGroup.DCSGroup } ) + + local DCSTask + DCSTask = { id = 'Embarking', + params = { x = Point.x, + y = Point.y, + duration = Duration, + groupsForEmbarking = { EmbarkingGroup.GroupID }, + durationFlag = true, + distributionFlag = false, + distribution = {}, + } + } + + self:T3( { DCSTask } ) + return DCSTask +end + +--- Move to a defined Vec2 Point, and embark to a group when arrived within a defined Radius. +-- @param #GROUP self +-- @param DCSTypes#Vec2 Point The point where to wait. +-- @param #number Radius The radius of the embarking zone around the Point. +-- @return DCSTask#Task The DCS task structure. +function GROUP:TaskEmbarkToTransportAtVec2( Point, Radius ) + self:F2( { self.GroupName, Point, Radius } ) + + local DCSTask --DCSTask#Task + DCSTask = { id = 'EmbarkToTransport', + params = { x = Point.x, + y = Point.y, + zoneRadius = Radius, + } + } + + self:T3( { DCSTask } ) + return DCSTask +end + +--- Return a Misson task from a mission template. +-- @param #GROUP self +-- @param #table TaskMission A table containing the mission task. +-- @return DCSTask#Task +function GROUP:TaskMission( TaskMission ) + self:F2( Points ) + + local DCSTask + DCSTask = { id = 'Mission', params = { TaskMission, }, } + + self:T3( { DCSTask } ) + return DCSTask +end + +--- Return a Misson task to follow a given route defined by Points. +-- @param #GROUP self +-- @param #table Points A table of route points. +-- @return DCSTask#Task +function GROUP:TaskRoute( Points ) + self:F2( Points ) + + local DCSTask + DCSTask = { id = 'Mission', params = { route = { points = Points, }, }, } + + self:T3( { DCSTask } ) + return DCSTask +end + +--- Make the DCS Group to fly to a given point and hover. +-- @param #GROUP self +-- @param DCSTypes#Vec3 Point The destination point in Vec3 format. +-- @param #number Speed The speed to travel. +-- @return #GROUP self +function GROUP:TaskRouteToVec2( Point, Speed ) + self:F2( { Point, Speed } ) + + local GroupPoint = self:GetUnit( 1 ):GetPointVec2() + + local PointFrom = {} + PointFrom.x = GroupPoint.x + PointFrom.y = GroupPoint.y + PointFrom.type = "Turning Point" + PointFrom.action = "Turning Point" + PointFrom.speed = Speed + PointFrom.speed_locked = true + PointFrom.properties = { + ["vnav"] = 1, + ["scale"] = 0, + ["angle"] = 0, + ["vangle"] = 0, + ["steer"] = 2, + } + + + local PointTo = {} + PointTo.x = Point.x + PointTo.y = Point.y + PointTo.type = "Turning Point" + PointTo.action = "Fly Over Point" + PointTo.speed = Speed + PointTo.speed_locked = true + PointTo.properties = { + ["vnav"] = 1, + ["scale"] = 0, + ["angle"] = 0, + ["vangle"] = 0, + ["steer"] = 2, + } + + + local Points = { PointFrom, PointTo } + + self:T3( Points ) + + self:Route( Points ) + + return self +end + +--- Make the DCS Group to fly to a given point and hover. +-- @param #GROUP self +-- @param DCSTypes#Vec3 Point The destination point in Vec3 format. +-- @param #number Speed The speed to travel. +-- @return #GROUP self +function GROUP:TaskRouteToVec3( Point, Speed ) + self:F2( { Point, Speed } ) + + local GroupPoint = self:GetUnit( 1 ):GetPointVec3() + + local PointFrom = {} + PointFrom.x = GroupPoint.x + PointFrom.y = GroupPoint.z + PointFrom.alt = GroupPoint.y + PointFrom.alt_type = "BARO" + PointFrom.type = "Turning Point" + PointFrom.action = "Turning Point" + PointFrom.speed = Speed + PointFrom.speed_locked = true + PointFrom.properties = { + ["vnav"] = 1, + ["scale"] = 0, + ["angle"] = 0, + ["vangle"] = 0, + ["steer"] = 2, + } + + + local PointTo = {} + PointTo.x = Point.x + PointTo.y = Point.z + PointTo.alt = Point.y + PointTo.alt_type = "BARO" + PointTo.type = "Turning Point" + PointTo.action = "Fly Over Point" + PointTo.speed = Speed + PointTo.speed_locked = true + PointTo.properties = { + ["vnav"] = 1, + ["scale"] = 0, + ["angle"] = 0, + ["vangle"] = 0, + ["steer"] = 2, + } + + + local Points = { PointFrom, PointTo } + + self:T3( Points ) + + self:Route( Points ) + + return self +end + + + +--- Make the group to follow a given route. +-- @param #GROUP self +-- @param #table GoPoints A table of Route Points. +-- @return #GROUP self +function GROUP:Route( GoPoints ) + self:F2( GoPoints ) + + local DCSGroup = self:GetDCSGroup() + + if DCSGroup then + local Points = routines.utils.deepCopy( GoPoints ) + local MissionTask = { id = 'Mission', params = { route = { points = Points, }, }, } + local Controller = self:_GetController() + --Controller.setTask( Controller, MissionTask ) + --routines.scheduleFunction( Controller.setTask, { Controller, MissionTask}, timer.getTime() + 1 ) + SCHEDULER:New( Controller, Controller.setTask, { MissionTask }, 1 ) + return self + end + + return nil +end + + + +--- Route the group to a given zone. +-- The group final destination point can be randomized. +-- A speed can be given in km/h. +-- A given formation can be given. +-- @param #GROUP self +-- @param Zone#ZONE Zone The zone where to route to. +-- @param #boolean Randomize Defines whether to target point gets randomized within the Zone. +-- @param #number Speed The speed. +-- @param Base#FORMATION Formation The formation string. +function GROUP:TaskRouteToZone( Zone, Randomize, Speed, Formation ) + self:F2( Zone ) + + local DCSGroup = self:GetDCSGroup() + + if DCSGroup then + + local GroupPoint = self:GetPointVec2() + + local PointFrom = {} + PointFrom.x = GroupPoint.x + PointFrom.y = GroupPoint.y + PointFrom.type = "Turning Point" + PointFrom.action = "Cone" + PointFrom.speed = 20 / 1.6 + + + local PointTo = {} + local ZonePoint + + if Randomize then + ZonePoint = Zone:GetRandomPointVec2() + else + ZonePoint = Zone:GetPointVec2() + end + + PointTo.x = ZonePoint.x + PointTo.y = ZonePoint.y + PointTo.type = "Turning Point" + + if Formation then + PointTo.action = Formation + else + PointTo.action = "Cone" + end + + if Speed then + PointTo.speed = Speed + else + PointTo.speed = 20 / 1.6 + end + + local Points = { PointFrom, PointTo } + + self:T3( Points ) + + self:Route( Points ) + + return self + end + + return nil +end + +-- Commands + +--- Do Script command +-- @param #GROUP self +-- @param #string DoScript +-- @return #DCSCommand +function GROUP:CommandDoScript( DoScript ) + + local DCSDoScript = { + id = "Script", + params = { + command = DoScript, + }, + } + + self:T3( DCSDoScript ) + return DCSDoScript +end + + +--- Return the mission template of the group. +-- @param #GROUP self +-- @return #table The MissionTemplate +function GROUP:GetTaskMission() + self:F2( self.GroupName ) + + return routines.utils.deepCopy( _DATABASE.Templates.Groups[self.GroupName].Template ) +end + +--- Return the mission route of the group. +-- @param #GROUP self +-- @return #table The mission route defined by points. +function GROUP:GetTaskRoute() + self:F2( self.GroupName ) + + return routines.utils.deepCopy( _DATABASE.Templates.Groups[self.GroupName].Template.route.points ) +end + +--- Return the route of a group by using the @{Database#DATABASE} class. +-- @param #GROUP self +-- @param #number Begin The route point from where the copy will start. The base route point is 0. +-- @param #number End The route point where the copy will end. The End point is the last point - the End point. The last point has base 0. +-- @param #boolean Randomize Randomization of the route, when true. +-- @param #number Radius When randomization is on, the randomization is within the radius. +function GROUP:CopyRoute( Begin, End, Randomize, Radius ) + self:F2( { Begin, End } ) + + local Points = {} + + -- Could be a Spawned Group + local GroupName = string.match( self:GetName(), ".*#" ) + if GroupName then + GroupName = GroupName:sub( 1, -2 ) + else + GroupName = self:GetName() + end + + self:T3( { GroupName } ) + + local Template = _DATABASE.Templates.Groups[GroupName].Template + + if Template then + if not Begin then + Begin = 0 + end + if not End then + End = 0 + end + + for TPointID = Begin + 1, #Template.route.points - End do + if Template.route.points[TPointID] then + Points[#Points+1] = routines.utils.deepCopy( Template.route.points[TPointID] ) + if Randomize then + if not Radius then + Radius = 500 + end + Points[#Points].x = Points[#Points].x + math.random( Radius * -1, Radius ) + Points[#Points].y = Points[#Points].y + math.random( Radius * -1, Radius ) + end + end + end + return Points + end + + return nil +end + + +function GROUP:GetDetectedTargets() + self:F2( self.GroupName ) + + local DCSGroup = self:GetDCSGroup() + if DCSGroup then + return self:_GetController():getDetectedTargets() + end + + return nil +end + +function GROUP:IsTargetDetected( DCSObject ) + self:F2( self.GroupName ) + + local DCSGroup = self:GetDCSGroup() + if DCSGroup then + + local TargetIsDetected, TargetIsVisible, TargetLastTime, TargetKnowType, TargetKnowDistance, TargetLastPos, TargetLastVelocity + = self:_GetController().isTargetDetected( self:_GetController(), DCSObject, + Controller.Detection.VISUAL, + Controller.Detection.OPTIC, + Controller.Detection.RADAR, + Controller.Detection.IRST, + Controller.Detection.RWR, + Controller.Detection.DLINK + ) + return TargetIsDetected, TargetIsVisible, TargetLastTime, TargetKnowType, TargetKnowDistance, TargetLastPos, TargetLastVelocity + end + + return nil +end + +-- Options + +--- Can the GROUP hold their weapons? +-- @param #GROUP self +-- @return #boolean +function GROUP:OptionROEHoldFirePossible() + self:F2( { self.GroupName } ) + + local DCSGroup = self:GetDCSGroup() + if DCSGroup then + if self:IsAir() or self:IsGround() or self:IsShip() then + return true + end + + return false + end + + return nil +end + +--- Holding weapons. +-- @param Group#GROUP self +-- @return Group#GROUP self +function GROUP:OptionROEHoldFire() + self:F2( { self.GroupName } ) + + local DCSGroup = self:GetDCSGroup() + if DCSGroup then + local Controller = self:_GetController() + + if self:IsAir() then + Controller:setOption( AI.Option.Air.id.ROE, AI.Option.Air.val.ROE.WEAPON_HOLD ) + elseif self:IsGround() then + Controller:setOption( AI.Option.Ground.id.ROE, AI.Option.Ground.val.ROE.WEAPON_HOLD ) + elseif self:IsShip() then + Controller:setOption( AI.Option.Naval.id.ROE, AI.Option.Naval.val.ROE.WEAPON_HOLD ) + end + + return self + end + + return nil +end + +--- Can the GROUP attack returning on enemy fire? +-- @param #GROUP self +-- @return #boolean +function GROUP:OptionROEReturnFirePossible() + self:F2( { self.GroupName } ) + + local DCSGroup = self:GetDCSGroup() + if DCSGroup then + if self:IsAir() or self:IsGround() or self:IsShip() then + return true + end + + return false + end + + return nil +end + +--- Return fire. +-- @param #GROUP self +-- @return #GROUP self +function GROUP:OptionROEReturnFire() + self:F2( { self.GroupName } ) + + local DCSGroup = self:GetDCSGroup() + if DCSGroup then + local Controller = self:_GetController() + + if self:IsAir() then + Controller:setOption( AI.Option.Air.id.ROE, AI.Option.Air.val.ROE.RETURN_FIRE ) + elseif self:IsGround() then + Controller:setOption( AI.Option.Ground.id.ROE, AI.Option.Ground.val.ROE.RETURN_FIRE ) + elseif self:IsShip() then + Controller:setOption( AI.Option.Naval.id.ROE, AI.Option.Naval.val.ROE.RETURN_FIRE ) + end + + return self + end + + return nil +end + +--- Can the GROUP attack designated targets? +-- @param #GROUP self +-- @return #boolean +function GROUP:OptionROEOpenFirePossible() + self:F2( { self.GroupName } ) + + local DCSGroup = self:GetDCSGroup() + if DCSGroup then + if self:IsAir() or self:IsGround() or self:IsShip() then + return true + end + + return false + end + + return nil +end + +--- Openfire. +-- @param #GROUP self +-- @return #GROUP self +function GROUP:OptionROEOpenFire() + self:F2( { self.GroupName } ) + + local DCSGroup = self:GetDCSGroup() + if DCSGroup then + local Controller = self:_GetController() + + if self:IsAir() then + Controller:setOption( AI.Option.Air.id.ROE, AI.Option.Air.val.ROE.OPEN_FIRE ) + elseif self:IsGround() then + Controller:setOption( AI.Option.Ground.id.ROE, AI.Option.Ground.val.ROE.OPEN_FIRE ) + elseif self:IsShip() then + Controller:setOption( AI.Option.Naval.id.ROE, AI.Option.Naval.val.ROE.OPEN_FIRE ) + end + + return self + end + + return nil +end + +--- Can the GROUP attack targets of opportunity? +-- @param #GROUP self +-- @return #boolean +function GROUP:OptionROEWeaponFreePossible() + self:F2( { self.GroupName } ) + + local DCSGroup = self:GetDCSGroup() + if DCSGroup then + if self:IsAir() then + return true + end + + return false + end + + return nil +end + +--- Weapon free. +-- @param #GROUP self +-- @return #GROUP self +function GROUP:OptionROEWeaponFree() + self:F2( { self.GroupName } ) + + local DCSGroup = self:GetDCSGroup() + if DCSGroup then + local Controller = self:_GetController() + + if self:IsAir() then + Controller:setOption( AI.Option.Air.id.ROE, AI.Option.Air.val.ROE.WEAPON_FREE ) + end + + return self + end + + return nil +end + +--- Can the GROUP ignore enemy fire? +-- @param #GROUP self +-- @return #boolean +function GROUP:OptionROTNoReactionPossible() + self:F2( { self.GroupName } ) + + local DCSGroup = self:GetDCSGroup() + if DCSGroup then + if self:IsAir() then + return true + end + + return false + end + + return nil +end + + +--- No evasion on enemy threats. +-- @param #GROUP self +-- @return #GROUP self +function GROUP:OptionROTNoReaction() + self:F2( { self.GroupName } ) + + local DCSGroup = self:GetDCSGroup() + if DCSGroup then + local Controller = self:_GetController() + + if self:IsAir() then + Controller:setOption( AI.Option.Air.id.REACTION_ON_THREAT, AI.Option.Air.val.REACTION_ON_THREAT.NO_REACTION ) + end + + return self + end + + return nil +end + +--- Can the GROUP evade using passive defenses? +-- @param #GROUP self +-- @return #boolean +function GROUP:OptionROTPassiveDefensePossible() + self:F2( { self.GroupName } ) + + local DCSGroup = self:GetDCSGroup() + if DCSGroup then + if self:IsAir() then + return true + end + + return false + end + + return nil +end + +--- Evasion passive defense. +-- @param #GROUP self +-- @return #GROUP self +function GROUP:OptionROTPassiveDefense() + self:F2( { self.GroupName } ) + + local DCSGroup = self:GetDCSGroup() + if DCSGroup then + local Controller = self:_GetController() + + if self:IsAir() then + Controller:setOption( AI.Option.Air.id.REACTION_ON_THREAT, AI.Option.Air.val.REACTION_ON_THREAT.PASSIVE_DEFENCE ) + end + + return self + end + + return nil +end + +--- Can the GROUP evade on enemy fire? +-- @param #GROUP self +-- @return #boolean +function GROUP:OptionROTEvadeFirePossible() + self:F2( { self.GroupName } ) + + local DCSGroup = self:GetDCSGroup() + if DCSGroup then + if self:IsAir() then + return true + end + + return false + end + + return nil +end + + +--- Evade on fire. +-- @param #GROUP self +-- @return #GROUP self +function GROUP:OptionROTEvadeFire() + self:F2( { self.GroupName } ) + + local DCSGroup = self:GetDCSGroup() + if DCSGroup then + local Controller = self:_GetController() + + if self:IsAir() then + Controller:setOption( AI.Option.Air.id.REACTION_ON_THREAT, AI.Option.Air.val.REACTION_ON_THREAT.EVADE_FIRE ) + end + + return self + end + + return nil +end + +--- Can the GROUP evade on fire using vertical manoeuvres? +-- @param #GROUP self +-- @return #boolean +function GROUP:OptionROTVerticalPossible() + self:F2( { self.GroupName } ) + + local DCSGroup = self:GetDCSGroup() + if DCSGroup then + if self:IsAir() then + return true + end + + return false + end + + return nil +end + + +--- Evade on fire using vertical manoeuvres. +-- @param #GROUP self +-- @return #GROUP self +function GROUP:OptionROTVertical() + self:F2( { self.GroupName } ) + + local DCSGroup = self:GetDCSGroup() + if DCSGroup then + local Controller = self:_GetController() + + if self:IsAir() then + Controller:setOption( AI.Option.Air.id.REACTION_ON_THREAT, AI.Option.Air.val.REACTION_ON_THREAT.BYPASS_AND_ESCAPE ) + end + + return self + end + + return nil +end + +-- Message APIs + +--- Returns a message for a coalition or a client. +-- @param #GROUP self +-- @param #string Message The message text +-- @param DCSTypes#Duration Duration The duration of the message. +-- @return Message#MESSAGE +function GROUP:Message( Message, Duration ) + self:F2( { Message, Duration } ) + + local DCSGroup = self:GetDCSGroup() + if DCSGroup then + return MESSAGE:New( Message, self:GetCallsign() .. " (" .. self:GetTypeName() .. ")", Duration, self:GetClassNameAndID() ) + end + + return nil +end + +--- Send a message to all coalitions. +-- The message will appear in the message area. The message will begin with the callsign of the group and the type of the first unit sending the message. +-- @param #GROUP self +-- @param #string Message The message text +-- @param DCSTypes#Duration Duration The duration of the message. +function GROUP:MessageToAll( Message, Duration ) + self:F2( { Message, Duration } ) + + local DCSGroup = self:GetDCSGroup() + if DCSGroup then + self:Message( Message, Duration ):ToAll() + end + + return nil +end + +--- Send a message to the red coalition. +-- The message will appear in the message area. The message will begin with the callsign of the group and the type of the first unit sending the message. +-- @param #GROUP self +-- @param #string Message The message text +-- @param DCSTYpes#Duration Duration The duration of the message. +function GROUP:MessageToRed( Message, Duration ) + self:F2( { Message, Duration } ) + + local DCSGroup = self:GetDCSGroup() + if DCSGroup then + self:Message( Message, Duration ):ToRed() + end + + return nil +end + +--- Send a message to the blue coalition. +-- The message will appear in the message area. The message will begin with the callsign of the group and the type of the first unit sending the message. +-- @param #GROUP self +-- @param #string Message The message text +-- @param DCSTypes#Duration Duration The duration of the message. +function GROUP:MessageToBlue( Message, Duration ) + self:F2( { Message, Duration } ) + + local DCSGroup = self:GetDCSGroup() + if DCSGroup then + self:Message( Message, Duration ):ToBlue() + end + + return nil +end + +--- Send a message to a client. +-- The message will appear in the message area. The message will begin with the callsign of the group and the type of the first unit sending the message. +-- @param #GROUP self +-- @param #string Message The message text +-- @param DCSTypes#Duration Duration The duration of the message. +-- @param Client#CLIENT Client The client object receiving the message. +function GROUP:MessageToClient( Message, Duration, Client ) + self:F2( { Message, Duration } ) + + local DCSGroup = self:GetDCSGroup() + if DCSGroup then + self:Message( Message, Duration ):ToClient( Client ) + end + + return nil +end +--- UNIT Class +-- +-- @{UNIT} class +-- ============== +-- The @{UNIT} class is a wrapper class to handle the DCS Unit objects: +-- +-- * Support all DCS Unit APIs. +-- * Enhance with Unit specific APIs not in the DCS Unit API set. +-- * Handle local Unit Controller. +-- * Manage the "state" of the DCS Unit. +-- +-- +-- UNIT reference methods +-- ====================== +-- For each DCS Unit object alive within a running mission, a UNIT wrapper object (instance) will be created within the _@{DATABASE} object. +-- This is done at the beginning of the mission (when the mission starts), and dynamically when new DCS Unit objects are spawned (using the @{SPAWN} class). +-- +-- The UNIT class **does not contain a :New()** method, rather it provides **:Find()** methods to retrieve the object reference +-- using the DCS Unit or the DCS UnitName. +-- +-- Another thing to know is that UNIT objects do not "contain" the DCS Unit object. +-- The UNIT methods will reference the DCS Unit object by name when it is needed during API execution. +-- If the DCS Unit object does not exist or is nil, the UNIT methods will return nil and log an exception in the DCS.log file. +-- +-- The UNIT class provides the following functions to retrieve quickly the relevant UNIT instance: +-- +-- * @{#UNIT.Find}(): Find a UNIT instance from the _DATABASE object using a DCS Unit object. +-- * @{#UNIT.FindByName}(): Find a UNIT instance from the _DATABASE object using a DCS Unit name. +-- +-- IMPORTANT: ONE SHOULD NEVER SANATIZE these UNIT OBJECT REFERENCES! (make the UNIT object references nil). +-- +-- DCS UNIT APIs +-- ============= +-- The DCS Unit APIs are used extensively within MOOSE. The UNIT class has for each DCS Unit API a corresponding method. +-- To be able to distinguish easily in your code the difference between a UNIT API call and a DCS Unit API call, +-- the first letter of the method is also capitalized. So, by example, the DCS Unit method @{DCSUnit#Unit.getName}() +-- is implemented in the UNIT class as @{#UNIT.GetName}(). +-- +-- Additional UNIT APIs +-- ==================== +-- The UNIT class comes with additional methods. Find below a summary. +-- +-- Smoke, Flare Units +-- ------------------ +-- The UNIT class provides methods to smoke or flare units easily. +-- The @{#UNIT.SmokeBlue}(), @{#UNIT.SmokeGreen}(),@{#UNIT.SmokeOrange}(), @{#UNIT.SmokeRed}(), @{#UNIT.SmokeRed}() methods +-- will smoke the unit in the corresponding color. Note that smoking a unit is done at the current position of the DCS Unit. +-- When the DCS Unit moves for whatever reason, the smoking will still continue! +-- The @{#UNIT.FlareGreen}(), @{#UNIT.FlareRed}(), @{#UNIT.FlareWhite}(), @{#UNIT.FlareYellow}() +-- methods will fire off a flare in the air with the corresponding color. Note that a flare is a one-off shot and its effect is of very short duration. +-- +-- Position, Point +-- --------------- +-- The UNIT class provides methods to obtain the current point or position of the DCS Unit. +-- The @{#UNIT.GetPointVec2}(), @{#UNIT.GetPointVec3}() will obtain the current location of the DCS Unit in a Vec2 (2D) or a Vec3 (3D) vector respectively. +-- If you want to obtain the complete 3D position including oriëntation and direction vectors, consult the @{#UNIT.GetPositionVec3}() method respectively. +-- +-- Alive +-- ----- +-- The @{#UNIT.IsAlive}(), @{#UNIT.IsActive}() methods determines if the DCS Unit is alive, meaning, it is existing and active. +-- +-- Test for other units in radius +-- ------------------------------ +-- One can test if another DCS Unit is within a given radius of the current DCS Unit, by using the @{#UNIT.OtherUnitInRadius}() method. +-- +-- More functions will be added +-- ---------------------------- +-- During the MOOSE development, more functions will be added. A complete list of the current functions is below. +-- +-- +-- +-- +-- @module Unit +-- @author FlightControl + +Include.File( "Routines" ) +Include.File( "Base" ) +Include.File( "Message" ) + +--- The UNIT class +-- @type UNIT +-- @extends Base#BASE +-- @field #UNIT.FlareColor FlareColor +-- @field #UNIT.SmokeColor SmokeColor +UNIT = { + ClassName="UNIT", + CategoryName = { + [Unit.Category.AIRPLANE] = "Airplane", + [Unit.Category.HELICOPTER] = "Helicoper", + [Unit.Category.GROUND_UNIT] = "Ground Unit", + [Unit.Category.SHIP] = "Ship", + [Unit.Category.STRUCTURE] = "Structure", + }, + FlareColor = { + Green = trigger.flareColor.Green, + Red = trigger.flareColor.Red, + White = trigger.flareColor.White, + Yellow = trigger.flareColor.Yellow + }, + SmokeColor = { + Green = trigger.smokeColor.Green, + Red = trigger.smokeColor.Red, + White = trigger.smokeColor.White, + Orange = trigger.smokeColor.Orange, + Blue = trigger.smokeColor.Blue + }, + } + +--- FlareColor +-- @type UNIT.FlareColor +-- @field Green +-- @field Red +-- @field White +-- @field Yellow + +--- SmokeColor +-- @type UNIT.SmokeColor +-- @field Green +-- @field Red +-- @field White +-- @field Orange +-- @field Blue + +-- Registration. + +--- Create a new UNIT from DCSUnit. +-- @param #UNIT self +-- @param DCSUnit#Unit DCSUnit +-- @param Database#DATABASE Database +-- @return Unit#UNIT +function UNIT:Register( UnitName ) + + local self = BASE:Inherit( self, BASE:New() ) + self:F2( UnitName ) + self.UnitName = UnitName + return self +end + +-- Reference methods. + +--- Finds a UNIT from the _DATABASE using a DCSUnit object. +-- @param #UNIT self +-- @param DCSUnit#Unit DCSUnit An existing DCS Unit object reference. +-- @return Unit#UNIT self +function UNIT:Find( DCSUnit ) + + local UnitName = DCSUnit:getName() + local UnitFound = _DATABASE:FindUnit( UnitName ) + return UnitFound +end + +--- Find a UNIT in the _DATABASE using the name of an existing DCS Unit. +-- @param #UNIT self +-- @param #string UnitName The Unit Name. +-- @return Unit#UNIT self +function UNIT:FindByName( UnitName ) + + local UnitFound = _DATABASE:FindUnit( UnitName ) + return UnitFound +end + +function UNIT:GetDCSUnit() + local DCSUnit = Unit.getByName( self.UnitName ) + + if DCSUnit then + return DCSUnit + end + + return nil +end + +--- Returns coalition of the Unit. +-- @param Unit#UNIT self +-- @return DCSCoalitionObject#coalition.side The side of the coalition. +-- @return #nil The DCS Unit is not existing or alive. +function UNIT:GetCoalition() + self:F2( self.UnitName ) + + local DCSUnit = self:GetDCSUnit() + + if DCSUnit then + local UnitCoalition = DCSUnit:getCoalition() + self:T3( UnitCoalition ) + return UnitCoalition + end + + return nil +end + +--- Returns country of the Unit. +-- @param Unit#UNIT self +-- @return DCScountry#country.id The country identifier. +-- @return #nil The DCS Unit is not existing or alive. +function UNIT:GetCountry() + self:F2( self.UnitName ) + + local DCSUnit = self:GetDCSUnit() + + if DCSUnit then + local UnitCountry = DCSUnit:getCountry() + self:T3( UnitCountry ) + return UnitCountry + end + + return nil +end + + +--- Returns DCS Unit object name. +-- The function provides access to non-activated units too. +-- @param Unit#UNIT self +-- @return #string The name of the DCS Unit. +-- @return #nil The DCS Unit is not existing or alive. +function UNIT:GetName() + self:F2( self.UnitName ) + + local DCSUnit = self:GetDCSUnit() + + if DCSUnit then + local UnitName = self.UnitName + return UnitName + end + + return nil +end + + +--- Returns if the unit is alive. +-- @param Unit#UNIT self +-- @return #boolean true if Unit is alive. +-- @return #nil The DCS Unit is not existing or alive. +function UNIT:IsAlive() + self:F2( self.UnitName ) + + local DCSUnit = self:GetDCSUnit() + + if DCSUnit then + local UnitIsAlive = DCSUnit:isExist() + return UnitIsAlive + end + + return false +end + +--- Returns if the unit is activated. +-- @param Unit#UNIT self +-- @return #boolean true if Unit is activated. +-- @return #nil The DCS Unit is not existing or alive. +function UNIT:IsActive() + self:F2( self.UnitName ) + + local DCSUnit = self:GetDCSUnit() + + if DCSUnit then + + local UnitIsActive = DCSUnit:isActive() + return UnitIsActive + end + + return nil +end + +--- Returns name of the player that control the unit or nil if the unit is controlled by A.I. +-- @param Unit#UNIT self +-- @return #string Player Name +-- @return #nil The DCS Unit is not existing or alive. +function UNIT:GetPlayerName() + self:F2( self.UnitName ) + + local DCSUnit = self:GetDCSUnit() + + if DCSUnit then + + local PlayerName = DCSUnit:getPlayerName() + if PlayerName == nil then + PlayerName = "" + end + return PlayerName + end + + return nil +end + +--- Returns the unit's unique identifier. +-- @param Unit#UNIT self +-- @return DCSUnit#Unit.ID Unit ID +-- @return #nil The DCS Unit is not existing or alive. +function UNIT:GetID() + self:F2( self.UnitName ) + + local DCSUnit = self:GetDCSUnit() + + if DCSUnit then + local UnitID = DCSUnit:getID() + return UnitID + end + + return nil +end + +--- Returns the unit's number in the group. +-- The number is the same number the unit has in ME. +-- It may not be changed during the mission. +-- If any unit in the group is destroyed, the numbers of another units will not be changed. +-- @param Unit#UNIT self +-- @return #number The Unit number. +-- @return #nil The DCS Unit is not existing or alive. +function UNIT:GetNumber() + self:F2( self.UnitName ) + + local DCSUnit = self:GetDCSUnit() + + if DCSUnit then + local UnitNumber = DCSUnit:getNumber() + return UnitNumber + end + + return nil +end + +--- Returns the unit's group if it exist and nil otherwise. +-- @param Unit#UNIT self +-- @return Group#GROUP The Group of the Unit. +-- @return #nil The DCS Unit is not existing or alive. +function UNIT:GetGroup() + self:F2( self.UnitName ) + + local DCSUnit = self:GetDCSUnit() + + if DCSUnit then + local UnitGroup = DCSUnit:getGroup() + return UnitGroup + end + + return nil +end + + +--- Returns the unit's callsign - the localized string. +-- @param Unit#UNIT self +-- @return #string The Callsign of the Unit. +-- @return #nil The DCS Unit is not existing or alive. +function UNIT:GetCallSign() + self:F2( self.UnitName ) + + local DCSUnit = self:GetDCSUnit() + + if DCSUnit then + local UnitCallSign = DCSUnit:getCallsign() + return UnitCallSign + end + + return nil +end + +--- Returns the unit's health. Dead units has health <= 1.0. +-- @param Unit#UNIT self +-- @return #number The Unit's health value. +-- @return #nil The DCS Unit is not existing or alive. +function UNIT:GetLife() + self:F2( self.UnitName ) + + local DCSUnit = self:GetDCSUnit() + + if DCSUnit then + local UnitLife = DCSUnit:getLife() + return UnitLife + end + + return nil +end + +--- Returns the Unit's initial health. +-- @param Unit#UNIT self +-- @return #number The Unit's initial health value. +-- @return #nil The DCS Unit is not existing or alive. +function UNIT:GetLife0() + self:F2( self.UnitName ) + + local DCSUnit = self:GetDCSUnit() + + if DCSUnit then + local UnitLife0 = DCSUnit:getLife0() + return UnitLife0 + end + + return nil +end + +--- Returns relative amount of fuel (from 0.0 to 1.0) the unit has in its internal tanks. If there are additional fuel tanks the value may be greater than 1.0. +-- @param Unit#UNIT self +-- @return #number The relative amount of fuel (from 0.0 to 1.0). +-- @return #nil The DCS Unit is not existing or alive. +function UNIT:GetFuel() + self:F2( self.UnitName ) + + local DCSUnit = self:GetDCSUnit() + + if DCSUnit then + local UnitFuel = DCSUnit:getFuel() + return UnitFuel + end + + return nil +end + +--- Returns the Unit's ammunition. +-- @param Unit#UNIT self +-- @return DCSUnit#Unit.Ammo +-- @return #nil The DCS Unit is not existing or alive. +function UNIT:GetAmmo() + self:F2( self.UnitName ) + + local DCSUnit = self:GetDCSUnit() + + if DCSUnit then + local UnitAmmo = DCSUnit:getAmmo() + return UnitAmmo + end + + return nil +end + +--- Returns the unit sensors. +-- @param Unit#UNIT self +-- @return DCSUnit#Unit.Sensors +-- @return #nil The DCS Unit is not existing or alive. +function UNIT:GetSensors() + self:F2( self.UnitName ) + + local DCSUnit = self:GetDCSUnit() + + if DCSUnit then + local UnitSensors = DCSUnit:getSensors() + return UnitSensors + end + + return nil +end + +-- Need to add here a function per sensortype +-- unit:hasSensors(Unit.SensorType.RADAR, Unit.RadarType.AS) + +--- Returns two values: +-- +-- * First value indicates if at least one of the unit's radar(s) is on. +-- * Second value is the object of the radar's interest. Not nil only if at least one radar of the unit is tracking a target. +-- @param Unit#UNIT self +-- @return #boolean Indicates if at least one of the unit's radar(s) is on. +-- @return DCSObject#Object The object of the radar's interest. Not nil only if at least one radar of the unit is tracking a target. +-- @return #nil The DCS Unit is not existing or alive. +function UNIT:GetRadar() + self:F2( self.UnitName ) + + local DCSUnit = self:GetDCSUnit() + + if DCSUnit then + local UnitRadarOn, UnitRadarObject = DCSUnit:getRadar() + return UnitRadarOn, UnitRadarObject + end + + return nil, nil +end + +-- Need to add here functions to check if radar is on and which object etc. + +--- Returns unit descriptor. Descriptor type depends on unit category. +-- @param Unit#UNIT self +-- @return DCSUnit#Unit.Desc The Unit descriptor. +-- @return #nil The DCS Unit is not existing or alive. +function UNIT:GetDesc() + self:F2( self.UnitName ) + + local DCSUnit = self:GetDCSUnit() + + if DCSUnit then + local UnitDesc = DCSUnit:getDesc() + return UnitDesc + end + + return nil +end + + +--- Returns the type name of the DCS Unit. +-- @param Unit#UNIT self +-- @return #string The type name of the DCS Unit. +-- @return #nil The DCS Unit is not existing or alive. +function UNIT:GetTypeName() + self:F2( self.UnitName ) + + local DCSUnit = self:GetDCSUnit() + + if DCSUnit then + local UnitTypeName = DCSUnit:getTypeName() + self:T3( UnitTypeName ) + return UnitTypeName + end + + return nil +end + + + +--- Returns the prefix name of the DCS Unit. A prefix name is a part of the name before a '#'-sign. +-- DCS Units spawned with the @{SPAWN} class contain a '#'-sign to indicate the end of the (base) DCS Unit name. +-- The spawn sequence number and unit number are contained within the name after the '#' sign. +-- @param Unit#UNIT self +-- @return #string The name of the DCS Unit. +-- @return #nil The DCS Unit is not existing or alive. +function UNIT:GetPrefix() + self:F2( self.UnitName ) + + local DCSUnit = self:GetDCSUnit() + + if DCSUnit then + local UnitPrefix = string.match( self.UnitName, ".*#" ):sub( 1, -2 ) + self:T3( UnitPrefix ) + return UnitPrefix + end + + return nil +end + + + +--- Returns the @{DCSTypes#Vec2} vector indicating the point in 2D of the DCS Unit within the mission. +-- @param Unit#UNIT self +-- @return DCSTypes#Vec2 The 2D point vector of the DCS Unit. +-- @return #nil The DCS Unit is not existing or alive. +function UNIT:GetPointVec2() + self:F2( self.UnitName ) + + local DCSUnit = self:GetDCSUnit() + + if DCSUnit then + local UnitPointVec3 = DCSUnit:getPosition().p + + local UnitPointVec2 = {} + UnitPointVec2.x = UnitPointVec3.x + UnitPointVec2.y = UnitPointVec3.z + + self:T3( UnitPointVec2 ) + return UnitPointVec2 + end + + return nil +end + + +--- Returns the @{DCSTypes#Vec3} vector indicating the point in 3D of the DCS Unit within the mission. +-- @param Unit#UNIT self +-- @return DCSTypes#Vec3 The 3D point vector of the DCS Unit. +-- @return #nil The DCS Unit is not existing or alive. +function UNIT:GetPointVec3() + self:F2( self.UnitName ) + + local DCSUnit = self:GetDCSUnit() + + if DCSUnit then + local UnitPointVec3 = DCSUnit:getPosition().p + self:T3( UnitPointVec3 ) + return UnitPointVec3 + end + + return nil +end + +--- Returns the @{DCSTypes#Position3} position vectors indicating the point and direction vectors in 3D of the DCS Unit within the mission. +-- @param Unit#UNIT self +-- @return DCSTypes#Position The 3D position vectors of the DCS Unit. +-- @return #nil The DCS Unit is not existing or alive. +function UNIT:GetPositionVec3() + self:F2( self.UnitName ) + + local DCSUnit = self:GetDCSUnit() + + if DCSUnit then + local UnitPosition = DCSUnit:getPosition() + self:T3( UnitPosition ) + return UnitPosition + end + + return nil +end + +--- Returns the DCS Unit velocity vector. +-- @param Unit#UNIT self +-- @return DCSTypes#Vec3 The velocity vector +-- @return #nil The DCS Unit is not existing or alive. +function UNIT:GetVelocity() + self:F2( self.UnitName ) + + local DCSUnit = self:GetDCSUnit() + + if DCSUnit then + local UnitVelocityVec3 = DCSUnit:getVelocity() + self:T3( UnitVelocityVec3 ) + return UnitVelocityVec3 + end + + return nil +end + +--- Returns true if the DCS Unit is in the air. +-- @param Unit#UNIT self +-- @return #boolean true if in the air. +-- @return #nil The DCS Unit is not existing or alive. +function UNIT:InAir() + self:F2( self.UnitName ) + + local DCSUnit = self:GetDCSUnit() + + if DCSUnit then + local UnitInAir = DCSUnit:inAir() + self:T3( UnitInAir ) + return UnitInAir + end + + return nil +end + +--- Returns the altitude of the DCS Unit. +-- @param Unit#UNIT self +-- @return DCSTypes#Distance The altitude of the DCS Unit. +-- @return #nil The DCS Unit is not existing or alive. +function UNIT:GetAltitude() + self:F2() + + local DCSUnit = self:GetDCSUnit() + + if DCSUnit then + local UnitPointVec3 = DCSUnit:getPoint() --DCSTypes#Vec3 + return UnitPointVec3.y + end + + return nil +end + +--- Returns true if there is an **other** DCS Unit within a radius of the current 2D point of the DCS Unit. +-- @param Unit#UNIT self +-- @param Unit#UNIT AwaitUnit The other UNIT wrapper object. +-- @param Radius The radius in meters with the DCS Unit in the centre. +-- @return true If the other DCS Unit is within the radius of the 2D point of the DCS Unit. +-- @return #nil The DCS Unit is not existing or alive. +function UNIT:OtherUnitInRadius( AwaitUnit, Radius ) + self:F2( { self.UnitName, AwaitUnit.UnitName, Radius } ) + + local DCSUnit = self:GetDCSUnit() + + if DCSUnit then + local UnitPos = self:GetPointVec3() + local AwaitUnitPos = AwaitUnit:GetPointVec3() + + if (((UnitPos.x - AwaitUnitPos.x)^2 + (UnitPos.z - AwaitUnitPos.z)^2)^0.5 <= Radius) then + self:T3( "true" ) + return true + else + self:T3( "false" ) + return false + end + end + + return nil +end + +--- Returns the DCS Unit category name as defined within the DCS Unit Descriptor. +-- @param Unit#UNIT self +-- @return #string The DCS Unit Category Name +function UNIT:GetCategoryName() + local DCSUnit = self:GetDCSUnit() + + if DCSUnit then + local UnitCategoryName = self.CategoryName[ self:GetDesc().category ] + return UnitCategoryName + end + + return nil +end + +--- Signal a flare at the position of the UNIT. +-- @param #UNIT self +function UNIT:Flare( FlareColor ) + self:F2() + trigger.action.signalFlare( self:GetPointVec3(), FlareColor , 0 ) +end + +--- Signal a white flare at the position of the UNIT. +-- @param #UNIT self +function UNIT:FlareWhite() + self:F2() + trigger.action.signalFlare( self:GetPointVec3(), trigger.flareColor.White , 0 ) +end + +--- Signal a yellow flare at the position of the UNIT. +-- @param #UNIT self +function UNIT:FlareYellow() + self:F2() + trigger.action.signalFlare( self:GetPointVec3(), trigger.flareColor.Yellow , 0 ) +end + +--- Signal a green flare at the position of the UNIT. +-- @param #UNIT self +function UNIT:FlareGreen() + self:F2() + trigger.action.signalFlare( self:GetPointVec3(), trigger.flareColor.Green , 0 ) +end + +--- Signal a red flare at the position of the UNIT. +-- @param #UNIT self +function UNIT:FlareRed() + self:F2() + trigger.action.signalFlare( self:GetPointVec3(), trigger.flareColor.Red, 0 ) +end + +--- Smoke the UNIT. +-- @param #UNIT self +function UNIT:Smoke( SmokeColor ) + self:F2() + trigger.action.smoke( self:GetPointVec3(), SmokeColor ) +end + +--- Smoke the UNIT Green. +-- @param #UNIT self +function UNIT:SmokeGreen() + self:F2() + trigger.action.smoke( self:GetPointVec3(), trigger.smokeColor.Green ) +end + +--- Smoke the UNIT Red. +-- @param #UNIT self +function UNIT:SmokeRed() + self:F2() + trigger.action.smoke( self:GetPointVec3(), trigger.smokeColor.Red ) +end + +--- Smoke the UNIT White. +-- @param #UNIT self +function UNIT:SmokeWhite() + self:F2() + trigger.action.smoke( self:GetPointVec3(), trigger.smokeColor.White ) +end + +--- Smoke the UNIT Orange. +-- @param #UNIT self +function UNIT:SmokeOrange() + self:F2() + trigger.action.smoke( self:GetPointVec3(), trigger.smokeColor.Orange ) +end + +--- Smoke the UNIT Blue. +-- @param #UNIT self +function UNIT:SmokeBlue() + self:F2() + trigger.action.smoke( self:GetPointVec3(), trigger.smokeColor.Blue ) +end + +-- Is methods + +--- Returns if the unit is of an air category. +-- If the unit is a helicopter or a plane, then this method will return true, otherwise false. +-- @param #UNIT self +-- @return #boolean Air category evaluation result. +function UNIT:IsAir() + self:F2() + + local UnitDescriptor = self.DCSUnit:getDesc() + self:T3( { UnitDescriptor.category, Unit.Category.AIRPLANE, Unit.Category.HELICOPTER } ) + + local IsAirResult = ( UnitDescriptor.category == Unit.Category.AIRPLANE ) or ( UnitDescriptor.category == Unit.Category.HELICOPTER ) + + self:T3( IsAirResult ) + return IsAirResult +end + +--- ZONE Classes +-- ============= +-- This module contains the ZONE classes, inherited from @{Zone#ZONE_BASE}. +-- There are essentially two core functions that zones accomodate: +-- +-- * Test if an object is within the zone boundaries. +-- * Provide the zone behaviour. Some zones are static, while others are moveable. +-- +-- The object classes are using the zone classes to test the zone boundaries, which can take various forms: +-- +-- * Test if completely within the zone. +-- * Test if partly within the zone (for @{Group#GROUP} objects). +-- * Test if not in the zone. +-- * Distance to the nearest intersecting point of the zone. +-- * Distance to the center of the zone. +-- * ... +-- +-- Each of these ZONE classes have a zone name, and specific parameters defining the zone type: +-- +-- * @{Zone#ZONE_BASE}: The ZONE_BASE class defining the base for all other zone classes. +-- * @{Zone#ZONE_RADIUS}: The ZONE_RADIUS class defined by a zone name, a location and a radius. +-- * @{Zone#ZONE}: The ZONE class, defined by the zone name as defined within the Mission Editor. +-- * @{Zone#ZONE_UNIT}: The ZONE_UNIT class defined by a zone around a @{Unit#UNIT} with a radius. +-- * @{Zone#ZONE_POLYGON}: The ZONE_POLYGON class defined by a sequence of @{Group#GROUP} waypoints within the Mission Editor, forming a polygon. +-- +-- Polymorphic methods +-- =================== +-- Each zone implements two polymorphic functions defined in @{Zone#ZONE_BASE}: +-- +-- * @{#ZONE_BASE.IsPointVec2InZone}: Returns if a location is within the zone. +-- * @{#ZONE_BASE.IsPointVec3InZone}: Returns if a point is within the zone. +-- +-- @module Zone +-- @author FlightControl + + +Include.File( "Routines" ) +Include.File( "Base" ) +Include.File( "Message" ) + + + +--- The ZONE_BASE class +-- @type ZONE_BASE +-- @Extends Base#BASE +ZONE_BASE = { + ClassName = "ZONE_BASE", + } + +function ZONE_BASE:New( ZoneName ) + local self = BASE:Inherit( self, BASE:New() ) + self:F( ZoneName ) + + self.ZoneName = ZoneName + + return self +end + +--- Returns if a location is within the zone. +-- @param #ZONE_RADIUS self +-- @param DCSTypes#Vec2 PointVec2 The location to test. +-- @return #boolean true if the location is within the zone. +function ZONE_BASE:IsPointVec2InZone( PointVec2 ) + self:F2( PointVec2 ) + + return false +end + +--- Returns if a point is within the zone. +-- @param #ZONE_RADIUS self +-- @param DCSTypes#Vec3 PointVec3 The point to test. +-- @return #boolean true if the point is within the zone. +function ZONE_BASE:IsPointVec3InZone( PointVec3 ) + self:F2( PointVec3 ) + + local InZone = self:IsPointVec2InZone( { x = PointVec3.x, y = PointVec3.z } ) + + return InZone +end + + +--- The ZONE_RADIUS class, defined by a zone name, a location and a radius. +-- @type ZONE_RADIUS +-- @field DCSTypes#Vec2 PointVec2 The current location of the zone. +-- @field DCSTypes#Distance Radius The radius of the zone. +-- @Extends Zone#ZONE_BASE +ZONE_RADIUS = { + ClassName="ZONE_RADIUS", + } + +--- Constructor of ZONE_RADIUS, taking the zone name, the zone location and a radius. +-- @param #ZONE_RADIUS self +-- @param DCSTypes#Vec2 PointVec2 The location of the zone. +-- @param DCSTypes#Distance Radius The radius of the zone. +-- @return #ZONE_RADIUS +function ZONE_RADIUS:New( ZoneName, PointVec2, Radius ) + local self = BASE:Inherit( self, ZONE_BASE:New( ZoneName ) ) + self:F( { ZoneName, PointVec2, Radius } ) + + self.Radius = Radius + self.PointVec2 = PointVec2 + + return self +end + + +--- Returns the radius of the zone. +-- @param #ZONE_RADIUS self +-- @return DCSTypes#Distance The radius of the zone. +function ZONE_RADIUS:GetRadius() + self:F2( self.ZoneName ) + + self:T2( { self.Radius } ) + + return self.Radius +end + +--- Sets the radius of the zone. +-- @param #ZONE_RADIUS self +-- @param DCSTypes#Distance Radius The radius of the zone. +-- @return DCSTypes#Distance The radius of the zone. +function ZONE_RADIUS:SetRadius( Radius ) + self:F2( self.ZoneName ) + + self.Radius = Radius + self:T2( { self.Radius } ) + + return self.Radius +end + +--- Returns the location of the zone. +-- @param #ZONE_RADIUS self +-- @return DCSTypes#Vec2 The location of the zone. +function ZONE_RADIUS:GetPointVec2() + self:F2( self.ZoneName ) + + self:T2( { self.PointVec2 } ) + + return self.PointVec2 +end + +--- Sets the location of the zone. +-- @param #ZONE_RADIUS self +-- @param DCSTypes#Vec2 PointVec2 The new location of the zone. +-- @return DCSTypes#Vec2 The new location of the zone. +function ZONE_RADIUS:SetPointVec2( PointVec2 ) + self:F2( self.ZoneName ) + + self.PointVec2 = PointVec2 + + self:T2( { self.PointVec2 } ) + + return self.PointVec2 +end + +--- Returns the point of the zone. +-- @param #ZONE_RADIUS self +-- @param DCSTypes#Distance Height The height to add to the land height where the center of the zone is located. +-- @return DCSTypes#Vec3 The point of the zone. +function ZONE_RADIUS:GetPointVec3( Height ) + self:F2( self.ZoneName ) + + local PointVec2 = self:GetPointVec2() + + local PointVec3 = { x = PointVec2.x, y = land.getHeight( self:GetPointVec2() ) + Height, z = PointVec2.y } + + self:T2( { PointVec3 } ) + + return PointVec3 +end + +--- Returns if a location is within the zone. +-- @param #ZONE_RADIUS self +-- @param DCSTypes#Vec2 PointVec2 The location to test. +-- @return #boolean true if the location is within the zone. +function ZONE_RADIUS:IsPointVec2InZone( PointVec2 ) + self:F2( PointVec2 ) + + if (( PointVec2.x - self.PointVec2.x )^2 + ( PointVec2.y - self.PointVec2.y ) ^2 ) ^ 0.5 <= self.Radius then + return true + end + + return false +end + +--- Returns if a point is within the zone. +-- @param #ZONE_RADIUS self +-- @param DCSTypes#Vec3 PointVec3 The point to test. +-- @return #boolean true if the point is within the zone. +function ZONE_RADIUS:IsPointVec3InZone( PointVec3 ) + self:F2( PointVec3 ) + + local InZone = self:IsPointVec3InZone( { x = PointVec3.x, y = PointVec3.z } ) + + return InZone +end + +--- Returns a random location within the zone. +-- @param #ZONE_RADIUS self +-- @return DCSTypes#Vec2 The random location within the zone. +function ZONE_RADIUS:GetRandomPointVec2() + self:F( self.ZoneName ) + + local Point = {} + + local angle = math.random() * math.pi*2; + Point.x = self.PointVec2.x + math.cos( angle ) * math.random() * self.Radius; + Point.y = self.PointVec2.y + math.sin( angle ) * math.random() * self.Radius; + + self:T( { Point } ) + + return Point +end + + + +--- The ZONE class, defined by the zone name as defined within the Mission Editor. The location and the radius are automatically collected from the mission settings. +-- @type ZONE +-- @Extends Zone#ZONE_RADIUS +ZONE = { + ClassName="ZONE", + } + + +--- Constructor of ZONE, taking the zone name. +-- @param #ZONE self +-- @param #string ZoneName The name of the zone as defined within the mission editor. +-- @return #ZONE +function ZONE:New( ZoneName ) + + local Zone = trigger.misc.getZone( ZoneName ) + + if not Zone then + error( "Zone " .. ZoneName .. " does not exist." ) + return nil + end + + local self = BASE:Inherit( self, ZONE_RADIUS:New( ZoneName, { x = Zone.x, y = Zone.y }, Zone.radius ) ) + self:F( ZoneName ) + + self.Zone = Zone + + return self +end + + + +--- The ZONE_UNIT class defined by a zone around a @{Unit#UNIT} with a radius. +-- @type ZONE_UNIT +-- @field Unit#UNIT ZoneUNIT +-- @Extends Zone#ZONE_RADIUS +ZONE_UNIT = { + ClassName="ZONE_UNIT", + } + +--- Constructor to create a ZONE_UNIT instance, taking the zone name, a zone unit and a radius. +-- @param #ZONE_UNIT self +-- @param #string ZoneName Name of the zone. +-- @param Unit#UNIT ZoneUNIT The unit as the center of the zone. +-- @param DCSTypes#Distance Radius The radius of the zone. +-- @return #ZONE_UNIT self +function ZONE_UNIT:New( ZoneName, ZoneUNIT, Radius ) + local self = BASE:Inherit( self, ZONE_RADIUS:New( ZoneName, ZoneUNIT:GetPointVec2(), Radius ) ) + self:F( { ZoneName, ZoneUNIT:GetPointVec2(), Radius } ) + + self.ZoneUNIT = ZoneUNIT + + return self +end + + +--- Returns the current location of the @{Unit#UNIT}. +-- @param #ZONE_UNIT self +-- @return DCSTypes#Vec2 The location of the zone based on the @{Unit#UNIT}location. +function ZONE_UNIT:GetPointVec2() + self:F( self.ZoneName ) + + local ZonePointVec2 = self.ZoneUNIT:GetPointVec2() + + self:T( { ZonePointVec2 } ) + + return ZonePointVec2 +end + + +--- The ZONE_POLYGON class defined by a sequence of @{Group#GROUP} waypoints within the Mission Editor, forming a polygon. +-- @type ZONE_POLYGON +-- @Extends Zone#ZONE_BASE +ZONE_POLYGON = { + ClassName="ZONE_POLYGON", + } + +--- Constructor to create a ZONE_POLYGON instance, taking the zone name and the name of the @{Group#GROUP} defined within the Mission Editor. +-- The @{Group#GROUP} waypoints define the polygon corners. The first and the last point are automatically connected by ZONE_POLYGON. +-- @param #ZONE_POLYGON self +-- @param #string ZoneName Name of the zone. +-- @param Group#GROUP ZoneGroup The GROUP waypoints as defined within the Mission Editor define the polygon shape. +-- @return #ZONE_POLYGON self +function ZONE_POLYGON:New( ZoneName, ZoneGroup ) + local self = BASE:Inherit( self, ZONE_BASE:New( ZoneName ) ) + self:F( { ZoneName, ZoneGroup } ) + + local GroupPoints = ZoneGroup:GetTaskRoute() + local i = 0 + + self.Polygon = {} + + for i = 1, #GroupPoints do + self.Polygon[i] = {} + self.Polygon[i].x = GroupPoints[i].x + self.Polygon[i].y = GroupPoints[i].y + end + + return self +end + + +--- Returns if a location is within the zone. +-- @param #ZONE_POLYGON self +-- @param DCSTypes#Vec2 PointVec2 The location to test. +-- @return #boolean true if the location is within the zone. +function ZONE_POLYGON:IsPointVec2InZone( PointVec2 ) + self:F2( PointVec2 ) + + local i + local j + local c = false + + i = 1 + j = #self.Polygon + + while i < #self.Polygon do + j = i + i = i + 1 + self:T( { i, j, self.Polygon[i], self.Polygon[j] } ) + if ( ( ( self.Polygon[i].y > PointVec2.y ) ~= ( self.Polygon[j].y > PointVec2.y ) ) and + ( PointVec2.x < ( self.Polygon[j].x - self.Polygon[i].x ) * ( PointVec2.y - self.Polygon[i].y ) / ( self.Polygon[j].y - self.Polygon[i].y ) + self.Polygon[i].x ) + ) then + c = not c + end + self:T( { "c = ", c } ) + end + + return c +end + +--- The CLIENT models client units in multi player missions. +-- +-- @{#CLIENT} class +-- ================ +-- Clients are those **Units** defined within the Mission Editor that have the skillset defined as __Client__ or __Player__. +-- Note that clients are NOT the same as Units, they are NOT necessarily alive. +-- The @{CLIENT} class is a wrapper class to handle the DCS Unit objects that have the skillset defined as __Client__ or __Player__: +-- +-- * Wraps the DCS Unit objects with skill level set to Player or Client. +-- * Support all DCS Unit APIs. +-- * Enhance with Unit specific APIs not in the DCS Group API set. +-- * When player joins Unit, execute alive init logic. +-- * Handles messages to players. +-- * Manage the "state" of the DCS Unit. +-- +-- Clients are being used by the @{MISSION} class to follow players and register their successes. +-- +-- CLIENT reference methods +-- ======================= +-- For each DCS Unit having skill level Player or Client, a CLIENT wrapper object (instance) will be created within the _@{DATABASE} object. +-- This is done at the beginning of the mission (when the mission starts). +-- +-- The CLIENT class does not contain a :New() method, rather it provides :Find() methods to retrieve the object reference +-- using the DCS Unit or the DCS UnitName. +-- +-- Another thing to know is that CLIENT objects do not "contain" the DCS Unit object. +-- The CLIENT methods will reference the DCS Unit object by name when it is needed during API execution. +-- If the DCS Unit object does not exist or is nil, the CLIENT methods will return nil and log an exception in the DCS.log file. +-- +-- The CLIENT class provides the following functions to retrieve quickly the relevant CLIENT instance: +-- +-- * @{#CLIENT.Find}(): Find a CLIENT instance from the _DATABASE object using a DCS Unit object. +-- * @{#CLIENT.FindByName}(): Find a CLIENT instance from the _DATABASE object using a DCS Unit name. +-- +-- IMPORTANT: ONE SHOULD NEVER SANATIZE these CLIENT OBJECT REFERENCES! (make the CLIENT object references nil). +-- +-- @module Client +-- @author FlightControl + +Include.File( "Routines" ) +Include.File( "Base" ) +Include.File( "Cargo" ) +Include.File( "Message" ) + + +--- The CLIENT class +-- @type CLIENT +-- @extends Unit#UNIT +CLIENT = { + ONBOARDSIDE = { + NONE = 0, + LEFT = 1, + RIGHT = 2, + BACK = 3, + FRONT = 4 + }, + ClassName = "CLIENT", + ClientName = nil, + ClientAlive = false, + ClientTransport = false, + ClientBriefingShown = false, + _Menus = {}, + _Tasks = {}, + Messages = { + } +} + + +--- Finds a CLIENT from the _DATABASE using the relevant DCS Unit. +-- @param #CLIENT self +-- @param #string ClientName Name of the DCS **Unit** as defined within the Mission Editor. +-- @param #string ClientBriefing Text that describes the briefing of the mission when a Player logs into the Client. +-- @return #CLIENT +-- @usage +-- -- Create new Clients. +-- local Mission = MISSIONSCHEDULER.AddMission( 'Russia Transport Troops SA-6', 'Operational', 'Transport troops from the control center to one of the SA-6 SAM sites to activate their operation.', 'Russia' ) +-- Mission:AddGoal( DeploySA6TroopsGoal ) +-- +-- Mission:AddClient( CLIENT:FindByName( 'RU MI-8MTV2*HOT-Deploy Troops 1' ):Transport() ) +-- Mission:AddClient( CLIENT:FindByName( 'RU MI-8MTV2*RAMP-Deploy Troops 3' ):Transport() ) +-- Mission:AddClient( CLIENT:FindByName( 'RU MI-8MTV2*HOT-Deploy Troops 2' ):Transport() ) +-- Mission:AddClient( CLIENT:FindByName( 'RU MI-8MTV2*RAMP-Deploy Troops 4' ):Transport() ) +function CLIENT:Find( DCSUnit ) + local ClientName = DCSUnit:getName() + local ClientFound = _DATABASE:FindClient( ClientName ) + + if ClientFound then + ClientFound:F( ClientName ) + return ClientFound + end + + error( "CLIENT not found for: " .. ClientName ) +end + + +--- Finds a CLIENT from the _DATABASE using the relevant Client Unit Name. +-- As an optional parameter, a briefing text can be given also. +-- @param #CLIENT self +-- @param #string ClientName Name of the DCS **Unit** as defined within the Mission Editor. +-- @param #string ClientBriefing Text that describes the briefing of the mission when a Player logs into the Client. +-- @return #CLIENT +-- @usage +-- -- Create new Clients. +-- local Mission = MISSIONSCHEDULER.AddMission( 'Russia Transport Troops SA-6', 'Operational', 'Transport troops from the control center to one of the SA-6 SAM sites to activate their operation.', 'Russia' ) +-- Mission:AddGoal( DeploySA6TroopsGoal ) +-- +-- Mission:AddClient( CLIENT:FindByName( 'RU MI-8MTV2*HOT-Deploy Troops 1' ):Transport() ) +-- Mission:AddClient( CLIENT:FindByName( 'RU MI-8MTV2*RAMP-Deploy Troops 3' ):Transport() ) +-- Mission:AddClient( CLIENT:FindByName( 'RU MI-8MTV2*HOT-Deploy Troops 2' ):Transport() ) +-- Mission:AddClient( CLIENT:FindByName( 'RU MI-8MTV2*RAMP-Deploy Troops 4' ):Transport() ) +function CLIENT:FindByName( ClientName, ClientBriefing ) + local ClientFound = _DATABASE:FindClient( ClientName ) + + if ClientFound then + ClientFound:F( { ClientName, ClientBriefing } ) + ClientFound:AddBriefing( ClientBriefing ) + ClientFound.MessageSwitch = true + + return ClientFound + end + + error( "CLIENT not found for: " .. ClientName ) +end + +function CLIENT:Register( ClientName ) + local self = BASE:Inherit( self, UNIT:Register( ClientName ) ) + + self:F( ClientName ) + self.ClientName = ClientName + self.MessageSwitch = true + self.ClientAlive2 = false + + --self.AliveCheckScheduler = routines.scheduleFunction( self._AliveCheckScheduler, { self }, timer.getTime() + 1, 5 ) + self.AliveCheckScheduler = SCHEDULER:New( self, self._AliveCheckScheduler, {}, 1, 5 ) + + return self +end + + +--- Transport defines that the Client is a Transport. Transports show cargo. +-- @param #CLIENT self +-- @return #CLIENT +function CLIENT:Transport() + self:F() + + self.ClientTransport = true + return self +end + +--- AddBriefing adds a briefing to a CLIENT when a player joins a mission. +-- @param #CLIENT self +-- @param #string ClientBriefing is the text defining the Mission briefing. +-- @return #CLIENT self +function CLIENT:AddBriefing( ClientBriefing ) + self:F( ClientBriefing ) + self.ClientBriefing = ClientBriefing + self.ClientBriefingShown = false + + return self +end + +--- Show the briefing of a CLIENT. +-- @param #CLIENT self +-- @return #CLIENT self +function CLIENT:ShowBriefing() + self:F( { self.ClientName, self.ClientBriefingShown } ) + + if not self.ClientBriefingShown then + self.ClientBriefingShown = true + local Briefing = "" + if self.ClientBriefing then + Briefing = Briefing .. self.ClientBriefing + end + Briefing = Briefing .. " Press [LEFT ALT]+[B] to view the complete mission briefing." + self:Message( Briefing, 60, self.ClientName .. '/ClientBriefing', "Briefing" ) + end + + return self +end + +--- Show the mission briefing of a MISSION to the CLIENT. +-- @param #CLIENT self +-- @param #string MissionBriefing +-- @return #CLIENT self +function CLIENT:ShowMissionBriefing( MissionBriefing ) + self:F( { self.ClientName } ) + + if MissionBriefing then + self:Message( MissionBriefing, 60, self.ClientName .. '/MissionBriefing', "Mission Briefing" ) + end + + return self +end + + + +--- Resets a CLIENT. +-- @param #CLIENT self +-- @param #string ClientName Name of the Group as defined within the Mission Editor. The Group must have a Unit with the type Client. +function CLIENT:Reset( ClientName ) + self:F() + self._Menus = {} +end + +-- Is Functions + +--- Checks if the CLIENT is a multi-seated UNIT. +-- @param #CLIENT self +-- @return #boolean true if multi-seated. +function CLIENT:IsMultiSeated() + self:F( self.ClientName ) + + local ClientMultiSeatedTypes = { + ["Mi-8MT"] = "Mi-8MT", + ["UH-1H"] = "UH-1H", + ["P-51B"] = "P-51B" + } + + if self:IsAlive() then + local ClientTypeName = self:GetClientGroupUnit():GetTypeName() + if ClientMultiSeatedTypes[ClientTypeName] then + return true + end + end + + return false +end + +--- Checks for a client alive event and calls a function on a continuous basis. +-- @param #CLIENT self +-- @param #function CallBack Function. +-- @return #CLIENT +function CLIENT:Alive( CallBack, ... ) + self:F() + + self.ClientCallBack = CallBack + self.ClientParameters = arg + + return self +end + +--- @param #CLIENT self +function CLIENT:_AliveCheckScheduler() + self:F( { self.ClientName, self.ClientAlive2, self.ClientBriefingShown } ) + + if self:IsAlive() then -- Polymorphic call of UNIT + if self.ClientAlive2 == false then + self:ShowBriefing() + if self.ClientCallBack then + self:T("Calling Callback function") + self.ClientCallBack( self, unpack( self.ClientParameters ) ) + end + self.ClientAlive2 = true + end + else + if self.ClientAlive2 == true then + self.ClientAlive2 = false + end + end + + return true +end + +--- Return the DCSGroup of a Client. +-- This function is modified to deal with a couple of bugs in DCS 1.5.3 +-- @param #CLIENT self +-- @return DCSGroup#Group +function CLIENT:GetDCSGroup() + self:F3() + +-- local ClientData = Group.getByName( self.ClientName ) +-- if ClientData and ClientData:isExist() then +-- self:T( self.ClientName .. " : group found!" ) +-- return ClientData +-- else +-- return nil +-- end + + local ClientUnit = Unit.getByName( self.ClientName ) + + local CoalitionsData = { AlivePlayersRed = coalition.getPlayers( coalition.side.RED ), AlivePlayersBlue = coalition.getPlayers( coalition.side.BLUE ) } + for CoalitionId, CoalitionData in pairs( CoalitionsData ) do + self:T3( { "CoalitionData:", CoalitionData } ) + for UnitId, UnitData in pairs( CoalitionData ) do + self:T3( { "UnitData:", UnitData } ) + if UnitData and UnitData:isExist() then + + --self:E(self.ClientName) + if ClientUnit then + local ClientGroup = ClientUnit:getGroup() + if ClientGroup then + self:T3( "ClientGroup = " .. self.ClientName ) + if ClientGroup:isExist() and UnitData:getGroup():isExist() then + if ClientGroup:getID() == UnitData:getGroup():getID() then + self:T3( "Normal logic" ) + self:T3( self.ClientName .. " : group found!" ) + self.ClientGroupID = ClientGroup:getID() + self.ClientGroupName = ClientGroup:getName() + return ClientGroup + end + else + -- Now we need to resolve the bugs in DCS 1.5 ... + -- Consult the database for the units of the Client Group. (ClientGroup:getUnits() returns nil) + self:T3( "Bug 1.5 logic" ) + local ClientGroupTemplate = _DATABASE.Templates.Units[self.ClientName].GroupTemplate + self.ClientGroupID = ClientGroupTemplate.groupId + self.ClientGroupName = _DATABASE.Templates.Units[self.ClientName].GroupName + self:T3( self.ClientName .. " : group found in bug 1.5 resolvement logic!" ) + return ClientGroup + end + -- else + -- error( "Client " .. self.ClientName .. " not found!" ) + end + else + --self:E( { "Client not found!", self.ClientName } ) + end + end + end + end + + -- For non player clients + if ClientUnit then + local ClientGroup = ClientUnit:getGroup() + if ClientGroup then + self:T3( "ClientGroup = " .. self.ClientName ) + if ClientGroup:isExist() then + self:T3( "Normal logic" ) + self:T3( self.ClientName .. " : group found!" ) + return ClientGroup + end + end + end + + self.ClientGroupID = nil + self.ClientGroupUnit = nil + + return nil +end + + +-- TODO: Check DCSTypes#Group.ID +--- Get the group ID of the client. +-- @param #CLIENT self +-- @return DCSTypes#Group.ID +function CLIENT:GetClientGroupID() + + local ClientGroup = self:GetDCSGroup() + + --self:E( self.ClientGroupID ) -- Determined in GetDCSGroup() + return self.ClientGroupID +end + + +--- Get the name of the group of the client. +-- @param #CLIENT self +-- @return #string +function CLIENT:GetClientGroupName() + + local ClientGroup = self:GetDCSGroup() + + self:T( self.ClientGroupName ) -- Determined in GetDCSGroup() + return self.ClientGroupName +end + +--- Returns the UNIT of the CLIENT. +-- @param #CLIENT self +-- @return Unit#UNIT +function CLIENT:GetClientGroupUnit() + self:F2() + + local ClientDCSUnit = Unit.getByName( self.ClientName ) + + self:T( self.ClientDCSUnit ) + if ClientDCSUnit and ClientDCSUnit:isExist() then + local ClientUnit = _DATABASE:FindUnit( self.ClientName ) + self:T2( ClientUnit ) + return ClientUnit + end +end + +--- Returns the DCSUnit of the CLIENT. +-- @param #CLIENT self +-- @return DCSTypes#Unit +function CLIENT:GetClientGroupDCSUnit() + self:F2() + + local ClientDCSUnit = Unit.getByName( self.ClientName ) + + if ClientDCSUnit and ClientDCSUnit:isExist() then + self:T2( ClientDCSUnit ) + return ClientDCSUnit + end +end + + +--- Evaluates if the CLIENT is a transport. +-- @param #CLIENT self +-- @return #boolean true is a transport. +function CLIENT:IsTransport() + self:F() + return self.ClientTransport +end + +--- Shows the @{Cargo#CARGO} contained within the CLIENT to the player as a message. +-- The @{Cargo#CARGO} is shown using the @{Message#MESSAGE} distribution system. +-- @param #CLIENT self +function CLIENT:ShowCargo() + self:F() + + local CargoMsg = "" + + for CargoName, Cargo in pairs( CARGOS ) do + if self == Cargo:IsLoadedInClient() then + CargoMsg = CargoMsg .. Cargo.CargoName .. " Type:" .. Cargo.CargoType .. " Weight: " .. Cargo.CargoWeight .. "\n" + end + end + + if CargoMsg == "" then + CargoMsg = "empty" + end + + self:Message( CargoMsg, 15, self.ClientName .. "/Cargo", "Co-Pilot: Cargo Status", 30 ) + +end + +-- TODO (1) I urgently need to revise this. +--- A local function called by the DCS World Menu system to switch off messages. +function CLIENT.SwitchMessages( PrmTable ) + PrmTable[1].MessageSwitch = PrmTable[2] +end + +--- The main message driver for the CLIENT. +-- This function displays various messages to the Player logged into the CLIENT through the DCS World Messaging system. +-- @param #CLIENT self +-- @param #string Message is the text describing the message. +-- @param #number MessageDuration is the duration in seconds that the Message should be displayed. +-- @param #string MessageId is a text identifying the Message in the MessageQueue. The Message system overwrites Messages with the same MessageId +-- @param #string MessageCategory is the category of the message (the title). +-- @param #number MessageInterval is the interval in seconds between the display of the @{Message#MESSAGE} when the CLIENT is in the air. +function CLIENT:Message( Message, MessageDuration, MessageId, MessageCategory, MessageInterval ) + self:F( { Message, MessageDuration, MessageId, MessageCategory, MessageInterval } ) + + if not self.MenuMessages then + if self:GetClientGroupID() then + self.MenuMessages = MENU_CLIENT:New( self, 'Messages' ) + self.MenuRouteMessageOn = MENU_CLIENT_COMMAND:New( self, 'Messages On', self.MenuMessages, CLIENT.SwitchMessages, { self, true } ) + self.MenuRouteMessageOff = MENU_CLIENT_COMMAND:New( self,'Messages Off', self.MenuMessages, CLIENT.SwitchMessages, { self, false } ) + end + end + + if self.MessageSwitch == true then + if MessageCategory == nil then + MessageCategory = "Messages" + end + if self.Messages[MessageId] == nil then + self.Messages[MessageId] = {} + self.Messages[MessageId].MessageId = MessageId + self.Messages[MessageId].MessageTime = timer.getTime() + self.Messages[MessageId].MessageDuration = MessageDuration + if MessageInterval == nil then + self.Messages[MessageId].MessageInterval = 600 + else + self.Messages[MessageId].MessageInterval = MessageInterval + end + MESSAGE:New( Message, MessageCategory, MessageDuration, MessageId ):ToClient( self ) + else + if self:GetClientGroupDCSUnit() and not self:GetClientGroupDCSUnit():inAir() then + if timer.getTime() - self.Messages[MessageId].MessageTime >= self.Messages[MessageId].MessageDuration + 10 then + MESSAGE:New( Message, MessageCategory, MessageDuration, MessageId ):ToClient( self ) + self.Messages[MessageId].MessageTime = timer.getTime() + end + else + if timer.getTime() - self.Messages[MessageId].MessageTime >= self.Messages[MessageId].MessageDuration + self.Messages[MessageId].MessageInterval then + MESSAGE:New( Message, MessageCategory, MessageDuration, MessageId ):ToClient( self ) + self.Messages[MessageId].MessageTime = timer.getTime() + end + end + end + end +end +--- Manage the mission database. +-- +-- @{#DATABASE} class +-- ================== +-- Mission designers can use the DATABASE class to refer to: +-- +-- * UNITS +-- * GROUPS +-- * players +-- * alive players +-- * CLIENTS +-- * alive CLIENTS +-- +-- On top, for internal MOOSE administration purposes, the DATBASE administers the Unit and Gruop templates as defined within the Mission Editor. +-- +-- Moose will automatically create one instance of the DATABASE class into the **global** object _DATABASE. +-- Moose refers to _DATABASE within the framework extensively, but you can also refer to the _DATABASE object within your missions if required. +-- +-- DATABASE iterators: +-- =================== +-- You can iterate the database with the available iterator methods. +-- The iterator methods will walk the DATABASE set, and call for each element within the set a function that you provide. +-- The following iterator methods are currently available within the DATABASE: +-- +-- * @{#DATABASE.ForEachUnit}: Calls a function for each @{UNIT} it finds within the DATABASE. +-- * @{#DATABASE.ForEachGroup}: Calls a function for each @{GROUP} it finds within the DATABASE. +-- * @{#DATABASE.ForEachPlayer}: Calls a function for each player it finds within the DATABASE. +-- * @{#DATABASE.ForEachPlayerAlive}: Calls a function for each alive player it finds within the DATABASE. +-- * @{#DATABASE.ForEachClient}: Calls a function for each @{CLIENT} it finds within the DATABASE. +-- * @{#DATABASE.ForEachClientAlive}: Calls a function for each alive @{CLIENT} it finds within the DATABASE. +-- +-- @module Database +-- @author FlightControl + +Include.File( "Routines" ) +Include.File( "Base" ) +Include.File( "Menu" ) +Include.File( "Group" ) +Include.File( "Unit" ) +Include.File( "Event" ) +Include.File( "Client" ) + + +--- DATABASE class +-- @type DATABASE +-- @extends Base#BASE +DATABASE = { + ClassName = "DATABASE", + Templates = { + Units = {}, + Groups = {}, + ClientsByName = {}, + ClientsByID = {}, + }, + DCSUnits = {}, + DCSGroups = {}, + UNITS = {}, + GROUPS = {}, + PLAYERS = {}, + PLAYERSALIVE = {}, + CLIENTS = {}, + CLIENTSALIVE = {}, + NavPoints = {}, +} + +local _DATABASECoalition = + { + [1] = "Red", + [2] = "Blue", + } + +local _DATABASECategory = + { + [Unit.Category.AIRPLANE] = "Plane", + [Unit.Category.HELICOPTER] = "Helicopter", + [Unit.Category.GROUND_UNIT] = "Vehicle", + [Unit.Category.SHIP] = "Ship", + [Unit.Category.STRUCTURE] = "Structure", + } + + +--- Creates a new DATABASE object, building a set of units belonging to a coalitions, categories, countries, types or with defined prefix names. +-- @param #DATABASE self +-- @return #DATABASE +-- @usage +-- -- Define a new DATABASE Object. This DBObject will contain a reference to all Group and Unit Templates defined within the ME and the DCSRTE. +-- DBObject = DATABASE:New() +function DATABASE:New() + + -- Inherits from BASE + local self = BASE:Inherit( self, BASE:New() ) + + _EVENTDISPATCHER:OnBirth( self._EventOnBirth, self ) + _EVENTDISPATCHER:OnDead( self._EventOnDeadOrCrash, self ) + _EVENTDISPATCHER:OnCrash( self._EventOnDeadOrCrash, self ) + + + -- Follow alive players and clients + _EVENTDISPATCHER:OnPlayerEnterUnit( self._EventOnPlayerEnterUnit, self ) + _EVENTDISPATCHER:OnPlayerLeaveUnit( self._EventOnPlayerLeaveUnit, self ) + + self:_RegisterTemplates() + self:_RegisterDatabase() + self:_RegisterPlayers() + + return self +end + +--- Finds a Unit based on the Unit Name. +-- @param #DATABASE self +-- @param #string UnitName +-- @return Unit#UNIT The found Unit. +function DATABASE:FindUnit( UnitName ) + + local UnitFound = self.UNITS[UnitName] + return UnitFound +end + + +--- Adds a Unit based on the Unit Name in the DATABASE. +-- @param #DATABASE self +function DATABASE:AddUnit( DCSUnit, DCSUnitName ) + + self.DCSUnits[DCSUnitName] = DCSUnit + self.UNITS[DCSUnitName] = UNIT:Register( DCSUnitName ) +end + + +--- Deletes a Unit from the DATABASE based on the Unit Name. +-- @param #DATABASE self +function DATABASE:DeleteUnit( DCSUnitName ) + + self.DCSUnits[DCSUnitName] = nil +end + + +--- Finds a CLIENT based on the ClientName. +-- @param #DATABASE self +-- @param #string ClientName +-- @return Client#CLIENT The found CLIENT. +function DATABASE:FindClient( ClientName ) + + local ClientFound = self.CLIENTS[ClientName] + return ClientFound +end + + +--- Adds a CLIENT based on the ClientName in the DATABASE. +-- @param #DATABASE self +function DATABASE:AddClient( ClientName ) + + self.CLIENTS[ClientName] = CLIENT:Register( ClientName ) + self:E( self.CLIENTS[ClientName]:GetClassNameAndID() ) +end + + +--- Finds a GROUP based on the GroupName. +-- @param #DATABASE self +-- @param #string GroupName +-- @return Group#GROUP The found GROUP. +function DATABASE:FindGroup( GroupName ) + + local GroupFound = self.GROUPS[GroupName] + return GroupFound +end + + +--- Adds a GROUP based on the GroupName in the DATABASE. +-- @param #DATABASE self +function DATABASE:AddGroup( DCSGroup, GroupName ) + + self.DCSGroups[GroupName] = DCSGroup + self.GROUPS[GroupName] = GROUP:Register( GroupName ) +end + +--- Adds a player based on the Player Name in the DATABASE. +-- @param #DATABASE self +function DATABASE:AddPlayer( UnitName, PlayerName ) + + if PlayerName then + self:E( { "Add player for unit:", UnitName, PlayerName } ) + self.PLAYERS[PlayerName] = PlayerName + self.PLAYERSALIVE[PlayerName] = PlayerName + self.CLIENTSALIVE[PlayerName] = self:FindClient( UnitName ) + end +end + +--- Deletes a player from the DATABASE based on the Player Name. +-- @param #DATABASE self +function DATABASE:DeletePlayer( PlayerName ) + + if PlayerName then + self:E( { "Clean player:", PlayerName } ) + self.PLAYERSALIVE[PlayerName] = nil + self.CLIENTSALIVE[PlayerName] = nil + end +end + + +--- Instantiate new Groups within the DCSRTE. +-- This method expects EXACTLY the same structure as a structure within the ME, and needs 2 additional fields defined: +-- SpawnCountryID, SpawnCategoryID +-- This method is used by the SPAWN class. +-- @param #DATABASE self +-- @param #table SpawnTemplate +-- @return #DATABASE self +function DATABASE:Spawn( SpawnTemplate ) + self:F2( SpawnTemplate.name ) + + self:T2( { SpawnTemplate.SpawnCountryID, SpawnTemplate.SpawnCategoryID } ) + + -- Copy the spawn variables of the template in temporary storage, nullify, and restore the spawn variables. + local SpawnCoalitionID = SpawnTemplate.SpawnCoalitionID + local SpawnCountryID = SpawnTemplate.SpawnCountryID + local SpawnCategoryID = SpawnTemplate.SpawnCategoryID + + -- Nullify + SpawnTemplate.SpawnCoalitionID = nil + SpawnTemplate.SpawnCountryID = nil + SpawnTemplate.SpawnCategoryID = nil + + self:_RegisterTemplate( SpawnTemplate ) + coalition.addGroup( SpawnCountryID, SpawnCategoryID, SpawnTemplate ) + + -- Restore + SpawnTemplate.SpawnCoalitionID = SpawnCoalitionID + SpawnTemplate.SpawnCountryID = SpawnCountryID + SpawnTemplate.SpawnCategoryID = SpawnCategoryID + + + local SpawnGroup = GROUP:Register( SpawnTemplate.name ) + return SpawnGroup +end + +--- Set a status to a Group within the Database, this to check crossing events for example. +function DATABASE:SetStatusGroup( GroupName, Status ) + self:F2( Status ) + + self.Templates.Groups[GroupName].Status = Status +end + +--- Get a status to a Group within the Database, this to check crossing events for example. +function DATABASE:GetStatusGroup( GroupName ) + self:F2( Status ) + + if self.Templates.Groups[GroupName] then + return self.Templates.Groups[GroupName].Status + else + return "" + end +end + + +--- Private method that registers new Group Templates within the DATABASE Object. +-- @param #DATABASE self +-- @param #table GroupTemplate +-- @return #DATABASE self +function DATABASE:_RegisterTemplate( GroupTemplate ) + + local GroupTemplateName = env.getValueDictByKey(GroupTemplate.name) + + if not self.Templates.Groups[GroupTemplateName] then + self.Templates.Groups[GroupTemplateName] = {} + self.Templates.Groups[GroupTemplateName].Status = nil + end + + -- Delete the spans from the route, it is not needed and takes memory. + if GroupTemplate.route and GroupTemplate.route.spans then + GroupTemplate.route.spans = nil + end + + self.Templates.Groups[GroupTemplateName].GroupName = GroupTemplateName + self.Templates.Groups[GroupTemplateName].Template = GroupTemplate + self.Templates.Groups[GroupTemplateName].groupId = GroupTemplate.groupId + self.Templates.Groups[GroupTemplateName].UnitCount = #GroupTemplate.units + self.Templates.Groups[GroupTemplateName].Units = GroupTemplate.units + + self:T2( { "Group", self.Templates.Groups[GroupTemplateName].GroupName, self.Templates.Groups[GroupTemplateName].UnitCount } ) + + for unit_num, UnitTemplate in pairs( GroupTemplate.units ) do + + local UnitTemplateName = env.getValueDictByKey(UnitTemplate.name) + self.Templates.Units[UnitTemplateName] = {} + self.Templates.Units[UnitTemplateName].UnitName = UnitTemplateName + self.Templates.Units[UnitTemplateName].Template = UnitTemplate + self.Templates.Units[UnitTemplateName].GroupName = GroupTemplateName + self.Templates.Units[UnitTemplateName].GroupTemplate = GroupTemplate + self.Templates.Units[UnitTemplateName].GroupId = GroupTemplate.groupId + self:E( {"skill",UnitTemplate.skill}) + if UnitTemplate.skill and (UnitTemplate.skill == "Client" or UnitTemplate.skill == "Player") then + self.Templates.ClientsByName[UnitTemplateName] = UnitTemplate + self.Templates.ClientsByID[UnitTemplate.unitId] = UnitTemplate + end + self:E( { "Unit", self.Templates.Units[UnitTemplateName].UnitName } ) + end +end + + +--- Private method that registers all alive players in the mission. +-- @param #DATABASE self +-- @return #DATABASE self +function DATABASE:_RegisterPlayers() + + local CoalitionsData = { AlivePlayersRed = coalition.getPlayers( coalition.side.RED ), AlivePlayersBlue = coalition.getPlayers( coalition.side.BLUE ) } + for CoalitionId, CoalitionData in pairs( CoalitionsData ) do + for UnitId, UnitData in pairs( CoalitionData ) do + self:T3( { "UnitData:", UnitData } ) + if UnitData and UnitData:isExist() then + local UnitName = UnitData:getName() + local PlayerName = UnitData:getPlayerName() + if not self.PLAYERS[PlayerName] then + self:E( { "Add player for unit:", UnitName, PlayerName } ) + self:AddPlayer( UnitName, PlayerName ) + end + end + end + end + + return self +end + + +--- Private method that registers all datapoints within in the mission. +-- @param #DATABASE self +-- @return #DATABASE self +function DATABASE:_RegisterDatabase() + + local CoalitionsData = { GroupsRed = coalition.getGroups( coalition.side.RED ), GroupsBlue = coalition.getGroups( coalition.side.BLUE ) } + for CoalitionId, CoalitionData in pairs( CoalitionsData ) do + for DCSGroupId, DCSGroup in pairs( CoalitionData ) do + + if DCSGroup:isExist() then + local DCSGroupName = DCSGroup:getName() + + self:E( { "Register Group:", DCSGroup, DCSGroupName } ) + self:AddGroup( DCSGroup, DCSGroupName ) + + for DCSUnitId, DCSUnit in pairs( DCSGroup:getUnits() ) do + + local DCSUnitName = DCSUnit:getName() + self:E( { "Register Unit:", DCSUnit, DCSUnitName } ) + self:AddUnit( DCSUnit, DCSUnitName ) + end + else + self:E( { "Group does not exist: ", DCSGroup } ) + end + + end + end + + for ClientName, ClientTemplate in pairs( self.Templates.ClientsByName ) do + self:E( { "Adding Client:", ClientName } ) + self:AddClient( ClientName ) + end + + return self +end + +--- Events + +--- Handles the OnBirth event for the alive units set. +-- @param #DATABASE self +-- @param Event#EVENTDATA Event +function DATABASE:_EventOnBirth( Event ) + self:F2( { Event } ) + + if Event.IniDCSUnit then + self:AddUnit( Event.IniDCSUnit, Event.IniDCSUnitName ) + self:AddGroup( Event.IniDCSGroup, Event.IniDCSGroupName ) + self:_EventOnPlayerEnterUnit( Event ) + end +end + + +--- Handles the OnDead or OnCrash event for alive units set. +-- @param #DATABASE self +-- @param Event#EVENTDATA Event +function DATABASE:_EventOnDeadOrCrash( Event ) + self:F2( { Event } ) + + if Event.IniDCSUnit then + if self.DCSUnits[Event.IniDCSUnitName] then + self:DeleteUnit( Event.IniDCSUnitName ) + -- add logic to correctly remove a group once all units are destroyed... + end + end +end + + +--- Handles the OnPlayerEnterUnit event to fill the active players table (with the unit filter applied). +-- @param #DATABASE self +-- @param Event#EVENTDATA Event +function DATABASE:_EventOnPlayerEnterUnit( Event ) + self:F2( { Event } ) + + if Event.IniDCSUnit then + local PlayerName = Event.IniDCSUnit:getPlayerName() + if not self.PLAYERSALIVE[PlayerName] then + self:AddPlayer( Event.IniDCSUnitName, PlayerName ) + end + end +end + + +--- Handles the OnPlayerLeaveUnit event to clean the active players table. +-- @param #DATABASE self +-- @param Event#EVENTDATA Event +function DATABASE:_EventOnPlayerLeaveUnit( Event ) + self:F2( { Event } ) + + if Event.IniDCSUnit then + local PlayerName = Event.IniDCSUnit:getPlayerName() + if self.PLAYERSALIVE[PlayerName] then + self:DeletePlayer( PlayerName ) + end + end +end + +--- Iterators + +--- Iterate the DATABASE and call an iterator function for the given set, providing the Object for each element within the set and optional parameters. +-- @param #DATABASE self +-- @param #function IteratorFunction The function that will be called when there is an alive player in the database. +-- @return #DATABASE self +function DATABASE:ForEach( IteratorFunction, arg, Set ) + self:F2( arg ) + + local function CoRoutine() + local Count = 0 + for ObjectID, Object in pairs( Set ) do + self:T2( Object ) + IteratorFunction( Object, unpack( arg ) ) + Count = Count + 1 + if Count % 10 == 0 then + coroutine.yield( false ) + end + end + return true + end + + local co = coroutine.create( CoRoutine ) + + local function Schedule() + + local status, res = coroutine.resume( co ) + self:T2( { status, res } ) + + if status == false then + error( res ) + end + if res == false then + return true -- resume next time the loop + end + + return false + end + + local Scheduler = SCHEDULER:New( self, Schedule, {}, 0.001, 0.001, 0 ) + + return self +end + + +--- Iterate the DATABASE and call an iterator function for each **alive** unit, providing the DCSUnit and optional parameters. +-- @param #DATABASE self +-- @param #function IteratorFunction The function that will be called when there is an alive unit in the database. The function needs to accept a DCSUnit parameter. +-- @return #DATABASE self +function DATABASE:ForEachDCSUnit( IteratorFunction, ... ) + self:F2( arg ) + + self:ForEach( IteratorFunction, arg, self.DCSUnits ) + + return self +end + + +--- Iterate the DATABASE and call an iterator function for each **alive** UNIT, providing the UNIT and optional parameters. +-- @param #DATABASE self +-- @param #function IteratorFunction The function that will be called when there is an alive UNIT in the database. The function needs to accept a UNIT parameter. +-- @return #DATABASE self +function DATABASE:ForEachUnit( IteratorFunction, ... ) + self:F2( arg ) + + self:ForEach( IteratorFunction, arg, self.UNITS ) + + return self +end + +--- Iterate the DATABASE and call an iterator function for each **alive** GROUP, providing the GROUP and optional parameters. +-- @param #DATABASE self +-- @param #function IteratorFunction The function that will be called when there is an alive GROUP in the database. The function needs to accept a GROUP parameter. +-- @return #DATABASE self +function DATABASE:ForEachGroup( IteratorFunction, ... ) + self:F2( arg ) + + self:ForEach( IteratorFunction, arg, self.GROUPS ) + + return self +end + + +--- Iterate the DATABASE and call an iterator function for each player, providing the player name and optional parameters. +-- @param #DATABASE self +-- @param #function IteratorFunction The function that will be called when there is an player in the database. The function needs to accept the player name. +-- @return #DATABASE self +function DATABASE:ForEachPlayer( IteratorFunction, ... ) + self:F2( arg ) + + self:ForEach( IteratorFunction, arg, self.PLAYERS ) + + return self +end + + +--- Iterate the DATABASE and call an iterator function for each **alive** player, providing the Unit of the player and optional parameters. +-- @param #DATABASE self +-- @param #function IteratorFunction The function that will be called when there is an alive player in the database. The function needs to accept a UNIT parameter. +-- @return #DATABASE self +function DATABASE:ForEachPlayerAlive( IteratorFunction, ... ) + self:F2( arg ) + + self:ForEach( IteratorFunction, arg, self.PLAYERSALIVE ) + + return self +end + +--- Iterate the DATABASE and call an iterator function for each CLIENT, providing the CLIENT to the function and optional parameters. +-- @param #DATABASE self +-- @param #function IteratorFunction The function that will be called when there is an alive player in the database. The function needs to accept a CLIENT parameter. +-- @return #DATABASE self +function DATABASE:ForEachClient( IteratorFunction, ... ) + self:F2( arg ) + + self:ForEach( IteratorFunction, arg, self.CLIENTS ) + + return self +end + +--- Iterate the DATABASE and call an iterator function for each **ALIVE** CLIENT, providing the CLIENT to the function and optional parameters. +-- @param #DATABASE self +-- @param #function IteratorFunction The function that will be called when there is an alive CLIENT in the database. The function needs to accept a CLIENT parameter. +-- @return #DATABASE self +function DATABASE:ForEachClientAlive( IteratorFunction, ... ) + self:F2( arg ) + + self:ForEach( IteratorFunction, arg, self.CLIENTSALIVE ) + + return self +end + + +function DATABASE:_RegisterTemplates() + self:F2() + + self.Navpoints = {} + self.UNITS = {} + --Build routines.db.units and self.Navpoints + for coa_name, coa_data in pairs(env.mission.coalition) do + + if (coa_name == 'red' or coa_name == 'blue') and type(coa_data) == 'table' then + --self.Units[coa_name] = {} + + ---------------------------------------------- + -- build nav points DB + self.Navpoints[coa_name] = {} + if coa_data.nav_points then --navpoints + for nav_ind, nav_data in pairs(coa_data.nav_points) do + + if type(nav_data) == 'table' then + self.Navpoints[coa_name][nav_ind] = routines.utils.deepCopy(nav_data) + + self.Navpoints[coa_name][nav_ind]['name'] = nav_data.callsignStr -- name is a little bit more self-explanatory. + self.Navpoints[coa_name][nav_ind]['point'] = {} -- point is used by SSE, support it. + self.Navpoints[coa_name][nav_ind]['point']['x'] = nav_data.x + self.Navpoints[coa_name][nav_ind]['point']['y'] = 0 + self.Navpoints[coa_name][nav_ind]['point']['z'] = nav_data.y + end + end + end + ------------------------------------------------- + if coa_data.country then --there is a country table + for cntry_id, cntry_data in pairs(coa_data.country) do + + local countryName = string.lower(cntry_data.name) + --self.Units[coa_name][countryName] = {} + --self.Units[coa_name][countryName]["countryId"] = cntry_data.id + + if type(cntry_data) == 'table' then --just making sure + + for obj_type_name, obj_type_data in pairs(cntry_data) do + + if obj_type_name == "helicopter" or obj_type_name == "ship" or obj_type_name == "plane" or obj_type_name == "vehicle" or obj_type_name == "static" then --should be an unncessary check + + local category = obj_type_name + + if ((type(obj_type_data) == 'table') and obj_type_data.group and (type(obj_type_data.group) == 'table') and (#obj_type_data.group > 0)) then --there's a group! + + --self.Units[coa_name][countryName][category] = {} + + for group_num, GroupTemplate in pairs(obj_type_data.group) do + + if GroupTemplate and GroupTemplate.units and type(GroupTemplate.units) == 'table' then --making sure again- this is a valid group + self:_RegisterTemplate( GroupTemplate ) + end --if GroupTemplate and GroupTemplate.units then + end --for group_num, GroupTemplate in pairs(obj_type_data.group) do + end --if ((type(obj_type_data) == 'table') and obj_type_data.group and (type(obj_type_data.group) == 'table') and (#obj_type_data.group > 0)) then + end --if obj_type_name == "helicopter" or obj_type_name == "ship" or obj_type_name == "plane" or obj_type_name == "vehicle" or obj_type_name == "static" then + end --for obj_type_name, obj_type_data in pairs(cntry_data) do + end --if type(cntry_data) == 'table' then + end --for cntry_id, cntry_data in pairs(coa_data.country) do + end --if coa_data.country then --there is a country table + end --if coa_name == 'red' or coa_name == 'blue' and type(coa_data) == 'table' then + end --for coa_name, coa_data in pairs(mission.coalition) do + + return self +end + + + + +--- The main include file for the MOOSE system. + +Include.File( "Routines" ) +Include.File( "Base" ) +Include.File( "Database" ) +Include.File( "Event" ) + +-- The order of the declarations is important here. Don't touch it. + +--- Declare the event dispatcher based on the EVENT class +_EVENTDISPATCHER = EVENT:New() -- #EVENT + +--- Declare the main database object, which is used internally by the MOOSE classes. +_DATABASE = DATABASE:New() -- Database#DATABASE + +--- Scoring system for MOOSE. +-- This scoring class calculates the hits and kills that players make within a simulation session. +-- Scoring is calculated using a defined algorithm. +-- With a small change in MissionScripting.lua, the scoring can also be logged in a CSV file, that can then be uploaded +-- to a database or a BI tool to publish the scoring results to the player community. +-- @module Scoring +-- @author FlightControl + + +Include.File( "Routines" ) +Include.File( "Base" ) +Include.File( "Menu" ) +Include.File( "Group" ) +Include.File( "Event" ) + + +--- The Scoring class +-- @type SCORING +-- @field Players A collection of the current players that have joined the game. +-- @extends Base#BASE +SCORING = { + ClassName = "SCORING", + ClassID = 0, + Players = {}, +} + +local _SCORINGCoalition = + { + [1] = "Red", + [2] = "Blue", + } + +local _SCORINGCategory = + { + [Unit.Category.AIRPLANE] = "Plane", + [Unit.Category.HELICOPTER] = "Helicopter", + [Unit.Category.GROUND_UNIT] = "Vehicle", + [Unit.Category.SHIP] = "Ship", + [Unit.Category.STRUCTURE] = "Structure", + } + +--- Creates a new SCORING object to administer the scoring achieved by players. +-- @param #SCORING self +-- @param #string GameName The name of the game. This name is also logged in the CSV score file. +-- @return #SCORING self +-- @usage +-- -- Define a new scoring object for the mission Gori Valley. +-- ScoringObject = SCORING:New( "Gori Valley" ) +function SCORING:New( GameName ) + + -- Inherits from BASE + local self = BASE:Inherit( self, BASE:New() ) + + if GameName then + self.GameName = GameName + else + error( "A game name must be given to register the scoring results" ) + end + + + _EVENTDISPATCHER:OnDead( self._EventOnDeadOrCrash, self ) + _EVENTDISPATCHER:OnCrash( self._EventOnDeadOrCrash, self ) + _EVENTDISPATCHER:OnHit( self._EventOnHit, self ) + + --self.SchedulerId = routines.scheduleFunction( SCORING._FollowPlayersScheduled, { self }, 0, 5 ) + self.SchedulerId = SCHEDULER:New( self, self._FollowPlayersScheduled, {}, 0, 5 ) + + self:ScoreMenu() + + return self + +end + +--- Creates a score radio menu. Can be accessed using Radio -> F10. +-- @param #SCORING self +-- @return #SCORING self +function SCORING:ScoreMenu() + self.Menu = SUBMENU:New( 'Scoring' ) + self.AllScoresMenu = COMMANDMENU:New( 'Score All Active Players', self.Menu, SCORING.ReportScoreAll, self ) + --- = COMMANDMENU:New('Your Current Score', ReportScore, SCORING.ReportScorePlayer, self ) + return self +end + +--- Follows new players entering Clients within the DCSRTE. +-- TODO: Need to see if i can catch this also with an event. It will eliminate the schedule ... +function SCORING:_FollowPlayersScheduled() + self:F3( "_FollowPlayersScheduled" ) + + local ClientUnit = 0 + local CoalitionsData = { AlivePlayersRed = coalition.getPlayers(coalition.side.RED), AlivePlayersBlue = coalition.getPlayers(coalition.side.BLUE) } + local unitId + local unitData + local AlivePlayerUnits = {} + + for CoalitionId, CoalitionData in pairs( CoalitionsData ) do + self:T3( { "_FollowPlayersScheduled", CoalitionData } ) + for UnitId, UnitData in pairs( CoalitionData ) do + self:_AddPlayerFromUnit( UnitData ) + end + end + + return true +end + + +--- Track DEAD or CRASH events for the scoring. +-- @param #SCORING self +-- @param Event#EVENTDATA Event +function SCORING:_EventOnDeadOrCrash( Event ) + self:F( { Event } ) + + local TargetUnit = nil + local TargetGroup = nil + local TargetUnitName = "" + local TargetGroupName = "" + local TargetPlayerName = "" + local TargetCoalition = nil + local TargetCategory = nil + local TargetType = nil + local TargetUnitCoalition = nil + local TargetUnitCategory = nil + local TargetUnitType = nil + + if Event.IniDCSUnit then + + TargetUnit = Event.IniDCSUnit + TargetUnitName = Event.IniDCSUnitName + TargetGroup = Event.IniDCSGroup + TargetGroupName = Event.IniDCSGroupName + TargetPlayerName = TargetUnit:getPlayerName() + + TargetCoalition = TargetUnit:getCoalition() + --TargetCategory = TargetUnit:getCategory() + TargetCategory = TargetUnit:getDesc().category -- Workaround + TargetType = TargetUnit:getTypeName() + + TargetUnitCoalition = _SCORINGCoalition[TargetCoalition] + TargetUnitCategory = _SCORINGCategory[TargetCategory] + TargetUnitType = TargetType + + self:T( { TargetUnitName, TargetGroupName, TargetPlayerName, TargetCoalition, TargetCategory, TargetType } ) + end + + for PlayerName, PlayerData in pairs( self.Players ) do + if PlayerData then -- This should normally not happen, but i'll test it anyway. + self:T( "Something got killed" ) + + -- Some variables + local InitUnitName = PlayerData.UnitName + local InitUnitType = PlayerData.UnitType + local InitCoalition = PlayerData.UnitCoalition + local InitCategory = PlayerData.UnitCategory + local InitUnitCoalition = _SCORINGCoalition[InitCoalition] + local InitUnitCategory = _SCORINGCategory[InitCategory] + + self:T( { InitUnitName, InitUnitType, InitUnitCoalition, InitCoalition, InitUnitCategory, InitCategory } ) + + -- What is he hitting? + if TargetCategory then + if PlayerData and PlayerData.Hit and PlayerData.Hit[TargetCategory] and PlayerData.Hit[TargetCategory][TargetUnitName] then -- Was there a hit for this unit for this player before registered??? + if not PlayerData.Kill[TargetCategory] then + PlayerData.Kill[TargetCategory] = {} + end + if not PlayerData.Kill[TargetCategory][TargetType] then + PlayerData.Kill[TargetCategory][TargetType] = {} + PlayerData.Kill[TargetCategory][TargetType].Score = 0 + PlayerData.Kill[TargetCategory][TargetType].ScoreKill = 0 + PlayerData.Kill[TargetCategory][TargetType].Penalty = 0 + PlayerData.Kill[TargetCategory][TargetType].PenaltyKill = 0 + end + + if InitCoalition == TargetCoalition then + PlayerData.Penalty = PlayerData.Penalty + 25 + PlayerData.Kill[TargetCategory][TargetType].Penalty = PlayerData.Kill[TargetCategory][TargetType].Penalty + 25 + PlayerData.Kill[TargetCategory][TargetType].PenaltyKill = PlayerData.Kill[TargetCategory][TargetType].PenaltyKill + 1 + MESSAGE:New( "Player '" .. PlayerName .. "' killed a friendly " .. TargetUnitCategory .. " ( " .. TargetType .. " ) " .. + PlayerData.Kill[TargetCategory][TargetType].PenaltyKill .. " times. Penalty: -" .. PlayerData.Kill[TargetCategory][TargetType].Penalty .. + ". Score Total:" .. PlayerData.Score - PlayerData.Penalty, + "", 5, "/PENALTY" .. PlayerName .. "/" .. InitUnitName ):ToAll() + self:ScoreCSV( PlayerName, "KILL_PENALTY", 1, -125, InitUnitName, InitUnitCoalition, InitUnitCategory, InitUnitType, TargetUnitName, TargetUnitCoalition, TargetUnitCategory, TargetUnitType ) + else + PlayerData.Score = PlayerData.Score + 10 + PlayerData.Kill[TargetCategory][TargetType].Score = PlayerData.Kill[TargetCategory][TargetType].Score + 10 + PlayerData.Kill[TargetCategory][TargetType].ScoreKill = PlayerData.Kill[TargetCategory][TargetType].ScoreKill + 1 + MESSAGE:New( "Player '" .. PlayerName .. "' killed an enemy " .. TargetUnitCategory .. " ( " .. TargetType .. " ) " .. + PlayerData.Kill[TargetCategory][TargetType].ScoreKill .. " times. Score: " .. PlayerData.Kill[TargetCategory][TargetType].Score .. + ". Score Total:" .. PlayerData.Score - PlayerData.Penalty, + "", 5, "/SCORE" .. PlayerName .. "/" .. InitUnitName ):ToAll() + self:ScoreCSV( PlayerName, "KILL_SCORE", 1, 10, InitUnitName, InitUnitCoalition, InitUnitCategory, InitUnitType, TargetUnitName, TargetUnitCoalition, TargetUnitCategory, TargetUnitType ) + end + end + end + end + end +end + + + +--- Add a new player entering a Unit. +function SCORING:_AddPlayerFromUnit( UnitData ) + self:F( UnitData ) + + if UnitData and UnitData:isExist() then + local UnitName = UnitData:getName() + local PlayerName = UnitData:getPlayerName() + local UnitDesc = UnitData:getDesc() + local UnitCategory = UnitDesc.category + local UnitCoalition = UnitData:getCoalition() + local UnitTypeName = UnitData:getTypeName() + + self:T( { PlayerName, UnitName, UnitCategory, UnitCoalition, UnitTypeName } ) + + if self.Players[PlayerName] == nil then -- I believe this is the place where a Player gets a life in a mission when he enters a unit ... + self.Players[PlayerName] = {} + self.Players[PlayerName].Hit = {} + self.Players[PlayerName].Kill = {} + self.Players[PlayerName].Mission = {} + + -- for CategoryID, CategoryName in pairs( SCORINGCategory ) do + -- self.Players[PlayerName].Hit[CategoryID] = {} + -- self.Players[PlayerName].Kill[CategoryID] = {} + -- end + self.Players[PlayerName].HitPlayers = {} + self.Players[PlayerName].HitUnits = {} + self.Players[PlayerName].Score = 0 + self.Players[PlayerName].Penalty = 0 + self.Players[PlayerName].PenaltyCoalition = 0 + self.Players[PlayerName].PenaltyWarning = 0 + end + + if not self.Players[PlayerName].UnitCoalition then + self.Players[PlayerName].UnitCoalition = UnitCoalition + else + if self.Players[PlayerName].UnitCoalition ~= UnitCoalition then + self.Players[PlayerName].Penalty = self.Players[PlayerName].Penalty + 50 + self.Players[PlayerName].PenaltyCoalition = self.Players[PlayerName].PenaltyCoalition + 1 + MESSAGE:New( "Player '" .. PlayerName .. "' changed coalition from " .. _SCORINGCoalition[self.Players[PlayerName].UnitCoalition] .. " to " .. _SCORINGCoalition[UnitCoalition] .. + "(changed " .. self.Players[PlayerName].PenaltyCoalition .. " times the coalition). 50 Penalty points added.", + "", + 2, + "/PENALTYCOALITION" .. PlayerName + ):ToAll() + self:ScoreCSV( PlayerName, "COALITION_PENALTY", 1, -50, self.Players[PlayerName].UnitName, _SCORINGCoalition[self.Players[PlayerName].UnitCoalition], _SCORINGCategory[self.Players[PlayerName].UnitCategory], self.Players[PlayerName].UnitType, + UnitName, _SCORINGCoalition[UnitCoalition], _SCORINGCategory[UnitCategory], UnitData:getTypeName() ) + end + end + self.Players[PlayerName].UnitName = UnitName + self.Players[PlayerName].UnitCoalition = UnitCoalition + self.Players[PlayerName].UnitCategory = UnitCategory + self.Players[PlayerName].UnitType = UnitTypeName + + if self.Players[PlayerName].Penalty > 100 then + if self.Players[PlayerName].PenaltyWarning < 1 then + MESSAGE:New( "Player '" .. PlayerName .. "': WARNING! If you continue to commit FRATRICIDE and have a PENALTY score higher than 150, you will be COURT MARTIALED and DISMISSED from this mission! \nYour total penalty is: " .. self.Players[PlayerName].Penalty, + "", + 30, + "/PENALTYCOALITION" .. PlayerName + ):ToAll() + self.Players[PlayerName].PenaltyWarning = self.Players[PlayerName].PenaltyWarning + 1 + end + end + + if self.Players[PlayerName].Penalty > 150 then + ClientGroup = GROUP:NewFromDCSUnit( UnitData ) + ClientGroup:Destroy() + MESSAGE:New( "Player '" .. PlayerName .. "' committed FRATRICIDE, he will be COURT MARTIALED and is DISMISSED from this mission!", + "", + 10, + "/PENALTYCOALITION" .. PlayerName + ):ToAll() + end + + end +end + + +--- Registers Scores the players completing a Mission Task. +function SCORING:_AddMissionTaskScore( PlayerUnit, MissionName, Score ) + self:F( { PlayerUnit, MissionName, Score } ) + + local PlayerName = PlayerUnit:getPlayerName() + + if not self.Players[PlayerName].Mission[MissionName] then + self.Players[PlayerName].Mission[MissionName] = {} + self.Players[PlayerName].Mission[MissionName].ScoreTask = 0 + self.Players[PlayerName].Mission[MissionName].ScoreMission = 0 + end + + self:T( PlayerName ) + self:T( self.Players[PlayerName].Mission[MissionName] ) + + self.Players[PlayerName].Score = self.Players[PlayerName].Score + Score + self.Players[PlayerName].Mission[MissionName].ScoreTask = self.Players[PlayerName].Mission[MissionName].ScoreTask + Score + + MESSAGE:New( "Player '" .. PlayerName .. "' has finished another Task in Mission '" .. MissionName .. "'. " .. + Score .. " Score points added.", + "", 20, "/SCORETASK" .. PlayerName ):ToAll() + + self:ScoreCSV( PlayerName, "TASK_" .. MissionName:gsub( ' ', '_' ), 1, Score, PlayerUnit:getName() ) +end + + +--- Registers Mission Scores for possible multiple players that contributed in the Mission. +function SCORING:_AddMissionScore( MissionName, Score ) + self:F( { MissionName, Score } ) + + for PlayerName, PlayerData in pairs( self.Players ) do + + if PlayerData.Mission[MissionName] then + PlayerData.Score = PlayerData.Score + Score + PlayerData.Mission[MissionName].ScoreMission = PlayerData.Mission[MissionName].ScoreMission + Score + MESSAGE:New( "Player '" .. PlayerName .. "' has finished Mission '" .. MissionName .. "'. " .. + Score .. " Score points added.", + "", 20, "/SCOREMISSION" .. PlayerName ):ToAll() + self:ScoreCSV( PlayerName, "MISSION_" .. MissionName:gsub( ' ', '_' ), 1, Score ) + end + end +end + +--- Handles the OnHit event for the scoring. +-- @param #SCORING self +-- @param Event#EVENTDATA Event +function SCORING:_EventOnHit( Event ) + self:F( { Event } ) + + local InitUnit = nil + local InitUnitName = "" + local InitGroup = nil + local InitGroupName = "" + local InitPlayerName = nil + + local InitCoalition = nil + local InitCategory = nil + local InitType = nil + local InitUnitCoalition = nil + local InitUnitCategory = nil + local InitUnitType = nil + + local TargetUnit = nil + local TargetUnitName = "" + local TargetGroup = nil + local TargetGroupName = "" + local TargetPlayerName = "" + + local TargetCoalition = nil + local TargetCategory = nil + local TargetType = nil + local TargetUnitCoalition = nil + local TargetUnitCategory = nil + local TargetUnitType = nil + + if Event.IniDCSUnit then + + InitUnit = Event.IniDCSUnit + InitUnitName = Event.IniDCSUnitName + InitGroup = Event.IniDCSGroup + InitGroupName = Event.IniDCSGroupName + InitPlayerName = InitUnit:getPlayerName() + + InitCoalition = InitUnit:getCoalition() + --TODO: Workaround Client DCS Bug + --InitCategory = InitUnit:getCategory() + InitCategory = InitUnit:getDesc().category + InitType = InitUnit:getTypeName() + + InitUnitCoalition = _SCORINGCoalition[InitCoalition] + InitUnitCategory = _SCORINGCategory[InitCategory] + InitUnitType = InitType + + self:T( { InitUnitName, InitGroupName, InitPlayerName, InitCoalition, InitCategory, InitType , InitUnitCoalition, InitUnitCategory, InitUnitType } ) + end + + + if Event.TgtDCSUnit then + + TargetUnit = Event.TgtDCSUnit + TargetUnitName = Event.TgtDCSUnitName + TargetGroup = Event.TgtDCSGroup + TargetGroupName = Event.TgtDCSGroupName + TargetPlayerName = TargetUnit:getPlayerName() + + TargetCoalition = TargetUnit:getCoalition() + --TODO: Workaround Client DCS Bug + --TargetCategory = TargetUnit:getCategory() + TargetCategory = TargetUnit:getDesc().category + TargetType = TargetUnit:getTypeName() + + TargetUnitCoalition = _SCORINGCoalition[TargetCoalition] + TargetUnitCategory = _SCORINGCategory[TargetCategory] + TargetUnitType = TargetType + + self:T( { TargetUnitName, TargetGroupName, TargetPlayerName, TargetCoalition, TargetCategory, TargetType, TargetUnitCoalition, TargetUnitCategory, TargetUnitType } ) + end + + if InitPlayerName ~= nil then -- It is a player that is hitting something + self:_AddPlayerFromUnit( InitUnit ) + if self.Players[InitPlayerName] then -- This should normally not happen, but i'll test it anyway. + if TargetPlayerName ~= nil then -- It is a player hitting another player ... + self:_AddPlayerFromUnit( TargetUnit ) + self.Players[InitPlayerName].HitPlayers = self.Players[InitPlayerName].HitPlayers + 1 + end + + self:T( "Hitting Something" ) + -- What is he hitting? + if TargetCategory then + if not self.Players[InitPlayerName].Hit[TargetCategory] then + self.Players[InitPlayerName].Hit[TargetCategory] = {} + end + if not self.Players[InitPlayerName].Hit[TargetCategory][TargetUnitName] then + self.Players[InitPlayerName].Hit[TargetCategory][TargetUnitName] = {} + self.Players[InitPlayerName].Hit[TargetCategory][TargetUnitName].Score = 0 + self.Players[InitPlayerName].Hit[TargetCategory][TargetUnitName].Penalty = 0 + self.Players[InitPlayerName].Hit[TargetCategory][TargetUnitName].ScoreHit = 0 + self.Players[InitPlayerName].Hit[TargetCategory][TargetUnitName].PenaltyHit = 0 + end + local Score = 0 + if InitCoalition == TargetCoalition then + self.Players[InitPlayerName].Penalty = self.Players[InitPlayerName].Penalty + 10 + self.Players[InitPlayerName].Hit[TargetCategory][TargetUnitName].Penalty = self.Players[InitPlayerName].Hit[TargetCategory][TargetUnitName].Penalty + 10 + self.Players[InitPlayerName].Hit[TargetCategory][TargetUnitName].PenaltyHit = self.Players[InitPlayerName].Hit[TargetCategory][TargetUnitName].PenaltyHit + 1 + MESSAGE:New( "Player '" .. InitPlayerName .. "' hit a friendly " .. TargetUnitCategory .. " ( " .. TargetType .. " ) " .. + self.Players[InitPlayerName].Hit[TargetCategory][TargetUnitName].PenaltyHit .. " times. Penalty: -" .. self.Players[InitPlayerName].Hit[TargetCategory][TargetUnitName].Penalty .. + ". Score Total:" .. self.Players[InitPlayerName].Score - self.Players[InitPlayerName].Penalty, + "", + 2, + "/PENALTY" .. InitPlayerName .. "/" .. InitUnitName + ):ToAll() + self:ScoreCSV( InitPlayerName, "HIT_PENALTY", 1, -25, InitUnitName, InitUnitCoalition, InitUnitCategory, InitUnitType, TargetUnitName, TargetUnitCoalition, TargetUnitCategory, TargetUnitType ) + else + self.Players[InitPlayerName].Score = self.Players[InitPlayerName].Score + 10 + self.Players[InitPlayerName].Hit[TargetCategory][TargetUnitName].Score = self.Players[InitPlayerName].Hit[TargetCategory][TargetUnitName].Score + 1 + self.Players[InitPlayerName].Hit[TargetCategory][TargetUnitName].ScoreHit = self.Players[InitPlayerName].Hit[TargetCategory][TargetUnitName].ScoreHit + 1 + MESSAGE:New( "Player '" .. InitPlayerName .. "' hit a target " .. TargetUnitCategory .. " ( " .. TargetType .. " ) " .. + self.Players[InitPlayerName].Hit[TargetCategory][TargetUnitName].ScoreHit .. " times. Score: " .. self.Players[InitPlayerName].Hit[TargetCategory][TargetUnitName].Score .. + ". Score Total:" .. self.Players[InitPlayerName].Score - self.Players[InitPlayerName].Penalty, + "", + 2, + "/SCORE" .. InitPlayerName .. "/" .. InitUnitName + ):ToAll() + self:ScoreCSV( InitPlayerName, "HIT_SCORE", 1, 1, InitUnitName, InitUnitCoalition, InitUnitCategory, InitUnitType, TargetUnitName, TargetUnitCoalition, TargetUnitCategory, TargetUnitType ) + end + end + end + elseif InitPlayerName == nil then -- It is an AI hitting a player??? + + end +end + + +function SCORING:ReportScoreAll() + + env.info( "Hello World " ) + + local ScoreMessage = "" + local PlayerMessage = "" + + self:T( "Score Report" ) + + for PlayerName, PlayerData in pairs( self.Players ) do + if PlayerData then -- This should normally not happen, but i'll test it anyway. + self:T( "Score Player: " .. PlayerName ) + + -- Some variables + local InitUnitCoalition = _SCORINGCoalition[PlayerData.UnitCoalition] + local InitUnitCategory = _SCORINGCategory[PlayerData.UnitCategory] + local InitUnitType = PlayerData.UnitType + local InitUnitName = PlayerData.UnitName + + local PlayerScore = 0 + local PlayerPenalty = 0 + + ScoreMessage = ":\n" + + local ScoreMessageHits = "" + + for CategoryID, CategoryName in pairs( _SCORINGCategory ) do + self:T( CategoryName ) + if PlayerData.Hit[CategoryID] then + local Score = 0 + local ScoreHit = 0 + local Penalty = 0 + local PenaltyHit = 0 + self:T( "Hit scores exist for player " .. PlayerName ) + for UnitName, UnitData in pairs( PlayerData.Hit[CategoryID] ) do + Score = Score + UnitData.Score + ScoreHit = ScoreHit + UnitData.ScoreHit + Penalty = Penalty + UnitData.Penalty + PenaltyHit = UnitData.PenaltyHit + end + local ScoreMessageHit = string.format( "%s:%d ", CategoryName, Score - Penalty ) + self:T( ScoreMessageHit ) + ScoreMessageHits = ScoreMessageHits .. ScoreMessageHit + PlayerScore = PlayerScore + Score + PlayerPenalty = PlayerPenalty + Penalty + else + --ScoreMessageHits = ScoreMessageHits .. string.format( "%s:%d ", string.format(CategoryName, 1, 1), 0 ) + end + end + if ScoreMessageHits ~= "" then + ScoreMessage = ScoreMessage .. " Hits: " .. ScoreMessageHits .. "\n" + end + + local ScoreMessageKills = "" + for CategoryID, CategoryName in pairs( _SCORINGCategory ) do + self:T( "Kill scores exist for player " .. PlayerName ) + if PlayerData.Kill[CategoryID] then + local Score = 0 + local ScoreKill = 0 + local Penalty = 0 + local PenaltyKill = 0 + + for UnitName, UnitData in pairs( PlayerData.Kill[CategoryID] ) do + Score = Score + UnitData.Score + ScoreKill = ScoreKill + UnitData.ScoreKill + Penalty = Penalty + UnitData.Penalty + PenaltyKill = PenaltyKill + UnitData.PenaltyKill + end + + local ScoreMessageKill = string.format( " %s:%d ", CategoryName, Score - Penalty ) + self:T( ScoreMessageKill ) + ScoreMessageKills = ScoreMessageKills .. ScoreMessageKill + + PlayerScore = PlayerScore + Score + PlayerPenalty = PlayerPenalty + Penalty + else + --ScoreMessageKills = ScoreMessageKills .. string.format( "%s:%d ", string.format(CategoryName, 1, 1), 0 ) + end + end + if ScoreMessageKills ~= "" then + ScoreMessage = ScoreMessage .. " Kills: " .. ScoreMessageKills .. "\n" + end + + local ScoreMessageCoalitionChangePenalties = "" + if PlayerData.PenaltyCoalition ~= 0 then + ScoreMessageCoalitionChangePenalties = ScoreMessageCoalitionChangePenalties .. string.format( " -%d (%d changed)", PlayerData.Penalty, PlayerData.PenaltyCoalition ) + PlayerPenalty = PlayerPenalty + PlayerData.Penalty + end + if ScoreMessageCoalitionChangePenalties ~= "" then + ScoreMessage = ScoreMessage .. " Coalition Penalties: " .. ScoreMessageCoalitionChangePenalties .. "\n" + end + + local ScoreMessageMission = "" + local ScoreMission = 0 + local ScoreTask = 0 + for MissionName, MissionData in pairs( PlayerData.Mission ) do + ScoreMission = ScoreMission + MissionData.ScoreMission + ScoreTask = ScoreTask + MissionData.ScoreTask + ScoreMessageMission = ScoreMessageMission .. "'" .. MissionName .. "'; " + end + PlayerScore = PlayerScore + ScoreMission + ScoreTask + + if ScoreMessageMission ~= "" then + ScoreMessage = ScoreMessage .. " Tasks: " .. ScoreTask .. " Mission: " .. ScoreMission .. " ( " .. ScoreMessageMission .. ")\n" + end + + PlayerMessage = PlayerMessage .. string.format( "Player '%s' Score:%d (%d Score -%d Penalties)%s", PlayerName, PlayerScore - PlayerPenalty, PlayerScore, PlayerPenalty, ScoreMessage ) + end + end + MESSAGE:New( PlayerMessage, "Player Scores", 30, "AllPlayerScores"):ToAll() +end + + +function SCORING:ReportScorePlayer() + + env.info( "Hello World " ) + + local ScoreMessage = "" + local PlayerMessage = "" + + self:T( "Score Report" ) + + for PlayerName, PlayerData in pairs( self.Players ) do + if PlayerData then -- This should normally not happen, but i'll test it anyway. + self:T( "Score Player: " .. PlayerName ) + + -- Some variables + local InitUnitCoalition = _SCORINGCoalition[PlayerData.UnitCoalition] + local InitUnitCategory = _SCORINGCategory[PlayerData.UnitCategory] + local InitUnitType = PlayerData.UnitType + local InitUnitName = PlayerData.UnitName + + local PlayerScore = 0 + local PlayerPenalty = 0 + + ScoreMessage = "" + + local ScoreMessageHits = "" + + for CategoryID, CategoryName in pairs( _SCORINGCategory ) do + self:T( CategoryName ) + if PlayerData.Hit[CategoryID] then + local Score = 0 + local ScoreHit = 0 + local Penalty = 0 + local PenaltyHit = 0 + self:T( "Hit scores exist for player " .. PlayerName ) + for UnitName, UnitData in pairs( PlayerData.Hit[CategoryID] ) do + Score = Score + UnitData.Score + ScoreHit = ScoreHit + UnitData.ScoreHit + Penalty = Penalty + UnitData.Penalty + PenaltyHit = UnitData.PenaltyHit + end + local ScoreMessageHit = string.format( "\n %s = %d score(%d;-%d) hits(#%d;#-%d)", CategoryName, Score - Penalty, Score, Penalty, ScoreHit, PenaltyHit ) + self:T( ScoreMessageHit ) + ScoreMessageHits = ScoreMessageHits .. ScoreMessageHit + PlayerScore = PlayerScore + Score + PlayerPenalty = PlayerPenalty + Penalty + else + --ScoreMessageHits = ScoreMessageHits .. string.format( "%s:%d ", string.format(CategoryName, 1, 1), 0 ) + end + end + if ScoreMessageHits ~= "" then + ScoreMessage = ScoreMessage .. "\n Hits: " .. ScoreMessageHits .. " " + end + + local ScoreMessageKills = "" + for CategoryID, CategoryName in pairs( _SCORINGCategory ) do + self:T( "Kill scores exist for player " .. PlayerName ) + if PlayerData.Kill[CategoryID] then + local Score = 0 + local ScoreKill = 0 + local Penalty = 0 + local PenaltyKill = 0 + + for UnitName, UnitData in pairs( PlayerData.Kill[CategoryID] ) do + Score = Score + UnitData.Score + ScoreKill = ScoreKill + UnitData.ScoreKill + Penalty = Penalty + UnitData.Penalty + PenaltyKill = PenaltyKill + UnitData.PenaltyKill + end + + local ScoreMessageKill = string.format( "\n %s = %d score(%d;-%d) hits(#%d;#-%d)", CategoryName, Score - Penalty, Score, Penalty, ScoreKill, PenaltyKill ) + self:T( ScoreMessageKill ) + ScoreMessageKills = ScoreMessageKills .. ScoreMessageKill + + PlayerScore = PlayerScore + Score + PlayerPenalty = PlayerPenalty + Penalty + else + --ScoreMessageKills = ScoreMessageKills .. string.format( "%s:%d ", string.format(CategoryName, 1, 1), 0 ) + end + end + if ScoreMessageKills ~= "" then + ScoreMessage = ScoreMessage .. "\n Kills: " .. ScoreMessageKills .. " " + end + + local ScoreMessageCoalitionChangePenalties = "" + if PlayerData.PenaltyCoalition ~= 0 then + ScoreMessageCoalitionChangePenalties = ScoreMessageCoalitionChangePenalties .. string.format( " -%d (%d changed)", PlayerData.Penalty, PlayerData.PenaltyCoalition ) + PlayerPenalty = PlayerPenalty + PlayerData.Penalty + end + if ScoreMessageCoalitionChangePenalties ~= "" then + ScoreMessage = ScoreMessage .. "\n Coalition: " .. ScoreMessageCoalitionChangePenalties .. " " + end + + local ScoreMessageMission = "" + local ScoreMission = 0 + local ScoreTask = 0 + for MissionName, MissionData in pairs( PlayerData.Mission ) do + ScoreMission = ScoreMission + MissionData.ScoreMission + ScoreTask = ScoreTask + MissionData.ScoreTask + ScoreMessageMission = ScoreMessageMission .. "'" .. MissionName .. "'; " + end + PlayerScore = PlayerScore + ScoreMission + ScoreTask + + if ScoreMessageMission ~= "" then + ScoreMessage = ScoreMessage .. "\n Tasks: " .. ScoreTask .. " Mission: " .. ScoreMission .. " ( " .. ScoreMessageMission .. ") " + end + + PlayerMessage = PlayerMessage .. string.format( "Player '%s' Score = %d ( %d Score, -%d Penalties ):%s", PlayerName, PlayerScore - PlayerPenalty, PlayerScore, PlayerPenalty, ScoreMessage ) + end + end + MESSAGE:New( PlayerMessage, "Player Scores", 30, "AllPlayerScores"):ToAll() + +end + + +function SCORING:SecondsToClock(sSeconds) + local nSeconds = sSeconds + if nSeconds == 0 then + --return nil; + return "00:00:00"; + else + nHours = string.format("%02.f", math.floor(nSeconds/3600)); + nMins = string.format("%02.f", math.floor(nSeconds/60 - (nHours*60))); + nSecs = string.format("%02.f", math.floor(nSeconds - nHours*3600 - nMins *60)); + return nHours..":"..nMins..":"..nSecs + end +end + +--- Opens a score CSV file to log the scores. +-- @param #SCORING self +-- @param #string ScoringCSV +-- @return #SCORING self +-- @usage +-- -- Open a new CSV file to log the scores of the game Gori Valley. Let the name of the CSV file begin with "Player Scores". +-- ScoringObject = SCORING:New( "Gori Valley" ) +-- ScoringObject:OpenCSV( "Player Scores" ) +function SCORING:OpenCSV( ScoringCSV ) + self:F( ScoringCSV ) + + if lfs and io and os then + if ScoringCSV then + self.ScoringCSV = ScoringCSV + local fdir = lfs.writedir() .. [[Logs\]] .. self.ScoringCSV .. " " .. os.date( "%Y-%m-%d %H-%M-%S" ) .. ".csv" + + self.CSVFile, self.err = io.open( fdir, "w+" ) + if not self.CSVFile then + error( "Error: Cannot open CSV file in " .. lfs.writedir() ) + end + + self.CSVFile:write( '"GameName","RunTime","Time","PlayerName","ScoreType","PlayerUnitCoaltion","PlayerUnitCategory","PlayerUnitType","PlayerUnitName","TargetUnitCoalition","TargetUnitCategory","TargetUnitType","TargetUnitName","Times","Score"\n' ) + + self.RunTime = os.date("%y-%m-%d_%H-%M-%S") + else + error( "A string containing the CSV file name must be given." ) + end + else + self:E( "The MissionScripting.lua file has not been changed to allow lfs, io and os modules to be used..." ) + end + return self +end + + +--- Registers a score for a player. +-- @param #SCORING self +-- @param #string PlayerName The name of the player. +-- @param #string ScoreType The type of the score. +-- @param #string ScoreTimes The amount of scores achieved. +-- @param #string ScoreAmount The score given. +-- @param #string PlayerUnitName The unit name of the player. +-- @param #string PlayerUnitCoalition The coalition of the player unit. +-- @param #string PlayerUnitCategory The category of the player unit. +-- @param #string PlayerUnitType The type of the player unit. +-- @param #string TargetUnitName The name of the target unit. +-- @param #string TargetUnitCoalition The coalition of the target unit. +-- @param #string TargetUnitCategory The category of the target unit. +-- @param #string TargetUnitType The type of the target unit. +-- @return #SCORING self +function SCORING:ScoreCSV( PlayerName, ScoreType, ScoreTimes, ScoreAmount, PlayerUnitName, PlayerUnitCoalition, PlayerUnitCategory, PlayerUnitType, TargetUnitName, TargetUnitCoalition, TargetUnitCategory, TargetUnitType ) + --write statistic information to file + local ScoreTime = self:SecondsToClock( timer.getTime() ) + PlayerName = PlayerName:gsub( '"', '_' ) + + if PlayerUnitName and PlayerUnitName ~= '' then + local PlayerUnit = Unit.getByName( PlayerUnitName ) + + if PlayerUnit then + if not PlayerUnitCategory then + --PlayerUnitCategory = SCORINGCategory[PlayerUnit:getCategory()] + PlayerUnitCategory = _SCORINGCategory[PlayerUnit:getDesc().category] + end + + if not PlayerUnitCoalition then + PlayerUnitCoalition = _SCORINGCoalition[PlayerUnit:getCoalition()] + end + + if not PlayerUnitType then + PlayerUnitType = PlayerUnit:getTypeName() + end + else + PlayerUnitName = '' + PlayerUnitCategory = '' + PlayerUnitCoalition = '' + PlayerUnitType = '' + end + else + PlayerUnitName = '' + PlayerUnitCategory = '' + PlayerUnitCoalition = '' + PlayerUnitType = '' + end + + if not TargetUnitCoalition then + TargetUnitCoalition = '' + end + + if not TargetUnitCategory then + TargetUnitCategory = '' + end + + if not TargetUnitType then + TargetUnitType = '' + end + + if not TargetUnitName then + TargetUnitName = '' + end + + if lfs and io and os then + self.CSVFile:write( + '"' .. self.GameName .. '"' .. ',' .. + '"' .. self.RunTime .. '"' .. ',' .. + '' .. ScoreTime .. '' .. ',' .. + '"' .. PlayerName .. '"' .. ',' .. + '"' .. ScoreType .. '"' .. ',' .. + '"' .. PlayerUnitCoalition .. '"' .. ',' .. + '"' .. PlayerUnitCategory .. '"' .. ',' .. + '"' .. PlayerUnitType .. '"' .. ',' .. + '"' .. PlayerUnitName .. '"' .. ',' .. + '"' .. TargetUnitCoalition .. '"' .. ',' .. + '"' .. TargetUnitCategory .. '"' .. ',' .. + '"' .. TargetUnitType .. '"' .. ',' .. + '"' .. TargetUnitName .. '"' .. ',' .. + '' .. ScoreTimes .. '' .. ',' .. + '' .. ScoreAmount + ) + + self.CSVFile:write( "\n" ) + end +end + + +function SCORING:CloseCSV() + if lfs and io and os then + self.CSVFile:close() + end +end + +--- CARGO Classes +-- @module CARGO + +Include.File( "Routines" ) +Include.File( "Base" ) +Include.File( "Message" ) +Include.File( "Scheduler" ) + + +--- Clients are those Groups defined within the Mission Editor that have the skillset defined as "Client" or "Player". +-- These clients are defined within the Mission Orchestration Framework (MOF) + +CARGOS = {} + + +CARGO_ZONE = { + ClassName="CARGO_ZONE", + CargoZoneName = '', + CargoHostUnitName = '', + SIGNAL = { + TYPE = { + SMOKE = { ID = 1, TEXT = "smoke" }, + FLARE = { ID = 2, TEXT = "flare" } + }, + COLOR = { + GREEN = { ID = 1, TRIGGERCOLOR = trigger.smokeColor.Green, TEXT = "A green" }, + RED = { ID = 2, TRIGGERCOLOR = trigger.smokeColor.Red, TEXT = "A red" }, + WHITE = { ID = 3, TRIGGERCOLOR = trigger.smokeColor.White, TEXT = "A white" }, + ORANGE = { ID = 4, TRIGGERCOLOR = trigger.smokeColor.Orange, TEXT = "An orange" }, + BLUE = { ID = 5, TRIGGERCOLOR = trigger.smokeColor.Blue, TEXT = "A blue" }, + YELLOW = { ID = 6, TRIGGERCOLOR = trigger.flareColor.Yellow, TEXT = "A yellow" } + } + } +} + +--- Creates a new zone where cargo can be collected or deployed. +-- The zone functionality is useful to smoke or indicate routes for cargo pickups or deployments. +-- Provide the zone name as declared in the mission file into the CargoZoneName in the :New method. +-- An optional parameter is the CargoHostName, which is a Group declared with Late Activation switched on in the mission file. +-- The CargoHostName is the "host" of the cargo zone: +-- +-- * It will smoke the zone position when a client is approaching the zone. +-- * Depending on the cargo type, it will assist in the delivery of the cargo by driving to and from the client. +-- +-- @param #CARGO_ZONE self +-- @param #string CargoZoneName The name of the zone as declared within the mission editor. +-- @param #string CargoHostName The name of the Group "hosting" the zone. The Group MUST NOT be a static, and must be a "mobile" unit. +function CARGO_ZONE:New( CargoZoneName, CargoHostName ) local self = BASE:Inherit( self, ZONE:New( CargoZoneName ) ) + self:F( { CargoZoneName, CargoHostName } ) + + self.CargoZoneName = CargoZoneName + self.SignalHeight = 2 + --self.CargoZone = trigger.misc.getZone( CargoZoneName ) + + + if CargoHostName then + self.CargoHostName = CargoHostName + end + + self:T( self.CargoZoneName ) + + return self +end + +function CARGO_ZONE:Spawn() + self:F( self.CargoHostName ) + + if self.CargoHostName then -- Only spawn a host in the zone when there is one given as a parameter in the New function. + if self.CargoHostSpawn then + local CargoHostGroup = self.CargoHostSpawn:GetGroupFromIndex() + if CargoHostGroup and CargoHostGroup:IsAlive() then + else + self.CargoHostSpawn:ReSpawn( 1 ) + end + else + self:T( "Initialize CargoHostSpawn" ) + self.CargoHostSpawn = SPAWN:New( self.CargoHostName ):Limit( 1, 1 ) + self.CargoHostSpawn:ReSpawn( 1 ) + end + end + + return self +end + +function CARGO_ZONE:GetHostUnit() + self:F( self ) + + if self.CargoHostName then + + -- A Host has been given, signal the host + local CargoHostGroup = self.CargoHostSpawn:GetGroupFromIndex() + local CargoHostUnit + if CargoHostGroup and CargoHostGroup:IsAlive() then + CargoHostUnit = CargoHostGroup:GetUnit(1) + else + CargoHostUnit = StaticObject.getByName( self.CargoHostName ) + end + + return CargoHostUnit + end + + return nil +end + +function CARGO_ZONE:ReportCargosToClient( Client, CargoType ) + self:F() + + local SignalUnit = self:GetHostUnit() + + if SignalUnit then + + local SignalUnitTypeName = SignalUnit:getTypeName() + + local HostMessage = "" + + local IsCargo = false + for CargoID, Cargo in pairs( CARGOS ) do + if Cargo.CargoType == Task.CargoType then + if Cargo:IsStatusNone() then + HostMessage = HostMessage .. " - " .. Cargo.CargoName .. " - " .. Cargo.CargoType .. " (" .. Cargo.Weight .. "kg)" .. "\n" + IsCargo = true + end + end + end + + if not IsCargo then + HostMessage = "No Cargo Available." + end + + Client:Message( HostMessage, 20, Mission.Name .. "/StageHosts." .. SignalUnitTypeName, SignalUnitTypeName .. ": Reporting Cargo", 10 ) + end +end + + +function CARGO_ZONE:Signal() + self:F() + + local Signalled = false + + if self.SignalType then + + if self.CargoHostName then + + -- A Host has been given, signal the host + + local SignalUnit = self:GetHostUnit() + + if SignalUnit then + + self:T( 'Signalling Unit' ) + local SignalVehiclePos = SignalUnit:GetPointVec3() + SignalVehiclePos.y = SignalVehiclePos.y + 2 + + if self.SignalType.ID == CARGO_ZONE.SIGNAL.TYPE.SMOKE.ID then + + trigger.action.smoke( SignalVehiclePos, self.SignalColor.TRIGGERCOLOR ) + Signalled = true + + elseif self.SignalType.ID == CARGO_ZONE.SIGNAL.TYPE.FLARE.ID then + + trigger.action.signalFlare( SignalVehiclePos, self.SignalColor.TRIGGERCOLOR , 0 ) + Signalled = false + + end + end + + else + + local ZonePointVec3 = self:GetPointVec3( self.SignalHeight ) -- Get the zone position + the landheight + 2 meters + + if self.SignalType.ID == CARGO_ZONE.SIGNAL.TYPE.SMOKE.ID then + + trigger.action.smoke( ZonePointVec3, self.SignalColor.TRIGGERCOLOR ) + Signalled = true + + elseif self.SignalType.ID == CARGO_ZONE.SIGNAL.TYPE.FLARE.ID then + trigger.action.signalFlare( ZonePointVec3, self.SignalColor.TRIGGERCOLOR, 0 ) + Signalled = false + + end + end + end + + return Signalled + +end + +function CARGO_ZONE:WhiteSmoke( SignalHeight ) + self:F() + + self.SignalType = CARGO_ZONE.SIGNAL.TYPE.SMOKE + self.SignalColor = CARGO_ZONE.SIGNAL.COLOR.WHITE + + if SignalHeight then + self.SignalHeight = SignalHeight + end + + return self +end + +function CARGO_ZONE:BlueSmoke( SignalHeight ) + self:F() + + self.SignalType = CARGO_ZONE.SIGNAL.TYPE.SMOKE + self.SignalColor = CARGO_ZONE.SIGNAL.COLOR.BLUE + + if SignalHeight then + self.SignalHeight = SignalHeight + end + + return self +end + +function CARGO_ZONE:RedSmoke( SignalHeight ) + self:F() + + self.SignalType = CARGO_ZONE.SIGNAL.TYPE.SMOKE + self.SignalColor = CARGO_ZONE.SIGNAL.COLOR.RED + + if SignalHeight then + self.SignalHeight = SignalHeight + end + + return self +end + +function CARGO_ZONE:OrangeSmoke( SignalHeight ) + self:F() + + self.SignalType = CARGO_ZONE.SIGNAL.TYPE.SMOKE + self.SignalColor = CARGO_ZONE.SIGNAL.COLOR.ORANGE + + if SignalHeight then + self.SignalHeight = SignalHeight + end + + return self +end + +function CARGO_ZONE:GreenSmoke( SignalHeight ) + self:F() + + self.SignalType = CARGO_ZONE.SIGNAL.TYPE.SMOKE + self.SignalColor = CARGO_ZONE.SIGNAL.COLOR.GREEN + + if SignalHeight then + self.SignalHeight = SignalHeight + end + + return self +end + + +function CARGO_ZONE:WhiteFlare( SignalHeight ) + self:F() + + self.SignalType = CARGO_ZONE.SIGNAL.TYPE.FLARE + self.SignalColor = CARGO_ZONE.SIGNAL.COLOR.WHITE + + if SignalHeight then + self.SignalHeight = SignalHeight + end + + return self +end + +function CARGO_ZONE:RedFlare( SignalHeight ) + self:F() + + self.SignalType = CARGO_ZONE.SIGNAL.TYPE.FLARE + self.SignalColor = CARGO_ZONE.SIGNAL.COLOR.RED + + if SignalHeight then + self.SignalHeight = SignalHeight + end + + return self +end + +function CARGO_ZONE:GreenFlare( SignalHeight ) + self:F() + + self.SignalType = CARGO_ZONE.SIGNAL.TYPE.FLARE + self.SignalColor = CARGO_ZONE.SIGNAL.COLOR.GREEN + + if SignalHeight then + self.SignalHeight = SignalHeight + end + + return self +end + +function CARGO_ZONE:YellowFlare( SignalHeight ) + self:F() + + self.SignalType = CARGO_ZONE.SIGNAL.TYPE.FLARE + self.SignalColor = CARGO_ZONE.SIGNAL.COLOR.YELLOW + + if SignalHeight then + self.SignalHeight = SignalHeight + end + + return self +end + + +function CARGO_ZONE:GetCargoHostUnit() + self:F( self ) + + if self.CargoHostSpawn then + local CargoHostGroup = self.CargoHostSpawn:GetGroupFromIndex(1) + if CargoHostGroup and CargoHostGroup:IsAlive() then + local CargoHostUnit = CargoHostGroup:GetUnit(1) + if CargoHostUnit and CargoHostUnit:IsAlive() then + return CargoHostUnit + end + end + end + + return nil +end + +function CARGO_ZONE:GetCargoZoneName() + self:F() + + return self.CargoZoneName +end + +CARGO = { + ClassName = "CARGO", + STATUS = { + NONE = 0, + LOADED = 1, + UNLOADED = 2, + LOADING = 3 + }, + CargoClient = nil +} + +--- Add Cargo to the mission... Cargo functionality needs to be reworked a bit, so this is still under construction. I need to make a CARGO Class... +function CARGO:New( CargoType, CargoName, CargoWeight ) local self = BASE:Inherit( self, BASE:New() ) + self:F( { CargoType, CargoName, CargoWeight } ) + + + self.CargoType = CargoType + self.CargoName = CargoName + self.CargoWeight = CargoWeight + + self:StatusNone() + + return self +end + +function CARGO:Spawn( Client ) + self:F() + + return self + +end + +function CARGO:IsNear( Client, LandingZone ) + self:F() + + local Near = true + + return Near + +end + + +function CARGO:IsLoadingToClient() + self:F() + + if self:IsStatusLoading() then + return self.CargoClient + end + + return nil + +end + + +function CARGO:IsLoadedInClient() + self:F() + + if self:IsStatusLoaded() then + return self.CargoClient + end + + return nil + +end + + +function CARGO:UnLoad( Client, TargetZoneName ) + self:F() + + self:StatusUnLoaded() + + return self +end + +function CARGO:OnBoard( Client, LandingZone ) + self:F() + + local Valid = true + + self.CargoClient = Client + local ClientUnit = Client:GetClientGroupDCSUnit() + + return Valid +end + +function CARGO:OnBoarded( Client, LandingZone ) + self:F() + + local OnBoarded = true + + return OnBoarded +end + +function CARGO:Load( Client ) + self:F() + + self:StatusLoaded( Client ) + + return self +end + +function CARGO:IsLandingRequired() + self:F() + return true +end + +function CARGO:IsSlingLoad() + self:F() + return false +end + + +function CARGO:StatusNone() + self:F() + + self.CargoClient = nil + self.CargoStatus = CARGO.STATUS.NONE + + return self +end + +function CARGO:StatusLoading( Client ) + self:F() + + self.CargoClient = Client + self.CargoStatus = CARGO.STATUS.LOADING + self:T( "Cargo " .. self.CargoName .. " loading to Client: " .. self.CargoClient:GetClientGroupName() ) + + return self +end + +function CARGO:StatusLoaded( Client ) + self:F() + + self.CargoClient = Client + self.CargoStatus = CARGO.STATUS.LOADED + self:T( "Cargo " .. self.CargoName .. " loaded in Client: " .. self.CargoClient:GetClientGroupName() ) + + return self +end + +function CARGO:StatusUnLoaded() + self:F() + + self.CargoClient = nil + self.CargoStatus = CARGO.STATUS.UNLOADED + + return self +end + + +function CARGO:IsStatusNone() + self:F() + + return self.CargoStatus == CARGO.STATUS.NONE +end + +function CARGO:IsStatusLoading() + self:F() + + return self.CargoStatus == CARGO.STATUS.LOADING +end + +function CARGO:IsStatusLoaded() + self:F() + + return self.CargoStatus == CARGO.STATUS.LOADED +end + +function CARGO:IsStatusUnLoaded() + self:F() + + return self.CargoStatus == CARGO.STATUS.UNLOADED +end + + +CARGO_GROUP = { + ClassName = "CARGO_GROUP" +} + + +function CARGO_GROUP:New( CargoType, CargoName, CargoWeight, CargoGroupTemplate, CargoZone ) local self = BASE:Inherit( self, CARGO:New( CargoType, CargoName, CargoWeight ) ) + self:F( { CargoType, CargoName, CargoWeight, CargoGroupTemplate, CargoZone } ) + + self.CargoSpawn = SPAWN:NewWithAlias( CargoGroupTemplate, CargoName ) + self.CargoZone = CargoZone + + CARGOS[self.CargoName] = self + + return self + +end + +function CARGO_GROUP:Spawn( Client ) + self:F( { Client } ) + + local SpawnCargo = true + + if self:IsStatusNone() then + local CargoGroup = Group.getByName( self.CargoName ) + if CargoGroup and CargoGroup:isExist() then + SpawnCargo = false + end + + elseif self:IsStatusLoading() then + + local Client = self:IsLoadingToClient() + if Client and Client:GetDCSGroup() then + SpawnCargo = false + else + local CargoGroup = Group.getByName( self.CargoName ) + if CargoGroup and CargoGroup:isExist() then + SpawnCargo = false + end + end + + elseif self:IsStatusLoaded() then + + local ClientLoaded = self:IsLoadedInClient() + -- Now test if another Client is alive (not this one), and it has the CARGO, then this cargo does not need to be initialized and spawned. + if ClientLoaded and ClientLoaded ~= Client then + local ClientGroup = Client:GetDCSGroup() + if ClientLoaded:GetClientGroupDCSUnit() and ClientLoaded:GetClientGroupDCSUnit():isExist() then + SpawnCargo = false + else + self:StatusNone() + end + else + -- Same Client, but now in initialize, so set back the status to None. + self:StatusNone() + end + + elseif self:IsStatusUnLoaded() then + + SpawnCargo = false + + end + + if SpawnCargo then + if self.CargoZone:GetCargoHostUnit() then + --- ReSpawn the Cargo from the CargoHost + self.CargoGroupName = self.CargoSpawn:SpawnFromUnit( self.CargoZone:GetCargoHostUnit(), 60, 30, 1 ):GetName() + else + --- ReSpawn the Cargo in the CargoZone without a host ... + self:T( self.CargoZone ) + self.CargoGroupName = self.CargoSpawn:SpawnInZone( self.CargoZone, true, 1 ):GetName() + end + self:StatusNone() + end + + self:T( { self.CargoGroupName, CARGOS[self.CargoName].CargoGroupName } ) + + return self +end + +function CARGO_GROUP:IsNear( Client, LandingZone ) + self:F() + + local Near = false + + if self.CargoGroupName then + local CargoGroup = Group.getByName( self.CargoGroupName ) + if routines.IsPartOfGroupInRadius( CargoGroup, Client:GetPositionVec3(), 250 ) then + Near = true + end + end + + return Near + +end + + +function CARGO_GROUP:OnBoard( Client, LandingZone, OnBoardSide ) + self:F() + + local Valid = true + + local ClientUnit = Client:GetClientGroupDCSUnit() + + local CarrierPos = ClientUnit:getPoint() + local CarrierPosMove = ClientUnit:getPoint() + local CarrierPosOnBoard = ClientUnit:getPoint() + + local CargoGroup = Group.getByName( self.CargoGroupName ) + + local CargoUnit = CargoGroup:getUnit(1) + local CargoPos = CargoUnit:getPoint() + + self.CargoInAir = CargoUnit:inAir() + + self:T( self.CargoInAir ) + + -- Only move the group to the carrier when the cargo is not in the air + -- (eg. cargo can be on a oil derrick, moving the cargo on the oil derrick will drop the cargo on the sea). + if not self.CargoInAir then + + local Points = {} + + self:T( 'CargoPos x = ' .. CargoPos.x .. " z = " .. CargoPos.z ) + self:T( 'CarrierPosMove x = ' .. CarrierPosMove.x .. " z = " .. CarrierPosMove.z ) + + Points[#Points+1] = routines.ground.buildWP( CargoPos, "Cone", 10 ) + + self:T( 'Points[1] x = ' .. Points[1].x .. " y = " .. Points[1].y ) + + if OnBoardSide == nil then + OnBoardSide = CLIENT.ONBOARDSIDE.NONE + end + + if OnBoardSide == CLIENT.ONBOARDSIDE.LEFT then + + self:T( "TransportCargoOnBoard: Onboarding LEFT" ) + CarrierPosMove.z = CarrierPosMove.z - 25 + CarrierPosOnBoard.z = CarrierPosOnBoard.z - 5 + Points[#Points+1] = routines.ground.buildWP( CarrierPosMove, "Cone", 10 ) + Points[#Points+1] = routines.ground.buildWP( CarrierPosOnBoard, "Cone", 10 ) + + elseif OnBoardSide == CLIENT.ONBOARDSIDE.RIGHT then + + self:T( "TransportCargoOnBoard: Onboarding RIGHT" ) + CarrierPosMove.z = CarrierPosMove.z + 25 + CarrierPosOnBoard.z = CarrierPosOnBoard.z + 5 + Points[#Points+1] = routines.ground.buildWP( CarrierPosMove, "Cone", 10 ) + Points[#Points+1] = routines.ground.buildWP( CarrierPosOnBoard, "Cone", 10 ) + + elseif OnBoardSide == CLIENT.ONBOARDSIDE.BACK then + + self:T( "TransportCargoOnBoard: Onboarding BACK" ) + CarrierPosMove.x = CarrierPosMove.x - 25 + CarrierPosOnBoard.x = CarrierPosOnBoard.x - 5 + Points[#Points+1] = routines.ground.buildWP( CarrierPosMove, "Cone", 10 ) + Points[#Points+1] = routines.ground.buildWP( CarrierPosOnBoard, "Cone", 10 ) + + elseif OnBoardSide == CLIENT.ONBOARDSIDE.FRONT then + + self:T( "TransportCargoOnBoard: Onboarding FRONT" ) + CarrierPosMove.x = CarrierPosMove.x + 25 + CarrierPosOnBoard.x = CarrierPosOnBoard.x + 5 + Points[#Points+1] = routines.ground.buildWP( CarrierPosMove, "Cone", 10 ) + Points[#Points+1] = routines.ground.buildWP( CarrierPosOnBoard, "Cone", 10 ) + + elseif OnBoardSide == CLIENT.ONBOARDSIDE.NONE then + + self:T( "TransportCargoOnBoard: Onboarding CENTRAL" ) + Points[#Points+1] = routines.ground.buildWP( CarrierPos, "Cone", 10 ) + + end + self:T( "TransportCargoOnBoard: Routing " .. self.CargoGroupName ) + + --routines.scheduleFunction( routines.goRoute, { self.CargoGroupName, Points}, timer.getTime() + 4 ) + SCHEDULER:New( self, routines.goRoute, { self.CargoGroupName, Points}, 4 ) + end + + self:StatusLoading( Client ) + + return Valid + +end + + +function CARGO_GROUP:OnBoarded( Client, LandingZone ) + self:F() + + local OnBoarded = false + + local CargoGroup = Group.getByName( self.CargoGroupName ) + + if not self.CargoInAir then + if routines.IsPartOfGroupInRadius( CargoGroup, Client:GetPositionVec3(), 25 ) then + CargoGroup:destroy() + self:StatusLoaded( Client ) + OnBoarded = true + end + else + CargoGroup:destroy() + self:StatusLoaded( Client ) + OnBoarded = true + end + + return OnBoarded +end + + +function CARGO_GROUP:UnLoad( Client, TargetZoneName ) + self:F() + + self:T( 'self.CargoName = ' .. self.CargoName ) + + local CargoGroup = self.CargoSpawn:SpawnFromUnit( Client:GetClientGroupUnit(), 60, 30 ) + + self.CargoGroupName = CargoGroup:GetName() + self:T( 'self.CargoGroupName = ' .. self.CargoGroupName ) + + CargoGroup:TaskRouteToZone( ZONE:New( TargetZoneName ), true ) + + self:StatusUnLoaded() + + return self +end + + +CARGO_PACKAGE = { + ClassName = "CARGO_PACKAGE" +} + + +function CARGO_PACKAGE:New( CargoType, CargoName, CargoWeight, CargoClient ) local self = BASE:Inherit( self, CARGO:New( CargoType, CargoName, CargoWeight ) ) + self:F( { CargoType, CargoName, CargoWeight, CargoClient } ) + + self.CargoClient = CargoClient + + CARGOS[self.CargoName] = self + + return self + +end + + +function CARGO_PACKAGE:Spawn( Client ) + self:F( { self, Client } ) + + -- this needs to be checked thoroughly + + local CargoClientGroup = self.CargoClient:GetDCSGroup() + if not CargoClientGroup then + if not self.CargoClientSpawn then + self.CargoClientSpawn = SPAWN:New( self.CargoClient:GetClientGroupName() ):Limit( 1, 1 ) + end + self.CargoClientSpawn:ReSpawn( 1 ) + end + + local SpawnCargo = true + + if self:IsStatusNone() then + + elseif self:IsStatusLoading() or self:IsStatusLoaded() then + + local CargoClientLoaded = self:IsLoadedInClient() + if CargoClientLoaded and CargoClientLoaded:GetDCSGroup() then + SpawnCargo = false + end + + elseif self:IsStatusUnLoaded() then + + SpawnCargo = false + + else + + end + + if SpawnCargo then + self:StatusLoaded( self.CargoClient ) + end + + return self +end + + +function CARGO_PACKAGE:IsNear( Client, LandingZone ) + self:F() + + local Near = false + + if self.CargoClient and self.CargoClient:GetDCSGroup() then + self:T( self.CargoClient.ClientName ) + self:T( 'Client Exists.' ) + + if routines.IsUnitInRadius( self.CargoClient:GetClientGroupDCSUnit(), Client:GetPositionVec3(), 150 ) then + Near = true + end + end + + return Near + +end + + +function CARGO_PACKAGE:OnBoard( Client, LandingZone, OnBoardSide ) + self:F() + + local Valid = true + + local ClientUnit = Client:GetClientGroupDCSUnit() + + local CarrierPos = ClientUnit:getPoint() + local CarrierPosMove = ClientUnit:getPoint() + local CarrierPosOnBoard = ClientUnit:getPoint() + local CarrierPosMoveAway = ClientUnit:getPoint() + + local CargoHostGroup = self.CargoClient:GetDCSGroup() + local CargoHostName = self.CargoClient:GetDCSGroup():getName() + + local CargoHostUnits = CargoHostGroup:getUnits() + local CargoPos = CargoHostUnits[1]:getPoint() + + local Points = {} + + self:T( 'CargoPos x = ' .. CargoPos.x .. " z = " .. CargoPos.z ) + self:T( 'CarrierPosMove x = ' .. CarrierPosMove.x .. " z = " .. CarrierPosMove.z ) + + Points[#Points+1] = routines.ground.buildWP( CargoPos, "Cone", 10 ) + + self:T( 'Points[1] x = ' .. Points[1].x .. " y = " .. Points[1].y ) + + if OnBoardSide == nil then + OnBoardSide = CLIENT.ONBOARDSIDE.NONE + end + + if OnBoardSide == CLIENT.ONBOARDSIDE.LEFT then + + self:T( "TransportCargoOnBoard: Onboarding LEFT" ) + CarrierPosMove.z = CarrierPosMove.z - 25 + CarrierPosOnBoard.z = CarrierPosOnBoard.z - 5 + CarrierPosMoveAway.z = CarrierPosMoveAway.z - 20 + Points[#Points+1] = routines.ground.buildWP( CarrierPosMove, "Cone", 10 ) + Points[#Points+1] = routines.ground.buildWP( CarrierPosOnBoard, "Cone", 10 ) + Points[#Points+1] = routines.ground.buildWP( CarrierPosMoveAway, "Cone", 10 ) + + elseif OnBoardSide == CLIENT.ONBOARDSIDE.RIGHT then + + self:T( "TransportCargoOnBoard: Onboarding RIGHT" ) + CarrierPosMove.z = CarrierPosMove.z + 25 + CarrierPosOnBoard.z = CarrierPosOnBoard.z + 5 + CarrierPosMoveAway.z = CarrierPosMoveAway.z + 20 + Points[#Points+1] = routines.ground.buildWP( CarrierPosMove, "Cone", 10 ) + Points[#Points+1] = routines.ground.buildWP( CarrierPosOnBoard, "Cone", 10 ) + Points[#Points+1] = routines.ground.buildWP( CarrierPosMoveAway, "Cone", 10 ) + + elseif OnBoardSide == CLIENT.ONBOARDSIDE.BACK then + + self:T( "TransportCargoOnBoard: Onboarding BACK" ) + CarrierPosMove.x = CarrierPosMove.x - 25 + CarrierPosOnBoard.x = CarrierPosOnBoard.x - 5 + CarrierPosMoveAway.x = CarrierPosMoveAway.x - 20 + Points[#Points+1] = routines.ground.buildWP( CarrierPosMove, "Cone", 10 ) + Points[#Points+1] = routines.ground.buildWP( CarrierPosOnBoard, "Cone", 10 ) + Points[#Points+1] = routines.ground.buildWP( CarrierPosMoveAway, "Cone", 10 ) + + elseif OnBoardSide == CLIENT.ONBOARDSIDE.FRONT then + + self:T( "TransportCargoOnBoard: Onboarding FRONT" ) + CarrierPosMove.x = CarrierPosMove.x + 25 + CarrierPosOnBoard.x = CarrierPosOnBoard.x + 5 + CarrierPosMoveAway.x = CarrierPosMoveAway.x + 20 + Points[#Points+1] = routines.ground.buildWP( CarrierPosMove, "Cone", 10 ) + Points[#Points+1] = routines.ground.buildWP( CarrierPosOnBoard, "Cone", 10 ) + Points[#Points+1] = routines.ground.buildWP( CarrierPosMoveAway, "Cone", 10 ) + + elseif OnBoardSide == CLIENT.ONBOARDSIDE.NONE then + + self:T( "TransportCargoOnBoard: Onboarding FRONT" ) + CarrierPosMove.x = CarrierPosMove.x + 25 + CarrierPosOnBoard.x = CarrierPosOnBoard.x + 5 + CarrierPosMoveAway.x = CarrierPosMoveAway.x + 20 + Points[#Points+1] = routines.ground.buildWP( CarrierPosMove, "Cone", 10 ) + Points[#Points+1] = routines.ground.buildWP( CarrierPosOnBoard, "Cone", 10 ) + Points[#Points+1] = routines.ground.buildWP( CarrierPosMoveAway, "Cone", 10 ) + + end + self:T( "Routing " .. CargoHostName ) + + --routines.scheduleFunction( routines.goRoute, { CargoHostName, Points}, timer.getTime() + 4 ) + SCHEDULER:New( self, routines.goRoute, { CargoHostName, Points }, 4 ) + + return Valid + +end + + +function CARGO_PACKAGE:OnBoarded( Client, LandingZone ) + self:F() + + local OnBoarded = false + + if self.CargoClient and self.CargoClient:GetDCSGroup() then + if routines.IsUnitInRadius( self.CargoClient:GetClientGroupDCSUnit(), self.CargoClient:GetPositionVec3(), 10 ) then + + -- Switch Cargo from self.CargoClient to Client ... Each cargo can have only one client. So assigning the new client for the cargo is enough. + self:StatusLoaded( Client ) + + -- All done, onboarded the Cargo to the new Client. + OnBoarded = true + end + end + + return OnBoarded +end + + +function CARGO_PACKAGE:UnLoad( Client, TargetZoneName ) + self:F() + + self:T( 'self.CargoName = ' .. self.CargoName ) + --self:T( 'self.CargoHostName = ' .. self.CargoHostName ) + + --self.CargoSpawn:FromCarrier( Client:GetDCSGroup(), TargetZoneName, self.CargoHostName ) + self:StatusUnLoaded() + + return Cargo +end + + +CARGO_SLINGLOAD = { + ClassName = "CARGO_SLINGLOAD" +} + + +function CARGO_SLINGLOAD:New( CargoType, CargoName, CargoWeight, CargoZone, CargoHostName, CargoCountryID ) + local self = BASE:Inherit( self, CARGO:New( CargoType, CargoName, CargoWeight ) ) + self:F( { CargoType, CargoName, CargoWeight, CargoZone, CargoHostName, CargoCountryID } ) + + self.CargoHostName = CargoHostName + + -- Cargo will be initialized around the CargoZone position. + self.CargoZone = CargoZone + + self.CargoCount = 0 + self.CargoStaticName = string.format( "%s#%03d", self.CargoName, self.CargoCount ) + + -- The country ID needs to be correctly set. + self.CargoCountryID = CargoCountryID + + CARGOS[self.CargoName] = self + + return self + +end + + +function CARGO_SLINGLOAD:IsLandingRequired() + self:F() + return false +end + + +function CARGO_SLINGLOAD:IsSlingLoad() + self:F() + return true +end + + +function CARGO_SLINGLOAD:Spawn( Client ) + self:F( { self, Client } ) + + local Zone = trigger.misc.getZone( self.CargoZone ) + + local ZonePos = {} + ZonePos.x = Zone.point.x + math.random( Zone.radius / 2 * -1, Zone.radius / 2 ) + ZonePos.y = Zone.point.z + math.random( Zone.radius / 2 * -1, Zone.radius / 2 ) + + self:T( "Cargo Location = " .. ZonePos.x .. ", " .. ZonePos.y ) + + --[[ + -- This does not work in 1.5.2. + CargoStatic = StaticObject.getByName( self.CargoName ) + if CargoStatic then + CargoStatic:destroy() + end + --]] + + CargoStatic = StaticObject.getByName( self.CargoStaticName ) + + if CargoStatic and CargoStatic:isExist() then + CargoStatic:destroy() + end + + -- I need to make every time a new cargo due to bugs in 1.5.2. + + self.CargoCount = self.CargoCount + 1 + self.CargoStaticName = string.format( "%s#%03d", self.CargoName, self.CargoCount ) + + local CargoTemplate = { + ["category"] = "Cargo", + ["shape_name"] = "ab-212_cargo", + ["type"] = "Cargo1", + ["x"] = ZonePos.x, + ["y"] = ZonePos.y, + ["mass"] = self.CargoWeight, + ["name"] = self.CargoStaticName, + ["canCargo"] = true, + ["heading"] = 0, + } + + coalition.addStaticObject( self.CargoCountryID, CargoTemplate ) + +-- end + + return self +end + + +function CARGO_SLINGLOAD:IsNear( Client, LandingZone ) + self:F() + + local Near = false + + return Near +end + + +function CARGO_SLINGLOAD:IsInLandingZone( Client, LandingZone ) + self:F() + + local Near = false + + local CargoStaticUnit = StaticObject.getByName( self.CargoName ) + if CargoStaticUnit then + if routines.IsStaticInZones( CargoStaticUnit, LandingZone ) then + Near = true + end + end + + return Near +end + + +function CARGO_SLINGLOAD:OnBoard( Client, LandingZone, OnBoardSide ) + self:F() + + local Valid = true + + + return Valid +end + + +function CARGO_SLINGLOAD:OnBoarded( Client, LandingZone ) + self:F() + + local OnBoarded = false + + local CargoStaticUnit = StaticObject.getByName( self.CargoName ) + if CargoStaticUnit then + if not routines.IsStaticInZones( CargoStaticUnit, LandingZone ) then + OnBoarded = true + end + end + + return OnBoarded +end + + +function CARGO_SLINGLOAD:UnLoad( Client, TargetZoneName ) + self:F() + + self:T( 'self.CargoName = ' .. self.CargoName ) + self:T( 'self.CargoGroupName = ' .. self.CargoGroupName ) + + self:StatusUnLoaded() + + return Cargo +end +--- Message System to display Messages for Clients and Coalitions or All. +-- Messages are grouped on the display panel per Category to improve readability for the players. +-- Messages are shown on the display panel for an amount of seconds, and will then disappear. +-- Messages are identified by an ID. The messages with the same ID belonging to the same category will be overwritten if they were still being displayed on the display panel. +-- Messages are created with MESSAGE:@{New}(). +-- Messages are sent to Clients with MESSAGE:@{ToClient}(). +-- Messages are sent to Coalitions with MESSAGE:@{ToCoalition}(). +-- Messages are sent to All Players with MESSAGE:@{ToAll}(). +-- @module Message + +Include.File( "Base" ) + +--- The MESSAGE class +-- @type MESSAGE +MESSAGE = { + ClassName = "MESSAGE", + MessageCategory = 0, + MessageID = 0, +} + + +--- Creates a new MESSAGE object. Note that these MESSAGE objects are not yet displayed on the display panel. You must use the functions @{ToClient} or @{ToCoalition} or @{ToAll} to send these Messages to the respective recipients. +-- @param self +-- @param #string MessageText is the text of the Message. +-- @param #string MessageCategory is a string expressing the Category of the Message. Messages are grouped on the display panel per Category to improve readability. +-- @param #number MessageDuration is a number in seconds of how long the MESSAGE should be shown on the display panel. +-- @param #string MessageID is a string expressing the ID of the Message. +-- @return #MESSAGE +-- @usage +-- -- Create a series of new Messages. +-- -- MessageAll is meant to be sent to all players, for 25 seconds, and is classified as "Score". +-- -- MessageRED is meant to be sent to the RED players only, for 10 seconds, and is classified as "End of Mission", with ID "Win". +-- -- MessageClient1 is meant to be sent to a Client, for 25 seconds, and is classified as "Score", with ID "Score". +-- -- MessageClient1 is meant to be sent to a Client, for 25 seconds, and is classified as "Score", with ID "Score". +-- MessageAll = MESSAGE:New( "To all Players: BLUE has won! Each player of BLUE wins 50 points!", "End of Mission", 25, "Win" ) +-- MessageRED = MESSAGE:New( "To the RED Players: You receive a penalty because you've killed one of your own units", "Penalty", 25, "Score" ) +-- MessageClient1 = MESSAGE:New( "Congratulations, you've just hit a target", "Score", 25, "Score" ) +-- MessageClient2 = MESSAGE:New( "Congratulations, you've just killed a target", "Score", 25, "Score" ) +function MESSAGE:New( MessageText, MessageCategory, MessageDuration, MessageID ) + local self = BASE:Inherit( self, BASE:New() ) + self:F( { MessageText, MessageCategory, MessageDuration, MessageID } ) + + -- When no messagecategory is given, we don't show it as a title... + if MessageCategory and MessageCategory ~= "" then + self.MessageCategory = MessageCategory .. ": " + else + self.MessageCategory = "" + end + + self.MessageDuration = MessageDuration + self.MessageID = MessageID + self.MessageTime = timer.getTime() + self.MessageText = MessageText + + self.MessageSent = false + self.MessageGroup = false + self.MessageCoalition = false + + return self +end + +--- Sends a MESSAGE to a Client Group. Note that the Group needs to be defined within the ME with the skillset "Client" or "Player". +-- @param #MESSAGE self +-- @param Client#CLIENT Client is the Group of the Client. +-- @return #MESSAGE +-- @usage +-- -- Send the 2 messages created with the @{New} method to the Client Group. +-- -- Note that the Message of MessageClient2 is overwriting the Message of MessageClient1. +-- ClientGroup = Group.getByName( "ClientGroup" ) +-- +-- MessageClient1 = MESSAGE:New( "Congratulations, you've just hit a target", "Score", 25, "Score" ):ToClient( ClientGroup ) +-- MessageClient2 = MESSAGE:New( "Congratulations, you've just killed a target", "Score", 25, "Score" ):ToClient( ClientGroup ) +-- or +-- MESSAGE:New( "Congratulations, you've just hit a target", "Score", 25, "Score" ):ToClient( ClientGroup ) +-- MESSAGE:New( "Congratulations, you've just killed a target", "Score", 25, "Score" ):ToClient( ClientGroup ) +-- or +-- MessageClient1 = MESSAGE:New( "Congratulations, you've just hit a target", "Score", 25, "Score" ) +-- MessageClient2 = MESSAGE:New( "Congratulations, you've just killed a target", "Score", 25, "Score" ) +-- MessageClient1:ToClient( ClientGroup ) +-- MessageClient2:ToClient( ClientGroup ) +function MESSAGE:ToClient( Client ) + self:F( Client ) + + if Client and Client:GetClientGroupID() then + + local ClientGroupID = Client:GetClientGroupID() + self:T( self.MessageCategory .. self.MessageText:gsub("\n$",""):gsub("\n$","") .. " / " .. self.MessageDuration ) + trigger.action.outTextForGroup( ClientGroupID, self.MessageCategory .. self.MessageText:gsub("\n$",""):gsub("\n$",""), self.MessageDuration ) + end + + return self +end + +--- Sends a MESSAGE to the Blue coalition. +-- @param #MESSAGE self +-- @return #MESSAGE +-- @usage +-- -- Send a message created with the @{New} method to the BLUE coalition. +-- MessageBLUE = MESSAGE:New( "To the BLUE Players: You receive a penalty because you've killed one of your own units", "Penalty", 25, "Score" ):ToBlue() +-- or +-- MESSAGE:New( "To the BLUE Players: You receive a penalty because you've killed one of your own units", "Penalty", 25, "Score" ):ToBlue() +-- or +-- MessageBLUE = MESSAGE:New( "To the BLUE Players: You receive a penalty because you've killed one of your own units", "Penalty", 25, "Score" ) +-- MessageBLUE:ToBlue() +function MESSAGE:ToBlue() + self:F() + + self:ToCoalition( coalition.side.BLUE ) + + return self +end + +--- Sends a MESSAGE to the Red Coalition. +-- @param #MESSAGE self +-- @return #MESSAGE +-- @usage +-- -- Send a message created with the @{New} method to the RED coalition. +-- MessageRED = MESSAGE:New( "To the RED Players: You receive a penalty because you've killed one of your own units", "Penalty", 25, "Score" ):ToRed() +-- or +-- MESSAGE:New( "To the RED Players: You receive a penalty because you've killed one of your own units", "Penalty", 25, "Score" ):ToRed() +-- or +-- MessageRED = MESSAGE:New( "To the RED Players: You receive a penalty because you've killed one of your own units", "Penalty", 25, "Score" ) +-- MessageRED:ToRed() +function MESSAGE:ToRed( ) + self:F() + + self:ToCoalition( coalition.side.RED ) + + return self +end + +--- Sends a MESSAGE to a Coalition. +-- @param #MESSAGE self +-- @param CoalitionSide needs to be filled out by the defined structure of the standard scripting engine @{coalition.side}. +-- @return #MESSAGE +-- @usage +-- -- Send a message created with the @{New} method to the RED coalition. +-- MessageRED = MESSAGE:New( "To the RED Players: You receive a penalty because you've killed one of your own units", "Penalty", 25, "Score" ):ToCoalition( coalition.side.RED ) +-- or +-- MESSAGE:New( "To the RED Players: You receive a penalty because you've killed one of your own units", "Penalty", 25, "Score" ):ToCoalition( coalition.side.RED ) +-- or +-- MessageRED = MESSAGE:New( "To the RED Players: You receive a penalty because you've killed one of your own units", "Penalty", 25, "Score" ) +-- MessageRED:ToCoalition( coalition.side.RED ) +function MESSAGE:ToCoalition( CoalitionSide ) + self:F( CoalitionSide ) + + if CoalitionSide then + self:T( self.MessageCategory .. self.MessageText:gsub("\n$",""):gsub("\n$","") .. " / " .. self.MessageDuration ) + trigger.action.outTextForCoalition( CoalitionSide, self.MessageCategory .. self.MessageText:gsub("\n$",""):gsub("\n$",""), self.MessageDuration ) + end + + return self +end + +--- Sends a MESSAGE to all players. +-- @param #MESSAGE self +-- @return #MESSAGE +-- @usage +-- -- Send a message created to all players. +-- MessageAll = MESSAGE:New( "To all Players: BLUE has won! Each player of BLUE wins 50 points!", "End of Mission", 25, "Win" ):ToAll() +-- or +-- MESSAGE:New( "To all Players: BLUE has won! Each player of BLUE wins 50 points!", "End of Mission", 25, "Win" ):ToAll() +-- or +-- MessageAll = MESSAGE:New( "To all Players: BLUE has won! Each player of BLUE wins 50 points!", "End of Mission", 25, "Win" ) +-- MessageAll:ToAll() +function MESSAGE:ToAll() + self:F() + + self:ToCoalition( coalition.side.RED ) + self:ToCoalition( coalition.side.BLUE ) + + return self +end + + + +--- The MESSAGEQUEUE class +-- @type MESSAGEQUEUE +MESSAGEQUEUE = { + ClientGroups = {}, + CoalitionSides = {} +} + +function MESSAGEQUEUE:New( RefreshInterval ) + local self = BASE:Inherit( self, BASE:New() ) + self:F( { RefreshInterval } ) + + self.RefreshInterval = RefreshInterval + + --self.DisplayFunction = routines.scheduleFunction( self._DisplayMessages, { self }, 0, RefreshInterval ) + self.DisplayFunction = SCHEDULER:New( self, self._DisplayMessages, {}, 0, RefreshInterval ) + + return self +end + +--- This function is called automatically by the MESSAGEQUEUE scheduler. +function MESSAGEQUEUE:_DisplayMessages() + + -- First we display all messages that a coalition needs to receive... Also those who are not in a client (CA module clients...). + for CoalitionSideID, CoalitionSideData in pairs( self.CoalitionSides ) do + for MessageID, MessageData in pairs( CoalitionSideData.Messages ) do + if MessageData.MessageSent == false then + --trigger.action.outTextForCoalition( CoalitionSideID, MessageData.MessageCategory .. '\n' .. MessageData.MessageText:gsub("\n$",""):gsub("\n$",""), MessageData.MessageDuration ) + MessageData.MessageSent = true + end + local MessageTimeLeft = ( MessageData.MessageTime + MessageData.MessageDuration ) - timer.getTime() + if MessageTimeLeft <= 0 then + MessageData = nil + end + end + end + + -- Then we send the messages for each individual client, but also to be included are those Coalition messages for the Clients who belong to a coalition. + -- Because the Client messages will overwrite the Coalition messages (for that Client). + for ClientGroupName, ClientGroupData in pairs( self.ClientGroups ) do + for MessageID, MessageData in pairs( ClientGroupData.Messages ) do + if MessageData.MessageGroup == false then + trigger.action.outTextForGroup( Group.getByName(ClientGroupName):getID(), MessageData.MessageCategory .. '\n' .. MessageData.MessageText:gsub("\n$",""):gsub("\n$",""), MessageData.MessageDuration ) + MessageData.MessageGroup = true + end + local MessageTimeLeft = ( MessageData.MessageTime + MessageData.MessageDuration ) - timer.getTime() + if MessageTimeLeft <= 0 then + MessageData = nil + end + end + + -- Now check if the Client also has messages that belong to the Coalition of the Client... + for CoalitionSideID, CoalitionSideData in pairs( self.CoalitionSides ) do + for MessageID, MessageData in pairs( CoalitionSideData.Messages ) do + local CoalitionGroup = Group.getByName( ClientGroupName ) + if CoalitionGroup and CoalitionGroup:getCoalition() == CoalitionSideID then + if MessageData.MessageCoalition == false then + trigger.action.outTextForGroup( Group.getByName(ClientGroupName):getID(), MessageData.MessageCategory .. '\n' .. MessageData.MessageText:gsub("\n$",""):gsub("\n$",""), MessageData.MessageDuration ) + MessageData.MessageCoalition = true + end + end + local MessageTimeLeft = ( MessageData.MessageTime + MessageData.MessageDuration ) - timer.getTime() + if MessageTimeLeft <= 0 then + MessageData = nil + end + end + end + end + + return true +end + +--- The _MessageQueue object is created when the MESSAGE class module is loaded. +--_MessageQueue = MESSAGEQUEUE:New( 0.5 ) + +--- Stages within a @{TASK} within a @{MISSION}. All of the STAGE functionality is considered internally administered and not to be used by any Mission designer. +-- @module STAGE +-- @author Flightcontrol + +Include.File( "Routines" ) +Include.File( "Base" ) +Include.File( "Mission" ) +Include.File( "Client" ) +Include.File( "Task" ) + +--- The STAGE class +-- @type +STAGE = { + ClassName = "STAGE", + MSG = { ID = "None", TIME = 10 }, + FREQUENCY = { NONE = 0, ONCE = 1, REPEAT = -1 }, + + Name = "NoStage", + StageType = '', + WaitTime = 1, + Frequency = 1, + MessageCount = 0, + MessageInterval = 15, + MessageShown = {}, + MessageShow = false, + MessageFlash = false +} + + +function STAGE:New() + local self = BASE:Inherit( self, BASE:New() ) + self:F() + return self +end + +function STAGE:Execute( Mission, Client, Task ) + + local Valid = true + + return Valid +end + +function STAGE:Executing( Mission, Client, Task ) + +end + +function STAGE:Validate( Mission, Client, Task ) + local Valid = true + + return Valid +end + + +STAGEBRIEF = { + ClassName = "BRIEF", + MSG = { ID = "Brief", TIME = 1 }, + Name = "Brief", + StageBriefingTime = 0, + StageBriefingDuration = 1 +} + +function STAGEBRIEF:New() + local self = BASE:Inherit( self, STAGE:New() ) + self:F() + self.StageType = 'CLIENT' + return self +end + +--- Execute +-- @param #STAGEBRIEF self +-- @param Mission#MISSION Mission +-- @param Client#CLIENT Client +-- @param Task#TASK Task +-- @return #boolean +function STAGEBRIEF:Execute( Mission, Client, Task ) + local Valid = BASE:Inherited(self):Execute( Mission, Client, Task ) + self:F() + Client:ShowMissionBriefing( Mission.MissionBriefing ) + self.StageBriefingTime = timer.getTime() + return Valid +end + +function STAGEBRIEF:Validate( Mission, Client, Task ) + local Valid = STAGE:Validate( Mission, Client, Task ) + self:T() + + if timer.getTime() - self.StageBriefingTime <= self.StageBriefingDuration then + return 0 + else + self.StageBriefingTime = timer.getTime() + return 1 + end + +end + + +STAGESTART = { + ClassName = "START", + MSG = { ID = "Start", TIME = 1 }, + Name = "Start", + StageStartTime = 0, + StageStartDuration = 1 +} + +function STAGESTART:New() + local self = BASE:Inherit( self, STAGE:New() ) + self:F() + self.StageType = 'CLIENT' + return self +end + +function STAGESTART:Execute( Mission, Client, Task ) + self:F() + local Valid = BASE:Inherited(self):Execute( Mission, Client, Task ) + if Task.TaskBriefing then + Client:Message( Task.TaskBriefing, 30, Mission.Name .. "/Stage", "Command" ) + else + Client:Message( 'Task ' .. Task.TaskNumber .. '.', 30, Mission.Name .. "/Stage", "Command" ) + end + self.StageStartTime = timer.getTime() + return Valid +end + +function STAGESTART:Validate( Mission, Client, Task ) + self:F() + local Valid = STAGE:Validate( Mission, Client, Task ) + + if timer.getTime() - self.StageStartTime <= self.StageStartDuration then + return 0 + else + self.StageStartTime = timer.getTime() + return 1 + end + + return 1 + +end + +STAGE_CARGO_LOAD = { + ClassName = "STAGE_CARGO_LOAD" +} + +function STAGE_CARGO_LOAD:New() + local self = BASE:Inherit( self, STAGE:New() ) + self:F() + self.StageType = 'CLIENT' + return self +end + +function STAGE_CARGO_LOAD:Execute( Mission, Client, Task ) + self:F() + local Valid = BASE:Inherited(self):Execute( Mission, Client, Task ) + + for LoadCargoID, LoadCargo in pairs( Task.Cargos.LoadCargos ) do + LoadCargo:Load( Client ) + end + + if Mission.MissionReportFlash and Client:IsTransport() then + Client:ShowCargo() + end + + return Valid +end + +function STAGE_CARGO_LOAD:Validate( Mission, Client, Task ) + self:F() + local Valid = STAGE:Validate( Mission, Client, Task ) + + return 1 +end + + +STAGE_CARGO_INIT = { + ClassName = "STAGE_CARGO_INIT" +} + +function STAGE_CARGO_INIT:New() + local self = BASE:Inherit( self, STAGE:New() ) + self:F() + self.StageType = 'CLIENT' + return self +end + +function STAGE_CARGO_INIT:Execute( Mission, Client, Task ) + self:F() + local Valid = BASE:Inherited(self):Execute( Mission, Client, Task ) + + for InitLandingZoneID, InitLandingZone in pairs( Task.LandingZones.LandingZones ) do + self:T( InitLandingZone ) + InitLandingZone:Spawn() + end + + + self:T( Task.Cargos.InitCargos ) + for InitCargoID, InitCargoData in pairs( Task.Cargos.InitCargos ) do + self:T( { InitCargoData } ) + InitCargoData:Spawn( Client ) + end + + return Valid +end + + +function STAGE_CARGO_INIT:Validate( Mission, Client, Task ) + self:F() + local Valid = STAGE:Validate( Mission, Client, Task ) + + return 1 +end + + + +STAGEROUTE = { + ClassName = "STAGEROUTE", + MSG = { ID = "Route", TIME = 5 }, + Frequency = STAGE.FREQUENCY.REPEAT, + Name = "Route" +} + +function STAGEROUTE:New() + local self = BASE:Inherit( self, STAGE:New() ) + self:F() + self.StageType = 'CLIENT' + self.MessageSwitch = true + return self +end + + +--- Execute the routing. +-- @param #STAGEROUTE self +-- @param Mission#MISSION Mission +-- @param Client#CLIENT Client +-- @param Task#TASK Task +function STAGEROUTE:Execute( Mission, Client, Task ) + self:F() + local Valid = BASE:Inherited(self):Execute( Mission, Client, Task ) + + local RouteMessage = "Fly to: " + self:T( Task.LandingZones ) + for LandingZoneID, LandingZoneName in pairs( Task.LandingZones.LandingZoneNames ) do + RouteMessage = RouteMessage .. "\n " .. LandingZoneName .. ' at ' .. routines.getBRStringZone( { zone = LandingZoneName, ref = Client:GetClientGroupDCSUnit():getPoint(), true, true } ) .. ' km.' + end + + if Client:IsMultiSeated() then + Client:Message( RouteMessage, self.MSG.TIME, Mission.Name .. "/StageRoute", "Co-Pilot", 20 ) + else + Client:Message( RouteMessage, self.MSG.TIME, Mission.Name .. "/StageRoute", "Command", 20 ) + end + + + if Mission.MissionReportFlash and Client:IsTransport() then + Client:ShowCargo() + end + + return Valid +end + +function STAGEROUTE:Validate( Mission, Client, Task ) + self:F() + local Valid = STAGE:Validate( Mission, Client, Task ) + + -- check if the Client is in the landing zone + self:T( Task.LandingZones.LandingZoneNames ) + Task.CurrentLandingZoneName = routines.IsUnitNearZonesRadius( Client:GetClientGroupDCSUnit(), Task.LandingZones.LandingZoneNames, 500 ) + + if Task.CurrentLandingZoneName then + + Task.CurrentLandingZone = Task.LandingZones.LandingZones[Task.CurrentLandingZoneName].CargoZone + Task.CurrentCargoZone = Task.LandingZones.LandingZones[Task.CurrentLandingZoneName] + + if Task.CurrentCargoZone then + if not Task.Signalled then + Task.Signalled = Task.CurrentCargoZone:Signal() + end + end + + self:T( 1 ) + return 1 + end + + self:T( 0 ) + return 0 +end + + + +STAGELANDING = { + ClassName = "STAGELANDING", + MSG = { ID = "Landing", TIME = 10 }, + Name = "Landing", + Signalled = false +} + +function STAGELANDING:New() + local self = BASE:Inherit( self, STAGE:New() ) + self:F() + self.StageType = 'CLIENT' + return self +end + +--- Execute the landing coordination. +-- @param #STAGELANDING self +-- @param Mission#MISSION Mission +-- @param Client#CLIENT Client +-- @param Task#TASK Task +function STAGELANDING:Execute( Mission, Client, Task ) + self:F() + + if Client:IsMultiSeated() then + Client:Message( "We have arrived at the landing zone.", self.MSG.TIME, Mission.Name .. "/StageArrived", "Co-Pilot", 10 ) + else + Client:Message( "You have arrived at the landing zone.", self.MSG.TIME, Mission.Name .. "/StageArrived", "Command", 10 ) + end + + Task.HostUnit = Task.CurrentCargoZone:GetHostUnit() + + self:T( { Task.HostUnit } ) + + if Task.HostUnit then + + Task.HostUnitName = Task.HostUnit:GetPrefix() + Task.HostUnitTypeName = Task.HostUnit:GetTypeName() + + local HostMessage = "" + Task.CargoNames = "" + + local IsFirst = true + + for CargoID, Cargo in pairs( CARGOS ) do + if Cargo.CargoType == Task.CargoType then + + if Cargo:IsLandingRequired() then + self:T( "Task for cargo " .. Cargo.CargoType .. " requires landing.") + Task.IsLandingRequired = true + end + + if Cargo:IsSlingLoad() then + self:T( "Task for cargo " .. Cargo.CargoType .. " is a slingload.") + Task.IsSlingLoad = true + end + + if IsFirst then + IsFirst = false + Task.CargoNames = Task.CargoNames .. Cargo.CargoName .. "( " .. Cargo.CargoWeight .. " )" + else + Task.CargoNames = Task.CargoNames .. "; " .. Cargo.CargoName .. "( " .. Cargo.CargoWeight .. " )" + end + end + end + + if Task.IsLandingRequired then + HostMessage = "Land the helicopter to " .. Task.TEXT[1] .. " " .. Task.CargoNames .. "." + else + HostMessage = "Use the Radio menu and F6 to find the cargo, then fly or land near the cargo and " .. Task.TEXT[1] .. " " .. Task.CargoNames .. "." + end + + local Host = "Command" + if Task.HostUnitName then + Host = Task.HostUnitName .. " (" .. Task.HostUnitTypeName .. ")" + else + if Client:IsMultiSeated() then + Host = "Co-Pilot" + end + end + + Client:Message( HostMessage, self.MSG.TIME, Mission.Name .. "/STAGELANDING.EXEC." .. Host, Host, 10 ) + + end +end + +function STAGELANDING:Validate( Mission, Client, Task ) + self:F() + + Task.CurrentLandingZoneName = routines.IsUnitNearZonesRadius( Client:GetClientGroupDCSUnit(), Task.LandingZones.LandingZoneNames, 500 ) + if Task.CurrentLandingZoneName then + + -- Client is in de landing zone. + self:T( Task.CurrentLandingZoneName ) + + Task.CurrentLandingZone = Task.LandingZones.LandingZones[Task.CurrentLandingZoneName].CargoZone + Task.CurrentCargoZone = Task.LandingZones.LandingZones[Task.CurrentLandingZoneName] + + if Task.CurrentCargoZone then + if not Task.Signalled then + Task.Signalled = Task.CurrentCargoZone:Signal() + end + end + else + if Task.CurrentLandingZone then + Task.CurrentLandingZone = nil + end + if Task.CurrentCargoZone then + Task.CurrentCargoZone = nil + end + Task.Signalled = false + Task:RemoveCargoMenus( Client ) + self:T( -1 ) + return -1 + end + + + local DCSUnitVelocityVec3 = Client:GetClientGroupDCSUnit():getVelocity() + local DCSUnitVelocity = ( DCSUnitVelocityVec3.x ^2 + DCSUnitVelocityVec3.y ^2 + DCSUnitVelocityVec3.z ^2 ) ^ 0.5 + + local DCSUnitPointVec3 = Client:GetClientGroupDCSUnit():getPoint() + local LandHeight = land.getHeight( { x = DCSUnitPointVec3.x, y = DCSUnitPointVec3.z } ) + local DCSUnitHeight = DCSUnitPointVec3.y - LandHeight + + self:T( { Task.IsLandingRequired, Client:GetClientGroupDCSUnit():inAir() } ) + if Task.IsLandingRequired and not Client:GetClientGroupDCSUnit():inAir() then + self:T( 1 ) + Task.IsInAirTestRequired = true + return 1 + end + + self:T( { DCSUnitVelocity, DCSUnitHeight, LandHeight, Task.CurrentCargoZone.SignalHeight } ) + if Task.IsLandingRequired and DCSUnitVelocity <= 0.05 and DCSUnitHeight <= Task.CurrentCargoZone.SignalHeight then + self:T( 1 ) + Task.IsInAirTestRequired = false + return 1 + end + + self:T( 0 ) + return 0 +end + +STAGELANDED = { + ClassName = "STAGELANDED", + MSG = { ID = "Land", TIME = 10 }, + Name = "Landed", + MenusAdded = false +} + +function STAGELANDED:New() + local self = BASE:Inherit( self, STAGE:New() ) + self:F() + self.StageType = 'CLIENT' + return self +end + +function STAGELANDED:Execute( Mission, Client, Task ) + self:F() + + if Task.IsLandingRequired then + + local Host = "Command" + if Task.HostUnitName then + Host = Task.HostUnitName .. " (" .. Task.HostUnitTypeName .. ")" + else + if Client:IsMultiSeated() then + Host = "Co-Pilot" + end + end + + Client:Message( 'You have landed within the landing zone. Use the radio menu (F10) to ' .. Task.TEXT[1] .. ' the ' .. Task.CargoType .. '.', + self.MSG.TIME, Mission.Name .. "/STAGELANDED.EXEC" .. Host, Host ) + + if not self.MenusAdded then + Task.Cargo = nil + Task:RemoveCargoMenus( Client ) + Task:AddCargoMenus( Client, CARGOS, 250 ) + end + end +end + + + +function STAGELANDED:Validate( Mission, Client, Task ) + self:F() + + if not routines.IsUnitNearZonesRadius( Client:GetClientGroupDCSUnit(), Task.CurrentLandingZoneName, 500 ) then + self:T( "Client is not anymore in the landing zone, go back to stage Route, and remove cargo menus." ) + Task.Signalled = false + Task:RemoveCargoMenus( Client ) + self:T( -2 ) + return -2 + end + + local DCSUnitVelocityVec3 = Client:GetClientGroupDCSUnit():getVelocity() + local DCSUnitVelocity = ( DCSUnitVelocityVec3.x ^2 + DCSUnitVelocityVec3.y ^2 + DCSUnitVelocityVec3.z ^2 ) ^ 0.5 + + local DCSUnitPointVec3 = Client:GetClientGroupDCSUnit():getPoint() + local LandHeight = land.getHeight( { x = DCSUnitPointVec3.x, y = DCSUnitPointVec3.z } ) + local DCSUnitHeight = DCSUnitPointVec3.y - LandHeight + + self:T( { Task.IsLandingRequired, Client:GetClientGroupDCSUnit():inAir() } ) + if Task.IsLandingRequired and Task.IsInAirTestRequired == true and Client:GetClientGroupDCSUnit():inAir() then + self:T( "Client went back in the air. Go back to stage Landing." ) + self:T( -1 ) + return -1 + end + + self:T( { DCSUnitVelocity, DCSUnitHeight, LandHeight, Task.CurrentCargoZone.SignalHeight } ) + if Task.IsLandingRequired and Task.IsInAirTestRequired == false and DCSUnitVelocity >= 2 and DCSUnitHeight >= Task.CurrentCargoZone.SignalHeight then + self:T( "It seems the Client went back in the air and over the boundary limits. Go back to stage Landing." ) + self:T( -1 ) + return -1 + end + + -- Wait until cargo is selected from the menu. + if Task.IsLandingRequired then + if not Task.Cargo then + self:T( 0 ) + return 0 + end + end + + self:T( 1 ) + return 1 +end + +STAGEUNLOAD = { + ClassName = "STAGEUNLOAD", + MSG = { ID = "Unload", TIME = 10 }, + Name = "Unload" +} + +function STAGEUNLOAD:New() + local self = BASE:Inherit( self, STAGE:New() ) + self:F() + self.StageType = 'CLIENT' + return self +end + +--- Coordinate UnLoading +-- @param #STAGEUNLOAD self +-- @param Mission#MISSION Mission +-- @param Client#CLIENT Client +-- @param Task#TASK Task +function STAGEUNLOAD:Execute( Mission, Client, Task ) + self:F() + + if Client:IsMultiSeated() then + Client:Message( 'The ' .. Task.CargoType .. ' are being ' .. Task.TEXT[2] .. ' within the landing zone. Wait until the helicopter is ' .. Task.TEXT[3] .. '.', + self.MSG.TIME, Mission.Name .. "/StageUnLoad", "Co-Pilot" ) + else + Client:Message( 'You are unloading the ' .. Task.CargoType .. ' ' .. Task.TEXT[2] .. ' within the landing zone. Wait until the helicopter is ' .. Task.TEXT[3] .. '.', + self.MSG.TIME, Mission.Name .. "/StageUnLoad", "Command" ) + end + Task:RemoveCargoMenus( Client ) +end + +function STAGEUNLOAD:Executing( Mission, Client, Task ) + self:F() + env.info( 'STAGEUNLOAD:Executing() Task.Cargo.CargoName = ' .. Task.Cargo.CargoName ) + + local TargetZoneName + + if Task.TargetZoneName then + TargetZoneName = Task.TargetZoneName + else + TargetZoneName = Task.CurrentLandingZoneName + end + + if Task.Cargo:UnLoad( Client, TargetZoneName ) then + Task.ExecuteStage = _TransportExecuteStage.SUCCESS + if Mission.MissionReportFlash then + Client:ShowCargo() + end + end +end + +--- Validate UnLoading +-- @param #STAGEUNLOAD self +-- @param Mission#MISSION Mission +-- @param Client#CLIENT Client +-- @param Task#TASK Task +function STAGEUNLOAD:Validate( Mission, Client, Task ) + self:F() + env.info( 'STAGEUNLOAD:Validate()' ) + + if routines.IsUnitNearZonesRadius( Client:GetClientGroupDCSUnit(), Task.CurrentLandingZoneName, 500 ) then + else + Task.ExecuteStage = _TransportExecuteStage.FAILED + Task:RemoveCargoMenus( Client ) + if Client:IsMultiSeated() then + Client:Message( 'The ' .. Task.CargoType .. " haven't been successfully " .. Task.TEXT[3] .. ' within the landing zone. Task and mission has failed.', + _TransportStageMsgTime.DONE, Mission.Name .. "/StageFailure", "Co-Pilot" ) + else + Client:Message( 'The ' .. Task.CargoType .. " haven't been successfully " .. Task.TEXT[3] .. ' within the landing zone. Task and mission has failed.', + _TransportStageMsgTime.DONE, Mission.Name .. "/StageFailure", "Command" ) + end + return 1 + end + + if not Client:GetClientGroupDCSUnit():inAir() then + else + Task.ExecuteStage = _TransportExecuteStage.FAILED + Task:RemoveCargoMenus( Client ) + if Client:IsMultiSeated() then + Client:Message( 'The ' .. Task.CargoType .. " haven't been successfully " .. Task.TEXT[3] .. ' within the landing zone. Task and mission has failed.', + _TransportStageMsgTime.DONE, Mission.Name .. "/StageFailure", "Co-Pilot" ) + else + Client:Message( 'The ' .. Task.CargoType .. " haven't been successfully " .. Task.TEXT[3] .. ' within the landing zone. Task and mission has failed.', + _TransportStageMsgTime.DONE, Mission.Name .. "/StageFailure", "Command" ) + end + return 1 + end + + if Task.ExecuteStage == _TransportExecuteStage.SUCCESS then + if Client:IsMultiSeated() then + Client:Message( 'The ' .. Task.CargoType .. ' have been sucessfully ' .. Task.TEXT[3] .. ' within the landing zone.', _TransportStageMsgTime.DONE, Mission.Name .. "/Stage", "Co-Pilot" ) + else + Client:Message( 'The ' .. Task.CargoType .. ' have been sucessfully ' .. Task.TEXT[3] .. ' within the landing zone.', _TransportStageMsgTime.DONE, Mission.Name .. "/Stage", "Command" ) + end + Task:RemoveCargoMenus( Client ) + Task.MissionTask:AddGoalCompletion( Task.MissionTask.GoalVerb, Task.CargoName, 1 ) -- We set the cargo as one more goal completed in the mission. + return 1 + end + + return 1 +end + +STAGELOAD = { + ClassName = "STAGELOAD", + MSG = { ID = "Load", TIME = 10 }, + Name = "Load" +} + +function STAGELOAD:New() + local self = BASE:Inherit( self, STAGE:New() ) + self:F() + self.StageType = 'CLIENT' + return self +end + +function STAGELOAD:Execute( Mission, Client, Task ) + self:F() + + if not Task.IsSlingLoad then + + local Host = "Command" + if Task.HostUnitName then + Host = Task.HostUnitName .. " (" .. Task.HostUnitTypeName .. ")" + else + if Client:IsMultiSeated() then + Host = "Co-Pilot" + end + end + + Client:Message( 'The ' .. Task.CargoType .. ' are being ' .. Task.TEXT[2] .. ' within the landing zone. Wait until the helicopter is ' .. Task.TEXT[3] .. '.', + _TransportStageMsgTime.EXECUTING, Mission.Name .. "/STAGELOAD.EXEC." .. Host, Host ) + + -- Route the cargo to the Carrier + + Task.Cargo:OnBoard( Client, Task.CurrentCargoZone, Task.OnBoardSide ) + Task.ExecuteStage = _TransportExecuteStage.EXECUTING + else + Task.ExecuteStage = _TransportExecuteStage.EXECUTING + end +end + +function STAGELOAD:Executing( Mission, Client, Task ) + self:F() + + -- If the Cargo is ready to be loaded, load it into the Client. + + local Host = "Command" + if Task.HostUnitName then + Host = Task.HostUnitName .. " (" .. Task.HostUnitTypeName .. ")" + else + if Client:IsMultiSeated() then + Host = "Co-Pilot" + end + end + + if not Task.IsSlingLoad then + self:T( Task.Cargo.CargoName) + + if Task.Cargo:OnBoarded( Client, Task.CurrentCargoZone ) then + + -- Load the Cargo onto the Client + Task.Cargo:Load( Client ) + + -- Message to the pilot that cargo has been loaded. + Client:Message( "The cargo " .. Task.Cargo.CargoName .. " has been loaded in our helicopter.", + 20, Mission.Name .. "/STAGELANDING.LOADING1." .. Host, Host ) + Task.ExecuteStage = _TransportExecuteStage.SUCCESS + + Client:ShowCargo() + end + else + Client:Message( "Hook the " .. Task.CargoNames .. " onto the helicopter " .. Task.TEXT[3] .. " within the landing zone.", + _TransportStageMsgTime.EXECUTING, Mission.Name .. "/STAGELOAD.LOADING.1." .. Host, Host , 10 ) + for CargoID, Cargo in pairs( CARGOS ) do + self:T( "Cargo.CargoName = " .. Cargo.CargoName ) + + if Cargo:IsSlingLoad() then + local CargoStatic = StaticObject.getByName( Cargo.CargoStaticName ) + if CargoStatic then + self:T( "Cargo is found in the DCS simulator.") + local CargoStaticPosition = CargoStatic:getPosition().p + self:T( "Cargo Position x = " .. CargoStaticPosition.x .. ", y = " .. CargoStaticPosition.y .. ", z = " .. CargoStaticPosition.z ) + local CargoStaticHeight = routines.GetUnitHeight( CargoStatic ) + if CargoStaticHeight > 5 then + self:T( "Cargo is airborne.") + Cargo:StatusLoaded() + Task.Cargo = Cargo + Client:Message( 'The Cargo has been successfully hooked onto the helicopter and is now being sling loaded. Fly outside the landing zone.', + self.MSG.TIME, Mission.Name .. "/STAGELANDING.LOADING.2." .. Host, Host ) + Task.ExecuteStage = _TransportExecuteStage.SUCCESS + break + end + else + self:T( "Cargo not found in the DCS simulator." ) + end + end + end + end + +end + +function STAGELOAD:Validate( Mission, Client, Task ) + self:F() + + self:T( "Task.CurrentLandingZoneName = " .. Task.CurrentLandingZoneName ) + + local Host = "Command" + if Task.HostUnitName then + Host = Task.HostUnitName .. " (" .. Task.HostUnitTypeName .. ")" + else + if Client:IsMultiSeated() then + Host = "Co-Pilot" + end + end + + if not Task.IsSlingLoad then + if not routines.IsUnitNearZonesRadius( Client:GetClientGroupDCSUnit(), Task.CurrentLandingZoneName, 500 ) then + Task:RemoveCargoMenus( Client ) + Task.ExecuteStage = _TransportExecuteStage.FAILED + Task.CargoName = nil + Client:Message( "The " .. Task.CargoType .. " loading has been aborted. You flew outside the pick-up zone while loading. ", + self.MSG.TIME, Mission.Name .. "/STAGELANDING.VALIDATE.1." .. Host, Host ) + self:T( -1 ) + return -1 + end + + local DCSUnitVelocityVec3 = Client:GetClientGroupDCSUnit():getVelocity() + local DCSUnitVelocity = ( DCSUnitVelocityVec3.x ^2 + DCSUnitVelocityVec3.y ^2 + DCSUnitVelocityVec3.z ^2 ) ^ 0.5 + + local DCSUnitPointVec3 = Client:GetClientGroupDCSUnit():getPoint() + local LandHeight = land.getHeight( { x = DCSUnitPointVec3.x, y = DCSUnitPointVec3.z } ) + local DCSUnitHeight = DCSUnitPointVec3.y - LandHeight + + self:T( { Task.IsLandingRequired, Client:GetClientGroupDCSUnit():inAir() } ) + if Task.IsLandingRequired and Task.IsInAirTestRequired == true and Client:GetClientGroupDCSUnit():inAir() then + Task:RemoveCargoMenus( Client ) + Task.ExecuteStage = _TransportExecuteStage.FAILED + Task.CargoName = nil + Client:Message( "The " .. Task.CargoType .. " loading has been aborted. Re-start the " .. Task.TEXT[3] .. " process. Don't fly outside the pick-up zone.", + self.MSG.TIME, Mission.Name .. "/STAGELANDING.VALIDATE.1." .. Host, Host ) + self:T( -1 ) + return -1 + end + + self:T( { DCSUnitVelocity, DCSUnitHeight, LandHeight, Task.CurrentCargoZone.SignalHeight } ) + if Task.IsLandingRequired and Task.IsInAirTestRequired == false and DCSUnitVelocity >= 2 and DCSUnitHeight >= Task.CurrentCargoZone.SignalHeight then + Task:RemoveCargoMenus( Client ) + Task.ExecuteStage = _TransportExecuteStage.FAILED + Task.CargoName = nil + Client:Message( "The " .. Task.CargoType .. " loading has been aborted. Re-start the " .. Task.TEXT[3] .. " process. Don't fly outside the pick-up zone.", + self.MSG.TIME, Mission.Name .. "/STAGELANDING.VALIDATE.1." .. Host, Host ) + self:T( -1 ) + return -1 + end + + if Task.ExecuteStage == _TransportExecuteStage.SUCCESS then + Task:RemoveCargoMenus( Client ) + Client:Message( "Good Job. The " .. Task.CargoType .. " has been sucessfully " .. Task.TEXT[3] .. " within the landing zone.", + self.MSG.TIME, Mission.Name .. "/STAGELANDING.VALIDATE.3." .. Host, Host ) + Task.MissionTask:AddGoalCompletion( Task.MissionTask.GoalVerb, Task.CargoName, 1 ) + self:T( 1 ) + return 1 + end + + else + if Task.ExecuteStage == _TransportExecuteStage.SUCCESS then + CargoStatic = StaticObject.getByName( Task.Cargo.CargoStaticName ) + if CargoStatic and not routines.IsStaticInZones( CargoStatic, Task.CurrentLandingZoneName ) then + Client:Message( "Good Job. The " .. Task.CargoType .. " has been sucessfully " .. Task.TEXT[3] .. " and flown outside of the landing zone.", + self.MSG.TIME, Mission.Name .. "/STAGELANDING.VALIDATE.4." .. Host, Host ) + Task.MissionTask:AddGoalCompletion( Task.MissionTask.GoalVerb, Task.Cargo.CargoName, 1 ) + self:T( 1 ) + return 1 + end + end + + end + + + self:T( 0 ) + return 0 +end + + +STAGEDONE = { + ClassName = "STAGEDONE", + MSG = { ID = "Done", TIME = 10 }, + Name = "Done" +} + +function STAGEDONE:New() + local self = BASE:Inherit( self, STAGE:New() ) + self:F() + self.StageType = 'AI' + return self +end + +function STAGEDONE:Execute( Mission, Client, Task ) + self:F() + +end + +function STAGEDONE:Validate( Mission, Client, Task ) + self:F() + + Task:Done() + + return 0 +end + +STAGEARRIVE = { + ClassName = "STAGEARRIVE", + MSG = { ID = "Arrive", TIME = 10 }, + Name = "Arrive" +} + +function STAGEARRIVE:New() + local self = BASE:Inherit( self, STAGE:New() ) + self:F() + self.StageType = 'CLIENT' + return self +end + + +--- Execute Arrival +-- @param #STAGEARRIVE self +-- @param Mission#MISSION Mission +-- @param Client#CLIENT Client +-- @param Task#TASK Task +function STAGEARRIVE:Execute( Mission, Client, Task ) + self:F() + + if Client:IsMultiSeated() then + Client:Message( 'We have arrived at ' .. Task.CurrentLandingZoneName .. ".", self.MSG.TIME, Mission.Name .. "/Stage", "Co-Pilot" ) + else + Client:Message( 'We have arrived at ' .. Task.CurrentLandingZoneName .. ".", self.MSG.TIME, Mission.Name .. "/Stage", "Command" ) + end + +end + +function STAGEARRIVE:Validate( Mission, Client, Task ) + self:F() + + Task.CurrentLandingZoneID = routines.IsUnitInZones( Client:GetClientGroupDCSUnit(), Task.LandingZones ) + if ( Task.CurrentLandingZoneID ) then + else + return -1 + end + + return 1 +end + +STAGEGROUPSDESTROYED = { + ClassName = "STAGEGROUPSDESTROYED", + DestroyGroupSize = -1, + Frequency = STAGE.FREQUENCY.REPEAT, + MSG = { ID = "DestroyGroup", TIME = 10 }, + Name = "GroupsDestroyed" +} + +function STAGEGROUPSDESTROYED:New() + local self = BASE:Inherit( self, STAGE:New() ) + self:F() + self.StageType = 'AI' + return self +end + +--function STAGEGROUPSDESTROYED:Execute( Mission, Client, Task ) +-- +-- Client:Message( 'Task: Still ' .. DestroyGroupSize .. " of " .. Task.DestroyGroupCount .. " " .. Task.DestroyGroupType .. " to be destroyed!", self.MSG.TIME, Mission.Name .. "/Stage" ) +-- +--end + +function STAGEGROUPSDESTROYED:Validate( Mission, Client, Task ) + self:F() + + if Task.MissionTask:IsGoalReached() then + return 1 + else + return 0 + end +end + +function STAGEGROUPSDESTROYED:Execute( Mission, Client, Task ) + self:F() + self:T( { Task.ClassName, Task.Destroyed } ) + --env.info( 'Event Table Task = ' .. tostring(Task) ) + +end + + + + + + + + + + + + + +--[[ + _TransportStage: Defines the different stages of which of transport missions can be in. This table is internal and is used to control the sequence of messages, actions and flow. + + - _TransportStage.START + - _TransportStage.ROUTE + - _TransportStage.LAND + - _TransportStage.EXECUTE + - _TransportStage.DONE + - _TransportStage.REMOVE +--]] +_TransportStage = { + HOLD = "HOLD", + START = "START", + ROUTE = "ROUTE", + LANDING = "LANDING", + LANDED = "LANDED", + EXECUTING = "EXECUTING", + LOAD = "LOAD", + UNLOAD = "UNLOAD", + DONE = "DONE", + NEXT = "NEXT" +} + +_TransportStageMsgTime = { + HOLD = 10, + START = 60, + ROUTE = 5, + LANDING = 10, + LANDED = 30, + EXECUTING = 30, + LOAD = 30, + UNLOAD = 30, + DONE = 30, + NEXT = 0 +} + +_TransportStageTime = { + HOLD = 10, + START = 5, + ROUTE = 5, + LANDING = 1, + LANDED = 1, + EXECUTING = 5, + LOAD = 5, + UNLOAD = 5, + DONE = 1, + NEXT = 0 +} + +_TransportStageAction = { + REPEAT = -1, + NONE = 0, + ONCE = 1 +} +--- The TASK Classes define major end-to-end activities within a MISSION. The TASK Class is the Master Class to orchestrate these activities. From this class, many concrete TASK classes are inherited. +-- @module TASK + +Include.File( "Routines" ) +Include.File( "Base" ) +Include.File( "Mission" ) +Include.File( "Client" ) +Include.File( "Stage" ) + +--- The TASK class +-- @type TASK +-- @extends Base#BASE +TASK = { + + -- Defines the different signal types with a Task. + SIGNAL = { + COLOR = { + RED = { ID = 1, COLOR = trigger.smokeColor.Red, TEXT = "A red" }, + GREEN = { ID = 2, COLOR = trigger.smokeColor.Green, TEXT = "A green" }, + BLUE = { ID = 3, COLOR = trigger.smokeColor.Blue, TEXT = "A blue" }, + WHITE = { ID = 4, COLOR = trigger.smokeColor.White, TEXT = "A white" }, + ORANGE = { ID = 5, COLOR = trigger.smokeColor.Orange, TEXT = "An orange" } + }, + TYPE = { + SMOKE = { ID = 1, TEXT = "smoke" }, + FLARE = { ID = 2, TEXT = "flare" } + } + }, + ClassName = "TASK", + Mission = {}, -- Owning mission of the Task + Name = '', + Stages = {}, + Stage = {}, + Cargos = { + InitCargos = {}, + LoadCargos = {} + }, + LandingZones = { + LandingZoneNames = {}, + LandingZones = {} + }, + ActiveStage = 0, + TaskDone = false, + TaskFailed = false, + GoalTasks = {} +} + +--- Instantiates a new TASK Base. Should never be used. Interface Class. +-- @return TASK +function TASK:New() + local self = BASE:Inherit( self, BASE:New() ) + self:F() + + -- assign Task default values during construction + self.TaskBriefing = "Task: No Task." + self.Time = timer.getTime() + self.ExecuteStage = _TransportExecuteStage.NONE + + return self +end + +function TASK:SetStage( StageSequenceIncrement ) + self:F( { StageSequenceIncrement } ) + + local Valid = false + if StageSequenceIncrement ~= 0 then + self.ActiveStage = self.ActiveStage + StageSequenceIncrement + if 1 <= self.ActiveStage and self.ActiveStage <= #self.Stages then + self.Stage = self.Stages[self.ActiveStage] + self:T( { self.Stage.Name } ) + self.Frequency = self.Stage.Frequency + Valid = true + else + Valid = false + env.info( "TASK:SetStage() self.ActiveStage is smaller or larger than self.Stages array. self.ActiveStage = " .. self.ActiveStage ) + end + end + self.Time = timer.getTime() + return Valid +end + +function TASK:Init() + self:F() + self.ActiveStage = 0 + self:SetStage(1) + self.TaskDone = false + self.TaskFailed = false +end + + +--- Get progress of a TASK. +-- @return string GoalsText +function TASK:GetGoalProgress() + self:F2() + + local GoalsText = "" + for GoalVerb, GoalVerbData in pairs( self.GoalTasks ) do + local Goals = self:GetGoalCompletion( GoalVerb ) + if Goals and Goals ~= "" then + Goals = '(' .. Goals .. ')' + else + Goals = '( - )' + end + GoalsText = GoalsText .. GoalVerb .. ': ' .. self:GetGoalCount(GoalVerb) .. ' goals ' .. Goals .. ' of ' .. self:GetGoalTotal(GoalVerb) .. ' goals completed (' .. self:GetGoalPercentage(GoalVerb) .. '%); ' + end + + if GoalsText == "" then + GoalsText = "( - )" + end + + return GoalsText +end + +--- Show progress of a TASK. +-- @param MISSION Mission Group structure describing the Mission. +-- @param CLIENT Client Group structure describing the Client. +function TASK:ShowGoalProgress( Mission, Client ) + self:F2() + + local GoalsText = "" + for GoalVerb, GoalVerbData in pairs( self.GoalTasks ) do + if Mission:IsCompleted() then + else + local Goals = self:GetGoalCompletion( GoalVerb ) + if Goals and Goals ~= "" then + else + Goals = "-" + end + GoalsText = GoalsText .. self:GetGoalProgress() + end + end + + if Mission.MissionReportFlash or Mission.MissionReportShow then + Client:Message( GoalsText, 10, "/TASKPROGRESS" .. self.ClassName, "Mission Command: Task Status", 30 ) + end +end + +--- Sets a TASK to status Done. +function TASK:Done() + self:F2() + self.TaskDone = true +end + +--- Returns if a TASK is done. +-- @return bool +function TASK:IsDone() + self:F2( self.TaskDone ) + return self.TaskDone +end + +--- Sets a TASK to status failed. +function TASK:Failed() + self:F() + self.TaskFailed = true +end + +--- Returns if a TASk has failed. +-- @return bool +function TASK:IsFailed() + self:F2( self.TaskFailed ) + return self.TaskFailed +end + +function TASK:Reset( Mission, Client ) + self:F2() + self.ExecuteStage = _TransportExecuteStage.NONE +end + +--- Returns the Goals of a TASK +-- @return @table Goals +function TASK:GetGoals() + return self.GoalTasks +end + +--- Returns if a TASK has Goal(s). +-- @param #TASK self +-- @param #string GoalVerb is the name of the Goal of the TASK. +-- @return bool +function TASK:Goal( GoalVerb ) + self:F2( { GoalVerb } ) + if not GoalVerb then + GoalVerb = self.GoalVerb + end + self:T2( {self.GoalTasks[GoalVerb] } ) + if self.GoalTasks[GoalVerb] and self.GoalTasks[GoalVerb].GoalTotal > 0 then + return true + else + return false + end +end + +--- Sets the total Goals to be achieved of the Goal Name +-- @param number GoalTotal is the number of times the GoalVerb needs to be achieved. +-- @param ?string GoalVerb is the name of the Goal of the TASK. If the GoalVerb is not given, then the default TASK Goals will be used. +function TASK:SetGoalTotal( GoalTotal, GoalVerb ) + self:F2( { GoalTotal, GoalVerb } ) + + if not GoalVerb then + GoalVerb = self.GoalVerb + end + self.GoalTasks[GoalVerb] = {} + self.GoalTasks[GoalVerb].Goals = {} + self.GoalTasks[GoalVerb].GoalTotal = GoalTotal + self.GoalTasks[GoalVerb].GoalCount = 0 + return self +end + +--- Gets the total of Goals to be achieved within the TASK of the GoalVerb. +-- @param ?string GoalVerb is the name of the Goal of the TASK. If the GoalVerb is not given, then the default TASK Goals will be used. +function TASK:GetGoalTotal( GoalVerb ) + self:F2( { GoalVerb } ) + if not GoalVerb then + GoalVerb = self.GoalVerb + end + if self:Goal( GoalVerb ) then + return self.GoalTasks[GoalVerb].GoalTotal + else + return 0 + end +end + +--- Sets the total of Goals currently achieved within the TASK of the GoalVerb. +-- @param number GoalCount is the total number of Goals achieved within the TASK. +-- @param ?string GoalVerb is the name of the Goal of the TASK. If the GoalVerb is not given, then the default TASK Goals will be used. +-- @return TASK +function TASK:SetGoalCount( GoalCount, GoalVerb ) + self:F2() + if not GoalVerb then + GoalVerb = self.GoalVerb + end + if self:Goal( GoalVerb) then + self.GoalTasks[GoalVerb].GoalCount = GoalCount + end + return self +end + +--- Increments the total of Goals currently achieved within the TASK of the GoalVerb, with the given GoalCountIncrease. +-- @param number GoalCountIncrease is the number of new Goals achieved within the TASK. +-- @param ?string GoalVerb is the name of the Goal of the TASK. If the GoalVerb is not given, then the default TASK Goals will be used. +-- @return TASK +function TASK:IncreaseGoalCount( GoalCountIncrease, GoalVerb ) + self:F2( { GoalCountIncrease, GoalVerb } ) + if not GoalVerb then + GoalVerb = self.GoalVerb + end + if self:Goal( GoalVerb) then + self.GoalTasks[GoalVerb].GoalCount = self.GoalTasks[GoalVerb].GoalCount + GoalCountIncrease + end + return self +end + +--- Gets the total of Goals currently achieved within the TASK of the GoalVerb. +-- @param ?string GoalVerb is the name of the Goal of the TASK. If the GoalVerb is not given, then the default TASK Goals will be used. +-- @return TASK +function TASK:GetGoalCount( GoalVerb ) + self:F2() + if not GoalVerb then + GoalVerb = self.GoalVerb + end + if self:Goal( GoalVerb ) then + return self.GoalTasks[GoalVerb].GoalCount + else + return 0 + end +end + +--- Gets the percentage of Goals currently achieved within the TASK of the GoalVerb. +-- @param ?string GoalVerb is the name of the Goal of the TASK. If the GoalVerb is not given, then the default TASK Goals will be used. +-- @return TASK +function TASK:GetGoalPercentage( GoalVerb ) + self:F2() + if not GoalVerb then + GoalVerb = self.GoalVerb + end + if self:Goal( GoalVerb ) then + return math.floor( self:GetGoalCount( GoalVerb ) / self:GetGoalTotal( GoalVerb ) * 100 + .5 ) + else + return 100 + end +end + +--- Returns if all the Goals of the TASK were achieved. +-- @return bool +function TASK:IsGoalReached() + self:F2() + + local GoalReached = true + + for GoalVerb, Goals in pairs( self.GoalTasks ) do + self:T2( { "GoalVerb", GoalVerb } ) + if self:Goal( GoalVerb ) then + local GoalToDo = self:GetGoalTotal( GoalVerb ) - self:GetGoalCount( GoalVerb ) + self:T2( "GoalToDo = " .. GoalToDo ) + if GoalToDo <= 0 then + else + GoalReached = false + break + end + else + break + end + end + + self:T( { GoalReached, self.GoalTasks } ) + return GoalReached +end + +--- Adds an Additional Goal for the TASK to be achieved. +-- @param string GoalVerb is the name of the Goal of the TASK. +-- @param string GoalTask is a text describing the Goal of the TASK to be achieved. +-- @param number GoalIncrease is a number by which the Goal achievement is increasing. +function TASK:AddGoalCompletion( GoalVerb, GoalTask, GoalIncrease ) + self:F2( { GoalVerb, GoalTask, GoalIncrease } ) + + if self:Goal( GoalVerb ) then + self.GoalTasks[GoalVerb].Goals[#self.GoalTasks[GoalVerb].Goals+1] = GoalTask + self.GoalTasks[GoalVerb].GoalCount = self.GoalTasks[GoalVerb].GoalCount + GoalIncrease + end + return self +end + +--- Returns if the additional Goal for the TASK was completed. +-- @param ?string GoalVerb is the name of the Goal of the TASK. If the GoalVerb is not given, then the default TASK Goals will be used. +-- @return string Goals +function TASK:GetGoalCompletion( GoalVerb ) + self:F2( { GoalVerb } ) + + if self:Goal( GoalVerb ) then + local Goals = "" + for GoalID, GoalName in pairs( self.GoalTasks[GoalVerb].Goals ) do Goals = Goals .. GoalName .. " + " end + return Goals:gsub(" + $", ""), self.GoalTasks[GoalVerb].GoalCount + end +end + +function TASK.MenuAction( Parameter ) + Parameter.ReferenceTask.ExecuteStage = _TransportExecuteStage.EXECUTING + Parameter.ReferenceTask.Cargo = Parameter.CargoTask +end + +function TASK:StageExecute() + self:F() + + local Execute = false + + if self.Frequency == STAGE.FREQUENCY.REPEAT then + Execute = true + elseif self.Frequency == STAGE.FREQUENCY.NONE then + Execute = false + elseif self.Frequency >= 0 then + Execute = true + self.Frequency = self.Frequency - 1 + end + + return Execute + +end + +--- Work function to set signal events within a TASK. +function TASK:AddSignal( SignalUnitNames, SignalType, SignalColor, SignalHeight ) + self:F() + + local Valid = true + + if Valid then + if type( SignalUnitNames ) == "table" then + self.LandingZoneSignalUnitNames = SignalUnitNames + else + self.LandingZoneSignalUnitNames = { SignalUnitNames } + end + self.LandingZoneSignalType = SignalType + self.LandingZoneSignalColor = SignalColor + self.Signalled = false + if SignalHeight ~= nil then + self.LandingZoneSignalHeight = SignalHeight + else + self.LandingZoneSignalHeight = 0 + end + + if self.TaskBriefing then + self.TaskBriefing = self.TaskBriefing .. " " .. SignalColor.TEXT .. " " .. SignalType.TEXT .. " will be fired when entering the landing zone." + end + end + + return Valid +end + +--- When the CLIENT is approaching the landing zone, a RED SMOKE will be fired by an optional SignalUnitNames. +-- @param table|string SignalUnitNames Name of the Group that will fire the signal. If this parameter is NIL, the signal will be fired from the center of the landing zone. +-- @param number SignalHeight Altitude that the Signal should be fired... +function TASK:AddSmokeRed( SignalUnitNames, SignalHeight ) + self:F() + self:AddSignal( SignalUnitNames, TASK.SIGNAL.TYPE.SMOKE, TASK.SIGNAL.COLOR.RED, SignalHeight ) +end + +--- When the CLIENT is approaching the landing zone, a GREEN SMOKE will be fired by an optional SignalUnitNames. +-- @param table|string SignalUnitNames Name of the Group that will fire the signal. If this parameter is NIL, the signal will be fired from the center of the landing zone. +-- @param number SignalHeight Altitude that the Signal should be fired... +function TASK:AddSmokeGreen( SignalUnitNames, SignalHeight ) + self:F() + self:AddSignal( SignalUnitNames, TASK.SIGNAL.TYPE.SMOKE, TASK.SIGNAL.COLOR.GREEN, SignalHeight ) +end + +--- When the CLIENT is approaching the landing zone, a BLUE SMOKE will be fired by an optional SignalUnitNames. +-- @param table|string SignalUnitNames Name of the Group that will fire the signal. If this parameter is NIL, the signal will be fired from the center of the landing zone. +-- @param number SignalHeight Altitude that the Signal should be fired... +function TASK:AddSmokeBlue( SignalUnitNames, SignalHeight ) + self:F() + self:AddSignal( SignalUnitNames, TASK.SIGNAL.TYPE.SMOKE, TASK.SIGNAL.COLOR.BLUE, SignalHeight ) +end + +--- When the CLIENT is approaching the landing zone, a WHITE SMOKE will be fired by an optional SignalUnitNames. +-- @param table|string SignalUnitNames Name of the Group that will fire the signal. If this parameter is NIL, the signal will be fired from the center of the landing zone. +-- @param number SignalHeight Altitude that the Signal should be fired... +function TASK:AddSmokeWhite( SignalUnitNames, SignalHeight ) + self:F() + self:AddSignal( SignalUnitNames, TASK.SIGNAL.TYPE.SMOKE, TASK.SIGNAL.COLOR.WHITE, SignalHeight ) +end + +--- When the CLIENT is approaching the landing zone, an ORANGE SMOKE will be fired by an optional SignalUnitNames. +-- @param table|string SignalUnitNames Name of the Group that will fire the signal. If this parameter is NIL, the signal will be fired from the center of the landing zone. +-- @param number SignalHeight Altitude that the Signal should be fired... +function TASK:AddSmokeOrange( SignalUnitNames, SignalHeight ) + self:F() + self:AddSignal( SignalUnitNames, TASK.SIGNAL.TYPE.SMOKE, TASK.SIGNAL.COLOR.ORANGE, SignalHeight ) +end + +--- When the CLIENT is approaching the landing zone, a RED FLARE will be fired by an optional SignalUnitNames. +-- @param table|string SignalUnitNames Name of the Group that will fire the signal. If this parameter is NIL, the signal will be fired from the center of the landing zone. +-- @param number SignalHeight Altitude that the Signal should be fired... +function TASK:AddFlareRed( SignalUnitNames, SignalHeight ) + self:F() + self:AddSignal( SignalUnitNames, TASK.SIGNAL.TYPE.FLARE, TASK.SIGNAL.COLOR.RED, SignalHeight ) +end + +--- When the CLIENT is approaching the landing zone, a GREEN FLARE will be fired by an optional SignalUnitNames. +-- @param table|string SignalUnitNames Name of the Group that will fire the signal. If this parameter is NIL, the signal will be fired from the center of the landing zone. +-- @param number SignalHeight Altitude that the Signal should be fired... +function TASK:AddFlareGreen( SignalUnitNames, SignalHeight ) + self:F() + self:AddSignal( SignalUnitNames, TASK.SIGNAL.TYPE.FLARE, TASK.SIGNAL.COLOR.GREEN, SignalHeight ) +end + +--- When the CLIENT is approaching the landing zone, a BLUE FLARE will be fired by an optional SignalUnitNames. +-- @param table|string SignalUnitNames Name of the Group that will fire the signal. If this parameter is NIL, the signal will be fired from the center of the landing zone. +-- @param number SignalHeight Altitude that the Signal should be fired... +function TASK:AddFlareBlue( SignalUnitNames, SignalHeight ) + self:F() + self:AddSignal( SignalUnitNames, TASK.SIGNAL.TYPE.FLARE, TASK.SIGNAL.COLOR.BLUE, SignalHeight ) +end + +--- When the CLIENT is approaching the landing zone, a WHITE FLARE will be fired by an optional SignalUnitNames. +-- @param table|string SignalUnitNames Name of the Group that will fire the signal. If this parameter is NIL, the signal will be fired from the center of the landing zone. +-- @param number SignalHeight Altitude that the Signal should be fired... +function TASK:AddFlareWhite( SignalUnitNames, SignalHeight ) + self:F() + self:AddSignal( SignalUnitNames, TASK.SIGNAL.TYPE.FLARE, TASK.SIGNAL.COLOR.WHITE, SignalHeight ) +end + +--- When the CLIENT is approaching the landing zone, an ORANGE FLARE will be fired by an optional SignalUnitNames. +-- @param table|string SignalUnitNames Name of the Group that will fire the signal. If this parameter is NIL, the signal will be fired from the center of the landing zone. +-- @param number SignalHeight Altitude that the Signal should be fired... +function TASK:AddFlareOrange( SignalUnitNames, SignalHeight ) + self:F() + self:AddSignal( SignalUnitNames, TASK.SIGNAL.TYPE.FLARE, TASK.SIGNAL.COLOR.ORANGE, SignalHeight ) +end +--- A GOHOMETASK orchestrates the travel back to the home base, which is a specific zone defined within the ME. +-- @module GOHOMETASK + +Include.File("Task") + +--- The GOHOMETASK class +-- @type +GOHOMETASK = { + ClassName = "GOHOMETASK", +} + +--- Creates a new GOHOMETASK. +-- @param table{string,...}|string LandingZones Table of Landing Zone names where Home(s) are located. +-- @return GOHOMETASK +function GOHOMETASK:New( LandingZones ) + local self = BASE:Inherit( self, TASK:New() ) + self:F( { LandingZones } ) + local Valid = true + + Valid = routines.ValidateZone( LandingZones, "LandingZones", Valid ) + + if Valid then + self.Name = 'Fly Home' + self.TaskBriefing = "Task: Fly back to your home base. Your co-pilot will provide you with the directions (required flight angle in degrees) and the distance (in km) to your home base." + if type( LandingZones ) == "table" then + self.LandingZones = LandingZones + else + self.LandingZones = { LandingZones } + end + self.Stages = { STAGEBRIEF:New(), STAGESTART:New(), STAGEROUTE:New(), STAGEARRIVE:New(), STAGEDONE:New() } + self.SetStage( self, 1 ) + end + + return self +end +--- A DESTROYBASETASK will monitor the destruction of Groups and Units. This is a BASE class, other classes are derived from this class. +-- @module DESTROYBASETASK +-- @see DESTROYGROUPSTASK +-- @see DESTROYUNITTYPESTASK +-- @see DESTROY_RADARS_TASK + +Include.File("Task") + +--- The DESTROYBASETASK class +-- @type DESTROYBASETASK +DESTROYBASETASK = { + ClassName = "DESTROYBASETASK", + Destroyed = 0, + GoalVerb = "Destroy", + DestroyPercentage = 100, +} + +--- Creates a new DESTROYBASETASK. +-- @param #DESTROYBASETASK self +-- @param #string DestroyGroupType Text describing the group to be destroyed. f.e. "Radar Installations", "Ships", "Vehicles", "Command Centers". +-- @param #string DestroyUnitType Text describing the unit types to be destroyed. f.e. "SA-6", "Row Boats", "Tanks", "Tents". +-- @param #list<#string> DestroyGroupPrefixes Table of Prefixes of the Groups to be destroyed before task is completed. +-- @param #number DestroyPercentage defines the %-tage that needs to be destroyed to achieve mission success. eg. If in the Group there are 10 units, then a value of 75 would require 8 units to be destroyed from the Group to complete the @{TASK}. +-- @return DESTROYBASETASK +function DESTROYBASETASK:New( DestroyGroupType, DestroyUnitType, DestroyGroupPrefixes, DestroyPercentage ) + local self = BASE:Inherit( self, TASK:New() ) + self:F() + + self.Name = 'Destroy' + self.Destroyed = 0 + self.DestroyGroupPrefixes = DestroyGroupPrefixes + self.DestroyGroupType = DestroyGroupType + self.DestroyUnitType = DestroyUnitType + if DestroyPercentage then + self.DestroyPercentage = DestroyPercentage + end + self.TaskBriefing = "Task: Destroy " .. DestroyGroupType .. "." + self.Stages = { STAGEBRIEF:New(), STAGESTART:New(), STAGEGROUPSDESTROYED:New(), STAGEDONE:New() } + self.SetStage( self, 1 ) + + return self +end + +--- Handle the S_EVENT_DEAD events to validate the destruction of units for the task monitoring. +-- @param #DESTROYBASETASK self +-- @param Event#EVENTDATA Event structure of MOOSE. +function DESTROYBASETASK:EventDead( Event ) + self:F( { Event } ) + + if Event.IniDCSUnit then + local DestroyUnit = Event.IniDCSUnit + local DestroyUnitName = Event.IniDCSUnitName + local DestroyGroup = Event.IniDCSGroup + local DestroyGroupName = Event.IniDCSGroupName + + --TODO: I need to fix here if 2 groups in the mission have a similar name with GroupPrefix equal, then i should differentiate for which group the goal was reached! + --I may need to test if for the goalverb that group goal was reached or something. Need to think about it a bit more ... + local UnitsDestroyed = 0 + for DestroyGroupPrefixID, DestroyGroupPrefix in pairs( self.DestroyGroupPrefixes ) do + self:T( DestroyGroupPrefix ) + if string.find( DestroyGroupName, DestroyGroupPrefix, 1, true ) then + self:T( BASE:Inherited(self).ClassName ) + UnitsDestroyed = self:ReportGoalProgress( DestroyGroup, DestroyUnit ) + self:T( UnitsDestroyed ) + end + end + + self:T( { UnitsDestroyed } ) + self:IncreaseGoalCount( UnitsDestroyed, self.GoalVerb ) + end + +end + +--- Validate task completeness of DESTROYBASETASK. +-- @param DestroyGroup Group structure describing the group to be evaluated. +-- @param DestroyUnit Unit structure describing the Unit to be evaluated. +function DESTROYBASETASK:ReportGoalProgress( DestroyGroup, DestroyUnit ) + self:F() + + return 0 +end +--- DESTROYGROUPSTASK +-- @module DESTROYGROUPSTASK + +Include.File("DestroyBaseTask") + +--- The DESTROYGROUPSTASK class +-- @type +DESTROYGROUPSTASK = { + ClassName = "DESTROYGROUPSTASK", + GoalVerb = "Destroy Groups", +} + +--- Creates a new DESTROYGROUPSTASK. +-- @param #DESTROYGROUPSTASK self +-- @param #string DestroyGroupType String describing the group to be destroyed. +-- @param #string DestroyUnitType String describing the unit to be destroyed. +-- @param #list<#string> DestroyGroupNames Table of string containing the name of the groups to be destroyed before task is completed. +-- @param #number DestroyPercentage defines the %-tage that needs to be destroyed to achieve mission success. eg. If in the Group there are 10 units, then a value of 75 would require 8 units to be destroyed from the Group to complete the @{TASK}. +---@return DESTROYGROUPSTASK +function DESTROYGROUPSTASK:New( DestroyGroupType, DestroyUnitType, DestroyGroupNames, DestroyPercentage ) + local self = BASE:Inherit( self, DESTROYBASETASK:New( DestroyGroupType, DestroyUnitType, DestroyGroupNames, DestroyPercentage ) ) + self:F() + + self.Name = 'Destroy Groups' + self.GoalVerb = "Destroy " .. DestroyGroupType + + _EVENTDISPATCHER:OnDead( self.EventDead , self ) + _EVENTDISPATCHER:OnCrash( self.EventDead , self ) + + return self +end + +--- Report Goal Progress. +-- @param #DESTROYGROUPSTASK self +-- @param DCSGroup#Group DestroyGroup Group structure describing the group to be evaluated. +-- @param DCSUnit#Unit DestroyUnit Unit structure describing the Unit to be evaluated. +-- @return #number The DestroyCount reflecting the amount of units destroyed within the group. +function DESTROYGROUPSTASK:ReportGoalProgress( DestroyGroup, DestroyUnit ) + self:F( { DestroyGroup, DestroyUnit, self.DestroyPercentage } ) + + local DestroyGroupSize = DestroyGroup:getSize() - 1 -- When a DEAD event occurs, the getSize is still one larger than the destroyed unit. + local DestroyGroupInitialSize = DestroyGroup:getInitialSize() + self:T( { DestroyGroupSize, DestroyGroupInitialSize - ( DestroyGroupInitialSize * self.DestroyPercentage / 100 ) } ) + + local DestroyCount = 0 + if DestroyGroup then + if DestroyGroupSize <= DestroyGroupInitialSize - ( DestroyGroupInitialSize * self.DestroyPercentage / 100 ) then + DestroyCount = 1 + end + else + DestroyCount = 1 + end + + self:T( DestroyCount ) + + return DestroyCount +end +--- Task class to destroy radar installations. +-- @module DESTROYRADARSTASK + +Include.File("DestroyBaseTask") + +--- The DESTROYRADARS class +-- @type +DESTROYRADARSTASK = { + ClassName = "DESTROYRADARSTASK", + GoalVerb = "Destroy Radars" +} + +--- Creates a new DESTROYRADARSTASK. +-- @param table{string,...} DestroyGroupNames Table of string containing the group names of which the radars are be destroyed. +-- @return DESTROYRADARSTASK +function DESTROYRADARSTASK:New( DestroyGroupNames ) + local self = BASE:Inherit( self, DESTROYGROUPSTASK:New( 'radar installations', 'radars', DestroyGroupNames ) ) + self:F() + + self.Name = 'Destroy Radars' + + _EVENTDISPATCHER:OnDead( self.EventDead , self ) + + return self +end + +--- Report Goal Progress. +-- @param Group DestroyGroup Group structure describing the group to be evaluated. +-- @param Unit DestroyUnit Unit structure describing the Unit to be evaluated. +function DESTROYRADARSTASK:ReportGoalProgress( DestroyGroup, DestroyUnit ) + self:F( { DestroyGroup, DestroyUnit } ) + + local DestroyCount = 0 + if DestroyUnit and DestroyUnit:hasSensors( Unit.SensorType.RADAR, Unit.RadarType.AS ) then + if DestroyUnit and DestroyUnit:getLife() <= 1.0 then + self:T( 'Destroyed a radar' ) + DestroyCount = 1 + end + end + return DestroyCount +end +--- Set TASK to destroy certain unit types. +-- @module DESTROYUNITTYPESTASK + +Include.File("DestroyBaseTask") + +--- The DESTROYUNITTYPESTASK class +-- @type +DESTROYUNITTYPESTASK = { + ClassName = "DESTROYUNITTYPESTASK", + GoalVerb = "Destroy", +} + +--- Creates a new DESTROYUNITTYPESTASK. +-- @param string DestroyGroupType String describing the group to be destroyed. f.e. "Radar Installations", "Fleet", "Batallion", "Command Centers". +-- @param string DestroyUnitType String describing the unit to be destroyed. f.e. "radars", "ships", "tanks", "centers". +-- @param table{string,...} DestroyGroupNames Table of string containing the group names of which the radars are be destroyed. +-- @param string DestroyUnitTypes Table of string containing the type names of the units to achieve mission success. +-- @return DESTROYUNITTYPESTASK +function DESTROYUNITTYPESTASK:New( DestroyGroupType, DestroyUnitType, DestroyGroupNames, DestroyUnitTypes ) + local self = BASE:Inherit( self, DESTROYBASETASK:New( DestroyGroupType, DestroyUnitType, DestroyGroupNames ) ) + self:F( { DestroyGroupType, DestroyUnitType, DestroyGroupNames, DestroyUnitTypes } ) + + if type(DestroyUnitTypes) == 'table' then + self.DestroyUnitTypes = DestroyUnitTypes + else + self.DestroyUnitTypes = { DestroyUnitTypes } + end + + self.Name = 'Destroy Unit Types' + self.GoalVerb = "Destroy " .. DestroyGroupType + + _EVENTDISPATCHER:OnDead( self.EventDead , self ) + + return self +end + +--- Report Goal Progress. +-- @param Group DestroyGroup Group structure describing the group to be evaluated. +-- @param Unit DestroyUnit Unit structure describing the Unit to be evaluated. +function DESTROYUNITTYPESTASK:ReportGoalProgress( DestroyGroup, DestroyUnit ) + self:F( { DestroyGroup, DestroyUnit } ) + + local DestroyCount = 0 + for UnitTypeID, UnitType in pairs( self.DestroyUnitTypes ) do + if DestroyUnit and DestroyUnit:getTypeName() == UnitType then + if DestroyUnit and DestroyUnit:getLife() <= 1.0 then + DestroyCount = DestroyCount + 1 + end + end + end + return DestroyCount +end +--- A PICKUPTASK orchestrates the loading of CARGO at a specific landing zone. +-- @module PICKUPTASK +-- @parent TASK + +Include.File("Task") +Include.File("Cargo") + +--- The PICKUPTASK class +-- @type +PICKUPTASK = { + ClassName = "PICKUPTASK", + TEXT = { "Pick-Up", "picked-up", "loaded" }, + GoalVerb = "Pick-Up" +} + +--- Creates a new PICKUPTASK. +-- @param table{string,...}|string LandingZones Table of Zone names where Cargo is to be loaded. +-- @param CARGO_TYPE CargoType Type of the Cargo. The type must be of the following Enumeration:.. +-- @param number OnBoardSide Reflects from which side the cargo Group will be on-boarded on the Carrier. +function PICKUPTASK:New( CargoType, OnBoardSide ) + local self = BASE:Inherit( self, TASK:New() ) + self:F() + + -- self holds the inherited instance of the PICKUPTASK Class to the BASE class. + + local Valid = true + + if Valid then + self.Name = 'Pickup Cargo' + self.TaskBriefing = "Task: Fly to the indicated landing zones and pickup " .. CargoType .. ". Your co-pilot will provide you with the directions (required flight angle in degrees) and the distance (in km) to the pickup zone." + self.CargoType = CargoType + self.GoalVerb = CargoType .. " " .. self.GoalVerb + self.OnBoardSide = OnBoardSide + self.IsLandingRequired = true -- required to decide whether the client needs to land or not + self.IsSlingLoad = false -- Indicates whether the cargo is a sling load cargo + self.Stages = { STAGE_CARGO_INIT:New(), STAGE_CARGO_LOAD:New(), STAGEBRIEF:New(), STAGESTART:New(), STAGEROUTE:New(), STAGELANDING:New(), STAGELANDED:New(), STAGELOAD:New(), STAGEDONE:New() } + self.SetStage( self, 1 ) + end + + return self +end + +function PICKUPTASK:FromZone( LandingZone ) + self:F() + + self.LandingZones.LandingZoneNames[LandingZone.CargoZoneName] = LandingZone.CargoZoneName + self.LandingZones.LandingZones[LandingZone.CargoZoneName] = LandingZone + + return self +end + +function PICKUPTASK:InitCargo( InitCargos ) + self:F( { InitCargos } ) + + if type( InitCargos ) == "table" then + self.Cargos.InitCargos = InitCargos + else + self.Cargos.InitCargos = { InitCargos } + end + + return self +end + +function PICKUPTASK:LoadCargo( LoadCargos ) + self:F( { LoadCargos } ) + + if type( LoadCargos ) == "table" then + self.Cargos.LoadCargos = LoadCargos + else + self.Cargos.LoadCargos = { LoadCargos } + end + + return self +end + +function PICKUPTASK:AddCargoMenus( Client, Cargos, TransportRadius ) + self:F() + + for CargoID, Cargo in pairs( Cargos ) do + + self:T( { Cargo.ClassName, Cargo.CargoName, Cargo.CargoType, Cargo:IsStatusNone(), Cargo:IsStatusLoaded(), Cargo:IsStatusLoading(), Cargo:IsStatusUnLoaded() } ) + + -- If the Cargo has no status, allow the menu option. + if Cargo:IsStatusNone() or ( Cargo:IsStatusLoading() and Client == Cargo:IsLoadingToClient() ) then + + local MenuAdd = false + if Cargo:IsNear( Client, self.CurrentCargoZone ) then + MenuAdd = true + end + + if MenuAdd then + if Client._Menus[Cargo.CargoType] == nil then + Client._Menus[Cargo.CargoType] = {} + end + + if not Client._Menus[Cargo.CargoType].PickupMenu then + Client._Menus[Cargo.CargoType].PickupMenu = missionCommands.addSubMenuForGroup( + Client:GetClientGroupID(), + self.TEXT[1] .. " " .. Cargo.CargoType, + nil + ) + self:T( 'Added PickupMenu: ' .. self.TEXT[1] .. " " .. Cargo.CargoType ) + end + + if Client._Menus[Cargo.CargoType].PickupSubMenus == nil then + Client._Menus[Cargo.CargoType].PickupSubMenus = {} + end + + Client._Menus[Cargo.CargoType].PickupSubMenus[ #Client._Menus[Cargo.CargoType].PickupSubMenus + 1 ] = missionCommands.addCommandForGroup( + Client:GetClientGroupID(), + Cargo.CargoName .. " ( " .. Cargo.CargoWeight .. "kg )", + Client._Menus[Cargo.CargoType].PickupMenu, + self.MenuAction, + { ReferenceTask = self, CargoTask = Cargo } + ) + self:T( 'Added PickupSubMenu' .. Cargo.CargoType .. ":" .. Cargo.CargoName .. " ( " .. Cargo.CargoWeight .. "kg )" ) + end + end + end + +end + +function PICKUPTASK:RemoveCargoMenus( Client ) + self:F() + + for MenuID, MenuData in pairs( Client._Menus ) do + for SubMenuID, SubMenuData in pairs( MenuData.PickupSubMenus ) do + missionCommands.removeItemForGroup( Client:GetClientGroupID(), SubMenuData ) + self:T( "Removed PickupSubMenu " ) + SubMenuData = nil + end + if MenuData.PickupMenu then + missionCommands.removeItemForGroup( Client:GetClientGroupID(), MenuData.PickupMenu ) + self:T( "Removed PickupMenu " ) + MenuData.PickupMenu = nil + end + end + + for CargoID, Cargo in pairs( CARGOS ) do + self:T( { Cargo.ClassName, Cargo.CargoName, Cargo.CargoType, Cargo:IsStatusNone(), Cargo:IsStatusLoaded(), Cargo:IsStatusLoading(), Cargo:IsStatusUnLoaded() } ) + if Cargo:IsStatusLoading() and Client == Cargo:IsLoadingToClient() then + Cargo:StatusNone() + end + end + +end + + + +function PICKUPTASK:HasFailed( ClientDead ) + self:F() + + local TaskHasFailed = self.TaskFailed + return TaskHasFailed +end + +--- A DEPLOYTASK orchestrates the deployment of CARGO within a specific landing zone. +-- @module DEPLOYTASK + +Include.File( "Task" ) + +--- A DeployTask +-- @type DEPLOYTASK +DEPLOYTASK = { + ClassName = "DEPLOYTASK", + TEXT = { "Deploy", "deployed", "unloaded" }, + GoalVerb = "Deployment" +} + + +--- Creates a new DEPLOYTASK object, which models the sequence of STAGEs to unload a cargo. +-- @function [parent=#DEPLOYTASK] New +-- @param #string CargoType Type of the Cargo. +-- @return #DEPLOYTASK The created DeployTask +function DEPLOYTASK:New( CargoType ) + local self = BASE:Inherit( self, TASK:New() ) + self:F() + + local Valid = true + + if Valid then + self.Name = 'Deploy Cargo' + self.TaskBriefing = "Fly to one of the indicated landing zones and deploy " .. CargoType .. ". Your co-pilot will provide you with the directions (required flight angle in degrees) and the distance (in km) to the deployment zone." + self.CargoType = CargoType + self.GoalVerb = CargoType .. " " .. self.GoalVerb + self.Stages = { STAGE_CARGO_INIT:New(), STAGE_CARGO_LOAD:New(), STAGEBRIEF:New(), STAGESTART:New(), STAGEROUTE:New(), STAGELANDING:New(), STAGELANDED:New(), STAGEUNLOAD:New(), STAGEDONE:New() } + self.SetStage( self, 1 ) + end + + return self +end + +function DEPLOYTASK:ToZone( LandingZone ) + self:F() + + self.LandingZones.LandingZoneNames[LandingZone.CargoZoneName] = LandingZone.CargoZoneName + self.LandingZones.LandingZones[LandingZone.CargoZoneName] = LandingZone + + return self +end + + +function DEPLOYTASK:InitCargo( InitCargos ) + self:F( { InitCargos } ) + + if type( InitCargos ) == "table" then + self.Cargos.InitCargos = InitCargos + else + self.Cargos.InitCargos = { InitCargos } + end + + return self +end + + +function DEPLOYTASK:LoadCargo( LoadCargos ) + self:F( { LoadCargos } ) + + if type( LoadCargos ) == "table" then + self.Cargos.LoadCargos = LoadCargos + else + self.Cargos.LoadCargos = { LoadCargos } + end + + return self +end + + +--- When the cargo is unloaded, it will move to the target zone name. +-- @param string TargetZoneName Name of the Zone to where the Cargo should move after unloading. +function DEPLOYTASK:SetCargoTargetZoneName( TargetZoneName ) + self:F() + + local Valid = true + + Valid = routines.ValidateString( TargetZoneName, "TargetZoneName", Valid ) + + if Valid then + self.TargetZoneName = TargetZoneName + end + + return Valid + +end + +function DEPLOYTASK:AddCargoMenus( Client, Cargos, TransportRadius ) + self:F() + + local ClientGroupID = Client:GetClientGroupID() + + self:T( ClientGroupID ) + + for CargoID, Cargo in pairs( Cargos ) do + + self:T( { Cargo.ClassName, Cargo.CargoName, Cargo.CargoType, Cargo.CargoWeight } ) + + if Cargo:IsStatusLoaded() and Client == Cargo:IsLoadedInClient() then + + if Client._Menus[Cargo.CargoType] == nil then + Client._Menus[Cargo.CargoType] = {} + end + + if not Client._Menus[Cargo.CargoType].DeployMenu then + Client._Menus[Cargo.CargoType].DeployMenu = missionCommands.addSubMenuForGroup( + ClientGroupID, + self.TEXT[1] .. " " .. Cargo.CargoType, + nil + ) + self:T( 'Added DeployMenu ' .. self.TEXT[1] ) + end + + if Client._Menus[Cargo.CargoType].DeploySubMenus == nil then + Client._Menus[Cargo.CargoType].DeploySubMenus = {} + end + + if Client._Menus[Cargo.CargoType].DeployMenu == nil then + self:T( 'deploymenu is nil' ) + end + + Client._Menus[Cargo.CargoType].DeploySubMenus[ #Client._Menus[Cargo.CargoType].DeploySubMenus + 1 ] = missionCommands.addCommandForGroup( + ClientGroupID, + Cargo.CargoName .. " ( " .. Cargo.CargoWeight .. "kg )", + Client._Menus[Cargo.CargoType].DeployMenu, + self.MenuAction, + { ReferenceTask = self, CargoTask = Cargo } + ) + self:T( 'Added DeploySubMenu ' .. Cargo.CargoType .. ":" .. Cargo.CargoName .. " ( " .. Cargo.CargoWeight .. "kg )" ) + end + end + +end + +function DEPLOYTASK:RemoveCargoMenus( Client ) + self:F() + + local ClientGroupID = Client:GetClientGroupID() + self:T( ClientGroupID ) + + for MenuID, MenuData in pairs( Client._Menus ) do + if MenuData.DeploySubMenus ~= nil then + for SubMenuID, SubMenuData in pairs( MenuData.DeploySubMenus ) do + missionCommands.removeItemForGroup( ClientGroupID, SubMenuData ) + self:T( "Removed DeploySubMenu " ) + SubMenuData = nil + end + end + if MenuData.DeployMenu then + missionCommands.removeItemForGroup( ClientGroupID, MenuData.DeployMenu ) + self:T( "Removed DeployMenu " ) + MenuData.DeployMenu = nil + end + end + +end +--- A NOTASK is a dummy activity... But it will show a Mission Briefing... +-- @module NOTASK + +Include.File("Task") + +--- The NOTASK class +-- @type +NOTASK = { + ClassName = "NOTASK", +} + +--- Creates a new NOTASK. +function NOTASK:New() + local self = BASE:Inherit( self, TASK:New() ) + self:F() + + local Valid = true + + if Valid then + self.Name = 'Nothing' + self.TaskBriefing = "Task: Execute your mission." + self.Stages = { STAGEBRIEF:New(), STAGESTART:New(), STAGEDONE:New() } + self.SetStage( self, 1 ) + end + + return self +end +--- A ROUTETASK orchestrates the travel to a specific zone defined within the ME. +-- @module ROUTETASK + +--- The ROUTETASK class +-- @type +ROUTETASK = { + ClassName = "ROUTETASK", + GoalVerb = "Route", +} + +--- Creates a new ROUTETASK. +-- @param table{sring,...}|string LandingZones Table of Zone Names where the target is located. +-- @param string TaskBriefing (optional) Defines a text describing the briefing of the task. +-- @return ROUTETASK +function ROUTETASK:New( LandingZones, TaskBriefing ) + local self = BASE:Inherit( self, TASK:New() ) + self:F( { LandingZones, TaskBriefing } ) + + local Valid = true + + Valid = routines.ValidateZone( LandingZones, "LandingZones", Valid ) + + if Valid then + self.Name = 'Route To Zone' + if TaskBriefing then + self.TaskBriefing = TaskBriefing .. " Your co-pilot will provide you with the directions (required flight angle in degrees) and the distance (in km) to the target objective." + else + self.TaskBriefing = "Task: Fly to specified zone(s). Your co-pilot will provide you with the directions (required flight angle in degrees) and the distance (in km) to the target objective." + end + if type( LandingZones ) == "table" then + self.LandingZones = LandingZones + else + self.LandingZones = { LandingZones } + end + self.Stages = { STAGEBRIEF:New(), STAGESTART:New(), STAGEROUTE:New(), STAGEARRIVE:New(), STAGEDONE:New() } + self.SetStage( self, 1 ) + end + + return self +end + +--- A MISSION is the main owner of a Mission orchestration within MOOSE . The Mission framework orchestrates @{CLIENT}s, @{TASK}s, @{STAGE}s etc. +-- A @{CLIENT} needs to be registered within the @{MISSION} through the function @{AddClient}. A @{TASK} needs to be registered within the @{MISSION} through the function @{AddTask}. +-- @module Mission + +Include.File( "Routines" ) +Include.File( "Base" ) +Include.File( "Client" ) +Include.File( "Task" ) + +--- The MISSION class +-- @type MISSION +-- @extends Base#BASE +-- @field #MISSION.Clients _Clients +-- @field #string MissionBriefing +MISSION = { + ClassName = "MISSION", + Name = "", + MissionStatus = "PENDING", + _Clients = {}, + _Tasks = {}, + _ActiveTasks = {}, + GoalFunction = nil, + MissionReportTrigger = 0, + MissionProgressTrigger = 0, + MissionReportShow = false, + MissionReportFlash = false, + MissionTimeInterval = 0, + MissionCoalition = "", + SUCCESS = 1, + FAILED = 2, + REPEAT = 3, + _GoalTasks = {} +} + +--- @type MISSION.Clients +-- @list + +function MISSION:Meta() + + local self = BASE:Inherit( self, BASE:New() ) + self:F() + + return self +end + +--- This is the main MISSION declaration method. Each Mission is like the master or a Mission orchestration between, Clients, Tasks, Stages etc. +-- @param string MissionName is the name of the mission. This name will be used to reference the status of each mission by the players. +-- @param string MissionPriority is a string indicating the "priority" of the Mission. f.e. "Primary", "Secondary" or "First", "Second". It is free format and up to the Mission designer to choose. There are no rules behind this field. +-- @param string MissionBriefing is a string indicating the mission briefing to be shown when a player joins a @{CLIENT}. +-- @param string MissionCoalition is a string indicating the coalition or party to which this mission belongs to. It is free format and can be chosen freely by the mission designer. Note that this field is not to be confused with the coalition concept of the ME. Examples of a Mission Coalition could be "NATO", "CCCP", "Intruders", "Terrorists"... +-- @return MISSION +-- @usage +-- -- Declare a few missions. +-- local Mission = MISSIONSCHEDULER.AddMission( 'Russia Transport Troops SA-6', 'Operational', 'Transport troops from the control center to one of the SA-6 SAM sites to activate their operation.', 'Russia' ) +-- local Mission = MISSIONSCHEDULER.AddMission( 'Patriots', 'Primary', 'Our intelligence reports that 3 Patriot SAM defense batteries are located near Ruisi, Kvarhiti and Gori.', 'Russia' ) +-- local Mission = MISSIONSCHEDULER.AddMission( 'Package Delivery', 'Operational', 'In order to be in full control of the situation, we need you to deliver a very important package at a secret location. Fly undetected through the NATO defenses and deliver the secret package. The secret agent is located at waypoint 4.', 'Russia' ) +-- local Mission = MISSIONSCHEDULER.AddMission( 'Rescue General', 'Tactical', 'Our intelligence has received a remote signal behind Gori. We believe it is a very important Russian General that was captured by Georgia. Go out there and rescue him! Ensure you stay out of the battle zone, keep south. Waypoint 4 is the location of our Russian General.', 'Russia' ) +-- local Mission = MISSIONSCHEDULER.AddMission( 'NATO Transport Troops', 'Operational', 'Transport 3 groups of air defense engineers from our barracks "Gold" and "Titan" to each patriot battery control center to activate our air defenses.', 'NATO' ) +-- local Mission = MISSIONSCHEDULER.AddMission( 'SA-6 SAMs', 'Primary', 'Our intelligence reports that 3 SA-6 SAM defense batteries are located near Didmukha, Khetagurov and Berula. Eliminate the Russian SAMs.', 'NATO' ) +-- local Mission = MISSIONSCHEDULER.AddMission( 'NATO Sling Load', 'Operational', 'Fly to the cargo pickup zone at Dzegvi or Kaspi, and sling the cargo to Soganlug airbase.', 'NATO' ) +-- local Mission = MISSIONSCHEDULER.AddMission( 'Rescue secret agent', 'Tactical', 'In order to be in full control of the situation, we need you to rescue a secret agent from the woods behind enemy lines. Avoid the Russian defenses and rescue the agent. Keep south until Khasuri, and keep your eyes open for any SAM presence. The agent is located at waypoint 4 on your kneeboard.', 'NATO' ) +function MISSION:New( MissionName, MissionPriority, MissionBriefing, MissionCoalition ) + + self = MISSION:Meta() + self:T({ MissionName, MissionPriority, MissionBriefing, MissionCoalition }) + + local Valid = true + + Valid = routines.ValidateString( MissionName, "MissionName", Valid ) + Valid = routines.ValidateString( MissionPriority, "MissionPriority", Valid ) + Valid = routines.ValidateString( MissionBriefing, "MissionBriefing", Valid ) + Valid = routines.ValidateString( MissionCoalition, "MissionCoalition", Valid ) + + if Valid then + self.Name = MissionName + self.MissionPriority = MissionPriority + self.MissionBriefing = MissionBriefing + self.MissionCoalition = MissionCoalition + end + + return self +end + +--- Returns if a Mission has completed. +-- @return bool +function MISSION:IsCompleted() + self:F() + return self.MissionStatus == "ACCOMPLISHED" +end + +--- Set a Mission to completed. +function MISSION:Completed() + self:F() + self.MissionStatus = "ACCOMPLISHED" + self:StatusToClients() +end + +--- Returns if a Mission is ongoing. +-- treturn bool +function MISSION:IsOngoing() + self:F() + return self.MissionStatus == "ONGOING" +end + +--- Set a Mission to ongoing. +function MISSION:Ongoing() + self:F() + self.MissionStatus = "ONGOING" + --self:StatusToClients() +end + +--- Returns if a Mission is pending. +-- treturn bool +function MISSION:IsPending() + self:F() + return self.MissionStatus == "PENDING" +end + +--- Set a Mission to pending. +function MISSION:Pending() + self:F() + self.MissionStatus = "PENDING" + self:StatusToClients() +end + +--- Returns if a Mission has failed. +-- treturn bool +function MISSION:IsFailed() + self:F() + return self.MissionStatus == "FAILED" +end + +--- Set a Mission to failed. +function MISSION:Failed() + self:F() + self.MissionStatus = "FAILED" + self:StatusToClients() +end + +--- Send the status of the MISSION to all Clients. +function MISSION:StatusToClients() + self:F() + if self.MissionReportFlash then + for ClientID, Client in pairs( self._Clients ) do + Client:Message( self.MissionCoalition .. ' "' .. self.Name .. '": ' .. self.MissionStatus .. '! ( ' .. self.MissionPriority .. ' mission ) ', 10, self.Name .. '/Status', "Mission Command: Mission Status") + end + end +end + +--- Handles the reporting. After certain time intervals, a MISSION report MESSAGE will be shown to All Players. +function MISSION:ReportTrigger() + self:F() + + if self.MissionReportShow == true then + self.MissionReportShow = false + return true + else + if self.MissionReportFlash == true then + if timer.getTime() >= self.MissionReportTrigger then + self.MissionReportTrigger = timer.getTime() + self.MissionTimeInterval + return true + else + return false + end + else + return false + end + end +end + +--- Report the status of all MISSIONs to all active Clients. +function MISSION:ReportToAll() + self:F() + + local AlivePlayers = '' + for ClientID, Client in pairs( self._Clients ) do + if Client:GetDCSGroup() then + if Client:GetClientGroupDCSUnit() then + if Client:GetClientGroupDCSUnit():getLife() > 0.0 then + if AlivePlayers == '' then + AlivePlayers = ' Players: ' .. Client:GetClientGroupDCSUnit():getPlayerName() + else + AlivePlayers = AlivePlayers .. ' / ' .. Client:GetClientGroupDCSUnit():getPlayerName() + end + end + end + end + end + local Tasks = self:GetTasks() + local TaskText = "" + for TaskID, TaskData in pairs( Tasks ) do + TaskText = TaskText .. " - Task " .. TaskID .. ": " .. TaskData.Name .. ": " .. TaskData:GetGoalProgress() .. "\n" + end + MESSAGE:New( self.MissionCoalition .. ' "' .. self.Name .. '": ' .. self.MissionStatus .. ' ( ' .. self.MissionPriority .. ' mission )' .. AlivePlayers .. "\n" .. TaskText:gsub("\n$",""), "Mission Command: Mission Report", 10, self.Name .. '/Status'):ToAll() +end + + +--- Add a goal function to a MISSION. Goal functions are called when a @{TASK} within a mission has been completed. +-- @param function GoalFunction is the function defined by the mission designer to evaluate whether a certain goal has been reached after a @{TASK} finishes within the @{MISSION}. A GoalFunction must accept 2 parameters: Mission, Client, which contains the current MISSION object and the current CLIENT object respectively. +-- @usage +-- PatriotActivation = { +-- { "US SAM Patriot Zerti", false }, +-- { "US SAM Patriot Zegduleti", false }, +-- { "US SAM Patriot Gvleti", false } +-- } +-- +-- function DeployPatriotTroopsGoal( Mission, Client ) +-- +-- +-- -- Check if the cargo is all deployed for mission success. +-- for CargoID, CargoData in pairs( Mission._Cargos ) do +-- if Group.getByName( CargoData.CargoGroupName ) then +-- CargoGroup = Group.getByName( CargoData.CargoGroupName ) +-- if CargoGroup then +-- -- Check if the cargo is ready to activate +-- CurrentLandingZoneID = routines.IsUnitInZones( CargoGroup:getUnits()[1], Mission:GetTask( 2 ).LandingZones ) -- The second task is the Deploytask to measure mission success upon +-- if CurrentLandingZoneID then +-- if PatriotActivation[CurrentLandingZoneID][2] == false then +-- -- Now check if this is a new Mission Task to be completed... +-- trigger.action.setGroupAIOn( Group.getByName( PatriotActivation[CurrentLandingZoneID][1] ) ) +-- PatriotActivation[CurrentLandingZoneID][2] = true +-- MessageToBlue( "Mission Command: Message to all airborne units! The " .. PatriotActivation[CurrentLandingZoneID][1] .. " is armed. Our air defenses are now stronger.", 60, "BLUE/PatriotDefense" ) +-- MessageToRed( "Mission Command: Our satellite systems are detecting additional NATO air defenses. To all airborne units: Take care!!!", 60, "RED/PatriotDefense" ) +-- Mission:GetTask( 2 ):AddGoalCompletion( "Patriots activated", PatriotActivation[CurrentLandingZoneID][1], 1 ) -- Register Patriot activation as part of mission goal. +-- end +-- end +-- end +-- end +-- end +-- end +-- +-- local Mission = MISSIONSCHEDULER.AddMission( 'NATO Transport Troops', 'Operational', 'Transport 3 groups of air defense engineers from our barracks "Gold" and "Titan" to each patriot battery control center to activate our air defenses.', 'NATO' ) +-- Mission:AddGoalFunction( DeployPatriotTroopsGoal ) +function MISSION:AddGoalFunction( GoalFunction ) + self:F() + self.GoalFunction = GoalFunction +end + +--- Register a new @{CLIENT} to participate within the mission. +-- @param CLIENT Client is the @{CLIENT} object. The object must have been instantiated with @{CLIENT:New}. +-- @return CLIENT +-- @usage +-- Add a number of Client objects to the Mission. +-- Mission:AddClient( CLIENT:FindByName( 'US UH-1H*HOT-Deploy Troops 1', 'Transport 3 groups of air defense engineers from our barracks "Gold" and "Titan" to each patriot battery control center to activate our air defenses.' ):Transport() ) +-- Mission:AddClient( CLIENT:FindByName( 'US UH-1H*RAMP-Deploy Troops 3', 'Transport 3 groups of air defense engineers from our barracks "Gold" and "Titan" to each patriot battery control center to activate our air defenses.' ):Transport() ) +-- Mission:AddClient( CLIENT:FindByName( 'US UH-1H*HOT-Deploy Troops 2', 'Transport 3 groups of air defense engineers from our barracks "Gold" and "Titan" to each patriot battery control center to activate our air defenses.' ):Transport() ) +-- Mission:AddClient( CLIENT:FindByName( 'US UH-1H*RAMP-Deploy Troops 4', 'Transport 3 groups of air defense engineers from our barracks "Gold" and "Titan" to each patriot battery control center to activate our air defenses.' ):Transport() ) +function MISSION:AddClient( Client ) + self:F( { Client } ) + + local Valid = true + + if Valid then + self._Clients[Client.ClientName] = Client + end + + return Client +end + +--- Find a @{CLIENT} object within the @{MISSION} by its ClientName. +-- @param CLIENT ClientName is a string defining the Client Group as defined within the ME. +-- @return CLIENT +-- @usage +-- -- Seach for Client "Bomber" within the Mission. +-- local BomberClient = Mission:FindClient( "Bomber" ) +function MISSION:FindClient( ClientName ) + self:F( { self._Clients[ClientName] } ) + return self._Clients[ClientName] +end + + +--- Register a @{TASK} to be completed within the @{MISSION}. Note that there can be multiple @{TASK}s registered to be completed. Each TASK can be set a certain Goal. The MISSION will not be completed until all Goals are reached. +-- @param TASK Task is the @{TASK} object. The object must have been instantiated with @{TASK:New} or any of its inherited @{TASK}s. +-- @param number TaskNumber is the sequence number of the TASK within the MISSION. This number does have to be chronological. +-- @return TASK +-- @usage +-- -- Define a few tasks for the Mission. +-- PickupZones = { "NATO Gold Pickup Zone", "NATO Titan Pickup Zone" } +-- PickupSignalUnits = { "NATO Gold Coordination Center", "NATO Titan Coordination Center" } +-- +-- -- Assign the Pickup Task +-- local PickupTask = PICKUPTASK:New( PickupZones, CARGO_TYPE.ENGINEERS, CLIENT.ONBOARDSIDE.LEFT ) +-- PickupTask:AddSmokeBlue( PickupSignalUnits ) +-- PickupTask:SetGoalTotal( 3 ) +-- Mission:AddTask( PickupTask, 1 ) +-- +-- -- Assign the Deploy Task +-- local PatriotActivationZones = { "US Patriot Battery 1 Activation", "US Patriot Battery 2 Activation", "US Patriot Battery 3 Activation" } +-- local PatriotActivationZonesSmokeUnits = { "US SAM Patriot - Battery 1 Control", "US SAM Patriot - Battery 2 Control", "US SAM Patriot - Battery 3 Control" } +-- local DeployTask = DEPLOYTASK:New( PatriotActivationZones, CARGO_TYPE.ENGINEERS ) +-- --DeployTask:SetCargoTargetZoneName( 'US Troops Attack ' .. math.random(2) ) +-- DeployTask:AddSmokeBlue( PatriotActivationZonesSmokeUnits ) +-- DeployTask:SetGoalTotal( 3 ) +-- DeployTask:SetGoalTotal( 3, "Patriots activated" ) +-- Mission:AddTask( DeployTask, 2 ) + +function MISSION:AddTask( Task, TaskNumber ) + self:F() + + self._Tasks[TaskNumber] = Task + self._Tasks[TaskNumber]:EnableEvents() + self._Tasks[TaskNumber].ID = TaskNumber + + return Task + end + +--- Get the TASK idenified by the TaskNumber from the Mission. This function is useful in GoalFunctions. +-- @param number TaskNumber is the number of the @{TASK} within the @{MISSION}. +-- @return TASK +-- @usage +-- -- Get Task 2 from the Mission. +-- Task2 = Mission:GetTask( 2 ) + +function MISSION:GetTask( TaskNumber ) + self:F() + + local Valid = true + + local Task = nil + + if type(TaskNumber) ~= "number" then + Valid = false + end + + if Valid then + Task = self._Tasks[TaskNumber] + end + + return Task +end + +--- Get all the TASKs from the Mission. This function is useful in GoalFunctions. +-- @return {TASK,...} Structure of TASKS with the @{TASK} number as the key. +-- @usage +-- -- Get Tasks from the Mission. +-- Tasks = Mission:GetTasks() +-- env.info( "Task 2 Completion = " .. Tasks[2]:GetGoalPercentage() .. "%" ) +function MISSION:GetTasks() + self:F() + + return self._Tasks +end + + +--[[ + _TransportExecuteStage: Defines the different stages of Transport unload/load execution. This table is internal and is used to control the validity of Transport load/unload timing. + + - _TransportExecuteStage.EXECUTING + - _TransportExecuteStage.SUCCESS + - _TransportExecuteStage.FAILED + +--]] +_TransportExecuteStage = { + NONE = 0, + EXECUTING = 1, + SUCCESS = 2, + FAILED = 3 +} + + +--- The MISSIONSCHEDULER is an OBJECT and is the main scheduler of ALL active MISSIONs registered within this scheduler. It's workings are considered internal and is automatically created when the Mission.lua file is included. +-- @type MISSIONSCHEDULER +-- @field #MISSIONSCHEDULER.MISSIONS Missions +MISSIONSCHEDULER = { + Missions = {}, + MissionCount = 0, + TimeIntervalCount = 0, + TimeIntervalShow = 150, + TimeSeconds = 14400, + TimeShow = 5 +} + +--- @type MISSIONSCHEDULER.MISSIONS +-- @list <#MISSION> Mission + +--- This is the main MISSIONSCHEDULER Scheduler function. It is considered internal and is automatically created when the Mission.lua file is included. +function MISSIONSCHEDULER.Scheduler() + + + -- loop through the missions in the TransportTasks + for MissionName, MissionData in pairs( MISSIONSCHEDULER.Missions ) do + + local Mission = MissionData -- #MISSION + + if not Mission:IsCompleted() then + + -- This flag will monitor if for this mission, there are clients alive. If this flag is still false at the end of the loop, the mission status will be set to Pending (if not Failed or Completed). + local ClientsAlive = false + + for ClientID, ClientData in pairs( Mission._Clients ) do + + local Client = ClientData -- Client#CLIENT + + if Client:IsAlive() then + + -- There is at least one Client that is alive... So the Mission status is set to Ongoing. + ClientsAlive = true + + -- If this Client was not registered as Alive before: + -- 1. We register the Client as Alive. + -- 2. We initialize the Client Tasks and make a link to the original Mission Task. + -- 3. We initialize the Cargos. + -- 4. We flag the Mission as Ongoing. + if not Client.ClientAlive then + Client.ClientAlive = true + Client.ClientBriefingShown = false + for TaskNumber, Task in pairs( Mission._Tasks ) do + -- Note that this a deepCopy. Each client must have their own Tasks with own Stages!!! + Client._Tasks[TaskNumber] = routines.utils.deepCopy( Mission._Tasks[TaskNumber] ) + -- Each MissionTask must point to the original Mission. + Client._Tasks[TaskNumber].MissionTask = Mission._Tasks[TaskNumber] + Client._Tasks[TaskNumber].Cargos = Mission._Tasks[TaskNumber].Cargos + Client._Tasks[TaskNumber].LandingZones = Mission._Tasks[TaskNumber].LandingZones + end + + Mission:Ongoing() + end + + + -- For each Client, check for each Task the state and evolve the mission. + -- This flag will indicate if the Task of the Client is Complete. + local TaskComplete = false + + for TaskNumber, Task in pairs( Client._Tasks ) do + + if not Task.Stage then + Task:SetStage( 1 ) + end + + + local TransportTime = timer.getTime() + + if not Task:IsDone() then + + if Task:Goal() then + Task:ShowGoalProgress( Mission, Client ) + end + + --env.info( 'Scheduler: Mission = ' .. Mission.Name .. ' / Client = ' .. Client.ClientName .. ' / Task = ' .. Task.Name .. ' / Stage = ' .. Task.ActiveStage .. ' - ' .. Task.Stage.Name .. ' - ' .. Task.Stage.StageType ) + + -- Action + if Task:StageExecute() then + Task.Stage:Execute( Mission, Client, Task ) + end + + -- Wait until execution is finished + if Task.ExecuteStage == _TransportExecuteStage.EXECUTING then + Task.Stage:Executing( Mission, Client, Task ) + end + + -- Validate completion or reverse to earlier stage + if Task.Time + Task.Stage.WaitTime <= TransportTime then + Task:SetStage( Task.Stage:Validate( Mission, Client, Task ) ) + end + + if Task:IsDone() then + --env.info( 'Scheduler: Mission '.. Mission.Name .. ' Task ' .. Task.Name .. ' Stage ' .. Task.Stage.Name .. ' done. TaskComplete = ' .. string.format ( "%s", TaskComplete and "true" or "false" ) ) + TaskComplete = true -- when a task is not yet completed, a mission cannot be completed + + else + -- break only if this task is not yet done, so that future task are not yet activated. + TaskComplete = false -- when a task is not yet completed, a mission cannot be completed + --env.info( 'Scheduler: Mission "'.. Mission.Name .. '" Task "' .. Task.Name .. '" Stage "' .. Task.Stage.Name .. '" break. TaskComplete = ' .. string.format ( "%s", TaskComplete and "true" or "false" ) ) + break + end + + if TaskComplete then + + if Mission.GoalFunction ~= nil then + Mission.GoalFunction( Mission, Client ) + end + if MISSIONSCHEDULER.Scoring then + MISSIONSCHEDULER.Scoring:_AddMissionTaskScore( Client:GetClientGroupDCSUnit(), Mission.Name, 25 ) + end + +-- if not Mission:IsCompleted() then +-- end + end + end + end + + local MissionComplete = true + for TaskNumber, Task in pairs( Mission._Tasks ) do + if Task:Goal() then +-- Task:ShowGoalProgress( Mission, Client ) + if Task:IsGoalReached() then + else + MissionComplete = false + end + else + MissionComplete = false -- If there is no goal, the mission should never be ended. The goal status will be set somewhere else. + end + end + + if MissionComplete then + Mission:Completed() + if MISSIONSCHEDULER.Scoring then + MISSIONSCHEDULER.Scoring:_AddMissionScore( Mission.Name, 100 ) + end + else + if TaskComplete then + -- Reset for new tasking of active client + Client.ClientAlive = false -- Reset the client tasks. + end + end + + + else + if Client.ClientAlive then + env.info( 'Scheduler: Client "' .. Client.ClientName .. '" is inactive.' ) + Client.ClientAlive = false + + -- This is tricky. If we sanitize Client._Tasks before sanitizing Client._Tasks[TaskNumber].MissionTask, then the original MissionTask will be sanitized, and will be lost within the garbage collector. + -- So first sanitize Client._Tasks[TaskNumber].MissionTask, after that, sanitize only the whole _Tasks structure... + --Client._Tasks[TaskNumber].MissionTask = nil + --Client._Tasks = nil + end + end + end + + -- If all Clients of this Mission are not activated, then the Mission status needs to be put back into Pending status. + -- But only if the Mission was Ongoing. In case the Mission is Completed or Failed, the Mission status may not be changed. In these cases, this will be the last run of this Mission in the Scheduler. + if ClientsAlive == false then + if Mission:IsOngoing() then + -- Mission status back to pending... + Mission:Pending() + end + end + end + + Mission:StatusToClients() + + if Mission:ReportTrigger() then + Mission:ReportToAll() + end + end + + return true +end + +--- Start the MISSIONSCHEDULER. +function MISSIONSCHEDULER.Start() + if MISSIONSCHEDULER ~= nil then + --MISSIONSCHEDULER.SchedulerId = routines.scheduleFunction( MISSIONSCHEDULER.Scheduler, { }, 0, 2 ) + MISSIONSCHEDULER.SchedulerId = SCHEDULER:New( nil, MISSIONSCHEDULER.Scheduler, { }, 0, 2 ) + end +end + +--- Stop the MISSIONSCHEDULER. +function MISSIONSCHEDULER.Stop() + if MISSIONSCHEDULER.SchedulerId then + routines.removeFunction(MISSIONSCHEDULER.SchedulerId) + MISSIONSCHEDULER.SchedulerId = nil + end +end + +--- This is the main MISSION declaration method. Each Mission is like the master or a Mission orchestration between, Clients, Tasks, Stages etc. +-- @param Mission is the MISSION object instantiated by @{MISSION:New}. +-- @return MISSION +-- @usage +-- -- Declare a mission. +-- Mission = MISSION:New( 'Russia Transport Troops SA-6', +-- 'Operational', +-- 'Transport troops from the control center to one of the SA-6 SAM sites to activate their operation.', +-- 'Russia' ) +-- MISSIONSCHEDULER:AddMission( Mission ) +function MISSIONSCHEDULER.AddMission( Mission ) + MISSIONSCHEDULER.Missions[Mission.Name] = Mission + MISSIONSCHEDULER.MissionCount = MISSIONSCHEDULER.MissionCount + 1 + -- Add an overall AI Client for the AI tasks... This AI Client will facilitate the Events in the background for each Task. + --MissionAdd:AddClient( CLIENT:Register( 'AI' ) ) + + return Mission +end + +--- Remove a MISSION from the MISSIONSCHEDULER. +-- @param MissionName is the name of the MISSION given at declaration using @{AddMission}. +-- @usage +-- -- Declare a mission. +-- Mission = MISSION:New( 'Russia Transport Troops SA-6', +-- 'Operational', +-- 'Transport troops from the control center to one of the SA-6 SAM sites to activate their operation.', +-- 'Russia' ) +-- MISSIONSCHEDULER:AddMission( Mission ) +-- +-- -- Now remove the Mission. +-- MISSIONSCHEDULER:RemoveMission( 'Russia Transport Troops SA-6' ) +function MISSIONSCHEDULER.RemoveMission( MissionName ) + MISSIONSCHEDULER.Missions[MissionName] = nil + MISSIONSCHEDULER.MissionCount = MISSIONSCHEDULER.MissionCount - 1 +end + +--- Find a MISSION within the MISSIONSCHEDULER. +-- @param MissionName is the name of the MISSION given at declaration using @{AddMission}. +-- @return MISSION +-- @usage +-- -- Declare a mission. +-- Mission = MISSION:New( 'Russia Transport Troops SA-6', +-- 'Operational', +-- 'Transport troops from the control center to one of the SA-6 SAM sites to activate their operation.', +-- 'Russia' ) +-- MISSIONSCHEDULER:AddMission( Mission ) +-- +-- -- Now find the Mission. +-- MissionFind = MISSIONSCHEDULER:FindMission( 'Russia Transport Troops SA-6' ) +function MISSIONSCHEDULER.FindMission( MissionName ) + return MISSIONSCHEDULER.Missions[MissionName] +end + +-- Internal function used by the MISSIONSCHEDULER menu. +function MISSIONSCHEDULER.ReportMissionsShow( ) + for MissionName, Mission in pairs( MISSIONSCHEDULER.Missions ) do + Mission.MissionReportShow = true + Mission.MissionReportFlash = false + end +end + +-- Internal function used by the MISSIONSCHEDULER menu. +function MISSIONSCHEDULER.ReportMissionsFlash( TimeInterval ) + local Count = 0 + for MissionName, Mission in pairs( MISSIONSCHEDULER.Missions ) do + Mission.MissionReportShow = false + Mission.MissionReportFlash = true + Mission.MissionReportTrigger = timer.getTime() + Count * TimeInterval + Mission.MissionTimeInterval = MISSIONSCHEDULER.MissionCount * TimeInterval + env.info( "TimeInterval = " .. Mission.MissionTimeInterval ) + Count = Count + 1 + end +end + +-- Internal function used by the MISSIONSCHEDULER menu. +function MISSIONSCHEDULER.ReportMissionsHide( Prm ) + for MissionName, Mission in pairs( MISSIONSCHEDULER.Missions ) do + Mission.MissionReportShow = false + Mission.MissionReportFlash = false + end +end + +--- Enables a MENU option in the communications menu under F10 to control the status of the active missions. +-- This function should be called only once when starting the MISSIONSCHEDULER. +function MISSIONSCHEDULER.ReportMenu() + local ReportMenu = SUBMENU:New( 'Status' ) + local ReportMenuShow = COMMANDMENU:New( 'Show Report Missions', ReportMenu, MISSIONSCHEDULER.ReportMissionsShow, 0 ) + local ReportMenuFlash = COMMANDMENU:New('Flash Report Missions', ReportMenu, MISSIONSCHEDULER.ReportMissionsFlash, 120 ) + local ReportMenuHide = COMMANDMENU:New( 'Hide Report Missions', ReportMenu, MISSIONSCHEDULER.ReportMissionsHide, 0 ) +end + +--- Show the remaining mission time. +function MISSIONSCHEDULER:TimeShow() + self.TimeIntervalCount = self.TimeIntervalCount + 1 + if self.TimeIntervalCount >= self.TimeTriggerShow then + local TimeMsg = string.format("%00d", ( self.TimeSeconds / 60 ) - ( timer.getTime() / 60 )) .. ' minutes left until mission reload.' + MESSAGE:New( TimeMsg, "Mission time", self.TimeShow, '/TimeMsg' ):ToAll() + self.TimeIntervalCount = 0 + end +end + +function MISSIONSCHEDULER:Time( TimeSeconds, TimeIntervalShow, TimeShow ) + + self.TimeIntervalCount = 0 + self.TimeSeconds = TimeSeconds + self.TimeIntervalShow = TimeIntervalShow + self.TimeShow = TimeShow +end + +--- Adds a mission scoring to the game. +function MISSIONSCHEDULER:Scoring( Scoring ) + + self.Scoring = Scoring +end + +--- The CLEANUP class keeps an area clean of crashing or colliding airplanes. It also prevents airplanes from firing within this area. +-- @module CleanUp +-- @author Flightcontrol + +Include.File( "Routines" ) +Include.File( "Base" ) +Include.File( "Mission" ) +Include.File( "Client" ) +Include.File( "Task" ) + +--- The CLEANUP class. +-- @type CLEANUP +-- @extends Base#BASE +CLEANUP = { + ClassName = "CLEANUP", + ZoneNames = {}, + TimeInterval = 300, + CleanUpList = {}, +} + +--- Creates the main object which is handling the cleaning of the debris within the given Zone Names. +-- @param #CLEANUP self +-- @param #table ZoneNames Is a table of zone names where the debris should be cleaned. Also a single string can be passed with one zone name. +-- @param #number TimeInterval The interval in seconds when the clean activity takes place. The default is 300 seconds, thus every 5 minutes. +-- @return #CLEANUP +-- @usage +-- -- Clean these Zones. +-- CleanUpAirports = CLEANUP:New( { 'CLEAN Tbilisi', 'CLEAN Kutaisi' }, 150 ) +-- or +-- CleanUpTbilisi = CLEANUP:New( 'CLEAN Tbilisi', 150 ) +-- CleanUpKutaisi = CLEANUP:New( 'CLEAN Kutaisi', 600 ) +function CLEANUP:New( ZoneNames, TimeInterval ) local self = BASE:Inherit( self, BASE:New() ) + self:F( { ZoneNames, TimeInterval } ) + + if type( ZoneNames ) == 'table' then + self.ZoneNames = ZoneNames + else + self.ZoneNames = { ZoneNames } + end + if TimeInterval then + self.TimeInterval = TimeInterval + end + + _EVENTDISPATCHER:OnBirth( self._OnEventBirth, self ) + + --self.CleanUpScheduler = routines.scheduleFunction( self._CleanUpScheduler, { self }, timer.getTime() + 1, TimeInterval ) + self.CleanUpScheduler = SCHEDULER:New( self, self._CleanUpScheduler, {}, 1, TimeInterval ) + + return self +end + + +--- Destroys a group from the simulator, but checks first if it is still existing! +-- @param #CLEANUP self +-- @param DCSGroup#Group GroupObject The object to be destroyed. +-- @param #string CleanUpGroupName The groupname... +function CLEANUP:_DestroyGroup( GroupObject, CleanUpGroupName ) + self:F( { GroupObject, CleanUpGroupName } ) + + if GroupObject then -- and GroupObject:isExist() then + --MESSAGE:New( "Destroy Group " .. CleanUpGroupName, CleanUpGroupName, 1, CleanUpGroupName ):ToAll() + trigger.action.deactivateGroup(GroupObject) + self:T( { "GroupObject Destroyed", GroupObject } ) + end +end + +--- Destroys a @{DCSUnit#Unit} from the simulator, but checks first if it is still existing! +-- @param #CLEANUP self +-- @param DCSUnit#Unit CleanUpUnit The object to be destroyed. +-- @param #string CleanUpUnitName The Unit name ... +function CLEANUP:_DestroyUnit( CleanUpUnit, CleanUpUnitName ) + self:F( { CleanUpUnit, CleanUpUnitName } ) + + if CleanUpUnit then + --MESSAGE:New( "Destroy " .. CleanUpUnitName, CleanUpUnitName, 1, CleanUpUnitName ):ToAll() + local CleanUpGroup = Unit.getGroup(CleanUpUnit) + -- TODO Client bug in 1.5.3 + if CleanUpGroup and CleanUpGroup:isExist() then + local CleanUpGroupUnits = CleanUpGroup:getUnits() + if #CleanUpGroupUnits == 1 then + local CleanUpGroupName = CleanUpGroup:getName() + --self:CreateEventCrash( timer.getTime(), CleanUpUnit ) + CleanUpGroup:destroy() + self:T( { "Destroyed Group:", CleanUpGroupName } ) + else + CleanUpUnit:destroy() + self:T( { "Destroyed Unit:", CleanUpUnitName } ) + end + self.CleanUpList[CleanUpUnitName] = nil -- Cleaning from the list + CleanUpUnit = nil + end + end +end + +-- TODO check DCSTypes#Weapon +--- Destroys a missile from the simulator, but checks first if it is still existing! +-- @param #CLEANUP self +-- @param DCSTypes#Weapon MissileObject +function CLEANUP:_DestroyMissile( MissileObject ) + self:F( { MissileObject } ) + + if MissileObject and MissileObject:isExist() then + MissileObject:destroy() + self:T( "MissileObject Destroyed") + end +end + +function CLEANUP:_OnEventBirth( Event ) + self:F( { Event } ) + + self.CleanUpList[Event.IniDCSUnitName] = {} + self.CleanUpList[Event.IniDCSUnitName].CleanUpUnit = Event.IniDCSUnit + self.CleanUpList[Event.IniDCSUnitName].CleanUpGroup = Event.IniDCSGroup + self.CleanUpList[Event.IniDCSUnitName].CleanUpGroupName = Event.IniDCSGroupName + self.CleanUpList[Event.IniDCSUnitName].CleanUpUnitName = Event.IniDCSUnitName + + _EVENTDISPATCHER:OnEngineShutDownForUnit( Event.IniDCSUnitName, self._EventAddForCleanUp, self ) + _EVENTDISPATCHER:OnEngineStartUpForUnit( Event.IniDCSUnitName, self._EventAddForCleanUp, self ) + _EVENTDISPATCHER:OnHitForUnit( Event.IniDCSUnitName, self._EventAddForCleanUp, self ) + _EVENTDISPATCHER:OnPilotDeadForUnit( Event.IniDCSUnitName, self._EventCrash, self ) + _EVENTDISPATCHER:OnDeadForUnit( Event.IniDCSUnitName, self._EventCrash, self ) + _EVENTDISPATCHER:OnCrashForUnit( Event.IniDCSUnitName, self._EventCrash, self ) + _EVENTDISPATCHER:OnShotForUnit( Event.IniDCSUnitName, self._EventShot, self ) + + --self:AddEvent( world.event.S_EVENT_ENGINE_SHUTDOWN, self._EventAddForCleanUp ) + --self:AddEvent( world.event.S_EVENT_ENGINE_STARTUP, self._EventAddForCleanUp ) +-- self:AddEvent( world.event.S_EVENT_HIT, self._EventAddForCleanUp ) -- , self._EventHitCleanUp ) +-- self:AddEvent( world.event.S_EVENT_CRASH, self._EventCrash ) -- , self._EventHitCleanUp ) +-- --self:AddEvent( world.event.S_EVENT_DEAD, self._EventCrash ) +-- self:AddEvent( world.event.S_EVENT_SHOT, self._EventShot ) +-- +-- self:EnableEvents() + + +end + +--- Detects if a crash event occurs. +-- Crashed units go into a CleanUpList for removal. +-- @param #CLEANUP self +-- @param DCSTypes#Event event +function CLEANUP:_EventCrash( Event ) + self:F( { Event } ) + + --TODO: This stuff is not working due to a DCS bug. Burning units cannot be destroyed. + --MESSAGE:New( "Crash ", "Crash", 10, "Crash" ):ToAll() + -- self:T("before getGroup") + -- local _grp = Unit.getGroup(event.initiator)-- Identify the group that fired + -- self:T("after getGroup") + -- _grp:destroy() + -- self:T("after deactivateGroup") + -- event.initiator:destroy() + + self.CleanUpList[Event.IniDCSUnitName] = {} + self.CleanUpList[Event.IniDCSUnitName].CleanUpUnit = Event.IniDCSUnit + self.CleanUpList[Event.IniDCSUnitName].CleanUpGroup = Event.IniDCSGroup + self.CleanUpList[Event.IniDCSUnitName].CleanUpGroupName = Event.IniDCSGroupName + self.CleanUpList[Event.IniDCSUnitName].CleanUpUnitName = Event.IniDCSUnitName + +end + +--- Detects if a unit shoots a missile. +-- If this occurs within one of the zones, then the weapon used must be destroyed. +-- @param #CLEANUP self +-- @param DCSTypes#Event event +function CLEANUP:_EventShot( Event ) + self:F( { Event } ) + + -- Test if the missile was fired within one of the CLEANUP.ZoneNames. + local CurrentLandingZoneID = 0 + CurrentLandingZoneID = routines.IsUnitInZones( Event.IniDCSUnit, self.ZoneNames ) + if ( CurrentLandingZoneID ) then + -- Okay, the missile was fired within the CLEANUP.ZoneNames, destroy the fired weapon. + --_SEADmissile:destroy() + --routines.scheduleFunction( CLEANUP._DestroyMissile, { self, Event.Weapon }, timer.getTime() + 0.1) + SCHEDULER:New( self, CLEANUP._DestroyMissile, { Event.Weapon }, 0.1 ) + end +end + + +--- Detects if the Unit has an S_EVENT_HIT within the given ZoneNames. If this is the case, destroy the unit. +-- @param #CLEANUP self +-- @param DCSTypes#Event event +function CLEANUP:_EventHitCleanUp( Event ) + self:F( { Event } ) + + if Event.IniDCSUnit then + if routines.IsUnitInZones( Event.IniDCSUnit, self.ZoneNames ) ~= nil then + self:T( { "Life: ", Event.IniDCSUnitName, ' = ', Event.IniDCSUnit:getLife(), "/", Event.IniDCSUnit:getLife0() } ) + if Event.IniDCSUnit:getLife() < Event.IniDCSUnit:getLife0() then + self:T( "CleanUp: Destroy: " .. Event.IniDCSUnitName ) + --routines.scheduleFunction( CLEANUP._DestroyUnit, { self, Event.IniDCSUnit }, timer.getTime() + 0.1) + SCHEDULER:New( self, CLEANUP._DestroyUnit, { Event.IniDCSUnit }, 0.1 ) + end + end + end + + if Event.TgtDCSUnit then + if routines.IsUnitInZones( Event.TgtDCSUnit, self.ZoneNames ) ~= nil then + self:T( { "Life: ", Event.TgtDCSUnitName, ' = ', Event.TgtDCSUnit:getLife(), "/", Event.TgtDCSUnit:getLife0() } ) + if Event.TgtDCSUnit:getLife() < Event.TgtDCSUnit:getLife0() then + self:T( "CleanUp: Destroy: " .. Event.TgtDCSUnitName ) + --routines.scheduleFunction( CLEANUP._DestroyUnit, { self, Event.TgtDCSUnit }, timer.getTime() + 0.1 ) + SCHEDULER:New( self, CLEANUP._DestroyUnit, { Event.TgtDCSUnit }, 0.1 ) + end + end + end +end + +--- Add the @{DCSUnit#Unit} to the CleanUpList for CleanUp. +function CLEANUP:_AddForCleanUp( CleanUpUnit, CleanUpUnitName ) + self:F( { CleanUpUnit, CleanUpUnitName } ) + + self.CleanUpList[CleanUpUnitName] = {} + self.CleanUpList[CleanUpUnitName].CleanUpUnit = CleanUpUnit + self.CleanUpList[CleanUpUnitName].CleanUpUnitName = CleanUpUnitName + self.CleanUpList[CleanUpUnitName].CleanUpGroup = Unit.getGroup(CleanUpUnit) + self.CleanUpList[CleanUpUnitName].CleanUpGroupName = Unit.getGroup(CleanUpUnit):getName() + self.CleanUpList[CleanUpUnitName].CleanUpTime = timer.getTime() + self.CleanUpList[CleanUpUnitName].CleanUpMoved = false + + self:T( { "CleanUp: Add to CleanUpList: ", Unit.getGroup(CleanUpUnit):getName(), CleanUpUnitName } ) + +end + +--- Detects if the Unit has an S_EVENT_ENGINE_SHUTDOWN or an S_EVENT_HIT within the given ZoneNames. If this is the case, add the Group to the CLEANUP List. +-- @param #CLEANUP self +-- @param DCSTypes#Event event +function CLEANUP:_EventAddForCleanUp( Event ) + + if Event.IniDCSUnit then + if self.CleanUpList[Event.IniDCSUnitName] == nil then + if routines.IsUnitInZones( Event.IniDCSUnit, self.ZoneNames ) ~= nil then + self:_AddForCleanUp( Event.IniDCSUnit, Event.IniDCSUnitName ) + end + end + end + + if Event.TgtDCSUnit then + if self.CleanUpList[Event.TgtDCSUnitName] == nil then + if routines.IsUnitInZones( Event.TgtDCSUnit, self.ZoneNames ) ~= nil then + self:_AddForCleanUp( Event.TgtDCSUnit, Event.TgtDCSUnitName ) + end + end + end + +end + +local CleanUpSurfaceTypeText = { + "LAND", + "SHALLOW_WATER", + "WATER", + "ROAD", + "RUNWAY" + } + +--- At the defined time interval, CleanUp the Groups within the CleanUpList. +-- @param #CLEANUP self +function CLEANUP:_CleanUpScheduler() + self:F( { "CleanUp Scheduler" } ) + + local CleanUpCount = 0 + for CleanUpUnitName, UnitData in pairs( self.CleanUpList ) do + CleanUpCount = CleanUpCount + 1 + + self:T( { CleanUpUnitName, UnitData } ) + local CleanUpUnit = Unit.getByName(UnitData.CleanUpUnitName) + local CleanUpGroupName = UnitData.CleanUpGroupName + local CleanUpUnitName = UnitData.CleanUpUnitName + if CleanUpUnit then + self:T( { "CleanUp Scheduler", "Checking:", CleanUpUnitName } ) + if _DATABASE:GetStatusGroup( CleanUpGroupName ) ~= "ReSpawn" then + local CleanUpUnitVec3 = CleanUpUnit:getPoint() + --self:T( CleanUpUnitVec3 ) + local CleanUpUnitVec2 = {} + CleanUpUnitVec2.x = CleanUpUnitVec3.x + CleanUpUnitVec2.y = CleanUpUnitVec3.z + --self:T( CleanUpUnitVec2 ) + local CleanUpSurfaceType = land.getSurfaceType(CleanUpUnitVec2) + --self:T( CleanUpSurfaceType ) + --MESSAGE:New( "Surface " .. CleanUpUnitName .. " = " .. CleanUpSurfaceTypeText[CleanUpSurfaceType], CleanUpUnitName, 10, CleanUpUnitName ):ToAll() + + if CleanUpUnit and CleanUpUnit:getLife() <= CleanUpUnit:getLife0() * 0.95 then + if CleanUpSurfaceType == land.SurfaceType.RUNWAY then + if CleanUpUnit:inAir() then + local CleanUpLandHeight = land.getHeight(CleanUpUnitVec2) + local CleanUpUnitHeight = CleanUpUnitVec3.y - CleanUpLandHeight + self:T( { "CleanUp Scheduler", "Height = " .. CleanUpUnitHeight } ) + if CleanUpUnitHeight < 30 then + self:T( { "CleanUp Scheduler", "Destroy " .. CleanUpUnitName .. " because below safe height and damaged." } ) + self:_DestroyUnit(CleanUpUnit, CleanUpUnitName) + end + else + self:T( { "CleanUp Scheduler", "Destroy " .. CleanUpUnitName .. " because on runway and damaged." } ) + self:_DestroyUnit(CleanUpUnit, CleanUpUnitName) + end + end + end + -- Clean Units which are waiting for a very long time in the CleanUpZone. + if CleanUpUnit then + local CleanUpUnitVelocity = CleanUpUnit:getVelocity() + local CleanUpUnitVelocityTotal = math.abs(CleanUpUnitVelocity.x) + math.abs(CleanUpUnitVelocity.y) + math.abs(CleanUpUnitVelocity.z) + if CleanUpUnitVelocityTotal < 1 then + if UnitData.CleanUpMoved then + if UnitData.CleanUpTime + 180 <= timer.getTime() then + self:T( { "CleanUp Scheduler", "Destroy due to not moving anymore " .. CleanUpUnitName } ) + self:_DestroyUnit(CleanUpUnit, CleanUpUnitName) + end + end + else + UnitData.CleanUpTime = timer.getTime() + UnitData.CleanUpMoved = true + --MESSAGE:New( "Moved " .. CleanUpUnitName, CleanUpUnitName, 10, CleanUpUnitName ):ToAll() + end + end + + else + -- Do nothing ... + self.CleanUpList[CleanUpUnitName] = nil -- Not anymore in the DCSRTE + end + else + self:T( "CleanUp: Group " .. CleanUpUnitName .. " cannot be found in DCS RTE, removing ..." ) + self.CleanUpList[CleanUpUnitName] = nil -- Not anymore in the DCSRTE + end + end + self:T(CleanUpCount) + + return true +end + +--- Dynamic spawning of groups (and units). +-- +-- @{#SPAWN} class +-- =============== +-- The @{#SPAWN} class allows to spawn dynamically new groups, based on pre-defined initialization settings, modifying the behaviour when groups are spawned. +-- For each group to be spawned, within the mission editor, a group has to be created with the "late activation flag" set. We call this group the *"Spawn Template"* of the SPAWN object. +-- A reference to this Spawn Template needs to be provided when constructing the SPAWN object, by indicating the name of the group within the mission editor in the constructor methods. +-- +-- Within the SPAWN object, there is an internal index that keeps track of which group from the internal group list was spawned. +-- When new groups get spawned by using the SPAWN functions (see below), it will be validated whether the Limits (@{#SPAWN.Limit}) of the SPAWN object are not reached. +-- When all is valid, a new group will be created by the spawning methods, and the internal index will be increased with 1. +-- +-- Regarding the name of new spawned groups, a _SpawnPrefix_ will be assigned for each new group created. +-- If you want to have the Spawn Template name to be used as the _SpawnPrefix_ name, use the @{#SPAWN.New} constructor. +-- However, when the @{#SPAWN.NewWithAlias} constructor was used, the Alias name will define the _SpawnPrefix_ name. +-- Groups will follow the following naming structure when spawned at run-time: +-- +-- 1. Spawned groups will have the name _SpawnPrefix_#ggg, where ggg is a counter from 0 to 999. +-- 2. Spawned units will have the name _SpawnPrefix_#ggg-uu, where uu is a counter from 0 to 99 for each new spawned unit belonging to the group. +-- +-- Some additional notes that need to be remembered: +-- +-- * Templates are actually groups defined within the mission editor, with the flag "Late Activation" set. As such, these groups are never used within the mission, but are used by the @{#SPAWN} module. +-- * It is important to defined BEFORE you spawn new groups, a proper initialization of the SPAWN instance is done with the options you want to use. +-- * When designing a mission, NEVER name groups using a "#" within the name of the group Spawn Template(s), or the SPAWN module logic won't work anymore. +-- +-- SPAWN construction methods: +-- =========================== +-- Create a new SPAWN object with the @{#SPAWN.New} or the @{#SPAWN.NewWithAlias} methods: +-- +-- * @{#SPAWN.New}: Creates a new SPAWN object taking the name of the group that functions as the Template. +-- +-- It is important to understand how the SPAWN class works internally. The SPAWN object created will contain internally a list of groups that will be spawned and that are already spawned. +-- The initialization functions will modify this list of groups so that when a group gets spawned, ALL information is already prepared when spawning. This is done for performance reasons. +-- So in principle, the group list will contain all parameters and configurations after initialization, and when groups get actually spawned, this spawning can be done quickly and efficient. +-- +-- SPAWN initialization methods: +-- ============================= +-- A spawn object will behave differently based on the usage of initialization methods: +-- +-- * @{#SPAWN.Limit}: Limits the amount of groups that can be alive at the same time and that can be dynamically spawned. +-- * @{#SPAWN.RandomizeRoute}: Randomize the routes of spawned groups. +-- * @{#SPAWN.RandomizeTemplate}: Randomize the group templates so that when a new group is spawned, a random group template is selected from one of the templates defined. +-- * @{#SPAWN.Uncontrolled}: Spawn plane groups uncontrolled. +-- * @{#SPAWN.Array}: Make groups visible before they are actually activated, and order these groups like a batallion in an array. +-- * @{#SPAWN.InitRepeat}: Re-spawn groups when they land at the home base. Similar functions are @{#SPAWN.InitRepeatOnLanding} and @{#SPAWN.InitRepeatOnEngineShutDown}. +-- +-- SPAWN spawning methods: +-- ======================= +-- Groups can be spawned at different times and methods: +-- +-- * @{#SPAWN.Spawn}: Spawn one new group based on the last spawned index. +-- * @{#SPAWN.ReSpawn}: Re-spawn a group based on a given index. +-- * @{#SPAWN.SpawnScheduled}: Spawn groups at scheduled but randomized intervals. You can use @{#SPAWN.SpawnScheduleStart} and @{#SPAWN.SpawnScheduleStop} to start and stop the schedule respectively. +-- * @{#SPAWN.SpawnFromUnit}: Spawn a new group taking the position of a @{UNIT}. +-- * @{#SPAWN.SpawnInZone}: Spawn a new group in a @{ZONE}. +-- +-- Note that @{#SPAWN.Spawn} and @{#SPAWN.ReSpawn} return a @{GROUP#GROUP.New} object, that contains a reference to the DCSGroup object. +-- You can use the @{GROUP} object to do further actions with the DCSGroup. +-- +-- SPAWN object cleaning: +-- ========================= +-- Sometimes, it will occur during a mission run-time, that ground or especially air objects get damaged, and will while being damged stop their activities, while remaining alive. +-- In such cases, the SPAWN object will just sit there and wait until that group gets destroyed, but most of the time it won't, +-- and it may occur that no new groups are or can be spawned as limits are reached. +-- To prevent this, a @{#SPAWN.CleanUp} initialization method has been defined that will silently monitor the status of each spawned group. +-- Once a group has a velocity = 0, and has been waiting for a defined interval, that group will be cleaned or removed from run-time. +-- There is a catch however :-) If a damaged group has returned to an airbase within the coalition, that group will not be considered as "lost"... +-- In such a case, when the inactive group is cleaned, a new group will Re-spawned automatically. +-- This models AI that has succesfully returned to their airbase, to restart their combat activities. +-- Check the @{#SPAWN.CleanUp} for further info. +-- +-- ==== +-- @module Spawn +-- @author FlightControl + +Include.File( "Routines" ) +Include.File( "Base" ) +Include.File( "Database" ) +Include.File( "Group" ) +Include.File( "Zone" ) +Include.File( "Event" ) +Include.File( "Scheduler" ) + +--- SPAWN Class +-- @type SPAWN +-- @extends Base#BASE +-- @field ClassName +-- @field #string SpawnTemplatePrefix +-- @field #string SpawnAliasPrefix +SPAWN = { + ClassName = "SPAWN", + SpawnTemplatePrefix = nil, + SpawnAliasPrefix = nil, +} + + + +--- Creates the main object to spawn a GROUP defined in the DCS ME. +-- @param #SPAWN self +-- @param #string SpawnTemplatePrefix is the name of the Group in the ME that defines the Template. Each new group will have the name starting with SpawnTemplatePrefix. +-- @return #SPAWN +-- @usage +-- -- NATO helicopters engaging in the battle field. +-- Spawn_BE_KA50 = SPAWN:New( 'BE KA-50@RAMP-Ground Defense' ) +-- @usage local Plane = SPAWN:New( "Plane" ) -- Creates a new local variable that can initiate new planes with the name "Plane#ddd" using the template "Plane" as defined within the ME. +function SPAWN:New( SpawnTemplatePrefix ) + local self = BASE:Inherit( self, BASE:New() ) + self:F( { SpawnTemplatePrefix } ) + + local TemplateGroup = Group.getByName( SpawnTemplatePrefix ) + if TemplateGroup then + self.SpawnTemplatePrefix = SpawnTemplatePrefix + self.SpawnIndex = 0 + self.SpawnCount = 0 -- The internal counter of the amount of spawning the has happened since SpawnStart. + self.AliveUnits = 0 -- Contains the counter how many units are currently alive + self.SpawnIsScheduled = false -- Reflects if the spawning for this SpawnTemplatePrefix is going to be scheduled or not. + self.SpawnTemplate = self._GetTemplate( self, SpawnTemplatePrefix ) -- Contains the template structure for a Group Spawn from the Mission Editor. Note that this group must have lateActivation always on!!! + self.Repeat = false -- Don't repeat the group from Take-Off till Landing and back Take-Off by ReSpawning. + self.UnControlled = false -- When working in UnControlled mode, all planes are Spawned in UnControlled mode before the scheduler starts. + self.SpawnMaxUnitsAlive = 0 -- The maximum amount of groups that can be alive of SpawnTemplatePrefix at the same time. + self.SpawnMaxGroups = 0 -- The maximum amount of groups that can be spawned. + self.SpawnRandomize = false -- Sets the randomization flag of new Spawned units to false. + self.SpawnVisible = false -- Flag that indicates if all the Groups of the SpawnGroup need to be visible when Spawned. + + self.SpawnGroups = {} -- Array containing the descriptions of each Group to be Spawned. + else + error( "SPAWN:New: There is no group declared in the mission editor with SpawnTemplatePrefix = '" .. SpawnTemplatePrefix .. "'" ) + end + + return self +end + +--- Creates a new SPAWN instance to create new groups based on the defined template and using a new alias for each new group. +-- @param #SPAWN self +-- @param #string SpawnTemplatePrefix is the name of the Group in the ME that defines the Template. +-- @param #string SpawnAliasPrefix is the name that will be given to the Group at runtime. +-- @return #SPAWN +-- @usage +-- -- NATO helicopters engaging in the battle field. +-- Spawn_BE_KA50 = SPAWN:NewWithAlias( 'BE KA-50@RAMP-Ground Defense', 'Helicopter Attacking a City' ) +-- @usage local PlaneWithAlias = SPAWN:NewWithAlias( "Plane", "Bomber" ) -- Creates a new local variable that can instantiate new planes with the name "Bomber#ddd" using the template "Plane" as defined within the ME. +function SPAWN:NewWithAlias( SpawnTemplatePrefix, SpawnAliasPrefix ) + local self = BASE:Inherit( self, BASE:New() ) + self:F( { SpawnTemplatePrefix, SpawnAliasPrefix } ) + + local TemplateGroup = Group.getByName( SpawnTemplatePrefix ) + if TemplateGroup then + self.SpawnTemplatePrefix = SpawnTemplatePrefix + self.SpawnAliasPrefix = SpawnAliasPrefix + self.SpawnIndex = 0 + self.SpawnCount = 0 -- The internal counter of the amount of spawning the has happened since SpawnStart. + self.AliveUnits = 0 -- Contains the counter how many units are currently alive + self.SpawnIsScheduled = false -- Reflects if the spawning for this SpawnTemplatePrefix is going to be scheduled or not. + self.SpawnTemplate = self._GetTemplate( self, SpawnTemplatePrefix ) -- Contains the template structure for a Group Spawn from the Mission Editor. Note that this group must have lateActivation always on!!! + self.Repeat = false -- Don't repeat the group from Take-Off till Landing and back Take-Off by ReSpawning. + self.UnControlled = false -- When working in UnControlled mode, all planes are Spawned in UnControlled mode before the scheduler starts. + self.SpawnMaxUnitsAlive = 0 -- The maximum amount of groups that can be alive of SpawnTemplatePrefix at the same time. + self.SpawnMaxGroups = 0 -- The maximum amount of groups that can be spawned. + self.SpawnRandomize = false -- Sets the randomization flag of new Spawned units to false. + self.SpawnVisible = false -- Flag that indicates if all the Groups of the SpawnGroup need to be visible when Spawned. + + self.SpawnGroups = {} -- Array containing the descriptions of each Group to be Spawned. + else + error( "SPAWN:New: There is no group declared in the mission editor with SpawnTemplatePrefix = '" .. SpawnTemplatePrefix .. "'" ) + end + + return self +end + + +--- Limits the Maximum amount of Units that can be alive at the same time, and the maximum amount of groups that can be spawned. +-- Note that this method is exceptionally important to balance the performance of the mission. Depending on the machine etc, a mission can only process a maximum amount of units. +-- If the time interval must be short, but there should not be more Units or Groups alive than a maximum amount of units, then this function should be used... +-- When a @{#SPAWN.New} is executed and the limit of the amount of units alive is reached, then no new spawn will happen of the group, until some of these units of the spawn object will be destroyed. +-- @param #SPAWN self +-- @param #number SpawnMaxUnitsAlive The maximum amount of units that can be alive at runtime. +-- @param #number SpawnMaxGroups The maximum amount of groups that can be spawned. When the limit is reached, then no more actual spawns will happen of the group. +-- This parameter is useful to define a maximum amount of airplanes, ground troops, helicopters, ships etc within a supply area. +-- This parameter accepts the value 0, which defines that there are no maximum group limits, but there are limits on the maximum of units that can be alive at the same time. +-- @return #SPAWN self +-- @usage +-- -- NATO helicopters engaging in the battle field. +-- -- This helicopter group consists of one Unit. So, this group will SPAWN maximum 2 groups simultaneously within the DCSRTE. +-- -- There will be maximum 24 groups spawned during the whole mission lifetime. +-- Spawn_BE_KA50 = SPAWN:New( 'BE KA-50@RAMP-Ground Defense' ):Limit( 2, 24 ) +function SPAWN:Limit( SpawnMaxUnitsAlive, SpawnMaxGroups ) + self:F( { self.SpawnTemplatePrefix, SpawnMaxUnitsAlive, SpawnMaxGroups } ) + + self.SpawnMaxUnitsAlive = SpawnMaxUnitsAlive -- The maximum amount of groups that can be alive of SpawnTemplatePrefix at the same time. + self.SpawnMaxGroups = SpawnMaxGroups -- The maximum amount of groups that can be spawned. + + for SpawnGroupID = 1, self.SpawnMaxGroups do + self:_InitializeSpawnGroups( SpawnGroupID ) + end + + return self +end + + +--- Randomizes the defined route of the SpawnTemplatePrefix group in the ME. This is very useful to define extra variation of the behaviour of groups. +-- @param #SPAWN self +-- @param #number SpawnStartPoint is the waypoint where the randomization begins. +-- Note that the StartPoint = 0 equaling the point where the group is spawned. +-- @param #number SpawnEndPoint is the waypoint where the randomization ends counting backwards. +-- This parameter is useful to avoid randomization to end at a waypoint earlier than the last waypoint on the route. +-- @param #number SpawnRadius is the radius in meters in which the randomization of the new waypoints, with the original waypoint of the original template located in the middle ... +-- @return #SPAWN +-- @usage +-- -- NATO helicopters engaging in the battle field. +-- -- The KA-50 has waypoints Start point ( =0 or SP ), 1, 2, 3, 4, End point (= 5 or DP). +-- -- Waypoints 2 and 3 will only be randomized. The others will remain on their original position with each new spawn of the helicopter. +-- -- The randomization of waypoint 2 and 3 will take place within a radius of 2000 meters. +-- Spawn_BE_KA50 = SPAWN:New( 'BE KA-50@RAMP-Ground Defense' ):RandomizeRoute( 2, 2, 2000 ) +function SPAWN:RandomizeRoute( SpawnStartPoint, SpawnEndPoint, SpawnRadius ) + self:F( { self.SpawnTemplatePrefix, SpawnStartPoint, SpawnEndPoint, SpawnRadius } ) + + self.SpawnRandomizeRoute = true + self.SpawnRandomizeRouteStartPoint = SpawnStartPoint + self.SpawnRandomizeRouteEndPoint = SpawnEndPoint + self.SpawnRandomizeRouteRadius = SpawnRadius + + for GroupID = 1, self.SpawnMaxGroups do + self:_RandomizeRoute( GroupID ) + end + + return self +end + + +--- This function is rather complicated to understand. But I'll try to explain. +-- This function becomes useful when you need to spawn groups with random templates of groups defined within the mission editor, +-- but they will all follow the same Template route and have the same prefix name. +-- In other words, this method randomizes between a defined set of groups the template to be used for each new spawn of a group. +-- @param #SPAWN self +-- @param #string SpawnTemplatePrefixTable A table with the names of the groups defined within the mission editor, from which one will be choosen when a new group will be spawned. +-- @return #SPAWN +-- @usage +-- -- NATO Tank Platoons invading Gori. +-- -- Choose between 13 different 'US Tank Platoon' configurations for each new SPAWN the Group to be spawned for the +-- -- 'US Tank Platoon Left', 'US Tank Platoon Middle' and 'US Tank Platoon Right' SpawnTemplatePrefixes. +-- -- Each new SPAWN will randomize the route, with a defined time interval of 200 seconds with 40% time variation (randomization) and +-- -- with a limit set of maximum 12 Units alive simulteneously and 150 Groups to be spawned during the whole mission. +-- Spawn_US_Platoon = { 'US Tank Platoon 1', 'US Tank Platoon 2', 'US Tank Platoon 3', 'US Tank Platoon 4', 'US Tank Platoon 5', +-- 'US Tank Platoon 6', 'US Tank Platoon 7', 'US Tank Platoon 8', 'US Tank Platoon 9', 'US Tank Platoon 10', +-- 'US Tank Platoon 11', 'US Tank Platoon 12', 'US Tank Platoon 13' } +-- Spawn_US_Platoon_Left = SPAWN:New( 'US Tank Platoon Left' ):Limit( 12, 150 ):Schedule( 200, 0.4 ):RandomizeTemplate( Spawn_US_Platoon ):RandomizeRoute( 3, 3, 2000 ) +-- Spawn_US_Platoon_Middle = SPAWN:New( 'US Tank Platoon Middle' ):Limit( 12, 150 ):Schedule( 200, 0.4 ):RandomizeTemplate( Spawn_US_Platoon ):RandomizeRoute( 3, 3, 2000 ) +-- Spawn_US_Platoon_Right = SPAWN:New( 'US Tank Platoon Right' ):Limit( 12, 150 ):Schedule( 200, 0.4 ):RandomizeTemplate( Spawn_US_Platoon ):RandomizeRoute( 3, 3, 2000 ) +function SPAWN:RandomizeTemplate( SpawnTemplatePrefixTable ) + self:F( { self.SpawnTemplatePrefix, SpawnTemplatePrefixTable } ) + + self.SpawnTemplatePrefixTable = SpawnTemplatePrefixTable + self.SpawnRandomizeTemplate = true + + for SpawnGroupID = 1, self.SpawnMaxGroups do + self:_RandomizeTemplate( SpawnGroupID ) + end + + return self +end + + + + + +--- For planes and helicopters, when these groups go home and land on their home airbases and farps, they normally would taxi to the parking spot, shut-down their engines and wait forever until the Group is removed by the runtime environment. +-- This function is used to re-spawn automatically (so no extra call is needed anymore) the same group after it has landed. +-- This will enable a spawned group to be re-spawned after it lands, until it is destroyed... +-- Note: When the group is respawned, it will re-spawn from the original airbase where it took off. +-- So ensure that the routes for groups that respawn, always return to the original airbase, or players may get confused ... +-- @param #SPAWN self +-- @return #SPAWN self +-- @usage +-- -- RU Su-34 - AI Ship Attack +-- -- Re-SPAWN the Group(s) after each landing and Engine Shut-Down automatically. +-- SpawnRU_SU34 = SPAWN:New( 'TF1 RU Su-34 Krymsk@AI - Attack Ships' ):Schedule( 2, 3, 1800, 0.4 ):SpawnUncontrolled():RandomizeRoute( 1, 1, 3000 ):RepeatOnEngineShutDown() +function SPAWN:InitRepeat() + self:F( { self.SpawnTemplatePrefix, self.SpawnIndex } ) + + self.Repeat = true + self.RepeatOnEngineShutDown = false + self.RepeatOnLanding = true + + return self +end + +--- Respawn group after landing. +-- @param #SPAWN self +-- @return #SPAWN self +function SPAWN:InitRepeatOnLanding() + self:F( { self.SpawnTemplatePrefix } ) + + self:InitRepeat() + self.RepeatOnEngineShutDown = false + self.RepeatOnLanding = true + + return self +end + + +--- Respawn after landing when its engines have shut down. +-- @param #SPAWN self +-- @return #SPAWN self +function SPAWN:InitRepeatOnEngineShutDown() + self:F( { self.SpawnTemplatePrefix } ) + + self:InitRepeat() + self.RepeatOnEngineShutDown = true + self.RepeatOnLanding = false + + return self +end + + +--- CleanUp groups when they are still alive, but inactive. +-- When groups are still alive and have become inactive due to damage and are unable to contribute anything, then this group will be removed at defined intervals in seconds. +-- @param #SPAWN self +-- @param #string SpawnCleanUpInterval The interval to check for inactive groups within seconds. +-- @return #SPAWN self +-- @usage Spawn_Helicopter:CleanUp( 20 ) -- CleanUp the spawning of the helicopters every 20 seconds when they become inactive. +function SPAWN:CleanUp( SpawnCleanUpInterval ) + self:F( { self.SpawnTemplatePrefix, SpawnCleanUpInterval } ) + + self.SpawnCleanUpInterval = SpawnCleanUpInterval + self.SpawnCleanUpTimeStamps = {} + --self.CleanUpFunction = routines.scheduleFunction( self._SpawnCleanUpScheduler, { self }, timer.getTime() + 1, SpawnCleanUpInterval ) + self.CleanUpScheduler = SCHEDULER:New( self, self._SpawnCleanUpScheduler, {}, 1, SpawnCleanUpInterval, 0.2 ) + return self +end + + + +--- Makes the groups visible before start (like a batallion). +-- The method will take the position of the group as the first position in the array. +-- @param #SPAWN self +-- @param #number SpawnAngle The angle in degrees how the groups and each unit of the group will be positioned. +-- @param #number SpawnWidth The amount of Groups that will be positioned on the X axis. +-- @param #number SpawnDeltaX The space between each Group on the X-axis. +-- @param #number SpawnDeltaY The space between each Group on the Y-axis. +-- @return #SPAWN self +-- @usage +-- -- Define an array of Groups. +-- Spawn_BE_Ground = SPAWN:New( 'BE Ground' ):Limit( 2, 24 ):Visible( 90, "Diamond", 10, 100, 50 ) +function SPAWN:Array( SpawnAngle, SpawnWidth, SpawnDeltaX, SpawnDeltaY ) + self:F( { self.SpawnTemplatePrefix, SpawnAngle, SpawnWidth, SpawnDeltaX, SpawnDeltaY } ) + + self.SpawnVisible = true -- When the first Spawn executes, all the Groups need to be made visible before start. + + local SpawnX = 0 + local SpawnY = 0 + local SpawnXIndex = 0 + local SpawnYIndex = 0 + + for SpawnGroupID = 1, self.SpawnMaxGroups do + self:T( { SpawnX, SpawnY, SpawnXIndex, SpawnYIndex } ) + + self.SpawnGroups[SpawnGroupID].Visible = true + self.SpawnGroups[SpawnGroupID].Spawned = false + + SpawnXIndex = SpawnXIndex + 1 + if SpawnWidth and SpawnWidth ~= 0 then + if SpawnXIndex >= SpawnWidth then + SpawnXIndex = 0 + SpawnYIndex = SpawnYIndex + 1 + end + end + + local SpawnRootX = self.SpawnGroups[SpawnGroupID].SpawnTemplate.x + local SpawnRootY = self.SpawnGroups[SpawnGroupID].SpawnTemplate.y + + self:_TranslateRotate( SpawnGroupID, SpawnRootX, SpawnRootY, SpawnX, SpawnY, SpawnAngle ) + + self.SpawnGroups[SpawnGroupID].SpawnTemplate.lateActivation = true + self.SpawnGroups[SpawnGroupID].SpawnTemplate.visible = true + + self.SpawnGroups[SpawnGroupID].Visible = true + + _EVENTDISPATCHER:OnBirthForTemplate( self.SpawnGroups[SpawnGroupID].SpawnTemplate, self._OnBirth, self ) + _EVENTDISPATCHER:OnCrashForTemplate( self.SpawnGroups[SpawnGroupID].SpawnTemplate, self._OnDeadOrCrash, self ) + _EVENTDISPATCHER:OnDeadForTemplate( self.SpawnGroups[SpawnGroupID].SpawnTemplate, self._OnDeadOrCrash, self ) + + if self.Repeat then + _EVENTDISPATCHER:OnTakeOffForTemplate( self.SpawnGroups[SpawnGroupID].SpawnTemplate, self._OnTakeOff, self ) + _EVENTDISPATCHER:OnLandForTemplate( self.SpawnGroups[SpawnGroupID].SpawnTemplate, self._OnLand, self ) + end + if self.RepeatOnEngineShutDown then + _EVENTDISPATCHER:OnEngineShutDownForTemplate( self.SpawnGroups[SpawnGroupID].SpawnTemplate, self._OnEngineShutDown, self ) + end + + self.SpawnGroups[SpawnGroupID].Group = _DATABASE:Spawn( self.SpawnGroups[SpawnGroupID].SpawnTemplate ) + + SpawnX = SpawnXIndex * SpawnDeltaX + SpawnY = SpawnYIndex * SpawnDeltaY + end + + return self +end + + + +--- Will spawn a group based on the internal index. +-- Note: Uses @{DATABASE} module defined in MOOSE. +-- @param #SPAWN self +-- @return Group#GROUP The group that was spawned. You can use this group for further actions. +function SPAWN:Spawn() + self:F( { self.SpawnTemplatePrefix, self.SpawnIndex } ) + + return self:SpawnWithIndex( self.SpawnIndex + 1 ) +end + +--- Will re-spawn a group based on a given index. +-- Note: Uses @{DATABASE} module defined in MOOSE. +-- @param #SPAWN self +-- @param #string SpawnIndex The index of the group to be spawned. +-- @return Group#GROUP The group that was spawned. You can use this group for further actions. +function SPAWN:ReSpawn( SpawnIndex ) + self:F( { self.SpawnTemplatePrefix, SpawnIndex } ) + + if not SpawnIndex then + SpawnIndex = 1 + end + +-- TODO: This logic makes DCS crash and i don't know why (yet). + local SpawnGroup = self:GetGroupFromIndex( SpawnIndex ) + if SpawnGroup then + local SpawnDCSGroup = SpawnGroup:GetDCSGroup() + if SpawnDCSGroup then + SpawnGroup:Destroy() + end + end + + return self:SpawnWithIndex( SpawnIndex ) +end + +--- Will spawn a group with a specified index number. +-- Uses @{DATABASE} global object defined in MOOSE. +-- @param #SPAWN self +-- @return Group#GROUP The group that was spawned. You can use this group for further actions. +function SPAWN:SpawnWithIndex( SpawnIndex ) + self:F( { self.SpawnTemplatePrefix, SpawnIndex, self.SpawnMaxGroups } ) + + if self:_GetSpawnIndex( SpawnIndex ) then + + if self.SpawnGroups[self.SpawnIndex].Visible then + self.SpawnGroups[self.SpawnIndex].Group:Activate() + else + self:T( self.SpawnGroups[self.SpawnIndex].SpawnTemplate ) + _EVENTDISPATCHER:OnBirthForTemplate( self.SpawnGroups[self.SpawnIndex].SpawnTemplate, self._OnBirth, self ) + _EVENTDISPATCHER:OnCrashForTemplate( self.SpawnGroups[self.SpawnIndex].SpawnTemplate, self._OnDeadOrCrash, self ) + _EVENTDISPATCHER:OnDeadForTemplate( self.SpawnGroups[self.SpawnIndex].SpawnTemplate, self._OnDeadOrCrash, self ) + + if self.Repeat then + _EVENTDISPATCHER:OnTakeOffForTemplate( self.SpawnGroups[self.SpawnIndex].SpawnTemplate, self._OnTakeOff, self ) + _EVENTDISPATCHER:OnLandForTemplate( self.SpawnGroups[self.SpawnIndex].SpawnTemplate, self._OnLand, self ) + end + if self.RepeatOnEngineShutDown then + _EVENTDISPATCHER:OnEngineShutDownForTemplate( self.SpawnGroups[self.SpawnIndex].SpawnTemplate, self._OnEngineShutDown, self ) + end + + self:T( self.SpawnGroups[self.SpawnIndex].SpawnTemplate ) + + self.SpawnGroups[self.SpawnIndex].Group = _DATABASE:Spawn( self.SpawnGroups[self.SpawnIndex].SpawnTemplate ) + + -- If there is a SpawnFunction hook defined, call it. + if self.SpawnFunctionHook then + self.SpawnFunctionHook( self.SpawnGroups[self.SpawnIndex].Group, unpack( self.SpawnFunctionArguments ) ) + end + -- TODO: Need to fix this by putting an "R" in the name of the group when the group repeats. + --if self.Repeat then + -- _DATABASE:SetStatusGroup( SpawnTemplate.name, "ReSpawn" ) + --end + end + + self.SpawnGroups[self.SpawnIndex].Spawned = true + return self.SpawnGroups[self.SpawnIndex].Group + else + --self:E( { self.SpawnTemplatePrefix, "No more Groups to Spawn:", SpawnIndex, self.SpawnMaxGroups } ) + end + + return nil +end + +--- Spawns new groups at varying time intervals. +-- This is useful if you want to have continuity within your missions of certain (AI) groups to be present (alive) within your missions. +-- @param #SPAWN self +-- @param #number SpawnTime The time interval defined in seconds between each new spawn of new groups. +-- @param #number SpawnTimeVariation The variation to be applied on the defined time interval between each new spawn. +-- The variation is a number between 0 and 1, representing the %-tage of variation to be applied on the time interval. +-- @return #SPAWN self +-- @usage +-- -- NATO helicopters engaging in the battle field. +-- -- The time interval is set to SPAWN new helicopters between each 600 seconds, with a time variation of 50%. +-- -- The time variation in this case will be between 450 seconds and 750 seconds. +-- -- This is calculated as follows: +-- -- Low limit: 600 * ( 1 - 0.5 / 2 ) = 450 +-- -- High limit: 600 * ( 1 + 0.5 / 2 ) = 750 +-- -- Between these two values, a random amount of seconds will be choosen for each new spawn of the helicopters. +-- Spawn_BE_KA50 = SPAWN:New( 'BE KA-50@RAMP-Ground Defense' ):Schedule( 600, 0.5 ) +function SPAWN:SpawnScheduled( SpawnTime, SpawnTimeVariation ) + self:F( { SpawnTime, SpawnTimeVariation } ) + + if SpawnTime ~= nil and SpawnTimeVariation ~= nil then + self.SpawnScheduler = SCHEDULER:New( self, self._Scheduler, {}, 1, SpawnTime, SpawnTimeVariation ) + end + + return self +end + +--- Will re-start the spawning scheduler. +-- Note: This function is only required to be called when the schedule was stopped. +function SPAWN:SpawnScheduleStart() + self:F( { self.SpawnTemplatePrefix } ) + + self.SpawnScheduler:Start() +end + +--- Will stop the scheduled spawning scheduler. +function SPAWN:SpawnScheduleStop() + self:F( { self.SpawnTemplatePrefix } ) + + self.SpawnScheduler:Stop() +end + + +--- Allows to place a CallFunction hook when a new group spawns. +-- The provided function will be called when a new group is spawned, including its given parameters. +-- The first parameter of the SpawnFunction is the @{Group#GROUP} that was spawned. +-- @param #SPAWN self +-- @param #function SpawnFunctionHook The function to be called when a group spawns. +-- @param SpawnFunctionArguments A random amount of arguments to be provided to the function when the group spawns. +-- @return #SPAWN +function SPAWN:SpawnFunction( SpawnFunctionHook, ... ) + self:F( SpawnFunction ) + + self.SpawnFunctionHook = SpawnFunctionHook + self.SpawnFunctionArguments = {} + if arg then + self.SpawnFunctionArguments = arg + end + + return self +end + + + + +--- Will spawn a group from a hosting unit. This function is mostly advisable to be used if you want to simulate spawning from air units, like helicopters, which are dropping infantry into a defined Landing Zone. +-- Note that each point in the route assigned to the spawning group is reset to the point of the spawn. +-- You can use the returned group to further define the route to be followed. +-- @param #SPAWN self +-- @param Unit#UNIT HostUnit The air or ground unit dropping or unloading the group. +-- @param #number OuterRadius The outer radius in meters where the new group will be spawned. +-- @param #number InnerRadius The inner radius in meters where the new group will NOT be spawned. +-- @param #number SpawnIndex (Optional) The index which group to spawn within the given zone. +-- @return Group#GROUP that was spawned. +-- @return #nil Nothing was spawned. +function SPAWN:SpawnFromUnit( HostUnit, OuterRadius, InnerRadius, SpawnIndex ) + self:F( { self.SpawnTemplatePrefix, HostUnit, OuterRadius, InnerRadius, SpawnIndex } ) + + if HostUnit and HostUnit:IsAlive() then -- and HostUnit:getUnit(1):inAir() == false then + + if SpawnIndex then + else + SpawnIndex = self.SpawnIndex + 1 + end + + if self:_GetSpawnIndex( SpawnIndex ) then + + local SpawnTemplate = self.SpawnGroups[self.SpawnIndex].SpawnTemplate + + if SpawnTemplate then + + local UnitPoint = HostUnit:GetPointVec2() + + self:T( { "Current point of ", self.SpawnTemplatePrefix, UnitPoint } ) + + --for PointID, Point in pairs( SpawnTemplate.route.points ) do + --Point.x = UnitPoint.x + --Point.y = UnitPoint.y + --Point.alt = nil + --Point.alt_type = nil + --end + + SpawnTemplate.route.points[1].x = UnitPoint.x + SpawnTemplate.route.points[1].y = UnitPoint.y + + if not InnerRadius then + InnerRadius = 10 + end + + if not OuterRadius then + OuterRadius = 50 + end + + -- Apply SpawnFormation + for UnitID = 1, #SpawnTemplate.units do + if InnerRadius == 0 then + SpawnTemplate.units[UnitID].x = UnitPoint.x + SpawnTemplate.units[UnitID].y = UnitPoint.y + else + local CirclePos = routines.getRandPointInCircle( UnitPoint, OuterRadius, InnerRadius ) + SpawnTemplate.units[UnitID].x = CirclePos.x + SpawnTemplate.units[UnitID].y = CirclePos.y + end + self:T( 'SpawnTemplate.units['..UnitID..'].x = ' .. SpawnTemplate.units[UnitID].x .. ', SpawnTemplate.units['..UnitID..'].y = ' .. SpawnTemplate.units[UnitID].y ) + end + + local SpawnPos = routines.getRandPointInCircle( UnitPoint, OuterRadius, InnerRadius ) + local Point = {} + Point.type = "Turning Point" + Point.x = SpawnPos.x + Point.y = SpawnPos.y + Point.action = "Cone" + Point.speed = 5 + + table.insert( SpawnTemplate.route.points, 2, Point ) + + return self:SpawnWithIndex( self.SpawnIndex ) + end + end + end + + return nil +end + +--- Will spawn a Group within a given @{Zone#ZONE}. +-- Once the group is spawned within the zone, it will continue on its route. +-- The first waypoint (where the group is spawned) is replaced with the zone coordinates. +-- @param #SPAWN self +-- @param Zone#ZONE Zone The zone where the group is to be spawned. +-- @param #number ZoneRandomize (Optional) Set to true if you want to randomize the starting point in the zone. +-- @param #number SpawnIndex (Optional) The index which group to spawn within the given zone. +-- @return Group#GROUP that was spawned. +-- @return #nil when nothing was spawned. +function SPAWN:SpawnInZone( Zone, ZoneRandomize, SpawnIndex ) + self:F( { self.SpawnTemplatePrefix, Zone, ZoneRandomize, SpawnIndex } ) + + if Zone then + + if SpawnIndex then + else + SpawnIndex = self.SpawnIndex + 1 + end + + if self:_GetSpawnIndex( SpawnIndex ) then + + local SpawnTemplate = self.SpawnGroups[self.SpawnIndex].SpawnTemplate + + if SpawnTemplate then + + local ZonePoint + + if ZoneRandomize == true then + ZonePoint = Zone:GetRandomPointVec2() + else + ZonePoint = Zone:GetPointVec2() + end + + SpawnTemplate.route.points[1].x = ZonePoint.x + SpawnTemplate.route.points[1].y = ZonePoint.y + + -- Apply SpawnFormation + for UnitID = 1, #SpawnTemplate.units do + local ZonePointUnit = Zone:GetRandomPointVec2() + SpawnTemplate.units[UnitID].x = ZonePointUnit.x + SpawnTemplate.units[UnitID].y = ZonePointUnit.y + self:T( 'SpawnTemplate.units['..UnitID..'].x = ' .. SpawnTemplate.units[UnitID].x .. ', SpawnTemplate.units['..UnitID..'].y = ' .. SpawnTemplate.units[UnitID].y ) + end + + return self:SpawnWithIndex( self.SpawnIndex ) + end + end + end + + return nil +end + + + + +--- Will spawn a plane group in uncontrolled mode... +-- This will be similar to the uncontrolled flag setting in the ME. +-- @return #SPAWN self +function SPAWN:UnControlled() + self:F( { self.SpawnTemplatePrefix } ) + + self.SpawnUnControlled = true + + for SpawnGroupID = 1, self.SpawnMaxGroups do + self.SpawnGroups[SpawnGroupID].UnControlled = true + end + + return self +end + + + +--- Will return the SpawnGroupName either with with a specific count number or without any count. +-- @param #SPAWN self +-- @param #number SpawnIndex Is the number of the Group that is to be spawned. +-- @return #string SpawnGroupName +function SPAWN:SpawnGroupName( SpawnIndex ) + self:F( { self.SpawnTemplatePrefix, SpawnIndex } ) + + local SpawnPrefix = self.SpawnTemplatePrefix + if self.SpawnAliasPrefix then + SpawnPrefix = self.SpawnAliasPrefix + end + + if SpawnIndex then + local SpawnName = string.format( '%s#%03d', SpawnPrefix, SpawnIndex ) + self:T( SpawnName ) + return SpawnName + else + self:T( SpawnPrefix ) + return SpawnPrefix + end + +end + +--- Find the first alive group. +-- @param #SPAWN self +-- @param #number SpawnCursor A number holding the index from where to find the first group from. +-- @return Group#GROUP, #number The group found, the new index where the group was found. +-- @return #nil, #nil When no group is found, #nil is returned. +function SPAWN:GetFirstAliveGroup( SpawnCursor ) + self:F( { self.SpawnTemplatePrefix, self.SpawnAliasPrefix, SpawnCursor } ) + + for SpawnIndex = 1, self.SpawnCount do + local SpawnGroup = self:GetGroupFromIndex( SpawnIndex ) + if SpawnGroup and SpawnGroup:IsAlive() then + SpawnCursor = SpawnIndex + return SpawnGroup, SpawnCursor + end + end + + return nil, nil +end + + +--- Find the next alive group. +-- @param #SPAWN self +-- @param #number SpawnCursor A number holding the last found previous index. +-- @return Group#GROUP, #number The group found, the new index where the group was found. +-- @return #nil, #nil When no group is found, #nil is returned. +function SPAWN:GetNextAliveGroup( SpawnCursor ) + self:F( { self.SpawnTemplatePrefix, self.SpawnAliasPrefix, SpawnCursor } ) + + SpawnCursor = SpawnCursor + 1 + for SpawnIndex = SpawnCursor, self.SpawnCount do + local SpawnGroup = self:GetGroupFromIndex( SpawnIndex ) + if SpawnGroup and SpawnGroup:IsAlive() then + SpawnCursor = SpawnIndex + return SpawnGroup, SpawnCursor + end + end + + return nil, nil +end + +--- Find the last alive group during runtime. +function SPAWN:GetLastAliveGroup() + self:F( { self.SpawnTemplatePrefixself.SpawnAliasPrefix } ) + + self.SpawnIndex = self:_GetLastIndex() + for SpawnIndex = self.SpawnIndex, 1, -1 do + local SpawnGroup = self:GetGroupFromIndex( SpawnIndex ) + if SpawnGroup and SpawnGroup:IsAlive() then + self.SpawnIndex = SpawnIndex + return SpawnGroup + end + end + + self.SpawnIndex = nil + return nil +end + + + +--- Get the group from an index. +-- Returns the group from the SpawnGroups list. +-- If no index is given, it will return the first group in the list. +-- @param #SPAWN self +-- @param #number SpawnIndex The index of the group to return. +-- @return Group#GROUP +function SPAWN:GetGroupFromIndex( SpawnIndex ) + self:F( { self.SpawnTemplatePrefix, self.SpawnAliasPrefix, SpawnIndex } ) + + if not SpawnIndex then + SpawnIndex = 1 + end + + if self.SpawnGroups and self.SpawnGroups[SpawnIndex] then + local SpawnGroup = self.SpawnGroups[SpawnIndex].Group + return SpawnGroup + else + return nil + end +end + +--- Get the group index from a DCSUnit. +-- The method will search for a #-mark, and will return the index behind the #-mark of the DCSUnit. +-- It will return nil of no prefix was found. +-- @param #SPAWN self +-- @param DCSUnit The DCS unit to be searched. +-- @return #string The prefix +-- @return #nil Nothing found +function SPAWN:_GetGroupIndexFromDCSUnit( DCSUnit ) + self:F( { self.SpawnTemplatePrefix, self.SpawnAliasPrefix, DCSUnit } ) + + if DCSUnit and DCSUnit:getName() then + local IndexString = string.match( DCSUnit:getName(), "#.*-" ):sub( 2, -2 ) + self:T( IndexString ) + + if IndexString then + local Index = tonumber( IndexString ) + self:T( { "Index:", IndexString, Index } ) + return Index + end + end + + return nil +end + +--- Return the prefix of a DCSUnit. +-- The method will search for a #-mark, and will return the text before the #-mark. +-- It will return nil of no prefix was found. +-- @param #SPAWN self +-- @param DCSUnit The DCS unit to be searched. +-- @return #string The prefix +-- @return #nil Nothing found +function SPAWN:_GetPrefixFromDCSUnit( DCSUnit ) + self:F( { self.SpawnTemplatePrefix, self.SpawnAliasPrefix, DCSUnit } ) + + if DCSUnit and DCSUnit:getName() then + local SpawnPrefix = string.match( DCSUnit:getName(), ".*#" ) + if SpawnPrefix then + SpawnPrefix = SpawnPrefix:sub( 1, -2 ) + end + self:T( SpawnPrefix ) + return SpawnPrefix + end + + return nil +end + +--- Return the group within the SpawnGroups collection with input a DCSUnit. +function SPAWN:_GetGroupFromDCSUnit( DCSUnit ) + self:F( { self.SpawnTemplatePrefix, self.SpawnAliasPrefix, DCSUnit } ) + + if DCSUnit then + local SpawnPrefix = self:_GetPrefixFromDCSUnit( DCSUnit ) + + if self.SpawnTemplatePrefix == SpawnPrefix or ( self.SpawnAliasPrefix and self.SpawnAliasPrefix == SpawnPrefix ) then + local SpawnGroupIndex = self:_GetGroupIndexFromDCSUnit( DCSUnit ) + local SpawnGroup = self.SpawnGroups[SpawnGroupIndex].Group + self:T( SpawnGroup ) + return SpawnGroup + end + end + + return nil +end + + +--- Get the index from a given group. +-- The function will search the name of the group for a #, and will return the number behind the #-mark. +function SPAWN:GetSpawnIndexFromGroup( SpawnGroup ) + self:F( { self.SpawnTemplatePrefix, self.SpawnAliasPrefix, SpawnGroup } ) + + local IndexString = string.match( SpawnGroup:GetName(), "#.*$" ):sub( 2 ) + local Index = tonumber( IndexString ) + + self:T( IndexString, Index ) + return Index + +end + +--- Return the last maximum index that can be used. +function SPAWN:_GetLastIndex() + self:F( { self.SpawnTemplatePrefix, self.SpawnAliasPrefix } ) + + return self.SpawnMaxGroups +end + +--- Initalize the SpawnGroups collection. +function SPAWN:_InitializeSpawnGroups( SpawnIndex ) + self:F( { self.SpawnTemplatePrefix, self.SpawnAliasPrefix, SpawnIndex } ) + + if not self.SpawnGroups[SpawnIndex] then + self.SpawnGroups[SpawnIndex] = {} + self.SpawnGroups[SpawnIndex].Visible = false + self.SpawnGroups[SpawnIndex].Spawned = false + self.SpawnGroups[SpawnIndex].UnControlled = false + self.SpawnGroups[SpawnIndex].SpawnTime = 0 + + self.SpawnGroups[SpawnIndex].SpawnTemplatePrefix = self.SpawnTemplatePrefix + self.SpawnGroups[SpawnIndex].SpawnTemplate = self:_Prepare( self.SpawnGroups[SpawnIndex].SpawnTemplatePrefix, SpawnIndex ) + end + + self:_RandomizeTemplate( SpawnIndex ) + self:_RandomizeRoute( SpawnIndex ) + --self:_TranslateRotate( SpawnIndex ) + + return self.SpawnGroups[SpawnIndex] +end + + + +--- Gets the CategoryID of the Group with the given SpawnPrefix +function SPAWN:_GetGroupCategoryID( SpawnPrefix ) + local TemplateGroup = Group.getByName( SpawnPrefix ) + + if TemplateGroup then + return TemplateGroup:getCategory() + else + return nil + end +end + +--- Gets the CoalitionID of the Group with the given SpawnPrefix +function SPAWN:_GetGroupCoalitionID( SpawnPrefix ) + local TemplateGroup = Group.getByName( SpawnPrefix ) + + if TemplateGroup then + return TemplateGroup:getCoalition() + else + return nil + end +end + +--- Gets the CountryID of the Group with the given SpawnPrefix +function SPAWN:_GetGroupCountryID( SpawnPrefix ) + self:F( { self.SpawnTemplatePrefix, self.SpawnAliasPrefix, SpawnPrefix } ) + + local TemplateGroup = Group.getByName( SpawnPrefix ) + + if TemplateGroup then + local TemplateUnits = TemplateGroup:getUnits() + return TemplateUnits[1]:getCountry() + else + return nil + end +end + +--- Gets the Group Template from the ME environment definition. +-- This method used the @{DATABASE} object, which contains ALL initial and new spawned object in MOOSE. +-- @param #SPAWN self +-- @param #string SpawnTemplatePrefix +-- @return @SPAWN self +function SPAWN:_GetTemplate( SpawnTemplatePrefix ) + self:F( { self.SpawnTemplatePrefix, self.SpawnAliasPrefix, SpawnTemplatePrefix } ) + + local SpawnTemplate = nil + + SpawnTemplate = routines.utils.deepCopy( _DATABASE.Templates.Groups[SpawnTemplatePrefix].Template ) + + if SpawnTemplate == nil then + error( 'No Template returned for SpawnTemplatePrefix = ' .. SpawnTemplatePrefix ) + end + + SpawnTemplate.SpawnCoalitionID = self:_GetGroupCoalitionID( SpawnTemplatePrefix ) + SpawnTemplate.SpawnCategoryID = self:_GetGroupCategoryID( SpawnTemplatePrefix ) + SpawnTemplate.SpawnCountryID = self:_GetGroupCountryID( SpawnTemplatePrefix ) + + self:T( { SpawnTemplate } ) + return SpawnTemplate +end + +--- Prepares the new Group Template. +-- @param #SPAWN self +-- @param #string SpawnTemplatePrefix +-- @param #number SpawnIndex +-- @return #SPAWN self +function SPAWN:_Prepare( SpawnTemplatePrefix, SpawnIndex ) + self:F( { self.SpawnTemplatePrefix, self.SpawnAliasPrefix } ) + + local SpawnTemplate = self:_GetTemplate( SpawnTemplatePrefix ) + SpawnTemplate.name = self:SpawnGroupName( SpawnIndex ) + + SpawnTemplate.groupId = nil + SpawnTemplate.lateActivation = false + + if SpawnTemplate.SpawnCategoryID == Group.Category.GROUND then + self:T( "For ground units, visible needs to be false..." ) + SpawnTemplate.visible = false + end + + if SpawnTemplate.SpawnCategoryID == Group.Category.HELICOPTER or SpawnTemplate.SpawnCategoryID == Group.Category.AIRPLANE then + SpawnTemplate.uncontrolled = false + end + + for UnitID = 1, #SpawnTemplate.units do + SpawnTemplate.units[UnitID].name = string.format( SpawnTemplate.name .. '-%02d', UnitID ) + SpawnTemplate.units[UnitID].unitId = nil + SpawnTemplate.units[UnitID].x = SpawnTemplate.route.points[1].x + SpawnTemplate.units[UnitID].y = SpawnTemplate.route.points[1].y + end + + self:T( { "Template:", SpawnTemplate } ) + return SpawnTemplate + +end + +--- Private method randomizing the routes. +-- @param #SPAWN self +-- @param #number SpawnIndex The index of the group to be spawned. +-- @return #SPAWN +function SPAWN:_RandomizeRoute( SpawnIndex ) + self:F( { self.SpawnTemplatePrefix, SpawnIndex, self.SpawnRandomizeRoute, self.SpawnRandomizeRouteStartPoint, self.SpawnRandomizeRouteEndPoint, self.SpawnRandomizeRouteRadius } ) + + if self.SpawnRandomizeRoute then + local SpawnTemplate = self.SpawnGroups[SpawnIndex].SpawnTemplate + local RouteCount = #SpawnTemplate.route.points + + for t = self.SpawnRandomizeRouteStartPoint + 1, ( RouteCount - self.SpawnRandomizeRouteEndPoint ) do + SpawnTemplate.route.points[t].x = SpawnTemplate.route.points[t].x + math.random( self.SpawnRandomizeRouteRadius * -1, self.SpawnRandomizeRouteRadius ) + SpawnTemplate.route.points[t].y = SpawnTemplate.route.points[t].y + math.random( self.SpawnRandomizeRouteRadius * -1, self.SpawnRandomizeRouteRadius ) + -- TODO: manage altitude for airborne units ... + SpawnTemplate.route.points[t].alt = nil + --SpawnGroup.route.points[t].alt_type = nil + self:T( 'SpawnTemplate.route.points[' .. t .. '].x = ' .. SpawnTemplate.route.points[t].x .. ', SpawnTemplate.route.points[' .. t .. '].y = ' .. SpawnTemplate.route.points[t].y ) + end + end + + return self +end + +--- Private method that randomizes the template of the group. +-- @param #SPAWN self +-- @param #number SpawnIndex +-- @return #SPAWN self +function SPAWN:_RandomizeTemplate( SpawnIndex ) + self:F( { self.SpawnTemplatePrefix, SpawnIndex } ) + + if self.SpawnRandomizeTemplate then + self.SpawnGroups[SpawnIndex].SpawnTemplatePrefix = self.SpawnTemplatePrefixTable[ math.random( 1, #self.SpawnTemplatePrefixTable ) ] + self.SpawnGroups[SpawnIndex].SpawnTemplate = self:_Prepare( self.SpawnGroups[SpawnIndex].SpawnTemplatePrefix, SpawnIndex ) + self.SpawnGroups[SpawnIndex].SpawnTemplate.route = routines.utils.deepCopy( self.SpawnTemplate.route ) + self.SpawnGroups[SpawnIndex].SpawnTemplate.x = self.SpawnTemplate.x + self.SpawnGroups[SpawnIndex].SpawnTemplate.y = self.SpawnTemplate.y + self.SpawnGroups[SpawnIndex].SpawnTemplate.start_time = self.SpawnTemplate.start_time + for UnitID = 1, #self.SpawnGroups[SpawnIndex].SpawnTemplate.units do + self.SpawnGroups[SpawnIndex].SpawnTemplate.units[UnitID].heading = self.SpawnTemplate.units[1].heading + end + end + + self:_RandomizeRoute( SpawnIndex ) + + return self +end + +function SPAWN:_TranslateRotate( SpawnIndex, SpawnRootX, SpawnRootY, SpawnX, SpawnY, SpawnAngle ) + self:F( { self.SpawnTemplatePrefix, SpawnIndex, SpawnRootX, SpawnRootY, SpawnX, SpawnY, SpawnAngle } ) + + -- Translate + local TranslatedX = SpawnX + local TranslatedY = SpawnY + + -- Rotate + -- From Wikipedia: https://en.wikipedia.org/wiki/Rotation_matrix#Common_rotations + -- x' = x \cos \theta - y \sin \theta\ + -- y' = x \sin \theta + y \cos \theta\ + local RotatedX = - TranslatedX * math.cos( math.rad( SpawnAngle ) ) + + TranslatedY * math.sin( math.rad( SpawnAngle ) ) + local RotatedY = TranslatedX * math.sin( math.rad( SpawnAngle ) ) + + TranslatedY * math.cos( math.rad( SpawnAngle ) ) + + -- Assign + self.SpawnGroups[SpawnIndex].SpawnTemplate.x = SpawnRootX - RotatedX + self.SpawnGroups[SpawnIndex].SpawnTemplate.y = SpawnRootY + RotatedY + + + local SpawnUnitCount = table.getn( self.SpawnGroups[SpawnIndex].SpawnTemplate.units ) + for u = 1, SpawnUnitCount do + + -- Translate + local TranslatedX = SpawnX + local TranslatedY = SpawnY - 10 * ( u - 1 ) + + -- Rotate + local RotatedX = - TranslatedX * math.cos( math.rad( SpawnAngle ) ) + + TranslatedY * math.sin( math.rad( SpawnAngle ) ) + local RotatedY = TranslatedX * math.sin( math.rad( SpawnAngle ) ) + + TranslatedY * math.cos( math.rad( SpawnAngle ) ) + + -- Assign + self.SpawnGroups[SpawnIndex].SpawnTemplate.units[u].x = SpawnRootX - RotatedX + self.SpawnGroups[SpawnIndex].SpawnTemplate.units[u].y = SpawnRootY + RotatedY + self.SpawnGroups[SpawnIndex].SpawnTemplate.units[u].heading = self.SpawnGroups[SpawnIndex].SpawnTemplate.units[u].heading + math.rad( SpawnAngle ) + end + + return self +end + +--- Get the next index of the groups to be spawned. This function is complicated, as it is used at several spaces. +function SPAWN:_GetSpawnIndex( SpawnIndex ) + self:F( { self.SpawnTemplatePrefix, SpawnIndex, self.SpawnMaxGroups, self.SpawnMaxUnitsAlive, self.AliveUnits, #self.SpawnTemplate.units } ) + + + if ( self.SpawnMaxGroups == 0 ) or ( SpawnIndex <= self.SpawnMaxGroups ) then + if ( self.SpawnMaxUnitsAlive == 0 ) or ( self.AliveUnits < self.SpawnMaxUnitsAlive * #self.SpawnTemplate.units ) or self.UnControlled then + if SpawnIndex and SpawnIndex >= self.SpawnCount + 1 then + self.SpawnCount = self.SpawnCount + 1 + SpawnIndex = self.SpawnCount + end + self.SpawnIndex = SpawnIndex + if not self.SpawnGroups[self.SpawnIndex] then + self:_InitializeSpawnGroups( self.SpawnIndex ) + end + else + return nil + end + else + return nil + end + + return self.SpawnIndex +end + + +-- TODO Need to delete this... _DATABASE does this now ... +function SPAWN:_OnBirth( event ) + + if timer.getTime0() < timer.getAbsTime() then -- dont need to add units spawned in at the start of the mission if mist is loaded in init line + if event.initiator and event.initiator:getName() then + local EventPrefix = self:_GetPrefixFromDCSUnit( event.initiator ) + if EventPrefix == self.SpawnTemplatePrefix or ( self.SpawnAliasPrefix and EventPrefix == self.SpawnAliasPrefix ) then + self:T( { "Birth event: " .. event.initiator:getName(), event } ) + --MessageToAll( "Mission command: unit " .. SpawnTemplatePrefix .. " spawned." , 5, EventPrefix .. '/Event') + self.AliveUnits = self.AliveUnits + 1 + self:T( "Alive Units: " .. self.AliveUnits ) + end + end + end + +end + +--- Obscolete +-- @todo Need to delete this... _DATABASE does this now ... +function SPAWN:_OnDeadOrCrash( event ) + self:F( self.SpawnTemplatePrefix, event ) + + if event.initiator and event.initiator:getName() then + local EventPrefix = self:_GetPrefixFromDCSUnit( event.initiator ) + if EventPrefix == self.SpawnTemplatePrefix or ( self.SpawnAliasPrefix and EventPrefix == self.SpawnAliasPrefix ) then + self:T( { "Dead event: " .. event.initiator:getName(), event } ) +-- local DestroyedUnit = Unit.getByName( EventPrefix ) +-- if DestroyedUnit and DestroyedUnit.getLife() <= 1.0 then + --MessageToAll( "Mission command: unit " .. SpawnTemplatePrefix .. " crashed." , 5, EventPrefix .. '/Event') + self.AliveUnits = self.AliveUnits - 1 + self:T( "Alive Units: " .. self.AliveUnits ) +-- end + end + end +end + +--- Will detect AIR Units taking off... When the event takes place, the spawned Group is registered as airborne... +-- This is needed to ensure that Re-SPAWNing only is done for landed AIR Groups. +-- @todo Need to test for AIR Groups only... +function SPAWN:_OnTakeOff( event ) + self:F( self.SpawnTemplatePrefix, event ) + + if event.initiator and event.initiator:getName() then + local SpawnGroup = self:_GetGroupFromDCSUnit( event.initiator ) + if SpawnGroup then + self:T( { "TakeOff event: " .. event.initiator:getName(), event } ) + self:T( "self.Landed = false" ) + self.Landed = false + end + end +end + +--- Will detect AIR Units landing... When the event takes place, the spawned Group is registered as landed. +-- This is needed to ensure that Re-SPAWNing is only done for landed AIR Groups. +-- @todo Need to test for AIR Groups only... +function SPAWN:_OnLand( event ) + self:F( self.SpawnTemplatePrefix, event ) + + local SpawnUnit = event.initiator + if SpawnUnit and SpawnUnit:isExist() and Object.getCategory(SpawnUnit) == Object.Category.UNIT then + local SpawnGroup = self:_GetGroupFromDCSUnit( SpawnUnit ) + if SpawnGroup then + self:T( { "Landed event:" .. SpawnUnit:getName(), event } ) + self.Landed = true + self:T( "self.Landed = true" ) + if self.Landed and self.RepeatOnLanding then + local SpawnGroupIndex = self:GetSpawnIndexFromGroup( SpawnGroup ) + self:T( { "Landed:", "ReSpawn:", SpawnGroup:GetName(), SpawnGroupIndex } ) + self:ReSpawn( SpawnGroupIndex ) + end + end + end +end + +--- Will detect AIR Units shutting down their engines ... +-- When the event takes place, and the method @{RepeatOnEngineShutDown} was called, the spawned Group will Re-SPAWN. +-- But only when the Unit was registered to have landed. +-- @param #SPAWN self +-- @see _OnTakeOff +-- @see _OnLand +-- @todo Need to test for AIR Groups only... +function SPAWN:_OnEngineShutDown( event ) + self:F( self.SpawnTemplatePrefix, event ) + + local SpawnUnit = event.initiator + if SpawnUnit and SpawnUnit:isExist() and Object.getCategory(SpawnUnit) == Object.Category.UNIT then + local SpawnGroup = self:_GetGroupFromDCSUnit( SpawnUnit ) + if SpawnGroup then + self:T( { "EngineShutDown event: " .. SpawnUnit:getName(), event } ) + if self.Landed and self.RepeatOnEngineShutDown then + local SpawnGroupIndex = self:GetSpawnIndexFromGroup( SpawnGroup ) + self:T( { "EngineShutDown: ", "ReSpawn:", SpawnGroup:GetName(), SpawnGroupIndex } ) + self:ReSpawn( SpawnGroupIndex ) + end + end + end +end + +--- This function is called automatically by the Spawning scheduler. +-- It is the internal worker method SPAWNing new Groups on the defined time intervals. +function SPAWN:_Scheduler() + self:F( { "_Scheduler", self.SpawnTemplatePrefix, self.SpawnAliasPrefix, self.SpawnIndex, self.SpawnMaxGroups, self.SpawnMaxUnitsAlive } ) + + -- Validate if there are still groups left in the batch... + self:Spawn() + + return true +end + +function SPAWN:_SpawnCleanUpScheduler() + self:F( { "CleanUp Scheduler:", self.SpawnTemplatePrefix } ) + + local SpawnCursor + local SpawnGroup, SpawnCursor = self:GetFirstAliveGroup( SpawnCursor ) + + self:T( { "CleanUp Scheduler:", SpawnGroup } ) + + while SpawnGroup do + + if SpawnGroup:AllOnGround() and SpawnGroup:GetMaxVelocity() < 1 then + if not self.SpawnCleanUpTimeStamps[SpawnGroup:GetName()] then + self.SpawnCleanUpTimeStamps[SpawnGroup:GetName()] = timer.getTime() + else + if self.SpawnCleanUpTimeStamps[SpawnGroup:GetName()] + self.SpawnCleanUpInterval < timer.getTime() then + self:T( { "CleanUp Scheduler:", "Cleaning:", SpawnGroup } ) + SpawnGroup:Destroy() + end + end + else + self.SpawnCleanUpTimeStamps[SpawnGroup:GetName()] = nil + end + + SpawnGroup, SpawnCursor = self:GetNextAliveGroup( SpawnCursor ) + + self:T( { "CleanUp Scheduler:", SpawnGroup } ) + + end + + return true -- Repeat + +end +--- Limit the simultaneous movement of Groups within a running Mission. +-- This module is defined to improve the performance in missions, and to bring additional realism for GROUND vehicles. +-- Performance: If in a DCSRTE there are a lot of moving GROUND units, then in a multi player mission, this WILL create lag if +-- the main DCS execution core of your CPU is fully utilized. So, this class will limit the amount of simultaneous moving GROUND units +-- on defined intervals (currently every minute). +-- @module MOVEMENT + +Include.File( "Routines" ) + +--- the MOVEMENT class +-- @type +MOVEMENT = { + ClassName = "MOVEMENT", +} + +--- Creates the main object which is handling the GROUND forces movement. +-- @param table{string,...}|string MovePrefixes is a table of the Prefixes (names) of the GROUND Groups that need to be controlled by the MOVEMENT Object. +-- @param number MoveMaximum is a number that defines the maximum amount of GROUND Units to be moving during one minute. +-- @return MOVEMENT +-- @usage +-- -- Limit the amount of simultaneous moving units on the ground to prevent lag. +-- Movement_US_Platoons = MOVEMENT:New( { 'US Tank Platoon Left', 'US Tank Platoon Middle', 'US Tank Platoon Right', 'US CH-47D Troops' }, 15 ) + +function MOVEMENT:New( MovePrefixes, MoveMaximum ) + local self = BASE:Inherit( self, BASE:New() ) + self:F( { MovePrefixes, MoveMaximum } ) + + if type( MovePrefixes ) == 'table' then + self.MovePrefixes = MovePrefixes + else + self.MovePrefixes = { MovePrefixes } + end + self.MoveCount = 0 -- The internal counter of the amount of Moveing the has happened since MoveStart. + self.MoveMaximum = MoveMaximum -- Contains the Maximum amount of units that are allowed to move... + self.AliveUnits = 0 -- Contains the counter how many units are currently alive + self.MoveUnits = {} -- Reflects if the Moving for this MovePrefixes is going to be scheduled or not. + + _EVENTDISPATCHER:OnBirth( self.OnBirth, self ) + +-- self:AddEvent( world.event.S_EVENT_BIRTH, self.OnBirth ) +-- +-- self:EnableEvents() + + self:ScheduleStart() + + return self +end + +--- Call this function to start the MOVEMENT scheduling. +function MOVEMENT:ScheduleStart() + self:F() + --self.MoveFunction = routines.scheduleFunction( self._Scheduler, { self }, timer.getTime() + 1, 120 ) + self.MoveFunction = SCHEDULER:New( self, self._Scheduler, {}, 1, 120 ) +end + +--- Call this function to stop the MOVEMENT scheduling. +-- @todo need to implement it ... Forgot. +function MOVEMENT:ScheduleStop() + self:F() + +end + +--- Captures the birth events when new Units were spawned. +-- @todo This method should become obsolete. The new @{DATABASE} class will handle the collection administration. +function MOVEMENT:OnBirth( Event ) + self:F( { Event } ) + + if timer.getTime0() < timer.getAbsTime() then -- dont need to add units spawned in at the start of the mission if mist is loaded in init line + if Event.IniDCSUnit then + self:T( "Birth object : " .. Event.IniDCSUnitName ) + if Event.IniDCSGroup and Event.IniDCSGroup:isExist() then + for MovePrefixID, MovePrefix in pairs( self.MovePrefixes ) do + if string.find( Event.IniDCSUnitName, MovePrefix, 1, true ) then + self.AliveUnits = self.AliveUnits + 1 + self.MoveUnits[Event.IniDCSUnitName] = Event.IniDCSGroupName + self:T( self.AliveUnits ) + end + end + end + end + _EVENTDISPATCHER:OnCrashForUnit( Event.IniDCSUnitName, self.OnDeadOrCrash, self ) + _EVENTDISPATCHER:OnDeadForUnit( Event.IniDCSUnitName, self.OnDeadOrCrash, self ) + end + +end + +--- Captures the Dead or Crash events when Units crash or are destroyed. +-- @todo This method should become obsolete. The new @{DATABASE} class will handle the collection administration. +function MOVEMENT:OnDeadOrCrash( Event ) + self:F( { Event } ) + + if Event.IniDCSUnit then + self:T( "Dead object : " .. Event.IniDCSUnitName ) + for MovePrefixID, MovePrefix in pairs( self.MovePrefixes ) do + if string.find( Event.IniDCSUnitName, MovePrefix, 1, true ) then + self.AliveUnits = self.AliveUnits - 1 + self.MoveUnits[Event.IniDCSUnitName] = nil + self:T( self.AliveUnits ) + end + end + end +end + +--- This function is called automatically by the MOVEMENT scheduler. A new function is scheduled when MoveScheduled is true. +function MOVEMENT:_Scheduler() + self:F( { self.MovePrefixes, self.MoveMaximum, self.AliveUnits, self.MovementGroups } ) + + if self.AliveUnits > 0 then + local MoveProbability = ( self.MoveMaximum * 100 ) / self.AliveUnits + self:T( 'Move Probability = ' .. MoveProbability ) + + for MovementUnitName, MovementGroupName in pairs( self.MoveUnits ) do + local MovementGroup = Group.getByName( MovementGroupName ) + if MovementGroup and MovementGroup:isExist() then + local MoveOrStop = math.random( 1, 100 ) + self:T( 'MoveOrStop = ' .. MoveOrStop ) + if MoveOrStop <= MoveProbability then + self:T( 'Group continues moving = ' .. MovementGroupName ) + trigger.action.groupContinueMoving( MovementGroup ) + else + self:T( 'Group stops moving = ' .. MovementGroupName ) + trigger.action.groupStopMoving( MovementGroup ) + end + else + self.MoveUnits[MovementUnitName] = nil + end + end + end + return true +end +--- Provides defensive behaviour to a set of SAM sites within a running Mission. +-- @module Sead +-- @author to be searched on the forum +-- @author (co) Flightcontrol (Modified and enriched with functionality) + +Include.File( "Routines" ) +Include.File( "Event" ) +Include.File( "Base" ) +Include.File( "Mission" ) +Include.File( "Client" ) +Include.File( "Task" ) + +--- The SEAD class +-- @type SEAD +-- @extends Base#BASE +SEAD = { + ClassName = "SEAD", + TargetSkill = { + Average = { Evade = 50, DelayOff = { 10, 25 }, DelayOn = { 10, 30 } } , + Good = { Evade = 30, DelayOff = { 8, 20 }, DelayOn = { 20, 40 } } , + High = { Evade = 15, DelayOff = { 5, 17 }, DelayOn = { 30, 50 } } , + Excellent = { Evade = 10, DelayOff = { 3, 10 }, DelayOn = { 30, 60 } } + }, + SEADGroupPrefixes = {} +} + +--- Creates the main object which is handling defensive actions for SA sites or moving SA vehicles. +-- When an anti radiation missile is fired (KH-58, KH-31P, KH-31A, KH-25MPU, HARM missiles), the SA will shut down their radars and will take evasive actions... +-- Chances are big that the missile will miss. +-- @param table{string,...}|string SEADGroupPrefixes which is a table of Prefixes of the SA Groups in the DCSRTE on which evasive actions need to be taken. +-- @return SEAD +-- @usage +-- -- CCCP SEAD Defenses +-- -- Defends the Russian SA installations from SEAD attacks. +-- SEAD_RU_SAM_Defenses = SEAD:New( { 'RU SA-6 Kub', 'RU SA-6 Defenses', 'RU MI-26 Troops', 'RU Attack Gori' } ) +function SEAD:New( SEADGroupPrefixes ) + local self = BASE:Inherit( self, BASE:New() ) + self:F( SEADGroupPrefixes ) + if type( SEADGroupPrefixes ) == 'table' then + for SEADGroupPrefixID, SEADGroupPrefix in pairs( SEADGroupPrefixes ) do + self.SEADGroupPrefixes[SEADGroupPrefix] = SEADGroupPrefix + end + else + self.SEADGroupNames[SEADGroupPrefixes] = SEADGroupPrefixes + end + _EVENTDISPATCHER:OnShot( self.EventShot, self ) + + return self +end + +--- Detects if an SA site was shot with an anti radiation missile. In this case, take evasive actions based on the skill level set within the ME. +-- @see SEAD +function SEAD:EventShot( Event ) + self:F( { Event } ) + + local SEADUnit = Event.IniDCSUnit + local SEADUnitName = Event.IniDCSUnitName + local SEADWeapon = Event.Weapon -- Identify the weapon fired + local SEADWeaponName = Event.WeaponName -- return weapon type + --trigger.action.outText( string.format("Alerte, depart missile " ..string.format(SEADWeaponName)), 20) --debug message + -- Start of the 2nd loop + self:T( "Missile Launched = " .. SEADWeaponName ) + if SEADWeaponName == "KH-58" or SEADWeaponName == "KH-25MPU" or SEADWeaponName == "AGM-88" or SEADWeaponName == "KH-31A" or SEADWeaponName == "KH-31P" then -- Check if the missile is a SEAD + local _evade = math.random (1,100) -- random number for chance of evading action + local _targetMim = Event.Weapon:getTarget() -- Identify target + local _targetMimname = Unit.getName(_targetMim) + local _targetMimgroup = Unit.getGroup(Weapon.getTarget(SEADWeapon)) + local _targetMimgroupName = _targetMimgroup:getName() + local _targetMimcont= _targetMimgroup:getController() + local _targetskill = _DATABASE.Templates.Units[_targetMimname].Template.skill + self:T( self.SEADGroupPrefixes ) + self:T( _targetMimgroupName ) + local SEADGroupFound = false + for SEADGroupPrefixID, SEADGroupPrefix in pairs( self.SEADGroupPrefixes ) do + if string.find( _targetMimgroupName, SEADGroupPrefix, 1, true ) then + SEADGroupFound = true + self:T( 'Group Found' ) + break + end + end + if SEADGroupFound == true then + if _targetskill == "Random" then -- when skill is random, choose a skill + local Skills = { "Average", "Good", "High", "Excellent" } + _targetskill = Skills[ math.random(1,4) ] + end + self:T( _targetskill ) -- debug message for skill check + if self.TargetSkill[_targetskill] then + if (_evade > self.TargetSkill[_targetskill].Evade) then + self:T( string.format("Evading, target skill " ..string.format(_targetskill)) ) --debug message + local _targetMim = Weapon.getTarget(SEADWeapon) + local _targetMimname = Unit.getName(_targetMim) + local _targetMimgroup = Unit.getGroup(Weapon.getTarget(SEADWeapon)) + local _targetMimcont= _targetMimgroup:getController() + routines.groupRandomDistSelf(_targetMimgroup,300,'Diamond',250,20) -- move randomly + local SuppressedGroups1 = {} -- unit suppressed radar off for a random time + local function SuppressionEnd1(id) + id.ctrl:setOption(AI.Option.Ground.id.ALARM_STATE,AI.Option.Ground.val.ALARM_STATE.GREEN) + SuppressedGroups1[id.groupName] = nil + end + local id = { + groupName = _targetMimgroup, + ctrl = _targetMimcont + } + local delay1 = math.random(self.TargetSkill[_targetskill].DelayOff[1], self.TargetSkill[_targetskill].DelayOff[2]) + if SuppressedGroups1[id.groupName] == nil then + SuppressedGroups1[id.groupName] = { + SuppressionEndTime1 = timer.getTime() + delay1, + SuppressionEndN1 = SuppressionEndCounter1 --Store instance of SuppressionEnd() scheduled function + } + Controller.setOption(_targetMimcont, AI.Option.Ground.id.ALARM_STATE,AI.Option.Ground.val.ALARM_STATE.GREEN) + timer.scheduleFunction(SuppressionEnd1, id, SuppressedGroups1[id.groupName].SuppressionEndTime1) --Schedule the SuppressionEnd() function + --trigger.action.outText( string.format("Radar Off " ..string.format(delay1)), 20) + end + + local SuppressedGroups = {} + local function SuppressionEnd(id) + id.ctrl:setOption(AI.Option.Ground.id.ALARM_STATE,AI.Option.Ground.val.ALARM_STATE.RED) + SuppressedGroups[id.groupName] = nil + end + local id = { + groupName = _targetMimgroup, + ctrl = _targetMimcont + } + local delay = math.random(self.TargetSkill[_targetskill].DelayOn[1], self.TargetSkill[_targetskill].DelayOn[2]) + if SuppressedGroups[id.groupName] == nil then + SuppressedGroups[id.groupName] = { + SuppressionEndTime = timer.getTime() + delay, + SuppressionEndN = SuppressionEndCounter --Store instance of SuppressionEnd() scheduled function + } + timer.scheduleFunction(SuppressionEnd, id, SuppressedGroups[id.groupName].SuppressionEndTime) --Schedule the SuppressionEnd() function + --trigger.action.outText( string.format("Radar On " ..string.format(delay)), 20) + end + end + end + end + end +end +--- Taking the lead of AI escorting your flight. +-- +-- @{#ESCORT} class +-- ================ +-- The @{#ESCORT} class allows you to interact with escorting AI on your flight and take the lead. +-- Each escorting group can be commanded with a whole set of radio commands (radio menu in your flight, and then F10). +-- +-- The radio commands will vary according the category of the group. The richest set of commands are with Helicopters and AirPlanes. +-- Ships and Ground troops will have a more limited set, but they can provide support through the bombing of targets designated by the other escorts. +-- +-- RADIO MENUs that can be created: +-- ================================ +-- Find a summary below of the current available commands: +-- +-- Navigation ...: +-- --------------- +-- Escort group navigation functions: +-- +-- * **"Join-Up and Follow at x meters":** The escort group fill follow you at about x meters, and they will follow you. +-- * **"Flare":** Provides menu commands to let the escort group shoot a flare in the air in a color. +-- * **"Smoke":** Provides menu commands to let the escort group smoke the air in a color. Note that smoking is only available for ground and naval troops. +-- +-- Hold position ...: +-- ------------------ +-- Escort group navigation functions: +-- +-- * **"At current location":** Stops the escort group and they will hover 30 meters above the ground at the position they stopped. +-- * **"At client location":** Stops the escort group and they will hover 30 meters above the ground at the position they stopped. +-- +-- Report targets ...: +-- ------------------- +-- Report targets will make the escort group to report any target that it identifies within a 8km range. Any detected target can be attacked using the 4. Attack nearby targets function. (see below). +-- +-- * **"Report now":** Will report the current detected targets. +-- * **"Report targets on":** Will make the escort group to report detected targets and will fill the "Attack nearby targets" menu list. +-- * **"Report targets off":** Will stop detecting targets. +-- +-- Scan targets ...: +-- ----------------- +-- Menu items to pop-up the escort group for target scanning. After scanning, the escort group will resume with the mission or defined task. +-- +-- * **"Scan targets 30 seconds":** Scan 30 seconds for targets. +-- * **"Scan targets 60 seconds":** Scan 60 seconds for targets. +-- +-- Attack targets ...: +-- ------------------- +-- This menu item will list all detected targets within a 15km range. Depending on the level of detection (known/unknown) and visuality, the targets type will also be listed. +-- +-- Request assistance from ...: +-- ---------------------------- +-- This menu item will list all detected targets within a 15km range, as with the menu item **Attack Targets**. +-- This menu item allows to request attack support from other escorts supporting the current client group. +-- eg. the function allows a player to request support from the Ship escort to attack a target identified by the Plane escort with its Tomahawk missiles. +-- eg. the function allows a player to request support from other Planes escorting to bomb the unit with illumination missiles or bombs, so that the main plane escort can attack the area. +-- +-- ROE ...: +-- -------- +-- Sets the Rules of Engagement (ROE) of the escort group when in flight. +-- +-- * **"Hold Fire":** The escort group will hold fire. +-- * **"Return Fire":** The escort group will return fire. +-- * **"Open Fire":** The escort group will open fire on designated targets. +-- * **"Weapon Free":** The escort group will engage with any target. +-- +-- Evasion ...: +-- ------------ +-- Will define the evasion techniques that the escort group will perform during flight or combat. +-- +-- * **"Fight until death":** The escort group will have no reaction to threats. +-- * **"Use flares, chaff and jammers":** The escort group will use passive defense using flares and jammers. No evasive manoeuvres are executed. +-- * **"Evade enemy fire":** The rescort group will evade enemy fire before firing. +-- * **"Go below radar and evade fire":** The escort group will perform evasive vertical manoeuvres. +-- +-- Resume Mission ...: +-- ------------------- +-- Escort groups can have their own mission. This menu item will allow the escort group to resume their Mission from a given waypoint. +-- Note that this is really fantastic, as you now have the dynamic of taking control of the escort groups, and allowing them to resume their path or mission. +-- +-- ESCORT construction methods. +-- ============================ +-- Create a new SPAWN object with the @{#ESCORT.New} method: +-- +-- * @{#ESCORT.New}: Creates a new ESCORT object from a @{Group#GROUP} for a @{Client#CLIENT}, with an optional briefing text. +-- +-- ESCORT initialization methods. +-- ============================== +-- The following menus are created within the RADIO MENU of an active unit hosted by a player: +-- +-- * @{#ESCORT.MenuFollowAt}: Creates a menu to make the escort follow the client. +-- * @{#ESCORT.MenuHoldAtEscortPosition}: Creates a menu to hold the escort at its current position. +-- * @{#ESCORT.MenuHoldAtLeaderPosition}: Creates a menu to hold the escort at the client position. +-- * @{#ESCORT.MenuScanForTargets}: Creates a menu so that the escort scans targets. +-- * @{#ESCORT.MenuFlare}: Creates a menu to disperse flares. +-- * @{#ESCORT.MenuSmoke}: Creates a menu to disparse smoke. +-- * @{#ESCORT.MenuReportTargets}: Creates a menu so that the escort reports targets. +-- * @{#ESCORT.MenuReportPosition}: Creates a menu so that the escort reports its current position from bullseye. +-- * @{#ESCORT.MenuAssistedAttack: Creates a menu so that the escort supportes assisted attack from other escorts with the client. +-- * @{#ESCORT.MenuROE: Creates a menu structure to set the rules of engagement of the escort. +-- * @{#ESCORT.MenuEvasion: Creates a menu structure to set the evasion techniques when the escort is under threat. +-- * @{#ESCORT.MenuResumeMission}: Creates a menu structure so that the escort can resume from a waypoint. +-- +-- @module Escort +-- @author FlightControl + +Include.File( "Routines" ) +Include.File( "Base" ) +Include.File( "Database" ) +Include.File( "Group" ) +Include.File( "Zone" ) + +--- +-- @type ESCORT +-- @extends Base#BASE +-- @field Client#CLIENT EscortClient +-- @field Group#GROUP EscortGroup +-- @field #string EscortName +-- @field #ESCORT.MODE EscortMode The mode the escort is in. +-- @field #number FollowScheduler The id of the _FollowScheduler function. +-- @field #boolean ReportTargets If true, nearby targets are reported. +-- @Field DCSTypes#AI.Option.Air.val.ROE OptionROE Which ROE is set to the EscortGroup. +-- @field DCSTypes#AI.Option.Air.val.REACTION_ON_THREAT OptionReactionOnThreat Which REACTION_ON_THREAT is set to the EscortGroup. +-- @field Menu#MENU_CLIENT EscortMenuResumeMission +ESCORT = { + ClassName = "ESCORT", + EscortName = nil, -- The Escort Name + EscortClient = nil, + EscortGroup = nil, + EscortMode = nil, + MODE = { + FOLLOW = 1, + MISSION = 2, + }, + Targets = {}, -- The identified targets + FollowScheduler = nil, + ReportTargets = true, + OptionROE = AI.Option.Air.val.ROE.OPEN_FIRE, + OptionReactionOnThreat = AI.Option.Air.val.REACTION_ON_THREAT.ALLOW_ABORT_MISSION, + TaskPoints = {} +} + +--- ESCORT.Mode class +-- @type ESCORT.MODE +-- @field #number FOLLOW +-- @field #number MISSION + +--- MENUPARAM type +-- @type MENUPARAM +-- @field #ESCORT ParamSelf +-- @field #Distance ParamDistance +-- @field #function ParamFunction +-- @field #string ParamMessage + +--- ESCORT class constructor for an AI group +-- @param #ESCORT self +-- @param Client#CLIENT EscortClient The client escorted by the EscortGroup. +-- @param Group#GROUP EscortGroup The group AI escorting the EscortClient. +-- @param #string EscortName Name of the escort. +-- @return #ESCORT self +function ESCORT:New( EscortClient, EscortGroup, EscortName, EscortBriefing ) + local self = BASE:Inherit( self, BASE:New() ) + self:F( { EscortClient, EscortGroup, EscortName } ) + + self.EscortClient = EscortClient -- Client#CLIENT + self.EscortGroup = EscortGroup -- Group#GROUP + self.EscortName = EscortName + self.EscortBriefing = EscortBriefing + + self:T( EscortGroup:GetClassNameAndID() ) + + -- Set EscortGroup known at EscortClient. + if not self.EscortClient._EscortGroups then + self.EscortClient._EscortGroups = {} + end + + if not self.EscortClient._EscortGroups[EscortGroup:GetName()] then + self.EscortClient._EscortGroups[EscortGroup:GetName()] = {} + self.EscortClient._EscortGroups[EscortGroup:GetName()].EscortGroup = self.EscortGroup + self.EscortClient._EscortGroups[EscortGroup:GetName()].EscortName = self.EscortName + self.EscortClient._EscortGroups[EscortGroup:GetName()].Targets = {} + self.EscortMode = ESCORT.MODE.FOLLOW + end + + + self.EscortMenu = MENU_CLIENT:New( self.EscortClient, self.EscortName ) + + self.EscortGroup:WayPointInitialize(1) + + self.EscortGroup:OptionROTVertical() + self.EscortGroup:OptionROEOpenFire() + + EscortGroup:MessageToClient( EscortGroup:GetCategoryName() .. " '" .. EscortName .. "' (" .. EscortGroup:GetCallsign() .. ") reporting! " .. + "We're escorting your flight. " .. + "Use the Radio Menu and F10 and use the options under + " .. EscortName .. "\n", + 60, EscortClient + ) + + return self +end + + +--- Defines the default menus +-- @param #ESCORT self +-- @return #ESCORT +function ESCORT:Menus() + self:F() + + self:MenuFollowAt( 100 ) + self:MenuFollowAt( 200 ) + self:MenuFollowAt( 300 ) + self:MenuFollowAt( 400 ) + + self:MenuScanForTargets( 100, 60 ) + + self:MenuHoldAtEscortPosition( 30 ) + self:MenuHoldAtLeaderPosition( 30 ) + + self:MenuFlare() + self:MenuSmoke() + + self:MenuReportTargets( 60 ) + self:MenuAssistedAttack() + self:MenuROE() + self:MenuEvasion() + self:MenuResumeMission() + + return self +end + + + +--- Defines a menu slot to let the escort Join and Follow you at a certain distance. +-- This menu will appear under **Navigation**. +-- @param #ESCORT self +-- @param DCSTypes#Distance Distance The distance in meters that the escort needs to follow the client. +-- @return #ESCORT +function ESCORT:MenuFollowAt( Distance ) + self:F(Distance) + + if self.EscortGroup:IsAir() then + if not self.EscortMenuReportNavigation then + self.EscortMenuReportNavigation = MENU_CLIENT:New( self.EscortClient, "Navigation", self.EscortMenu ) + end + + if not self.EscortMenuJoinUpAndFollow then + self.EscortMenuJoinUpAndFollow = {} + end + + self.EscortMenuJoinUpAndFollow[#self.EscortMenuJoinUpAndFollow+1] = MENU_CLIENT_COMMAND:New( self.EscortClient, "Join-Up and Follow at " .. Distance, self.EscortMenuReportNavigation, ESCORT._JoinUpAndFollow, { ParamSelf = self, ParamDistance = Distance } ) + + self.EscortMode = ESCORT.MODE.FOLLOW + end + + return self +end + +--- Defines a menu slot to let the escort hold at their current position and stay low with a specified height during a specified time in seconds. +-- This menu will appear under **Hold position**. +-- @param #ESCORT self +-- @param DCSTypes#Distance Height Optional parameter that sets the height in meters to let the escort orbit at the current location. The default value is 30 meters. +-- @param DCSTypes#Time Seconds Optional parameter that lets the escort orbit at the current position for a specified time. (not implemented yet). The default value is 0 seconds, meaning, that the escort will orbit forever until a sequent command is given. +-- @param #string MenuTextFormat Optional parameter that shows the menu option text. The text string is formatted, and should contain two %d tokens in the string. The first for the Height, the second for the Time (if given). If no text is given, the default text will be displayed. +-- @return #ESCORT +-- TODO: Implement Seconds parameter. Challenge is to first develop the "continue from last activity" function. +function ESCORT:MenuHoldAtEscortPosition( Height, Seconds, MenuTextFormat ) + self:F( { Height, Seconds, MenuTextFormat } ) + + if self.EscortGroup:IsAir() then + + if not self.EscortMenuHold then + self.EscortMenuHold = MENU_CLIENT:New( self.EscortClient, "Hold position", self.EscortMenu ) + end + + if not Height then + Height = 30 + end + + if not Seconds then + Seconds = 0 + end + + local MenuText = "" + if not MenuTextFormat then + if Seconds == 0 then + MenuText = string.format( "Hold at %d meter", Height ) + else + MenuText = string.format( "Hold at %d meter for %d seconds", Height, Seconds ) + end + else + if Seconds == 0 then + MenuText = string.format( MenuTextFormat, Height ) + else + MenuText = string.format( MenuTextFormat, Height, Seconds ) + end + end + + if not self.EscortMenuHoldPosition then + self.EscortMenuHoldPosition = {} + end + + self.EscortMenuHoldPosition[#self.EscortMenuHoldPosition+1] = MENU_CLIENT_COMMAND + :New( + self.EscortClient, + MenuText, + self.EscortMenuHold, + ESCORT._HoldPosition, + { ParamSelf = self, + ParamOrbitGroup = self.EscortGroup, + ParamHeight = Height, + ParamSeconds = Seconds + } + ) + end + + return self +end + + +--- Defines a menu slot to let the escort hold at the client position and stay low with a specified height during a specified time in seconds. +-- This menu will appear under **Navigation**. +-- @param #ESCORT self +-- @param DCSTypes#Distance Height Optional parameter that sets the height in meters to let the escort orbit at the current location. The default value is 30 meters. +-- @param DCSTypes#Time Seconds Optional parameter that lets the escort orbit at the current position for a specified time. (not implemented yet). The default value is 0 seconds, meaning, that the escort will orbit forever until a sequent command is given. +-- @param #string MenuTextFormat Optional parameter that shows the menu option text. The text string is formatted, and should contain one or two %d tokens in the string. The first for the Height, the second for the Time (if given). If no text is given, the default text will be displayed. +-- @return #ESCORT +-- TODO: Implement Seconds parameter. Challenge is to first develop the "continue from last activity" function. +function ESCORT:MenuHoldAtLeaderPosition( Height, Seconds, MenuTextFormat ) + self:F( { Height, Seconds, MenuTextFormat } ) + + if self.EscortGroup:IsAir() then + + if not self.EscortMenuHold then + self.EscortMenuHold = MENU_CLIENT:New( self.EscortClient, "Hold position", self.EscortMenu ) + end + + if not Height then + Height = 30 + end + + if not Seconds then + Seconds = 0 + end + + local MenuText = "" + if not MenuTextFormat then + if Seconds == 0 then + MenuText = string.format( "Rejoin and hold at %d meter", Height ) + else + MenuText = string.format( "Rejoin and hold at %d meter for %d seconds", Height, Seconds ) + end + else + if Seconds == 0 then + MenuText = string.format( MenuTextFormat, Height ) + else + MenuText = string.format( MenuTextFormat, Height, Seconds ) + end + end + + if not self.EscortMenuHoldAtLeaderPosition then + self.EscortMenuHoldAtLeaderPosition = {} + end + + self.EscortMenuHoldAtLeaderPosition[#self.EscortMenuHoldAtLeaderPosition+1] = MENU_CLIENT_COMMAND + :New( + self.EscortClient, + MenuText, + self.EscortMenuHold, + ESCORT._HoldPosition, + { ParamSelf = self, + ParamOrbitGroup = self.EscortClient, + ParamHeight = Height, + ParamSeconds = Seconds + } + ) + end + + return self +end + +--- Defines a menu slot to let the escort scan for targets at a certain height for a certain time in seconds. +-- This menu will appear under **Scan targets**. +-- @param #ESCORT self +-- @param DCSTypes#Distance Height Optional parameter that sets the height in meters to let the escort orbit at the current location. The default value is 30 meters. +-- @param DCSTypes#Time Seconds Optional parameter that lets the escort orbit at the current position for a specified time. (not implemented yet). The default value is 0 seconds, meaning, that the escort will orbit forever until a sequent command is given. +-- @param #string MenuTextFormat Optional parameter that shows the menu option text. The text string is formatted, and should contain one or two %d tokens in the string. The first for the Height, the second for the Time (if given). If no text is given, the default text will be displayed. +-- @return #ESCORT +function ESCORT:MenuScanForTargets( Height, Seconds, MenuTextFormat ) + self:F( { Height, Seconds, MenuTextFormat } ) + + if self.EscortGroup:IsAir() then + if not self.EscortMenuScan then + self.EscortMenuScan = MENU_CLIENT:New( self.EscortClient, "Scan for targets", self.EscortMenu ) + end + + if not Height then + Height = 100 + end + + if not Seconds then + Seconds = 30 + end + + local MenuText = "" + if not MenuTextFormat then + if Seconds == 0 then + MenuText = string.format( "At %d meter", Height ) + else + MenuText = string.format( "At %d meter for %d seconds", Height, Seconds ) + end + else + if Seconds == 0 then + MenuText = string.format( MenuTextFormat, Height ) + else + MenuText = string.format( MenuTextFormat, Height, Seconds ) + end + end + + if not self.EscortMenuScanForTargets then + self.EscortMenuScanForTargets = {} + end + + self.EscortMenuScanForTargets[#self.EscortMenuScanForTargets+1] = MENU_CLIENT_COMMAND + :New( + self.EscortClient, + MenuText, + self.EscortMenuScan, + ESCORT._ScanTargets, + { ParamSelf = self, + ParamScanDuration = 30 + } + ) + end + + return self +end + + + +--- Defines a menu slot to let the escort disperse a flare in a certain color. +-- This menu will appear under **Navigation**. +-- The flare will be fired from the first unit in the group. +-- @param #ESCORT self +-- @param #string MenuTextFormat Optional parameter that shows the menu option text. If no text is given, the default text will be displayed. +-- @return #ESCORT +function ESCORT:MenuFlare( MenuTextFormat ) + self:F() + + if not self.EscortMenuReportNavigation then + self.EscortMenuReportNavigation = MENU_CLIENT:New( self.EscortClient, "Navigation", self.EscortMenu ) + end + + local MenuText = "" + if not MenuTextFormat then + MenuText = "Flare" + else + MenuText = MenuTextFormat + end + + if not self.EscortMenuFlare then + self.EscortMenuFlare = MENU_CLIENT:New( self.EscortClient, MenuText, self.EscortMenuReportNavigation, ESCORT._Flare, { ParamSelf = self } ) + self.EscortMenuFlareGreen = MENU_CLIENT_COMMAND:New( self.EscortClient, "Release green flare", self.EscortMenuFlare, ESCORT._Flare, { ParamSelf = self, ParamColor = UNIT.FlareColor.Green, ParamMessage = "Released a green flare!" } ) + self.EscortMenuFlareRed = MENU_CLIENT_COMMAND:New( self.EscortClient, "Release red flare", self.EscortMenuFlare, ESCORT._Flare, { ParamSelf = self, ParamColor = UNIT.FlareColor.Red, ParamMessage = "Released a red flare!" } ) + self.EscortMenuFlareWhite = MENU_CLIENT_COMMAND:New( self.EscortClient, "Release white flare", self.EscortMenuFlare, ESCORT._Flare, { ParamSelf = self, ParamColor = UNIT.FlareColor.White, ParamMessage = "Released a white flare!" } ) + self.EscortMenuFlareYellow = MENU_CLIENT_COMMAND:New( self.EscortClient, "Release yellow flare", self.EscortMenuFlare, ESCORT._Flare, { ParamSelf = self, ParamColor = UNIT.FlareColor.Yellow, ParamMessage = "Released a yellow flare!" } ) + end + + return self +end + +--- Defines a menu slot to let the escort disperse a smoke in a certain color. +-- This menu will appear under **Navigation**. +-- Note that smoke menu options will only be displayed for ships and ground units. Not for air units. +-- The smoke will be fired from the first unit in the group. +-- @param #ESCORT self +-- @param #string MenuTextFormat Optional parameter that shows the menu option text. If no text is given, the default text will be displayed. +-- @return #ESCORT +function ESCORT:MenuSmoke( MenuTextFormat ) + self:F() + + if not self.EscortGroup:IsAir() then + if not self.EscortMenuReportNavigation then + self.EscortMenuReportNavigation = MENU_CLIENT:New( self.EscortClient, "Navigation", self.EscortMenu ) + end + + local MenuText = "" + if not MenuTextFormat then + MenuText = "Smoke" + else + MenuText = MenuTextFormat + end + + if not self.EscortMenuSmoke then + self.EscortMenuSmoke = MENU_CLIENT:New( self.EscortClient, "Smoke", self.EscortMenuReportNavigation, ESCORT._Smoke, { ParamSelf = self } ) + self.EscortMenuSmokeGreen = MENU_CLIENT_COMMAND:New( self.EscortClient, "Release green smoke", self.EscortMenuSmoke, ESCORT._Smoke, { ParamSelf = self, ParamColor = UNIT.SmokeColor.Green, ParamMessage = "Releasing green smoke!" } ) + self.EscortMenuSmokeRed = MENU_CLIENT_COMMAND:New( self.EscortClient, "Release red smoke", self.EscortMenuSmoke, ESCORT._Smoke, { ParamSelf = self, ParamColor = UNIT.SmokeColor.Red, ParamMessage = "Releasing red smoke!" } ) + self.EscortMenuSmokeWhite = MENU_CLIENT_COMMAND:New( self.EscortClient, "Release white smoke", self.EscortMenuSmoke, ESCORT._Smoke, { ParamSelf = self, ParamColor = UNIT.SmokeColor.White, ParamMessage = "Releasing white smoke!" } ) + self.EscortMenuSmokeOrange = MENU_CLIENT_COMMAND:New( self.EscortClient, "Release orange smoke", self.EscortMenuSmoke, ESCORT._Smoke, { ParamSelf = self, ParamColor = UNIT.SmokeColor.Orange, ParamMessage = "Releasing orange smoke!" } ) + self.EscortMenuSmokeBlue = MENU_CLIENT_COMMAND:New( self.EscortClient, "Release blue smoke", self.EscortMenuSmoke, ESCORT._Smoke, { ParamSelf = self, ParamColor = UNIT.SmokeColor.Blue, ParamMessage = "Releasing blue smoke!" } ) + end + end + + return self +end + +--- Defines a menu slot to let the escort report their current detected targets with a specified time interval in seconds. +-- This menu will appear under **Report targets**. +-- Note that if a report targets menu is not specified, no targets will be detected by the escort, and the attack and assisted attack menus will not be displayed. +-- @param #ESCORT self +-- @param DCSTypes#Time Seconds Optional parameter that lets the escort report their current detected targets after specified time interval in seconds. The default time is 30 seconds. +-- @return #ESCORT +function ESCORT:MenuReportTargets( Seconds ) + self:F( { Seconds } ) + + if not self.EscortMenuReportNearbyTargets then + self.EscortMenuReportNearbyTargets = MENU_CLIENT:New( self.EscortClient, "Report targets", self.EscortMenu ) + end + + if not Seconds then + Seconds = 30 + end + + -- Report Targets + self.EscortMenuReportNearbyTargetsNow = MENU_CLIENT_COMMAND:New( self.EscortClient, "Report targets now!", self.EscortMenuReportNearbyTargets, ESCORT._ReportNearbyTargetsNow, { ParamSelf = self } ) + self.EscortMenuReportNearbyTargetsOn = MENU_CLIENT_COMMAND:New( self.EscortClient, "Report targets on", self.EscortMenuReportNearbyTargets, ESCORT._SwitchReportNearbyTargets, { ParamSelf = self, ParamReportTargets = true } ) + self.EscortMenuReportNearbyTargetsOff = MENU_CLIENT_COMMAND:New( self.EscortClient, "Report targets off", self.EscortMenuReportNearbyTargets, ESCORT._SwitchReportNearbyTargets, { ParamSelf = self, ParamReportTargets = false, } ) + + -- Attack Targets + self.EscortMenuAttackNearbyTargets = MENU_CLIENT:New( self.EscortClient, "Attack targets", self.EscortMenu ) + + + --self.ReportTargetsScheduler = routines.scheduleFunction( self._ReportTargetsScheduler, { self }, timer.getTime() + 1, Seconds ) + self.ReportTargetsScheduler = SCHEDULER:New( self, self._ReportTargetsScheduler, {}, 1, Seconds ) + + return self +end + +--- Defines a menu slot to let the escort attack its detected targets using assisted attack from another escort joined also with the client. +-- This menu will appear under **Request assistance from**. +-- Note that this method needs to be preceded with the method MenuReportTargets. +-- @param #ESCORT self +-- @return #ESCORT +function ESCORT:MenuAssistedAttack() + self:F() + + -- Request assistance from other escorts. + -- This is very useful to let f.e. an escorting ship attack a target detected by an escorting plane... + self.EscortMenuTargetAssistance = MENU_CLIENT:New( self.EscortClient, "Request assistance from", self.EscortMenu ) + + return self +end + +--- Defines a menu to let the escort set its rules of engagement. +-- All rules of engagement will appear under the menu **ROE**. +-- @param #ESCORT self +-- @return #ESCORT +function ESCORT:MenuROE( MenuTextFormat ) + self:F( MenuTextFormat ) + + if not self.EscortMenuROE then + -- Rules of Engagement + self.EscortMenuROE = MENU_CLIENT:New( self.EscortClient, "ROE", self.EscortMenu ) + if self.EscortGroup:OptionROEHoldFirePossible() then + self.EscortMenuROEHoldFire = MENU_CLIENT_COMMAND:New( self.EscortClient, "Hold Fire", self.EscortMenuROE, ESCORT._ROE, { ParamSelf = self, ParamFunction = self.EscortGroup:OptionROEHoldFire(), ParamMessage = "Holding weapons!" } ) + end + if self.EscortGroup:OptionROEReturnFirePossible() then + self.EscortMenuROEReturnFire = MENU_CLIENT_COMMAND:New( self.EscortClient, "Return Fire", self.EscortMenuROE, ESCORT._ROE, { ParamSelf = self, ParamFunction = self.EscortGroup:OptionROEReturnFire(), ParamMessage = "Returning fire!" } ) + end + if self.EscortGroup:OptionROEOpenFirePossible() then + self.EscortMenuROEOpenFire = MENU_CLIENT_COMMAND:New( self.EscortClient, "Open Fire", self.EscortMenuROE, ESCORT._ROE, { ParamSelf = self, ParamFunction = self.EscortGroup:OptionROEOpenFire(), ParamMessage = "Opening fire on designated targets!!" } ) + end + if self.EscortGroup:OptionROEWeaponFreePossible() then + self.EscortMenuROEWeaponFree = MENU_CLIENT_COMMAND:New( self.EscortClient, "Weapon Free", self.EscortMenuROE, ESCORT._ROE, { ParamSelf = self, ParamFunction = self.EscortGroup:OptionROEWeaponFree(), ParamMessage = "Opening fire on targets of opportunity!" } ) + end + end + + return self +end + + +--- Defines a menu to let the escort set its evasion when under threat. +-- All rules of engagement will appear under the menu **Evasion**. +-- @param #ESCORT self +-- @return #ESCORT +function ESCORT:MenuEvasion( MenuTextFormat ) + self:F( MenuTextFormat ) + + if self.EscortGroup:IsAir() then + if not self.EscortMenuEvasion then + -- Reaction to Threats + self.EscortMenuEvasion = MENU_CLIENT:New( self.EscortClient, "Evasion", self.EscortMenu ) + if self.EscortGroup:OptionROTNoReactionPossible() then + self.EscortMenuEvasionNoReaction = MENU_CLIENT_COMMAND:New( self.EscortClient, "Fight until death", self.EscortMenuEvasion, ESCORT._ROT, { ParamSelf = self, ParamFunction = self.EscortGroup:OptionROTNoReaction(), ParamMessage = "Fighting until death!" } ) + end + if self.EscortGroup:OptionROTPassiveDefensePossible() then + self.EscortMenuEvasionPassiveDefense = MENU_CLIENT_COMMAND:New( self.EscortClient, "Use flares, chaff and jammers", self.EscortMenuEvasion, ESCORT._ROT, { ParamSelf = self, ParamFunction = self.EscortGroup:OptionROTPassiveDefense(), ParamMessage = "Defending using jammers, chaff and flares!" } ) + end + if self.EscortGroup:OptionROTEvadeFirePossible() then + self.EscortMenuEvasionEvadeFire = MENU_CLIENT_COMMAND:New( self.EscortClient, "Evade enemy fire", self.EscortMenuEvasion, ESCORT._ROT, { ParamSelf = self, ParamFunction = self.EscortGroup:OptionROTEvadeFire(), ParamMessage = "Evading on enemy fire!" } ) + end + if self.EscortGroup:OptionROTVerticalPossible() then + self.EscortMenuOptionEvasionVertical = MENU_CLIENT_COMMAND:New( self.EscortClient, "Go below radar and evade fire", self.EscortMenuEvasion, ESCORT._ROT, { ParamSelf = self, ParamFunction = self.EscortGroup:OptionROTVertical(), ParamMessage = "Evading on enemy fire with vertical manoeuvres!" } ) + end + end + end + + return self +end + +--- Defines a menu to let the escort resume its mission from a waypoint on its route. +-- All rules of engagement will appear under the menu **Resume mission from**. +-- @param #ESCORT self +-- @return #ESCORT +function ESCORT:MenuResumeMission() + self:F() + + if not self.EscortMenuResumeMission then + -- Mission Resume Menu Root + self.EscortMenuResumeMission = MENU_CLIENT:New( self.EscortClient, "Resume mission from", self.EscortMenu ) + end + + return self +end + + +--- @param #MENUPARAM MenuParam +function ESCORT._HoldPosition( MenuParam ) + + local self = MenuParam.ParamSelf + local EscortGroup = self.EscortGroup + local EscortClient = self.EscortClient + + local OrbitGroup = MenuParam.ParamOrbitGroup -- Group#GROUP + local OrbitUnit = OrbitGroup:GetUnit(1) -- Unit#UNIT + local OrbitHeight = MenuParam.ParamHeight + local OrbitSeconds = MenuParam.ParamSeconds -- Not implemented yet + + routines.removeFunction( self.FollowScheduler ) + + local PointFrom = {} + local GroupPoint = EscortGroup:GetUnit(1):GetPointVec3() + PointFrom = {} + PointFrom.x = GroupPoint.x + PointFrom.y = GroupPoint.z + PointFrom.speed = 250 + PointFrom.type = AI.Task.WaypointType.TURNING_POINT + PointFrom.alt = GroupPoint.y + PointFrom.alt_type = AI.Task.AltitudeType.BARO + + local OrbitPoint = OrbitUnit:GetPointVec2() + local PointTo = {} + PointTo.x = OrbitPoint.x + PointTo.y = OrbitPoint.y + PointTo.speed = 250 + PointTo.type = AI.Task.WaypointType.TURNING_POINT + PointTo.alt = OrbitHeight + PointTo.alt_type = AI.Task.AltitudeType.BARO + PointTo.task = EscortGroup:TaskOrbitCircleAtVec2( OrbitPoint, OrbitHeight, 0 ) + + local Points = { PointFrom, PointTo } + + EscortGroup:OptionROEHoldFire() + EscortGroup:OptionROTPassiveDefense() + + EscortGroup:SetTask( EscortGroup:TaskRoute( Points ) ) + EscortGroup:MessageToClient( "Orbiting at location.", 10, EscortClient ) +end + +--- @param #MENUPARAM MenuParam +function ESCORT._JoinUpAndFollow( MenuParam ) + + local self = MenuParam.ParamSelf + local EscortGroup = self.EscortGroup + local EscortClient = self.EscortClient + + self.Distance = MenuParam.ParamDistance + + self:JoinUpAndFollow( EscortGroup, EscortClient, self.Distance ) +end + +--- JoinsUp and Follows a CLIENT. +-- @param Escort#ESCORT self +-- @param Group#GROUP EscortGroup +-- @param Client#CLIENT EscortClient +-- @param DCSTypes#Distance Distance +function ESCORT:JoinUpAndFollow( EscortGroup, EscortClient, Distance ) + self:F( { EscortGroup, EscortClient, Distance } ) + + if self.FollowScheduler then + routines.removeFunction( self.FollowScheduler ) + end + + EscortGroup:OptionROEHoldFire() + EscortGroup:OptionROTPassiveDefense() + + self.EscortMode = ESCORT.MODE.FOLLOW + + self.CT1 = 0 + self.GT1 = 0 + --self.FollowScheduler = routines.scheduleFunction( self._FollowScheduler, { self, Distance }, timer.getTime() + 1, .5 ) + self.FollowScheduler = SCHEDULER:New( self, self._FollowScheduler, { Distance }, 1, .5, .1 ) + EscortGroup:MessageToClient( "Rejoining and Following at " .. Distance .. "!", 30, EscortClient ) +end + +--- @param #MENUPARAM MenuParam +function ESCORT._Flare( MenuParam ) + + local self = MenuParam.ParamSelf + local EscortGroup = self.EscortGroup + local EscortClient = self.EscortClient + + local Color = MenuParam.ParamColor + local Message = MenuParam.ParamMessage + + EscortGroup:GetUnit(1):Flare( Color ) + EscortGroup:MessageToClient( Message, 10, EscortClient ) +end + +--- @param #MENUPARAM MenuParam +function ESCORT._Smoke( MenuParam ) + + local self = MenuParam.ParamSelf + local EscortGroup = self.EscortGroup + local EscortClient = self.EscortClient + + local Color = MenuParam.ParamColor + local Message = MenuParam.ParamMessage + + EscortGroup:GetUnit(1):Smoke( Color ) + EscortGroup:MessageToClient( Message, 10, EscortClient ) +end + + +--- @param #MENUPARAM MenuParam +function ESCORT._ReportNearbyTargetsNow( MenuParam ) + + local self = MenuParam.ParamSelf + local EscortGroup = self.EscortGroup + local EscortClient = self.EscortClient + + self:_ReportTargetsScheduler() + +end + +function ESCORT._SwitchReportNearbyTargets( MenuParam ) + + local self = MenuParam.ParamSelf + local EscortGroup = self.EscortGroup + local EscortClient = self.EscortClient + + self.ReportTargets = MenuParam.ParamReportTargets + + if self.ReportTargets then + if not self.ReportTargetsScheduler then + --self.ReportTargetsScheduler = routines.scheduleFunction( self._ReportTargetsScheduler, { self }, timer.getTime() + 1, 30 ) + self.ReportTargetsScheduler = SCHEDULER:New( self, self._ReportTargetsScheduler, {}, 1, 30 ) + end + else + routines.removeFunction( self.ReportTargetsScheduler ) + self.ReportTargetsScheduler = nil + end +end + +--- @param #MENUPARAM MenuParam +function ESCORT._ScanTargets( MenuParam ) + + local self = MenuParam.ParamSelf + local EscortGroup = self.EscortGroup + local EscortClient = self.EscortClient + + local ScanDuration = MenuParam.ParamScanDuration + + if self.FollowScheduler then + routines.removeFunction( self.FollowScheduler ) + end + + self:T( { "FollowScheduler after removefunction: ", self.FollowScheduler } ) + + if EscortGroup:IsHelicopter() then + SCHEDULER:New( EscortGroup, EscortGroup.PushTask, + { EscortGroup:TaskControlled( + EscortGroup:TaskOrbitCircle( 200, 20 ), + EscortGroup:TaskCondition( nil, nil, nil, nil, ScanDuration, nil ) + ) + }, + 1 + ) + elseif EscortGroup:IsAirPlane() then + SCHEDULER:New( EscortGroup, EscortGroup.PushTask, + { EscortGroup:TaskControlled( + EscortGroup:TaskOrbitCircle( 1000, 500 ), + EscortGroup:TaskCondition( nil, nil, nil, nil, ScanDuration, nil ) + ) + }, + 1 + ) + end + + EscortGroup:MessageToClient( "Scanning targets for " .. ScanDuration .. " seconds.", ScanDuration, EscortClient ) + + if self.EscortMode == ESCORT.MODE.FOLLOW then + --self.FollowScheduler = routines.scheduleFunction( self._FollowScheduler, { self, Distance }, timer.getTime() + ScanDuration, 1 ) + self.FollowScheduler:Start() + end + +end + +function _Resume( EscortGroup ) + env.info( '_Resume' ) + + local Escort = EscortGroup.Escort -- #ESCORT + env.info( "EscortMode = " .. Escort.EscortMode ) + if Escort.EscortMode == ESCORT.MODE.FOLLOW then + Escort:JoinUpAndFollow( EscortGroup, Escort.EscortClient, Escort.Distance ) + end + +end + +--- @param #MENUPARAM MenuParam +function ESCORT._AttackTarget( MenuParam ) + + local self = MenuParam.ParamSelf + local EscortGroup = self.EscortGroup + local EscortClient = self.EscortClient + local AttackUnit = MenuParam.ParamUnit -- Unit#UNIT + + if self.FollowScheduler then + routines.removeFunction( self.FollowScheduler ) + end + + self:T( AttackUnit ) + + if EscortGroup:IsAir() then + EscortGroup:OptionROEOpenFire() + EscortGroup:OptionROTPassiveDefense() + EscortGroup.Escort = self -- Need to do this trick to get the reference for the escort in the _Resume function. +-- routines.scheduleFunction( +-- EscortGroup.PushTask, +-- { EscortGroup, +-- EscortGroup:TaskCombo( +-- { EscortGroup:TaskAttackUnit( AttackUnit ), +-- EscortGroup:TaskFunction( 1, 2, "_Resume", {"''"} ) +-- } +-- ) +-- }, timer.getTime() + 10 +-- ) + SCHEDULER:New( EscortGroup, + EscortGroup.PushTask, + { EscortGroup:TaskCombo( + { EscortGroup:TaskAttackUnit( AttackUnit ), + EscortGroup:TaskFunction( 1, 2, "_Resume", {"''"} ) + } + ) + }, 10 + ) + else +-- routines.scheduleFunction( +-- EscortGroup.PushTask, +-- { EscortGroup, +-- EscortGroup:TaskCombo( +-- { EscortGroup:TaskFireAtPoint( AttackUnit:GetPointVec2(), 50 ) +-- } +-- ) +-- }, timer.getTime() + 10 +-- ) + SCHEDULER:New( EscortGroup, + EscortGroup.PushTask, + { EscortGroup:TaskCombo( + { EscortGroup:TaskFireAtPoint( AttackUnit:GetPointVec2(), 50 ) + } + ) + }, 10 + ) + end + EscortGroup:MessageToClient( "Engaging Designated Unit!", 10, EscortClient ) + + +end + +--- @param #MENUPARAM MenuParam +function ESCORT._AssistTarget( MenuParam ) + + local self = MenuParam.ParamSelf + local EscortGroup = self.EscortGroup + local EscortClient = self.EscortClient + local EscortGroupAttack = MenuParam.ParamEscortGroup + local AttackUnit = MenuParam.ParamUnit -- Unit#UNIT + + if self.FollowScheduler then + routines.removeFunction( self.FollowScheduler ) + end + + + self:T( AttackUnit ) + + if EscortGroupAttack:IsAir() then + EscortGroupAttack:OptionROEOpenFire() + EscortGroupAttack:OptionROTVertical() +-- routines.scheduleFunction( +-- EscortGroupAttack.PushTask, +-- { EscortGroupAttack, +-- EscortGroupAttack:TaskCombo( +-- { EscortGroupAttack:TaskAttackUnit( AttackUnit ), +-- EscortGroupAttack:TaskOrbitCircle( 500, 350 ) +-- } +-- ) +-- }, timer.getTime() + 10 +-- ) + SCHDULER:New( EscortGroupAttack, + EscortGroupAttack.PushTask, + { EscortGroupAttack:TaskCombo( + { EscortGroupAttack:TaskAttackUnit( AttackUnit ), + EscortGroupAttack:TaskOrbitCircle( 500, 350 ) + } + ) + }, 10 + ) + else +-- routines.scheduleFunction( +-- EscortGroupAttack.PushTask, +-- { EscortGroupAttack, +-- EscortGroupAttack:TaskCombo( +-- { EscortGroupAttack:TaskFireAtPoint( AttackUnit:GetPointVec2(), 50 ) +-- } +-- ) +-- }, timer.getTime() + 10 +-- ) + SCHEDULER:New( EscortGroupAttack, + EscortGroupAttack.PushTask, + { EscortGroupAttack:TaskCombo( + { EscortGroupAttack:TaskFireAtPoint( AttackUnit:GetPointVec2(), 50 ) + } + ) + }, 10 + ) + end + EscortGroupAttack:MessageToClient( "Assisting with the destroying the enemy unit!", 10, EscortClient ) + +end + +--- @param #MENUPARAM MenuParam +function ESCORT._ROE( MenuParam ) + + local self = MenuParam.ParamSelf + local EscortGroup = self.EscortGroup + local EscortClient = self.EscortClient + + local EscortROEFunction = MenuParam.ParamFunction + local EscortROEMessage = MenuParam.ParamMessage + + pcall( function() EscortROEFunction() end ) + EscortGroup:MessageToClient( EscortROEMessage, 10, EscortClient ) +end + +--- @param #MENUPARAM MenuParam +function ESCORT._ROT( MenuParam ) + + local self = MenuParam.ParamSelf + local EscortGroup = self.EscortGroup + local EscortClient = self.EscortClient + + local EscortROTFunction = MenuParam.ParamFunction + local EscortROTMessage = MenuParam.ParamMessage + + pcall( function() EscortROTFunction() end ) + EscortGroup:MessageToClient( EscortROTMessage, 10, EscortClient ) +end + +--- @param #MENUPARAM MenuParam +function ESCORT._ResumeMission( MenuParam ) + + local self = MenuParam.ParamSelf + local EscortGroup = self.EscortGroup + local EscortClient = self.EscortClient + + local WayPoint = MenuParam.ParamWayPoint + + routines.removeFunction( self.FollowScheduler ) + self.FollowScheduler = nil + + local WayPoints = EscortGroup:GetTaskRoute() + self:T( WayPoint, WayPoints ) + + for WayPointIgnore = 1, WayPoint do + table.remove( WayPoints, 1 ) + end + + --routines.scheduleFunction( EscortGroup.SetTask, {EscortGroup, EscortGroup:TaskRoute( WayPoints ) }, timer.getTime() + 1 ) + SCHEDULER:New( EscortGroup, EscortGroup.SetTask, { EscortGroup:TaskRoute( WayPoints ) }, 1 ) + + EscortGroup:MessageToClient( "Resuming mission from waypoint " .. WayPoint .. ".", 10, EscortClient ) +end + +--- Registers the waypoints +-- @param #ESCORT self +-- @return #table +function ESCORT:RegisterRoute() + self:F() + + local EscortGroup = self.EscortGroup -- Group#GROUP + + local TaskPoints = EscortGroup:GetTaskRoute() + + self:T( TaskPoints ) + + return TaskPoints +end + +--- @param Escort#ESCORT self +function ESCORT:_FollowScheduler( FollowDistance ) + self:F( { FollowDistance }) + + if self.EscortGroup:IsAlive() and self.EscortClient:IsAlive() then + + local ClientUnit = self.EscortClient:GetClientGroupUnit() + local GroupUnit = self.EscortGroup:GetUnit( 1 ) + + if self.CT1 == 0 and self.GT1 == 0 then + self.CV1 = ClientUnit:GetPointVec3() + self.CT1 = timer.getTime() + self.GV1 = GroupUnit:GetPointVec3() + self.GT1 = timer.getTime() + else + local CT1 = self.CT1 + local CT2 = timer.getTime() + local CV1 = self.CV1 + local CV2 = ClientUnit:GetPointVec3() + self.CT1 = CT2 + self.CV1 = CV2 + + local CD = ( ( CV2.x - CV1.x )^2 + ( CV2.y - CV1.y )^2 + ( CV2.z - CV1.z )^2 ) ^ 0.5 + local CT = CT2 - CT1 + + local CS = ( 3600 / CT ) * ( CD / 1000 ) + + self:T2( { "Client:", CS, CD, CT, CV2, CV1, CT2, CT1 } ) + + local GT1 = self.GT1 + local GT2 = timer.getTime() + local GV1 = self.GV1 + local GV2 = GroupUnit:GetPointVec3() + self.GT1 = GT2 + self.GV1 = GV2 + + local GD = ( ( GV2.x - GV1.x )^2 + ( GV2.y - GV1.y )^2 + ( GV2.z - GV1.z )^2 ) ^ 0.5 + local GT = GT2 - GT1 + + local GS = ( 3600 / GT ) * ( GD / 1000 ) + + self:T2( { "Group:", GS, GD, GT, GV2, GV1, GT2, GT1 } ) + + -- Calculate the group direction vector + local GV = { x = GV2.x - CV2.x, y = GV2.y - CV2.y, z = GV2.z - CV2.z } + + -- Calculate GH2, GH2 with the same height as CV2. + local GH2 = { x = GV2.x, y = CV2.y, z = GV2.z } + + -- Calculate the angle of GV to the orthonormal plane + local alpha = math.atan2( GV.z, GV.x ) + + -- Now we calculate the intersecting vector between the circle around CV2 with radius FollowDistance and GH2. + -- From the GeoGebra model: CVI = (x(CV2) + FollowDistance cos(alpha), y(GH2) + FollowDistance sin(alpha), z(CV2)) + local CVI = { x = CV2.x + FollowDistance * math.cos(alpha), + y = GH2.y, + z = CV2.z + FollowDistance * math.sin(alpha), + } + + -- Calculate the direction vector DV of the escort group. We use CVI as the base and CV2 as the direction. + local DV = { x = CV2.x - CVI.x, y = CV2.y - CVI.y, z = CV2.z - CVI.z } + + -- We now calculate the unary direction vector DVu, so that we can multiply DVu with the speed, which is expressed in meters / s. + -- We need to calculate this vector to predict the point the escort group needs to fly to according its speed. + -- The distance of the destination point should be far enough not to have the aircraft starting to swipe left to right... + local DVu = { x = DV.x / FollowDistance, y = DV.y / FollowDistance, z = DV.z / FollowDistance } + + -- Now we can calculate the group destination vector GDV. + local GDV = { x = DVu.x * CS * 8 + CVI.x, y = CVI.y, z = DVu.z * CS * 8 + CVI.z } + + --trigger.action.smoke( GDV, trigger.smokeColor.Red ) + self:T2( { "CV2:", CV2 } ) + self:T2( { "CVI:", CVI } ) + self:T2( { "GDV:", GDV } ) + + -- Measure distance between client and group + local CatchUpDistance = ( ( GDV.x - GV2.x )^2 + ( GDV.y - GV2.y )^2 + ( GDV.z - GV2.z )^2 ) ^ 0.5 + + -- The calculation of the Speed would simulate that the group would take 30 seconds to overcome + -- the requested Distance). + local Time = 10 + local CatchUpSpeed = ( CatchUpDistance - ( CS * 8.4 ) ) / Time + + local Speed = CS + CatchUpSpeed + if Speed < 0 then + Speed = 0 + end + + self:T( { "Client Speed, Escort Speed, Speed, FlyDistance, Time:", CS, GS, Speed, Distance, Time } ) + + -- Now route the escort to the desired point with the desired speed. + self.EscortGroup:TaskRouteToVec3( GDV, Speed / 3.6 ) -- DCS models speed in Mps (Miles per second) + end + return true + end + + return false +end + + +--- Report Targets Scheduler. +-- @param #ESCORT self +function ESCORT:_ReportTargetsScheduler() + self:F( self.EscortGroup:GetName() ) + + if self.EscortGroup:IsAlive() and self.EscortClient:IsAlive() then + local EscortGroupName = self.EscortGroup:GetName() + local EscortTargets = self.EscortGroup:GetDetectedTargets() + + local ClientEscortTargets = self.EscortClient._EscortGroups[EscortGroupName].Targets + + local EscortTargetMessages = "" + for EscortTargetID, EscortTarget in pairs( EscortTargets ) do + local EscortObject = EscortTarget.object + self:T( EscortObject ) + if EscortObject and EscortObject:isExist() and EscortObject.id_ < 50000000 then + + local EscortTargetUnit = UNIT:Find( EscortObject ) + local EscortTargetUnitName = EscortTargetUnit:GetName() + + + + -- local EscortTargetIsDetected, + -- EscortTargetIsVisible, + -- EscortTargetLastTime, + -- EscortTargetKnowType, + -- EscortTargetKnowDistance, + -- EscortTargetLastPos, + -- EscortTargetLastVelocity + -- = self.EscortGroup:IsTargetDetected( EscortObject ) + -- + -- self:T( { EscortTargetIsDetected, + -- EscortTargetIsVisible, + -- EscortTargetLastTime, + -- EscortTargetKnowType, + -- EscortTargetKnowDistance, + -- EscortTargetLastPos, + -- EscortTargetLastVelocity } ) + + + local EscortTargetUnitPositionVec3 = EscortTargetUnit:GetPointVec3() + local EscortPositionVec3 = self.EscortGroup:GetPointVec3() + local Distance = ( ( EscortTargetUnitPositionVec3.x - EscortPositionVec3.x )^2 + + ( EscortTargetUnitPositionVec3.y - EscortPositionVec3.y )^2 + + ( EscortTargetUnitPositionVec3.z - EscortPositionVec3.z )^2 + ) ^ 0.5 / 1000 + + self:T( { self.EscortGroup:GetName(), EscortTargetUnit:GetName(), Distance, EscortTarget } ) + + if Distance <= 15 then + + if not ClientEscortTargets[EscortTargetUnitName] then + ClientEscortTargets[EscortTargetUnitName] = {} + end + ClientEscortTargets[EscortTargetUnitName].AttackUnit = EscortTargetUnit + ClientEscortTargets[EscortTargetUnitName].visible = EscortTarget.visible + ClientEscortTargets[EscortTargetUnitName].type = EscortTarget.type + ClientEscortTargets[EscortTargetUnitName].distance = EscortTarget.distance + else + if ClientEscortTargets[EscortTargetUnitName] then + ClientEscortTargets[EscortTargetUnitName] = nil + end + end + end + end + + self:T( { "Sorting Targets Table:", ClientEscortTargets } ) + table.sort( ClientEscortTargets, function( a, b ) return a.Distance < b.Distance end ) + self:T( { "Sorted Targets Table:", ClientEscortTargets } ) + + -- Remove the sub menus of the Attack menu of the Escort for the EscortGroup. + self.EscortMenuAttackNearbyTargets:RemoveSubMenus() + + if self.EscortMenuTargetAssistance then + self.EscortMenuTargetAssistance:RemoveSubMenus() + end + + --for MenuIndex = 1, #self.EscortMenuAttackTargets do + -- self:T( { "Remove Menu:", self.EscortMenuAttackTargets[MenuIndex] } ) + -- self.EscortMenuAttackTargets[MenuIndex] = self.EscortMenuAttackTargets[MenuIndex]:Remove() + --end + + + if ClientEscortTargets then + for ClientEscortTargetUnitName, ClientEscortTargetData in pairs( ClientEscortTargets ) do + + for ClientEscortGroupName, EscortGroupData in pairs( self.EscortClient._EscortGroups ) do + + if ClientEscortTargetData and ClientEscortTargetData.AttackUnit:IsAlive() then + + local EscortTargetMessage = "" + local EscortTargetCategoryName = ClientEscortTargetData.AttackUnit:GetCategoryName() + local EscortTargetCategoryType = ClientEscortTargetData.AttackUnit:GetTypeName() + if ClientEscortTargetData.type then + EscortTargetMessage = EscortTargetMessage .. EscortTargetCategoryName .. " (" .. EscortTargetCategoryType .. ") at " + else + EscortTargetMessage = EscortTargetMessage .. "Unknown target at " + end + + local EscortTargetUnitPositionVec3 = ClientEscortTargetData.AttackUnit:GetPointVec3() + local EscortPositionVec3 = self.EscortGroup:GetPointVec3() + local Distance = ( ( EscortTargetUnitPositionVec3.x - EscortPositionVec3.x )^2 + + ( EscortTargetUnitPositionVec3.y - EscortPositionVec3.y )^2 + + ( EscortTargetUnitPositionVec3.z - EscortPositionVec3.z )^2 + ) ^ 0.5 / 1000 + + self:T( { self.EscortGroup:GetName(), ClientEscortTargetData.AttackUnit:GetName(), Distance, ClientEscortTargetData.AttackUnit } ) + if ClientEscortTargetData.visible == false then + EscortTargetMessage = EscortTargetMessage .. string.format( "%.2f", Distance ) .. " estimated km" + else + EscortTargetMessage = EscortTargetMessage .. string.format( "%.2f", Distance ) .. " km" + end + + if ClientEscortTargetData.visible then + EscortTargetMessage = EscortTargetMessage .. ", visual" + end + + if ClientEscortGroupName == EscortGroupName then + + MENU_CLIENT_COMMAND:New( self.EscortClient, + EscortTargetMessage, + self.EscortMenuAttackNearbyTargets, + ESCORT._AttackTarget, + { ParamSelf = self, + ParamUnit = ClientEscortTargetData.AttackUnit + } + ) + EscortTargetMessages = EscortTargetMessages .. "\n - " .. EscortTargetMessage + else + if self.EscortMenuTargetAssistance then + local MenuTargetAssistance = MENU_CLIENT:New( self.EscortClient, EscortGroupData.EscortName, self.EscortMenuTargetAssistance ) + MENU_CLIENT_COMMAND:New( self.EscortClient, + EscortTargetMessage, + MenuTargetAssistance, + ESCORT._AssistTarget, + { ParamSelf = self, + ParamEscortGroup = EscortGroupData.EscortGroup, + ParamUnit = ClientEscortTargetData.AttackUnit + } + ) + end + end + else + ClientEscortTargetData = nil + end + end + end + + if EscortTargetMessages ~= "" and self.ReportTargets == true then + self.EscortGroup:MessageToClient( "Detected targets within 15 km range:" .. EscortTargetMessages:gsub("\n$",""), 20, self.EscortClient ) + else + self.EscortGroup:MessageToClient( "No targets detected!", 20, self.EscortClient ) + end + end + + if self.EscortMenuResumeMission then + self.EscortMenuResumeMission:RemoveSubMenus() + + -- if self.EscortMenuResumeWayPoints then + -- for MenuIndex = 1, #self.EscortMenuResumeWayPoints do + -- self:T( { "Remove Menu:", self.EscortMenuResumeWayPoints[MenuIndex] } ) + -- self.EscortMenuResumeWayPoints[MenuIndex] = self.EscortMenuResumeWayPoints[MenuIndex]:Remove() + -- end + -- end + + local TaskPoints = self:RegisterRoute() + for WayPointID, WayPoint in pairs( TaskPoints ) do + local EscortPositionVec3 = self.EscortGroup:GetPointVec3() + local Distance = ( ( WayPoint.x - EscortPositionVec3.x )^2 + + ( WayPoint.y - EscortPositionVec3.z )^2 + ) ^ 0.5 / 1000 + MENU_CLIENT_COMMAND:New( self.EscortClient, "Waypoint " .. WayPointID .. " at " .. string.format( "%.2f", Distance ).. "km", self.EscortMenuResumeMission, ESCORT._ResumeMission, { ParamSelf = self, ParamWayPoint = WayPointID } ) + end + end + return true + end + + return false +end +--- Provides missile training functions. +-- +-- @{#MISSILETRAINER} class +-- ======================== +-- The @{#MISSILETRAINER} class uses the DCS world messaging system to be alerted of any missiles fired, and when a missile would hit your aircraft, +-- the class will destroy the missile within a certain range, to avoid damage to your aircraft. +-- It suports the following functionality: +-- +-- * Track the missiles fired at you and other players, providing bearing and range information of the missiles towards the airplanes. +-- * Provide alerts of missile launches, including detailed information of the units launching, including bearing, range … +-- * Provide alerts when a missile would have killed your aircraft. +-- * Provide alerts when the missile self destructs. +-- * Enable / Disable and Configure the Missile Trainer using the various menu options. +-- +-- When running a mission where MISSILETRAINER is used, the following radio menu structure ( 'Radio Menu' -> 'Other (F10)' -> 'MissileTrainer' ) options are available for the players: +-- +-- * **Messages**: Menu to configure all messages. +-- * **Messages On**: Show all messages. +-- * **Messages Off**: Disable all messages. +-- * **Tracking**: Menu to configure missile tracking messages. +-- * **To All**: Shows missile tracking messages to all players. +-- * **To Target**: Shows missile tracking messages only to the player where the missile is targetted at. +-- * **Tracking On**: Show missile tracking messages. +-- * **Tracking Off**: Disable missile tracking messages. +-- * **Frequency Increase**: Increases the missile tracking message frequency with one second. +-- * **Frequency Decrease**: Decreases the missile tracking message frequency with one second. +-- * **Alerts**: Menu to configure alert messages. +-- * **To All**: Shows alert messages to all players. +-- * **To Target**: Shows alert messages only to the player where the missile is (was) targetted at. +-- * **Hits On**: Show missile hit alert messages. +-- * **Hits Off**: Disable missile hit alert messages. +-- * **Launches On**: Show missile launch messages. +-- * **Launches Off**: Disable missile launch messages. +-- * **Details**: Menu to configure message details. +-- * **Range On**: Shows range information when a missile is fired to a target. +-- * **Range Off**: Disable range information when a missile is fired to a target. +-- * **Bearing On**: Shows bearing information when a missile is fired to a target. +-- * **Bearing Off**: Disable bearing information when a missile is fired to a target. +-- * **Distance**: Menu to configure the distance when a missile needs to be destroyed when near to a player, during tracking. This will improve/influence hit calculation accuracy, but has the risk of damaging the aircraft when the missile reaches the aircraft before the distance is measured. +-- * **50 meter**: Destroys the missile when the distance to the aircraft is below or equal to 50 meter. +-- * **100 meter**: Destroys the missile when the distance to the aircraft is below or equal to 100 meter. +-- * **150 meter**: Destroys the missile when the distance to the aircraft is below or equal to 150 meter. +-- * **200 meter**: Destroys the missile when the distance to the aircraft is below or equal to 200 meter. +-- +-- +-- MISSILETRAINER construction methods: +-- ==================================== +-- Create a new MISSILETRAINER object with the @{#MISSILETRAINER.New} method: +-- +-- * @{#MISSILETRAINER.New}: Creates a new MISSILETRAINER object taking the maximum distance to your aircraft to evaluate when a missile needs to be destroyed. +-- +-- MISSILETRAINER will collect each unit declared in the mission with a skill level "Client" and "Player", and will monitor the missiles shot at those. +-- +-- MISSILETRAINER initialization methods: +-- ====================================== +-- A MISSILETRAINER object will behave differently based on the usage of initialization methods: +-- +-- * @{#MISSILETRAINER.InitMessagesOnOff}: Sets by default the display of any message to be ON or OFF. +-- * @{#MISSILETRAINER.InitTrackingToAll}: Sets by default the missile tracking report for all players or only for those missiles targetted to you. +-- * @{#MISSILETRAINER.InitTrackingOnOff}: Sets by default the display of missile tracking report to be ON or OFF. +-- * @{#MISSILETRAINER.InitTrackingFrequency}: Increases, decreases the missile tracking message display frequency with the provided time interval in seconds. +-- * @{#MISSILETRAINER.InitAlertsToAll}: Sets by default the display of alerts to be shown to all players or only to you. +-- * @{#MISSILETRAINER.InitAlertsHitsOnOff}: Sets by default the display of hit alerts ON or OFF. +-- * @{#MISSILETRAINER.InitAlertsLaunchesOnOff}: Sets by default the display of launch alerts ON or OFF. +-- * @{#MISSILETRAINER.InitRangeOnOff}: Sets by default the display of range information of missiles ON of OFF. +-- * @{#MISSILETRAINER.InitBearingOnOff}: Sets by default the display of bearing information of missiles ON of OFF. +-- * @{#MISSILETRAINER.InitMenusOnOff}: Allows to configure the options through the radio menu. +-- +-- @module MissileTrainer +-- @author FlightControl + + +Include.File( "Client" ) +Include.File( "Scheduler" ) + +--- The MISSILETRAINER class +-- @type MISSILETRAINER +-- @extends Base#BASE +MISSILETRAINER = { + ClassName = "MISSILETRAINER", +} + +--- Creates the main object which is handling missile tracking. +-- When a missile is fired a SCHEDULER is set off that follows the missile. When near a certain a client player, the missile will be destroyed. +-- @param #MISSILETRAINER self +-- @param #number Distance The distance in meters when a tracked missile needs to be destroyed when close to a player. +-- @param #string Briefing (Optional) Will show a text to the players when starting their mission. Can be used for briefing purposes. +-- @return #MISSILETRAINER +function MISSILETRAINER:New( Distance, Briefing ) + local self = BASE:Inherit( self, BASE:New() ) + self:F( Distance ) + + if Briefing then + self.Briefing = Briefing + end + + self.Schedulers = {} + self.SchedulerID = 0 + + self.MessageInterval = 2 + self.MessageLastTime = timer.getTime() + + self.Distance = Distance / 1000 + + _EVENTDISPATCHER:OnShot( self._EventShot, self ) + + self.DB = DATABASE:New():FilterStart() + self.DBClients = self.DB.Clients + self.DBUnits = self.DB.Units + + for ClientID, Client in pairs( self.DBClients ) do + + local function _Alive( Client ) + + if self.Briefing then + Client:Message( self.Briefing, 15, "HELLO WORLD", "Trainer" ) + end + + if self.MenusOnOff == true then + Client:Message( "Use the 'Radio Menu' -> 'Other (F10)' -> 'Missile Trainer' menu options to change the Missile Trainer settings (for all players).", 15, "MENU", "Trainer" ) + + Client.MainMenu = MENU_CLIENT:New( Client, "Missile Trainer", nil ) -- Menu#MENU_CLIENT + + Client.MenuMessages = MENU_CLIENT:New( Client, "Messages", Client.MainMenu ) + Client.MenuOn = MENU_CLIENT_COMMAND:New( Client, "Messages On", Client.MenuMessages, self._MenuMessages, { MenuSelf = self, MessagesOnOff = true } ) + Client.MenuOff = MENU_CLIENT_COMMAND:New( Client, "Messages Off", Client.MenuMessages, self._MenuMessages, { MenuSelf = self, MessagesOnOff = false } ) + + Client.MenuTracking = MENU_CLIENT:New( Client, "Tracking", Client.MainMenu ) + Client.MenuTrackingToAll = MENU_CLIENT_COMMAND:New( Client, "To All", Client.MenuTracking, self._MenuMessages, { MenuSelf = self, TrackingToAll = true } ) + Client.MenuTrackingToTarget = MENU_CLIENT_COMMAND:New( Client, "To Target", Client.MenuTracking, self._MenuMessages, { MenuSelf = self, TrackingToAll = false } ) + Client.MenuTrackOn = MENU_CLIENT_COMMAND:New( Client, "Tracking On", Client.MenuTracking, self._MenuMessages, { MenuSelf = self, TrackingOnOff = true } ) + Client.MenuTrackOff = MENU_CLIENT_COMMAND:New( Client, "Tracking Off", Client.MenuTracking, self._MenuMessages, { MenuSelf = self, TrackingOnOff = false } ) + Client.MenuTrackIncrease = MENU_CLIENT_COMMAND:New( Client, "Frequency Increase", Client.MenuTracking, self._MenuMessages, { MenuSelf = self, TrackingFrequency = -1 } ) + Client.MenuTrackDecrease = MENU_CLIENT_COMMAND:New( Client, "Frequency Decrease", Client.MenuTracking, self._MenuMessages, { MenuSelf = self, TrackingFrequency = 1 } ) + + Client.MenuAlerts = MENU_CLIENT:New( Client, "Alerts", Client.MainMenu ) + Client.MenuAlertsToAll = MENU_CLIENT_COMMAND:New( Client, "To All", Client.MenuAlerts, self._MenuMessages, { MenuSelf = self, AlertsToAll = true } ) + Client.MenuAlertsToTarget = MENU_CLIENT_COMMAND:New( Client, "To Target", Client.MenuAlerts, self._MenuMessages, { MenuSelf = self, AlertsToAll = false } ) + Client.MenuHitsOn = MENU_CLIENT_COMMAND:New( Client, "Hits On", Client.MenuAlerts, self._MenuMessages, { MenuSelf = self, AlertsHitsOnOff = true } ) + Client.MenuHitsOff = MENU_CLIENT_COMMAND:New( Client, "Hits Off", Client.MenuAlerts, self._MenuMessages, { MenuSelf = self, AlertsHitsOnOff = false } ) + Client.MenuLaunchesOn = MENU_CLIENT_COMMAND:New( Client, "Launches On", Client.MenuAlerts, self._MenuMessages, { MenuSelf = self, AlertsLaunchesOnOff = true } ) + Client.MenuLaunchesOff = MENU_CLIENT_COMMAND:New( Client, "Launches Off", Client.MenuAlerts, self._MenuMessages, { MenuSelf = self, AlertsLaunchesOnOff = false } ) + + Client.MenuDetails = MENU_CLIENT:New( Client, "Details", Client.MainMenu ) + Client.MenuDetailsDistanceOn = MENU_CLIENT_COMMAND:New( Client, "Range On", Client.MenuDetails, self._MenuMessages, { MenuSelf = self, DetailsRangeOnOff = true } ) + Client.MenuDetailsDistanceOff = MENU_CLIENT_COMMAND:New( Client, "Range Off", Client.MenuDetails, self._MenuMessages, { MenuSelf = self, DetailsRangeOnOff = false } ) + Client.MenuDetailsBearingOn = MENU_CLIENT_COMMAND:New( Client, "Bearing On", Client.MenuDetails, self._MenuMessages, { MenuSelf = self, DetailsBearingOnOff = true } ) + Client.MenuDetailsBearingOff = MENU_CLIENT_COMMAND:New( Client, "Bearing Off", Client.MenuDetails, self._MenuMessages, { MenuSelf = self, DetailsBearingOnOff = false } ) + + Client.MenuDistance = MENU_CLIENT:New( Client, "Set distance to plane", Client.MainMenu ) + Client.MenuDistance50 = MENU_CLIENT_COMMAND:New( Client, "50 meter", Client.MenuDistance, self._MenuMessages, { MenuSelf = self, Distance = 50 / 1000 } ) + Client.MenuDistance100 = MENU_CLIENT_COMMAND:New( Client, "100 meter", Client.MenuDistance, self._MenuMessages, { MenuSelf = self, Distance = 100 / 1000 } ) + Client.MenuDistance150 = MENU_CLIENT_COMMAND:New( Client, "150 meter", Client.MenuDistance, self._MenuMessages, { MenuSelf = self, Distance = 150 / 1000 } ) + Client.MenuDistance200 = MENU_CLIENT_COMMAND:New( Client, "200 meter", Client.MenuDistance, self._MenuMessages, { MenuSelf = self, Distance = 200 / 1000 } ) + else + if Client.MainMenu then + Client.MainMenu:Remove() + end + end + + + local ClientID = Client:GetID() + self:T( ClientID ) + if not self.TrackingMissiles[ClientID] then + self.TrackingMissiles[ClientID] = {} + end + self.TrackingMissiles[ClientID].Client = Client + if not self.TrackingMissiles[ClientID].MissileData then + self.TrackingMissiles[ClientID].MissileData = {} + end + end + + Client:Alive( _Alive ) + + end + +-- self.DB:ForEachClient( +-- --- @param Client#CLIENT Client +-- function( Client ) +-- +-- ... actions ... +-- +-- end +-- ) + + self.MessagesOnOff = true + + self.TrackingToAll = false + self.TrackingOnOff = true + self.TrackingFrequency = 3 + + self.AlertsToAll = true + self.AlertsHitsOnOff = true + self.AlertsLaunchesOnOff = true + + self.DetailsRangeOnOff = true + self.DetailsBearingOnOff = true + + self.MenusOnOff = true + + self.TrackingMissiles = {} + + self.TrackingScheduler = SCHEDULER:New( self, self._TrackMissiles, {}, 0.5, 0.05, 0 ) + + return self +end + +-- Initialization methods. + + +--- Sets by default the display of any message to be ON or OFF. +-- @param #MISSILETRAINER self +-- @param #boolean MessagesOnOff true or false +-- @return #MISSILETRAINER self +function MISSILETRAINER:InitMessagesOnOff( MessagesOnOff ) + self:F( MessagesOnOff ) + + self.MessagesOnOff = MessagesOnOff + if self.MessagesOnOff == true then + MESSAGE:New( "Messages ON", "Menu", 15, "ID" ):ToAll() + else + MESSAGE:New( "Messages OFF", "Menu", 15, "ID" ):ToAll() + end + + return self +end + +--- Sets by default the missile tracking report for all players or only for those missiles targetted to you. +-- @param #MISSILETRAINER self +-- @param #boolean TrackingToAll true or false +-- @return #MISSILETRAINER self +function MISSILETRAINER:InitTrackingToAll( TrackingToAll ) + self:F( TrackingToAll ) + + self.TrackingToAll = TrackingToAll + if self.TrackingToAll == true then + MESSAGE:New( "Missile tracking to all players ON", "Menu", 15, "ID" ):ToAll() + else + MESSAGE:New( "Missile tracking to all players OFF", "Menu", 15, "ID" ):ToAll() + end + + return self +end + +--- Sets by default the display of missile tracking report to be ON or OFF. +-- @param #MISSILETRAINER self +-- @param #boolean TrackingOnOff true or false +-- @return #MISSILETRAINER self +function MISSILETRAINER:InitTrackingOnOff( TrackingOnOff ) + self:F( TrackingOnOff ) + + self.TrackingOnOff = TrackingOnOff + if self.TrackingOnOff == true then + MESSAGE:New( "Missile tracking ON", "Menu", 15, "ID" ):ToAll() + else + MESSAGE:New( "Missile tracking OFF", "Menu", 15, "ID" ):ToAll() + end + + return self +end + +--- Increases, decreases the missile tracking message display frequency with the provided time interval in seconds. +-- The default frequency is a 3 second interval, so the Tracking Frequency parameter specifies the increase or decrease from the default 3 seconds or the last frequency update. +-- @param #MISSILETRAINER self +-- @param #number TrackingFrequency Provide a negative or positive value in seconds to incraese or decrease the display frequency. +-- @return #MISSILETRAINER self +function MISSILETRAINER:InitTrackingFrequency( TrackingFrequency ) + self:F( TrackingFrequency ) + + self.TrackingFrequency = self.TrackingFrequency + TrackingFrequency + if self.TrackingFrequency < 0.5 then + self.TrackingFrequency = 0.5 + end + if self.TrackingFrequency then + MESSAGE:New( "Missile tracking frequency is " .. self.TrackingFrequency .. " seconds.", "Menu", 15, "ID" ):ToAll() + end + + return self +end + +--- Sets by default the display of alerts to be shown to all players or only to you. +-- @param #MISSILETRAINER self +-- @param #boolean AlertsToAll true or false +-- @return #MISSILETRAINER self +function MISSILETRAINER:InitAlertsToAll( AlertsToAll ) + self:F( AlertsToAll ) + + self.AlertsToAll = AlertsToAll + if self.AlertsToAll == true then + MESSAGE:New( "Alerts to all players ON", "Menu", 15, "ID" ):ToAll() + else + MESSAGE:New( "Alerts to all players OFF", "Menu", 15, "ID" ):ToAll() + end + + return self +end + +--- Sets by default the display of hit alerts ON or OFF. +-- @param #MISSILETRAINER self +-- @param #boolean AlertsHitsOnOff true or false +-- @return #MISSILETRAINER self +function MISSILETRAINER:InitAlertsHitsOnOff( AlertsHitsOnOff ) + self:F( AlertsHitsOnOff ) + + self.AlertsHitsOnOff = AlertsHitsOnOff + if self.AlertsHitsOnOff == true then + MESSAGE:New( "Alerts Hits ON", "Menu", 15, "ID" ):ToAll() + else + MESSAGE:New( "Alerts Hits OFF", "Menu", 15, "ID" ):ToAll() + end + + return self +end + +--- Sets by default the display of launch alerts ON or OFF. +-- @param #MISSILETRAINER self +-- @param #boolean AlertsLaunchesOnOff true or false +-- @return #MISSILETRAINER self +function MISSILETRAINER:InitAlertsLaunchesOnOff( AlertsLaunchesOnOff ) + self:F( AlertsLaunchesOnOff ) + + self.AlertsLaunchesOnOff = AlertsLaunchesOnOff + if self.AlertsLaunchesOnOff == true then + MESSAGE:New( "Alerts Launches ON", "Menu", 15, "ID" ):ToAll() + else + MESSAGE:New( "Alerts Launches OFF", "Menu", 15, "ID" ):ToAll() + end + + return self +end + +--- Sets by default the display of range information of missiles ON of OFF. +-- @param #MISSILETRAINER self +-- @param #boolean DetailsRangeOnOff true or false +-- @return #MISSILETRAINER self +function MISSILETRAINER:InitRangeOnOff( DetailsRangeOnOff ) + self:F( DetailsRangeOnOff ) + + self.DetailsRangeOnOff = DetailsRangeOnOff + if self.DetailsRangeOnOff == true then + MESSAGE:New( "Range display ON", "Menu", 15, "ID" ):ToAll() + else + MESSAGE:New( "Range display OFF", "Menu", 15, "ID" ):ToAll() + end + + return self +end + +--- Sets by default the display of bearing information of missiles ON of OFF. +-- @param #MISSILETRAINER self +-- @param #boolean DetailsBearingOnOff true or false +-- @return #MISSILETRAINER self +function MISSILETRAINER:InitBearingOnOff( DetailsBearingOnOff ) + self:F( DetailsBearingOnOff ) + + self.DetailsBearingOnOff = DetailsBearingOnOff + if self.DetailsBearingOnOff == true then + MESSAGE:New( "Bearing display OFF", "Menu", 15, "ID" ):ToAll() + else + MESSAGE:New( "Bearing display OFF", "Menu", 15, "ID" ):ToAll() + end + + return self +end + +--- Enables / Disables the menus. +-- @param #MISSILETRAINER self +-- @param #boolean MenusOnOff true or false +-- @return #MISSILETRAINER self +function MISSILETRAINER:InitMenusOnOff( MenusOnOff ) + self:F( MenusOnOff ) + + self.MenusOnOff = MenusOnOff + if self.MenusOnOff == true then + MESSAGE:New( "Menus are ENABLED (only when a player rejoins a slot)", "Menu", 15, "ID" ):ToAll() + else + MESSAGE:New( "Menus are DISABLED", "Menu", 15, "ID" ):ToAll() + end + + return self +end + + +-- Menu functions + +function MISSILETRAINER._MenuMessages( MenuParameters ) + + local self = MenuParameters.MenuSelf + + if MenuParameters.MessagesOnOff ~= nil then + self:InitMessagesOnOff( MenuParameters.MessagesOnOff ) + end + + if MenuParameters.TrackingToAll ~= nil then + self:InitTrackingToAll( MenuParameters.TrackingToAll ) + end + + if MenuParameters.TrackingOnOff ~= nil then + self:InitTrackingOnOff( MenuParameters.TrackingOnOff ) + end + + if MenuParameters.TrackingFrequency ~= nil then + self:InitTrackingFrequency( MenuParameters.TrackingFrequency ) + end + + if MenuParameters.AlertsToAll ~= nil then + self:InitAlertsToAll( MenuParameters.AlertsToAll ) + end + + if MenuParameters.AlertsHitsOnOff ~= nil then + self:InitAlertsHitsOnOff( MenuParameters.AlertsHitsOnOff ) + end + + if MenuParameters.AlertsLaunchesOnOff ~= nil then + self:InitAlertsLaunchesOnOff( MenuParameters.AlertsLaunchesOnOff ) + end + + if MenuParameters.DetailsRangeOnOff ~= nil then + self:InitRangeOnOff( MenuParameters.DetailsRangeOnOff ) + end + + if MenuParameters.DetailsBearingOnOff ~= nil then + self:InitBearingOnOff( MenuParameters.DetailsBearingOnOff ) + end + + if MenuParameters.Distance ~= nil then + self.Distance = MenuParameters.Distance + MESSAGE:New( "Hit detection distance set to " .. self.Distance .. " meters", "Menu", 15, "ID" ):ToAll() + end + +end + +--- Detects if an SA site was shot with an anti radiation missile. In this case, take evasive actions based on the skill level set within the ME. +-- @param #MISSILETRAINER self +-- @param Event#EVENTDATA Event +function MISSILETRAINER:_EventShot( Event ) + self:F( { Event } ) + + local TrainerSourceDCSUnit = Event.IniDCSUnit + local TrainerSourceDCSUnitName = Event.IniDCSUnitName + local TrainerWeapon = Event.Weapon -- Identify the weapon fired + local TrainerWeaponName = Event.WeaponName -- return weapon type + + self:T( "Missile Launched = " .. TrainerWeaponName ) + + local TrainerTargetDCSUnit = TrainerWeapon:getTarget() -- Identify target + local TrainerTargetDCSUnitName = Unit.getName( TrainerTargetDCSUnit ) + local TrainerTargetSkill = _DATABASE.Templates.Units[TrainerTargetDCSUnitName].Template.skill + + self:T(TrainerTargetDCSUnitName ) + + local Client = self.DBClients[TrainerTargetDCSUnitName] + if Client then + + local TrainerSourceUnit = UNIT:Find( TrainerSourceDCSUnit ) + local TrainerTargetUnit = UNIT:Find( TrainerTargetDCSUnit ) + + if self.MessagesOnOff == true and self.AlertsLaunchesOnOff == true then + + local Message = MESSAGE:New( + string.format( "%s launched a %s", + TrainerSourceUnit:GetTypeName(), + TrainerWeaponName + ) .. self:_AddRange( Client, TrainerWeapon ) .. self:_AddBearing( Client, TrainerWeapon ),"Launch Alert", 5, "ID" ) + + if self.AlertsToAll then + Message:ToAll() + else + Message:ToClient( Client ) + end + end + + local ClientID = Client:GetID() + local MissileData = {} + MissileData.TrainerSourceUnit = TrainerSourceUnit + MissileData.TrainerWeapon = TrainerWeapon + MissileData.TrainerTargetUnit = TrainerTargetUnit + MissileData.TrainerWeaponTypeName = TrainerWeapon:getTypeName() + MissileData.TrainerWeaponLaunched = true + table.insert( self.TrackingMissiles[ClientID].MissileData, MissileData ) + --self:T( self.TrackingMissiles ) + end +end + +function MISSILETRAINER:_AddRange( Client, TrainerWeapon ) + + local RangeText = "" + + if self.DetailsRangeOnOff then + + local PositionMissile = TrainerWeapon:getPoint() + local PositionTarget = Client:GetPointVec3() + + local Range = ( ( PositionMissile.x - PositionTarget.x )^2 + + ( PositionMissile.y - PositionTarget.y )^2 + + ( PositionMissile.z - PositionTarget.z )^2 + ) ^ 0.5 / 1000 + + RangeText = string.format( ", at %4.2fkm", Range ) + end + + return RangeText +end + +function MISSILETRAINER:_AddBearing( Client, TrainerWeapon ) + + local BearingText = "" + + if self.DetailsBearingOnOff then + + local PositionMissile = TrainerWeapon:getPoint() + local PositionTarget = Client:GetPointVec3() + + self:T2( { PositionTarget, PositionMissile }) + + local DirectionVector = { x = PositionMissile.x - PositionTarget.x, y = PositionMissile.y - PositionTarget.y, z = PositionMissile.z - PositionTarget.z } + local DirectionRadians = math.atan2( DirectionVector.z, DirectionVector.x ) + --DirectionRadians = DirectionRadians + routines.getNorthCorrection( PositionTarget ) + if DirectionRadians < 0 then + DirectionRadians = DirectionRadians + 2 * math.pi + end + local DirectionDegrees = DirectionRadians * 180 / math.pi + + BearingText = string.format( ", %d degrees", DirectionDegrees ) + end + + return BearingText +end + + +function MISSILETRAINER:_TrackMissiles() + self:F2() + + + local ShowMessages = false + if self.MessagesOnOff and self.MessageLastTime + self.TrackingFrequency <= timer.getTime() then + self.MessageLastTime = timer.getTime() + ShowMessages = true + end + + -- ALERTS PART + + -- Loop for all Player Clients to check the alerts and deletion of missiles. + for ClientDataID, ClientData in pairs( self.TrackingMissiles ) do + + local Client = ClientData.Client + self:T2( { Client:GetName() } ) + + for MissileDataID, MissileData in pairs( ClientData.MissileData ) do + self:T3( MissileDataID ) + + local TrainerSourceUnit = MissileData.TrainerSourceUnit + local TrainerWeapon = MissileData.TrainerWeapon + local TrainerTargetUnit = MissileData.TrainerTargetUnit + local TrainerWeaponTypeName = MissileData.TrainerWeaponTypeName + local TrainerWeaponLaunched = MissileData.TrainerWeaponLaunched + + if Client and Client:IsAlive() and TrainerSourceUnit and TrainerSourceUnit:IsAlive() and TrainerWeapon and TrainerWeapon:isExist() and TrainerTargetUnit and TrainerTargetUnit:IsAlive() then + local PositionMissile = TrainerWeapon:getPosition().p + local PositionTarget = Client:GetPointVec3() + + local Distance = ( ( PositionMissile.x - PositionTarget.x )^2 + + ( PositionMissile.y - PositionTarget.y )^2 + + ( PositionMissile.z - PositionTarget.z )^2 + ) ^ 0.5 / 1000 + + if Distance <= self.Distance then + -- Hit alert + TrainerWeapon:destroy() + if self.MessagesOnOff == true and self.AlertsHitsOnOff == true then + + self:T( "killed" ) + + local Message = MESSAGE:New( + string.format( "%s launched by %s killed %s", + TrainerWeapon:getTypeName(), + TrainerSourceUnit:GetTypeName(), + TrainerTargetUnit:GetPlayerName() + ),"Hit Alert", 15, "ID" ) + + if self.AlertsToAll == true then + Message:ToAll() + else + Message:ToClient( Client ) + end + + MissileData = nil + table.remove( ClientData.MissileData, MissileDataID ) + self:T(ClientData.MissileData) + end + end + else + if not ( TrainerWeapon and TrainerWeapon:isExist() ) then + if self.MessagesOnOff == true and self.AlertsLaunchesOnOff == true then + -- Weapon does not exist anymore. Delete from Table + local Message = MESSAGE:New( + string.format( "%s launched by %s self destructed!", + TrainerWeaponTypeName, + TrainerSourceUnit:GetTypeName() + ),"Tracking", 5, "ID" ) + + if self.AlertsToAll == true then + Message:ToAll() + else + Message:ToClient( Client ) + end + end + MissileData = nil + table.remove( ClientData.MissileData, MissileDataID ) + self:T( ClientData.MissileData ) + end + end + end + end + + if ShowMessages == true and self.MessagesOnOff == true and self.TrackingOnOff == true then -- Only do this when tracking information needs to be displayed. + + -- TRACKING PART + + -- For the current client, the missile range and bearing details are displayed To the Player Client. + -- For the other clients, the missile range and bearing details are displayed To the other Player Clients. + -- To achieve this, a cross loop is done for each Player Client <-> Other Player Client missile information. + + -- Main Player Client loop + for ClientDataID, ClientData in pairs( self.TrackingMissiles ) do + + local Client = ClientData.Client + self:T2( { Client:GetName() } ) + + + ClientData.MessageToClient = "" + ClientData.MessageToAll = "" + + -- Other Players Client loop + for TrackingDataID, TrackingData in pairs( self.TrackingMissiles ) do + + for MissileDataID, MissileData in pairs( TrackingData.MissileData ) do + self:T3( MissileDataID ) + + local TrainerSourceUnit = MissileData.TrainerSourceUnit + local TrainerWeapon = MissileData.TrainerWeapon + local TrainerTargetUnit = MissileData.TrainerTargetUnit + local TrainerWeaponTypeName = MissileData.TrainerWeaponTypeName + local TrainerWeaponLaunched = MissileData.TrainerWeaponLaunched + + if Client and Client:IsAlive() and TrainerSourceUnit and TrainerSourceUnit:IsAlive() and TrainerWeapon and TrainerWeapon:isExist() and TrainerTargetUnit and TrainerTargetUnit:IsAlive() then + + if ShowMessages == true then + local TrackingTo + TrackingTo = string.format( " -> %s", + TrainerWeaponTypeName + ) + + if ClientDataID == TrackingDataID then + if ClientData.MessageToClient == "" then + ClientData.MessageToClient = "Missiles to You:\n" + end + ClientData.MessageToClient = ClientData.MessageToClient .. TrackingTo .. self:_AddRange( ClientData.Client, TrainerWeapon ) .. self:_AddBearing( ClientData.Client, TrainerWeapon ) .. "\n" + else + if self.TrackingToAll == true then + if ClientData.MessageToAll == "" then + ClientData.MessageToAll = "Missiles to other Players:\n" + end + ClientData.MessageToAll = ClientData.MessageToAll .. TrackingTo .. self:_AddRange( ClientData.Client, TrainerWeapon ) .. self:_AddBearing( ClientData.Client, TrainerWeapon ) .. " ( " .. TrainerTargetUnit:GetPlayerName() .. " )\n" + end + end + end + end + end + end + + -- Once the Player Client and the Other Player Client tracking messages are prepared, show them. + if ClientData.MessageToClient ~= "" or ClientData.MessageToAll ~= "" then + local Message = MESSAGE:New( ClientData.MessageToClient .. ClientData.MessageToAll, "Tracking", 1, "ID" ):ToClient( Client ) + end + end + end + + return true +end +env.info( '*** MOOSE INCLUDE END *** ' ) diff --git a/Moose Test Missions/Moose_Test_CLEANUP/Moose_Test_CLEANUP.miz b/Moose Test Missions/Moose_Test_CLEANUP/Moose_Test_CLEANUP.miz index c30a01530d09674af9a3517586e45b382cce20ff..bc0f5b2f8908d495c6c8bf12fb4afa61c185dcd5 100644 GIT binary patch delta 106521 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

VVGY5AB&LPT$L$J1H@x9V;+ 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 N3IiJk4-x|a004o2bHe}t delta 101621 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 BvLyfj diff --git a/Moose Test Missions/Moose_Test_DATABASE/Moose_Test_DATABASE.miz b/Moose Test Missions/Moose_Test_DATABASE/Moose_Test_DATABASE.miz index b5df147ee06384522c45b7958812005951e19b64..3c3d95c9710ff4a5bef2c30a593d2800000c9ee4 100644 GIT binary patch delta 106319 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 z�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 T8Upqzm(U&p90uzx0ssI252aTY delta 101455 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�Z!7F9J0lY{t!K61dR;FmMjZ54h0* zFmMjZ54h0*P)h*<005WX>;W1K000000RR91007z9mvArwPy#UBm%=atGXpvN0hjnN r0$Kwg{{fd(F#<9JeFXxSn-~Hcm!&ZRDgyNvm(ei-90uwd0ssI2sy~|T diff --git a/Moose Test Missions/Moose_Test_DESTROY/MOOSE_Test_DESTROY.miz b/Moose Test Missions/Moose_Test_DESTROY/MOOSE_Test_DESTROY.miz index 084815a4da52940885082db23e4def6655723b28..50a2d616a6eb275b9139410d433db11b6fc5d776 100644 GIT binary patch delta 106372 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�&7PFaJ*l;onvZWADgNNwZ) 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

c+DlV<{ZCBAHO`=++R$xH7_#f^(yG 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

+ + + +
ZONE_UNIT.ClassName + +
ZONE_UNIT:GetPointVec2() +

Returns the current location of the Unit#UNIT.

+
ZONE_UNIT:New(ZoneName, ZoneUNIT, Radius) +

Constructor to create a ZONE_UNIT instance, taking the zone name, a zone unit and a radius.

+
ZONE_UNIT.ZoneUNIT
Zone -

ZONE Classes

+

ZONE Classes

+

This module contains the ZONE classes, inherited from Zone#ZONE_BASE.

c|y+8{M)F&^&ShJmR%%qd)fID>!vji^}8 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

my!p0J_v)QMN6vAYRs$IK$-p(e- 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�&7PFaJ*l;onvZWADgNNwZ) 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

c+DlV<{ZCBAHO`=++R$xH7_#f^(yG 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

Ek|!KG=~Pp%p_9w%$z}~<#T0aWQj_o3QyKSe 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 H0{{R3DKa!^ delta 101375 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

VA+=9ked~K8 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

nfT32FzB$>z?l5f5%h(F2#8Z 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�ZxPY6CSEY{t!K61dR;FmMjZ54h0*FmMjZ54e|AY6C0+)~c6-Y6DgR!>pIv zY6CL@<2jcQYXdU^Hb9p}YXd_9ra_mAYXe3k?NS2(cVTj6Xm53MWphwV1qJ{B000aC P3;<380056w0{{R3+E8o_ diff --git a/Moose Test Missions/Moose_Test_SEAD/MOOSE_Test_SEAD.miz b/Moose Test Missions/Moose_Test_SEAD/MOOSE_Test_SEAD.miz index 6d633fe1e7237329c4f8abe5c3fcbe281ddfbf70..1254f21401114d73b9e6ca9d2ba58f259a42657d 100644 GIT binary patch delta 106284 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

3|K8wQ# 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

VVGY5AB&LPT$L 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 ZS^4w}gs^UHMnf;yZOPywe8 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 z zD`7~$bdeZ;u)sJydcRRzY%49gh>K0-#Wvz%)?Hf6)(eZxWyMCKqFGWj3W_E(Cab_hdJYBbAw8k%5H_-~ zrRCS>j?NBGPS0KL3VWt%b?Gu2*4+GxNdT1NP9C@ztQP z-TB9~T*3(*a2gAJFKsBC|H3Ijpc|!XE@%lTv~4rqA7${qQgJiStaW^pm*8bP%fym< zmEUjy3q&&~Q>?gNpiRwO!}?(d_H2wD4b9^P8O)bNs~f(FBdxF~u>c@Fxnh4evf}zN z$M{=iAMfk%d9HM>p4A2V^V?~tlt8DW_m58u+|GYqd0DpDSAV=8Wu1_fB(-x22wqgG;nwS z;)}hHi+r~GIp1r4P#|-oFWG<3z(_b@z5N$oq*=~fz!RLB2~|c$!v^W&Vxi4eEC=zb ze%-|F`-3Sk33VZNsm#AJeq3Qwe&EYTpn_8{^l2stKyEM6yd+OJbkZqGucNc;;`{A7 z!iF*Em{ODD>#2?#Td(st(F6gMkOfMnmc5n9J}RbTb5m4#FuV6N!J~hQCEn*UW;*d*H|9YhQ?lR93X z@8n2?E4rHhnk%O>F-js#wMnW{}jGfro@o10nS}3Z5}{MNu7}DhXjo5%4^N>O!3w zT)izNkwPtd(c$%Iy-MctW?Uu{MF!{J_6XGThQb>UP`Lv$aNr4TtMlxdM8!>Uvy0;j z_~wN42~CLtG`FZ-1x%u=X76=fHt$2kAwO2Z>)l?j z6%*SYiP!%g7=8BgVn%;*jO>qjwIGKVnhEKH?wS}6uvy~`H{s(;j~^Bpq6ibiiag&< z>uA^fb3db|2P%JsMHCXup`C$qZu{bkNvuOwU1>SWSg4ukO*9@~7m^~RvkC|ia zInA`TEnt61U(IslES>wHe+gZ-ah7sm#CucVoHU%B52$yuY-OyiSZFR7RGP(60wdsx zZ1E#iDKi`2T+z{w*NK_B(hXt!ge04w=a%=5l?L5g4 zKq(~`aUF|$cBBnm96Z~VO;@q6P#o~ov2PjdUZN2sv2BDUT3quYJQ$8()U*(r1ZOASo0n9P^!v{ph+HNh^ z0kVHLDMlNWGH@j=8)OiE1=p&~)*RtcC9Owts32a5CPnXkeq}`b5M_5&!%qUvTDKOy zbGUl3R%2gW8!c2W60l5gXhQb5=P=g#vs+ZA=p*~TK6m)=7+jogha!nU)UkUmK3!?w~`t}a8_~4!Yq4s7rZJeYf_PoRmtU2 z3w3F>G>qmh*_fy2MR1B>Zd#)`ucOcGNiYVVb}kn_9n&h&ZC0nqb-g^y zKwgxa_F_lS-U({m5LIQ>xd6QA5(=IV9F=T>aj0Z&iQ+oWD-dq71vE5ABT94g6q8x{i>5-L6s$<)Vt`}|cw(~^I<(M3Vg!IctXY;Psr_R=-YpicynVR zunHCZ0O6qj`#Dg$dQLBC;j)5mXz>WfpYU&Al6yS^a=JFFeNZ7am>k@x1a4sWD#23>Wo=SfE_N z7tuq*%7m!0%rC}cK(5Kn6;FTt>hh6(L=F>ljQQZ?;lqX`x4lqGTm}2J^s26DQtA zP!7^IHVasDt|}ghKGulCg{jb*1TlhQl>A$52BlqkutJGV%P`#XHEhQp}Ug5 z^63vP_X%-Oqm1Iae=fvbz5KTlx1-q@lH3nucx>zQup_HBXp(hy@Ds;)g%?iyO4G)) z)+Fg730}JQ@U{H#pEc~>aRUIt=Pm&JIS<(29zZj9)cNI3fMtIh3I?xRrYqYM7UVi@ zx=eKIhbF2M@Ny5)8wPCeuQ|o`%XCTmktQGN?={txE%f{gYe(x3*48^h>o6LJ`xc^G zX_d`_F%FiMyyeWaFc3~d;p9<3 zGT^50HXqx7nm595^9c7198%SHCHlY-d#(wnFE1fP%U)Si_Uf9l*SJhe1FH)5%OT8u zy|^I>dUHFATY|KjRusF7LyMI$C7_9?ZuS{BDGyB#HIRR>LfkKUig&&S+J3*0K|&Uh zbNIBFM;vC*k%*btcMLL@u)I?!8(XEWemBVmY;e^`OJ;Pi(W}1`++}uA$>fBkilqF7 z^eE}u^9rM=D9&#fnUNLzY z*iDHzfaB7@n8aNbY|58>)`m8)1KJBtEz#HT#lL@~i)>gq%-u;me8ec7$Q29LBgtT$ z`s7}nQCGPUAx%*}&egu}`P%V)o$jn~zF%Natva(MQ8dX1{fueSgd?I+wc??c?V=1Q zpO`+ZSbfV8J}?bDfQ%ks zaS?x^JNXCXDc(Fy@R(|)-Y~2$(JdK`f&OL~B=*OC=bY+wwt5c^#zY&`{HMaa0EB^^ zc_wdS*v1TPf-nBt_f>_1*o}w@vnrzL>*o_5Akgy|MI&P)!ydXS7Zow_9@B0`7ii=7 z&LgQa;Z<^(IN=qgPlAt(V4&v{n!9;nu^)e&fqPU>O|8LJ z*Q_N8Q3Ri1eIorcerxqx(|N0G+Jgkw_{O8Z=-PTLR2htmoB*|?pXWyOVD9k16(mvS43A{8xc)S?6vT0Tmia2@-OrO$1!-XfXK{XnG!s@GK%6|zf=z_F=(;Bz(*Fmc?wxv3TrWgmU9>b= zk6pDjslTz-CJj}4>rm<6s>LyKf0-KBU5P`VO*f*-x0kcRgXQ{h8y(FJ@A_X$`(I1@ zuWD(5(iB_?{*~%dd?OJYqZ@~ocfQd%t4W;u(wFugY^gB4`uEV7M)#v3jsAbvh<<19 zSbH0(fuBL*KbQa_fv{YUhfoEGLQAQDE4mgC;-zh~xh|yHDw_Z)D&P3u%)^seuf17s znjYnW;JB>EGvo2tGq%U$7Dd*<)~3=58RZ4JRn-3p7C&9j2Wba9AN*|j>FD@i&HV*G zJVRq>BR{2^uOe4ODp@zwE#ZHp7%|R>w_!vkf-%ZO&e_@da%;>W`+)DSvECYLlz!qlPoP^piu2G333=F5W(S)zkGya920+yJ~}#02$;Sk z#NyC6QP%(_OpHug<>UFDG3%TB7^;|!n+#KjHu$cZ3@j4%<|ZQ_+TgY(!_|&?wsDhx z#oBk>%f#Z^US>XGd->pL7A)^JI0BeC0Bo&Bwj+RO!xZjK1Dv`Pioqc!2hNl!#y`N?cElO_b@E*7VEic zCC=gIE|gkbf|yka;th*Q0b(5k%Vh_@04uck1woFs;u)08ZJ0m=kD&<^fulSF9K6Z~ zO`k1o-hykeYVlpQSzLq0HX|F_;`TOg!#B9&ekK;z^)s^(-_L)?lvUV$&~BDlc#D1!-@S1|k;4hpLh&u& z62KmP$3ql1(V*`~rMcKN!QU#86 z9$Y1B-D3%Fu>0HVT0@hXp33d_82%q^vQVow1ye;m-y24d(n%`JN0X-%*O24sE!$B{ zJGSBkW})+o5J>a%8%jFRp^fA5Z5ufr{|&9A$D)Qh6g7XZXtS;|z(!+@tF9kw!Uz>P z{8n>C$Wu6eYJSG~W4I=YhP8JXcxzy%cG9w*g%fxYasSKD4jyZJhi$}xY?a71?6NgU zu>SXK04D_u=RZoP)eJ}mgNzVjQWo`ONO6`rn5We@*>gn0$jAYVi`sX>K}WCrz~mc*FFu)MHLq!mt%{CsyIatdY0pd2s8 zRh56vg4BG?PeGI`Hlu{8&ao*dnc&| z8)#I=)afn9RHdcQ~n*L>QwGLN3G42{&b}5HXtNv zDk86g*Imq>!!fsEGx1Ymb}&O-B~SG>v9R?_@J~n1!fsH+P$B5lfo{}kmbtVfHNm*jrleP4~^O>&e$=G4MuljUWeTAE>C6pLv$D7%Gu=Inn= z4wbE#YB%dsROEqI&0SQ=N6RtU!^cITE6X6BE_OE{i`Gr?Ca+7yr)f*EI_aH?EO;-e zuaHQsp4U=KlhtTYnD$JA0;g>c-Dj%O)tgT~bt&`HSGv{ly>RoMpyD)l^bs=lVNLw& z3wQ!ptH*)hK3)D^1D5SY4_XRvN6vq{Qp0W4jn!EO4~5saRclFm-HxFogdc;xaO}8z zXK_HGW(W1!j(;VHud?$uXrTDm^h@#^d{eB+Z*J+*ExmS2;Y2LMd#>;zx?6x*bU8OL zX829MwsQ;~)Fr21K7Mrc=JNYS9v^#Z zW~HS{Qx(v|{-7rG(?WzKzez-lN<^e(OSf!UDRac5pEnQ=R3gz-6}VCuDVGWd08!H) ztVGy9%4g@3Y>$OgY1*(#d}to{`pOp_w7Z5Yf!;7^%gz&mM7fJTwv%j*4d{DKdW_br zFYFD>pf&GikD5t){gqpNFl~SD)Us2W0nN{w&CazfYWHY@rq6P1(kCq?3cTyJr9#~m z+0eyalOWBN2fcKi9miI>hITHt1#c`43n#PhnFha#$(LnEf#-Hg>vN4rBAa; zjd8<&J2A5o=Ptl$Nrwmhax*z{N?i<9cw?K>6$O>wqe+TkDX7aQOrI6X%F>6k1%$E5 zm*R#qrHF2_AGT~PFoNwrDSd4CmZiUm{6mpE_s(YTHbhF$B+RYXrnLvY+_ToXp(8$h zr&ukdUo*Tl9~NB&`0sy7X?F*P9iI9sbKe29wH44+`mB=KCb6od+nYw;ueRvYL(}-p1%5iK#w{&(FG}AM6k( zUw9RJ-E%o}Jp|Qhf3*@?uB00RheXDq7zY_>niM9c`1o_$A4w zgqL4AKRbT^W$%F7n~G$D<`ZS$IvMv^jc^?9(LsVr%0G%h=i}d?7TsFgv7@J>cK?XNq|rax z*APnN;Q4=sbBx>BI0}8gmo~0aox8zjp#pMmZDSYf$mPC`^kJebrGWY&FB{G_jIedi zVK6BTBZ-@TEbOMnjN!b+5-yWqyusCtuLRcNAyUp#|->GTc zEWlRv=ivS*P&X-bR1CI*K4IS)vVj6~s5jz9SqXpJBTIgdSOPN_jTZ7&_7Nu7dtw&r zu)vuNA)g5;2~>(Z)VYE>lfDso^amBH`VGVyakR6l8FR+7Nf({o+b%lYq>D~(+eN1v zchTt`bm>Z zd^~zGEhyf9eMbS!sNk7+oiofVjkg6@ATSskH~3mYuX*QMFw?GeM8MhO>`7kQmteCMuE=MPspI@GCc#OK ztp{1hjvy~=S1Y0*qtvvbs9LFh%U=srFzcek{Pxy=x8VDRKQx4B)k|;I-vyiGFe(NZ zu;Wi2QtmuABVu9@UVi#jL0J4Zri5VJRZftwTiXw>P}L>=HS!8Vt(4_M`QqJ}{OBtv zsc`Cr9W$)rbw_6n;t;Vh<88tzo+3IGU(MEDha zt)bq3hwpvU$1;dMehvA6{||n6XkN8nm-g$@`Fd@?Uenis`N2F$-m15nIRQxE%A3C3eM#kquI#RZp*&70eA%Mewr$c0Ei2MwZ;1KEQ>9Nw} z4wb&Gm9_T~tBz<8=!6HKNT#T2gtPdKNDOEsNbU8I2f60V0PDVU0f z*!9UZN*bi$iuVz|ahRF&DoxHUR-%ZfPppXHvfKREESpmKIqj>Ml#yY!9>IFgu&2=CT-nWs_Y%b%fgWTOV+O|5QhHUX*=m-2epH2c!X* zGM}zst_hDfsUAtEuwM8$USZiOIo)!?4y5KR^&9piD^DXT;Yv}h>vT`S&Hh)Y0(zFm z0|C6Y40F^_n^N|~&QkcDa<|xTiq6$f#Og}oHN@noDSr}m)k*%yQ(IsK(v;PIG-)wS zXUkA?7DH1Olt_rxZ)z?VaA)Ldvcy6iV|0mShzT&yFEA}n_S@AA{M&4#ZzRFQQzkV= z_>9zHCNG6L6abP@e$MBmvJhdd0g8AL@Hz($#au(bR&zsk%c8x!mdC!Hkm z`g5`B(0v^1uh-NOI+lx;fud_Jy7r39O?b+f!hhc6tc}+0J_NM2nNd{_xdv8W0n-hC zyklOi=%DHzgI!m^L54M>kCn zM+|Y)1OY?=0%?1O?ei=x7c*5FnPKHUT1gXrRhzz2h?xEIO8Q3J0P617*vhEEr=I4o zOXuq~f33R#u0Bimq7+4?Pv}zFucXCgekq-w&Q$|!={)^8)8vyhl3HB}27l zoWu(7N~;DnbwS6Ao=FOS%7S=8L3qM>&GfClByZyNEAu*`s{1s806<@Lkm~hw3-hk` zl#tYY;M|^eb)n*;GQ3?`%P;xg$CITFM`V;eTJo6$#sx4pzCGtV)YS=XUdVJr`Qv#i z;we@?>y)PcXK)wdv_Sur^vH4rVtpfd+u*%dytc&FoaRWLr$4`cDoy|M9ItX;WizW0 zZpg2!swrDz;6^g%H>}3dd&xM>Y8~y}_ikQ-H;1k3$~(A9s*e>cNXERk zh6BHzh$CEU-)5(?P>8@^`!^s`=93>QXv=SF41b?!D0~BZc9W{qeD=8Q=YSmT51rqr zNmpPS%YLn)1KALNtWi2X`w5zA-gCf{g1*)Us8gewmc}W-j&wfk=Hd zel+jG*%JTbY_kMKA{#Dvroa1fJ{@^XwbW%*@jh2oMNacq(}ih9c~pw34E-wlk6Y!d zoHB4k*Z3?gaaA2(;ZyK2;aX(33Uep7P^luYWql)8x`3uh=HGJ}UGn|xL!bOPRHpFJvTOLOFE?9Lx zUpqOT%q=^ZZ>RY^tUtn!hq_CS6PtM0QiK1WO?XY=v%*@hr>Z3s^+SL|J+C+E(43ip zxaeu3`d1naf5Uc++&ebl}U|LyI$h!a>%5r+fOWgM4CC5)AJgxFX7!tmwN; z@?>#_02QY>AGc<5Rz+yd`s|aD&ehgqGqCh%I?8_IbMY5~4G`Il3aRRdpGgral=?ap z->&F=Pdy>%qAR@@3uy(=U(wJA)W-4W2pFX!F#gC2Dc3&ikn74q0lf8vkno7;y2m-q zcM-RLETM!*>vV%yX{`}1(kb0vUn=gkOEOxKwZXzBN%o|eEqTom!OWpk2bhYb0N!FW z1%y@X5t3xn;!o8kESTWeBx#fk-vI3Q6vk^C!we{qhVY=)=T=uz#HHLwrSV{hdu^5Z32 z7>D)u*G?v|@sN*W zvmcwafWgJKZsRr+(%@(%rCYxd3+FnTQBg+@>g;3O7|)3hYJ%Oy#7k1Wu!x1cg8ocHt=qX6N#^Xk|g_0 z>$WJ@5~0Dd9IhQ*!|;`sHM!{Za!HjnH(z|jS-vsB(|kV3|6*4Bl8-W*9v)rWS<3k) zWwViAi{pd+-(UFr=;Y++vxC#edqH>T*W zs&LZ@oP6!B1PlQ)r!z3|1nsuYq|^jzBfp=AkLA+a7+2JX^o%ih+>$GQlo*AHfYnwb zi4^a=_%)r4N(p_Vh}JR@Mp!ef%xRlfWHL#C`-`j`0`~LC0x6>jOQCEOAV~KsOIr(I zrCNpIq2>0^F!5lga@gL_`2?tXvTwvvl>m)3?)Am_Tw8uH#Vv93I*xGs8*lp+({cV} zG2`v;&n<>i94*<5Un`-1l3$=f#iFzu;dFgoF!P^ZBNwv;<+0*6$x}&y+Z`Y#r@=8A zy4pkWz6DcY-jS`odHFGY$C>A4^V<97M8H2K>RYZMlBg41`0I&N5JF=t69; zY}t#7?N<4J1s;14C+U?}c8MH?e2RcT+!H&1SL$TkdggeFRZlK|ieICk$72AO?(l0c zIE@?-Pnap4-x#Wa=4pY?UkGz$b2Y$DjIfA&EbL9jAS$LD=c)o{WpGqAFRi!8kC4{L z2~HJjbbF=Pk#V%RKBf@D>G{$eP0wfeqB|ntzw@l#jLM9qGR?9ehs;K(HPP75l*WFx z6&grj52uGFUB~(0v1g8Sh-)e|8-Y{4|#U&i7FXraLUf!7H<4u!jdYoht&qGXb*^s;&bCtdEO& zGx7Ci4nZF!#_5E&9`MZy>H%)CJG}`}MK&*7f_Z6Q$0}w9X1;WS5Q5k3@|_2FM2->r z^zN#8JK^?!J-n;-J*>A+{P&vshI&r^87Ub*#%+D6_agowz>n}bNMHz5{?|Hs3aHh1 za({u9z{2;&64pfqN+%4uYsr;s>CICdVJyh>H@J#$Df07|LGS@zXPYe2dEEF;8f3{s z`5ateWC4d7Ei0fREZ}Ce?$E9+rYw}yls{v&N%l*BHj#?}ywBMCf+mh0EgBj5WdR6_ znX^X1dqZ@93nDDDM&@#;nZsJ{I^C?RZD;R=B~I*tlxV>-%Ey#taz0tom9vp4xaA8n zam9EYGx%S)`;VZK_}j-*umYeAC%89xwgefEQ@A50BL%12)e4-e*j_w-gyZD+tg_>0^RYGII_W9q4PnUGT`W4gSc7>FX&U2#3aw80aN zRmqiOT1IyO(_qIlTJ_lv?MjNA!bl3fuc#`2#}vmA6w#}T*J$hP-I^+$9th1ndeF)9 z`efq)--X7znDkBeH7a|Kmjzx7GVay|7o`gr@iVx+g_kmI=5vl(JE9$?EcqC!^mXPR zcqOZgM^uPtd9%`OR%M&>1BzU7i@5-viq7!9-G?w6X-E-V&D$?y1`LTH7^c)q({4p@t7|Y@+Olr z-6ViWd~V$bP35|zc;J;9VzAV#yBEXUHq$noQ$Af>o@F!LV0W(g>h)vxC%DnsC}!Po zJ^=$!T{yUW@kYP-aF%Cd{7e7%iZ^M02j**N5zS~w5PI5KnhP&-Z5T`PnfM}!`6!(N zGqjaQcIr$BTrFl-z)_hPH%*T#pvvVrw}1{dG)hPrA9$IuP#<@Xrm%yM&*hB}{6;7S z)qFRKQ193&W;x(v=w$W%y%mU;+dEl}v63R_{qINnbdOVOSWo0gtQEYaSTB=*8!&#F zknnqU@>eH%>&Jty;GAgx=;VvN(~mv@fgVp`O>G4PaiYI~g5!rFi_t;-AtK#7-BT&< z!khvOOYVJz>OooDQRtJ$a@;!P# zgYWfX-4`k~gG3NW-1oJF1gJOk_!|VV9T zINs0hjN_fPlM1a{*U$BT1QI{fGx+VM6T%Tcmoj+NRKlR!m`HBL<9gl4t%}Gw#GcD- zfi=JsXDksgcKVRxzb*5(UVL^JCRT(Nd`n_vY>|G41&$V{h2NG)8C@42gwIFU&le06 zKVevSSy@H)nw+;P8O0SZ2MbTgqI#^xY;4D^4sy58E_PZgzjg$;^T^5q>q-szJKTn3Z)&1dX>;qJ%9>;TTuxnkcI8qK6`QNF<1Ykvut z>?!JIB9~NOu}PA|qy$ys->XG}207!uR`*szTR@fK;KJU2D|ISsp})?0qk`IBkZ6(T z%=*RZn1wlS@LCj0v*8sBrn{ydjj%qk=J@52Plyw^;G&nq@!AFc@c{pHQ}a`uN>YAv z6pTekG?U=TEn^H~kCe`eVv?m(clVA&2k1nD^av)1u=yOui=ODagsSH&UQx5+yO4Yo z;{gVD&ObkYI62un*Vi9K8Oh*7r$ zHH=mTn9TP)ALo|!oZCbSCXM1(h2|B?LJB8KDww2Ym7m4cD4l2Bl%0bz{GDpOWo4$> z6R`8Y5OWaMkkj8W`V;xCuvV zw_8U#sP1w(xoI$USJkQR>1#?X5!Zh7~eZw$Ke=~C}mS~#9VFb-^JEgQ+J6DU_2)eq9 z(2lK*K6^qfQg#-RVGMB+UabmRb;(<{G+~O=r>eu*uE`-!IR;}37rr|a=ArI%wWEn7 zjOHmq!5vE;gQ}Ihgarg?YVmsw6@$|*bUr05q)AajW6F#+)MfujvGcYOBaWSapet6G z6FHXHI+|k`Z1N;@{1NTrV8;8MOWmIe)xyEQ{P3IVl#i^9)j` z$+IE|i}x|@r!^Jy4J)mrpS_BIUuWqRFfY*dCvLcp;CDV=^2_w}nXeo+pm2!lr)K~a z8)rd+cP^dB;dKj>X90W(ko3+c5EK^21*@=}TDwrh0R4g6Ec&cl88#!ne3`S0lZ?MpBTDy(s3 z;J>L5f>r(2!hy`YyFc!YMr5Ki&djM-1GNUF5qN0hmw9UmCT=@#tC)j3(r&bq$V{ht z4NLQZG*NC$2HdDnNv^KDS1dvgo=v>lt+YI!nLKvaQa4wO>b)?l!-EQI)Yb z=?yV)&P#7Xwp>b%%Z&`J!4*rC2H5E;N(U_LdM&U(f2SVk+tsy-Ly!DTO?md^k@v6Y z(QkR)J4%u0vF|ALp|`-}l;$SL-D7mj!PS0`ALfVYVG7NyF`rxyy-&aCG~y%k@xMyX zFhlp0wwFd`#7N zhgTazCA_o`tGX+C4W9O~@~6_uWJ- zor@in*XrDVC((Twhrjx@l(PTDeUjUkXz*+JG4_t8mqGf29vIR^>5OinHQAh@XJ1096s|jnde2B3tyjSM9VSPf=r$fSErC1LL2Q{B z6Sz`9l8R6hzegya~M^xph1$ybIbzsR5={}_V;ZaSl^A8#ve|2{S zI}O8sF!Wal1z#Opw_M$W=yf2EBn0G`AD@v> z>RJQ7nLRF758~o;%YBHShy37}b2sEXRLKs1eRLT;GDi_no_QaaAOhWMhin=u)R82r z?Lu<;NrI>+jZ8!y5W(Tk7B;!O`mQmdfQ6__CLi>pYr4_@r8F6>Crl$Xz?35USSh3yeqC07 z3|}9mngfuX$VpGd3z_lWt@OAM|bBb=7CDU2uoC4BGxZa>yxwTfJigZkam zSl0u^k8Vy1?-BcyIlc>i!;D*IKQe27G8M9FJJ~FSeA-Ov6W+7IOeWhSBGqzobGb_& z!jT8S4yhavUs=a+w(f1ZdhPDl+W#>TKTcL$ygTLw6=<{$9R zEQowW3Zag}-NKHiO>pYLHK_`gOk5~|u&Rpp){-FmHc+z0m;+FmHc+y_ZJq0W1P3x0iJ70ZanQx0k~00W$*V;+OaB k0W$(S>6a|-0Yd_->X&iu0Y(Dy`ZXg9zK*2e8H$63KGANQ*kRia3k`0AIui02Tn14FVXG@D~RR=XB=%4_7iB z+ldfhlLHt$1Q#z}h?7GYHht=j^AQs4q?<$g?g^ezHg{?4(gQ z8J7H(R3h!!LgL#rCk%A9s<9(0PKy29Tcbu z$U+EaoEI4+b>q|V8B!$1?LaIXF0{ft9cP`Gkh8cLXG6qZ8$?CtynngS3|}m@7Fuih z__VnaEVf%~XZX1A_rEU$3rhiw*t7aU7#*Uv&F1J-UuQp?Y4*g1Lqq*l53IaN&=3UsMF3#f&1{l{Hd z{i<@ehG)qzM*S`>E`N%jqby0sxyaIS0pJ{=;!lILJMPCNU^Fhy(@ebWCuiqHCmj}9 z+6R7+RubkYi#jBXpR^n2d345!O4d9swz4eEWZLWWYHJvs_Tz4|7xnWPFj>^Cs{#lY zBJGLY?ZYE&2zltp_fv-Mf|;cFMrnlCO^1y_bk3vUSuBe4I4h40W;lrcnPxx78P)(~ zTeXvtVO`ScIO%r*)@~Dz$Nu^HOi6Jcilm<}3X>rkAb+&fA4iMh9B71TcD8hxd`_0$ zq@&3ZR(hF4*p1^6rrMsLp8hlL6kr(7I0p68^z(RhQXm21sZw+nanb=AR>o&ZPZX0; ztU%)5;D$tC0gYmaD9>cjVibhLV2_Z|=6B4gpUSx^kuaUY)H5mHFurufepX3)-5?@P z56nCnc7NlmKwL!qaSShF6eU@%OVdqB6rJms%TJkFNRQtscS}p9We1lW#6?6|o0>=< z&Mdg%1=%^bEE0nyp>L=InNsf@VXC&z` z-htOcg=ZT}aoTSQ0fZG5YE&_bM1oZx^+D<(ynp7v7vB3oDiFgIOnoqjhXq*oAnHP} zNTC@U^&z;4wBJQ#uwG7}RfC+GB^Kmal}%Qdr53pxu8G7YjZD2mDs zQuim~GR;2c0&Rk@@?Rnas{XR60y%A`vkjGN6`!QkkR6MvN+X&09M%=4L6U&u=ZeNl zv44VyjV}#ip=~+o$3SqspVhzgs*Ow=qxIrqSjXGo&qjr+6xb|n1Lo|J6LN58)$^Qm7|*{w2JbtdD{l-g5Gp{l@H6{PTK z%;g60nVIjRD6TOeia&Z}))>GtU4Rb*uJ&dgFc5uzxzdZY4_8mg+TIh*~&AGM!KPyS5*xi;mf*_aw2r z72U{%JnF^FdO?snwf6mS2c=hbD05^EhM1!PLKKshr;E4nclZw?fG)RbF7vv^GIyIw zKSgq{N+P{iz;TGxg}yo@sg~ET11gQ{TX{{phQm1qhR|6XKqWVR^{+-Ch<}0^Iye=o zE5y@pk#5FkS?p*w!tS?Kwe;PuEqTy^}lF$+mts@2_92lD( zrF*+JIfh#F7yyJ`wP#U!8^^^ww3frwx=2K3`S6_KM&Kwp??EViwwNISp9K%nN&2L&|q{vgHHHk9fi**1(a&!h=Nd? z2)&bXmQbczVjzh}3xO6Xd|k2y(rrq)Y|-cV=eW~u!mm{sH1ILJE{BXSSHO>wU`Rhv z&(}9Hh|I*C+|UR&Da2)z3z#Gu!G@_%3Ewvu@gh-(F!s6y6eP|tR*YrDX@oG5poi+|e^|Fk2^oc4NoY)vmk z-G2gKhC-CZB33G8S_zu{XxPOG@^>-z7Kl?zyhPfq+iIgs%SA9MvgjLNNhu{=T*FMt zQHt8I9RQ)A4l`$^#(#pc$sh!$Hw^*`1cswD85UYQkTpbMO;UKJ;1d@zM%(sYDtqKZQQd1tb72{0ZyL9Dj&!CRr1Z0?w>!6iI`` z)HFhWVc15b@H!xZSBS<4`1_?IO9c0zlXd;r+MAm|lPJrxBK6hAf-yv_*98%oMWeQ7p|(xSVh};`fOf{7%@n~57x_`U`7)DT zAZ>pu%l~LX0yQ+0%IakI?7?hnhMC0+#(yc6!&fb_L~o>&`f2p8?DKolsRVbFV`i&i zbtgmT?ZbK^W9mUruiWw#*%&m{YqtD`jF$6=mJ|9|;MGm>GlelI=r9?L`w>s2+g7C4 zlN{5Ex{hW6v_heaZPB!$2t&hri4Sac3OGq&Ae)>5UMt}B4N2-ThUMy8FXd|O2N)iT$YaR*;$A=}&6|v+oq-czIZh@hu}mhDrd_v8jfMT%OXD+F=5-Sl zbvlcv4tyBH#M=a0m^kX3!>=4;_0kZ#W>fGG3T)fKkU@Vip!s!xjlnB>d0kE4?EZ9c zXzLu`17yJA8K1B>yj+gbh!=i1+QsfK&mT764}X=0=JY7xr?wy@ljup(K1x*e{z1z8v7z;XVkPZgH3vt!!{w5|a( z=R>lU0HuU->c|19@8Us182CW8gi!GZ%akM*P6Y2Yq@|SLhYh7YB7yWA67a52w-kvI z{G&wzN$Y{iX^y4fa5uD}@LDR&W{i>0bf9ELgRq+*1q6#lnW6RK$7MqWB`;Hvj0}Q* zq=Mos;=80G3y(^sg439%OOu~@psXdJA+xayx%i434R)k_Qcz6eCs!JRkwB(ghuAz+ zTYb||UX+wkSQR{631r!1Au)}gJbkzl0AQ8`m_@3~mjJY;OR+9~G4=q;~=t1HU_Tb-zY0YJo9 z7$<%VNVfPYf`L&LBN;v^2Z!^}38%e=){JQ$N+Fnq4U|WjP+g5DYmf2%UWsXcL=2>5 zF!loCs<_2`glL#nVhYc6IG=3k@HVogLsvEvN@bXHqJXM)-F6r!uk#*GWoMBNIR%?j zeb)kD*(DgNT|$RXeyDM+3OWjET#M=OLzQcB`ETo5tg^eg7UX>#*8)c0#sGzwj$ksP0 zqKR|$Mapvy(0!(bTCj{sI+i1m@Xrt|`i3=~+5F<=EQ=u^@X`*eS052?taplVb(Ovy^i*J`f><*pW)G`y@=#c!2&%K9(TCC!&+ z|FwH-Z3KbZPIe8dgA32YQ6vaA&_rcXpcYdIJk{LPH;exdWK{*sNjGKvc}E zfxR|iWj1rdI6Y%0TwtHG0LRO29_QTvzZ)hSg?Mh35c`@$chB|45{;Ix@L<)h5OtGOoFRGsD=*p374S6r8Q1!;}5Gj;gRW^HmT!29}=$?Y%-AXX(LgT%$kb)d#QRL4gv@ zS?v;{(1$HE#>7853t%QJAAlt9F}!RK-y~V5A9I8YsMj*i1JDDU-aDWd9rk!CRIHoT zPyU+$v2@UX)Obh)u$(mU(tW2$PKbXHD_UEevCX|FRaBcS&eKy?TR^M<=l%EVvK%&H zx!TZ_DT_`KUm)j~Hc0mmOlC#(g(X~Vi!{KU4FdLdT*m!A9dUpzRdG&Jy-U?ilV9Lr z_YJl!#6&W8rk@l7(4d8q(ggAgCHYHcp;m6x1auvLn%TGG^Kd9>{BmbNWvb{CqzCZm z?3z1+#1Sk`@_|7;kjjsu{4;Xp_=DpPd9<(*kp3b#p_nTKa{O4mN$p~4&2g+Iu?q&ad;P+3Zy3Ie{tP6a=%0sb34ehAS(`hv#NJQQFJ zdhn=!il$UatF%~YnT??us!WPXAWU{AqPV?_4|&`h_o0)R4w8;Jp~zb{2H1nAh1s|p zy0xm-hrird&|Y#CcRzyS$_eLjKVg_pgbyQreD8G?VG-d1yfc9Vv(T$HZ-*m@fcAvx zvI-(oG2Hb|(9*3?fkES5s%aO$t`gxSpg`8L4BhHhIIPLEd=TRcg zyaDH{MI0LO9;F8~(}Wq^O{P(QX3c1+aXdg}M(Bzi$i+I1Ma5NE^n&x-B`i5VqtN(` zHbE;4GreTcERZv@RO$E(L}Wivp{O$!3QN8MqC3m>LeJEdbMj)E7Q=-qWcCb&LodK$ z#xT-EZCsheAyBS;iV4A*7aX$TByB?q7r4=+hVdwq;!c5@>VYE4=7BhWxn(pgw9-ll z)|tvu=vF!YV9j~flM{;u%M;Q}qupmBR*{p3xwzEEO!LDc%8C+;oj3v(xt^N>e9j$S z)vbE!2|`n{rczQH4s5@GR!+RsWy0CO)s~@KyQZt=CpF!d)9FqmU992b=lEM4-L9E5 zYAPKB_WTTxP&I0diS3Mk8vG_Hofq9C0eETAPG*^OZ6{r~N822H>)$Nl}?d5oYo5hd@_fk za$Yy6Znu$&E~g?}UDi2NX;ZCIKgD3I61 zkpP+Q_WLDJTWsxlVx@V=Fr}+W{mbbV3Cl3B_W`y5{0uj9I48e497qaI#*tf&i}Z5M zkZLu?qjTz}G`a&0Hh7HaP30q-kbN$qXpM{M9Y??_#a+~Ypsa6r7fsB|IgZKNlKG~~ zvzU0jnZ6ecUSQEY&iSetnAGfiR?F@kSXL^wy8%C7b?e1+ zaSjiuw0mfO`xfe!lH5+!R1B@;TWJ~f>#3W6Q+Y4Yx3=kuNq%;U?2_j4Qfbx21eP|) zE4j#JMICF(-tC!c5Mu-@ExXpXR1`+48YzrWHO+mX`?Yp^MH#AF7)q*c1ynwk`Wr<1 zhl=RVFmqjNX#RlDdbn%6|KS%Eoi1Ya0}Ks+tf?V%DCXaNV20sC2rKsHgAWL3 zI%kYPJlr6~xW_A>^pIU9nT_a&@Ag0JY~r5avorm*>T z65x@JjGDBIv-jReW&?rBAgIzLUiq|W<+0PI*|)1+&4yp5(`xaFlew#BXNSxGD0LGE zUYh{I@+q&n%Ry$v(|g#*kQW?)(4#SWm4A{?pW+i@AKm&g$){$Ztw6>aj4mG37FKnC z8k9t(!Q*{RWXi^GV+Yf039$Urs8uFI6~QfxZ4(gNv^ zXv(!nn4x9R`CLo=c2iCJ0%1*2hca2UH72icw24^n~oz1ly)^p>A(-7sIi*4|1F%_ zgCcA!=^PzgiJ@1i3=f&2Hv7we{t-a^;iT560jHXN0L7asX!VA@KwJvBsl3m`pw?qsDg} zM$p5W8c$ghK!)w{bMvg0U=ZRBocwW{o%0X&5o&Bo25BaLaUpuNn8OEu!}y$90Dou@ z$tcrJ**f?gU9ll7T4UI9GK@q~5{10TC&R}X{2?ZWFjyUk0h1c16UFs+7Lj$NY^uaA zGuMma%QqW!<<&+tmmW3i?tL{>u@?2LQ%jA!n-JhxDw)yDWs|beE^br^QrX*;9|mKH-y?V#zhXjY-MNH`y2(Yp%p z_k@052M{C*c{DFj{{VkR1)(_gO@fgq5N<8_rRqC7Exg0DK6LTf zD(ekv_JH&5hQ;GiC7*`-1Iei)$;$EI$R7-j{E^`3afX4T*<--bLk|FJ++)C>vV;To zdO59#uTX-FxPO_h3xbirO0EhezR#_#^#^TEIo5sxz&ooaHJ*S3dwm08xVrc%= z5v?`Ahd+7{!MX*6vg!a2uRnl`mjD8z?=*v|w)BYU@G(NU@KP@DoyMSU%+_F8*SZ8c z!L8_W0W_L_u6Ij%_kx_7MXfJNR{9&TeE9puzPamUs;Ur>e>$glJ?~~d;vX({wPPJZgiT!iu5F$=Inmg>|4cvot+sG zAYei9_xE6MpI{)v!S@9e(_8if0VGTh1ao@*>w|CY^=|K3Zzsiy;Y^8(V*C^e&#B@XgX)ChdZ*ytTntJf7gN{ zgEY%iIR6WFR&HW9s*S9?9BC@sui{$ViUmjKFsn03qao||{_nZ$V(}~f%ozKbrGk6S zfj<1)r)a91DO*!kKOWe)eAV1~dgW_$ESwl6vXBTGCMo>3Nc@AnZ*hKKP0; zv@|_vPaT>G#qUA&K0%e(IA6EVUv{AeT|w4_hy(ASjkX6p_W9xv_BIe}D&HaMNBkz@2G)0Ug433~>7R3gnuu!)%fhOEq6)7i z#yD=tB}Ec0f$l9XYigdhmJ{6LN&uC`d^JRKB&>vXg&I(gwV!+{71fYZ2+&PFmXDtp zPs^(xe527;x}Cp=8-n(GbT)c>__q{*P4Onm&QbyeVke@{UQ>!_VQXGw_(83nb0Yf9 zID>|YPNQvas&6&0XB%SfMkP*v_#oqu!7@j#)i);$=JsY_UW~!or0k>41{Dfn-jKsi z(!(!^`~kKbhs)O1;8H2ske!c5m{*<`$OIsC7EI5T(@&)bxYfw0CMKAm;712;sP0mch{g~_C8VkE{(C)3&j^cXAY=ugnyf*6EE2w!JO2coaP&(-IDVymma~ z8KBm3%(OOU559y*CP(Iq*kRedh4hjA9Bx0Nq=g~r)?K%~shPm1zJA-VI41gTne=(07SngQQ zmg%-;Sc)UX`St)@CVIw__xmEzV{)T=NWz z4-1IR9e;$x@R`Hn|IuNPE>>9~Bz76-w>-BQ^W3+|xl2b`wKnwwo+mZlk>RPV_xS@9 zo;k2-Xu*+Rk;#kI1>Ptc!-P3alyPS1Ttsq zTi6J4oPPp;TnKjpygTOvxDXzfnZ^iufFJ9=vFSCs=8(qEW6-DaOHhO~T-bFb<~4_s z`90#+;%X`cw`DFR8Ns~-BYjnpvMBAUrifGgRpZ>&XN}iZ_-$zzM{YdZn~gvFUd2nt zO~}EX5vV8XHz}v`9hkI1{XUad_W5}2*32~^s>UII3}+sK?zzK8sYW(^5gra*9O>X4 zfCF4vJdM%aag82`{E|lqz5-pH5#Rv?P`A9PMQg>~=RKt*W@K!8ZxNK0oO`ru=0Piw zH{x(b&8aPxVs33QhlkhJ9Qq>XzP-AhId)8=Hr)+VTB+tWhf*RUcM-uUieJi!*^)+{ z&8d)oXScK-zq@@Kh1mJNp;8`s6q@vAk6L)(S=PziT0s)58bi})2S1F!o)qI1a!Na% ze)PDkZa6kyS@Lp0?pcn!z7XXy%r}s^hy8CsB#Qa^#`>6mNYW8zb!SyZQvliJBO=>f zCgy&Pfk4u{{1#JZu-i?S8TX;*=^_AWH*0-=jBn_npRKFeq5T4}$sNOnjr!1`zOHJ~ zgvki4k4|lOV?2Fb;P?M|nk@&x@zk|Krmq>~w4X7P_ko%Z+0#xmWP-(lY;fz+8I1z? z@OCN>PSOMcZ6|^+WWXLG8fUnnQ^#^I=-W#QTH{gbo#*6;8`c^mB&?4#s1zbV`M59$JW09%Kb49*Q>H6RqB5ta|D-R(vO4r@iHISrvy;?rc51rt zLe=}PI zGXxT)?~gl)nu!A~i%IQfEtUgR!q_eU`z*aky0IShl?2LcK`^CS!e^Gg>qdJ{&Xzyj zVd}=P#)LUPA+Gdo2p!M)sc8#ewo5L|e1F=}m>${7a#)p2w}>48(qZLS>Kk1cg~DoW zL*tL|Hc^GgFZTD;@#}zZtxxY;f1ql5>CnqEtjqC?tGrY;X%5_x)wQd;u6L;y`M;^3 z=eo-0{w%mv^1#({tMuIgBeeV30R&6MXpG}T)qDw&D3>r*ht3RY-6~o)+O=AWIoN_3 zX@bL9^qd-Q><o@@ zr=a*tM{CC@m^DwcxV2&G*2&<|Rln|HvbG)qZFKx(?A36h0-)!U%eguwFc+npj-i=7 zjXIwjTmup1#vTW@C8zd{OOXoUA}3LI3itsR|EW)aWo16c&-t&?XJblNr`f2^=GQaK-|xWdVVotNW=V2#HMnxlFn8`!$_(kx+0DWOyRt}LiBeNUGC;!ObP({*wDhx%A9Caa_kLRX{ zW4`Kd`^oeV_?x<__%1T}v;KO&Hh2G%!(L~z{Kf>t(S%CA?O zte`6fHd{8L-l(I#4#PmbJ<$PN3llDkd=ARQ$U!S@3PpX z3j&^W2Sx zV~C9BB@m)4mv-i0+D1`8iwlbD{|vVrfP?ELAEjF19 z5RTDj`fkh*80E;lrUo1R*h=FE6iyJi}tJI*5c zfAZtpL0xHk=4U`FKO;Wt8CfU!NyShCpLXhMV8n+K*tedB4}2ZSNBC zyT#wz;$Q#u{l?+p$;RI1$=2bUjrUvg7|?I;WI$MHi%@HKHjj5{zdPGD5bL{Pd>g}f zbtl7s8l!d-+w}W{kAtJvv&{pL7Un3)e~))6$$`9BGZlZ%qI{TkqwLP5*^Gf>I*I2n zd5t1jx)1!VI<{eRbB^WM3Dvc{oo~XXj%N9kO-*kQR@E<(_>$G$tkR#4MP})7 zAZPJStm7*;^=iSgPWcae$J*3L5&X=*n97w!qDutN=apC@1V!OM5`0lt)Lyc{mLZGT zjfxijcKb2Uo!RUr1o4xOMk@j5le$JXe|H{55V_w!I0#fH(ep=3|QGW~FcnVPO>D|kTZlN6c}tD64GW0u#f z8C@B2k5p!%QxVQ?ac|>ilE`a$)3f1k>V_$O5K) z_QvM(Q7iIx5NiQ3qYifx+)`w-0#D61qD5Pqeqrh7XOqZBEq|vm=JUpw?>5GK&t9c% zuW@kjoIz1SrR@+3*WVOhN)~d({w}Z0%JIsD{_Hg(fGh5*W&CZmgi8Usc{)nq+ifqB zDXsq52G}T`6zK-Gvf%i*J|u4`1Q3ItoN%&MQL;rPs}!uYPjZNs<7ZJo82}>T=r@qL zd|oJX?t+B6W`CrY>hkMUf8~ix(zuT(x7U4JRBD{Rd@6aVd$*{-H2D8lNQ}KMTx(CM zrbFoT0-Fnuqql#FqE8b#%8Me_BJw$nI>EgiBl7~C3SfRYrU~u|Jt&eJryPM2RPk1V zcz5S+h~w9JHcpB}uLR{=n0`!d3+%K`6TI9R{q1rZ-+$0c*J&7cud^&q4kni|?a^wB zK{6%OyisALX#*NRw~4}We~rc;lgI%}q`PG@qXVJ|;Yx;1*E6ZU~#@1pWj z53}r+7k^inG+Ca?q9{Zcfh1Zd0e-no$BCN-FWq+tDzZ4IJYLCqeKE zr)1LQ`YW*^w#3Jd>P*LC5kA`sE(Wi@JM6@S_J-+DC_n~1l>hAU7-z2@rZRD6Ev zSmT_Yg7oe+UAAB~)CH!3R@SD4t5a<)QDQYfU7$iO=z5D_vn$N4QpQcHE0y*X#%>S? zs9rU|tEgDj;<6kSb*s+X`JuLYQIcXp zY|~++jTLe~hiD7=KH=QUx)Y*4$@KOu2g(QCYJZS9*<8Hk^pI@~d06_JVgtI(enQ93<1U!T zZx6}?aw)0REF;p3gOJi$8>G+GaV3oOk{=vxl%dxEvC-XBi-6`kM*dGT$0M;o;itT(xW!DE=EEcVj8h$qA3DAojncnWTUn}6Z* zy6VIPc7>|Nd03TlnK|W^%oNP8P%0aaZxxvubjj$5Kdz}BlsP$R)r1_>k-4II|i{?HE$It?o012)KMVaxBpCICdw@ z(#yujRBKeJ2!8T7F4X)3ysBP?hkr-=W%~(UYnzOm$#ut)>PYoxF7XV(>O_VaoycGl zsGfCz=zR97J6TkH;*HIBMy?Jc$hI>l6MC?HrEH{%!jRFk6e8MEMX`6FP;^dtbY*?WyK!E z{_v}_S_E|RVcq$h~*oUpo&@sy%(+s+^JUv zVpZ$oU2a&>IL+KP#ee9OhdMojC^ycN2~Dx073xK!5zmcJ2wUmIOes|RA28!{T8Po& z?x!f9-g-)sRat4i-r#ta_F~F9>h=3OpZ8w8On$K_Tasfd#N@>wGxPbvpU|(t`0Vhk z7g_{pFD6_~AqJTMUP6nqWNGGz`q_AvtV~v9_6Wj4ZFEi|a(^3=CE6tn@8rV3dD7OH zZXD>i>*?K*CB(750Q?YQlkl2b8aXsH-my|1g@3vf!`%a>7-r6x@?~YEl~M0F$0nyu zmBo?5{&h!A=|i|2j#KqAVq#2z~{M!yDUp7tJ*I1n0Kh zla8P)n15kNKuzCBWFm3p^{4Nco1~}YvQH4ua|*Ktgzt}Y)@anb3C*Tb_P&RPgrWQi zvYdMoX^nTLmk6oo)Y;V;XX-+6%{i9bW@om=x@)e8#cn*IQ^nhiZ904HtxnllZTh(d zJ^o5y9qQ9rr&81AwjC4{CQ)cmOseQO6sUsvk(}veQ=!@lyUfO`z57-8Q9U&z2~70WrJ*U)Ks7?Up?2pfx`n!%E4W(*Q z9)Gz(j&L>zzdz8SG8 z*Ft5l;YwUAhRvuB_JG87siqmS?btV(QK&|O$<$jjT6x|y7tLS!NIzBMO>R_Y)i&B) z=n%eGcY95gcswhdH4v_Yp085@)?dlyYkzJ#rF?d-41%TiJ3e}yq1)r~mfBjfD<|G8 z!O@o)tb;oh1ABe?#q|078fjmO> z@uGvtM|>NP>7n6(!kx@rjEt?@rnI;N^BKZcmys@)Ly8pv9V?@2_mW|e*&@zCB$rKq$eRq|1%zdVL z;^u)0P$mTpzrGVmJiKNlC`X$Vmju@S@6GLbmk;~;YyAdNG0;4e# z262hw3ERYYh}ND}FXH60e?Bkb9n`FcB!N= zD)~81#~9C~x=C)gYN*QC-M@c9B5`?M!#L|?!amP3>Uu*3x&n=0;6&#FrRH6a-$3!x zXY)W+NQX)i!xMQ?Mz`#C;%B~q9g8%bn?+A&5wrgghX>>!c9737QGCYGERBDO?{e{4 zdfTXEKx8{keuj3LK!5X0hK6z|+$bg_Q}k>P5m@NhS7czYSu*hs(LEPXrEh_M3a~r!FWa;ymYgGlU|QcZIb(d&5p=-^&X@R zyB9|Y>`&0EU?9IG+{RBolaWy69aG_h64O;fGh^m(ei;b|PVz1E7TowD@1~ z(d&DA5P!4_H4W|*fe!w{>g1JU|M>K12T#a#1jPN0J7S1Gmx>f*(#TRUL?oH;w6C=a*zu`lLa8yXNmq?o5}Rf=JHIyzZ590E67j zrxW(F;akd%snReM_yvVWktgFzhVtM5gRwZ2BY$+_^{0{h)ggJ!a6la&O{0T#niflS ztUiDc-ReC1yOF4d|@jt!Wd(0vJY+${&I*ytR; zzJJ*}vr(oShZGjl=0$oH7l}w&?dqCR^rdNn9e%=wj%c?l_Oi)(A<%Dr6nWM)!#PHy z)=okCzOB9ol?`O@PpFwxGX!~3K${oSVzM^#iX;lr5Ttu?k@8*+#sD~J&D3D$l{X0z zW(5ibHAa9X;8gK-=KYJ_Hy8&$J2)MD5q}BBB9zZkXr!%Ed@0R2l*p-`_;IY7bT$Kf zr|e!h{e`M}WT2dx zq?*FcBfVt$(rk9EXH~iun$!4)-FUbVo`&qwh_K^q(mh`c+G1TQM+H4b}^44Xr*7Vz;IB@@Y-VTw-{Q4QNUv=d?gvpG5VEnI1b-t*_KhOZv05K zK?_0Is`PHu&S{R`KTo)B82qN!^OLTYrF!fDwt~5Vt!eAWyi@*Pkb3^DcxceIs_&Wwwh; zxfo{%iC(MS#RXs3RIZJjR?HE(4wht=g^A94 zJ!OygIXiRJmYHnxI0FR<35c6X=(6-_13#kto>9l7tYS(+AF;fIyD)nP@R>W<{i1iO zMX^6HSbQUqcAQ*!PJ@;)0qMaG=HnmY{b%8C0zAfEA7f^+)MLE)+6WOE0O~Pyt4Rw+GeN( z57saAt28X^`>fw;O;H<9qe?`+n~joOeFlq`>T~zMI3Bbj7xu-02O8{r)jQtbFM|(Z z*rE*EJ>BVlQ3m$D?9sJ0W%y}t|Ez~&Eail~-j2ul^9mitLyxoSKGgzxANI*m<1mutykOcMX-%Hy}`## zcuXg0k;X+fZ4qKRx`2nR_dopb-FH9SjP3#B07O8$zm^G2>U*2;_bw(P1ksTvOpdFi z(*VNjKleAb-rN23bm!<~V<(-8z8uRw%4R$Zig%K3z_p~n=$^udYVv=6$2WD-MFJyZ zGO|%ziezHJ;}JLvp+LGUe3`yR*wPzs`{4@$4( zq`Q2US<5VD@JNH4HX(oO)dHYW307_oNKc6wl4zUqMn>+)mLOv8k>=@iy?$SY!M%O2 zlJP)nC(!+D&+EElDu}{PX!0eX<%UKKO0ku>ZOcWe$|LcYAzI39Eii(?)pT>It3Umi zZx`Pc;VsVpIj&ggELe;RXKCOLOBo!S-=z%R&{AS>ymyR81>Aq!(pli{hm3U$fC&GY zq4paHtgJ#_>tnCF=yrMF-Ck31i)?coa%ZaCOpq_o?F)T=F~71Ml@chi!;?+MU~b3i zoQ;reN|=93?w7^m<6&rq>7|wXw$IAahf;qTuWy^g;b|%e_+%O8Z@A$t z_(|Adb|qrDTBV&$#&;sW&VHHD?7Rd+q{t>6D?T0J>^y&`=~_L@!LRiC31>l)8Pc&= z#ni`f2jDRW;?p(a06g;@sgL!>tH4@#_VyNBWC$m@$-Iar11DUyk z@#t7kW=d%@f|S|7&*|S+`ZHhnGtvg-_xn)MSW+$;q1F}+7bT^a=}?ZtV*|Woas33A zxmppNF4cb#Npw~VZ^^Az09RHa8tAARrOR&`lN42pe$GF}PQDqWGT9D{j!!Mn?pzC1 zEqSE1{spa~DZEu%2+-)f*r`D~y)(U<-B3fgBc2shZ7DL}37Yu#`d<5OO+q5Gk@Tt< z3ao9%o82+#SHRxatcS#5nAq!C@xA2r?CJnoIeC9Z0VsZiAe?~a#_yd-v?k-0=mg33 zr`e59^BialiA`vYqPCP0T8xlhdeZR8H^v`@MIS~+Jnd{kD9#U7p7KwXzo{jrY=`M2 z(Q5R?8}jcMuzWhH$4yRgm4RtacETcY(Y#D-WeB0WH03#*)*J7S+VFqp?Kiga7jL|? znZJLr`QE7eM&5oS@3cf@mo3t{gOy=$O}MJE-?6u-G!~U-X|qX!jQR<*Y~%E|#Hj@M zpJhw>sjtgw>Ehp^PQO!CsZBfjiMhR1t?=+-fmT4{(m($@l>T|6(m!8O>A4sJ_P;<` zQ7q_WP1Q=qzox_kufS`M8p7AsmI&Z$YYP>I@3l1|st(ZZc-6W7osBl6$@F-e8wCocJt(YRU3=|k7rxWa3JX#0xUw<0&PJgt+g zUmJg83rt)U*&2s6CDRfSt*+bItBq<8>2^xFm4hE;qhy@(m^_c+Qg;gqVhse_*=DL-dLug~Tgnsfs5f9x;wtW{H>$A=2jE0I6AW z8xNsD=Hi-qWL2&-Ad3!#U0>64u*H9|+UFN55U&~MN+x4eoTDH(4{6j%MKDxqD}qB5 z3(o&{F2`2Hzt|?@jN5%TG`3CEs-Fxqa8Ktc^U>uD{+6kAa!Y0{mQ0??wTMy=8`{e+#>O@WN#Dafqr|9ZiD6E0f2T?bSv>hf!Iy^9^0sW@@wldQAiuYs* zplpW-l^nISo)ng)%emW0+cu)}mFN`PtO0cmQ?>8SFnB?D?%HL4>9px~THb3yNa&=n7ODRhc^wabY- zZBx#U%(+5uVFO2EHo1R=0yNOJ=wL}ASI-?4xK<|RD&#St&8$OlMdLFBoaqHhy9tq2mL@b$>Fs}`aX+tV&7(82Lj$On zm+3GC2P_Td;CJXS$#dNk&+uFib&8fcOos1~iR8-Zyz2}bke@%skbzSovy9RV7;uVx z>cKODsFi~B1L2#1!4U&W37y1nZ=D}PNV~^yzQ_NYMgHF`@-&-8bZua#uC5JuR*hXF z(vkIM_E^|JUKoFAL%5z>5L_4y3xsh^Wf+PT%1@zV9xK3Q3Rtpf<={g@_$CJ*?B~GS zJ$y(Q&*bcBKd(@~2|X4&H9(;@4A{L%rlF7Uhkdi_7tX)&rb53H91xF4@p`DXTBePp zMqZsRw(VefE|Fik{cVHp?qQ_0_dIKoiz1+Ey`nwwb_Rb_rlA$>-(vBfS(^e>2?DDg zImucR$@02wil-cq+UO;+c-RJd4js9mY8--ldj+Mv< za(-@naoNzcu!;eC_XY$vQw5ycW6I>HLEgtfURTbV!;{5`@~f6zbixkV#i%79U7&Q);Hc=M0p9d@LJU8#we*lmyL>HM_;?C;`95V)}XZBHA~ z!oF4Juu=z;?P|~7;$#|87w$HgrNr~HnB2ZLz-#K>l?;|~e7o7EO}`Inx2cc*j1Hh= z0SJHampcAx+`Y!PSyjt4%8lD#M0r^2PaQZVDp$h>gZ;IEkiO(uUp%Efm3JKG+92X} zHvQW+s0$dl-O!BA%)|n1XysP+72BziDJohm-W!g4(X@u$uQs-i3>c&CKghgGv`r0~ zB;yGWY6BnO8+J^`z4`yg^hQ2`s``h-bQXWr#Po+n3LKtZBvL%KxtFfhsFo)Q+Ni;B z#T1Whi+|&{Mk6yX5mcWxcxxYN8oD1miuRw0+^DH#;%TG6EyPMgH_E!Q$c+nk|Ch{@)p^BXJbAqKeWk5CO1i?aHdsvbf5d3y8;e%srwkTg)&Il9Be=pK z{xLbeyj-RN|MihV3cIpT0l6IU|7g+BMHa2fPZ=~546)&3t#7IU3NEBk*_hLn=2SLr>xVEcdPY2rM%o966x39J4ce1{Fa z3fI9c7YjJdzs(u?*IBW^@aKvKKT+wcH6Ev+KAYL`zgY3X*2~nyr>yU*a+EI){>zp8 zi}VTV_!kFHV7dQdwf-VqroKI8tzMC9ly=%JJQ&fNVk}+0l zVcIJBzlG7lhe`Z%@}w3fV>GaEVC$cE>y44q+tOw($mp31GOR-)aQ&~nQLOxKIJn0X z^a7WV^!%GdcH<(s%BFYi4xVx#@8VFvE|uP}6_SJ5z$&)OOg&7suar<-Y7~Id+8v+F zgk7J~x{stXKebuCWzKK+kx+jvKGeGH23<3T;uVMiXHA@O84~wM7NU6gxhurqJ)@O@mB+JUV(^?5 zOrXOpNVJo;4Fc~>r}5+}!LxSd zp`W=r(weXAZ*=AYkPvd$Er>91QyTTC)4X!I0CRCMqO*V42El*xMPNBVz%Dw?GY@6) zjKLD8(n?mkJQF9oxq(`TER^eWam%Udcq`jf#!8y6Z!9i6zDJ?lqEIGvCRJ7qx)C2e zZn71B5Llmv?$H=jZE|(`cq8{|;-XcKb(7{fXhG^A$8$X7b2Ycc^eFQT8#(}WD174w zpmk2&Kl?1`&9M$zobKuZAPP-sXEdocCMaa&(E1ew%}AIb1Yi{3T1pc z1)ScsYP?NPk1)yAcA@E)A@7#V9!Cr;~Jb) zb0}7Qzf0lyeK(zE#CCLv=?;A^&0`LVaH{EfxF~sSf*I9U_s8!;k5&2gjE z3gxf$Nb^4@AMFk^_;4xOu0lJn%D!P7fQ|0UOXi%%lP=19RKBdW?U<+dqS z8CJrLntP{=tBZ7=B?W`(YqXS!y@}sQzKVa2>4h8`@H?nJPLqzR!VPy=eZ1<9>ogvv znHaJr|I!}p0zKE-E-RyjzV3JQP$+-(q`5b%ihRV6$sJ!;l;pX4VoPvHVP_&@e%4~^ zjNEQC8_+k27j=A;KiNCh<~C~J=llzie87S0@f!Hhp@2zT2+$-X1_l_WbG0wYf#ZJ* zcjuPC0$Lh zs)tx1vbt;hyn=z6eszGa7zBUOo}axW&@*7s7|#dk4(}#qHY-q{Wri{sBnh6_ z)#7^w!;Zz3*2R<;Uu`C}-U9qRW-k3!iDmn_6lC~~xorwlsjl!zsat|4rEZCylxphFgCpvV6K; z#RQa6o0@?#Hk9`BDQlVMKXEqd&PwQNv9k#c#F-Jhczd#zLjpd89`P(_FWd8C3h)mf7xSqF zL7hc&sfzqL3!ljonNrP`JhvT{pMY^;DjGhVmynGxRJ2sT%*%flz+w(~xEWj*HiVk7 zt=q93HJ`M_1k(bNx6m6ctDaq}Inc-QC@A2X=lL|B>J55iH2H5ZUXfVo;4F$u*q-BY z9N+_CD`tsm;ty zOn#YNBP=A&^5=iq+;HDmjOUg>|8^)lMLoG0>^@ZZMP;o*^dJ`7l(8toA6Awu6kxQ9 zPp?sNHdGPF*kj$nljEb4@esBtsH4M?f-4EW`D$Ms!l9rObvis8jt_nqA@166_~=u7 zUsb`Yq@$D3;oj)B%FX-<&s(7*O4V#Xglh||5RQ_jp~ii^M!Bq!}vxg?Y!N_eEX^Ll z?+~4&*tdGOq+jD;0MiVqlJZ@4eOwlDh==FHFb5ZLnPWrSL}8Xq@}E_GN=*VH+y;UE zBDg;k=8=Ce^PKdWl{dU#ogl*Tt}g?hrM?k(As?e_M|hO@@I-IG9ysWB`z$~EhhetN zSztk9lT$}*lHIw@OP#dCiBxlu9E4b+AADJd5$mkd)wvsJI3tQMR;()x*h`(Q#pSQU zx@-v#Xey}3xr)D4>~XmORy-1)NHtNGF9L~%r5t}V+vlkbmzeNqkB=z(a57@^0iJaj z$z4UOefPu|A=mchH3#fg8&9Zsy^5xBjiPE14GWr%i*%-d`#7-pHC+%?$8e}+c2tVz zNTirdjkKt8rookp4yW22DB6)yQF9#6-1rV^63@tC696eMe;miM&fnkLiJs*}$PQg42Z^}rF z5J66*sZd5i z-Y5D-hH!>J^)XG~{n`5+&<_gggZ-Ez)UeBiw}R-F+NCAX@25?2V4Pl|&^je=HLia* z4tq=ly+-F_dgnb4)g$$JJ}V~W6~uyx8Wz>nESu*E;hj%Oy%KeLQC!_76=42yzqujF zxOGwhZ!G3VU#rsL!O1b)oj$_(!EMv9?W7C*^U+radq>A`6%rK?u5=ecJ{;~7xWle) z_|wl1jtLt1xt%D*fH(J{c&_sKJo|sqgZ^o`E(Y2tGtuj5qPu>_cfGV%@%(i=Orn~W z#!D9M%hEJ!-vxX zQDfP(*Y3sd&T((ZUIq?$%jrEs+~`=%QQ>}koi8q*9h zEJi9q1~Xv5UP@h^xp+sHKQY6rSDJNn{||jll{3lChyQ2SptWY4(Vk~d5H1)ZGBv5{ zH7ya)K$4_XmSUWKzG;wa%cp;yvm;zPRAwA49Mc8%Dh?UJZF;_LBrfR9hK&(X>p2r5 zpJ%K*r3uMZEhQ2xssAjdT)-qCzNSgK)wQ0QX7uErrC+A@+q4RSNU;cT?3C)79Qr$H z6l6F`wM3JAJ@U$$OyS8|sscL@XBnYU$B2k`!NBba{|$4eW!E^r&u zwBL}}b}cRz!W|X)DP#<8modt9gHokbthOamND4Y_0rq7m>3swkSiHGJWZWWCAE~m+T^_e!{$hw!=EN0eK$`=>|!ffQkxz+rlEPsEgogHho(2MN)3im8v z0lh!zn>u%6)=&O$mWv;@_c+{OWz+num{TFD$W}|&o7=60wyyfNdOq>%8PVRUd>5+W z-EdSSr&O6B#O)8JN!${DDT()IX`H6Nf$l;!$a6>igi&}qE)eEqM9&M2_FwCx)SMou za9I7o-QjGqYe#=i$65Ug?%>G>J)Q+OTP|vqiCF#f0KA3K@Xs6zkf!n;Vfcsb*pRf! zD8-aPKPhBzX6h~Oo!XN)3^zbeqS4UYw}7Y3FJz!ZN@yHLRvGP$)+5kWbsK)Q-T z8hQu95}zGO(6mIQY1$qQ_AhQ6H2%-Wm5X_uSIwYh3O|}}Kcx+rLP`y+>3iL(gb=P! z{70|!PsZrb;@08^9FS4F-3IEjzHc=Kx@{oldIasxe`lr2M#J zzj9=@O+|l<8`Qm~yXA<*uC~ot$&jLSu0B$4OCQ=@TdQ?+Dt+M9ov3Y0^$xU$H3C$! zt#+yWE>Oldec!oqrEx*8sx(IpgI#6$j$-@iP>a%u0Q4D!{gSI4aF+6$BNUqGV7H|O zkZO!YLJLbtt6wnb_86sf54tC>v91eY)+oDDb3xe zUSt7KneF>6rdY>J#lou0{jQ1a;i-}!bn$v?)5Srbv2Leje$Y-zB(TCZnm*HQqu&pF zmld>af{wEKz#;N%psXDmKo%bHF(%o^}78*zoDLI!uoV(1Q@^C4B1Tkl;& zT#_TcttBIzE%06E=MYzMTmm0lmcRy)(T;z6#d4V2Y6Il4v%o#d{?_XLV`f=0jH8LK zYK;N(l`J2cio4fqebPk9qNeSy9=YgDK-^ z!DZ^gZgf+0%9!{6ks;sb?(CsMnu34RX|qL!4Z}zkrUqiWv!Miu=ze<}Z9P=o3DM$s zt?;R`jy;FK%Kn99=OGbb6vd-~Xx3KfW~}D+g5B`?;AQP>0Hvv$;x1iO3GyVa{9;1#Te_Rq@wo#H&t0)ZBBnOF4m}Y z7~o$f8`@gE;x@ES$>9F=4N3&C#U+6m|1vq?mi3jTfMMjODgqPdRD zh>Wty1<6(~w@N(`-CQ%f@)cb3&nUN^gtYIpke(?31m z`J`Rp88Rn2egV*LHProSo>K`Pxu={vY8(~U=modMf<>fVG2n68z^{KtAe`nR&7Rc* zo0I+qwY(Y2xbDjMoi);$f?vspE(2Vv@c7~vvUZ_D!(eHk^RkKBt4*ZUdeQ1tOc}_yvnBVlW2mWz8LwfFPV9x+gvz3iZ|C;GeNJam zrlcP|Hh}<{NZJnmLu`oMIkc$r>hUZ)S5BrK&fDB?vl)Nbex$sR+gbB;QSlN*Y=g=y zs~fWwfdTyeK0EkNbeGwlshBVKNGz?1Pjwnc6zu!@BPedT$O;i= zM}{sc6N`VHQs;%fm@Yk}U*zNXtHsmPkc=*xA6~J5wsrzTub|qx4bmkBDBDWg4H)*7 zekEEKVFqfcapU;ob;&}&*Atz|+fN;6MJ@^w3{f_{_N^c!mH}_*^Cr}ikVs!m!u&2Z zxqMdo8Uo2xmEp`6rPnsV@?9eYol&3#dp#@0e1Ow3;ydt*;K6gy-x6=?FwbJ^@CN zQ<&G5*S43totQ8Q_X|$-G`3FEJ?bN-Q72}LrZh9oNn74V+?lT0ZK)P{qD3AEJS063 zdU{?slJc;Qlf3r4OI|^AiCbT5 zn7x}^*uBR_Bt2wdLb=BZl}|wOU+`M>-)joOdBN946&Po-|}gnQ&|2cLD|zze4=**${9^ATME;d4i0Bb zC6&$ekN(9^kz6WU)3-CaA%ph%69)L_k&=>lT0N zq@xro0aAoI+BA8EENPZE*4qL<A_BqhiI#d>_ z(tB?w>YcY$>!=p_yS8C9=Qvz{F*1KTSx{Pcu}@TcfJP!F|B+>3aV_dml54>rQ_dE3^;9HcdA9 zh40*&7rlIve+T9QOLfkO*jt$z{858#O#miOqk?8y_|ic6zRZURq&q^CR5C9xY@YCJ)gFRsNYec5#{D$(vg!sg|YiM}H~V+h@Y1<+&LC#)tP= z-uZN+R>yIwTkleT>cEDU$H`($MqwmVn_g&nB0N$V0!Gv0ytseiQD#rGW7xRaQJ!yf zBVMc!vmux+!=y}a1RRtPL4ql#(5%DaY_sqIpDUXzG4*zv6$v;+?%QfNZibIRM70jQ zM|*H2d%eipo2xwooPaWof*V0X+%PQ`HI=OBD-Vn~wBp;@u4d&mB{9ZL^`qG4VWZa? zY^0HBik8}SSVDiS+d&-~x0Bgz+?`XhnoF)NsFtb&;VX4dK0)2OZV8g6ck8zhs@Y>< zmrqmPtgp;Qp`VoAC4)_=hm<-d?+N=?bHEV=LU>*f`k2383z;>&Inf=|eKwEjEu2+$0)>;83w~ zxCLW41}kvu-m^t(AT6*A7QoV;wGik=NfM33;lG%1E*polU6x{Yo>hwF5e%~nZHIR4 z6wl?^YAJuu-sNRjXlGZI8}V_cmC@)ObEuL{^;fJU<8oYO^BSLA^zBcR*VEb_+M)zr31dO~0o<`R-+`=ZP*pRFr1UP5W1sagBes=uM~~f_mWAsy_|7$xYrepnUHkCczmZ5h?KH=iuDGXU zwBUcr2?qBkWlgW8E+DO`GC2FY+WaVqYh1c6lTinezLzN;vU~N3=i=T`yOBA|)@&*6 z2Qu5jB_&1w$f(&#`nlJB?zNxW@CbiS54u+JE+u;+t26O^X;GLVnjE&2CjePl>WAtp3Tpr>Cd||>L$-CN`KegG1X%I zxD>|o@6_p*++?RKa*~%Y8X<(ukHLnHz*<5epUZwm$YII;d+|4-+C-MG0%e`+vu`)G#;X_n14Tq88}TESI0x_l?F7Qm0?ItRB56*{ahGPb7KrfZx}178`?^=)e?d| zgbE+CI-TY@YNvF{`CJOi+sWC5@irJuxJ!eHta#Sg?VzShUG15SeZxe5;)nI+wao z&3&R759ZUX&UYRkoje(i4~`DiW5WRg7k=<*;`FvC$JxLl?a?7kB8Xl8K;VBHyWy1n z>A%&G;k)9bt=j{ot=q?VTYX}ktyr+L2MpodFvxlLZS|IVC;h-uPhY}#L6V8T%m-<5 zaVGL{E`37KUb}v1hgf%+09stYmP9cOA8?dH8P0RrxjZhhO%p|vrUgNZ1(NoJfFciR zhg8Ih9aa(sJt6);qG1KSqYZxs5919#D>CJ^wYtB4@W7l+vezr^mx`VdS?NR?dlM+j zMg3Sqj?J~bP4Kdb#SpjeDpf6 z9N3ouZFj73#qQ3Mx!>iNVxR&PfmlF@t`)DS}sTp-j~z~Uqr zXjP+A9$nf-Q9;toZVw0NeSbpij}O!Q|B!vnlPpQ>XeyBT`aZNNnJdi3Onp zom|LcFPMq@rnb{JcD9L_;!KL!{p$`Q$$eNao(=Hvod^6X19yLzKCoX8?R_Fh-JhPQluHAt$+|nC9yHh_Jg|zjoDSyNJJHV z#y4;1=CCo1`|4g@QqQqd{CF1A6`#3ycpehe#@<9~uKrON1l*|!I$-weM>Hi!}4hB(;UB*K&7{_tdz2oFw9$D71=^4&(s z+yCm|@XK}Zd1onKsnWBXxNSsvbmhJLvzN`~EpK}cvZ(Z~`1<2s!vP)J1&)X-J2@KR z2}#^O3#5M&3wplneMeV>sRVA`{ZVB_zwLV$l4KuVa7rupDS+0MjIPLe$KY}|ZH~c0 zJZJcu21hp5zBjbZ>|SpR-kHOz&B;flVzGs{`*52Exb>gErcfd+rYSTtX{Ex=+L)Yv zHyR!v9X|d1=&ODAI$5q%M89IaT*y=%Wc05cwQPUIx(_qJ9#+lix7IwLu6+?_=pFb7 ziH1cTF6V$Fzr3ac2OIJfJpBIOSIATZa<}KZBYnIBBmEEihm+Cxo0G$*j}J~pufRVn zt^MBoLr}9(!A(1eX^xL@;u8gWF>O;(#L-p0x@Wkv2LJv10`g(AP606fmtDfq@#vK~ z1gL-emAC_2?}qNsk9h(%e>(qBUg6;fJh^?nA#cFPKp$86YX0CJB8B_4c4{Y-sPYXO zyk*{h)#P=w{P<)vx}Rtny1=r^Hy$9556hE0qnv-Q+A}{7OMET~R~PL_1L~~utm*j* zV-G{n>|EvMraSTQRT;u)xQ9EAp2C0Q&*6X9IA#|iRC;*y)TG{znSg|+xn5Ph%0Qu? z(<*X4uk#IsjpJiRyH8kG>n!dp@0VvYbcr;Zi_gfuk5=}v7LS$x?yh59i#Z;io*sNV zdb&S)JUZOFr_P0}=04_M#v{bM@*wLU*t?9Fg&Uq;VgCK=hf?br$LQPP{s>1M_icX{ zAXL+L3_J13S*wClnV;A#uc)0&` zbh3Zt~w6 z57t}}65RPBJI18AcZSB`-+3}RJsp33HVRZt=MM~EB6YNkIE2`k9UEGiMm!24^jJiD z*=&aMsi0+PsdKRFZd}0f}ZHsdV5msQ@OMuJ-i~g20DLHsieAo zhqLZe7vuUiF5#8(SF3agd#n0CBqIB4JBsQERt3OQ(UbqxWOX$;$)|sRH31^;rY6s3 zi~N5*xr?5BI$ONrPOOijAeHNDiit1&*N<-fkfM9UtDU{C4n~J#{fi1u_-o1gK&yO` z7tev7o{GkZA_7iy9e*>GGxUG*=kkaLRgZ3=reKK}%3S>eQ*YG7CO`82j86K1s=%1} z1-;h% z*12fR1KL>d;p1XHb-+kps~lWb&NqZ=Dn+bBfKVx|sl4Af?np(shw~D05rhhs>KEAM z%EyedhTFmwA>*kf+qx;+F}q29J{aOj;6iGwBp&9P18po1NG^YBkV-zyr~1)0GM5~m zWt8CL;4F&Da2>#l8aY77idmwXC}HA#NIPcbIebFlNlv4G$8b~3J1b^+x74i^sSMv# zf#e%c?o0C5MKSqhcCDlI8BCbXHQSA~c%BH9ZwGTzRF4}tprG)J%Df`-4!#`sF|1() z$pX2>@PB%Z%CdivT0pWM%MP9#ADxVchvSC|uMIf;{OB9lCV4pec66dnhlg++|A!Hx zt~FLGkbrX+sqXBDUbCVQzz zRW?75K*LzEE76S)*grCj%>|REh2|?W{F;?jst$k4Ca1oG3b7a9LfmsNd1=aO6Stj@ zl=@l*SE8|jy?|PByn3kucIi{5wpOOQfq$v%E#`~-wSb!_Md6#5jJyaFzq=@!JWT#R zM<);IM6}np@Em=4cBV3xu;E@-RHTG`SZRya@D-T&0P)oqC0`Op3Io1if=os}0#B|n zyJ~;z2*uH0^D$mfq*Yh#0l!$E!aQ`?yVWj+c4uj$Y6ekbyC0_RK<#F zu1_DlyT8kGmMpw0Ne8Kj8d0*)Tk1i{RdG(sfU!62b2 z)g|4yQ?yxEbCjO|aE1|fq9~O^D)`Nv3!!u<8|O9OPtQ>$d$VG$4|s>V7I&LRf3bJ$ zPtDZ8pZUT6A=Ysy*zd&WIQSS5P&@jG0zOfhqdnlX^zg1#(eZzGA4xX34Jk``k?K*$bFhQ}lgQSh8MeScLIt>tKSHdSKb*2}t1!oD z)6=5NWc6nEF6kK7rb}Cd0Jsy@Rr8tw7!MLHZgCO>1~0&$s6A0Se9yn$LMfM5JZ&-M zv47sZDKLT-afB1nIkdHe*$f};)SG`zJop)sN@uVN#OLpN$J#X-Jllgj451WD=VJiQ zg35vcg$aNo9Zuv=T4aqYj?07#N>0Aav&mRF1MWVKkV<}fU^1UE82@B2%;ShB8}=6F z?H;D~2ABpj%2iR)y4QIl`-}!IlbP%dk3ao*?~}vtj7Mv4FE7DGe3}80Sb={J4?iC6 zgFoou@prnwhuI__VVJ*$5_sAJ7m7&OcU*$alu33CWllaEeoFW)S!k@>1blk@`93%x zP$L-FgmLeAL0^Q)5-EnJOp08XUtMKoa%o`_%F+m63XKCnh6bStH4a2s8jL5{I2`A> zB#XeCNyc@;Qj!s9DaiyBlFWY#uQ(j#89-dk#lbK~+O_eA=}01yS|>`PJ%ZcrBw#Du zPa@k*V3z9Ygq=Zkn6rlJh#g)Ew;WTT@D&Vub``Us%}nUvNTqmiL$uIl6vzAUojc49 zPJi7!iurK!gIF>)#l6>-*Yf0~mdM#A2AJ2L^zgFjTbHT zSKnR;VKBQgAK|Mr@A!YDr{2u9v&XNPZx;~Cm4r@$ip=qWA z^xq_>h+P&b2yZ&WN7T!8i;VC;uE3~DPh2K36qXdIi%N2q3QE;v70dxRHadr2hD~w? zk&Z?gU*S!Q=@Z(8;yn`WH!-0p2~>q?St1VUXfAP@uB>&tg$`zW_>P|!te&1x=HVlpJak^4Tle6WZ;;L7;xO9-4QB}2&@y< zBG8NPFsOgn%o0=awoXpK`ApZVu)}!GNM(P=--%kQ#(Y9ZA5&|%MqhI{t)@K!ykb`+ zX(2f|vx9HVkYOaEU-GK;(!~w>B@egrEbsv9MMD3WLZJ#hnQ)RX5&^XmX|-q+nTVk$ z*m^r8dLZf)h^F5it~#>0sNYdFcT9(O;j>-2wxV%i$WMG8FA%DOiqn(Hi`%&rr4 zkfmlrb)A}I^%gunlL8-Z4BPlnjIUEEZg!&;vYp%fTCq>8jnX zbt~4Z3-3c6kEse+pQj0w5-0)#cGCmtjKIU2`IIErRutZHfA8j|SSyzi;bU?c>+`rw zDFK%musfHHJ4aQN)k+LL;j(MxvBvqBY}S8OdYm?ib!H2A8-A-#_(4w`ffNr%&hcti zYVP9|FM*Rtc41gEwL5G+1t1-iT2V6C(4?HYcd`}8_m_ePx0-9k`)Gp7IWT69^HDlu zbEFgvQ&Y$*rhL#MOOz5T>Q`I*yhLKXG%`3<85>-cYbDR+x!|TAoU>|1Ms~avm`;E0 zf?5gOt(&lx>4*&*Ii6bUYXy7qriS-ur=$1!c8UL}(?@OXnmQM%%%g5Qslub_Kt7m# zUI0@-tiNC5jG(7Amu~EOgQfk?a|;+|HU9ryWeerY)wMI@!Y;T(=3OLbqd1N=?TN8#%?90NL^ZzWhEASj3h3w z+cLY%e~oil?YY@(n+*aqqc5jkWS0d^vYXFsKEWM33CAL-jDH!Mf`{H^)^AKOz&K%l zCrT;-^qV^SXrQ!Z&<7W(R2lFMPOhgTdr+EAd7p2;%gj`3UGtk~aa?f6FtPIo zm!?}P(NOGVdCJsF#%G{>{K>BosJj4)9!3u|O^O7{CRuItZLzk!vQ*n%c_?jrh4ki? zze3wyS(COYwLW!=3jdWr_>zSg_6e^RTX;wCrgD%z`^tzPOjHlzE;A3O9fm%C(GZ`= zht?9V?J*R^SzFn9!|=Hrz&mbN#4nFr3)>2j>=kP#kY>sowCtywhj36hcl3Apfi<4GVF zSxDV2mJXyfb{g%$JB9Eb1%7UC2lH7PcVx87<<9c0=j{EG<}>^xi4hr*U@bmg_Km~> zhB~1127N~>qFX3(y~Ba*(!XFNUYM92agR@%UU@$0mK30y(@!m6f!M~3~qoxn?) zDfq`aMjCIqS4m-a!6|S;4gt$&q=b3YU-kQaT>>^5PoxYbY<>T-dO=x$-vmG>0KnGw zJIQNkB)|>d65?g)*+VseO)w|d0_4)`$Mphe4I7leM26J8k^Zz>rD_e4Q&4@jQJELh zMHvOy9I19#q{xYfgJ$1<)QKt*84pc9pLN|=YurIlFpFKdn|4M?a`c*5_I&4$h(4~C z#tmqdl1^+egOq3t;shWUJoYZ|TtYm3*F&{FgDC4(nNqo=A{w}0tp5yLYy-8Uw&G3r z1$`LT+YoY#?608(O}?~?+H*%9pX+T9dyzg+ix~N$CS9Q$>Uvv$M4qh=)F8sWs6Ayi zUT$J0!lB4KnPv8`q_)7I#jzL-*Abr(9@ z$-EntfO9d8H2QR*vh7gVjZVV4kW%(U??ftj*GkzH*+9i(k_=Q+=#enoE0KIm z%>ioqO;w?jO}sLNF_pR$6l#zbx1}yIt{1tR?sbN5AZ{Rk2ZzlnFS^Y)#WZ`+7&cV1 zAH#+d`SUQ0VS|}r)EP|e>A)TvqE3j4<3CVS>;-$rxDk4z>LW2|FwqS<0!Qd0bhXFi zTD9*?N~TT+NgG*N7A3HV67dNHDFwfKwGf<1k8pWgvkiN#K>dIzA}nqaZ&fUE zE)a&dsIjkqe(5LNAjI8S5){*gs1g*d`c+ez&{0M5>pn3oDVaM-o%}zv6+~;N;{Qm*H9Re$B2fBVMH}4z-aM;CU&5Hi!w*4X72c# zOHNnK3_1paikq%VV4L~J>Y8E8!4y8hf;Z{xIw^^N9^k?@f8XZYFTV+(RAW+Ss(OK; zMn%=vcx*|*#6|e9OmGEyr*T#Jv;(egnz}#^gs~<2yKy=ok!cgsoF-`kWfa!|*i1}tZ#?`ZR9Z!=Af7U2HNj|m3MxRd7!e}n z3X%tl@lGCcL6CQhXlfMe2k1J?{eg~boiVR}$yo>EQ0Jpsbok1=4M03*JXPo5@PTGt zWOz(Duh<=(FY=!bPfp;et3O1f9L(C(O851pj&p@&@={fEip-H|lBgo?YTW|RH$_I#&E&8Y!Myv2v_|sCC$^@V?h!klYF!dNo?u$UkJtN49%LRqe(HW& zUKPtXrNM&6-3_m1|C4^D;$X1lua32$9@2Ke#u;rj^s5`7#G zKll*8UZ$`2_Vz!5k5}m9{o^CT`6_OIZU?gK<&Yd)CGC8fmz;t8mNXqkhtF*!`4kqc z6;9J()_Y}+%ZICz>*ANGn|=N?o6aj*)YIo_TKy=Wnw^xOcry!Uq35RaHKt z^_Gp1q*ptIsV2c%n5a#~4;`3)w(J7o9~9}NuMV=?NpW|w_c{}ci3}USGi&;+bzX!< zsO59u&678to__K2_J>EOPZ+CVz)Mj5u5B*vxmQMhy!Z6e8unM#hdm_y<@F(tkp60j zUG}PsFN`8;)RO9L5k-{Y;(;=~2e5(=mTpnGx_47|-w(>lg}eh-yNfq}=XBgeTIO6L z82nrA^1+>t70TXo_+xzaV5EDvUw|INy;9-$L?%Q7mCCp?!+~i8a2FZJb*DE-{vSu% zj-wm@wqbOm+bFuR!eG&M5M2d#>oIf{Ev>rF^L-wHZ<3mE}_Of@K&M5VGqz$-o2m;=N?W^ zyopghOn#I-Qdk!HFPrtc<_!#S1VWkn=oEbduF>N;KL=mx?Nn0f#P>Bv`i%HIQf#2@ zHPs&jHOp_ZGC_~hoL=gF0X^|vlV&wkYX?y}kzo!ltniP4MH~x%$}ZEa46HmY@tKND z3w#eQV2S*!R0aDTHGNBs@5^!qyAi=zA&P!?;Z`U9Nu6b*VFpF4^ zz`<(7FuaqhG;jfbE3jN7e(+57nPyBE&h`wlz6&w2KX|FYCgT`zl)M|LgtfqH#s z5Ddmx=jMw(rLeT>ncqF<{oPh7Bt$u?WEPkD_3(C@<#kqn(+Le-9hI+Ex?e}97AvKz zdO^{~*Nqvj4gW2u2*33XD}8yFitmcVx6m7z zP-N5qe<2~4!sch%FHZp?aFAvwPs~p3(b^#efy-Ms~uY8v>fkhZfPE#NQ;Km zQv^7n{C;SEfZ;c_zUXzzlIM~8;1p;IuEcxaDM&RR1DpH#hfiMm5Hcy3KP2#N&W7NDtWazz-2(N7#4^&wRY!IrUoImk~S*R?N}h z=%NX@aJH}0>x)#lF=5YQ4ms+EyMq5y^EhMyDtD28R(aK~TZtk7()S=jl2y*6-CBzo zZ;KCL#7Mm1ihkFY0k*QYZNVDEr{+`zl?j%F3x@Z2D?>_SYuhffJ+JRuE&w8Gsp!ed z$=yv+-d^V;5+jUX)T@oU#r6|=mE@`zfkl=rf+XOyTiO~Y^)MSslN2rx%rLEI@kIq^ zHVyNC=`DT5C8wW#@)j2HEmPQ6sADuUg^C0`iEhP~bV5QD`d8VDPa7FI)nkENp-T_U zE407KFLREGHO|rrO(xhcq4%&XPXz&%$srCA z`6D5|{RMm>aCwp_GRk97w3n1(H1^1+yaz#lQb2g)=@y{lrQp8yO(Ps&o3ve+MZ!K0Huc z1FtlileaDY-p8M#1u|OC!oV+d4aWodKpIhdZqpo5_{2l$ae)_>j=goyE4tgO<6`rF zH>{Dk29?p@rh43J{Cc<)SHZspJE)MPrTpw;TzzD`;UkmX!+uS8G9<~w?E96%e~wO= zAm9cxj03(w1iH{JF4u9>Lr6zjfod_v5T&%#XMm7WP;12} zMR}7>*c=P`UkKB_=PLg{T~27Fw-iEu+Wk8HB3NHo2veP6GF}LnWYXZkA2fnU4w(@C zqJGK9x`ypgs$#;1MfIT>7cpMZedn>`v3@=gxFK&dSQl?5OAoNBUuz86CxV2y4Q!bq z6^WqUn_nRvp`=3nKFwgi4GUBE&^a-QRYEnM)uj4e;uRI_aVdtCC0CRy%#I0va}|=z zp=)QYMCn~H*NkLu0Gc^yRCcKXk^bNaBnqUz#8H6D(HIb=OU}P-wSw8#OBw5EAZ0{u z`9ZkVHz@T|#-KKTjPE$x90D$5qiO7BAum39b{skz#?93RO&?ioJZv$Jb?8lKTWE*F4(O86k4PHzh9USfQ-cJIU@DMUQ;6*7c^PCr3hBl5AOSRpp zK!7^Bn)KRcPR%2_LHPaUC&P+PM|iab+3LVN*G}EmLm_Mm3(HB8utXv-3VT-JjXq#% z=7whmNRce4U+z1_Jr6KR=E1j78k)RS1Y-LwB3LFA0FKK=sg(u8 z+pQIN&nrXWpnyj0e*9N%Yu){jJy)~nIq6Ja<+bhY?)hklAv_+HD@EaJL&vnB!3~57 zEJzly&+YFWe{l3iBtWfyG;LP6ukxixCOb_SAC?eZ&iANOv1bAZedzz()5DXKy$=rm zP~#kjyNfwBvbw8g*$rT9dy0ph2I{Qo_|HN)E^{Ef+ zbQlsu@Ntojv+;0BTz0$nhEyjtCkg*f=wDd|U`N`erHGr4sht0RCAsw(s|A7Jbb|SI z+N-U%l;WXD2*HM10$p~%DtLC+^9uU+G6oo~++Q0+mohIBNN<2U{3oC0lLE+PcAm`A z*}Q_BS14u$E1)bfRR5(dHB|HR3eZjNoSo3mIUO+ORibaZ^;lsg4wu)9Vs{Vwz#f;J`7TfRHo87Q8EJ zCUH2Xk&{R???>Kg8l@Ri_w%!PHqR1uDk(;J3XszG?Qz zeDkbp^`lR$&1aKrYY`WRXaoq;jzO23Z{Z?vYxYZ)aVwc^R9k%DW%CeGAV272*i~d$ z&_4!s0S|U|#DvKFWTX=svdKM)h^QuS{V=UaD9BfTJwu2yE!OL+&a6s(7ocncq`UKl z5Q+T>u=aPWBBwbXP}NQ7S`{_@#MCJ%`p7%zBYulpR3Rn7E(4x>)8|H=3)fQI^P&ws zD3Jylz({{@9vsk&w&1SJDvXLJgi42xZ&3L4(qgs{$b_C1-T~Uc@bQVN+KBs|x0k}1 zW}+>B<&LfN0lC#eo{g$1!X&2OmpvW%Q?*sYe-Iagqg42Z)|ldvE=FYLCLmE>JOy*K z5JXf6V=6o~m@*7chj-?q6t`|%k3l4U>*Ul4KRmZsI_NnuAM~cL`7$2v=95iH{6sye zoOm!^B3E=Yg^F(nxTuylA)g){0e$Hh4zBWlYNl1=c3$2V6--Q~70?I)f|@Da9wB^C z&Wl?$Gxr1S%(#RBPYbAv-I>$*thfOhaJO=&J>t=UL%em1%Lr#>S--t~H7PFA$@aE! zqm>H`sf@*d0+DQ&)JwF0_@yX+ROF{x0Y4|8)Ue%Fcg37U3=_3TGwwdj2(g3&?w}Wc zwK8y=F0-+)K$?>ScT-?bwJTZ|QM<313Jsol*IKgbPJd4G32wJ6TH`!!c2Z#u%i))F z@}tk^Dw_?g@sheU(Gao;-_i*45K?TLFexRj8P{^DTHMP6BGS?ZoSxiCJER(+%a%m}PI64XmO$MtjI}0=3eAOJQm& zKK+hn3=brk|E1NbVCIw>YMzzllRB{T4RHs*K0FQ+_C6kdaVV*J9u5*}V4tKvWB4i| ziCq8b5Km?nYs;hFhBAgnaL|Ul1aqg}K&QM+DQLpPNik$*vF787hgT$YpJK2}TSZei zMFRcM#>s4eM`nIgd0$*f*U{N_~!hZ7M@KXXixz2B!U`~%e-#`8Q_>ci%S3H`{ zOKHC~&@D4wq>#&MZO+CyKA()qM~Eh};!<0OTx64CdS#r2!~m=sm@}$8!{7L_HUFHE zC3R8K2x1mQ?n8Yw3tvM@aM>YQ5%=2z!dq_*zXh7`S?R%h{7F;0g!7Sq03*~S$f6El zZJeY#Mptu(2x!htk573}l)By~Vk8ixoQ!!Ha^PxB6=ZOp0ot-4;k&bgm>*Nu@&>F5hTm}*>&nYT3A zoEhNnq`d;F8!Zlv%UZ3%bxSiB!Zz%Uxd~>r9MBKHIbP)8>dXOufMM9clk}vObtvEU z*RQ13=7S79(@e8zr0`m}iul8Zb1l^N&P~Qs!iAwLd=hz$vXsUKKdMkkIoVuMiK23X ztEw&i+atd5%mBTNVMm%kX*o5nwk?=(f6Z-fQAoWJ-f}l~v5Si1z(Y{Gz}=gU@ouCk zlnE~=Jr3{;yn;4=P`N-EDD^q6MpS{m8#RH-^touD2b}Dw0k4YB7~WR`fev+GDFg1W z0o)S1upcn)Koji3U)q4GV3IAIG*o~nP1Hqd5ShE}<+)rMEZ5U(8m<|c%sB&%z80`T z5?w1FF=GWxL@Qsw(*hV>1467~&Z?QDw?JnCfNYX44^(!4OKsq}x5eNo-y6nc#I9Q+ z$s{5ISvHMuWvfplS}Lo_VxO#>n9$wca@KqNkvXXyBLOgOx;3QZ*I8~N{cw+w{eZs- zICWk^$bP-0Fr0^9?d_j_{IysERAz@pW>NC#Z!+l2k?dS5^)kk7$aU1F%RHNm?aqV` z0Z;Hz@qOBVfx(`Cz~8(<#Dsvhyz=7A(rf2*z_EO1rgLU^D#`Web*?u8w@?u(+xJoU zFU$CO$uzLFq!-|Ppnwx$uJA?t9?4PSmbp3314V}oK*g&Uu;#5*RDHxnEj4rD!VVJZiK7+AEXh_auP3!&gP+ibBM}kRb!-FK6WXDw}SlT2S{B2#%Yvl)z*UAr?TDh=w`Q_3E$~3A)y0nC5iFhqL zWqZB&g!pO6VdHovp-V0sfV`3^QqIsk9{R_0-6k8tyW(UMjvOAkaIr60`fxp){+!^m z&nX-&ALJvjIsYiT>l;YvQ(+{XxC8{hFT3`CMew-1TM_93vfh#7H(nmvNo(rF76eQ) zP<(mLmE(N#L1_9TMZ~|svuNFPpDk1xVPokDRVCh1su3tgcZasSzI{Pp*$LWeTaJhNW2yR&n!dgc9p znJFTM`LPygEB*STtgZUG07_R6dmrNGX?pxTDAN6%IC2A&it?GFi=6K2w|)sLjV{kB{egEBTi@Gi3_PDPRSdDpm6#c|V? zAsHSR6r%RSaU4rFt#e7=nGf2^08`9=mVA}<0$#rP*FCxSV8_xGLiZJbbGw2R|7`(=3-@VK>X=(qWK|9v7D5J4sQ7(0E4IXv?qR?r;(a8ph!k=(*hoTgfu0a4zeIgq1af)MRAkFGMR=hH81qv& zAw*035X(wIZ!|bd4ql`+vI=@YG>^kqg@5$SSBzH0miV~ z8$}JnW`}Fsg=-1T>u`XRYgA-^82<_n)|)O9TZ~Wa^o*3~FY|I54L;ibgbz%trz0-| zc$HpdZO;a%mgmTh17Y|(Hb8l%FMWoqow)qYsctkpPDzH-+-NuV)j){?z(J5A+zWb} zfSPU>CI!V~1};KMxE>1y!8SR#eAN~^B9g}vhZqH|M<|f%TPf6Gg9QM8!F!eu&4S|? zUw9kC5nSjLuqexHgx1<6oPhw(QWMH!Izp|UXeOp*hRzbRvOwq5B(WX8jht#SW;xMw zfUwix?lYRX%V<6_>l=%Bq5*+%q=fhQpgWJZ9!jP)V%H+qa2Xgt$Crb$6l}gJlzPHd zTu@E8qFX_d)`UzXIl}vY&L&Z|HH%nLRz%Lhn-mhkdUTf@ zM`T)aZ=gK!6zjMl&|V1rfUW@s#T}@Vtfpm{Tz?&3e98-U7_h2;!ujUVb4M2E%yqod z<6p8?!YaK@t{i0=SXuN1WE&WX982^%MGQ6k7rijO4JoHSkG`321I57}6y_0bVseK! z{C#qXuCGIb6=M*yIS4X3Du5(G&aP#B;bB{5KqUkl0|@@vzaolYYJm zA9_`(X^k{s#equWiH%pVSZf}tICbf8=PgQ?zeckj>7#vraZUP^_V*J#Qq@`XSm@qz ze{i9b<#&_B*DG(b_^1h-6aRh^C$c(=oJ!qW=Cq%FP@%KU?8EkRUZ>T?&8g&O^>-3F zlhsk)etTA3g7U85LB*{%ERQ#@$7SzEX=I4MlL`>+t0}^o#(Kxi`!Upk9bK1taotBF z*reIfgD?hvqb>EX(FJPW{k4J4v>$fvCrTfB_9r#l-u{Q{0@2xh4Y*cac=(aQbwOC9 z6|HO-tG-8*YX=KX^|#_w?|UKIq$f|_L!WPX%X56eR#K!LJ|1%^H7e3`oQntaYwX>c zqS=(WShkn2a{o!Y^}a!Xd-lyT8*eJcDv1|xx4TJyA-2eqyl*PnqFg!+-LxBhd38hE zs4yxqxUxW<{*zMd7Z2-?pOxn5!F!zRvpT3+u6!-462NlKz~)`0sVVJWt0G`N9S`V- z&*ca*m&c}3<{iK+=H23koM}3sMWQ9}X9BvCWw+=uVXFZ3>xlGh6TdeRxj~ZPAb|m; zPG%*4aUUT#Rwt;_Y?7&qe5P)SG9&a)vR|PmOtH7!C7o-htWA~{RYnP}bIi%fA#~jN zExojw&sMJDZ1Y#YnZK@%>5ee%td8I}pOiZn6AeGHpR08v_%GHCM(prl`hZLZ%H)uy z`dwm#8Rz+Uz`vrsLU8+CLXIwVw!W5NC(;Cef)2n2LD0I^or{K;Gr^`ieaA9qJ^eKt z_Yi?YLOzc7XaNcOG*mfjeaZKV_*pst{yq`HrN)yr!7s-tF3F!`i^eWA#PsoLbN1UHwoigUu zgmlT^+RB4Oig+U`kkGnuGB?N2+>`Ntaio7IT}B#13jd}J;hXSb2`N#apiKTQ2Sy?Xqo0!o@(5>~@JwL5qlU+fp?R@Y{6ZNsom?qHoQ{O0P( zOIo6eN<=NG-Eh+G@U6e%q3Ky|}~zJ#BM^9EP~3zc+A4-lBp zu_vQ4zn#%ib)F88PSXep$$F8=QxAABa`FY~^MIOwVAQP;3|@7m2T8DEc6JqEmGJf6 z5K@Z?X5G#&CV6%3)<_rWlUe0I@q&-%-{2H>m$<Kq+^QaYRr2$tX= z+~djq(edz;4>*NlFsM(pTI@mN;b@DFYq+7DzLK z6IYF?IouJ*pLF0ZdJZ`BM>+fSz@+UD5;-xylnQ8|bbJwQ#@iOg_n9{jZ0?a9 zSOPb=6TdL_fwRK8=EMfmUSL-L7e{6Mlf7eYZleZ%4m11*VWty*hd4)49v=b)OcJPv zkaQCBEKJ9ZFX;`*UGO1>_tG(5@x@kzU@)oQhpRx2rh{n)z>5mFdO znuPMJ=%~Tib{v*ESwiY``zFu$=0|O~4EoqS527%Hs;Ay#*1RIZAy^F8Oj&5ksb*Bu z6bF)S$TzR}emmcP25^^}jK*1^t^gaK-@=iWwkgW88vRcQV(TOI+0OQyejo0Ye$Nn& zMK<_}Liy@be6@u|vaWmJx+TN@r$}&t;b;Q-B5w}Yb7%@5&azGnb~-`4#$1+sV|LYc;eut_8_LC385gL#t|j{m4>O0VA1J+C!;^``38B-@kn?As*7%G9{oKCvUQKJY1KSQ$^wOx4(|eF0;s@b6Vi}dz?~S6jSsX zRRglb5Fm_P0mvDqM?+_@yPWWvm{bp5TFHgyR3BcX?jcB)k0mPPB1w*i6QQ^cKR

pR!=ryTx4x>Yds9eBt2Jyo{`ljnqH@gA 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

my!p0J_vwzvAj1 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 c0z(3-*Ozhu0!9My=$Ej3}&0I%$RjQ{`u diff --git a/Moose Test Missions/Moose_Test_SPAWN/MOOSE_Test_SPAWN.miz b/Moose Test Missions/Moose_Test_SPAWN/MOOSE_Test_SPAWN.miz index 61037a118f5504154659d6d069ba4e8c92233249..e71b914fdd0d9601fd097d78005cbcad0c329881 100644 GIT binary patch delta 107439 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

9X`vP@W0H>L4&cjZh!`{#loYMd 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

}`2 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 delta 106025 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

Y111YNt6^nTUmi&FZd;{sLIWtXCObw9Cvc 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 diff --git a/Moose Test Missions/Moose_Test_SPAWN_Repeat/MOOSE_Test_SPAWN_Repeat.miz b/Moose Test Missions/Moose_Test_SPAWN_Repeat/MOOSE_Test_SPAWN_Repeat.miz index afbcef4e9549e3adcd506eafad19d2ee0c188043..10eca726a854b3795ed1f64135a2e367d0342836 100644 GIT binary patch delta 106281 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

VVGY5AB&LPT$L$J1H@x9V;+ zv|gR(&?~n7&b51Gm68q14rJ%TtMOYQV5r+5`MjJKlf}&zP=J!4XZ*gYE1n0@WZm2u zpfr{Ea`xJrx1>LNuu-Wk)XZ>yo7K*6p;uv+1&KK*-!t287UtdhEytvynu++Q$GdChoqr=wJAkTFWq^^A_t>8N|G zG5ITary?u7gHxQF>H{=?i8IU&r&;zG2&r7(ni1qWM~_=OavU)8u08~pq!eWhNA>peAf^xLblfb@*fgo&}eSIDRIMuQsh^ zoiz=(B!daF$uP=}=vQ;@t5Pf#?4_YPhEORHH3HF%$N<_RO$=6l<|~1CZ`2KtwOBVu zW1SIs8tADsqRYGAT+9zh5pHee&;nRiHsu`Xwf$Ynam!W|WKGc8W~$pHcjM7Vs^vOD zyM0nCq?rNMfpsFkPNA=h`IPh?iWp6a4QMk8Zg{xeX{|L<6wwh4R$f9uS5$u}u9%!| zY{(w8gS?!*dA~bc-SZW>GY2LK8vzYm8ps z&?KeT-~m=*qGe(CIG_&547l}HDn?}KHR$C*&Ee;3{ug#R2gl^5b~Zfztj16PdrPM- z3nz!r+vCV4=gs^1YB3fBn|D(log%I*iN)(mvUJi6c;{$;ZIy)tNnyMvB;+7=o13nt7#ojH{Ir!kwDz;a9nTf7k9^^es4^j*EEWLRG63l4ng^ zaZ9f!ayM$K z@@nIMlBRNQ$$C2ANl|52Y+U?A&IV@-o-70<`~|eE{X*dZP6MTSP1c|Bg3%tSy>{Q7 zsh#bgeq199BObldv;ySf7j@G1zOR;#$=EO>XX^ zhb!R*FdmzCz=W(_Idn#KHxv@+7KtR#&X?a@O?+lDUToj?cblziwg%o>HK0Cec-UT- zF-7bo_#0fgyWVRxTWq~d!wFQh`{;c%e>|(189$p=#%$@*aag-5D7e^SC7hUB$foC-ytFss>+V^HZw5H@!6@f{;qume-S;FJl2Y< z{eyJ~hHb>&kW{l~%($pd56On~M0uh9W<4gpaH`1eMve8jf=zTlsOK2V78D($*<911 z^rotcF>G5`DOLC#mEpuKsVl83_=-!SzDNRBNnt{RW!ctr7}pR$rA9%N7O639+q0p` znuz{8bQ#yXsWOwYs?8#tf9t9oS@<;TXan~w3fh9U8yGMP~ zr$5GnX1AB8yn|O!%{|sx$|5xF9o*2IP5T^lJ4`A8-6~yAC}7an>!qMzd=(XM>_DcP~IaBzvGgcj$%o^q*8^)4K|4He`F!+J8D8S&m#=- zmZD-q@nY10KyiZR8N|p0UEVQWBS&@{#4b9E2)^S%kF&)Ws~vMVr%FISSS4U=?7mp_ z^2DKq0S!lZkeS!=f`-Mmn345%(2U$ttyq|**V&+y&U7^0B)fC8j%PxDvUjY_jnlx- zWrqJ?0!$OmH9cM*e+oB4xl18KuRWT=@n+n{y)&e7u@j&$<+rmBNh?`$V)t<^a178` zkKNU3SC7?7%avc6gh&Q&IvwAdqX{Wl;QStJ2s_$oQELE)s#+QbwHez<$hAQlI1F)-ss{H**Zqz~*-IRff=gB_)kEc7=NCoaw|5`KEGDFokgG=?3>achSYWGXOQr`nH zIL%ZNFi7XBf7>^bBV#qskR0{|J*__EB$d$H+}xsndz3B{>+Cal_@?rfF}*i8-$_oO ziSY3}Ihhtk+1FU#e)oe-2t}(9%pT{nj`cs-gkI}2=C?ioP#PAN=mrY_DL6If9oVW)z{RF5;JoOINS3g`|_4qYFG3#7+tepX^)ne!5bL z=}E=!_!RV~kRZ{NEw%g?2CcjYRzY`GJelMrWCNPy_cEVn@Yx^W`1aj*yT!BW`ycS( zIu9OCf7tk^sFDdRHgPTb&BmLjIK;jA*~XiXH{KirBdB0U0SK86KAFc4?VUs;JX zwBtx5rQ7|OYe=_tsiC$F&H{jqZsV*?r#Z?jn7!qD- zVqvOXH^L_@P|b`U=+1_b>zw=gC)3vh|9MJ@i^xL+y|$9(Gx+K1sUI;h>AAC*z-4_I z0@yLQm7#FAVkgg&}!*y~ZmV5G6@p5MN*S zo?w?k>huLE`GgEk{Tc*~t%fgjquTEjrxY^LF9HOF4^sVS8Gfi+Q`()#Haytye}lhl z@S75Tby+BAd%zrcyrLz36u}^B?+`ig(1c*{Cir?cqnt>V$6d(|HeK>P`XtL+4uok~ zNkKFIX6(Xc=5S~<5H^Q$+d%Tg-p_0S2MPCJbZ8MVQ|h}JZv7S;mB30`^)wDidV?X6 zw)r1O*V*ea{_*R`;&f%5^+=3If2xAi;p{LTdrXa1=lnTjkEt2-@mL;~s~dO4_yCfNxfpV&dXwPklW$>#+>&_mB`Q)Y!Bm8xuR zDyCJ`W9YpIN~^6l8;5Wm3#g6-`7(U_C6Es5VP4Dalps^T!&_2O|MC6~HHA1hR&S!1 zgrC0M-y34$tFNpP-%%JJfAl1;7h?{{YVmC`%goqoQa>vyEyR*D9(@Y8`xV%=!*8Ap z_3yRu~0@e<=&BUC)2dVa#)NDKiuEl zKftnURQ1z?;c(AIaWMMy)8T96t(0Mdn2)u8GySw{O1>y&d5UGLQn0^nOnq#EviQUdkb!{)1&glX<-z; zrku}Bw5C*zjzsy{Sy`mV_`a4Yo+x0CvNM=vFb8T1(m8FhbA>5|22^w1o=Jv5|I2fi z%%k&YQs%!Ae-4`G^n><#oMw!UkwV7OCZn5lXx$tm4Noh#Pikz>Xu3&)z@-m-;N0EZ zB~Z90tfP{g`}oW8VYIh@h>DZ4_24+h)|1JUQ+uby5p;cz%`B0%VvzRJv4-2&xJKT9 zH}}LTQ1(x@$HT4B4D=UXbECvKYJe1x{b5a>0B*!1e__VBcv7Fq&ef8i#=2|4Aju?*>K{Tyhh($=RLXXBfJquC_;qdy=Rh{Odz0`DemjjC-NCi(*l zxwZ_zd>2A^kTIJf){DZVEDBad<1LAf^Eu2ve`b*bMlaGsD9Hcf$@bGdRFZHPZtdm} z#{)=+H5DyswNLar2o^9|uM<7-Vu6xA4Jriwe}_|AggJP!LZ>P$HgQyuYGPrOHQ44{ zT>?A^{2J{g#R5dZ0R)t|HGl}_&V9hmA{4AOrm>e#f5qI{q^B%e%s$muUW2Fv77+i2 zrCrIFa0m(-f@#w0s~wUWWZB>>-OL@#{NzzowFdJY*)XCY#cUDqU`TvQN%YKzc2&gW zf8Gv}yirBeL;6Xo_>ZeON<_zJ&J~X=-cTtotTmC0M3_MD99F+bifN4$2VucpT~vF; z%#s-V$E8+%$*s8!I!U&XLX#WwRy>yD)lg=F3GQ$Cz`Z@VfL2_`!t(~Oj#ox=ZaL27Oofvu}H^}kgBxRK2_XT zLBTGw)4FOOat_O_6VqzQzRF;0G0mP7m7}DH_z4ES_$oVox3B8eYb12A;wRq2f7KUP z@tK+6&hmlPNeNpc5;Q|3WPZRR+$JUGdexRv2lIBe?_rK@RJ=EJcCP~kO}bs{4QBAD z-j!Z7gRG{PfbGEM;1X1mSGG{@3#=%;{FO<{kuO|$nqCzVvwAx6*U|%AFhZfgChs1l zO<{(8PGzy@BU&6*fEArYu1f@he-hxfXB8uvi{b9Sp59;D^&QETZg1>$8Q}x#1YHSI zm#!Dca5WZ%l5Ve$ne{<&c?X&b(!O8~YHUI#H=>`1HlahaHVSO=oPtoM>#`SYVYlCO zwBhlVE!1*MZ_)JbOMb9_-g?u)YI_SUC$sA9_dA({Z=>hQlz!{Yr$c}ne{TJf5f4Y? z>uW#G10CCsBi?QFKIr|exBYhXp5*@4+x{ZtKGb?XrMdOy^9j=px4+TIMVq$HmM*bg zMprgn-5*@VNX4i-nW_{nsi09wN(fWf92H)5wl_|37l;Ae-IxoYfUVrXC2;i<0Dw*g(GfoKP!$|_8UC&2c;K}Fi7C+~zJhHE zZzrM=fj|hSDV)2dwo3*et+U-aharDe{%IY!uzjh`u@0sYxY{{Re+%g9Fh|w0?Qc@q z$+S;YYSHK|xL88I82tEkB)qgfYXvdK-*^5qO+OE0h^ zmz=pdl({m4Rhg`oe{<{B{_K+?EhlaIJc>-Oe+8p~m>(#k-fqa{AG#8M;y5gMG@wfG zcol8Wp`LNAAU|u>07HqXKck%Vw;$(1jy^>0JN=tAqYd@sfe_C(2*oGMX(SjZ|U0SEy zJt{3>G3o~&Qzi#yFfGINvO&@2)k6CNb4P-1uI?mS7Tx(oYZezkCv0KTCFx zmbfl`lG}1of2lr5h!3+bY$J1$~7E=*TZ=sO{K{u@uh)eAOHY1MCr zCCiSQH;|+~{H|VLJuzWnABrO=+8UxhqyrlE zFB`;sHGvPzp*)LnOmuK5_V1h&8C}}uT`=#XbK`?GK`89jM$W>-J)xZQ-GsmOgfASl z8>~7jf7tm@*hA2?AVmbu<&N`7H+#n=Y#KnRaJ$U25}07Bv1cK>vS4Yy=;PwItV40tuwV^M&Q&_!t*uxf z#Q>F<@$Hh-XsP6pB^19I>Yflpak9f)G5gyys7^aw@yyRpV7bt;)4v zel~&?0-5UXUgy8}?!zuY1`_P3*(5nyz9xHdu9cxN|6| zYM%Os;Pp`%*JuT73!on150pEsZrt`g=0EWJV*^IrdT9k%D%h!1hpTk%K?}9pk5>Yx z2y-C{`_wwF1@FOg?K6w{-MNndf4Z^%-X++7??1}^PqrU^eiiOx{U+w)VBjS!k$tJ) zrv7JTf9GI-?@F>y06MY%-X+-oUzL5FF|NY>hXC+kd$)JR_5>Ru^Vmv?_@#trG`j}Z zj51?yY#4ef^&rBITDkWvQVRr`#Z7xIZr?@hJri{=dQUZA{P45kqc3-de+P0^ExrT- z1YOOa8e;K^lv84j)IX<$>PJj?Cd6?Pn({=!U7(Z zZa8m}0^t)U$!~cEq&|rGt-P9E$N`g_w=^BVx(+W_I16gx-_r9SW`#>7OfqD6cU;zB zvN;BiHOMGHn4UeKo{OH?ZSb`vWI&f;(yOWsS)A{|p~jd(9z*?Gf7Wde*`15mV%_vm z`1h~1x$~+gYAesOigKwVRm~*X{@g|%Gxm_;PhQdK7OI1SmKz-{oPE&gIu~K1-S$5gl zU7%I8+&d$ zb0S-`x)>8TBB|hLn$&QT83_ayy0neKH^E#1m}7$FWcwFbluK!%4*)lZrZHoQo~LDU#fYh4o8dkrL~+Y zcj)qaoxA*A_b&hcX?e#k$LarNkN?Yi+!#5e_ndQ!z*B_XPb&umy%1i_s;I#xR}!0vzCXY2TSh$M0ihjm_l)J4Wh@m3-COG z|Cv`?qj5p+zdqBUq3H2o&cru;T^FQmhQ>*8ifq0NBxG-+UlExO3L1ByBmtG%y^K`V zX5i9=b+bnIa}6a-FW_VYn(I{(y^xA_j#Q@l^;nYcjs>(}4he0S2*@+O?Afi;sAN4R2E zz$@tPfB8pImhiGCzMY%Rg?5*D+yF_q(%qhB8Et*bmFAXq0QHsERu^WQA$31&V%1ps zMzbp>UcD!UG3%*MT)9zJa)uK#*G6}tDa1@Rz)>x+KE`h1xe?dzzSB~he^+un249vyFWmdd`^h^fsFtR*dZt#7 z$8;rF}ltAA# zT4bd5i)WRvl3NuRlWHj-8TX;!O$}4F0bJiUR5Ks^^IcEJAM4=|(^Jo;>dfkSdY1h( ze*^HGogQtxbN`*6j@?rD_`X&BzU2IY$s(U7ov?|Bn)FkciZRQ3z{8X$+hOF>lsJ{(gl^fA9^Ys$Z++HsF#+i>tYJBPWZY-DL-2u4!+1 z^L+`k&o%Vtb#AN-FJHvg>Z+bvowh%CT~I&VJwC7I*(pv~lf1(CvO0%j-f)vEo}_BB09Y%nmuskxl8EFzqr(RInC=l>xO5fX^q;;QSW19m7`3V+;ybN13=Mn%xHz>@)5XX-x zF4BaldORGD(HQXYU$7gz=nq2de{(D;RlT0R%D$qqh=Nz&PS>pf45&ag}F>o zuV7SQa-^%2B$rurmH|xC(&PM$WX29h)D-(jLpsde@ zDP*Z(JjS6J4p*E38S1fq;%Lh;6Dg==uZ{!WeGTJa8HH?(hYY}s?EdB|WJ5?TPIT0X zUQELfa<2C@pLs;EHr;P*tQt_ewN!9&!mVPpdh`K_sqvrg9ReyDf3LS9e0-eV-1xni zy~dV!?g3yZWda5mg}{%GEFRTsz1ZhB&>Iu4Y3z2o+b2M}S`&f89}Y?x4o)ek@hqLr z&w)F~DUOHd#bO;YFfu1;eg?QPv5ZjL7U=GUL_OhZOpW4)&|~+3N7F-4Y0&+}G^H^& z)+m3*A^ADJn5sh5fA=)t)mYx?hJ{<#29cf`9O(8S9oL85xIV&}gtm6+rl&tIkM_d4 zW&RXbao5YASqH%79-}jo2lac*Uv&te?vTEmkiCs@dS%{KM0hJ5 zuJ}6pEXYGeLXVz;Iji*yjE$#y@5r7*t@4F_Ug4|2plT*`Ii$e3jM9CJq`3nRP;Pc8 zyozWpe4l~ye@Ejjx1N=+2D=wCtZqpFGmC^5INUBJpeXTA7qr*V==R92wT(C3(=V(? z1I_6mW#OWsX<178r(o`bwvErsSr|r-Lic+lA7_l_n%$jh@f|hlAQwF7R1*?e_I?TNDimEO; zm8jFqkm^~X<)lE%aiPK%Pt5X{+EVSsthGVrkyCwp=(w9S-6gKoDH4jkK}E8HhH9}4 z^({H6axkz_a|V|Z{)5c27$;Gq@ZYHH<9<<^bk{bSzYV-)Tp2Txb z)Lr5Mf9xd$KJ6gtlp*EuK+xH^oG9Kb=5PQ3{FSW?#q$7~kZJmf&DkU^A?LWv&uH16 z;XwpygWIl)92N4wGy2v}s2`ZKY04MMRa|9C7$@lWE<1_m;3t z?YpDPSj&dLa$vjk(Bk5`ePi?%9gR7&;GH1he->F%BS6UWRG4xuvDBm?p-n*|zxf53 zz$x$-Uk<+v90f}z$g1^a4uxf#$v&bnBsxmV$?Ei1I3b`^{~Tl|WmY{O&E{G8TROd> z^}G)4BC?-wt>-?dmsj45RQM5}HtKsdP;b>s-n*W^($U@9cD8QwKR$vP=)T_ ze>5U#1m8TKv2UyC7J3Yxtv!o*aSG!iexB1Jt1c_L@nzD~uXPgp#t(caFDvk*m7`q1 zB8FTt#HJ$Cvh-8)GG1-jo>EY^qRQZ*+=6`q_<7t^UtZ}y+>Y2WLZwttae#iNcoOJH zDcDHdgh%N-MPO$skgEE%Cf5TvIRRJ*e@u=PkL-~-pwkHC?W7E?eD6V!=-xN!j+ zJ5QiB@5eeoLGls!tO&DhqB*8dbG$|#S7#vI#%V-E8)YTKsU`>Cyx;Q40@`sYBHu+Rz1oNr)}AjUqUOy{b;D3tr= zQ*0*$)k(6uDwEXgq)Jr7*QM3g)cUzit*P|t3YvrOrg{;b|9bselL#pMSXu;NMT|*x za6RYFBccqhJiF(P9OmJAr-hcHf81hT;C_;#ji-qd|IKE`z*I&f}}KfkaOe;$v<En+mu z@M?8dI*z)GkyFwIKKU5!O!3+dpoCjh(|`l-f!cK7Ml!&LkLRqX^p&We0)bSKX zYJERp=y*!zjbIcx?!lDPe~U5w@%U3L0-ki3vBxhS9F87CMf5+sph7zb*r$6BzoDWg zs&ur!_mIlPV4{06+&+Zg8~0Tm{15RlSn7JlNIz8!7YK_HmT<8%n;oB< z6eVfq9;}@x8%20`&(0W=TPp8+-Bj(uW2f%`i=OKY@1itunWg#)e|z6SXs_pE8UB$S zFXmZai)kzuH=z3wVDP?8i{Q5cpWd!miXmK=0H;fdi=yVcKtb}9uzqqd8t#Pr*(rmr z;fcIbI{5dVh`_S!tzj+6#T1e``h+$sN!#=?^ni_!>J|~9ue}Ih9bX2-WzEq9_Q6_T zVhd10;g~RmEbn+mfA!AmYDm@JtK7e=eCp5Fag3&4u8H)hD5hCD3$mz%{5sO>vJXzZ zuq}f&P%M^m-WF=NDzE$107z;Xk#vPGAl{Vis+K&C5@0|ZC2={>Ub&QcQG$!RbmC$o z+$30ANRB7;^=Raq=GED?E-X^jQGxUe>UAxL{~a6#=OxMsf6YsPyPUgvuICrYmf3~A zMa`Y$l}b)T+=`M1=;){e*P~SV3H?s+f4al9cxW|Kb7tQ!$&vny%9$Y0Z}S>}-c>q1 zg_RksVnoI~xa$a$ZVd{GJ-V7gTZm+x@U%x`o^DD+7Ote|)IaSNcBg*@onNi!x;>)h zlH5(jsY*Bff0jg1cctt<@l8~DpT<*pw@}a5Nw>fq&`gV(HtKZU`l;-Bctw`uYdnhO zLu?nUHk4Q;CSU9pCTYvQ8Z62}GFP8D4>EkMj#kRH&*rEyFWJd^6!wfvi24e4+hwZ7 z=Qc`mJ$fdhOf=O6d9*h=Tq(#{C@jcQ;4VxtLd~sAe>6&vN8puVU4{p7t|!%n+RCb& z4;F6mnD7A65LQc6Z}!M6VV(B6T7(s~7Fon=EtC(}iWr9B6Z=;Uz=a`K5^E0(3DGSc zSg7^+3!J>_N+oIqA#D!BMheLetqAF5Ls=2NA6qLo-6!m2?ti?P&hs&ukIn3l&8aQv z?PhCdF;MCRRk(2>Pjz@TzwsoW7ISp!*)%(c8$ra|2F9bVG-8wQ!jcG;tJR=;4dXVy zcNsj)%PSq|c*@d7!e`X0oo+yJo){Np2|(*||DgVuD?VaGu=Ja*D_(MKK|~DxV=PSE zf3?vvg5(xbxD=4QVtMl267WCB3x9PKlyP+gCh|=fwwxdGTSi=L45uUPawLaRwTuU0 zfLmMwgx@=xkX$y+`oaQNv0?3WU}Yicx`s4~8HmC{bE2 zX9YD)6?`|of>>cKc9itEC`$N|`ggf(f0AGPl0hMEF~?h6A@Nu}4S9y8-qVaRVrQTe~c=2 zdKA|H?QvpucXj&;KWu9|HE|I}!~Be_?mkDvWPXy{E)qfYR6bP4BlhuL(fBpH?|)$jRw zN{vjTT79Pl@^~k=VbD`#bw$C=nECzD24?Fe+rFE4sGT! z2eZsIIt!Y{KSdb4nGY*>*cDkbb29vT_%OkC5s;YvFQGPQ$rjwQ2#8iY4*NyXJGDK? zPg-mZlnbQ0Nt)EAbj#qk3?wu5?Zfd~$8MQA z3&QN4g2y-2e+;8$C5B&je-E|cZlX4vU6cg5RMP)d2A|+Xhv7_GnTB+Q{-6mIx<`h< z!z1oLz7yRGW}P=@{fSwF=tp!Q^c%pYs@Bxk1B7D7e#X=415(Ze3ULB1apCcN4-dTc z9i4~L|0EL`^4TGfp?MXk(Hj;4)HdnHzZz!mcvUNNjIrMzAThixe+mK;kI1(0P@KKp zIwfcXBP@BCRda7GiG}QgVUb5^ZmsWQmw&OvsW_}~N_n`9Ix$(=`Z`MTxJ@?S*Li{+ za@yd$9E(uTJsz>jwlI5`iFMd;sxJ9W29Fiij%>meY1G-COj=kwhIip?o(So9EdS~& zE7#3Xq)J>`qolk<=h-PDy}&PJf#2V`zd6A5{kpeS zry~U{FL|;lmCyqZVmexi5&dH-jO!9P6I!e8UBL^Fl`_;kDK8xZFvMr`=%+^ zFbv}+PHURP9Xp{Ec>H$uki3#5C(hB9f7Cxvcv9;ArKkE$odq8()U-ifHlbB>1OKBnVHQlB=8<|_T_;CIzvmwa zOp2juR|Zq+ZiTRQMv<0rP*(f+BlSi=Q2TgAL9NwA_MeOk8sRx3k8RS^TS_>`ux@dF zt48TKofey&7Iq9AgAN^Dx}+ls?Fb-}K5X$6SrYLee`Xjh6khD`B(kNI+gw%F6zfp$ z?X)Z5idBy*mVR?wYwRicL9z6k321|B1yd>DNuUh&!K_0mWP-U`OB6*f!D(=B*aXS@ zzhL|3cm-qCMphmHyX`q*9X^)lC?Qp;@Qt6SK)r-1OQNc+PKzqAH-B1Rh{WlqnRM^= z% zi^6$rTfyW8M#3E7uTGw*`YOpEg$j!r(knhsyslVW3Hl2IItg}IM=yMwO>FV!(lp7= zhKhEM2K)oI%F@NdcS)Ei02}W+W&1eep zk4s9~3#hI73_lrY#fMo&(OiNKD*@)Ke*o$f07vtW|3|fl{|7tzyJ)O@$i}VDvwhRc z`Tt7bRz|JYi8A|F18B)>0XVW3R_mD+e`b9${;UvdGt}&|@ zu{o>=)yYl(=Oqt^We4?9cAe^z!QutfSSO$Z+w1o!T3bq?FK^lJllEBEp}#6ceuVFM3rBRB?cG~f_0gZkq{jS$2g(S#LfolO^2_%jd0H z#@pH$57h%01xAorE6Ewgt+20VZ zs7g5w&d;hy#~3~=%f;B{Y}Qq104NEe^W`f!CWX< z>QlWqdQ1%kY zp7UgNnNjAP8u@2mIGT4pzJz6)3_?rOgwCC0H!LLaTMNSw6+VcDkwNc?!GjN@#Q!w7 zBM30J=na2u>XBZZ!@)o2f3UA#d5$}ovHA0Zd*9rppxTSvX{tK+KPxDV`GfJRQ|1cO znQtBb-;`P4$3l_i-i?|XSQ9Nr(?$X5y%=IUGgU9JwCc2I`mRwpMGQ;{rhp^t4@b$3 zv*54O{?+d68W%kJ=LZd$fdIg8{jaw8zui0P9_*bRMz4pCI7$U9f7V@-b+I(qtl`ze zm|n4hWK-r>cWZ#Ph6xsTbMt0c>zEL&Ziv-TNw@NigHpjYZ!$Nv>`#;30v)+w&*~)g z>pVkgB2ot!VjQ2`1(}3M?@L<`tj8QUP56V^E`;dr-imD_t2<^|`&yDeGcY`?P1@TNc11atG(A=MeINFpMLXr;*}X0X}$ zpPHyu0{A)rn1iY?%sJf&3B%4wcdpDU;_f|>5;PC182q!B>o^3R2c4 zNh?fXK8Xp9`NvKB#M#XC4fPgpBZD_>Wp3!E?I7&vpX+kAe|OVn0N#~XyuEI-TQ)#p zN&j;7fSNhNvLP`q#sOlny!LtC-sx%g+wjy#esFTwnM?ijZ~=dU1ngZ+k-iLV0 zOOW_u9oDdbe|*mnycsst3As)ojm^$ZeTxCROOXVdnM*tdzkW}82jElu^yG)yH@$vA z<{k%d?#Q!S>P;{G9ZEyH%eX^z*^dow4ilpMLKjYa!wetaJ9{8pzjN&F&cUbAJ7M51 z_`k4!`u9PSOGhJGNd7eN&DqeBfb1d^%7)8?3y56Bf7jRpGt@6Eu_Cz(_#ceO;`v!} zDe?`oCq{J(6p~IclA^^X9pQ&piu2fr5Nw3y;#m_UJ?CZRqSEWVq+snm07gpex(|N^ zuu$%Nlu&8&kYJiYB{WgM#I_YKC;Tsy;*USVkX5b9-UqrFBD3N+`RQ<&Sz0xe@T9gs7%vI2=;3(BPf)zDZFmoWudtAn;e0y^22PCe{A?McSD!w52?Y1aV;@{E8okt?3Z!a zTTFw$28rXt?+IJ{Yq)LjCf)1v>yMoNzVpcK>f25y%kt8@Hy^qEk|ac!zoaYjjmXoN z(}71}+#4YN_9DDpv|snIep`^n55`$O1?AV9V7x~wrNmicpi#pTCk;NzP-y^30=J>4 zf6ALYtn>k~0X2?)$#Rq!cBdKgY+8@Mrqk4poTp{vr~(BRI*0CyG5#H=;iAv-{v~p` zm~G37!~zPp!Tg>yEjWZ+2T+*YBBSU7bJpPdj3k-erN%S29W#&1J!D`!+3(x|_M)a^ zB7Z`#Nf_ZmAs#P+6aqX1GjT?>U0EG-exYOUyMp+)6;*H6fUh{h@2N4S-FoN><^ziUl;Jh&x&f^?3 zGB%_OOh8zS5(c9eSZ~gS_1S2a*r3kgyTt0dFS=(Iq_^fm`tCBFI-qVaL9jYGf89HN zY(aZ_F0>O^mlrlT&?;dP0wj2h;@J;R2qd-8`}*W7tAW?0HUgGzeSWledT0%{lpBuX z9Lr%b_#Zdo$m~c>Elg#K*0BiD9Q)*E0^$R0I$k^ewr^u5Wp(%TCv7@8e=e9kEm~Tqkpknk*=PW%@E+fU^^6n+fgHyDgxOwXN2{aSB2?0+ zIf^K?@GK&s9D_$uXeTa^Bhd6AACEyvpg{LAL$*H4+4VB?DW6gMM!DyNf6YR2;UmRy z#=N8@<$}?eOm@SI9o&xiZoN*$CS%h}c!%53fz!00*u^bj3=Gg72lYo?p{HJ;%5wVY z;80iZFFOV<_0T0VFX`19NLq3Ky819s2}s&Y#DXu%`LZanU^Geuq{NR^5I<3IIde!^ zI-B932tYZX+dw6mO1e=re=Tz-8BvoWCzqBxk8Q83 zqgYHRxx9rBf(n^gf#IvG_yY{gd!oTuU3p{2S|0*{eN%HV61i+Jf4@Q@&V`X`i&h(? zCN09lz1t{Zsy43_u0Sh;fBl81Sk5{P!0jD61=AAwgSM5oX_mc_HlUw)Y_6MpO z5yk3TIdIiJw`fFKe}3F1sqH+QM^o-F4T|2|sLV?-1Dd2j^0egua8e%i^Yq;KqtFE% zD6Cf3imt82Ft}h;rFTTwCU{RvqwZw|hzA2uM`@xLWt7nBYHOv*VlfTKYH01Ytb4!u zwIE2?m+YQ!M#p)swVxsvR*zn>8dmw=qzV?-Ic7Gefu;ilIg<5 zzqPak>-QT;f0@Zv_@mS7Pf0DxMQXO^!WKtdmNK8DaHt9LPSJK_s$edGa#BTHAa-I@ zHWOG#fPL8&{hOLtJcZQ0z;q_^4@qa)lMSdPRdy*(FtVum=9OD2(h;OPKtGz2KS>L9 zC6Hg%W=7>k4G%9KRjv()?7f=<7Tdzig-3Qu@R&UKezh^lqN$tNs>Xe6^AH3S!Me5<3_s@&EQ1}w-X#Mf%5gqlPc*B-@xsZIV1Z! zwJjM*PdjylRs)L;}1bE&0hRElTtBk90`3M_2WsiNNH+hdo)vSFCW#Ac2s zCUYnAf1gVpA~@d%bJ0A*V`UXC(13R=zFidl;Ll#4Z}>;ItIeQh4?;t!-3sSQV|7jZ zlZax08m(ua&ZOTpOymwoq@<8$E4uv6VCSrFqej{koph)GCh;r?D%4V3BmqkD3waw6 z>PP=O^kljjA}W(tzeD*&@0dX?Nqr3pz3O*je<7(pz8hxt&!!YdFLZD0X2~6iuxqv> zm6Lc~>YV;xGby^Zhn&uFJiUy-@FmN4eEp+S@ikw;=;Xfw3Y15%o};%_+am$YW87-b zm!pw$vXz;>Npd4#Hap-u=2(1hN-37*I2bf5};b9zu-GC{#4(n7RtL2-at;Io{(Gm7AhNwxKja$`XidStvFc z=eKMsCxA7Wv5CgUwV-Y9tm8lY5SlN$f6;N!B-9YChtX+S&fPUj9D1>f20fAgq4 z!AS=q$jS6xKEWJ{Y_Iys5^q^c)4y6!;*3S|IR*1-G}{DRH&oHqi#>_XmrX&xB%pt) zm;ZIv`SQR-;L*-(9vh^?Ccsc}E}%Tr>S28>yIvRvzx8UuZk@+S1_n?Zrtw{tU#W7q zrx}1N&FvC2#uh6`nv4)9*RdcKfB!YEO^S|AK)ZVLo6N`XL*7?=Ha?yO3wNGZu1*x^ zBxDrmwXNE8B~14aE!V2VesEH)^-&d$5hNPc{=>uLsR$l5_4T6)`3M%3(ZjOxRTlQ+ zGV%DhWBnJsD4#nZQurgMZiAsH>pfD^ZDkPgO|azdHe{aVrOD$Bdj#m2f2(9!11UM> zE;CGXJjr3Z2^z2=RR0mICoKAgGqQlp-p1GYBq3dc{Q$^9A>bWYM`)DF){rh*=eHwZxnpaqCYu8C)<=y|OO(NDT<_d~^mVxrqyV9N)UisrcuGK= zK8<1UA+aw=x`enlnx<2*es5)n>f~*b8#-b?5anNEE40gSBzks#i?|B@HSsYsw zM`*no(LA~7WEUI3Bvu<+moCW6_!(uaPZ?x_{eZMV6B(oqd8xiKm7x9jGa^}^NYJ+a z0cixManlS0Uj#g(jSbKSzLt1M;=qaAG<8fAz43TP9~+<#djIl}e*{8PxoHX^!4#k0 zJfn_PsRQgl^ZOA@ah~p1FnvZDYg5KO38pwx4ah6rs{zJM{?Dca~hg09D= z)w@+`Unofu`LVX!XtSr=^3vOVvh2co%Fz5<9(`qH(!{ZtfAN!q^#i3+LoVVF57wRO>?>Stm?^1vqW)HykeoY4n78PUE z0jy!|^JgbF?u&;bS}Cx4M|7<`NYHHrPT^#rYZcQNod@ke?$x;MVL&zQg<6h z-E=(-IJLxte=1ben^S#TA|oh{6!?Plv(xV3=S&uN=1>{V$&oej9fcs^+wpu7%3E-+@M{G1P$RZ1N1;uO$ff%%bV4=@g+s-nYrMN($4bFN_4H^<#Ge`L?$+@DYP4)#uaKR4xpf=G}N z`iM$GJ$I~>aUAL;1LM9&j55SOo>Npz7s+eUqk2wTY0!N#=4RHv9`oG9ods;GE-<(1 zJ1$bg2zWya07*c$zrtk1IXl`Ijbd8;XwA{POt0z3w+ZZRqolB0I;wpVC5l!w2PLGy zT8w6p$xd_X(0}Uf?Y@Iep27oF2s1XN_Rr$U75@MPs?Cpp4}GYS_}CekCpj?7-|YR# zq&R|?hYNfRGnBx{a;?rT=|z^90t7IyTn4?o3rQ?M(c>_$G5lsTH4|^MjPetyRw1^WC@A4M}L4ovZh#q<`NyFMNTWm7S&3PyawFeClk~ z-ZGQ@T5@F5_DHo;rIb!^(mH{GZR9vocKkr7O=p+Y4Q!iqXVpuhj~nENl0#LrF-0{= zipo$(Nh^hRP=6>&!GXbqn2?tyfdT8~2~&$L7lO_xqt=>Rs^=24ekZNpNavUxegUj% z#Pr+y`G4?RIP?8{aJY9s)ywk-VKiq6QJsS%9_(;+SBm8{+mMh`qV6QsZf#u~LYutQM_%DzIb1GYSx%Pn zHmOt!Q(CxW0Cbsd!T{~=o}C<=ysx^%KXLkCv41IIg3#SJc$X_GA&a%AV+{3`!ZDQ2 zA}sJ)D^>w>j7OS#rutATPTtV_6cPfT^0*x+%fXV#U^QpU>lX~7T{VtxOEjm@Q9uzv zl+}La7Yp%}!Fiw*lr1ti;$KoIreh5XKd&%e#ta}%p|doRhvUPo1}3+SCkly_ z=nVu_C*K#YOAV*}j?dZfpt)uDd$Fe%Tarvr%8&!R0DqLB;|Zt-hq)fKdM3ES#L2Gjx#!1`t2?^L ziAQq7rxV>EI;0C8RHS}bXX6zK9!|Vct-8aA7G+xt&m98G+sq_;xwFSsk20DaKbjmJ z1fX|%sKRS{7GS08R(TTOGUN?8PABlwdsA@n>}=5ZY_Kb518?QXsSRz@Y+p5NDaP+k3Kiw*ST9DTL%^5s{#kBBSc?P_%36 z?B{WDSyO3&jLjUG-`yCVyevO4!rqJYe^-KBdq2`b>Wlb4XLnd>XOh#eS=!9!87@DL z0^wx@YE%O$9%HJUC}dsnoq+Tss()J}>+OB&kNR>Q6+Sk~NrG3BA6UXk!T^<+ywk>4 z9?D#{#Y)awD(l0`WoAQ)i?ioR3Y!3mTHEm?7LtLYfs2B;bRj2=M>Qx}xvu|zuRony zsJm*XHt&_X(R+>F`|9|WRm5$NGU?C(ZoMAyhy25j?gq(Hwyxm!x*ss!FMr`bT6M~_ z?KcWemL-FokG{<+iCoRJ@sXVCp?CLiYzbq zI34j9J-j01JDiMj&Z&Dn;e!jHd&!KY9Ygvg2pp`fMqT|#eX_r9Qv<4q%L(z zoqtL8`6x-I_~Ww}Gaz~4Em_@3cbTKEMv6#_@F>h>-PBx=^>y3-lr3al=Zmd{ts;#{ zqh?@=dFNt(>k?`S?p~6;sY9tQv*fO~{+U!&Y+P0XQY|CaF9+rziVzXOg7(Q zG~4&FJcVaQDwhT{nKywDlpK7)!1;VtVgxTIFYKu&-Tkk=c@i{eETgbz5Yu$;^zn&` zrxB?SPRVCeHm=O zPgv7xEv=5T$$#!S)=mcS(;$|oNp3L?8AaaZq(>dQao%oLHtuZ8%`sQL%tiwueu-QL zzsP#A945g`qNZWG*v~}_cAk}}Z`rx!?o3E#vup15Hs;Q^>@-NEKucsZ>nu;U_`4>M zyotHd*dM|G6w?_a@m#^36x==%Jj+~Jiy~caOVbLSv<4;6k0=-2A3u(JJxsy|hCYIJUN;*{drg({d;;Pa8&CByG00;}~6+dub=gF3btw9g2DfgQCboVh0&Op2q_&Equ9bGT`+L^!BxZpdk{@z z&O0?I@utN?542)Rnf$Yiv!I;l11;~PjRXyEY>@Z;-0iR@6NaVZajrGFAl+M3+G z0m`w0tByw2tOeD!2DRbj>2cA$FP5H5uYW#ItzfYry=8D?UGLPO$?(g6BHIW8l$L80bzoWj3phY*VL2}(w6 z+b13F;QQ3Q6}zt5bxMP|o78DC&VEh&eae%!Xfwhhuoux^HyE2k=AvW4O4x0#M}I&4 zswSyISYmEkrL3Hg?oN|&Nm;6vrrcKB&dp7Wx?i0jWd_r(Nb6FD7FV{(t1`q*;2eNG zA9n}wKyB%OO&be^3_Nc1XeRzGB1Sq~TNWrMk&D;}R|im5SKSKxA~sRhsBKmpyUR=T zoXAqj3byA-N)Z*HTTtU5&j_C!oqzlg)&dTa>rr-#ez8Rn$aYE1lz{>}5b+(6LJ|~A zs5ML$^_~Mleg`#uoE_5iF=W*3agUM#{+>t!tgnJ=Xh1nf<+e3nF*Z*x#+WYBi)oEmHo?JIs2F2{_$MjGWYOJ&a_k?iO8Vw_ zBg&+}89YqsXW4&UljQaLKdVdfditN$CW-$VSAlG{w~k6R^Fj&GaG5C-ONhhpRa3|k z@0$0uy4PzrK0V8>X<7<%e8zbv+k zb!}XJbzPfB66RvjP+OjvhdKEg>N#79 zj*UqhYa!Hh&%Fh<&4JDq7ozN@G7M zjU0~QIexzX!)dmPi^CGG(1|1lNJX+j)Iz!8r&gyKjBq_2Nt+?#y=83oj>UG*K5V6h zcs2A-TMk|97}ud~bwDFn7a8$f*MPQ5S2T{^PkJTmL(+VYi5&-#P5MuCA+tQc;xX=S z{3#NBsI!bFaetf7{a)awI=!P8@#%rohfHf)AD#Y+`a{+@G&3aBt2Y_Y^4%%g52XeT z_hT~ne>#g?nROfH{dKq3>z*8&u$W_f7M9&i*yXQm@WR>gi^GO{*M-z`fR~W>z4fd3pGTE|kuwOHSP_8BYNtT-g}Q zbWVY-BAGznvBejWWpgsDY*5d=sEbD2ZlQkGKb%6mFPWYij`93+x-##+Th8XIv*_?= z(&$42VSjB6nbIH96#!-G*7-P23D|4vbB{QHn}{3x=X#b{;k1qqcXX!ZU;=?+43{!!+56Gs7X*nRhZ}#^Odp&&TiJzbE zb&n45ME3@Maa2$EdXu`3U6sy@_~Oocu(0U)+$52!4{jZa0jFN7X zdp%66^_p16eAvyb@ST!?2MLg{W;N){EE`1X5MJyVk|TjBy-IXVT)e<-YPr>UGQCMK zZZG#*%Ny{Am?rZcU+yx%h+O@k!KExt-QXOF{mXXYxlv6}1vX8@>Iw9P>JxUiZ1z5i zZ-0}#2q99^XPUu~-}3Q{^UM{dk@{NKx=>4_X)2r7p8#YW=XB-WOW?WW06%c>TA!zR zF_rXIq`D-T4)cWk*o|X;o5at>1T=2l=t4fpF};78WkmvmQo0hFz&HS7EMQ8>mt}TNC({Xs#EkW*s()XybOL~6YpHKqmgKy)`=$^M9YC3)j8r~r zO$$LT8D*0T+-mB^vmawA9JnHxQ10l~5XHDM!jXb=qjvcu<7lE&bN^xThO za`yqhvh2E0=nxp4J)B(Yw@dK|Kc(E1%SpV0YywFm9rwUB7$9iyzpqu1(g`Cuz#mM; zdt%xqLgRS*@%41ZF-;&d%YQG@I0C2 ZS^4w}gs^UHMnf;yZOPywe8H^W;j$+OHf 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 delta 101395 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�Zyy{sA=>Y{t!K61dR;FmMjZ z54h0*FmMjZ54e}j{sAlk7^Ro{{sB}1Q>T|v{{b@s)6bWN{{b@sCf1j`{{coMZRY_1 jcVTj6Xm53MWphwV1qJ{B000XB3jhZL000N-0RR91#L$7c diff --git a/Moose Test Missions/Moose_Test_TASK_Pickup_and_Deploy/MOOSE_Test_TASK_Pickup_and_Deploy.miz b/Moose Test Missions/Moose_Test_TASK_Pickup_and_Deploy/MOOSE_Test_TASK_Pickup_and_Deploy.miz index 555e364361f3b61a6d102b4a5e93e0790e69ea1c..0e6c7d84a4173f3434571866f21a5071109e47c0 100644 GIT binary patch delta 106280 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

VVGY5AB&LPT$L$J1H@x9V;+ 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 ZS^4w}gs^UHMnf;yZOPywe8H^W;j$+OHf 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 delta 101393 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

my!p0J_v)QMN6vAYRs$IK$ z-p(e-l_-AQ6Wn>3jY-y-c7%(FiRJ%=+8bx&$9%jODCVK>Y z^s_lP121Yk7vy7%=}l>? ztHiv9vngVT&KJ}|)nzwi7YpJ%mVZKDd zQiLvz@5QC9(Y-VydK1~pDU{F}Ogd4J*&HlSkJgm@Sx%YS*Nmf zdP*A@X}HY~SykYhRXrx!_lB$rbLc)IjM9sNJ~JAP*7dSNPhrw$ma|5qoycC?BMzpWp$E4}IxrGAS;JQd*n>K8Y@j%)s3yg%x- zirBNue~Z9kAg3%W#$5#dy}r(IW?=fxt@Nfd!LaF>G8B;mNxJ8KQG5ZW^h}nxE3j&U znk708s7GuXVHGYIaBYRHx}gW%9OoBf$2(kyBB}Y?WCmqUlAG10ld{4cewdyp3EKJy zTot8ExGc#BDO%`4(3=z1i{4jTv0fQUywn4-f8h`HpyJ-qYQAy=tR{URDL5C^rkr4+ zav2k!y(4;x9|M`6E2^U=7)Iz6%odvuFM!f0CGF`RRXt8IC7;pyZ%<0_U5R-HoGQkV zboYFxNXA(!7u`0b?+nn2$byF$NUnO4mDQ-ClU%VtuY*ZG%6=klmh5y}iIsGf{REM6 zf3CXN+TdG)B_b1Cj0D>+7=cw$u!>^K`E2s{Xy&v}8a*N1u{K ztF@c=03M?&snBut(zL2Kxd!ZPd$YnPoB^l!6a4wP$PI>25 zK{rHt_#r6Vt@fl59P_FwD^v<)r`pjof61ie$+5{c0Q=;{T&rGz@A1&1C-n`B*WqjP z^0p3>fl zof}-+^;|fLI0*T^ivxpo9bKLa0Rdlb$xR9TDgWs_Cz7MJ-S;VaoQ+Xu#vWad80gNW z;t-TEn`&89=qs2w&{!}(>_9Kge-JN9FoZsB=Q+Bd#{*%`cEU#G{!`p098~=T5XJi` zxzm!|{Uv=S_k1R7SqV=gS&0gh)~+=QRh%bDoLq-P*CE(<{$i5m=Qq>F87k*HE+L!W zpCDD#a{Xlyn3U>r$$B~~1)j&)z+T|hWpiezbA~JRQf@kW!Pn``VzWZTe`2~tBHpy| zvmPl7{MFWnO5x=tF3pM3JW1B8vT--zc6BR#o!ck%~=c(qMOX!H|b$ zFJ5^CX*Dj@g-k7IQacK%f8eyJEOkFeMj?f^;^FWWWzBqFPI&Euk)_C&wH0 z(9_T5L|s+e2X>r|ikn)7RoPz?Lx|y@c!LQ>s2o80iu74K?=Q-#fH}&>4nh~+2RW0o ziEipD>Z8#ZpLG5qHb~=0bQZH{e9<8=16fw-ncXcw7zC^7e`8_{l({br%*z7<3?X%P z%_~^v-B0=o{Idq!15yZIqOF4!;m1lzU^&90#J!j`66^0}r?04#Ug91|G!EY92yvAR zx^tywPKN8DM_If$iI-|6%o5nJt-0%1f*1VYwsEc?<3oD0WW8kmRfy3EL z?r|Mq#+#jwf1$kHZm;1=sj%xg%@`eR1iu$Gu_*7l0|4ZC<63IZ3T8nXcRdYzNoYw& z&yeduNWw%EBmw+4Ef^HLz@K2sib*P|?c*HaINHy?5`U4p`B{N&9CReN=s zgkaNkK8apONCiC=F0p%@W|Qymj%Zqz6WsKE$jGwsKFHoij_y;(4dJ(6a=h&~&Q3fS z8^N0&f1m7xiXV7S@y4q3P5KRCn~(B~>Bb-~Kcane1DP!Tc#NKi8>v~#>t=`tK8Cy< z#SdTXE}y02rqNcRDIdA+%UjQJE!7}<-lo(iv;`4{&*xHMY|+iPADA<>q1Y2#E+;qy zL#Y^9fH7?sp3dC;?Cj)`5Dl!DF(tQCw11E)e|#xb_;RZ7l?^LVQh&wOUroVyEmin> zs_>0e;r7;YIBahxp*%>Iz62RIlO%qG%RQC?jOP~}R0J+idg7vPF@{$#qwYF!L6y{jyz#w7qmI$OHdZYuz< ze`$!hYJ4kO1lowPgq9_`7R6SP+d2U2SsrQQ^qjYEV zml5*XUTnz#;)kLtCs*>wHC8WgYS#QJe|d=JJuxu78iN^Gy9O3P8`2i@k-SOotC~iX zl9#*m3V|p^YKHXA`(-{MM#}sbB@*{QA3O*wf>Vo4pRLzwsUPY^&W@V7FO@hJoW5O> zE=Yg!4%{-4Y_q@yuxK%m%Z1n^(aKQYRBTPr{hrhp*AgcE4&<&|VjGpo4hM$We{lx< zM-PU;?Sm8~nxf&bP3>I5sC;~8PHr||df9B^OOX>Wu3NvLrb50Ms9n9f&y&E4+1R;Q z=NFsi1lji8GGrasf_r@S=;RE#^+oOJd)tc9ht=$={_br+Yt!OH_|+S}q$NSQ{kjTV zg73b@?Zx7C8=62v60bYy_olsAf9~qz)LvJy8o0yw(v)EZhu$wi6XU-klJ8GV$Z;Z~8=VumMJAudX-U6CQ|2m)HJj70v(rc0e%c-70V_#4v zYwRW)dQCKnBpME{tba|Ef3{w7e{{)OPjHt`UEfNd6*AbjVE}!%^n^Pj2Z@dswJvLn zJArCSTkr{f5!wsmN%S>P4O`pPBpyD_SKtz@htddZ6}D(`Y>G|`(7ln_n_L32@)zQh zVF>~q<(E~S*XYryIFK4mIt*RcD}E|16#IF1T%Q%A>65iJ?$+~Je|cY3zX+oG(0^{= z08qEXe>aDl_Rn=-w4Tq^qNbi-4aCh35WiSk>kRM<1lUP5iQf1w$<`*)h*BfC0^u8u z_!5N6<6HY3>#x@{Z){;S+XARP8QG+c+o%P;k~%Vz3ti7)lz}sM1DDPNmqg3Suw?+p z@{I>3C*sh}RF?~be-Xc_dJy;`x}Jwu*(i^ev3N#{i#fyl9B+O7qA%j2&smF&t2X6# zxZFQ&yyS&eUku!CrBF5Lqz~m+ZpYsYeX@3FK)>A7HXPB{AHVYpCA>|BpfiuM#r^pk zkj70f;sJPT*R87IoCA_;q0(D_5gt*l5cq>TPse3B#hLCxe*$6g;ZF%5Un~n`hCtM6 za|%Z68b2JD)5vBsaFBKWEZm^n;R^mf0`EG#4O+en`jSl2K>5Mrv5ts@jET=al1Zg0 zH#}IT8Uxo-loz#u;dptrThn6SM{k(1`(cI97WavD|EMmxQ&@5Ck(<|;F)jGu+W>eP za1SV1NPV(J5oaPGK@7^X?|z)cQh&Z&d4xE+*$q+}KekOh@}l1U+_5nrC%hgDc-dfBT)O%r}ShEn|&B^Dn2R#bvm0je_G6DJ~0_0zTu-P?u0knq3H|B zmE6@b@zw5=*uKp`5k-=7pLzs|ZnuYj`h?jxQ9TFK<+NdE=GOQ<;-s9qpG48oB2*J) z?a+WVMZ67wdxeKo^fBff_#92kjOZEIca!o*uwK9w#VnuphrWg?a)Qu*-)0`f0CUu_ zKT5_{f15d?(SZm^2vDtxpyfl4gqeWS`U=gsEp0jtZpAbpLAa3debk{vyLb@?0gAhJ zQAj{S!-qp+vY6X1$0a;&v9BVQWcojmVSTdPk#CcS6_1$-9zL$*Msc4FfAirW-jD); z)o6rz0$ALHS;uOyU~Wof0_o6mv>O_;x-uF-e_uu)T~#CP+NElUT{>Q@mfopf>bYGv zy_ROW%mV zc|SCVW#0m@qiBvqT{wgO?B&AZjkqhF_06#4gFKkObFP1Ep9-q`Al2Jh@4Bl7n$Dyc zySfYmsl6bnQ*?^N>`A^KWvzZK&I6Gmf6mZC_lCvfrkKhDHmp*KZzH+hp63-sr|<0@ z_PJwCPL$U<0PE4^Wj_U>+a;oFn5TSar{ObRS#Wwisea6{PqLC|IJciq#iNuuRR2;Q zUIuR}izv=dfL9s`>edI!qQqh#t+v?b6myJOVv3LHbDL8Re!l=MADv~cCzgBre=!a7C!E|hX*+7dISR-(1_ye zCO;H=PZ!-FvHtwy$%4AKP0n}yDhbDdQi&$=RkbD+!dFZDFMearQi}!r@J!KgQnXkr(+rS3VF~)<=OQ^{*I`TPY$}FUl zLTyoI_hJc{$;U8HBKwhQfB&)$f==UYGRb zN-shT#c~pTIV@>4(09G^j0|3=mMdHqff5FRxcs9I2@(b2N z-#JUFLt!Ds%yXH}r}9}ICTrbcDnA9&+H>X>Gae(W7%;i47Se4Q;%la7FxQ9q0BDcD zaP<)xt=qND0;?n|k;3DWUa9HANb1QC0jY|geG=Fbe@73!^&NZri@GHE!^y-24-h9y zf&cj7DRi;;0X`cee|ryY)S|xLHn?d>^`)miEVT0WXXc``F*hwfRk)zu@iAvU4r;~n zM)SS&nh71a(=c#}Hdw{JyChiN+*#&GQ&O_z$Ic-IQ|2f+9wc9 z9(XGu0evd_G(UgP>uVGJlbiOOgEXp;S|7~e3GMIJq#(nj;>m)lplb@(El?2wts^wz zaMTFsne9-c65%K$YCMD);l(GD}s-##2tY(DLySrkMz9usJCn<(y%Bwf#+q zao1+iD6}D8e+RltFEHyG@7pf;_UX687!;5WZ&!;JG+0?t?5Q8XXj8_wY?6*m5Y+%Ky0asEkJyYA5-+3-yb zuZjs*=_%xP0c-l*k%due@5_!-8|o-^nnSU%kpj0de;hKz;c$bo*)YT5e3Y@m#=tBF zH|qj!X8H>`)DhKx#3V6zYCt-;eqkQ6QfB@1rb300OV`6%jjv)bla>$Nue0!LCeHcm z`=EUV0N)#_=S+6ml=~8ES0hj!z%&YtDLg zPJ#4ve?Ww1I7gkN+e$}ea&$S;;`FVfHGJo$BHZfuH((G9Uv1_t*3W zos^h<9Vp$&4&Drl{$x%COrrB?xj^+L5E?<&(SA?p3`4gf!Kus-*r17hmiRj*duZce4?$SUoV2AW+)&&)pPc}f4`3^{0At(3)SF+OeX@dOiF7z0h{mg zZC|8HD41RPGiuY^D$=Qi(u>_{pg@SO zO=nTl*}p-r`BQh?wAIf|+Kh4^O?!CAfh_uC(H{dFgGp3;W>gb}S>dK-m z6l~naAI6%ep1%jmoIb?kXX{HufOB~Zj8ru+>7MWvMAc%Ww5W`9C&1b-+0Ff~^=6_~ zUmQq>j>qi<+QbK9Pv(w74IA}Ft{5wr16DIXV>MG`q^-^$@h7!Nshzl6zJ~)Kf3vB$ zK`A{tGkcQv1}-SI-imZnA9HE1`DkRjU)f_^R6A{nmSFuEn2J@ERfKmPkn-KqUg3CS zT)fu}oDDDH;z|C~AIHQPRG0YzU8OMAan1bpk7L-6^Pm1yehqj+f8p6CW@x|8f0ea8 z#vW(Bbe8yqnxieA<&QE~Ds|Mdf5K@^JB8>>$q|&hV`}$PQyMlUr<={~zicuCbh=Gw zG>2)T&^)F!beUNgR+!!?^B!s)Q`WUGUf6r|#)@`h8f9pYXtMIDWmQ_J~ zxB9ue1DjqtH)PRXe~$L2b4~nEOyH@H!_V!)>JOjAHE$Z{O&Ede!eAn3+OxZQQ-uby zUK&^As_;u1hO%0;Q@d(x*Ii(V{a&HzrmuXaReX7<<$+L)nJrd5RTGfASm)5}x&6A5 zG5wfK)zTPie+bEA3yrCvD-F&iz+Kr^AvK)aVdr$;!~2`(v$}aAxXxQ3{3Ej) z?|WDy-1AZ*Lym?L5})VP%TaYxCyW68fvw}wFip}pltpZ0_fW^+o|Nxuj(m#|PUp$` zBTop;0il~_Kd%zGnJlU_4Dz-vtZ$!0cCN3N7)vzLCpk7=e^x&@)a_2Qd0E?e-2O+@+XRhX-?`{W9&lr7lpr8*X!k-60rpqZL-1IM zAYdQ7C+=WSe?BqpN9cO@yMGLEJ&=+&Kc+Q(=sB9a+l2fzuojVGB?e`r1g4W_{=iLR zz)wkN&P5l~%ul$VV;e7^4M(z(H#O&y?|$#2j|>6I=qaVXBLxuLq+`&Vg$bX$1LoV> zJjqWjNj~lXRzRu0k)v9IiznTmaL(v!P_AC5@V{|A9OXGIf`98-Poq-|rFK0Op&j@B zO;by`G{iyQvpPx5H$EP*SH< zw2lis3K$~o7k~MWL~SqW06miRyf!Z?s%pQy8W%9I>^)L8#QTen-<9>MzG>_4`Ooy~ zfy64N7{=mOLwyg2Lu-{vM_v^aMMGT;(+>_lI^2Kw$?3tdDXXPh?;Re0^3mSM2Q<NuQdSamb%<^SP}D;AbQK_J0=ur(X`!tS#_uT;u|}2*hk5 zh?#L_+_jQR3ow)~A;H$x0x3pO)xs>2;^6?ubo6as>LO4*$vVB%_Rm&#bsckMm=Abh z7UyJbucP^3=jU5>-(0pob zNG|(?aDSm^^mO5R!y14BNP{OsX5`+Ysdye74i?T=zZ-V5h1kvhQ0ycG7<4hABr@Y^ zF})e(IDwRIs|0nCcOi^y&}~r73ry`rnJ%iGev+w<+U;GDsyfC0IPTgDCz~C%yMmo{ z11pZ(t)4kFpm|c1^PtIO`3ZMf7Ov`zwxssg(SLT;S#&NEUGamDCFImX%OK@i{K{KF zq(#iF58~yUWih#bqvCS?GfTD~I0c`$%?f=9#lzyI0nO5YW=jL2cWIB%i%lV>zcc7a ztz4on_a)4dX!?rWlbj-MD8_Ns?WR_neCc9IZj(ge>Yrj5ZW3Si_T!u zSacqQCEXqd^MNg9sTGT&P8kxYC?s7H4oW&@X7hr;0Y39as8plcC@MtvrbpXoyPhnw zxma=4xYOQ{zzd;|N>$(EH8gJ(QImNK323&>p$>2GkEX9Z1*_{`xRwFmm2vN%b$?f7 zUZ#{X@X|Vx-AQh~Y3JqDLAJ8>>LBfYx72wxZv8?FQ9EkqV0YBFAhAIreA^bsJv%P} zv*H|SF)&$eGcn)PoMN-a^pe?_6U^0V&kDkNbrhUsZ^Dth~TQ* zTm8P5>WU+|^wDnL^YCaw7P?aU!aiQt-_E;Rv16OmWQpy)SxnRTY zWbJBtlqRV8C?DrjPMa|t4)xj%w!FNiVuJ}%hQoLjN-~BXW`mtf)t|>pW`DZX>zg;V zXzy_irEcuA5pYtIelQ!cRbRuAU=)+72G_81MuKI-WZ@r4dSHY;ZcqROGlpXxyEig^ zL%yY*mKE}4Sf<{rp?l&1R_x?i8Ftf`2=^X{)N!Vpdu0G7T~YD(9KdO&7{eX24)fVg zfB}DE>BY$;kMbJhV4s!{-hZ`c){mI@D8;V;u^pN+hME`_7OyvZ!McHDn*-wvhK)`y zQo)ApG89<5p$J1M;16=01sHwhA%<-FsR~AJ^w4E($gZP0LYvPpd`qdB~da zW1+V1R_+R0ouTiApZ_{`cDNZSxdJn9ZUPvggUy_jk8E5H{Ga3c;(wv1ZHo)PA&x{# z1ja|j1@w(u`1X*awB6%Mq8wKDxRN$kTS-Kacs0e5sYdw}y`6ew#=$}J@ z7d37`Y|$TQ6KFz+N`KbjSOiRAuBol?w88h#{F*W6NYlLiBw%qGGH&b4@5)+>= zCO9e=Br}i*hkv;@kaeCL-4?XWF5tV10e{SYv_LTC-ysovs>x>7RW!s4yhA3sKW3f# zUG12^c)^E;KS^tm-Aqf2u!lcq=J8D4DJ4_69OCibPi_2TS$&sRvf^czDPxvR<6FcvWMgI)MTeJ_W1N2s$){WPjSrDm03K)Do-fIKP-Wsi@AM zfQ*pA@Em&YVQ79{U-NpuPXr7nG~ z2x>14O5oK$&fO2}G#N>c9XPi=q(4qZEZBlI1rzvb4udJCGqQYb>vH!Ei%MNEh@s2Z z6`Ank^?&(|BQTb4yX%|dXaY6cDK*H(_|r}b06zT z)c#+FxFXHKvKpjMT+EqsBR(;h#RQ1Q%u+R4w`e-${YBobvc&zUxZ=m*oG@mZP4e;v z6V3dP)4P}QLL{Wbh{ga%BzCPaLQgl6vb?BOj(?V>xVo+Y8i#zyEAkeeoTGGYQW%m> zMwdY7P>fdHf}(z9NOjx_JMP!;6}+_{4sq5O*-%4q*rz`|;_4iajVAmpB$2 z7xW;Y*dd%4jvFEc3e*#4c_r8l*iiS`A-voSiO5oijf1${owY8&HoEYqQxn1YFk2S9j~6QQ|oTc&r; zSt_7gyds;ykS5^J(ziONovx#YpB@}Rc3Tu|hm;H}AHE0Ttp}=rb$_Cx2{fVsYYWDl zfq~Z{tRMM;&uf9v_VK%oz_>2o)(1~Nb$=`1_KBjk(vcrQ@v|wU+7n=nv3NuCu#p?i zb7fLjh30$xUuu534IA3+ul#3o1hsi%$>|)PaaFk?Xg>AObG`0Uxpv8mfY0iaTyw$c zz1HKIM;q2pecafQkT5xt*WsG8l7RCp3PHG%@`7MPdp@IJIYOe3p~-+}*>~&~w0{z5 zDnIJTb9~WKYE%qfv)2`Ax40;{%Og82kIqgWeFEEgiD^!E8w@z}-!Eq4?8KaAlkbeJ zV?F|PWMdGQ9~Gm~I8S{!h7^#}WdDQBmtT7qoC3=7y52CDL6DLrs;1&&;PJ!2ofCac zO0pVIr^LF46A&lGRFW2A83F41mw(9ZaMiC0cTrp~J`#qGH5 zs|NU(TiG78vfP_)t@(eEP*)wA!`o_bTICf4A`A3MhAS2_Afh0u3y{kAnLX5p+N;uJ z*QHR<{k}Y!q;(ap1>#3uku2jWsTZ;&GAtW-V{^6+Gu@4h@=5t4x^d6A7k}zNg=vNW zbuj8j-obhex9EXvin@6NdQcox|hP4+b6-Yr0nm2NUE^0#f%}1v<)Y*`Ak^l04Gz zy)=e3w)BLkPyns5iG>{YsekKGAN};V#SRd|E;u0VxB_uBSKh?DDbR6W3(* zqBAuwhadAweR>o*@9A_6(X+=R;Pvwo!`D2n=_+-Ik_RDqFRE2dVt=K8R7y7jQ#OK~ zuYm17!=I@^>PjI74kS01-TsX|69~g0IE{o+oz$*O;}b24ZBkJ)4P+ex)o7hjsoLkX zS9(yW5)4z9=`SaLS-dmxn$2>2`J5I038$qWh~{(nPk`$~y%y6lHFif~#8!M%Cj0bC|dLJ?T5dk3hDaJvwIMzlj= zGhY}GJ@^J1DsW~|K863CM1l^wt6*qbhq??AX6IFS_f>R1YiRKbqRam!)(;s*7O$22 zGYZSJI!0l$hkWBf;E$3pnN?INg6~9`6tlG2edDw+-3PVdkkiUDLN4MqK?h;;4_ZSoiBy}U6$Rz7Di#oW4*8oo-$!uL0*~68x9u5 z9L&8d`^s3fWiq@>3|coa`J@||l(cVN+Uvs#wH~t@K5b*V`5e5V4TM5k!j%~#Eqrq~ zBBElUfEjnmn|~(fZtWxi$ zb^-#P3$h#7x2hogtJq0kjoe&$^?K)J-@G?Q(}lGjnSb6To;Lj{Wphyk(>Yj2b-?|&EbD9ZGU3_zeoRn z@XFCAXOM7v@AydC)qOJOLwBSVlCOy4CxRViRjmk;B!CM8k{X8zv zzQyM^>5CxHk8TF&i0(|!z!ohZ;mRt)S-tz2%D6K)=2?^vg4bbhpdLLy-U-rwK< zgnt+9yELPDEnn#OhS->zx0-AMRuJ{7}hHW8V^2}c12?T+mNWM~d2_I3^Sm_c%(o5xwL zJ9Yg#d&k<`Mh*PTzYqZi8xGTy$1oXSCXh6QN5domhG*sypWCC3FZgVV%Y<+IZ-4fo z_3Cx@os&QZD3AK|Sgls8-IcUjkzyIc@)cQw;fK%Y)dg#@kk^(yYqNeN?xT9_CKWB# zqB5)tlZ!g9>^DVz1t>{L`-v_wL-;O7yhM6R$t+%ZBO?LCYf_VNN1Mk>!0@>rqz6VI zSS6>R=6gYuC~y`prWojFh=CnuGJjmOLiS7gxb*v|cKgtoVR1fxWPmwYej!FD?uOcZ zknLlT6YAK3W(~LUc|Mc-YtukW)PC8i+YA*l zeZy3B*-KSKYdu+IdAV_#s90NjH5sCk7dk#wG&tpe>bh(6w6ynL2TAr+(Nf|401t4* zMSdf-OfnvNV9 zM5iNdA8~eB+ewwdRH~}FFgfRVzMGi9=dxRN@q%tlxb(okaoK=>FHQa}bIsL#Oe`Ef z6wh|{Hip{K-YRjt+B8KyDN6I7GcQoScwVZ`vg>;nj{2EV*`Ad+AAhc?HJ}Ad!pket z6j+er?{jsFU_w*4@cVreDG6#ODa2L@53041;CkWKWY-HfkV5chdDcmVn0NPJ7wiNG z-U~ovZ{53>y}DPz`8rIX>^>}_S>MuWx@GP0!o%uheswhk8W%%eqHNPj66)~1w0fD% z>n^;)#j(&VI66&pA%E&7t$>E#5T|atR}Q69FO0V9oH!SC%J4*1uAJuL@N zWcPDe7M`7)?w;;vQ9gJ_xdkA4=>Go0Wdl*SzAuMN!f+c(W}0@O93l;D(h60R*&^5z zo2%n%^R7L}LtNHx2YZxj=9+8}K;)y$v@Lu8$G)D-t)+#=Nq=rnKBSM9)nUd1RqSDW z+RmNN8tOg7N`BJE?8mVU<{|7vP77YJvVjv6g$DFIKp0S3x_&`^>HHcf=lSE7nOo*W zB1G(|5KN8?xGq~aQiBAk`$!!N9EUI>Oh}IQX8tivcwnc5yyn5Q7JW32R!SHWFl{8p z9Se-({k=wUv45$wXd^DV%8O0J#iYHon5-5S-DO25QPC_Z8U;m@oVc-==rm)~6L#%< zz5D4pX_~D(S=%`_;Q#di2Cl9xUu&i_@ev3~Q`F!gJ%bGPkRH)-2ye3RPRs8v?Vo&n zbbNa4oFaS>{Ec?dKP6JsKqY zn3G(^m*biomIT$fkW(exm#U;pZF>9-r&@DUdQC5{B~HwP?R)H@E&U6i@V@h}`E&s* zbiipS^u4fG;rs}v1c6SJ>Y1P=pm1-S@&2TM_)68)tgyS|yX6$TY$t{6OcA_p=HkxQ9nY|83184WIy|(pf zRZiaciqEwlRLI=uOZFQu5)Rnb&TFsHC>Ji^5f06W3L~Roh5WplYqcfI!F^S~?7(gN z!5El?nvkEk|!KG=~Pp%p_9w%$z}~<#T0aW zQh$^0*HanyZoQ71H3z1au{fDDovEYQ}jCO zaWHU?E7(cEqf8!G7-qR|BmH8c3I1HQ2GCdFh83bQF8?Vk>?7MG9YhQ?lR90V&*Vsi zE4uprH5bk&vNg%fQNq8xWm&rC|L;Ay#D9hAqXJxrpax$=FNR!Ig5-HEg81!$ zoK8)Oe0na8sTb40fGJk6gy|1LX5cPiXdt9M--2h%T~QR`Q+p#BkfoY1s5aCI;Oc29 zi4>~2mF(UY%~yH3ycw6#NRh$uw=Dwoysog~0V=m(21@;c)GEaJCQ)%!UA=+*ihtx{ zHC^r~0dVy2fZ-Ye&n~~SsFu8+3A%w5rsum`P4&VX_(DVj>UIKWNL_%{K4iH~d78%P zDHYN%-i={sS`35W@Q}5jC8Rl5`h=!L0UBGht|BJUS+o6)PMf{rs^DN1Jm2l{S~Zd( zhveQ9VD!nG^9lV;cVzL2mN_}R(0@os8+6vhc)*@Do^TUBzV!HIULcAvFl@;4*|hd{ z#h=^hH3g^?7EwqrhIRx_x$bMP4N?uV=}Oa4`a;#jZleD9wvc2YomD`HD0c(h7mo&1 zLgbLNmdl+-ZPsfKE0GOon}l+LR?f6g391Gg8IV$gD1uIZr{J{tIDh(N>3_0uL)4fQ zY^L`>dWRt-C_9AWnu~LRIbkge!WIDlJ zS9eOK;@U@7#oD?Rl%bk9@qg8nPf9j>O#NV5tb$k&#b^{&e=AYYFRE^|%`k!W4a;e! zwXFeD`thVh&eE}u+Lx=#_MW9I81dW`I46%s=Kl$)#;kaV}9f+Dwz<&aP4uck={SUMvmq?o70*dxg=lj0-sdPI;)f{ORX2VH;H-6R;X8|~ z*Mbr|;@W7Ta+ZK)f#NFoq*?4FCk3yKjD z3U=5cLX;BeH}6IY-R1&JWGIlaXiCa1hwH7R8zMNWsIu^tJ*x#DSGCbTUbGK=cjY=wG>x!)xTii6= z*770p)-&gW7VyQ0&Hs8OjTgnBkI!~L z0)N_{+1}bd)=%i6P41?1&qn4Z5Hh+f<;>gEjAZ&Ia)i**1~Su^yT@?54Z&&ynvoC} z=1aWFf^K47=AP`SQMP<}MP%x85jp=($SW>j|J*nciwVGhfs zH`bhvD{3FXyTchJ;Y6G#aj;nNSGmRimu|F)X3WJH8M!ZBDxMA zSF?n}3_21q6Z?)q<^ra74tYas)P-l0ynzj_8u^qN9roze-wDn#+n8js!cs$0evlm{ zZJTl;P9)(D!lWqJ5h&hnY=6)4%7D_mXVpleKC~T4yTcmR0X=tq=Z4*En2YWB1;uK-~{GfyNY zhONxdMi}wm##a>%VmBft%rc9HuUC$^gFw$i6pf6HbUSlRE`Q2m;+>PWq64&HTJy-$ znGls+22OZI=`+9}BY4sC5slrfve*yNP0EJ)+>(G$yk`z8&l#WSfqT@JZnZ|LuGvZw zq6j`&Fp$9-e{Jz=(^^$F=^(*1t#~xQtx{ZypRRh5`|6>=NfZjGp_Wj_ttM$uFRUgT zE<#4!v)yvx1%Ct%p3GIq0NTql4#?n!hb2iq!^uOu2UOvnF)`#(*^OY~oWc)rO3Xr@ zX?Vf*rk(QXw0VboIIXas4A*nB%($4V)8$&(Qf>t?q>`D9R+L~u(?`h@&!d=hl9WbE zbC;Hsi;!lg>?zGOoOuKas&VrtE-uql1}`e06Vm?D5`Wk7v%l6D+t3`tRmwkQi`~LH z?SDh;e?u%V#HvXFsQ+(|ZD5b_cGUm&*nip{J1%~f&A7+6XqvfT|F_cGSZOjJ+gfW< zzO&UP71ercQRv@l#W8aKm>JjJh(n)E_ePb!U(N;(=4;|6Hky0A>whcle=F_3YNdrn zQ+y=&Pk)+AX+pfN=Vxs&ix5|>a-t?gl2>erbRI^U0oKAi*b?H zFj1)XhzOab8)$)H#wj1;9EYT@9v+?!s4%4r2*u2JUe{1ekQkcW#pA^-V^(+h7^;|! zyMGL#Lpyv|T?P~hdUKZ%5AE=}F2mK1S+Q}KpJMI19%Vvt_Ur_W8Pn-rY#&;?2t2)46`|Do@+h1cD-2d3uZkIZLcI3A}__neO%5 zeTs6*Nvhhhf&W!Ix_fS@+Pf_lpF_968-J|l+)5n7&0i?3H3{0RN)T?EOj@9=VPLWB zU>9J8X1kynqg$~IYQ{F*KnomG0u&3kvJ7zYDjFm{*Yx=oOoL^Q@2byY8Z`D9(a;{R z@AGZg26sHpgyO1kW;EK5^AUx++O*FV)s{}*QJ)#bthvvM26cLEpFe_ad9Diy{ zkME4P5yfm3Zz~!)%p!$v(Js=6h3bl&4xpCuZvm44_UJnvqWFOZV>_xGq0R3VVqj&B zN=LEC;8RM7Nuju(FSMT;xL2Y@z-Jgif*N5!*p6qPv@)Y^c81b!BytRa*k&NSgA^|1 zMm6kUaQQcBq+j9wy(C|oHaja6MSsA8T)VmA7H(@i_)NBTk0rgq9&fK}4Gn5~D!1R; z;Qw%wg__$H3>Ed_R@R~^6;f$Dnk=Pu9XXoZupiZ=V=qoX3SB%-6=@c~sh|TL`ZyZh zw3DOJKhR5hEGpBfsBuM`d6f%nG}pN5>bWL}P?m?U8!JMd!ihukGt9GeO@AZ}b8nV- zYhXJ#X<3cJ3A~87_toe7$J*a)UE|QK+sJL`Wvh~4{U7N74hoo#f0R$$2uKEqSYkg|k@BzSCwLKK&HQOr;OsxT8pg1@z z=fxFU58TmylYv5LHDBXLk1xE&|78VZem(|yw`%uAD|B8DY82Zn0e@As7k)JBDUs&p zgBE@2_2U&G=Hcw&S54~|x4dOh3xaV>-A*LqDw`0EYyM4SQ#5132`WH3+BWV^H;5O} zjcQO~Bbq_Izl&mmVoWbaL#UMwj{IVGB60|2h@jk_jLRyW390d#{{~Vn(QHLbHI7Y1 z(H!yAV)5cuw>^%Ix_?R{D`GfBH-O?zG!_PhXmekujn=ZTHq=}jA9C1cwVc&*PK;}g zuU1QL0ziiY4_mxR->sWNrw=PZEjfpp5nNX6yl#zSgl7$HxO3|ChI7j4X*{PGDKsQq zymSWHIn;`xUvkKC`;>o2s(O_>%czx+(*GVR`yEJ8nzG31;D2=&qvv7Feb|ir6qp^< zP*=)Ry-hT17zzIGp|hZyBr#;l^CODaX5^FrSZ%4v6>X2Da#xZzMZy0Y=_{zWCND3^ znRMOFJzpIUhyMAiI7r6gL6 zNgp0pm98w4aDTe!-2^SxZi+WqT}nO;TZ+|*@04W8dr3VliLHfkEj4$roDEuLeWXDx zr=crjdbsWC&8N6^$&12Q2G#MsaPxtH;xKoV2od|RCjNX0PXL2@>a9cG9+UpMt1tEL@{KCHDl7G(RfJ}`J8ucB2Qi-pNi??W^ z#LzTl@EfEl)WL6l?!wP~=I7Q|u%2P+ZukIU)BxY%XlI9938uxkcTiy?*CbABgSk zAUdV#lYHJxItNkIo+ANG$#QKnZd!7*@J`ql7k?q2WSI{=pdiAjy*PDf(6Em63<(5a6ahq;y3>*I2ZX=aAb^(edogVNNMsnnk zx_{`Z@YZdLD{?A-j)WAKC8w^qVM^9gmX>ijn?VqpY$@(Ix71>oY{D%o3-n<7Pf{N{ ze#_L~g#IZ{p65c_PuP?ka5lQ)_j_DPT_yfi$=nB z8*_I~G};F6iCkE0V@0IlBCz%7PRg;hIe%^<8sR4K^T)AV*1hE%x9{fu9VVST*YUgA z3JbD(E5j5D@0hJD3Dz?~{ll+Mig9^ST>&t61K8us$THTC!I$&;F|OH`_r-sYmUH%f zvvDzWF1MRi3t5W5pTYl3KTB3o$V1*MqqmcS|9N9cNjfQw{=8l`vCTjFGMSWCdVf$z z?=nA6l-jp05`d)7Zn0a$qc{*OLq?Rko zLHh^RBz`Zpg`_Dgc20mmv!0SRwgk?2liK4p8H-;B36s_XlpSjVO;1Yk%kxSBH|P-^41Zu0bbkYQ9r|rh zzi=34d%Xo>ZtK-ox4?|>L0r3^n%7_$-;)CUwW^Z~nC=>s>9ZkqZcH18GD-CbGzg50 z=a`Lf9`4dXf>J6zib3P!-@q2#dfRcJC&Tsj5xGgDeYB@8l!(EL4d)m)({beb{#@!f zr#cTqjDl0-xz&wbv?J%oI)5@Q(@IlH(b(l>LutbR*UB6&Cb?-K?c|RwyQwnca?xT5 zmr1a3atHEC#Z{6XEeP63gf;@K9l35mtd8PtbG`OYa#}YHaI5^Y|NJmeH!5^w4Az5j z!?8AG1qJF*Z^R9Y8n#Ck{2sA5X3iTmpQJ#8j!Wc(ay4Fn=_tGhUoOU9ir1shUoOBLv*_F5S`x95G@@rpGSvAc{ez2 z+vaTQ5@@0vJw8bxP{)3O>Ic<#4N0kyX)LwD7Pn2Cx18A#7?h3gd@Zim zymKv(Y1g`i!`X51sI2Wvu*DKq%V&>i;9@r>fk~YWovho=pvY}kDKp5cTB7p*Y&di7nfaS5}cj}AMr@Q{4(xqlfU6Bps-XIvGC#lN^E zvd{Z&bxGFR3HJ(RUBX{IufWwxQ9h8A=*Hy7UqgydzC8@9=5$4@b1JWYgN$GExcfTV6purRgzlPKR^d6-5Ob_$G`}hsS1OD#+bl<#g zQx`UM;iW#asejKXwQqhh_Xh8Ty=F|HBw!V_d_pb1^)4I&zKLb~<~7qpgx;j%LFE~l zpZDoV*>dJq1`skRo(a_Jv}|vHhDm0Y=gY@W5lc@TomTr@5WZpUd)#W zCPG?<=)exqfew*PUD(uxm--A-(?g`4W=ybTJVXcH5Pu!W5FM-=BBBC}5CF)abOu#3 z#3(~_@C$#1BlHGvNj|=qk6{Z@R) zVfwh5;D2@CF~=0~Tg}H;k8^;13D-jhIjD;JIP`;ONNJ#kPu_?4#$jPD+%`G3SdAo} zJhCJ<=f&)4QA{|R4DG9!oPyY5cbF#Ad|1xwKue)8M?wsoMjuE3+k>JyD9)$3xvYl8 zcn3foB6t1P1DIexg`h5~x<|e110j0=G*PB5Cx6Q_&j?N=R1alPm@i@&uQBbkIo)!? z0i^CMGz~|RnWqtyV5Oi|4SK}jX76ic0X@s(i2znxfiY^RPdQs+=Q(`mJS;X%!TJ0N zPyW2TlXI^)BPFi|1>!3QkJ+!TWNgF?py7UlwTvo!8fi{lc&X1gH8cZ!ewN`yDhf-V(514c#Km=a zDTANSlml$;EPqmH@JX6UuuPxAdt8M!L$#(H#0ua_ulfPIpy5T&BqeDxcA;~Tnu^ieQQvwvJiNB6y( zm*CBA>$>tzu3{hNw8wLcOK{~!2MRW0K3IW4Tu;c6uC-^Q)7er8AYS_ifMVnaXAao< z`vBn|2kHvnfS%o?sx_WHZu@yf4)-$e8#(C;bYtBMI@*^F!Jwt1^Pi!s<^!+zprX`Z zf_gRFuryu<4y2c`Q`Y;xm47vCfJ9k?a(HImhqERA<88AfNg^9Ac&5Mepqvatq}J7C zR*8~bR*}>ErMNK7AP;L{l`N{Fe}XDsmlT1cb&b#S8dufrD|`kvCR~f`R>8{5_LUGV zh+fdC{MQB0u$(Pc)%hSLB^ZPdJ05ifmjtak=KtZlh2dk3x_+igaDNNbh2gA=_j;1h zd>AortbyU1fGZIs+c0iZOhtuk)&W|i0WCTMdX@yl2B`x^Y*V|tgyRzPeY1AVR)|Bj zrTkKAQ;8B#Qoj#I=sSTd*V|kv?fHF5O#f&>IQ-b5uD<8!SezRG8hCzYVUf*1{>l<0 zfG5eD!GzcnAwW#q5PzDiw?c@LE>LwpUkAB;GdCPyI$n)OSU=K_hXzZI6B~F~45d>z zcH=cgj0$tTo~qW6)k_u3^t|5WnK?IoG12pZ&J%O4A98>nBUcPN;HKet>A;t_hvw(} zgoCV4nWZUBk{FaY!+Qs=2(nF7^c`;UWPXkX#Aqg#SR2V%8Gm7I)aSSv8C>l>b^~({ zC&S`5J{Nx}*#V*5u#&1C`MD_qg;ZY!;`?QLKhj7DxYm_EXj{?}pto#8Jy09xpGRP% zj+BXKR*JdyV24~+7Fr-$Uq};CBf9SKPV;@hYnD*b$XaoOP-(4^&Qg&cuP+t$$|V`C z$kvsGO_JhKHGf_3nxh3W2VNaOs%;BkEw*j}%PRC1lw{Qsi)xc5Ofq#aXrv6^0PJmP znW%4ErcZ%11P9eVH^OS`tH~3vo+b8fs)@;PJzIp9Tid~iEZ5t#fbZH0ZehT-w}e{& zYikWRTg2V0;#MOVn#nDyfqrN`_m-w2KVEVR^Dul*{(qIh{n3^i@rWlR9#CA;rIaU^ zw>{}vqVVK${Zw2}xf>GkM{85M_1j|M z9D*5EA&?GBXb)Jlh>ievsQy9wvbvzw_GADxDHzDuUD`I8a?my=aM<5dM}1xXDlA^< z{tf%#fI}{X^@A;_y*br-fi(b@s*NnE9Q{i%CyANU|41=XIGZK(y}5JyJ#kV-iHzs+S&nNj`POD$bVPV6=qiH+MIo_mfHu7t6e6aufOJ5wGoE(0>e|o%o z_;COD8hmE*x~9wz8ve+O`i-^Gk&Yw>xiCDfrsJWxByovo)C=JIOZ&uKJ}zkQvcjhz z7J_rl&-2r>v;5>tE?L$k23~PCi)ubydVhG)wNGr5P~dlH<#Henfyu zGZdEsG}n04=NB{W`ThjA#Lb&H!|@ky`&E-s`Di}n?e8xvgj1X?#gtzwp`2f#L)E;t z8{u?)ULf=Tzd`(B?DEZP?9S503qH2JguhK3=;4$GFku-J}^|7-BrgBVG#y|zQmk;|tL z2*^FQ6L`r^#;<3NCRp|4arLxS>Cp&^%W%XsxH!!mAWs@8m2X_Cq0Q3@pMSp)X z0G$wF62(y1nrs88ny{a%5}cXAW7V>@)*?Sb8Z;*`m8`A%E7=~6Ta)Vnxe!h+7Upnr zF~t|%5eWZgsoo6AjHEJ2S)fBFHj{0O@GGq0;XtP_j6VdQM;-<)>aG~Zm!HV_elSw2T{sfB^9)J zOqxeAtz*p@>Yq|{G7hn&eFA9Ei`#(v5$j7AUD2Vp1lU9QhOiN^Sjp*;nK{n;0buuS zV=>JNYu`-(EpCseMrMX{!c*oyzQ|u%v#z{E1F3iu`Y=XOK>X{vSbyUUgE>@Oz@hql z26hF@lxbN%0TYHTJb>w45r~ZmkVeS5UMWC*RE6Ed*PGb|eK;`QAiQ&rZ&uI-oa*7kL*YHC38G2pnpyXxL{x_|fYs(<&x{)zn_m~Y7E zWSJv@=IWL0 z&2pS!OvwDN?vAiGt{V0kB>uxw5z;$2p4I^ps`x;+c2F@^v=$}=2;FwC+k^J5y4Ow& zRDL^l9G{ao?>*o3l?f1nUgFq(j*~c!~ zXpe;VhTH)zh_J0YnQNeB1ADnYXWMnP@9h1&#EHGbbeUs1MfQ-*(a7Td5dmUUve~2U{(P^XDVSibrQD>4Q5hHBUi@H?_h9CQLK&Jo4|aA zWzA;gGF!2=>)McW0A8J=dwV;Hl^u@7q0q@%sLQ{gcD@-i^U9ei&V`4-uIU z;M$2ncEB-t!+h{!Oe<}(@XLYR$$bTD*E#f8KW{dz{13CYP6 zO*a)FVw+q1pfkQM$rgCff)^}V*5iv|@i%jt8h@!@Twgq|SK?rguK3FJW3ngcqwBe4 z-|*rb7Km`;5c5Tj{^G%^sn76_lG0z!&L_n)_#!u>AwlTrXlu^A@U>yAX;y5DRB*F# z0n9j8o?EA$Gl9$N)g^G$Rz;kqCs8lCJQr8EgAIui62>PgGZyOO-q8X)2+bA05rSn7 z#eXEscOwYpj-6n32YeE|%jH0U|5UlXtMwRbT?D-@KRR&tIHiTRM2>j1g0~dYI=%s; z(}d*Tv*SOb=&fH5e}HqMgQJu0_D^9*Jl#89z@FL*2;xLvgMwqhl*AaJet<~#PxnQN zdoZT}!<>6xAZhx6ujhiwmjp0ysvkkP-+xF?!d~f&kN%PqzLbc>v$6_E&VPzaE#y!+ zedamS&k_W{huCEdJB1C{wAlIj5K{6N&yJryKG=buexlxqPOCIQSu6OQzn?U|W9~rg z-tL0k-JwsOR-{+3%4Qw|&=4^6Nc#M%jAkv80RWtj0;)#4277 zKAM0%z758O*N5JL0e;iyh|5LF*@ua5`Pn^_Ncb=l@oOY@fyjpeMxP?|W`M=rdo~_- z?~Tsn?mat~MoI3DFUnoJEPwACWqE&mS>9K&)Hf8Gvs8W4>qKe2gtT|w^GE~P34?R* zt#eqzPme-^`UTL{q|Y?7b?m()?N1DzWP2Ed_U=bv*wn0|zt$hI8H<%K!fP{|u^YC` zvo0<*mM?ku$kWFTTms|x&3C-NaPQG_bqMF^)UfoGg=A9qDBmaT^?$z@Oj1#ZGf`qh z=^sdwS^jgJm&#- z3W)WI8KALrFTA{hiPu!o$mO?4!i zUq;oD2y+<|3Ux$RbO0h^ZKHLzRhWPACzS}ZXoa3s zbXDhq82!#EjB!#)Bs!{wjG_{6BaR9~6<7rYOM?-WpLoc1W1oq=UiU~LW(jJT+ZA9k z-xtkU<5_R$o1B92N71W7R{>=vg_EVLIG?p4Ki8M@*;T!nviqP6WkJa;t71{VgmwP4 zV-DgP8uvFwee1k90 zw2}eWNf5z!1oR=akKIsJ>C$T+BVCMTjlca6J-Lf`LaRpe^i8Jw_^W+@w`3yeO0O#N zTM>bhHC}*hD?GuDxULhzx3QW_oab$q?)9$j4t4|y?lL8o=z)K(?Ad!tNxF;+uyJ?b zyAc|Up$&lM-_Zez!5vi%X!m{>o5KwLQW4cEkp~#?IV7c8J*3*Yf%JV#jc&J(j8NU> zc5>Tb>P=NA^y!SRID)o}C@F2pRu8zIqB7AF-N2?L4wU778y$%d{VN)>Vd(poI)ZM! zJJ}|Nh)YFHYf66}V89C*muh{HYV#h_18>&VAg9mS>&G0t57nQMz$AASk7iIDE4I;PK%>QKEs)!TMw+g1moQHj5St+Vkbr zWVoY1LjBYrh})4HM%CBnt{1Smq`!f}F3HEIa`HGe-A{k$e4$!EDn7;IK>MUV@$>%e zvaTf?#EkQ~AB#vKOEd8s=4onYW-k^qO~;{uX8t?5cC+tXZ*C2A#fvbEZHPWuLOoJe zo5(x{n}pZ9f`A1 z7bb5c=YR+GP7}xqi{gSsSW&Azs3L%J5`UH}>_H}i#6PQ-K9zT#>ZAkF3928UD1PPZ zWz~OaeQ|k?cR}e|*iT)Ae_2CTPKhI#@VS2p^VOeIRrH5UBN~~;|B-u!8M>!+_7?>Cyn47? zd7v`kmQgon3Xytp+D80-@gaTSWh2W}P96vK%T-_~KyD@Tune_#+s1E;S+BToR(&VUMvLrjt8-)EO$F(msEz`^ugt z0zeZ+^()wzmJ0%7Pfv>P_Me_&i7$P;TwbnY6DgaRAL2f@Kuvj^`GgX`abBO->DfXR zr+C11Q_?)>x6JhNsWU!^5ieLO`cus|R4lI!$?lT4@>G~D{u%KVk_iDg;k=Oiq>K?V zt={cIzjdaX%gmf_Di&G)9;1KTTGLeXR@t!SmY~VoWy7``sbzApBY3SYeiB{FIA5w; z31wXpKgq2nnk~&g#=hawOCaT>x}@ftufavp@utD{M%lK8*>=WR{zZhYr*vcITq1Zk zxqZz6HbHqJdY@WJHgX$px4T1B@-M6HP_p+V(aI*<^5M-n91+7$B9wpZ)AM3@ncb;x zx3`a4#4jh)0z+-mCX=ai$U32lS2ZIhYus2-bnMxOU#%M6zsoK@}a{ zTGyI0P1l#KD&^ZwOz#=VN6Qtka)Zf{Cc3Q$O@H7{G>APj^JU#SE^Fif@V&WMuIj2d zKx2f0hv^aEyBtx$Qwx9YrK7=t#Y1HCA*F{$m|W*SG&rK4#!+(XF+wAx+oUr*haH_q zB?h)AwMpl@uOy&?A7fy_dag^DSI^$A ze}5-*N7?1wVyAyM!ftQG9pA{izW>F}FZ`J9wS%Fxu_7@?X}#2BJZA-Di?rDK+=U64 z=y=S1G?fAO$rzUJ(CxaX7@R*cEiH4C*C)3U{!i?S8#BU9FwRMC>@3aj`UK6{%~cWUpPq4P^NLeCjT?VdD$1&McDvy_UON zb#~<6f%aLpbNyqui%gufbeH#4=A(Ok8bQu?e-Qk-LMswpwfpeH4~uV)k53MZqbCm^ ze}8ZYk;M)N1(w1CcF;Bd08mQ<1egC70vfj?xdD1z56N=7NQ*kRia3k`0AIuim#h{7 zH5P2f&1e$1(E%`U4#^L=(E%`U4#^L=m-iL|ECK|kmn9bhUIN;xmxUJsGXhiIm%0}M zGXkdMm+uz>J_1qYmoFFsJ_1_imv0yXMgyVu0hhlD0vDIh7y>E-75xF1{1^g40}TEF hmq8f diff --git a/Moose Test Missions/Moose_Test_WRAPPER/Moose_Test_WRAPPER.miz b/Moose Test Missions/Moose_Test_WRAPPER/Moose_Test_WRAPPER.miz index b49e9ecc193176bcdeca6d7b66ae1fdd86ff93b5..5746543f10612e2781fc0a95fa41e3455e93a8d9 100644 GIT binary patch delta 106267 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�&7PFaJ*l;onvZWADgNNwZ) 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

c+DlV<{ZCBAHO`=++R$xH7_#f^(yG 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

c|y+8{M)F&^&ShJmR%%qd)fID>!vji^}8 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

my!p0J_v)QMN6vAYRs$IK$-p(e- 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 N@dE$=AtnL<001hLZtnm9 diff --git a/Moose Test Missions/Moose_Test_ZONE_POLYGON/Moose_Test_ZONE_POLYGON.miz b/Moose Test Missions/Moose_Test_ZONE_POLYGON/Moose_Test_ZONE_POLYGON.miz index e21003e1aa02a410d58621c5b46e7c762bd0e84a..1fab8ace3a85f6fee8609fe2df5e501ccbc85050 100644 GIT binary patch delta 107548 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�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
|oyCAb~dd6Kd$PQ=I9X5X?SzbQjr7C>>xmd|4 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 ASO5S3 delta 853 zcmZp>#lB%a#6JfoO=qs(3|%<(SFxoLPKXyTK-I=}CS zPnz31X~*uyIHxC-pYP4Sm?81svv?jCkNI3b_G$e5uPx8a3!nTniL3kSmw%aN?O)SA z)iRsaF|({&e?u`-vn8qExW(j&=UCf)*HYS|v~z za=^?eGPz>+=Mxw9c1)U+-pk1{#Y*OCThOJRmnXv_t9%+FR$n2oIW{b(fmfY26jI16eieHctT;-yg{OrJ_mtIBPe5XB*TlW~e{lcNN zaMiYo3xADN64U-Ks-G@?#nsj&N3rw$BQyOO@0n&b{LXveIFCtOs%Fox!j>x5y~%eR znv*BASDFglyO_kky?K_$i>jB#vz41dx`h4+)J{>F9QaZyLzk`ea*(o+=Fug`zV?bd zTNZSkND)$?s${IUggp~)ZQt;$wE*wYsLivQ1~Yj=`&_W$zso4?yC+I4&0 ztqH5y4{i+I{{BW?(6`e$=QhtVc8TD=opewC$*LKmXjP8OP`Tny`uYb*`!OZ{!xtYbqnfZCsZC){IF=dNP zUMMO#y%EHY6Pv#F6{FnrJ#QG*_+E)IFq9`2rDo)p7N-_Z-}IVMi@8dYVfy{oj1n?P zDUt!G4h$H<nhURGZ%N1}Gh6!Z3Z|8%Fi%HXz;;ATRO_qxSR) dkU83J6J;dC0=!w-Ko;`?VG1(?gP9MA2LR&KaBKho From 64f67e2ae080b4245b9e90326881b53874fb8612 Mon Sep 17 00:00:00 2001 From: FlightControl Date: Sun, 5 Jun 2016 00:06:09 +0200 Subject: [PATCH 3/7] ZONE_POLYGON --- Moose Development/Moose/Zone.lua | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Moose Development/Moose/Zone.lua b/Moose Development/Moose/Zone.lua index 80efaf0e5..2d061e1a2 100644 --- a/Moose Development/Moose/Zone.lua +++ b/Moose Development/Moose/Zone.lua @@ -338,9 +338,10 @@ function ZONE_POLYGON:IsPointVec2InZone( PointVec2 ) ) then c = not c end - self:T( { "c = ", c } ) + self:T2( { "c = ", c } ) end + self:T( { "c = ", c } ) return c end From 0d42c1670eaa876557120f186b37d5b3c1598773 Mon Sep 17 00:00:00 2001 From: FlightControl Date: Sun, 5 Jun 2016 09:37:27 +0200 Subject: [PATCH 4/7] Documentation + Zone functions Implemented zone functions for GROUP and UNIT Documentation improvement for GROUP, UNIT, CLIENT. --- Moose Development/Moose/Client.lua | 12 +- Moose Development/Moose/Group.lua | 207 +++++++++++++-- Moose Development/Moose/Unit.lua | 81 +++--- Moose Development/Moose/Zone.lua | 30 ++- Moose Training/Documentation/Client.html | 8 +- Moose Training/Documentation/Group.html | 307 ++++++++++++++++++++--- Moose Training/Documentation/Unit.html | 107 ++++++-- Moose Training/Documentation/Zone.html | 41 ++- Moose Training/Documentation/index.html | 14 +- 9 files changed, 655 insertions(+), 152 deletions(-) diff --git a/Moose Development/Moose/Client.lua b/Moose Development/Moose/Client.lua index 75e1ebd16..4326d11cf 100644 --- a/Moose Development/Moose/Client.lua +++ b/Moose Development/Moose/Client.lua @@ -1,10 +1,10 @@ ---- The CLIENT models client units in multi player missions. +--- This module contains the CLIENT class. -- --- @{#CLIENT} class --- ================ +-- 1) @{Client#CLIENT} class, extends @{Unit#UNIT} +-- =============================================== -- Clients are those **Units** defined within the Mission Editor that have the skillset defined as __Client__ or __Player__. -- Note that clients are NOT the same as Units, they are NOT necessarily alive. --- The @{CLIENT} class is a wrapper class to handle the DCS Unit objects that have the skillset defined as __Client__ or __Player__: +-- The @{Client#CLIENT} class is a wrapper class to handle the DCS Unit objects that have the skillset defined as __Client__ or __Player__: -- -- * Wraps the DCS Unit objects with skill level set to Player or Client. -- * Support all DCS Unit APIs. @@ -15,8 +15,8 @@ -- -- Clients are being used by the @{MISSION} class to follow players and register their successes. -- --- CLIENT reference methods --- ======================= +-- 1.1) CLIENT reference methods +-- ----------------------------- -- For each DCS Unit having skill level Player or Client, a CLIENT wrapper object (instance) will be created within the _@{DATABASE} object. -- This is done at the beginning of the mission (when the mission starts). -- diff --git a/Moose Development/Moose/Group.lua b/Moose Development/Moose/Group.lua index faaa6004f..a63d742a5 100644 --- a/Moose Development/Moose/Group.lua +++ b/Moose Development/Moose/Group.lua @@ -1,17 +1,18 @@ ---- GROUP class. --- --- @{GROUP} class --- ============== --- The @{GROUP} class is a wrapper class to handle the DCS Group objects: +--- This module contains the GROUP class. +-- +-- 1) @{Group#GROUP} class, extends @{Base#BASE} +-- ============================================= +-- The @{Group#GROUP} class is a wrapper class to handle the DCS Group objects: -- -- * Support all DCS Group APIs. -- * Enhance with Group specific APIs not in the DCS Group API set. -- * Handle local Group Controller. -- * Manage the "state" of the DCS Group. -- +-- **IMPORTANT: ONE SHOULD NEVER SANATIZE these GROUP OBJECT REFERENCES! (make the GROUP object references nil).** -- --- GROUP reference methods --- ======================= +-- 1.1) GROUP reference methods +-- ----------------------- -- For each DCS Group object alive within a running mission, a GROUP wrapper object (instance) will be created within the _@{DATABASE} object. -- This is done at the beginning of the mission (when the mission starts), and dynamically when new DCS Group objects are spawned (using the @{SPAWN} class). -- @@ -27,7 +28,121 @@ -- * @{#GROUP.Find}(): Find a GROUP instance from the _DATABASE object using a DCS Group object. -- * @{#GROUP.FindByName}(): Find a GROUP instance from the _DATABASE object using a DCS Group name. -- --- IMPORTANT: ONE SHOULD NEVER SANATIZE these GROUP OBJECT REFERENCES! (make the GROUP object references nil). +-- 1.2) GROUP task methods +-- ----------------------- +-- Several group task methods are available that help you to prepare tasks. +-- These methods return a string consisting of the task description, which can then be given to either a @{Group#GROUP.PushTask} or @{Group#SetTask} method to assign the task to the GROUP. +-- Tasks are specific for the category of the GROUP, more specific, for AIR, GROUND or AIR and GROUND. +-- Each task description where applicable indicates for which group category the task is valid. +-- There are 2 main subdivisions of tasks: Assigned tasks and EnRoute tasks. +-- +-- ### 1.2.1) Assigned task methods +-- +-- Assigned task methods make the group execute the task where the location of the (possible) targets of the task are known before being detected. +-- This is different from the EnRoute tasks, where the targets of the task need to be detected before the task can be executed. +-- +-- Find below a list of the **assigned task** methods: +-- +-- * @{#GROUP.TaskAttackGroup}: (AIR) Attack a Group. +-- * @{#GROUP.TaskAttackMapObject}: (AIR) Attacking the map object (building, structure, e.t.c). +-- * @{#GROUP.TaskAttackUnit}: (AIR) Attack the Unit. +-- * @{#GROUP.TaskBombing}: (AIR) Delivering weapon at the point on the ground. +-- * @{#GROUP.TaskBombingRunway}: (AIR) Delivering weapon on the runway. +-- * @{#GROUP.TaskEmbarking}: (AIR) Move the group to a Vec2 Point, wait for a defined duration and embark a group. +-- * @{#GROUP.TaskEmbarkToTransport}: (GROUND) Embark to a Transport landed at a location. +-- * @{#GROUP.TaskEscort}: (AIR) Escort another airborne group. +-- * @{#GROUP.TaskFAC_AttackGroup}: (AIR + GROUND) The task makes the group/unit a FAC and orders the FAC to control the target (enemy ground group) destruction. +-- * @{#GROUP.TaskFireAtPoint}: (GROUND) Fire at a VEC2 point until ammunition is finished. +-- * @{#GROUP.TaskFollow}: (AIR) Following another airborne group. +-- * @{#GROUP.TaskHold}: (GROUND) Hold ground group from moving. +-- * @{#GROUP.TaskHoldPosition}: (AIR) Hold position at the current position of the first unit of the group. +-- * @{#GROUP.TaskLand}: (AIR HELICOPTER) Landing at the ground. For helicopters only. +-- * @{#GROUP.TaskLandAtZone}: (AIR) Land the group at a @{Zone#ZONE_RADIUS). +-- * @{#GROUP.TaskOrbitCircle}: (AIR) Orbit at the current position of the first unit of the group at a specified alititude. +-- * @{#GROUP.TaskOrbitCircleAtVec2}: (AIR) Orbit at a specified position at a specified alititude during a specified duration with a specified speed. +-- * @{#GROUP.TaskRefueling}: (AIR) Refueling from the nearest tanker. No parameters. +-- * @{#GROUP.TaskRoute}: (AIR + GROUND) Return a Misson task to follow a given route defined by Points. +-- * @{#GROUP.TaskRouteToVec2}: (AIR + GROUND) Make the Group move to a given point. +-- * @{#GROUP.TaskRouteToVec3}: (AIR + GROUND) Make the Group move to a given point. +-- * @{#GROUP.TaskRouteToZone}: (AIR + GROUND) Route the group to a given zone. +-- +-- ### 1.2.2) EnRoute task methods +-- +-- EnRoute tasks require the targets of the task need to be detected by the group (using its sensors) before the task can be executed: +-- +-- * @{#GROUP.EnRouteTaskAWACS}: (AIR) Aircraft will act as an AWACS for friendly units (will provide them with information about contacts). No parameters. +-- * @{#GROUP.EnRouteTaskEngageGroup}: (AIR) Engaging a group. The task does not assign the target group to the unit/group to attack now; it just allows the unit/group to engage the target group as well as other assigned targets. +-- * @{#GROUP.EnRouteTaskEngageTargets}: (AIR) Engaging targets of defined types. +-- * @{#GROUP.EnRouteTaskEWR}: (AIR) Attack the Unit. +-- * @{#GROUP.EnRouteTaskFAC}: (AIR + GROUND) The task makes the group/unit a FAC and lets the FAC to choose a targets (enemy ground group) around as well as other assigned targets. +-- * @{#GROUP.EnRouteTaskFAC_EngageGroup}: (AIR + GROUND) The task makes the group/unit a FAC and lets the FAC to choose the target (enemy ground group) as well as other assigned targets. +-- * @{#GROUP.EnRouteTaskTanker}: (AIR) Aircraft will act as a tanker for friendly units. No parameters. +-- +-- ### 1.2.3) Preparation task methods +-- +-- There are certain task methods that allow to tailor the task behaviour: +-- +-- * @{#GROUP.TaskWrappedAction}: Return a WrappedAction Task taking a Command. +-- * @{#GROUP.TaskCombo}: Return a Combo Task taking an array of Tasks. +-- * @{#GROUP.TaskCondition}: Return a condition section for a controlled task. +-- * @{#GROUP.TaskControlled}: Return a Controlled Task taking a Task and a TaskCondition. +-- +-- ### 1.2.4) Obtain the mission from group templates +-- +-- Group templates contain complete mission descriptions. Sometimes you want to copy a complete mission from a group and assign it to another: +-- +-- * @{#GROUP.TaskMission}: (AIR + GROUND) Return a mission task from a mission template. +-- +-- 1.3) GROUP Command methods +-- -------------------------- +-- Group **command methods** prepare the execution of commands using the @{#GROUP.SetCommand} method: +-- +-- * @{#GROUP.CommandDoScript}: Do Script command. +-- * @{#GROUP.CommandSwitchWayPoint}: Perform a switch waypoint command. +-- +-- 1.4) GROUP Option methods +-- ------------------------- +-- Group **Option methods** change the behaviour of the Group while being alive. +-- +-- ### 1.4.1) Rule of Engagement: +-- +-- * @{#GROUP.OptionROEWeaponFree} +-- * @{#GROUP.OptionROEOpenFire} +-- * @{#GROUP.OptionROEReturnFire} +-- * @{#GROUP.OptionROEEvadeFire} +-- +-- To check whether an ROE option is valid for a specific group, use: +-- +-- * @{#GROUP.OptionROEWeaponFreePossible} +-- * @{#GROUP.OptionROEOpenFirePossible} +-- * @{#GROUP.OptionROEReturnFirePossible} +-- * @{#GROUP.OptionROEEvadeFirePossible} +-- +-- ### 1.4.2) Rule on thread: +-- +-- * @{#GROUP.OptionROTNoReaction} +-- * @{#GROUP.OptionROTPassiveDefense} +-- * @{#GROUP.OptionROTEvadeFire} +-- * @{#GROUP.OptionROTVertical} +-- +-- To test whether an ROT option is valid for a specific group, use: +-- +-- * @{#GROUP.OptionROTNoReactionPossible} +-- * @{#GROUP.OptionROTPassiveDefensePossible} +-- * @{#GROUP.OptionROTEvadeFirePossible} +-- * @{#GROUP.OptionROTVerticalPossible} +-- +-- 1.5) GROUP Zone validation methods +-- ---------------------------------- +-- The group can be validated whether it is completely, partly or not within a @{Zone}. +-- Use the following Zone validation methods on the group: +-- +-- * @{#GROUP.IsCompletelyInZone}: Returns true if all units of the group are within a @{Zone}. +-- * @{#GROUP.IsPartlyInZone}: Returns true if some units of the group are within a @{Zone}. +-- * @{#GROUP.IsNotInZone}: Returns true if none of the group units of the group are within a @{Zone}. +-- +-- The zone can be of any @{Zone} class derived from @{Zone#ZONE_BASE}. So, these methods are polymorphic to the zones tested on. +-- -- @module Group -- @author FlightControl @@ -524,12 +639,12 @@ end --- Is Functions +-- Is Zone Functions ---- Returns if all units of the group are within a @{Zone#ZONE}. +--- Returns true if all units of the group are within a @{Zone}. -- @param #GROUP self -- @param Zone#ZONE_BASE Zone The zone to test. --- @return #boolean Returns true if the Group is completely within the @{Zone#ZONE} +-- @return #boolean Returns true if the Group is completely within the @{Zone#ZONE_BASE} function GROUP:IsCompletelyInZone( Zone ) self:F2( { self.GroupName, Zone } ) @@ -544,6 +659,40 @@ function GROUP:IsCompletelyInZone( Zone ) return true end +--- Returns true if some units of the group are within a @{Zone}. +-- @param #GROUP self +-- @param Zone#ZONE_BASE Zone The zone to test. +-- @return #boolean Returns true if the Group is completely within the @{Zone#ZONE_BASE} +function GROUP:IsPartlyInZone( Zone ) + self:F2( { self.GroupName, Zone } ) + + for UnitID, UnitData in pairs( self:GetUnits() ) do + local Unit = UnitData -- Unit#UNIT + if Zone:IsPointVec3InZone( Unit:GetPointVec3() ) then + return true + end + end + + return false +end + +--- Returns true if none of the group units of the group are within a @{Zone}. +-- @param #GROUP self +-- @param Zone#ZONE_BASE Zone The zone to test. +-- @return #boolean Returns true if the Group is completely within the @{Zone#ZONE_BASE} +function GROUP:IsNotInZone( Zone ) + self:F2( { self.GroupName, Zone } ) + + for UnitID, UnitData in pairs( self:GetUnits() ) do + local Unit = UnitData -- Unit#UNIT + if Zone:IsPointVec3InZone( Unit:GetPointVec3() ) then + return false + end + end + + return true +end + --- Returns if the group is of an air category. -- If the group is a helicopter or a plane, then this method will return true, otherwise false. -- @param #GROUP self @@ -777,7 +926,7 @@ function GROUP:SetTask( DCSTask, WaitTime ) end ---- Return a condition section for a controlled task +--- Return a condition section for a controlled task. -- @param #GROUP self -- @param DCSTime#Time time -- @param #string userFlag @@ -801,7 +950,7 @@ function GROUP:TaskCondition( time, userFlag, userFlagValue, condition, duration return DCSStopCondition end ---- Return a Controlled Task taking a Task and a TaskCondition +--- Return a Controlled Task taking a Task and a TaskCondition. -- @param #GROUP self -- @param DCSTask#Task DCSTask -- @param #DCSStopCondition DCSStopCondition @@ -823,7 +972,7 @@ function GROUP:TaskControlled( DCSTask, DCSStopCondition ) return DCSTaskControlled end ---- Return a Combo Task taking an array of Tasks +--- Return a Combo Task taking an array of Tasks. -- @param #GROUP self -- @param DCSTask#TaskArray DCSTasks Array of @{DCSTask#Task} -- @return DCSTask#Task @@ -843,7 +992,7 @@ function GROUP:TaskCombo( DCSTasks ) return DCSTaskCombo end ---- Return a WrappedAction Task taking a Command +--- Return a WrappedAction Task taking a Command. -- @param #GROUP self -- @param DCSCommand#Command DCSCommand -- @return DCSTask#Task @@ -1095,7 +1244,7 @@ function GROUP:TaskOrbitCircleAtVec2( Point, Altitude, Speed ) return DCSTask end ---- (AIR) Orbit at the current position of the first unit of the group at a specified alititude +--- (AIR) Orbit at the current position of the first unit of the group at a specified alititude. -- @param #GROUP self -- @param #number Altitude The altitude to hold the position. -- @param #number Speed The speed flying when holding the position. @@ -1271,7 +1420,7 @@ function GROUP:TaskLandAtVec2( Point, Duration ) return DCSTask end ---- (AIR) Land the group at a @{Zone#ZONE). +--- (AIR) Land the group at a @{Zone#ZONE_RADIUS). -- @param #GROUP self -- @param Zone#ZONE Zone The zone where to land. -- @param #number Duration The duration in seconds to stay on the ground. @@ -1292,6 +1441,8 @@ function GROUP:TaskLandAtZone( Zone, Duration, RandomPoint ) return DCSTask end + + --- (AIR) Following another airborne group. -- The unit / group will follow lead unit of another group, wingmens of both groups will continue following their leaders. -- If another group is on land the unit / group will orbit around. @@ -1432,6 +1583,7 @@ function GROUP:TaskHold() return DCSTask end + -- TASKS FOR AIRBORNE AND GROUND UNITS/GROUPS --- (AIR + GROUND) The task makes the group/unit a FAC and orders the FAC to control the target (enemy ground group) destruction. @@ -1504,6 +1656,7 @@ function GROUP:EnRouteTaskEngageTargets( Distance, TargetTypes, Priority ) end + --- (AIR) Engaging a targets of defined types at circle-shaped zone. -- @param #GROUP self -- @param DCSTypes#Vec2 PointVec2 2D-coordinates of the zone. @@ -1538,6 +1691,7 @@ function GROUP:EnRouteTaskEngageTargets( PointVec2, Radius, TargetTypes, Priorit return DCSTask end + --- (AIR) Engaging a group. The task does not assign the target group to the unit/group to attack now; it just allows the unit/group to engage the target group as well as other assigned targets. -- @param #GROUP self -- @param Group#GROUP AttackGroup The Group to be attacked. @@ -1646,6 +1800,7 @@ function GROUP:EnRouteTaskEngageUnit( AttackUnit, Priority, WeaponType, WeaponEx end + --- (AIR) Aircraft will act as an AWACS for friendly units (will provide them with information about contacts). No parameters. -- @param #GROUP self -- @return DCSTask#Task The DCS task structure. @@ -1792,13 +1947,13 @@ end ---- Move the group to a Vec2 Point, wait for a defined duration and embark a group. +--- (AIR) Move the group to a Vec2 Point, wait for a defined duration and embark a group. -- @param #GROUP self -- @param DCSTypes#Vec2 Point The point where to wait. -- @param #number Duration The duration in seconds to wait. -- @param #GROUP EmbarkingGroup The group to be embarked. -- @return DCSTask#Task The DCS task structure -function GROUP:TaskEmbarkingAtVec2( Point, Duration, EmbarkingGroup ) +function GROUP:TaskEmbarking( Point, Duration, EmbarkingGroup ) self:F2( { self.GroupName, Point, Duration, EmbarkingGroup.DCSGroup } ) local DCSTask @@ -1817,12 +1972,14 @@ function GROUP:TaskEmbarkingAtVec2( Point, Duration, EmbarkingGroup ) return DCSTask end +--- (GROUND) Embark to a Transport landed at a location. + --- Move to a defined Vec2 Point, and embark to a group when arrived within a defined Radius. -- @param #GROUP self -- @param DCSTypes#Vec2 Point The point where to wait. -- @param #number Radius The radius of the embarking zone around the Point. -- @return DCSTask#Task The DCS task structure. -function GROUP:TaskEmbarkToTransportAtVec2( Point, Radius ) +function GROUP:TaskEmbarkToTransport( Point, Radius ) self:F2( { self.GroupName, Point, Radius } ) local DCSTask --DCSTask#Task @@ -1837,7 +1994,9 @@ function GROUP:TaskEmbarkToTransportAtVec2( Point, Radius ) return DCSTask end ---- Return a Misson task from a mission template. + + +--- (AIR + GROUND) Return a mission task from a mission template. -- @param #GROUP self -- @param #table TaskMission A table containing the mission task. -- @return DCSTask#Task @@ -1865,7 +2024,7 @@ function GROUP:TaskRoute( Points ) return DCSTask end ---- Make the DCS Group to fly to a given point and hover. +--- (AIR + GROUND) Make the Group move to fly to a given point. -- @param #GROUP self -- @param DCSTypes#Vec3 Point The destination point in Vec3 format. -- @param #number Speed The speed to travel. @@ -1916,7 +2075,7 @@ function GROUP:TaskRouteToVec2( Point, Speed ) return self end ---- Make the DCS Group to fly to a given point and hover. +--- (AIR + GROUND) Make the Group move to a given point. -- @param #GROUP self -- @param DCSTypes#Vec3 Point The destination point in Vec3 format. -- @param #number Speed The speed to travel. @@ -1997,7 +2156,7 @@ end ---- Route the group to a given zone. +--- (AIR + GROUND) Route the group to a given zone. -- The group final destination point can be randomized. -- A speed can be given in km/h. -- A given formation can be given. diff --git a/Moose Development/Moose/Unit.lua b/Moose Development/Moose/Unit.lua index 5df82eeec..a4da510e2 100644 --- a/Moose Development/Moose/Unit.lua +++ b/Moose Development/Moose/Unit.lua @@ -1,8 +1,8 @@ ---- UNIT Class +--- This module contains the UNIT class. -- --- @{UNIT} class --- ============== --- The @{UNIT} class is a wrapper class to handle the DCS Unit objects: +-- 1) @{Unit#UNIT} class, extends @{Base#BASE} +-- =========================================== +-- The @{Unit#UNIT} class is a wrapper class to handle the DCS Unit objects: -- -- * Support all DCS Unit APIs. -- * Enhance with Unit specific APIs not in the DCS Unit API set. @@ -10,8 +10,8 @@ -- * Manage the "state" of the DCS Unit. -- -- --- UNIT reference methods --- ====================== +-- 1.1) UNIT reference methods +-- ---------------------- -- For each DCS Unit object alive within a running mission, a UNIT wrapper object (instance) will be created within the _@{DATABASE} object. -- This is done at the beginning of the mission (when the mission starts), and dynamically when new DCS Unit objects are spawned (using the @{SPAWN} class). -- @@ -29,19 +29,15 @@ -- -- IMPORTANT: ONE SHOULD NEVER SANATIZE these UNIT OBJECT REFERENCES! (make the UNIT object references nil). -- --- DCS UNIT APIs --- ============= +-- 1.2) DCS UNIT APIs +-- ------------------ -- The DCS Unit APIs are used extensively within MOOSE. The UNIT class has for each DCS Unit API a corresponding method. -- To be able to distinguish easily in your code the difference between a UNIT API call and a DCS Unit API call, -- the first letter of the method is also capitalized. So, by example, the DCS Unit method @{DCSUnit#Unit.getName}() -- is implemented in the UNIT class as @{#UNIT.GetName}(). -- --- Additional UNIT APIs --- ==================== --- The UNIT class comes with additional methods. Find below a summary. --- --- Smoke, Flare Units --- ------------------ +-- 1.3) Smoke, Flare Units +-- ----------------------- -- The UNIT class provides methods to smoke or flare units easily. -- The @{#UNIT.SmokeBlue}(), @{#UNIT.SmokeGreen}(),@{#UNIT.SmokeOrange}(), @{#UNIT.SmokeRed}(), @{#UNIT.SmokeRed}() methods -- will smoke the unit in the corresponding color. Note that smoking a unit is done at the current position of the DCS Unit. @@ -49,26 +45,25 @@ -- The @{#UNIT.FlareGreen}(), @{#UNIT.FlareRed}(), @{#UNIT.FlareWhite}(), @{#UNIT.FlareYellow}() -- methods will fire off a flare in the air with the corresponding color. Note that a flare is a one-off shot and its effect is of very short duration. -- --- Position, Point --- --------------- +-- 1.4) Location Position, Point +-- ----------------------------- -- The UNIT class provides methods to obtain the current point or position of the DCS Unit. --- The @{#UNIT.GetPointVec2}(), @{#UNIT.GetPointVec3}() will obtain the current location of the DCS Unit in a Vec2 (2D) or a Vec3 (3D) vector respectively. --- If you want to obtain the complete 3D position including oriëntation and direction vectors, consult the @{#UNIT.GetPositionVec3}() method respectively. +-- The @{#UNIT.GetPointVec2}(), @{#UNIT.GetPointVec3}() will obtain the current **location** of the DCS Unit in a Vec2 (2D) or a **point** in a Vec3 (3D) vector respectively. +-- If you want to obtain the complete **3D position** including oriëntation and direction vectors, consult the @{#UNIT.GetPositionVec3}() method respectively. -- --- Alive --- ----- +-- 1.5) Test if alive +-- ------------------ -- The @{#UNIT.IsAlive}(), @{#UNIT.IsActive}() methods determines if the DCS Unit is alive, meaning, it is existing and active. -- --- Test for other units in radius --- ------------------------------ --- One can test if another DCS Unit is within a given radius of the current DCS Unit, by using the @{#UNIT.OtherUnitInRadius}() method. --- --- More functions will be added --- ---------------------------- --- During the MOOSE development, more functions will be added. A complete list of the current functions is below. --- +-- 1.6) Test for proximity +-- ----------------------- +-- The UNIT class contains methods to test the location or proximity against zones or other objects. -- +-- ### 1.6.1) Zones +-- To test whether the Unit is within a **zone**, use the @{#UNIT.IsInZone}() or the @{#UNIT.IsNotInZone}() methods. Any zone can be tested on, but the zone must be derived from @{Zone#ZONE_BASE}. -- +-- ### 1.6.2) Units +-- Test if another DCS Unit is within a given radius of the current DCS Unit, use the @{#UNIT.OtherUnitInRadius}() method. -- -- @module Unit -- @author FlightControl @@ -601,7 +596,35 @@ function UNIT:GetVelocity() return nil end - + +-- Is functions + +--- Returns true if the unit is within a @{Zone}. +-- @param #UNIT self +-- @param Zone#ZONE_BASE Zone The zone to test. +-- @return #boolean Returns true if the unit is within the @{Zone#ZONE_BASE} +function UNIT:IsInZone( Zone ) + self:F2( { self.UnitName, Zone } ) + + local IsInZone = Zone:IsPointVec3InZone( self:GetPointVec3() ) + + self:T( { IsInZone } ) + return IsInZone +end + +--- Returns true if the unit is not within a @{Zone}. +-- @param #UNIT self +-- @param Zone#ZONE_BASE Zone The zone to test. +-- @return #boolean Returns true if the unit is not within the @{Zone#ZONE_BASE} +function UNIT:IsNotInZone( Zone ) + self:F2( { self.UnitName, Zone } ) + + local IsInZone = not Zone:IsPointVec3InZone( self:GetPointVec3() ) + + self:T( { IsInZone } ) + return IsInZone +end + --- Returns true if the DCS Unit is in the air. -- @param Unit#UNIT self -- @return #boolean true if in the air. diff --git a/Moose Development/Moose/Zone.lua b/Moose Development/Moose/Zone.lua index 2d061e1a2..feeba12f7 100644 --- a/Moose Development/Moose/Zone.lua +++ b/Moose Development/Moose/Zone.lua @@ -1,6 +1,4 @@ ---- ZONE Classes --- ============= --- This module contains the ZONE classes, inherited from @{Zone#ZONE_BASE}. +--- This module contains the ZONE classes, inherited from @{Zone#ZONE_BASE}. -- There are essentially two core functions that zones accomodate: -- -- * Test if an object is within the zone boundaries. @@ -23,12 +21,30 @@ -- * @{Zone#ZONE_UNIT}: The ZONE_UNIT class defined by a zone around a @{Unit#UNIT} with a radius. -- * @{Zone#ZONE_POLYGON}: The ZONE_POLYGON class defined by a sequence of @{Group#GROUP} waypoints within the Mission Editor, forming a polygon. -- --- Polymorphic methods --- =================== -- Each zone implements two polymorphic functions defined in @{Zone#ZONE_BASE}: -- --- * @{#ZONE_BASE.IsPointVec2InZone}: Returns if a location is within the zone. --- * @{#ZONE_BASE.IsPointVec3InZone}: Returns if a point is within the zone. +-- * @{#ZONE_BASE.IsPointVec2InZone}: Returns if a location is within the zone. +-- * @{#ZONE_BASE.IsPointVec3InZone}: Returns if a point is within the zone. +-- +-- 1) @{Zone#ZONE_BASE} class, extends @{Base#BASE} +-- ================================================ +-- The ZONE_BASE class defining the base for all other zone classes. +-- +-- 2) @{Zone#ZONE_RADIUS} class, extends @{Zone#ZONE_BASE} +-- ======================================================= +-- The ZONE_RADIUS class defined by a zone name, a location and a radius. +-- +-- 3) @{Zone#ZONE} class, extends @{Zone#ZONE_RADIUS} +-- ========================================== +-- The ZONE class, defined by the zone name as defined within the Mission Editor. +-- +-- 4) @{Zone#ZONE_UNIT} class, extends @{Zone#ZONE_RADIUS} +-- ======================================================= +-- The ZONE_UNIT class defined by a zone around a @{Unit#UNIT} with a radius. +-- +-- 5) @{Zone#ZONE_POLYGON} class, extends @{Zone#ZONE_BASE} +-- ======================================================== +-- The ZONE_POLYGON class defined by a sequence of @{Group#GROUP} waypoints within the Mission Editor, forming a polygon. -- -- @module Zone -- @author FlightControl diff --git a/Moose Training/Documentation/Client.html b/Moose Training/Documentation/Client.html index 25c6e929e..3ac967009 100644 --- a/Moose Training/Documentation/Client.html +++ b/Moose Training/Documentation/Client.html @@ -71,14 +71,14 @@

Module Client

-

The CLIENT models client units in multi player missions.

+

This module contains the CLIENT class.

-

#CLIENT class

+

1) Client#CLIENT class, extends Unit#UNIT

Clients are those Units defined within the Mission Editor that have the skillset defined as Client or Player. Note that clients are NOT the same as Units, they are NOT necessarily alive. -The CLIENT class is a wrapper class to handle the DCS Unit objects that have the skillset defined as Client or Player:

+The Client#CLIENT class is a wrapper class to handle the DCS Unit objects that have the skillset defined as Client or Player:

  • Wraps the DCS Unit objects with skill level set to Player or Client.
  • @@ -91,7 +91,7 @@ The CLIENT class is a wrapper class to handle the DCS

    Clients are being used by the MISSION class to follow players and register their successes.

    -

    CLIENT reference methods

    +

    1.1) CLIENT reference methods

    For each DCS Unit having skill level Player or Client, a CLIENT wrapper object (instance) will be created within the _DATABASE object. This is done at the beginning of the mission (when the mission starts).

    diff --git a/Moose Training/Documentation/Group.html b/Moose Training/Documentation/Group.html index 4cf7daf86..052c06a43 100644 --- a/Moose Training/Documentation/Group.html +++ b/Moose Training/Documentation/Group.html @@ -71,12 +71,12 @@

    Module Group

    -

    GROUP class.

    +

    This module contains the GROUP class.

    -

    GROUP class

    -

    The GROUP class is a wrapper class to handle the DCS Group objects:

    +

    1) Group#GROUP class, extends Base#BASE

    +

    The Group#GROUP class is a wrapper class to handle the DCS Group objects:

    • Support all DCS Group APIs.
    • @@ -85,8 +85,9 @@
    • Manage the "state" of the DCS Group.
    +

    IMPORTANT: ONE SHOULD NEVER SANATIZE these GROUP OBJECT REFERENCES! (make the GROUP object references nil).

    -

    GROUP reference methods

    +

    1.1) GROUP reference methods

    For each DCS Group object alive within a running mission, a GROUP wrapper object (instance) will be created within the _DATABASE object. This is done at the beginning of the mission (when the mission starts), and dynamically when new DCS Group objects are spawned (using the SPAWN class).

    @@ -104,7 +105,136 @@ If the DCS Group object does not exist or is nil, the GROUP methods will return
  • GROUP.FindByName(): Find a GROUP instance from the _DATABASE object using a DCS Group name.
-

IMPORTANT: ONE SHOULD NEVER SANATIZE these GROUP OBJECT REFERENCES! (make the GROUP object references nil).

+

1.2) GROUP task methods

+

Several group task methods are available that help you to prepare tasks. +These methods return a string consisting of the task description, which can then be given to either a Group#GROUP.PushTask or Group#SetTask method to assign the task to the GROUP. +Tasks are specific for the category of the GROUP, more specific, for AIR, GROUND or AIR and GROUND. +Each task description where applicable indicates for which group category the task is valid. +There are 2 main subdivisions of tasks: Assigned tasks and EnRoute tasks.

+ +

1.2.1) Assigned task methods

+ +

Assigned task methods make the group execute the task where the location of the (possible) targets of the task are known before being detected. +This is different from the EnRoute tasks, where the targets of the task need to be detected before the task can be executed.

+ +

Find below a list of the assigned task methods:

+ + + +

1.2.2) EnRoute task methods

+ +

EnRoute tasks require the targets of the task need to be detected by the group (using its sensors) before the task can be executed:

+ +
    +
  • GROUP.EnRouteTaskAWACS: (AIR) Aircraft will act as an AWACS for friendly units (will provide them with information about contacts). No parameters.
  • +
  • GROUP.EnRouteTaskEngageGroup: (AIR) Engaging a group. The task does not assign the target group to the unit/group to attack now; it just allows the unit/group to engage the target group as well as other assigned targets.
  • +
  • GROUP.EnRouteTaskEngageTargets: (AIR) Engaging targets of defined types.
  • +
  • GROUP.EnRouteTaskEWR: (AIR) Attack the Unit.
  • +
  • GROUP.EnRouteTaskFAC: (AIR + GROUND) The task makes the group/unit a FAC and lets the FAC to choose a targets (enemy ground group) around as well as other assigned targets.
  • +
  • GROUP.EnRouteTaskFAC_EngageGroup: (AIR + GROUND) The task makes the group/unit a FAC and lets the FAC to choose the target (enemy ground group) as well as other assigned targets.
  • +
  • GROUP.EnRouteTaskTanker: (AIR) Aircraft will act as a tanker for friendly units. No parameters.
  • +
+ +

1.2.3) Preparation task methods

+ +

There are certain task methods that allow to tailor the task behaviour:

+ + + +

1.2.4) Obtain the mission from group templates

+ +

Group templates contain complete mission descriptions. Sometimes you want to copy a complete mission from a group and assign it to another:

+ +
    +
  • GROUP.TaskMission: (AIR + GROUND) Return a mission task from a mission template.
  • +
+ +

1.3) GROUP Command methods

+

Group command methods prepare the execution of commands using the GROUP.SetCommand method:

+ + + +

1.4) GROUP Option methods

+

Group Option methods change the behaviour of the Group while being alive.

+ +

1.4.1) Rule of Engagement:

+ + + +

To check whether an ROE option is valid for a specific group, use:

+ + + +

1.4.2) Rule on thread:

+ + + +

To test whether an ROT option is valid for a specific group, use:

+ + + +

1.5) GROUP Zone validation methods

+

The group can be validated whether it is completely, partly or not within a Zone. +Use the following Zone validation methods on the group:

+ + + +

The zone can be of any Zone class derived from Zone#ZONE_BASE. So, these methods are polymorphic to the zones tested on.

+

Global(s)

@@ -409,6 +539,12 @@ If the DCS Group object does not exist or is nil, the GROUP methods will return + + + + @@ -421,6 +557,18 @@ If the DCS Group object does not exist or is nil, the GROUP methods will return + + + + + + + + @@ -630,31 +778,31 @@ If the DCS Group object does not exist or is nil, the GROUP methods will return - + - + @@ -708,19 +856,19 @@ If the DCS Group object does not exist or is nil, the GROUP methods will return @@ -744,25 +892,25 @@ If the DCS Group object does not exist or is nil, the GROUP methods will return @@ -843,8 +991,6 @@ If the DCS Group object does not exist or is nil, the GROUP methods will return

Type DCSStopCondition

-

Type Duration

-

Type GROUP

The GROUP class

@@ -1984,6 +2130,33 @@ true if the DCS Group is alive.

+ +GROUP:IsCompletelyInZone(Zone) + +
+
+ +

Returns true if all units of the group are within a Zone.

+ +

Parameter

+ +

Return value

+ +

#boolean: +Returns true if the Group is completely within the Zone#ZONE_BASE

+ +
+
+
+
+ GROUP:IsGround() @@ -2020,6 +2193,60 @@ true if DCS Group contains Helicopters.

+ +GROUP:IsNotInZone(Zone) + +
+
+ +

Returns true if none of the group units of the group are within a Zone.

+ +

Parameter

+ +

Return value

+ +

#boolean: +Returns true if the Group is completely within the Zone#ZONE_BASE

+ +
+
+
+
+ + +GROUP:IsPartlyInZone(Zone) + +
+
+ +

Returns true if some units of the group are within a Zone.

+ +

Parameter

+ +

Return value

+ +

#boolean: +Returns true if the Group is completely within the Zone#ZONE_BASE

+ +
+
+
+
+ GROUP:IsShip() @@ -2077,7 +2304,7 @@ The message text

  • -

    #Duration Duration : +

    DCSTypes#Duration Duration : The duration of the message.

  • @@ -2113,7 +2340,7 @@ The message text

  • -

    #Duration Duration : +

    DCSTypes#Duration Duration : The duration of the message.

  • @@ -2144,7 +2371,7 @@ The message text

  • -

    #Duration Duration : +

    DCSTypes#Duration Duration : The duration of the message.

  • @@ -2175,7 +2402,7 @@ The message text

  • -

    #Duration Duration : +

    DCSTypes#Duration Duration : The duration of the message.

  • @@ -2212,7 +2439,7 @@ The message text

  • -

    #Duration Duration : +

    DCSTYpes#Duration Duration : The duration of the message.

  • @@ -2973,7 +3200,7 @@ The DCS task structure.

    -

    Return a Combo Task taking an array of Tasks

    +

    Return a Combo Task taking an array of Tasks.

    Parameter

    -

    Return a condition section for a controlled task

    +

    Return a condition section for a controlled task.

    Parameters

      @@ -3047,7 +3274,7 @@ return DCSTask#Task

      -

      Return a Controlled Task taking a Task and a TaskCondition

      +

      Return a Controlled Task taking a Task and a TaskCondition.

      Parameters

        @@ -3072,8 +3299,8 @@ return DCSTask#Task

        - -GROUP:TaskEmbarkToTransportAtVec2(Point, Radius) + +GROUP:TaskEmbarkToTransport(Point, Radius)
        @@ -3105,13 +3332,13 @@ The DCS task structure.

        - -GROUP:TaskEmbarkingAtVec2(Point, Duration, EmbarkingGroup) + +GROUP:TaskEmbarking(Point, Duration, EmbarkingGroup)
        -

        Move the group to a Vec2 Point, wait for a defined duration and embark a group.

        +

        (AIR) Move the group to a Vec2 Point, wait for a defined duration and embark a group.

        Parameters

          @@ -3457,7 +3684,7 @@ self

          -

          (AIR) Land the group at a @{Zone#ZONE).

          +

          (AIR) Land the group at a @{Zone#ZONE_RADIUS).

          Parameters

            @@ -3495,7 +3722,7 @@ self

            -

            Return a Misson task from a mission template.

            +

            (AIR + GROUND) Return a mission task from a mission template.

            Parameter

              @@ -3522,7 +3749,7 @@ A table containing the mission task.

              -

              (AIR) Orbit at the current position of the first unit of the group at a specified alititude

              +

              (AIR) Orbit at the current position of the first unit of the group at a specified alititude.

              Parameters

                @@ -3642,7 +3869,7 @@ A table of route points.

                -

                Make the DCS Group to fly to a given point and hover.

                +

                (AIR + GROUND) Make the Group move to fly to a given point.

                Parameters

                  @@ -3675,7 +3902,7 @@ self

                  -

                  Make the DCS Group to fly to a given point and hover.

                  +

                  (AIR + GROUND) Make the Group move to a given point.

                  Parameters

                    @@ -3708,7 +3935,7 @@ self

                    -

                    Route the group to a given zone.

                    +

                    (AIR + GROUND) Route the group to a given zone.

                    The group final destination point can be randomized. @@ -3753,7 +3980,7 @@ The formation string.

                    -

                    Return a WrappedAction Task taking a Command

                    +

                    Return a WrappedAction Task taking a Command.

                    Parameters

                      diff --git a/Moose Training/Documentation/Unit.html b/Moose Training/Documentation/Unit.html index 3d7fab51f..a4f339517 100644 --- a/Moose Training/Documentation/Unit.html +++ b/Moose Training/Documentation/Unit.html @@ -71,24 +71,22 @@

                      Module Unit

                      -

                      UNIT Class

                      +

                      This module contains the UNIT class.

                      -

                      UNIT class

                      -

                      The UNIT class is a wrapper class to handle the DCS Unit objects:

                      + + +

                      1) Unit#UNIT class, extends Base#BASE

                      +

                      The Unit#UNIT class is a wrapper class to handle the DCS Unit objects:

                      • Support all DCS Unit APIs.
                      • -
                      - - -
                      • Enhance with Unit specific APIs not in the DCS Unit API set.
                      • Handle local Unit Controller.
                      • Manage the "state" of the DCS Unit.
                      -

                      UNIT reference methods

                      +

                      1.1) UNIT reference methods

                      For each DCS Unit object alive within a running mission, a UNIT wrapper object (instance) will be created within the _DATABASE object. This is done at the beginning of the mission (when the mission starts), and dynamically when new DCS Unit objects are spawned (using the SPAWN class).

                      @@ -108,16 +106,13 @@ If the DCS Unit object does not exist or is nil, the UNIT methods will return ni

                      IMPORTANT: ONE SHOULD NEVER SANATIZE these UNIT OBJECT REFERENCES! (make the UNIT object references nil).

                      -

                      DCS UNIT APIs

                      +

                      1.2) DCS UNIT APIs

                      The DCS Unit APIs are used extensively within MOOSE. The UNIT class has for each DCS Unit API a corresponding method. To be able to distinguish easily in your code the difference between a UNIT API call and a DCS Unit API call, the first letter of the method is also capitalized. So, by example, the DCS Unit method DCSUnit#Unit.getName() is implemented in the UNIT class as UNIT.GetName().

                      -

                      Additional UNIT APIs

                      -

                      The UNIT class comes with additional methods. Find below a summary.

                      - -

                      Smoke, Flare Units

                      +

                      1.3) Smoke, Flare Units

                      The UNIT class provides methods to smoke or flare units easily. The UNIT.SmokeBlue(), UNIT.SmokeGreen(),UNIT.SmokeOrange(), UNIT.SmokeRed(), UNIT.SmokeRed() methods will smoke the unit in the corresponding color. Note that smoking a unit is done at the current position of the DCS Unit. @@ -125,22 +120,22 @@ When the DCS Unit moves for whatever reason, the smoking will still continue! The UNIT.FlareGreen(), UNIT.FlareRed(), UNIT.FlareWhite(), UNIT.FlareYellow() methods will fire off a flare in the air with the corresponding color. Note that a flare is a one-off shot and its effect is of very short duration.

                      -

                      Position, Point

                      +

                      1.4) Location Position, Point

                      The UNIT class provides methods to obtain the current point or position of the DCS Unit. -The UNIT.GetPointVec2(), UNIT.GetPointVec3() will obtain the current location of the DCS Unit in a Vec2 (2D) or a Vec3 (3D) vector respectively. -If you want to obtain the complete 3D position including oriëntation and direction vectors, consult the UNIT.GetPositionVec3() method respectively.

                      +The UNIT.GetPointVec2(), UNIT.GetPointVec3() will obtain the current location of the DCS Unit in a Vec2 (2D) or a point in a Vec3 (3D) vector respectively. +If you want to obtain the complete 3D position including oriëntation and direction vectors, consult the UNIT.GetPositionVec3() method respectively.

                      -

                      Alive

                      +

                      1.5) Test if alive

                      The UNIT.IsAlive(), UNIT.IsActive() methods determines if the DCS Unit is alive, meaning, it is existing and active.

                      -

                      Test for other units in radius

                      -

                      One can test if another DCS Unit is within a given radius of the current DCS Unit, by using the UNIT.OtherUnitInRadius() method.

                      - -

                      More functions will be added

                      -

                      During the MOOSE development, more functions will be added. A complete list of the current functions is below.

                      - +

                      1.6) Test for proximity

                      +

                      The UNIT class contains methods to test the location or proximity against zones or other objects.

                      +

                      1.6.1) Zones

                      +

                      To test whether the Unit is within a zone, use the UNIT.IsInZone() or the UNIT.IsNotInZone() methods. Any zone can be tested on, but the zone must be derived from Zone#ZONE_BASE.

                      +

                      1.6.2) Units

                      +

                      Test if another DCS Unit is within a given radius of the current DCS Unit, use the UNIT.OtherUnitInRadius() method.

                      Global(s)

                      @@ -384,6 +379,18 @@ If you want to obtain the complete 3D position including ori
    + + + + + + + + @@ -1487,6 +1494,60 @@ The DCS Unit is not existing or alive.

    + +UNIT:IsInZone(Zone) + +
    +
    + +

    Returns true if the unit is within a Zone.

    + +

    Parameter

    + +

    Return value

    + +

    #boolean: +Returns true if the unit is within the Zone#ZONE_BASE

    + +
    +
    +
    +
    + + +UNIT:IsNotInZone(Zone) + +
    +
    + +

    Returns true if the unit is not within a Zone.

    + +

    Parameter

    + +

    Return value

    + +

    #boolean: +Returns true if the unit is not within the Zone#ZONE_BASE

    + +
    +
    +
    +
    + UNIT:OtherUnitInRadius(AwaitUnit, Radius) diff --git a/Moose Training/Documentation/Zone.html b/Moose Training/Documentation/Zone.html index 2040352cb..6f2b1a322 100644 --- a/Moose Training/Documentation/Zone.html +++ b/Moose Training/Documentation/Zone.html @@ -71,7 +71,6 @@

    Module Zone

    -

    ZONE Classes

    This module contains the ZONE classes, inherited from Zone#ZONE_BASE.

    @@ -103,7 +102,6 @@
  • Zone#ZONE_POLYGON: The ZONE_POLYGON class defined by a sequence of Group#GROUP waypoints within the Mission Editor, forming a polygon.
  • -

    Polymorphic methods

    Each zone implements two polymorphic functions defined in Zone#ZONE_BASE:

    +

    1) Zone#ZONE_BASE class, extends Base#BASE

    +

    The ZONE_BASE class defining the base for all other zone classes.

    + +

    2) Zone#ZONE_RADIUS class, extends Zone#ZONE_BASE

    +

    The ZONE_RADIUS class defined by a zone name, a location and a radius.

    + +

    3) Zone#ZONE class, extends Zone#ZONE_RADIUS

    +

    The ZONE class, defined by the zone name as defined within the Mission Editor.

    + +

    4) Zone#ZONE_UNIT class, extends Zone#ZONE_RADIUS

    +

    The ZONE_UNIT class defined by a zone around a Unit#UNIT with a radius.

    + +

    5) Zone#ZONE_POLYGON class, extends Zone#ZONE_BASE

    +

    The ZONE_POLYGON class defined by a sequence of Group#GROUP waypoints within the Mission Editor, forming a polygon.

    +

    Global(s)

    GROUP:IsAlive()

    Returns if the DCS Group is alive.

    +
    GROUP:IsCompletelyInZone(Zone) +

    Returns true if all units of the group are within a Zone.

    GROUP:IsHelicopter()

    Returns if the DCS Group contains Helicopters.

    +
    GROUP:IsNotInZone(Zone) +

    Returns true if none of the group units of the group are within a Zone.

    +
    GROUP:IsPartlyInZone(Zone) +

    Returns true if some units of the group are within a Zone.

    GROUP:TaskCombo(DCSTasks) -

    Return a Combo Task taking an array of Tasks

    +

    Return a Combo Task taking an array of Tasks.

    GROUP:TaskCondition(time, userFlag, userFlagValue, condition, duration, lastWayPoint) -

    Return a condition section for a controlled task

    +

    Return a condition section for a controlled task.

    GROUP:TaskControlled(DCSTask, DCSStopCondition) -

    Return a Controlled Task taking a Task and a TaskCondition

    +

    Return a Controlled Task taking a Task and a TaskCondition.

    GROUP:TaskEmbarkToTransportAtVec2(Point, Radius)GROUP:TaskEmbarkToTransport(Point, Radius)

    Move to a defined Vec2 Point, and embark to a group when arrived within a defined Radius.

    GROUP:TaskEmbarkingAtVec2(Point, Duration, EmbarkingGroup)GROUP:TaskEmbarking(Point, Duration, EmbarkingGroup) -

    Move the group to a Vec2 Point, wait for a defined duration and embark a group.

    +

    (AIR) Move the group to a Vec2 Point, wait for a defined duration and embark a group.

    GROUP:TaskLandAtZone(Zone, Duration, RandomPoint) -

    (AIR) Land the group at a @{Zone#ZONE).

    +

    (AIR) Land the group at a @{Zone#ZONE_RADIUS).

    GROUP:TaskMission(TaskMission) -

    Return a Misson task from a mission template.

    +

    (AIR + GROUND) Return a mission task from a mission template.

    GROUP:TaskOrbitCircle(Altitude, Speed) -

    (AIR) Orbit at the current position of the first unit of the group at a specified alititude

    +

    (AIR) Orbit at the current position of the first unit of the group at a specified alititude.

    GROUP:TaskRouteToVec2(Point, Speed) -

    Make the DCS Group to fly to a given point and hover.

    +

    (AIR + GROUND) Make the Group move to fly to a given point.

    GROUP:TaskRouteToVec3(Point, Speed) -

    Make the DCS Group to fly to a given point and hover.

    +

    (AIR + GROUND) Make the Group move to a given point.

    GROUP:TaskRouteToZone(Zone, Randomize, Speed, Formation) -

    Route the group to a given zone.

    +

    (AIR + GROUND) Route the group to a given zone.

    GROUP:TaskWrappedAction(DCSCommand, Index) -

    Return a WrappedAction Task taking a Command

    +

    Return a WrappedAction Task taking a Command.

    UNIT:IsAlive()

    Returns if the unit is alive.

    +
    UNIT:IsInZone(Zone) +

    Returns true if the unit is within a Zone.

    +
    UNIT:IsNotInZone(Zone) +

    Returns true if the unit is not within a Zone.

    @@ -172,13 +185,13 @@ @@ -466,16 +479,22 @@ The name of the zone as defined within the mission editor.

    - +

    Returns if a location is within the zone.

    Parameter

    • -

      PointVec2 :

      +

      DCSTypes#Vec2 PointVec2 : +The location to test.

    +

    Return value

    + +

    #boolean: +true if the location is within the zone.

    +
    @@ -487,16 +506,22 @@ The name of the zone as defined within the mission editor.

    - +

    Returns if a point is within the zone.

    Parameter

    +

    Return value

    + +

    #boolean: +true if the point is within the zone.

    +
    diff --git a/Moose Training/Documentation/index.html b/Moose Training/Documentation/index.html index 891e8acef..7fe1edb39 100644 --- a/Moose Training/Documentation/index.html +++ b/Moose Training/Documentation/index.html @@ -105,7 +105,7 @@
    @@ -231,7 +231,7 @@ @@ -339,14 +339,7 @@ @@ -358,7 +351,6 @@ From 8777f516aff190f7154a14d4d517d90c66ac3064 Mon Sep 17 00:00:00 2001 From: FlightControl Date: Sun, 5 Jun 2016 11:27:18 +0200 Subject: [PATCH 5/7] Preparing for presentation --- Moose Development/Moose/Spawn.lua | 24 +++++++++--------- Moose Development/Moose/Zone.lua | 12 +++++++++ Moose Training/Documentation/Spawn.html | 14 +++++----- Moose Training/Documentation/Zone.html | 12 +++++++++ Moose Training/Documentation/index.html | 2 +- ...art 1 - Use zones with GROUP and UNIT.pptx | Bin 0 -> 788485 bytes 6 files changed, 44 insertions(+), 20 deletions(-) create mode 100644 Moose Training/Presentations/DCS World - MOOSE - Zones - Part 1 - Use zones with GROUP and UNIT.pptx diff --git a/Moose Development/Moose/Spawn.lua b/Moose Development/Moose/Spawn.lua index afe13cae3..9ea27a16a 100644 --- a/Moose Development/Moose/Spawn.lua +++ b/Moose Development/Moose/Spawn.lua @@ -1,7 +1,7 @@ ---- Dynamic spawning of groups (and units). +--- This module contains the SPAWN class. -- --- @{#SPAWN} class --- =============== +-- 1) @{Spawn#SPAWN} class, extends @{Base#BASE} +-- ============================================= -- The @{#SPAWN} class allows to spawn dynamically new groups, based on pre-defined initialization settings, modifying the behaviour when groups are spawned. -- For each group to be spawned, within the mission editor, a group has to be created with the "late activation flag" set. We call this group the *"Spawn Template"* of the SPAWN object. -- A reference to this Spawn Template needs to be provided when constructing the SPAWN object, by indicating the name of the group within the mission editor in the constructor methods. @@ -24,8 +24,8 @@ -- * It is important to defined BEFORE you spawn new groups, a proper initialization of the SPAWN instance is done with the options you want to use. -- * When designing a mission, NEVER name groups using a "#" within the name of the group Spawn Template(s), or the SPAWN module logic won't work anymore. -- --- SPAWN construction methods: --- =========================== +-- 1.1) SPAWN construction methods +-- ------------------------------- -- Create a new SPAWN object with the @{#SPAWN.New} or the @{#SPAWN.NewWithAlias} methods: -- -- * @{#SPAWN.New}: Creates a new SPAWN object taking the name of the group that functions as the Template. @@ -34,8 +34,8 @@ -- The initialization functions will modify this list of groups so that when a group gets spawned, ALL information is already prepared when spawning. This is done for performance reasons. -- So in principle, the group list will contain all parameters and configurations after initialization, and when groups get actually spawned, this spawning can be done quickly and efficient. -- --- SPAWN initialization methods: --- ============================= +-- 1.2) SPAWN initialization methods +-- --------------------------------- -- A spawn object will behave differently based on the usage of initialization methods: -- -- * @{#SPAWN.Limit}: Limits the amount of groups that can be alive at the same time and that can be dynamically spawned. @@ -45,8 +45,8 @@ -- * @{#SPAWN.Array}: Make groups visible before they are actually activated, and order these groups like a batallion in an array. -- * @{#SPAWN.InitRepeat}: Re-spawn groups when they land at the home base. Similar functions are @{#SPAWN.InitRepeatOnLanding} and @{#SPAWN.InitRepeatOnEngineShutDown}. -- --- SPAWN spawning methods: --- ======================= +-- 1.3) SPAWN spawning methods +-- --------------------------- -- Groups can be spawned at different times and methods: -- -- * @{#SPAWN.Spawn}: Spawn one new group based on the last spawned index. @@ -58,8 +58,8 @@ -- Note that @{#SPAWN.Spawn} and @{#SPAWN.ReSpawn} return a @{GROUP#GROUP.New} object, that contains a reference to the DCSGroup object. -- You can use the @{GROUP} object to do further actions with the DCSGroup. -- --- SPAWN object cleaning: --- ========================= +-- 1.4) SPAWN object cleaning +-- -------------------------- -- Sometimes, it will occur during a mission run-time, that ground or especially air objects get damaged, and will while being damged stop their activities, while remaining alive. -- In such cases, the SPAWN object will just sit there and wait until that group gets destroyed, but most of the time it won't, -- and it may occur that no new groups are or can be spawned as limits are reached. @@ -70,7 +70,7 @@ -- This models AI that has succesfully returned to their airbase, to restart their combat activities. -- Check the @{#SPAWN.CleanUp} for further info. -- --- ==== +-- -- @module Spawn -- @author FlightControl diff --git a/Moose Development/Moose/Zone.lua b/Moose Development/Moose/Zone.lua index feeba12f7..5ea17eee4 100644 --- a/Moose Development/Moose/Zone.lua +++ b/Moose Development/Moose/Zone.lua @@ -26,26 +26,38 @@ -- * @{#ZONE_BASE.IsPointVec2InZone}: Returns if a location is within the zone. -- * @{#ZONE_BASE.IsPointVec3InZone}: Returns if a point is within the zone. -- +-- === +-- -- 1) @{Zone#ZONE_BASE} class, extends @{Base#BASE} -- ================================================ -- The ZONE_BASE class defining the base for all other zone classes. -- +-- === +-- -- 2) @{Zone#ZONE_RADIUS} class, extends @{Zone#ZONE_BASE} -- ======================================================= -- The ZONE_RADIUS class defined by a zone name, a location and a radius. -- +-- === +-- -- 3) @{Zone#ZONE} class, extends @{Zone#ZONE_RADIUS} -- ========================================== -- The ZONE class, defined by the zone name as defined within the Mission Editor. -- +-- === +-- -- 4) @{Zone#ZONE_UNIT} class, extends @{Zone#ZONE_RADIUS} -- ======================================================= -- The ZONE_UNIT class defined by a zone around a @{Unit#UNIT} with a radius. -- +-- === +-- -- 5) @{Zone#ZONE_POLYGON} class, extends @{Zone#ZONE_BASE} -- ======================================================== -- The ZONE_POLYGON class defined by a sequence of @{Group#GROUP} waypoints within the Mission Editor, forming a polygon. -- +-- === +-- -- @module Zone -- @author FlightControl diff --git a/Moose Training/Documentation/Spawn.html b/Moose Training/Documentation/Spawn.html index 7420637c5..042e1984c 100644 --- a/Moose Training/Documentation/Spawn.html +++ b/Moose Training/Documentation/Spawn.html @@ -71,11 +71,11 @@

    Module Spawn

    -

    Dynamic spawning of groups (and units).

    +

    This module contains the SPAWN class.

    -

    #SPAWN class

    +

    1) Spawn#SPAWN class, extends Base#BASE

    The #SPAWN class allows to spawn dynamically new groups, based on pre-defined initialization settings, modifying the behaviour when groups are spawned. For each group to be spawned, within the mission editor, a group has to be created with the "late activation flag" set. We call this group the "Spawn Template" of the SPAWN object. A reference to this Spawn Template needs to be provided when constructing the SPAWN object, by indicating the name of the group within the mission editor in the constructor methods.

    @@ -102,7 +102,7 @@ Groups will follow the following naming structure when spawned at run-time:

  • When designing a mission, NEVER name groups using a "#" within the name of the group Spawn Template(s), or the SPAWN module logic won't work anymore.
  • -

    SPAWN construction methods:

    +

    1.1) SPAWN construction methods

    Create a new SPAWN object with the SPAWN.New or the SPAWN.NewWithAlias methods:

      @@ -113,7 +113,7 @@ Groups will follow the following naming structure when spawned at run-time:

      The initialization functions will modify this list of groups so that when a group gets spawned, ALL information is already prepared when spawning. This is done for performance reasons. So in principle, the group list will contain all parameters and configurations after initialization, and when groups get actually spawned, this spawning can be done quickly and efficient.

      -

      SPAWN initialization methods:

      +

      1.2) SPAWN initialization methods

      A spawn object will behave differently based on the usage of initialization methods:

      -

      SPAWN spawning methods:

      +

      1.3) SPAWN spawning methods

      Groups can be spawned at different times and methods:

        @@ -139,7 +139,7 @@ So in principle, the group list will contain all parameters and configurations a

        Note that SPAWN.Spawn and SPAWN.ReSpawn return a GROUP#GROUP.New object, that contains a reference to the DCSGroup object. You can use the GROUP object to do further actions with the DCSGroup.

        -

        SPAWN object cleaning:

        +

        1.4) SPAWN object cleaning

        Sometimes, it will occur during a mission run-time, that ground or especially air objects get damaged, and will while being damged stop their activities, while remaining alive. In such cases, the SPAWN object will just sit there and wait until that group gets destroyed, but most of the time it won't, and it may occur that no new groups are or can be spawned as limits are reached. @@ -150,7 +150,7 @@ In such a case, when the inactive group is cleaned, a new group will Re-spawned This models AI that has succesfully returned to their airbase, to restart their combat activities. Check the SPAWN.CleanUp for further info.

        -
        +

        Global(s)

    ZONE_BASE:IsPointVec2InZone(PointVec2) - +

    Returns if a location is within the zone.

    ZONE_BASE:IsPointVec3InZone(PointVec3) - +

    Returns if a point is within the zone.

    Client -

    The CLIENT models client units in multi player missions.

    +

    This module contains the CLIENT class.

    Group -

    GROUP class.

    +

    This module contains the GROUP class.

    Unit -

    UNIT Class

    - -

    UNIT class

    -

    The UNIT class is a wrapper class to handle the DCS Unit objects:

    - -
      -
    • Support all DCS Unit APIs.
    • -
    +

    This module contains the UNIT class.

    Zone -

    ZONE Classes

    This module contains the ZONE classes, inherited from Zone#ZONE_BASE.

    diff --git a/Moose Training/Documentation/Zone.html b/Moose Training/Documentation/Zone.html index 6f2b1a322..80dca123e 100644 --- a/Moose Training/Documentation/Zone.html +++ b/Moose Training/Documentation/Zone.html @@ -109,21 +109,33 @@
  • ZONE_BASE.IsPointVec3InZone: Returns if a point is within the zone.
  • +
    +

    1) Zone#ZONE_BASE class, extends Base#BASE

    The ZONE_BASE class defining the base for all other zone classes.

    +
    +

    2) Zone#ZONE_RADIUS class, extends Zone#ZONE_BASE

    The ZONE_RADIUS class defined by a zone name, a location and a radius.

    +
    +

    3) Zone#ZONE class, extends Zone#ZONE_RADIUS

    The ZONE class, defined by the zone name as defined within the Mission Editor.

    +
    +

    4) Zone#ZONE_UNIT class, extends Zone#ZONE_RADIUS

    The ZONE_UNIT class defined by a zone around a Unit#UNIT with a radius.

    +
    +

    5) Zone#ZONE_POLYGON class, extends Zone#ZONE_BASE

    The ZONE_POLYGON class defined by a sequence of Group#GROUP waypoints within the Mission Editor, forming a polygon.

    +
    +

    Global(s)

    diff --git a/Moose Training/Documentation/index.html b/Moose Training/Documentation/index.html index 7fe1edb39..e48e04d74 100644 --- a/Moose Training/Documentation/index.html +++ b/Moose Training/Documentation/index.html @@ -321,7 +321,7 @@ diff --git a/Moose Training/Presentations/DCS World - MOOSE - Zones - Part 1 - Use zones with GROUP and UNIT.pptx b/Moose Training/Presentations/DCS World - MOOSE - Zones - Part 1 - Use zones with GROUP and UNIT.pptx new file mode 100644 index 0000000000000000000000000000000000000000..fd0c6f066331cd6f221149950d4728acf0cd8d59 GIT binary patch literal 788485 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 z zWnw&_uefwM2jGqXVP1rqN`*x20Wm1D9q1{B&}EN-{@&Pc4uIrn&778{sd5h}%KZ;< z63d%Tlk5VK$Yuv{khZ=OIV2d=965V3L-KwjjOY1S3n<#5`=)HUzAu*lQs_GlsCB*r z8id%m;5N%KEW@gIT98%6T>#2RDo-2*6qKS zG1=b?V$n`&i6A3HT?a#Cp3$$6OcV=41Dqk?f3kCNR->jjruk_O3- z;iCaUQ!{l6X_hg^7n{Z=E{jPDvlu_hR#4C}`b+3~P&+nPr$uk;MsfM@P9+4Nz?U#; z^z4R`2{3h?U^93+8RpWO;e3QWbwour6IM*Xf0lUCzIc$c9=lES_6EJD+#O1Xc+OUT z)~Zx75*`2|DR-`BXxldZiTH7CJbPDCB66MQ!i;A&zUd>`~!HvbV1y)3Es?UkBJZp+;I>>(UeIA^f}Cneg618j2Ih&ZIgw178j&k6`7xW z7E4j(c+35g3}?$>4Cj$xV!AI=U_eo5SBO2>F_jPSMOPdwCF13x!(b;A)wEcKi5n65 zn)q-lO+J6<7bmR|WjNfPwzDzM8*(dPo9T#?J(y|R&3_6&6j=xJ67>E988r`)@i!z+ zW;s!}jBGjp_q8s>kFSCgNY?FrbJ7FT>H7RY4EzhCi`o(~#C2}l_Uf@n*6b4bC4a$5 z?7%|Uj;_r0%dsDeC~EjR8GPw4>(scjUX#M$zcN;lbtQ@R8$OqcCKoWPWt3p>fT7Hm zw~wQk(63tqF1CwtA(#1HT?^t3^Pe)i6f!`15Af_TXGO5;PGpR4&3~W|mL(r+738`K zfW*Ai%5LGX0>jL*&mF^fuwsC<7FPSoGn)B-w3-xa+u%#spqc;{bmwJ22M77{Tw z1$FssH&Sgao~JdenjAmRQLA(m$!CJc&PZw&G9+w&EZwN_B~*3K;l(X zYr`5OUGDrd@o}$GxN2ZK9@++6_Ag?mx^#X3zwD;TLdgMI|exhw%jw75I-;|QUmZh#f}jw zbCj#J%?DZpMoh^omT9s*`uK#CrfsNg#lg-(ZIGLyu8D(-0)up=!%WCP`qO9=Z_^=h zXQ{jv85m%o%DrMU2uiQZ}>;9Ua4aKNQFUE11dqxiY=kiyZb zb<gFG$~_j zkXpxpx{01wCA|4RV{!cR~}ofQ7ap%A{D< z_98R_!|8&}8)Xw&PDqt4l?huoCf?#crwiSmE-jPiMUO55S3B#9x<)_9gTFOxoaI6a z8BBiqD20?kd@r<}#s8mjl4X()KBo_!iJQ$`xm_YuXsF8qASfw$C$V zuPoepg?6EtX}1GPI_7} zQ*cytjSL^joV`UeEHm#^8r%Aq#+lhCvN6nxmTYy>)MbIgG{5M`JL&EqS&Mq5lm|CM zuvTM?WqArB1NB(&Zx-gX*Kd;PKGi{!hKAEL0XBVsM$e|-ouv{Ui{yVn^mp`hcPyBi zu7$@Rp>fQ4XUwJt!~p3*G9@k;rl6w7vb$#YI*9a=v^Jv5`d*4gf^S<`mEjOSAQ#1qvB# zcpB~D&23-8hib*5=MrPrzRaVCZC#(M*bN=5jc8d~jbEFWjP|JRRn|Q-aq22c4X90q zoK!58Y}>WrCFhX^%;*072MVXwIhca^D3LiKrD&06HfT87X-T3Y9H46lc&DJ3SAdOD z+Ta7;q?bcTgaAJZ3;y3fXR!=@93?KY?E2+`W*6=33)$#(qmaweB}yW7@4V&rdi+qi z-qGMp9I9fs!Y#mQ<)TYWlbXXV<3IKIl3P;I?UDHw*MT>Wnd5VTcd*@@n8u6|K?XvD zplzY7DEQxIIAYO5un&YMjc%gt9DHh<(}VqVf!glIY&~-J;amUgmv71(=lMwo>3`Ck zF+B(3=c*%ETW6r8rsOHm%ql%{gLjOEyQYXTwtcaUiM03U-JWvZUnm|z$g8k`XdlaG zgMGR=(iY>vCDUr$BncJk;^8%iF5G4;_p5&)=gclmGAFQyUbtp$7-10KRj97{qJU}V zyKHM#>E74`oV8jidSS%*f~ItKNe+)(#Y}%TvZJb}@^xZ?8us6g9jL1S%QAzTNQ&ms z!7>}^)oNb^b_*YdGg?+FR!DVm))`+GrAqE>c*^3RZ2ye>v`6IcE14Ev+xU`_HX;n7 zkEP7v3J4rPd$V!f0cStPRg zMbJmPlVkZFNU#l1_nU-E=mFoD+Q=I@oQ{mZi{zF&!)(O?+V>-1I9{)myoJ;FE_zFw zmBrunkJ2t>K8gDoig*IyWu=wzlZI}H9zTn9^{M7VmRdOs@W_!Xa)qN~Bpq z6J<47|Mu@XRBf^jPC>3W@z2%LrTBJB%f-gV1MlguwB^OX2z{3WaZk%@ziCF#c%};| zY6!uMqb3L5L}ybBpjUS{$o*D0Wi)J%*%|#K9QZ8hoArqVkf*ce0y;&gZ3Y}olFsq} zU`~Ux9@JH-R9Mcp0Pc?(SOeA|eUJ)3N51~@EaH}&}PCxC*c zsab`t#5`==w!XY8C^Kdq(Tt^e&{;CTY2AKN1h%{2KQw;xNcQM;;MK^oBV!``I;2R8>{2^hhLSwv9P& zkL^E@adB*c4v0H}9n154pn+s#R$KVz7Z-At_jzyZjc)n5&@hDL+ysKGb)&&8H{^*6 zk#5${g|aOJ^^0nnQ%C*qZ|D_xb;kPbyyZ7Lp`EITb-ri2!uuzWXY=>e6##W##s0cQLg$`jbObfRFM)Tk zm7COdF6Q=@fnL@?w2KV6JTmN6;f>=@z7nw`BBjBoB@^bDDUV;-@1jox-{noFXnSNZ zat~oHHryoKoN+s3S)3x<^JIQ(K{W~{U%~rRp>)y`ANyKdddOAjLy^JiQ!#W1QJUb$ z+nt80`kgfLNOQfQi2-#v^nL& zV0xRwT{cyAVh61X7=Q65fB%>X9)KJw6o^Mb=;lq=Z@Px*8z$ycaCCfugnpB;);uyj zCf=*fOf?a*Wt2+q%@5q_D&PESEjh`Ey@CH&ebd#wxOR{Z8pvIgH^6lo)hutoTGNbU zpNqiKeRb`~n>11B%weP@o>?(=YMPOIonI&V0Qf3)i@^Z~IQwGToTT1_V`?}gjs?gS z6<&ngk!*Y3V8`FFX&7;DhrFo7FTZv$%n@!5NM;g{c1zNq<|#QEpQ&yAfGDf)@7+<5HGB<%mhBJpRC`1Qze z?Vfu}t?U;?+`nM_I;PHfvIO8IrZk4x+qDIbpEdnZ?>Sy5A>z^f8sSF!7$_`=CJmpPQ znFiS?0t=}&?NLgA`;ESq4q103_vL#1S)I7V0-bTQsWulG)3s+r5gdAEw@u_hO6?wc z=HpYPJ2wZueFB4&$>R;HE&LaLlqgPjs@n~B7bWm*>K+nf`AZYUpMI}n6_d}+eLk~L z?cg(i7R%Rs%WuQpH@6ns}{Kp$_;4|juo;RfN)2a<&oYS|44Ge zxH*l4=G$wG6DrP%s*x83W8`0n-4Z&0SH)|6f@i{I?;ir!#rDhGtfPj=p!)RM+KMO< zg*pS?%K#g*@Kc$E<=O2LBepd=>O4x%Cv{!xn8M+Tx-anjG3Fv%0smA-uFas-d!#nv z{DRc7%SG5NA51jRPS<_FQ4q75#pc!6&LVkeeJk_D?^>CGq9rUUSx}E0HcKaMkjB$^ z0cl1$$X%IgSC;XL$ieYIRx1)=|AABaxENu>3|td?L_Fpxn!>_{xdl_RL}6)IyT$+*y8`>8sM~QV)fY`HL*hl zSlK;Y;sSZVCIeOhDCA9wthC<&}es9N-PKD$#Ri_as8{rh|Vl`Go z&|3vKpH^}v*|3KKk0laHh!@pl25I@GV_IdP-~eVDpdX;hd2~eNNG_}dRKe1hZB%T- z(nWsP1)P(qd@6Y`&5@t=s85f4*c?>cS9!Nd@NdOq3rEZPP5-wsmscl(0zP|u)f*d8 zg%1h_hUP}7%t+wc%R6ySqvx)D^G*|S9X-2iJD(|=WI49ixnYKm5?A_y*eY`spiGwL z#JjD>h0G{5PxO{~c2v8d^QXM4I_Zl=C5(RZ%gc$Fv_aiGp-A@KgL-$%tKXInff5P7 zU)CCOkjIyYg`t9y@jvEb$gND+cm!hOOQ}OwCMiM1XCMnUoL^uf<})b!&Nhd~8TfnI z>GpV(L$Hs|4fY1WIhB?_uuVq>aO*1)y(Z3fx4=pc1QsNd-E2vYl7}t%@ee?1B=?p4 zvFUkM5kPp7%|~ApbJs@vRK5y;1@cakarcKKlIo3JU1RgeWWGg@l<4!vrdS)A%jdd8 z5aapyE(O)E=(W9rL4}-vQ19`r$sojY(P+&b6Gi9SlU>$Yak%DTG$2LSL3g?r7FerX zs9QUuv0Q^BQSQ8Y-PrGi@5mol{_SbHwceo_Cl<%2>y@ny{UrS#|4-YY!## zV?U&=+>;lPj@!BFU7j?XHBSh^Iow3lbXJYt;_KmY9o8-SEmn(KGnX%D;j=Kc+XP8;jy7enKF<(2lz>f_%je$+ z9<7UbP-6>S-a|Wb@yq2!a4XMQre+>L{E{+&fu3>&9CaB4PnZ^1y+ko-xIO(<N-R>Y(fENBV`3s{tuiZ0pgufL54b+PlNC7Qu#{5HFiDUSjktIzJ2ntbxFof{f z59(%}Um9B?pJ1^*B=PB5k3uoJ)NWv_IH%%`4b};A}{t_&hQl5eI_E-o+`! z8R2ZBYoqi@sSv;DEsI%CsPD_qXYS?7Tn07_FJb1hVjZtdk7L>Ex1C)FH8u5jkCBY+ zqaRJ2&2@>RfmB)w>|fFE5P+&^5B9o}B?4!BFX_4FCh)mrdIA)Zk_@?!Ln2VBKqk(3R_* zuHz|rN05w`EE3?aQJ4+~jx7kkTq6vQSvdwN~gG7!wBud>X%BBPg(GHZoP&w zSY-3tf1qL=BHh_e7|i|A0E1s;!-j1~P(h#ljR40Mwhtu*G;I7IuO<3U?G&&Y(nrGA6*s^{d_T#8&-kiW{Tv`*}DH#sBAZO_p z4x;rlpt1r_$!pI3GJ_=G4kcO;K9L8EG}%!FopOX&4AKvq1GJKak~6*_j3&9@idEUI z>#kpvyWI-$+N#xjohuicKfj(|h=oWNSLKk+s-DKB^Gj6-51z)Hwh%B9MRzk%L!sOc zCUWYSZJx8!2#p`hyK^<3-+GebR8`~|^;Eym82zv5%JzL_1ww7pzJHieH2UO|r^JCAy7OszcMV>#-Fzr1IlI*z%M#Qsb5~E2oc{+WMkyzCz5grq zgNIiU2ah$v2)x@>)z%Nhi|wsjDa3Z%A6)~9LO(jLU+5?&eO-7obWU$7L`Mwr=W4NT z?PW>`AC~3nFEAVTNK8v68;j^?N?wAUthOp|3?%Xd8Olq4&(G+U{sq4QrK?4U2es*> z)1#g5#~+CjtYjnf*#)|eg%>C=Ts)D50Rk*4KA8I%WlGq%dMZfMk`FEjp)kzv1fI0! z4+Mst0wq6dqqv{qQ34Gei|9{fj4FA|fYv^e60E0y?N8epJiSM}oOSRY$dDq=YC~H{ zG_uvdVaN^pgGh@s%1v9o<#=B0rz@|QC`LO9wi${W(8V8)?ySNb^j1eYd^<#70;5f2()?95+ zt;xB|{g#hL-s=wxfs%8IFSCh-duP17zOj%tSololYGr{QxLr###{GU$IqKS9uMQ&J z7`)x=F$AD^0F@@Y-%1fm&W|z9NZ-0dY$T4cc*H)>i69E)V}7^s$#LsT0;r9u3Q2>g=Dae9hOz%t8(Wa(a}5TL*~3;!O_N8-jhpCU zm(j~T`UexH?R?qGz>Lm2PjlVcjq$9=$V?_GeM};TOhcAz`A_rK>^2KPCT&51(-~Pe z$M+BFwbP3ss17)1i|lf&i|v(%9J!N4cA15dNl}CsIP|&EiG0@In<1m!xOi(bwIFjd zS;j$$4JUtC!QvxQv$)KdsN3vyq9qPZehg-6ckqEQ%-#jl5valHxo@Xi9rI-tm&0SE zQXPlvH-kt=G6SF{Ba9o#djNbcJa(GY3$Zaf7zSLyL$u^CHU1qePxsLIxDJb{zgOE# zM>oXei5u;G%7K_c&9;#3=h{G})Y@GfKODyi&00K-)uxFqgtBdGLG zF@k*&3ST(rfFXf65Oa6}It@bglb_P<<@AS?-v0=B!nwIK!4Bo#M{fXwdNxKZx0&%$ zQnj6e3b(T>-UTwmj4rtRxXr+)P-UIkoMY35%ubESE9n^As-&5*%{>j918SgK5xwV@ z!{p4pY?(#`?7MCwbJp&2eguG644x|w zXUIuvyeOnCI{y0tr`3CyIu;X9JN;$|Z+vy+Q7WIO3rKy;NQpm6-uB+{%bE-7+~-#6 z{8Vh9L0@0JEx7knWz4GM&!{2`xD4|Hw@z+)GWN_9#&g7RjKvN=We7P*7j-{e0f zuPV<)DOyYl&jGLdP#<>VqZMRI##N(>?apgXOV^?TVvK~roEZmX44{LJB1%?ezu-G0 zvIV&QL6tSgRINncp^8?Y8xjJ20ZrA(HzA%@{M$ajI?yT`iAzseY%-GNPbm26xj^TfmONB??>=4)~?VPIOy+z&>61s^(; z&vs(Q5R@3lu1nT@R0`#|GzTd~pWT1$<4MvH*J31y0!&W#!yz6}DK|m#ic! zQmureY6c%^H7U#gNu)bNB!LTLIq`I@jB#w}hfUv(-C%@&MAVOG?*l^3pj1(jNtJ?* zcgN?rP2t$_U`?_j;k$R&H3d)g!qatZ`(EL}2x}e5i23-%{&f8?e*v?z4?Y)#C>Q*C zluqc5r6aiCP;98v47lO=Q%PwojLj$;#PhXk!l0~30{!Xne;^+K8RSF;IAoywhfs#o(prMlv_4{w{_@=uedYYHvr`a1I6?pj^I3%s0UGLY;suVC z-=M8QH76NIKrRIhMn1>?jTbcQjM27c(Q7i3Ri{QdAFmc7N}jX5;C|FJhp;K^SVMex z(g@{c+qx*g?P@xu*x85?40spH^9{nQSBJ8^oSvBI^qV;y%!vO>nIo$%UIU(dmZt?8 z-^lQ35}z<6=Kz~pE~?nzO;`G4k9Eq`3{r2|=Ka8ZD$-Sf$;N*c@VkA2Lz$w(@0|dy zOV%>CsrrO^mBA31^5bZtr^pN%DE^y{lp_9;^=h#wM||#{a-v7AB9yR-RUVUGdAeif zDZQ`B4Ny$yvcL8L-;ejP1quM`bFNBSCi?6CUBeI3-o^4o+&rl1l1&e-ibZainL*M# zmIr{Hc4v6g!pSaHH^Ms+Q^^lT4HHzlaF(}pC4d;OnEZ3jd-i*;u1+`0du0a#MflmT zV&Fa&qjk&F9JlWa*u2I0?MW7I;4;H?Y>+O|#Q&hC^zR)xAgb35$sVQtB07{_HE}@t zNiW{foq!KiNG(b5D5PK$%N3>l&Wh$D@YlygY7bPX$5MA9?$w10>$&C>!z9R9Q|jY> zk8SG#8_{}$yhetN32kw1P`FViBJf(mGu_D$B|S$XpMI_0*?~=rMq2I^Z%Aw%aPMp3pDMRvJN$MD($k zIKQd>HdUh0JJ(Ml?%8ZVoy;PA%o0$^3Z^x{y`tszerw1*_73PzU*_%)hSICh*c(7@ z=algEwqw7S%4Q!huxt|mRRU`i>tZ5mF9cK zq~@?U-J_RtSInbj9^CpA>)!`}k0Yy-F1Wzl@#1QF9D_7qDd(-Z?UUFAIqzzY!fE;J z=3vkc=xkgVj{_PoPLV^U3u338mPk2a16>YwA>kp&KJ~0#Kaow9^3Kcot+!_HEYG%qitzXYX^**wRlE?$-7RDurPV0b z0|tQb4DPlL6{l0*jrrCmJC1@G{#-AUF7MIDMR%|jFxx1W-5)s5HTsh$p$*g}g)gwO z_hf1jf@|uU&3-T|^@y_JXc`i_es`ln>i)$`RPV19%O#PC>nhN3yT1}fiJ!0E8*@wa za(q-YgOlGC7IXUX?+^LRP*qv%Let8pC$dfk1!E_Wk25Y@j zuFM5iZ=*eL0aonGU3bsjyT50`ekiVct7;LXW4=4~wIBZnK&1-PYhJ^-D$!+H#4$P=H+tilX}bb-uk zn;WBCL<}`4zFYc@2*dt_$LM^NJ3jYyT{bu9-~2E1gfCS9y1zEznC#!S9yI6dIf?DN4_Ui>CLNQK~YV1=iRjGNLT1BQPoa0BV(I}CO7z(VS@VZ&72$_*bi z<;~uo4r005#yA&_jQ6MfCZZ`G_$|;r5P38MK_c$`3lg_D`#BX>Oph?vos55#3s=w~ zHut%ZNhXsIY8Cz0waEU{r5Dv&xq3m!Yhgj&UyEf*#4=%RT(!yJ#{+9$YLVBfL?DX3 z-GQ(rfrClsHJrl}om?*b{xG6k{C5--66vY>J<^WV;Xa|?%3dH?n3cv*k)TqZBqD4` zaMYX)GdvH)xTwx0xh9q|dalQHn$E~W63f`5pcZ{L^)RbKg`+@ZVDzw2asZonv~k7s zTy48JR@BJGL; zGY_Fod*sr%4G3_^nPBn5c-PG4(-}6AUjQq8dSv)eC=Rv5a4W#D$= z`GL5M+Y8sq=~uPqR?6Q0gum0cA})+(A)Ml(`uM<{5_2@sDz2)(z1)2#Zb272Mejp+ zoRmA;Y-FQNGFnGcS^n1au6c6Ca!S7Z0HQE|9XN4eb&0+fOW}+me>)B0pPlaR4tDbL zlML1q7Af1HAJM>I;xCj%OAfAJO=*OrN+o`QoEK5mzs10y8i~H9)jl=sxch^h(H51T zF}LO)BW=K555|gLUj6vAqerEG%q{hB!-4booY%{XNifeYrS>60Adu?`Ig;Twt^HNA zf4Xnm!j$>y1NDNujk#5M=eo*R_gh!UX*y}+EWVrJ9A7sb_Oh2y?MzlO)jO9 zgC^w=Ul9o>7H_(rx)R^?j)(#hGkGyPcAw}?X%hO#4z9nZe@D{ZW~>w$Gh^JVoRN1U z^tS$Kxl?MYqV(Pd-T@LPf)b91TF9Q(u)Uw*M1hVJCa4@YbFZR4ZY?FiC`|Xw(TyP!GG*Q z@}WZBgX--mIN1-HOomWcuY6+x_POQ;fdT-gwsmTZ-KhVksEYAm&I=bV{uV#Z=)+oD z&EE{&W>%?wHbx1>zDu2G{k!#?MW|Qa4~a61mG#OQT39BKojAi|XMipkdSK}4CmT66 zb4X<51Wkp2Qr`YkqGQlF-7`@U;bA;l!YY0%%>QoE2CJ2(t|*pSJ_!tC`z=DemLftk zo-OZ#1r9!)*+5jAqK|C68M9n+2T)+H2RZH-0Ej@}T96m6k25vh6QaFpXmjBmljC{p z9T=h~ugG9rTC3PT)Ta3BH!;|&N*THw`5ip!oeyI?*r{x=tJUE*c5-g>9O}BhoDvw=^iBk+@Nu%a|Od)r&_AUU8$oW)$e_mf6i#01;Ce$_i`NcZUF1_jz7Q1uy zveGjDf_toRGrV+EL$~=t?%ytbWFJYDY*{}?Wxxy0_PIE65+ix9QGE94?eKSR%AR=E zp9)`9rX}ZewYsO5YTR3+lm+H+RivG`z&B+g5Qk@7tw9D*JVC_)NJ-`COW8S0%h$;@ zyi^LkHTUEpgCusEaofEhEXG8M2A^iOSOqc1&V;%`_jMAdCi0XO1Cl4#=BEWm+{}yUWVR1q;7Z?W5)`7?))@xy-D|IRY*P|OJdzLbBy1^1u`SiRT7D; zZ-23E;6Nz*oQkrG^jZq&4J%xyz-R<8I!wvnoSW1$JnKpi5cU&R+>!jA%BWeT2w~?S zEe-L%e0BDWP40mM`scmV<~*?c!)U{(`b0sU#C;v+0*kQW;AOdnHpF|nB0_hKCmmxt zh#MHsPglS0c(acAz}Y@&=z!d82!okaE_b!2JjV>sOxE4KWt8V9qk$3CU(JA=9cj{&Ja^C_31z=^t zB%u4lRw7MF1;NXC_kal1lK2~G%f;S*JXNPn&nup63RTcSS0KIVEgxktmz0X!kI+Y( z!VMZlYE$5&)?jWu+H^CuQ-;c1$nDzliMhc4oxY{Sb3kT(+YCoq%+Y5Lp3h$gbLMZ@ zha=L%K0}?i$_G|Oa6X)KeVcNg9@BwK<8d5VrSH)t)9mvoZ zbZW{P*zR=gI@BU;4VCMNta{?XiTXG!pKvF!u_f2wo@C`@oo1^gnIU(&t);X;HOi3C zg+q4yqUkE;ZkW!H-hYz#7bK9kms07?+CQOs?JNFpQdwqUr0f29QcF;p1++v_DkhNf z4QG9S=t*9}Kl6<0TLBfk`2+RAu|l46knFU6g;n%#+N&S7uxyV}X%8Z5meVgz+19JYrxg45TdLJykm(ziPlBcf{y$lm zn=~(}6fke@&bu*Zl;@LuBY_r4)1>fAeTsd?A~C`yEV$oMC^hcIA|E0@Md((|s|y!7 zd@|Dk4otmJhvt7EVPds;pQP;|%jps^;PFxVN38fP-87ayRt%KiiD#H#*H$%k0q^PW z{tI~=VI@sqaX^wDr2KCBJ5^W!E_-%eH(M6{?Aa|;{%qNLcdkqYzTxI=vR-RllS>pF zuKKF$5)0to-?c0juqF)YnO(7 zeuj~UUUj{E^3;qAr)@v4n6SO?n<|gWd=8{IuJBYGY)m%+Ahm8T!S~VkG z2$GGR)o^BxckqBJkzi*b+$6FIGv${mUz;W@1>pJC0j5r(?s9B=v649C-mx=!SeR=x z$`AifIgGJ(dl}_|8WxG{He_{iP}e#;PQHqR0It?0E0h_*{lsSAQJ9N?c*ku5G;`B#TgNe zbsHZbatw0$463YCx0(&gO)~MOJR~uFqY##eYFD~@_aPWg_Z}^xSCM}>CSJ7lILm2h zNev|2@EFrJ)~EAs{(K|2IQSuU?|viw9-9&adQY;re9rRUIPpM_CTmT*3B%$_83~cc|bmB;S!)$Azc2 zvSq)RG#n4JhTi_d!tuu~WO<%*Nb>tXjHhxni{BjC>41X6{}~6~s;Diiffjhl_+Jkz zrgr3h6drTe#O~vf>~NI9B#T8(h+D^~mp0D^z@=Al7>+q;W6Y3}kJA^!hQcU>AaLB0 z?7;5aOy|W;=|ga0wzOnrW^K!S~=e%R8A9Sk;X_p!O`Ifckx$4PWK6*xAjS zXibpFI^Aj;`|HOnpWqsE_u{pCeeMcEYGlU%V))VTW;zQ2a+{rHkNrr39W*_{9k0hh zc(H4l+SkBTDHo-?VJC0;In&Z2_l8uCVPb{8*QANB!2f0l9^yVp-F#x+dP{R`&uyixmPB z^dUn5w`w9KndykZK54dTT62W6Vr|v3H`OGTDsp>B#yJ~}u=HNA(4)8E4k2PNoX@c4QNKRY0+T0dANRdZlXo$4>i$6ky08V$ z+;nZ2e}^Uik4vh|V8(@DzSt~LJ#lADUf{dq*FCmVa7J5d!n!hSG$&XjykX73mF}E| zcsmTC-ngo_*aPgrf45Ac5@fj`SV`c1O<=cxzD9cp+2XY0LgVy)a4xVC@uqmft>7LYJc?l!( zn&~sn%UBFWNI{d=3~~ggla4=o;X=2HO5B>z%p9EhQ8`%vEz;KA8s=m}-Uk`*ct=4W zK{+*99A=-SkC62w*68lalYQqY^l!s?7~q=<<4ca8sdYk(+jgvqat+RtC5eS`p!aIw zd{YiC&{k7gH^Vh)t+!D`PiaNNqYKp(;LW&yN3^kzKhrF2W-3fM&w>zVV^^@GqqjEQ z&Bmz)1IC+T<#Xx*EYeA^uhJhF@hx~Aw+TCWuqdnUhPwg#`wG-|I8(-p7x&+Mg>y^u z9*nT`Lpj6ogyb(-DXFTIyAv=4v!_ivrkN>z=rKT+(}z~08!@F#H@0|T+F6W(HTcpM z@qzouR2ex2UDqvK9TDm*g=Fyos`~i3To5M)@)14Hp`t;@PzE@s#IAkss_>A}6N7=~ zlfQP`T7&nW^f4rQmn;ltoTuk|vAc2U$x=`k?i3hVz4sZ406E3F!! z-Yw|(+$B4Ym%7dkD^_$6vrE}@bx*a-5Qx3DsaY5G?DDAbGanbO`Da7appC?nr9^g( z_}fdsV_hNfN-KhkNfF)tc?!t;D>&qyI@~niDiG}vAf!XwR`{buJ}Jro^$YODeGYz} zun$D8;0!>$m(bI7zfr>A{mo4L*)%Oj*{f(s`0{=)7G{;DG6oBk9E#j>;QS0-zua&E z3ca5e?u`pcd|~#cO|OOFlx=4 zMfp-WT9raE;M*Ca=4sh>&L!FKjOam-9c3zU3r4%{97yEfLB?2$0xny|$Vo|=ZgBAM ztmr{f9|vrT*g!fGe-7Q9QY^cb?rKj(GXE+f87Dw z`r2lNEmL5u^qH0~sG))mBpN%8ZH16aiE!wX1ZQ%;y%-qb6ops!wy@CQswH%#-elgI zg92w+l_i*54!O-%8RxZcZhFYu1Hh9Ux$^%aL5fnD6L14|aS~WF3^>2ecJ|0jCS09- zv`wFSL~Rr9;HNSup6;6pezuncyf}!C4#@p)!;F1GF3iUl0hO37chGb0M&6ku*AXa6 z)JXuKjJd%8mys#AH9P=XkTQ;B0Q}6lZVf)#hLthSJp$Hfsg3Vt4E^q`2iwjeZYRK= z1=P#<*DSO>=PZfPV6uxA&$G`-pKdJ4?EPc2a%rCx89CGKEiN)AcYeBrlKi)(3JywP z9y}njG2T!6J#2rimW~6EP&&O{ky;U`kQ%8nU{RKO@XsJ|Hr7obV+YzueWj2xvZOm? zcKqxJ+=uJ*s5Ub2%q;kjN$+?6O=U=WV?-`ai;_bUbS%oNi}_8vAmh)j@wc1DEJKdA z*CNthL7gtYj^wI~F^ULgN|z=}OnC=A7pm^jjEKeE5*;hJ(3HhRp&m~o5brZhr7QBu z&fa{Qfg_GJdQ?%y4?a4ongaWAj$B-P$3AnLy8b&A}KZ)A~wh zQtYA&Wz+M4X-&}1bYfkkn#Lf2gXtbc@JZ^y8S}-kB-tz(ujH{UV6$@0MrboWASuyb zCOq1deV z>LTQy)-+a*g|chP=l9ausEH^=V4Z?%tMZ*^P<(6#EPiTXW@I-UC}eRZgB&Ub(j&iO z#!7Ke>7DDC6cAJif65%(f7i4?n<6}I6m#wu?PpoTi-9W zRyfx5E&85+$sty(Xeep4X0FgJkvsJm=Z*b%IMgE=wB<2(5(cIFbJ+gJa;b0V%hy&j ztf++66>(8#cZ_ga8(Q|Ik%@j(C!}HBW>EBWipNIErFKtss`;_Plrv}l%ojfGy^)Uo z$)U7Rwt*_PDl)s55j!12!JMt6n{FML-f!Gv$e z^AYwv?p&p*@-Us@%^Vw%`T?}#o7=t##fVaA(`3nXU`jAVMaM80e>VBy><_g>yGD!@ zkBS<-Iyv}=wZ`!xq9Z{WrFNww`p*Lg-Kkf!;la1g`cX=BLBrhEQKcq}djzwL4N+e2Dn z;UCY8ptg>uQWj1>NZEW4nYzAPUYQwYU3bYV!$_^5DlO~+;J~%zrN3%iy67SVGUsQ( z(ChP2BLn}%oOt-$;*mDj)YJp_@=k|qV(!2RzHz3l2h(-43L(U5NkX zjxCoD*&MOQU%!`)mKq4lMWt}YiqXl&%;om4;n+Ksif%|~IgGEA?0%g?s^gL?${b2? zLy7wdg&wgS;Q-d9c6MO}K=cgKmm*NlVMh&-@OF`@`-FoerQ%G`ja_0>C|!}?kz5&P z`u|aM9{yDR?;k%L9D9>->|;|__Bi%&vUifKGCq=XlyPM5bvRbWiDPe3m=&*fWq)4~ zI%QmfjEUQ@>C2;l1O;dP?xVa0*YSw)*wrocEW9ZNUpvv$JuA=hk%|0~(9yzd+2$w=UXPs-YP~V7v zUXp1B*8Ox*a9*dB&|SEg<1z4<8h}&)aNRlFRP5!PvU@*2jW6a=Bfq>Q6)A>AExuzg zG>-(#oikV=n!tuZMkrN!^4EH)RoV+-`b!5>Exyo~2?g^)6cy}<-{a*d0#(OJ+8leXVYW+8|C)4t0TdDo= zc#eudDjk;NcJ!)&9D=Jog`%r<>2#EYFrnyJ*~rQ{LxZ_vue8a0l`rPKzuP;Tfp(_Z z)700}A3AP1^v);dNNI;R^E-Wg`*U_J-hHz09f)C*vDbBStZKSDez)Q)T+zIxH|ER! zT9xUr@cJ|G_W)q*x(7c#;L|e;=<+hnJ^Vaz@?FkNA;Coo?G+xQr@5tI;V1Hyy2>Ie$ad9+bt8m2i;oiv=* zjT$8I*1$ILQ8A9n7OXVSM7CRb#fR@1VIGlo9B~1Q{y{HoEKeIf5qt&=Rt)~qF*?4C zt?z_OJf7OX<{udOj;!`FIq|#uJ0#`>bXwj;eTNV3+jIGJW4mq`yB&!R86&;-hKuo=(_76joMo5DRV)0(x;sdoE$_Zkor$U0bzV3DhwjADeK3ym{}T z<&Z9P!~?jOH@zs{fe6IbpU0sFPb$ZJHRV{fu`=zhft#q^wPH2RJkS~C zM@>?)aCM(bsQ{YQ{LV~#6-q3~59=>c(8VCw9TRg>DyM(9vb)~8E-hUgq6xV#NF6S( zlc3ZWnqk4BqBp$xh{XM=Lzcx<8h^%3l2Xf~1GY|<@X#Ru<4RxI2Zz?kU3NUP*)B%wZ;-~kDBI-9SKg#%`}?9FF5F;7b+T_g+{5SyFzGFuvtWRlKq~30ms9$Mqu*LFKK=CzY|PJn zn*u@NWclkkm|gJN=O}73bDr838|9ibt}dsv4#5O#ddS>gSvIe4sXD0mLqphC<41o~ zEvmfJe5XQC<;Bx8#j~Pgf<1e*H~76`4rX_<{_)5z-e;`wdp3L2>{fE!D=!az$~~WK zZuC4CojrJ}rhbd;qqJio#zI3?PU=&x>hW$J*uQl07(x_GuzAQ!Hmo2X1Loef7Atn- z(glLRyrpNjTMB64Ujl*edzsmRNV5YS+)SOgqUi(jabD=`as!jNP``#3&|8oWS^1An zQ%+NDkntOG-SPP=b{?%M0E^~mW27#fr{o~_Y=>U@?F*|K~ zjVf+~U|Uo_=%MqA)bK0s@54hjT35cd4}d)}|4&mj_$G2&2vt{&7~Nz)dOStyk&yl& z)tlEbEiT!fgMNN(0)uf*D|j?TjJb zx7+ut=P7kj?@PT;vyQo!>DtP80Yc3uSd5Qt?>G*4QZ5|h)|FIf1>@z8@jsWdQ@X%Q zFcaLEhR$LZ@Qv3TBiZ~9Hwplv~65kJ(OUda-{U8QnPP1~wgtuC?OL&{9)z&Jry> zYf~^rTrp7>XxDXQX+uM2@FrSMV16&H&AS*1audP%d$Nqc=~Po1Tam36&+kw<2K4B@ z1NPb4=QR#!Yvs$2(%$wx0tuvY*X=)nuGhV8kAj4N>`+4`YsR$e!#N`AcADtH9V_)-Ru{w~v@&U-V2PD_(=!ad$YJy{-WxMOU@ zQ_BYm+ekQk4<8UIKCf?2tMKCUi2UbxAkUo+DIYD)9o2J;KHPz;8HnDEDWJN-l66Tj zm~W(}63CDLX9XQ>52@AzJiyTE`s>uz8+=EaO_s(J;n4DvqPP#Tz>XH%SzgPcpgbZ) zpPhmL;5ze3@9f}mTDrDsDU@Fq1QfJ7H*l~Ok}8_GpAlbM8LZVY0MIwtu=XqMTZI`{ zH8oeFO3Pdk#C%%Fbrl!c+&=QCPKdu6{b1l)w)NnH-d6Q!F7ip%CTsr}`?iTRij@97+@u5ghgL}Yr<3PO+0^Hg9V43Gc`ZGp z*q=?tn2bY`{_qU%Xw(=ChJiX&Di=FRzNiQ+fH}lI`7v<4iaS$T)9H4-u6Mp+kG7VC z9KcPRsO)HELHI6HV-x$N4%}}(@`GZIk#BJ**gDsMp1kUfe0iVG+)QZ4$DZb6+iDCZ zPho@OB5ne*RVb-h+zqt7LeYW0r6G~E!i~dM%36cfaK{pI?eWj$1o3o}#Qc?vBCxQH zaRt&pDoep)+9)tBa5(-fnsQ+96jZz!iWmMxFqv3?$bU*;5{!eM)&TIP^YcHl*`ipx zxsw_<=!@j-m!`}d9QgKglA1|ow(8Hs`AmVJ>r%^Fr*-hHGFZ+$&NH8GcXvcpP40~* z0PvX$?Y~p+<}5VnTC+OsL2#t+gpoY(_u?cuvpj9VnXHDCR=PwQyx-1X6HcaCfvCGp zmvm#U?N0c%qYkSINPD|}24`ZuvVZCKvnCB&hUE;_MP&iy{SQj{xrUp^2qw9&J^C9- zZ8Trro&avN~E{R&y#dr4O$kJCjo9N?MFN)lkeu0b_n z2pHDM_AoFFhedLFqUYmIX;1MyORAh&Wp&$f&j`H{nitn=w!!(Ob3PxZoz8g_Sj+n>TT+GNckl0h(%V@i_U0nYlt%MiRD+tLwkxZUBf)0yDJ$6f4NDxe-$E^? zhFg9k$kTDr+L>e2Kp>26&&(`Vz$nNkHoRY?JTPBUT(Pz%m^e_k2xRSt=4Oa_90eRC zEy|BdL_>OZlOtAZgk~hmcO_!o?}*29NwCiF0j7+)FzqaHw)@W8#=PR1a3R2Wc!l4! z_kMTyOF02qohK$WoL5=_nqdlm3LC04*XsERJ%LW|SBlNj8RxJ|HU-=G5O`Bzb+?)d6MO76M{B4mJ0<8?b-ZmFIj-5;^ReKQ< zZIPF@t7HDpB)~_E{*0?J!T$<0yz}^w&$f+SMesJJxJeV zrH}&j2G;<7$r6817>S!Zc@)DIGz(12rC0bMKq12tMZRnh9XFIL{{5-3jRp89b1)M zPxE&@vL?=KlkJWTrmCjJC8jRUc#I#|Du1qjY!^*4B4N-_{SY={Itoaoqj-ddKao%B zEDMW?;CRERc+GDHz(#LTi{mXmzmkM)Qabm^o#eAn=5WU!nPb0GnM`{uQwCPvpsbb4C>cb{#X5rQEdW4lMyk?=X$g7&Y z8Kj&iwKtrv5x%|g`4`>Lm$gg|%}N0Fea-p*@gI_`dm8Q~sa(|(iVmd6Qwgh1#imxg ztqSy2m`jn*UA zD@`dNVc-Yg*1J-kq(J$udg=H*!!1|j31p^p&N8bb_@WMRa64z)zLN?L#scuY+r~Fm zZfZx_OJ*^mqYa{^NWt+f0nPV&@{yff__+|rn_U`)*(LVNDOxNGk$yJ?#lc8HGx8I(&s)km?BEcX@X0K(JTXG#A%;0RKoJziKocf1(~MFQ1$S9T#}-Ou z7{!_MZ4>^;~KVF6jk^AnvOxV^1=}?V{+`F>SIZeqIYNh`Aa}6?v*zP z>L=6`&hx(PBWtg@b?UA|s8gd6i_Uw^%lS4lduR2^b|-K*@SHIQ=7@2AV2SeTV}k!P z$;Q#pQ7dZ25nhJrR_j`U4zW?dR~^J8N8J9|6y(CUNYb?xf8pz=##=a+$f>-b-$`#z zct}v^US}32iqsmB8`)3KE1rS_BnHb=u%UZY1^+-$|^B^a(L z)GxBtSe6f=Qir$X_T2p;EWQF$G(7RfzKHVaN6pho1;Z|H7>M{U!lq#`E^mJe=&O86pBJc!fFJGnS1GrPTBh?)^!v7+jR3{_v9lf|2 zY6xrCj5UP2m)u)cv8Y<08GA#1hYuZ9Mh-0T=T;0|eDLaEqJ?hPg}QNx#rzx>lB2tm zwNBmlY8IZ!qzu{Iwf|u8#2e4i`>Qu&0>Q9mUH<08lyxM)HFRthpoM3>L_f=m(EaGP z6|T_yhw#k0pp+>qD(lBwN;;U*P%s0F>YnwYj=`9v$SK1ehTxbYBYW2b)Mf>hw-hd zK~DI4qV!rW0w*~dc}@uN-H`=WQPwXwA(l}eJSA0rfc7oKV9J}zfS>nbR@|65HF=V@ z9!0Y>a0uTsk<{EK)c?o9Y5HXDyyljRLQVXeU{amGL~f`>V$MW~LdVwrI?7O{;6^`f zG(@e1TS+*F%t+?x=B|xLNC?zu{#KR^=@4LA;KvTW6 zmFH}!*?yxEdTFa~FJ16(D-PAcr5XID5TW3pf*nfyE0<22uQ@HhV;V9Iwc`~9J;K=bPH0nsYdlm9%gwE$CaoTPdZpa?FH+}!dXY0UYD^;4}cg-do9e7m+reWqV<%K8($CP&3h&EWLHXbQU>&W7DQ&% z)E#Y!g2a;=JK@MnryI6nxDXAIAUiKL6IMv~9i#x=u(X6oGM&+h?ksX$naq)e`lmK4 zAV$*qCb#HHO}U6E6h$QR51wx%)a==CZ6;t&Np6!JidHm1N7em1h)xBCNYibhfU4qS zb^SL5dNihL!}^*vCK>OyEaORh&4#>6veL`79jz7#fBLVrvJ@cbw146dj0fiYJ61}v z77L>A(#M6XL??&;WWIu_Y_2_VkaL^?R`PDV;IAX? z`%l^Z4{hlOBb7-DrJ!sn+5AuSGeClZX6At3VMIM?2``vHwcSN;>D_H$7~j?6(tFW-vYi1N z6yU`~#y-7##9z}zmsHNSL28q&bf2^}9|JySyL4O&+!7SJ^=zPXdPuX=!iKSZ>{^$} z+Sa;>={R62XtUVt%o|s zn@sAiu}mtj1f1%zoe*3ka*uA!#}D5otpB5~m8W?+EOIp@vK|E!J3E||50hoFRV9*( z%WELI6{8K6%GkaD3s43a`Vi`vrztD+_xk_j)ifFkS|_cm+fzdKLwTOK#-AZi9oYRX@iF3CfmIZ$8z#D+cGF*cD7EqppQjSdO)$f~Uz z__gqLw$A+&Y=GqK1rL_w^NE)K4;0^ulgy0D=eo<9^;&dOnBBepKAeN z6l>hWCNi#A0)M*AQ_N+)0I380d&nLC3gyBv&LC}B3WH<*e+1CrPa|>9+@l}}+ykPN z!qh}|t>EVZ5D66N!MoBrc}7D`ijcphfV3z;5bor-oxV!MviJ^^SkKPR*%qs@N!0$XrjV6wL`L4;IFXPWhB zqi9fw2oB9tu6% z-UUKf_0rxCyxv5Dv3d>G>ns|4z?86!hI#ECRXsO#_7w0&w?5-ET~GYg&-gCXnT1KD ztedV8IeJ$%7i)m@?(h&xh}iBwYO-{O9koM_S|MH@s&Sud;Vs79d?y6HDOB&LoF8== zd}!9_7a8|6t`67&s2+Re@9IBDrIrPj42-w*0t&8I7=$NgF!&lyYy-CM6jk5yDDSwH z0zcqY_%6jz^*EvB4Qz1@Op^3mmOjtpL9R>M$!mmi|>0Zp$cBy+YYat(22WG`7ee$;aqaH8whmLl!$tUPP#6`%m)}T zbBwSZjr_P+WKpJN(SM2J2gamU4)_vB^eX*yEdv+2S$)s1D^T1QmAyJ*5|{Cy06(|r z(!n`_N}SUEh%Q(i*WL4MR5PPlLEk8M`2;?#BYSLRAVFi$Q;{zY-W#`X!tIC;$0v=+ z;i3U&>)?e8^2f0)*^)%ADb>YUHUb2c z-zQ@@q31Um%P7D*>=6RDXnDa_b#IuY#3-!HcjRTVmEZCdMvvr_)ubSK0Kagh)c^$Hg#Jp`9%vK8MIYje; z_1s1rUOxs*n1NcL&NE=dh(@8o<{+@K?WJ!g|<< z6J%gBRq&L=Yu&Maw>Q**z3(04P(!0EqL>+1{?uOqSBxtp;8H<9$NmQrprN2NsDb-C zv4p*7i~)}hR&jVnEzhP?#c@<0feg@)&&Q5mRHChmk%N#J)ZXVv~q zwsR@k4Ck>NZ_Y@AOTH48yVYaotU$tsjuE_5oOJH=9}~EUOG37fS9>bu;|mpjKfjW7 z-jo$AUFqHve2TuJH1K{MJamIq)+l`3XggH(4?cUqoyFw0xSe7eRB*U6ibd z+`HKM7v-o@T>0Xd?HI^XrgQR+I@wsC6uV|W(ak70P&c!Hp740v7$*HBMyr~bd$Uxm z9>_59QqpA3h5Utwzej6(*Q#(MpIo6bm!5B^mWyNp&WJIc4BzgJt?=487P~jhtOuWI z{b@iB$?L>sD_21zG=)(1Cv?s%S%n7y2WoB1N}((3p%(rYeBbnxoeL+psS<|QGfdLI z8=kbXw@9yji5+k7Lf@{|CuI~V*9a%Jp^W6c*7MX)xmA1_YyL)Z4-`6%!2y~U-s->m z*DEAbx%1lh9=N%J9+UV;Hb3huBEL9mGUdvAB|h`|Fu;DdPuoe-b4%WaKL3za#e6<9 zvvf=F6ZNNRRA#8l<( z*+%S`AWd!qp5zg)50z-{M?!LLvYf>?t(8Kp{9%Ll@9;~kWuMW|kt@c?#TnQ#Yn$1l zx)WIrIj)PaT8>I5_(f{1ETi?%E3BR=lOZ4jGI@7^nH%;F()%^28}+c+3*FqvC!K?= zvy&qL>T7;jE1%u8UbaqLxhn)#fyC9_$`Daaxg@KnO!LmhpZ@U|lz)i<@59q3aJXNN zl{K1Rypy`lqCbs>p4LVa%~TuiJ=xpr3P5WcV7xbTBRT-Cqt_?b|~BoZ+xSN7iUmDa1RGlL{1C z{_m6}!G%j}Oh|50TuokDugQ&=-ytLPVsQG`N3N(W8MBaR$S!iDeeCk*C%gmH?4nrG z{J{@Gs8}Su`-x^vClv8`1JVfmDsW!o`Ur=$Ru!DLE=OJ{@@tLq2MlG$z6AetVyd?6 zt4Ok%lsGB*(^`YCikbEaluW%hJ}5NFz&cWUyWW3i;Rx6ggvpOx44hQSSh>>FJf6#y zlDC+GJZn{(XdjaH2vEus+&b7jFp#t7wjEf<`+$JNs!YLHNq?rAYjz6nIM8F%lU;hA zFQJI{JT9eue>FsFdy%Yuy^O~qDVL1cO5rdG(s;PJ9s`{ft-vPcAYIfD_XhD8VLAS% zEmG@dHg$nZ0W0cf4OWh2XhPk9N-80IbD*Eh@a<(d# zc@U?v-G6bNRcdZCDs|BBliu4CXZL@4u^xpZPJtLczlYI$L_NL8mf5-8CB|Y2n5|ly z?45~BhHvs>e;NrG##CM5MD7wh?ux@lqXxA!dpap#{{bl3{>7DU&DtoIW}J_%NbU8; z;`&08Q3PF_FpL6_rJcq#a*zsFB!shK$9ZnpoAOK3rGV*TGjSQYFfdqn`_f6d611P? z$1TP(_@Lnb%{65pSViy7!tRKuFcs-N#&bRs&Mo{8|Bpuyd&bSOa*h8GVf-pfIC9cs zoxU~&4qPs&qBN%VPv!N5os*h@&M$^{^`yvrZy|cU0!~q zcIFu~xZ}nsD3J3uUVMUG2{QlUUeie0RLq^A8TxM$p$Q)?7E1t}XdeK8vO_7tuSV*3 zdVFbLaNibsMP5{-f7LAnD0)`k*^NT|`1UQ!iYSR9vJ~tI_--5#EKy3|^-hox&$`IX z(?PfL1LGqyA7^|ghoqJ(7N4S?)5`20%5L##Kw7O3K;*A@Rut8;x`~UMg}O21o{djK z=c+mpL5b~pbb(1l$>?92yM|T1ba2CMva_K#J}DHNBrsRVr9zRP$U0&(D1@sy1mzm8 zpZ@ti;UdRF!J{h1J}T1eO*E~)JhY6>)^RUT&asbBGj%Nz&(As=aW`4qFhCaB1zagl zm4MB?q#byAXLdesZUzx4`gdx()LvDh00NEHY*zDs$9OZL@%JL(eLvm$*C5T@p%G1K^++DDXah)0LB%P7A)etgFU)tW4di=S0HL|HNP z)(d~e`eRr)W&e>gKHubXRuuc4*N9VI%@Id z3*f-BU5ljIv)YCpp=obqlZc~Ql-W{l!!#v2$|pcn`P@BE$y$ezT(D=}U$@rB0y&$|ZkGQC4=NW-sPEUcWi;#S`uq%r zMY+E6QMccGXz%j7=4tTcvi)mXRQVNpN_*L?Iy5+m9?OJ)pGh?fF)LN6g^c`j)xvOItH&s-v#NFG}tU9Szvt3~lw-3f3^GWIKHsz{w0#;XeZzV+c zhj$s92K&QO8*6N2@55xr>yY03TGM^Z#(&lwRK3mTf5 z_6TT2w4ZJ7AR0LvMX_sz7W^v(-7#+8#BlTPjYCjr%@lyb7Cl^}W z23alDqSh#(mayrQUlD4_w+BU?PSTnLR(ug^kiZ91dfOtK)pEByQQzg557DYhP{6>r z%<!$T+I_Ty@LZuSJ#pN7AKsp z06CdK1SLHav)IYva9m840}nRHxS;DJfb7V8v(ddE?C=vI9j6igAd_R&(5-IV_c`aY;(D(cdy;Qe?-gU2ail1JnCn6 z5Tzgsc>V3xGT zNNdre0bV+`DzeJwIot608bct;x*Q+MqF5T>PS-8+#ijjI2k6^>$~o>_`#^vd$Sx58 zbR44m79A4rmzb+Ztn(NujE+_b=)9o-i`-;pHPAMBexh!k@?gxCq4aF|L9t^T^;r$s zeTNcn6bIoOtb>imW=inw!x=UyFji|8wGppMdT_rFagj|Ni4~BDeCX#{}c_M%;w5ZY+ffC1R}@7y`Y~d!e7ZuE_N8^lDDq z?AoC;Draxru$(&VK7(v;?D z-8*cplpUU9M1C<`^2R+MJP0&aWm%R#&bJ(Oyl`5hcHrV#EF3lC9Xy)dX<3Fpo~156 zL^C~I62w}oR$vO$oaB`APwOVE2PAZ_YHt+>-Mq!A1+G8_td!-qR*rp+U#p`CwVP=T zl7ydr>l;C9AC)0&Fb9K6h+G8-HX!EANOL{ddGY^f|#Z*CrsH<`-PzawUC!)C?48w8MA zK{n8vn}E{r-UFj`O)8h;vj#=+&Js`60X6bW59{i{=E+5)n)^fH;vj5G)ITRrK-WF) zWyod-NISg-rwy!S)xf?%>}x~PYsKumOSpaHm;X4r!BUO#@!(vDP;?VVScm&H=aXjd z3~~A>+jK-1|KNH#YNk@)xsNm-5QlEePWu=KXmRy+I#rCP=S#x{TqJPu04y*}z{Fl@ z)Nm7=(aCIRAYwSl%;DM{8<@FxpP?7qxo60wB?>*#QroyiHhJt59$c`;kOx^$P*FkD z64?*=DDjilLn|3B{46_@Hx;rrb8UiYY4Sp1Y_$c7-lf&1+Rfl?rF8BMpf2s&&jrkj zl-RoDSJbb3#unspk-5*$uRGJIm8UkGHwF$2Z=M_|{r`MaKs(g_LqiQ$3PitPsUYQL zX#6jriKpSM>*?1Y*lCrjbYRnS>BC+0Rgc5^H~gsc@YBx=RyH}Z%uDB6xo)COe9zczqS(_S$tHcqTR3|8g=QghQ93-I))8Gkc!V885F@05Gd;q z{Z5wV^jV4iKn4s8KNtX0X>H^iTMrX1AJ(;{5}ION{Ga=?tEN-EyYZ90(inU0#uj zoj(AqnB(oSc7hKqhj8h*Hi9ln`2Sb}ayY2Y_|S?C{qa?2q!61yJ&$6>+10VP%14hV z06>y>t3gykhbRqr#|+%++|2$}h>TAY8-j{U{qfsB8X0))&`R1LP?G2sA5WT-dUTMv zT+#Sh6BGMz3Ake#NyVFxEEP{&jBB{_WY?j6mTz(jULRtNGh5R>`O_4cl$#X+A#Y@2 zH>>W*XPq<(53k^#kf8q@!7s#=sm;AgsfW!I2hN&c=30CP*`f-cM)HfGPNHhnX<*_* z%5gnPj|s|Ew4XCz-=RT#8v@tO+CHuZoO#l^6|=KlSEPnqlfOrSFUhmCm2Nh#fuuGd zXli!N)IF^-9ppIpClHjUI7HYzG=eLqLxo?1e~}l#FSRdi;~MTxi+JdFs+zR8pv`H1 zZ`!7R6%9KgK^C`nZT;;dJ4i8$%|@zzxJxd_!f~9#dmYTl=~;7EQr0R-H-iD@c!0T# z;ifdO<2m9FfqtjV$+VD_OqJbTzH53p$Xf*;?$UeMTo-s=+M#n}kZBfAE=-kDomvht zGpyT?Nqi5|+RUX_o9J<3kAHnS@Xyixy|ew_2qAwWBgKD8mLN}~wG6zx=niVIn=^3Q zAB>mrBQCNsK1vV+T#cQGLg+s$nvVF0_0SzB)FQ?t0_f-X-jf2Dx))nG1;+i09J)9G zZ7(c~dQ$S#+MB*c=3tv2m!~{lG=d1N6Tkq(BGDk8C-zMZ9Z3_Wc6L=eXJ>pbYA$YY z(#@Gh_p9bPA%NbcQY2d@Uy*j4)a@ag$bF4Z#4;n!xG?Mo=A2N|qPOTNjGtY(YWbXM zU>D&c*9mB*BI^nV3bZ81AKInhtT8+L88&u$W`1qa7j+362ZPI@yQRX_M8dv^hR3Ok zWN&8N$|X?sfyr)erPwc62JS0dpt{&^XPp_7j{X3}(ZE!0EvdojZ9|DaM|~K-(n;*qkxTQj)5Sekn?VY6A|@lOX7OOey3WZiPPR&7_wqeh3P6k~>#-;+nqjG)+o+9i<_i8EF>TXoSabW`TX*bI)v$%T`ICV0 z=|0+4Gk)b?c3wxgDmUP0Pgj0vX&g|6xy-^s>M@{PW+goxveP?8_%fVQYbZ%f3*uU+ z*tP(!KB`xL&K<&5wz4gSzuiqeCV`KZgQMG&bO3yq=sHX1EFJ5o_MvCuH5Tc7+o-zH zbU^PDz#PGUIDJfT5tQ&rKG2!XO5I@0isB71STh>+D z*-Dsr%IGZ!@nq}8bpb(5VAlh8_mYMl$>nk19_6J}*qV3IjN?*w;c8lS7wCR~%Us6u ze(86gTo2q(MzNf9nIX_lPVvwb3P9%>Z+Wun8P;huWXno_O8hlPKqRS~-wEWmm(0r04aeS23Kx85%u1n;-%6}S!68+GW zld7*UVLxbj{Xj*($^!F%j(E;xFbOH5Pw7jvpx;Sdujmen2?t4k$VMve&Q2rIuxu{3~ZZj0& zdv%3fhPopNj|DWp?zXu0lQRMblYtW|75-IXGkfT%}_$8|RzZ=x#YRR8I-TnM(!}gK! z7wH7%3qM#cTV3FOi1pWN8mHHl=YsBiUB#d8{Icida}V2U(=MDa8D>YEle(yhWzX4w zS&1yOB35>7NZ^Vd#yfwmPU{NH^S8YxA|i;jgzt}LW7qIl97NZAby-FRNq~DgDj{(3n@pHf3(Q=GV#s5QcsszQ1ZyO0o>1>h-zz7 zF(>?G0j*}0C<+_*q(t`%(3J$T=*pZE_&ffqe;^Su1~@JR7_^Cs&Pqyj+CVD^BpBOp$1s})sJt5U&lD|W>kV%hNF&+jDm-QOD-T7D;AYrH!WReEZ)wm(baG1=Ba zLl13LOhwm40zrkh@D4`&-F!g+O;LH#^P(N{CZL1W)F8629~lrw5#8Of=QWNe-SN;b zw4mL)(b)~IL$lbc-p%6qU5yX%_bM^JJ6LmaT@cs__5|F6m?ikGBsB)L?$7 zcoAjWMYHF+RE~M5i*aC3F?VODzc5!bbyq~Sthp{j`jB)74hl9B%So_|QL7c!&PDK> zE2xw0qdK*W-uD&7l;v9S;yKSq9{-@Qu>XN15VshQ?i2je5SV{jl`rITu6^!rWplX2 zcuR;)O-gFd^fe_o5;#lQE-5V?C{HS8N=eno9M2#v>svVdnt(Z&Ku?D17P!SJzkfZ6@ zjN0M4&{-f}Sd0gjv%0p*eYEl*GS#kem{6OpjEF{EtajN7{q%1DQ5BUpJZA8ke~{2h z@)HTKxD$M;V1m9z1;k8^1?VWi=|-|rg;o8hW6G$8s4Q?6okdL5;bc}Tp7@_#U*H;P zI0)4+7R>bSQqAm`cGn+ydmKOBsMuU$xugjNKHZHvw)OQiXKSX7-d$|fX%|Wi*_Fk8 zet2ro8q_70!GnDKn$kVfhTL4+wC5y(LZ>%nIux?m=(W2;FP+rD z4*mCmnkd&SoWiqs`E>!+auuV-v<0n@?(U9xLY}?vr8xb9a}v{6k4IHohtS!ZP8J&UKXasOhf)VT*nH+c;%FdSfF} zs1jt3&x7ch>SW7fnYFjKc95IPL+8H1q?a;1Xg-nzZaR>k!-Qq<@=v6=`J>W zfiOA~QWQTo`ba@7&nFF5)j&jNZupUP{lJVBAZ~u}K0@z}vEE{cxZ!D23_BB%YP^71 zcltJl7)G94xVOa-yHiN_OHl>O_I{>6(@NZb)YIZk`7OOycE8D?o<3o`0x;A)?%EGU z{lQka3cB@hY8vfXZ>afPH8xyXE4z~FEvt1;3?N;dPg_zE*K$Ix&Oi4dY;lo#SNimZ zT?uvK{|Q>$_sbDUq?<5TKC1uoyQa z5UcW_$8T@0Pj94WY4KZ@WTS&sz~atFBKpBq&6O}FC}w*yJuCX!sKI7cXN%nT;VXq3 z){1Y?`EzVyCO=g)Y#2izvXRSyV2-~XYl^>0U7%L8gHyt2v;81Rkhh_G?@>@src<=B zo5FLF5>WmNBN{>sX}%5*B6$(}f5J<+RkicgG%wW>*PpM+ZDiS8wU&nj2H&w5x7uA1w#}T z-!B=;@@(()Z@``flw7Z#tPqR(^FwM@6Lj$Sog*CI&t}#^OZuC2`@v3wXB*6J+%;LK zdH1?q>0t8aL$Onp?ih2?-_0NU;A%uF1s@MQ36p_Xz3RT%<|wPXiXY~_G!$V-y~nwF zIYP1Vr-rqilA|^r)lNmT=g0!zx^EqwhA9P7wvqn=KlrHE8hhvU$G*$wi19#b8Z{h} zR-IfN+-Heh-yTxqG3I0Cx`%uXc1jU)ltC2;MwxLlXdQAR=A*i5F6yoQ6W)8LD!YW} zFN;658GEh@QPvM{CAd}`j5gW7?&T}(C4P8*w`9Ic0s75vqw&XI+8_kIPgFz@N2w>#Y|H2@{H3i{16Kx-u;KtIsw)q%>3I$SL5 zJ^Zrbvy$qH1*syIiyB|1(!QpK+4(i!Kfg!H6e-VrwHV{j4|Sh+2b?l*ZQ~&y>$q*Q zv)({L*DI#)y(gSgK5dfws}=SL1bN(QspBixA8q42nQpvl|73?QFFdPgTs*t5`#No^ z%u5>Ky7lyHm#@XL>Wg_GmzY_~bDvs{cNS|1uwGp<6dRHieRl+c`hqH8dnXL;ZkSbG z`Qu*<(Tk6;d9PCK?8%=)!Apn0tecghStxxcgf!XV=u;)s&n&F!lDW$fPoMUn29F)D zO?Gw-I!eD`Ol!jVCY+CTd^kD9SohHE`X+$fUT|xU)?4#~1;La&akC6kFIi;BzWvmH zQU;Ft2yo!0Cy5plqK_m<*b8Hh%Gf zgJXd+UF}w@r(Amyx4K$W)eo)hn zISROOvkuBkI zocc~S(%Pxt5Dmeud$3wub#7(t!iu~!HDYl3OlB8w(BC=+zl-SYc|3*#>?v@qib=#e zxq_<}&FDS04uzztg4c(`d^k<^4}jC_1@P;zW5W8l9Vbtm$2udnSzQp7V0H`e>}2Nn z7A%;e)(Q4YJjb54;z;Gl?^ZYD2x%7Q1dJhtRnEWO%N8jlqpyZjwN|3QK>81KO`G@1 z4wd^;LJavJj1r`|Vhr$PCYCf4I;L7f7003xusr`zrKqp{pXYD=2|ssNCJgLab}m>p zXAPwv_*h0k^YE(<=UQXOQ-Bgpc=oq9 zn>lDDZ?b;2sPcXGi`^FhYFroFMNMiZRq=%vrMnkg)hT4e{ZX@UW#CV8=UQnG8yyaq+G2C?bPU( zag7a$MNnDiXDVQA?!~lGpsoLSUL#O4FXi#FN-8(E3)~^Cf;YylM$(#Oq09CQnOwoh z(Pc(7u29HD<>!2&FHazObhg;)N-#?%jNu1f_mV#`h3`FZrcM`aLH+}9XSy|uAun-Z zJohKiBe3r+R?!%7szAx+g!!85TW6K?aezXTa1&Al%tQ47Zawyqm31# z3?7Ag%YJ?l9MaR+?k6vc!hAfr-qf-2&tQ3xesY@BK7`TJ9^PyzS85C1ESw`U$ zF`eic)txd5U8twtHz$vP+vCcq!8QUU2G4x%!_U?B z;L@jaDFTv??Dth$*hV3QS%ThQ-)_ zrE1^n7D~pZ5xx)}D59K^Q9NqJ*jUm60IO2EG59L)`83vMhzqkup7+R$3J_iYfETZ% zaRI9KsOWfPBL=Mno=A{>ESzfj{^Sr^!I0~{vvT_Xjtqm#|6gu>0)K;`oC3l$NA_!_ zihn0iRRSvsN>4rqpUZy@N_q; z2vq>XAF_wiyvh+oxJB_<_rwbB_BmxC{U(B zC13hY*Sge#P|&YZowGuL&t)`$tAdEPWcEyj%Zv~5#D$@R_1Rqb?XjCfQcCf!{4w-T z?y$i@T~t?^L_3?oQ`OxiYqe8w<|c7HhdCOK?N0B#CP|hss|*v;uI#x{{oHA#j@xfI zFhY<?)S&ydn@xL#&2+}6@{IArz(co`FnR(ky?fBEP|A66<<}{R zO*I$boO^-jHTpN}(VR7ZaM44DwNctq+EBEoUFH5?hx?ImmpAhezZ*UW{4LrUC!PZ{ zrCd&?+tT*ly`lo;jNdDhO{CCa&U(DR^KMfYJ}Q6%(g$)FQ&0l>n~%*eyU^~LUVVkf z34)K^B45h`I+jYu@^hV+x9 zg+AVGRy>kqwcSnzP-b^k3Fwh^5(804U9Gqc^bzDn!~s5H5M#)nzCRk&4VrDI$)A?p<0IH#C8x?m;s%Wkq zkj6IAg$os}(l5p~F@cvP5{?f@H4aYpj1ZLC0&^voo~l~FZCuGlw@uIXxh;ON;`WYR z+`ZIlOHDtAinJMArgT;z8+kfaFUvy6MMV3d^Z6l#=E2eb*}U7Y&*=~?NnCm9dt<)l z`C3OS~IY-rvYUXJD&ie3tD{Qe(h9{gk187vBY_1|8I$%+ynNkaeR5L=tX&!Ehi zRHW(v!sCW9_M^%4ydHRf?)gaBX0-okq)yPK1oAjMA037HbvO=Uu*@8oaDi($4QO|6 zH3ar?YHDhKG^DSiEzRjlKZQY)mMjmSDTD1#c>7ja6jwme=4+n9keAgNIi&k91YyU_Reuki5L{<6%Kp;6iLJ?8qh^ZdZMj@m}?CLs7tPKwzFyeRzwK zyy@j9FI6i5?|{0_mPeSrba_oHs?lkx8@UQUk9w*9(%!2le@D?SVt>>AgZMQuJm1Te z%K?{O{~q2QUATQRJ<^J0o3Y~GGXfaCsst^|5 zY9-GlKWwlhtlKJ=E9#3$JhktyB-$*Xqxg_vh0)?|EIS{`oopk;G1F3xe`(xb(D?Y6 zy{=<+Xe8Kh<)aS%Q~FN{$yJD#$mcySP91p?Q%7(q=-O5Pr0^0&)vDfa9g~Hu=k~gt zhbdNLrQ$d1fZc8)?iSLl@_K*rMnICa4xs}B#6SF1^F{S9sDtQv{s$LPPOp(TH`HGs z4762-CH801DvKoZVEnw~aO6B_+c}W$oMX723Co}GLA0%;CT_W|-EhcIBEvPmmbrBE z6~3J@zw?2L>-c0qW13$!Z^bA3Lv<)xR_adBBeGGlNR6wN)A0hZmF^o!SZBo8%eC*? zB)gv^x$DEO1U2C7Qdlu2uMF8QhY*HDsPUKVt@>T?18`JO`KB1T%6R9p&IZId6x29BU zOulKvt(FZ}H_OclgC-W;A`G+*xGJ^E`ZU3x69CxKRQOO`Q2oZ)9S^EQMF5Pqb}B;b z`Ptw9b@DRfZUE(i;I{0=q(0=oNy@6Ki zQvCn3A{IhEpS|5YgjF!{c0EU>Xc{?YecfG#|IQ%q{#<*TBka0OKNI-EbW-=y-HhnC z7f45?aIt>Qee+LDUP% zJTMaPYSPS^<~97GBHK4E@fTuXeX``!!ydrdBxk=HoDV*H6cH;M0j{_`E;~cOsK#9{ z^A;2+tcW!&%A6U0NL>tY5fx!>7`X^|%LN}}zt)_%wZp9?oAMWKEw~F#|G1$(0s^~7 zg-#Rs)UPE*+qPZ~(iq~z79e@x{ZF2ivh~n~x7gCV2Dtm9!oa~O5C{NzKciGR2dIFJ zhF-4C;xDQ$kP+QfDklhP;&NURZV#12uN}Lv%FRgO7T%2qsH+3(=ykUUJ0Dk&m?V!k z!t27jn+t&Ilk)+!d$D4wr$u{=qb^UF&`fkEkq_+d7PZMiWwXQ@-nx2uaK*2EXyjfI zQ^?<04Rzo+$IE;cCL`XX?@Gctsu3KA&mKZ_p0Oz9k&UJV#j-g;hl@g}p?J$izZFQC zx5$WG`|Fsm;`I{uy=HFt-P%Tte9_G_2{CbDzeC{w3=?6wB~P!YN*;eEEldhnxHT-D zz&u2R^vtWD(@fqMq3~74w{$635uqyR9WHT9_vXUU8tS`^`Hw^?WdZR!BA_HTP`{zc z5uK$RW^?oN-X#+twwONr(vNqh8C5)dk0wtYXbNH*jyb;GDFi257)bu2mdXz8(IVog zl$s}Kx;e3&I5<|54e9t3R&&onnC*Upec(S_J00ktNfXpx)+d#`9|P69b9 zrpl+1{s%I$^Xr(A&NQq0i&aRlnSerbvG9H?L>07?qCvuCYS?4CQ+sGBQy_Bj@t7m5NGDnY64LjVQ zbd)#hC(nCF2rPNxDvibeVqj43jP&?g^I6Fn9d9_EL_PTt$P;8?i%XV&RUmjiv7F?7jaf3(ro z83tn1j4@Onr`)%4?kFHlx8K>|c8HC;p)gk0v5`@uyL; z$IOE(0(cezZGFuyTtH$;Xuv?Ra%?`B0{eaY!QuJApNdmcWL5t<(J5pY_=X?hEJ?Mn zquk-1(jvt!SI%JvSZ^Hw#WYJ*!+{@;8pAg5Im%aRy@fUYYb6^g?o|Pwy*e9KZ!#)r z2xR|sG3FzYGxUPvss1DZ{j`$;AmrP7R*lLyuu55KyC<-uP+XY?=dp>~%nd(EX2SnK zN~dK4JbsXbfa<1t#}6kE~im!vurQu@iKZ;jv7==Lk^g`rh6}O9SKTvq0t@lcFu41}|(go1VVc*Lwxh0_0>yxcAT8hTbP$h$A?O@jmkn>f0FwZqw?|871Ixx0NuuetQQ z_m6C;&TvRnL45(EHClenQ80(V%Dv;ph%n@JLi~D{D2(>L>F=o1A3761etDYJMWRjn zOc-At+K-v+M4@aW)B0p1jcg2P1W>qLqF>t~rzNyNChK7Z9&7QhJ82}+8kxx(F>zM18_uLXcY*hWWjD3z&Q7$S;b?Y;7SIGOTBx>G8LMWkf zbTRgzAt2)R^L$MjAPdO>UkgzNt@Ynrcgf!{kCErs{KwVj;d7*NdtrMN?-dFWif!o~ zIBf*~(2AblJ6*H7hm0iyAnciU|1>BywS4l@n3GkCo2;7{Y`}zF7vTLz&vzOKdOu0z zH7oWLQ1B|3*4x-W^9&Q7`Ow?1Li#<~m66CxK3x$zlrGjuD|vSDv|q$o5?Bu?3HWtD zCkAYteT!PyzxyN%E;*aksUZA16iWp7U_lKf!I#f7Tn>Jyq)p#Jz)n9Kic!Vi&GqAA zYtuXRWV1-P!+O0pIT;Gh?hMBD_oFC?(!*P|r4|X-eld}wrz(1Ir~DgY5U~lqZ`NDq z7381nZ+mEIYO(wdsrK~(!$-vZ`?N$|rCb0{Xy`fJelpc#{K&*)7 zqZ`T&R%el*gK_kRmMs!T4i)&Tf@~xe9p{ESjvbz?UOzyTS&Hb;6?r*I^2sH8Kbpr4_z7wj{R*Y{E0U z#FDhvQGB1t&hn(QP7x6-q)0YM?|g_MIw@XQ?6xddn`aO|xiVVwA6 zc8DmCdkaxu@sopAizDS1b(z{zeQb)ZTD;Ur6ftt~sGhr7ezSjZxp-9O62O>lWicW} za~{=2`$|nlMH}tc6IEZ7e>7YphwHN_MVziQZrUn$Yh90!Dv|yZ@&2is6Pm5e%!;y!KN?r_xgqk!a~0Xh(ohcYvTNDAW2S+8pM|(tc1%@g z0le+{LP*)Q`RGQoTR^gcpEQ>Vb+yRx8%$86g$v0sv+3ij+CWgNDfGg$*h*QLsD_@{ zF^ufQu2O)oi8rZwg%2KGHS%a>?-FIRmE=_=4C30Hp;g7kcZ0^R6htL8p?R*TStPr! zeVwageHyMD8=wLhh37l9sJxwe8rj?tgZB;h>w%!aamgPn3T}5pRQzU;DKHJH;~y5| zy6#t>pO-rpZ}uVW@?DsLG5*9w^b#g_{D4|uf_dq`FH9_uvN0_JeLzC}7Ts_W=!Nos ze`^21O@X z54sDh9=n^7%Sr;j;5Fj9h}d}efcro?gL9tq6i*ESt^?L1z3N!Jfp{IZ^|Cq2OnD(C zLsU6GRhzPRs~){Cw!W&Y+|dqr$GjE7rLHOow_=~5UhK`)fii*@G^HzDMh-ELecj;A zio#6lx^t9vLo$c|*KeNu@Z8e-U+REKJM;99GDLCdNU%YyIf6^;3Au`TL5Sr!!fdRO zBbzP>G@6N93pk&)(cm?m*4|uJMqtZ%0$wgq&dKI9^Zn~xrRQvLh6Cc0_k+7x^@)~gEJb&?> z>!*LnANa10n9~ugJW^}p7^U{$fx+~j&>pK8R6`rit!G27o}vBAU5r&C$_Y@_3s@;? z+CY8d6l5<*4hoRLCycs4gIxXvsRUs^bxqn{@GWMcXEe-?>4@Lj9#EY9WxN=42lu{)2O__(Ybo-Ob50m6aq&x1q6>t0v|Ptw!^(Zhw}#te!nu{R zkb!j{*V>9E>l<&bVM-_!`i* z7n_2)cbF_<-4F}len68lT>y^h-a-B-$s&?r$!jq zKXMxERKgT)+r!^BgsItY_T&N$o_8Eo*TSB8OqWY5Mch7G``gu4n5?>!c0Sj9UJP7S z`LdPUZstwzvH2)KP@OJU{ip@Exmtv+%34*8ym&<_W`|w#)-a^$Ht6?W+1uw;QXQj$ zOWCTpKe(MMif+Y2ZjCVlV*b>Vpw67^;Zn(G`XG=Ku;y;hKSX(4j51JKHKZ0zJbq>L z;$O8ljVNs${x_<5Ue@sB>pefVVyBYwsArs~zSC!LYaJ=MuFL<7Fa?|P9?J8ZX`)-g zX^y-nx|e#liJZuAsrperO`O!cn=gbxfjTb%i9FfL1f8i~mNrAb#F$ODH#zbZx6Cdf zRcahuSCK$RyZvE}-03Gbe8C>A$Z?-y|kex?&;8o27rL{kh*$PbC2 zd?h8573h9LqHunl-mc-oRNo+D36ShH^=0O~sQQ!W8r2c1$|P4l`U{PFyd&*jl>RBy z4+Mf#cyzie*+Q4x>GqYGofl=rM@@oBNo+C--+ZcyKwEkttA_O@8S|Vnzq#~TJo{4(f zp_VURIUDpZxXlOGyEJIH?Vp>W__Ys*`m%@({`vCx2cER>^Ti1R-lDP??B<|>tzA(% z*#BNKMqYrVoncYJvkp98SK5?WNO@CL`!huH3~NB~Qsfdp~}imB`iDf~3?h5&Yq(nt{zmw#hm zU~SVJo=bD~pJvSP6~S)HA2hdTsVHq<$YkrBxr;X(mz$K`Goc3p=iZrLvfN;$uTuMn z+OVN6;2Tu?FHKk2)CT>r&XMY&O6zb8S#>nWwHCfZL6!HqmPko7QY~)ZOwJNP+mXe8 zB*2nXNRdua?1-wafSGT*p=Mt7FRG~ULZB@)>J z(+J%^S@7sc(}z&$R-aEwN)4=gF0z%Hw#O$f$dPHOtcHfiT|PefLL@@9`L>H1ug3@- zQ^EM0R@C0qKZp9>W_%O2Hw12<>ipRkKA8V4WASz)`#HRUNMPW1R5TkXdz3Y1VEx2J z&qby1SAnwP>ykwRkdyvFRad!#Rr2qps_U7Mvy}2y++}B?CY-y4717EguccxNf9*fw zP3st@`#VCe@Q%m>xEG&zV;jUIA$LB8f-04zCuae+4(@DRcf|L*snTEPV3QXt#RLY{ z#&tG8@%{Ah*1?QnLz+}?V?>0}in!P~TZBYA;`qJa+o&5ob%8ZN-UZEHo(22{anr?f zQIH<0Lwsb42}8>|qAFgl1@xx7q0P)UgQ}=yiy2tFPS~*0W_ZSMxM(G;Sy+*kBmwEB z5HicObIVRnQye;3Neh~64;(nEeYH$-dvv%8Zt?AnJ|Fg47OV2G@VM+< z==B4E`Ga-(x|f}hJ_e=7)uS{;sP;9qjNUMeP+r(MWP^TF zooS~D`{V}w(DWSt%VvYGsS#uS7Nlu3MHCQ4dHm*Tmx)}wEnMCM;dxzlkySyj@=KRn z@a*ffTV@&8jq|)0Do)OBi9}tr9Wwxo*_Z)K8dDqNkE5YO0Zx*F`V{(ybTx_)g?!c(tMI&FIGsh}rRn}K zMcgT7t_wCe|92XQFPvT0p`wCc%j|+(j?JJ$&*)ZI(Rb8n_jZhBkgMu5L_wHVgja$- z|04r&=x)8sDRb#mS#{9H;b21r2}TS@KP((w^dPam{WV(KZ>j8QI1%Gk+@CcLKM$aL zefV{Re5~{wij0nRymtO>$dry3ha`@w;YE{pJ*jH>+qn10{`=$E?2l) zfRbcSDTWi;C!nTXsFF!Q3GWE8inOD{%3RO+gdf!R=U9^%1}q65Z5EUb)*T-d!m3r6kFPf9!iKNEr;3gI2tbr(6%-^lU<_Gdc~C0Z24va8H; z%K?~ICZ3Cqk}y z1ly${P)P5Wxu$j%dp`4usV@9o@zX{YH>k-@nis2M6>5b@=(EZ-t=+F35VcB7j<{{Y zNcS!(Ht;WPPz03@V;#XVfJBBU$3rm@7pFzCxq4||&vlJCX4t*`q8HUO%m$*AErP3h zH(i)B4@60YyJVWq`MMx8IPaA;bA2i8r^mnm#7n184MtTefXZbxT2t;xLL1LK#`vYa z6czLgizEB^4jRTp`Lv^04_C_W=?s%oxTn-g^28#fs3AK3%V9p1c4i1>&8e!d24CLt z8yu4;R@gHym@uTHL{(np1VEqjZkjf@TU0h_eX+HPuv%M9WuB>*;fbP&6efjSRaGpb z(*S2y4X2LUW2$j>#6jRH_jWm53nIntu_6Ohb@+!f45Tg59QRC8jfB<@9{F;V%G2Jg zlfz`x%=~a(X>xOgC|)Iq@PnMf_VIC`PgUrU-p1BD>!^6em)+J)%P6l->)s$+kL+%-T3eNh9~m=M*E51)n8~;{`AitH#~%ag~R%hIHes z^Gq|#t^E8JS4@COv+7+QLkfQk5Gu62G%=E*t z-WP=P`5@DiPOrkh2MYjQ+xg(Xp#aAo60mDpU9AH;d+AhP7Q7`Zi9DIKU-+EK%ZV8o z=?4mfrD9T&7RuR!yyr4(wxD^@KAzw@W&zVmMSjTh+F3atIBK00?9e~IOh^G(aY zIc{1MQP|i%{;*AH)wz7l!vVd^&5bt$dzDsnsi#JBz~TwV83fkjjFZ`Ns8Z7!Z`kwAVcpGam+|&DBut zX8vt`R`;A+KLe^n8RGPlW3fEGRa>0nEh3RHTGK2dIDJuj+r7uC=Sk!UwC=KU`{V95 z>={cwkaWsDJv=L7WMBw1|Ce?)u!v0!KLKafGwy@yt*-<&PW^uW!spZ9K2i?-ApM31NJm-t9k(YU?M88`6E zz#A8~5gT4doej2{X@RdNE?q3B{#|IK3h3v|Rm%Y?coE37>{$R|*YS#g!&;zZX7kpz zam_i99F}LWJ;V~u>=qc4dNCPcm%Y^=Ksh*Zzo05gW53HIQd`JMigD!p;TgAH)#<11 zk)Ls#7jCItTdssewHl)GWXUl!UoZa2`54CgT2Ym!+IJq-0LM>DS!GoJnmG^Ye!X+6 zPsyuaQk}&!5#9qbA&*mDHLapQNyB62bh4t{UoLN=HnG702$Ys)e+5vD^BiTr(Mxv# z-VVx_#hRZ9$auxdR3>Wmzx@rlMF(EQI&s)0yIq0HfGP6GTk%l!vff!G6!z{Pt|PUZ z0~3bwB$qD!@j<3krw-(Dim3DJ$#hN*@w_oApnSq-!2zXIC{*POdNqE?RpV}cl=1$F z2h{>nfobD$b>x#bIi!LvMmbMU3q=ox;;MH;H7-;ISog0J$K|#{9F; z#lm+iP;$S|L<00B;!UtFjx>G)=uc|cO!R_OlC{ssz?Lynk$Nu+{0VoR%KrHG-@hI? z4V@Rhs2SD}CBFxNUZB3^U}XTZe;~49`Qowr*QWY>#L&}Y23(?NWW6FO6l@tn1n1Iq zSYlzYcGe>*#|Tq$l|`%XIqrQfRb$4@!s5?V=k0YjQR%{5S{e!p3wi8{(j0z2t1QS! z);@BA;@IWV7<*)G)LhS&?OSF3jg^;TRBxHZoyju6cVt*p%BYUcRlSE%&SObooaBD9 zOLfLMg8ZN%*^cLFNniWMK{g;@K>psE>-Dj;U&_H+GznxP^s!IwMq}v;2$$T+Lu@ef z|7y=_P&jZf?w0*Y28j&Q4J2#;t@;{0#h8q6FUc*|6W+8|HMY#mdA_yd_x^*U=L-Ax zn*u6J7H~0zW!AE9Kbz}7q;l!@(JZ6+m>cI|`CqQIx|FM{7SjDS!@>L`Xy&|oHjjUT zX_2;Go4q{JCdO`6r{!kY`Af!`^2B=DKUH_bZZ2Kq^Y5B)*Y!+FWY}rZ&UC=4jlg^Y zbPqmZKzBFyzNosBaVWprsPN+=g5ISEcLwYfQXGYJ znW>aa??T#m_2koDIYE}Px+d;$O%rlLt<7M~UB2>~+Htrp`p1|0RG**E`}fa^h`y8& zd?DHHQG}bN-T`Y2kuu~{p%RqxeC>cr-DT(4N*S)~SMb9~Ce$i==HFc0hn*F1eU$mc zfP5i5zbm)EeStkw3N2r=juO}$pyQr{C6vS@lT!g24(kV+`Kw~+ zx*9%Q>oj%Ta;hy$bix3zBsA@E^a~T{IK_`6GGBc*a{Wgn@CgPWp$+z*`xPS0H84}P z4>~hiE*|)yCw2r|q1I+!BiwkoB+0SuQ90&N(a$cNw6$-LDyLVfkcgX}2MoOOFp{f6 zU_)SyvnB19o8*>$4`ixr5>9q~u~4O*<{qeRF|CL4pAor)vULV?>q$+Ql!hc+O%CmO z9AvK40Qx=IYnK-RyLI9T3AWda7q1=akxljR4*$-ym26~pFxoSh zNsi=`K6}An&D1pgxgy*GLDRnx!wBaGDyKoF&~=nZWoq0CIZSq@W#!kuhkrsbXsjV5 z&XwdYncFOo$MA}0(HfR-SL zVwt7I1X^SXHBM_O0s-Hn*elya99{X(b*j!2pAq#CuyU|EEIErcE`er!e!KPXf|S&w z%}zeAf$g1ew~;^Q@uWq`hc)XiEVm5hb(8{p3*}@#9N)qCdZpq zl~xB56PM0D^Wfp};9~z$iA5c^St~O0`;4c3LTg_K0=F=NTX@MZTe9m^!#9tT%wkrd zGu%`Uw-VWC+6NPd!8^mwZaZ=@&koHu)7;bwSdrQT)EYwz=<%i{PZnY3@H-wR8g{r+ z$CJwoq1G1W6N5z^GPfisp=1R{p@DaNjv18rtskme6-<8he&B~F!{4FgQF#C zKJh*98M^SW>QAE;<+x`75N_5qXKWa91aQKpP=g`h%;Y1Me37?zE2J`;qk0y=@{AMQ z_bh6r$b=oh!a$4udlvWiPqEfCY#Ybgn$0V**N`vico*%-;(m!GsC>i0 zqYGmF`v*!&Yi=_>|3E%=H>`PR41td2_hu_||NfoNt`BIKj)FW$8gxbIENl$e?iXY21!s8U4Z=vK;#|N#VZg7Ip*ml{xc~7JCy3-^=3^54Ae~iR~hKMw;GX z&UM`sdfVJv{m4PieZC4L!l)z*6&IZM+-pmSg;yM&Bo_xcEQkE7{KYrgKz!Q?U0wmr z`%l*PC++peFNof|^fFe@Og)3IYR`mB`vG02Pp{8xh2g&K^7Plvki0JA<(KykmU6!) zbaNIB<9N+{2i_Z>HB0!eFrNAAI!0c(97dzWBnIDa7K(aP;CcV&HF%=8pSPAlxDCxx zu`^9CX0X)fsPpr{lRdE3W$y@h~ z<{&PRk>PNkC9&fS0WcJ@Y^aOoByPe^rXmNq#hG(uMZj%7lJ|TIN>nMVG5bhSM&|Qc z-rliicIe{DhvNS9b{KfwW?|-ZFLQDKuoiz)N%4_mu9_e}pZk>IX|s-lZ3gY-&9O{9 z+TwwUyMtgmlZ+S<3E;qv9!l3;KTxlfkdEvAALvm!zBG8d$|lUmx;8*q5XajE5gq?L zi3if)9n}%;4%WqmQC!X+_lLM+6~8!d?ag?!tJ&%8QD#egn&q(txE-hOsyQW#(hk^- zuq{!IVXRvwS~6ki3d-uq4dy8@ptNpWroH)Uz?>~a{q4odb`pcWHW-DVI|I=QPS684 z=Qr!9^Q;dWx`Ea^XcAZD#0CzCq4XwfU&iW23+FE~SHn^n&%~Imig07o&NvZ#aG9@^t!X?GZgZ;w}h@-6ZOXOb6yMY%BxCjseJ@o%FvHAm zTG+|lpU*ywGhcKV;V5JIF95d~R)b7^G-0sJ)qF18w0lnYw|xN@5c8K^?t|9X8EXR~ zSMKd2o)(gS4f$$IR)l;M@nVq?cS`i+JV&}j|HaUwRV5!uK6OEhfG`JCeetiriTE$` z&NHCtUZ5F6%%W0m2J}N_Tq=jXA}XrRrt<}YE0X=(!I!s2kU%Z=HDUR);L=dDkm9sTCEI2{s1E zl#}MiIk(Y{kX zTpkn}wfSqhC?hxa*_DrmREI8cx^yMPvhrW#D|$hyM_Hj<-*xMrIx)^T(Q7I-jYym7H0T zX=2Z7&RR&{r=B~P_X5~~;}xOuJL4d9OZK&k=g{JM0(4q#fQL0T%QR+YB()`~5m1{dGalJ{9Gqm1{y;3cHAX%Hf7dYmK_ z`4m;&!G9c`)Kd>1*=?OlHGJ?I$FE6yX3cTYY8U4@Q+55KHwioJs5R9qgzj^6V;^f7 z`Y&+X?xCK2a}UtBhL7bayRQN3_O~Fh?LvSRo(B;(VT8&o?Cn!IDnB5p2g?QQ8=Cf< zrhQHN0luV5&&5xsoEA_tvf+;~g7wVdHWAb;A0kHOxEoS9q0GWFqckN><){sa2A*NT z7!=RvA&}+>yRr(uovFcuGtl$?t6q&JZa@{_2c|3wKe1M~Ioac+Z|s~5);no0aUNWF#5s3A?2pZkO=GmXitk>CHJpJq}tmtNC zeYYZ6#L-Xi!Z-~Hv}Xk%6DjJRexU&ofSN(#e!%sKI2<{-2%X9HobOd8LAF=?GdW(E z#nNM$@a5GdKdI9*VJjgikP?Bm=GdOUo6$4Ow`LLiOn-E7W!*B!ie3HmVXMxTwv96A zID52q6jzq2DI9xLUz`&@^#8NPLwTL!Hb2{z1o0RWaN2rxs5TP2i%e;i{j%hk)wn)c z7G&lB7qrSY#xnm+4p^Qru;@X3mht<}&{39RQ^$TsD}*xA)Hhn7&S?&*s=v!MRD2t0 z#zpZGrrLd0;@i&?VZ}l0MTMK=;2=31Zt;3y>;-SN7c>672a4%i zJU&l_t$)%emO|GzTNFSb7Txmthw@Uqzp7;g?c_sPfyPl$H=f*!dejbdw>g^?%&F{W5;`rY;h z7o$bK;c|@5e;#1lXtSy?Kkl`hi#~g!^_Lknh|$@EVbzC?Ak_TP%CXxFR3|+Emy%&X zUgE5~Za`BiyTbXyt%l<`x#mo`}o-86HM}!$l(a+l)A8XVjYO_IWV{tJ3h5V_KIUXdxew@$2u zu%-jwvFE{}zp{VUEkfd;ZHAA;(pO~mKGad=;7QEkC>vFLz$hGd zbi#np-G4Fcz4)c{Lw=ZXf%HQP=gJ&dBemEBlwC=Y{-*mNmIoR~vc&qRif7fmT`wE+ToAJ&SYgl32b%j?U zMFw9XfT5?|CuN;PgWp+i62cL5U5BCYfOs0JbH|jTmvg(b6m&}+ z!bVA6lQ|e@^Q9OyX|JRR$9r~aXsKzajSzw9XV?c3!~M3~j!)}#FW!06x@LOu$%p^r z>O8#R?E7v%N(`cxM6V-Sh;H;2WhQ!!5(J4BWz-1ZAf~ zoNu(2@3zi8Td*I;T0Yj{<-}lwnM)3`#aCU&!V~|Ph?Y!a#Vd!$b&g+j0LW}LInnXm zv&tfZxD@?O1KI(F1)0z-rIjSLu?)c{oWOp0X11~VfdJf6R0ny5_>r5hEG5?#?HJOc z&>dJ#&r40><=Vlo#{MbpR;no@=44~`sFh}_i; zR`@d|2~C1yG_YZnXD{R70XZHYy0z`y>ASEm6G}1Um_!?#iBmuhJDoPL)_^<~x~FRq0mZjoyS(M0 z_mC1D2ov7bM-MnY6-@}#=}?TicmO)1c@8d5a4h7QF~~_qU=pS!nKpqHBdu=PT}$d- zukbPx0`SJI)^_gPSzzW^LD9Gg99WScbU7}^jG>NqzNU{m+uaG-%Jb5tL!m#9px1X0cL=zsQ~R z^-?YTI`Xxj^+SoA|^ZS)?Xi-o9oKh$>Q)}RcCO}a~npqBgS-`t?D55 zv6M5(--8GLK$dA@9u}{XZBSS0x(<16gl}h$m!bG{cT80*#QCR5Np&zo1HPrD&M$w@ zj9fY$Fq5aEm@JvQTwf^{~7M6t}qYu-z(Y9}lx#AW-CcL(l-S z)N&&tYJ<`b(!98vV+Ij3qo{w^B6~!t(a+Ey(l2`r#C_|&@UX}KHk(hSe(3t;gsLUY-Goj$OJ-X4wv-=>duT+9P)G6!v3QRMSo0eTI{zQQ+Pu+hP-J z{&EA}FkPT3t}V?z#Jm44dGJ+Ym{2gWG7FK?`&~td3>#2N1|nkw_zy(wk#x=Y)&P%4 znyBtR$X^e!*d3agI0|gbk6W3}x6z$qNn9Po!xD+@Q{wqJl>L8!4+-RL_<`NB3RmU+ zyYJ~VB&tZ}0H93raSNyXt;2mXDv=ZD#Xcs9-i4LTKJG@}EcB)MREapAD$u>tEu6$d zN%CH!?^0~M_6x^c!|@XRMR8WY)9-c%y48*cwa?R89~E+FiU6$6(dSj@lR{Jk#D{Je zz=x59Ky89DgN!tvdO-EUyYR%K-o*S;Q*ShT+U)TlFmt8U)dXzY47pwjl`yd#k=uTn z{4{u`T<`Hq{3LR1-V%hxi}qGhOL&?^(Th! zDp_NE0XS+dadmIpc;7|{LkTc9a{|SDKkx|d1CHf(Ooli{)63Dd{C3Nm2RYk{l(lTY z**qO$M{Y*^RC7LbJcFv03y`5Und=UBmCPv{3aJmrPjadFWEXF)0nZZrC^>BcMUjde-R7$$W&1j5uOd|FdoIon9N=rsHox_naJ(Mu*HszeSc*_xOCiY%@YkW(U1U9N);w66Pd_s=K? z70d!hkwKT2uPzZeby~{R&P>Bwr^t*`LFM}h&l$1DL&>%$0|?Z(l8_|oo0SlLJLGsY zASTrDffa83i2>9F^->k+{)4yjlOiTeruWr)BIt{1=c`>z&4s&HzdM{mw(}y%gyT{m z(~UF%YKnci&dO(sEacTZ^lq=mvU_Mi`(1c(fJKD#^(k16#~~>^ritcA;nwSbAf+-- zhr5xVY@iT259(gS`C>gS&im17p?e+14KI= z#4A5mU7t_Ov>~hA@7;$%y_+8Jaj$+y$F5b?7pFU|(x!Gvy6@X>NG%$CX-MAofp0dx z_Dp!Q(~G~x_)I;k>R6`_JpOcm94)RKcmt&Ew(mSm2xhew9I^d37!TMr{8>Zx%A5BP z6DfL7_>bK`lc@aC*8B_|!y;F^9GKZ|x_5nJuk*u;oVK42fYjt4Lljlm`WNkIYO6=h zlc?*H=EiHhsh5diM!tb71c=?|FS(`0Kb0mSqdnjk`b|yWn>qvGsn--~KiH8_rkEpV zZ|KBjUXV%ohH*-pC->{DX5+D>l#kVfU^=wzY>HHCFRX;I;-u+IJknVWJ7p#x{wgxl zg|u%(_MFBbqck}Q(biGq>abK;RfHX0P^zG)+*1@dNy6d8eC;+$aYAH%=6952zA`sM z-I?R3L}N5f;$}Fbw-JcNC4uiIu(`=6PX$n*XLd|~SD8D=;b|~&uY)!j=+a24<(b>f z*U2~Ml%g&1Y-FOLXH|T?YFg^f?QhPm94{TGsf5xwGo zrg7!MN@9&255u^?z-{F(VR{}Lj-~_Hjpo_Ll$wsp4*YX|%i%fgvGJq3lB*1_!Zl=4 zeL#iT$aqFkht#IqX6k-gEN|D7*y&AXQSEq1zRhOwl>Nr**-M}AQ`9FsvdinqwsD@* z*lNf2qQO9yj&C*CIZ|4YpLTJGVTHcR+;zL6*ZWnCCcE|y3w|f)8-8oMa-u=LW$W{* z9kI1pW0NsAH~uh)(W)E7mz(|u(Q8kW^c6@m(YAK(A6WT*>3q^2*g($|1r*MJZ_e%v z_gy4!f*IBR0sSEf?rtJ1P;hnug)ut(ogUfleWfIRZ^&n_dMzns|03BuI&i`~_QHih z%QQjO;>aB=Ri32hqrKZ1ELZRksIW%0&SXdUrHpczIqOgV36yN~lt;6P-O`t5PZtkn zeW>k9+asZKcfoP3>H+oTQoAZ_!t~S_9YrfVys;@CPsJ{{y0)FS?%?24jrVx%>#|ioxu9+JeGx z?R|k4hru}lGS?@7L9(AYc~Gfa;`J~A5%{R8|5aloUg8gqBVqKZm)2qg8l zw!oT!05tEXfXT3Hkn-PL!cARC7)Btk$Le6=Ebh`?H>LBoY4-7o!3_G45O1`$WAbxO z`~x5wIVnKM@q>x1!%3N=jx~7n>{>V7W;KLYfC#984~Tx(Z3E;8&x=v%_+M>9`(-D) zA4-)^)TIOmvA_7*%>DJ+`1pOCq*49Hw#jFB7l=RD`43d-)7y%J_Jp2U6&)SJT6PI* zKie5Y=ha`npj3Zc=stCF=$3pW=WJXFPx(bp@oiX zniU0IJUcl~TFrXK5DIl{pJD-Eo=d{xOT@pK(t0yCudjdCL!MU^lqF~Nv&-voee}E{ z9#7qHR-O%6qve(h#?wvt_|P-|XpYeBH)3Iu@K)3!C2qiVy@Ta$Wu&()WnAYgX4WsJ zREMO5QB7_z$f$#7@sW|2^zD7r)Pud3Ng^*tbZkur9ukhEu+$a2O%w6Uuv@ff=`&sn zBz?(eEX{7z;Qu;)#Z8X(2?z#W{zakr#6HAb9 z>!ShO?z>hws~sHfp+SHT%+VtCN6Qa62eat4NFvnR{VQTUx)uQ5W5}Mq2d?5zEkGRC zWC*FtX%VJ=tnHfFkA9;ZV;#n)#zwb2aSqg$!ri4TJ#VG*9G<-lRk6-Og}{Dn0aE{{ z^`_k0a%vM`42LENHS6)sB=JE5YG7D@vmJv)u9^^TPM5(nn4dxfoxM1nR{?T`((Ulz zC=Dy-f)fujKyUlH6wCPdWi|e?j^&`fH5M4GT94BiVCk+7Cxxf%S zz@?7!jXEYcdnpAZ=u0Mt76U!uM4$-!et^%Jj1BqzKIh#o*HJ5Me8Kf#mFsq^DSLZ5 zwURTz!$j)xyo!^H%R4}RXJn(X{-Am=`Hhi?JDnFBQco?vf|jcucKcg=Ao^#LX#AHr zgl61T-O%?@uuZyQ% zkFK@8h`CJYQC;H%@mh=9lf;?(O5i@e~~o%tnf3^3~4`6#CX8? z8S3gsr;tKXTF%84AnyIE^;ONOdci@P91*-5w-6k2`(B4 zCov|6CrN=hkHj<0lG+@rkKc_2AwJK3+Pbb%+7dnmFn^)u#vkjE@vpJixxtb=-c!o* zL){)u_Ys8@&#|)o{G!*@$a-U^TZXN_xlTX7Fn&JVH#0@6JD=CLUCCFBlww-OAN)>U z&Z%)LWgW=RyuzeTnKX6&^?Lc_hL|F7^$%>McXyl~zj)0r2R7lB4+ z9qls~TnEt>lA5bc{wqz%1>A2f7oHR}KfAhwyx0V>baegOvM{cXuoxJgtr80iddPJN zoMkd5-n{vUp8}>|X{>PmZa#Z$72wsGmN2Y1$h`2CKtbiXK}X80>s;YVPDV_}R>{mx zlYeZq6<+qz=3 zvm>G4Bd^rIiQF}Vp0rzD>@FRDzDvHfT$|QySouTPdzZ~a`6&CZ4U zZHjC^uFSWezL>gE*vY>;%kc_%_ePO1UJiZ5eU(veF~I*N!1?P`bz<`BrM7cJQM)FR z8_J2i3z#&mVgWi9Zd=u?-WdSLKcZY41Up)B9`L$%c#f6s{D93F=Cn<$mj4wogZU(l zRq4*w9>p+nH^Z@xy|d<3mrEPSznCD60I~<`f1txbZvfk9F;l;pk4{yNNT)e`V7LD3 z_X{eOyzsU&h;@+Is=lbjsIQLUMca0XQWYuVGdJYs?~qMdtdqW@6u*p9bykki+XWe4 zt&&lP@0I0vc@@S1E+_wh<}3;>Vbw!b@K-RwuCCzZBjJ&f@8sL2nD%GsrgKK+_4|$} zDqxS#qxX%mj5wwJwR8O8uz`h8p|s?E*}ip2ahV)L(xg|idCcd_{MmpK>(a_seKXq= zF*#L^+7`z;M&1E(Q#I+2%L}CsElV~=uvya4m4>N9+?P=mME&%(;p41#<)ttFztsb@ z6`z6kWPyzpeN?$+Y?S-|tsSrjpFwyrtd@Q^TM<_)Io>lh-Ea}Bi!)onZ8=;lKLryQ zEcIigbJYlr$k6}P=CnOiQBvQKX6Bg*4coI&r!Uf@p@+AU5?S_1iryHT<9=)@DBK- ztVG_csBv$pDa#c{>~NMpdvrVe}f}^OyO5=v9A68J z#q&$RUKqzq9YeG;4kSioIrG@uv}#k40D|lhzF2@Gf4g4?f>~P-=(2=knRK4GfyXU9}nbqF8 zmaEyc8Lc#TN>U4qQ(tyw@NH^x`&*NtaIsg}S}-&7!r2bj@BMcRPqe~a+hc5eaL(O) z!ISU2m#{7VL=-Icx$V8TKl*O|PQ2V{OVIaehyDF(5LdC+@5nX#Os!D`fa^7Y(A+JT zRqJ4|qiaLJ;VJBPTYj7DlGdYuJm!*ZqyD3aOyb{hm{q9-oIIMtFo7VcOf@E5$EgzCCkp5zP+U^LtOlWP}fdX=U1R+WbD^oNd?zP~tE`8H28{gXr0hD+@pr(aWHhTNH_yVx9& z(&`%f1=AaBQ{d#xGvzf8ur7gGkW=@2RbxKq*T}!9Gk)3kP-Y!A#4Z2ZCT#ggd7ID4 zH}g-;Z=2dBA_n5+&!|}baNk6Czkg*$?Cc1+)bS2nnYSwc_fUdD85V@-D2$xrnP%Q3O^}-sWHO8ae3;yHsgxW(f_W zd_q2N4;51rjc!yOe9}-8Wa+06e zj~nkC&H|^@b7$)ch@(J=F4;I?J?%=TBIt|a>gvk93*dvfW)V5{PDgqf|G@uU8@MYg z?roXr1i>Wf*N;_H%v9eFB-Phd;O=c-ejszsuaeZ(e&Stlg)44ty^0@SD#iNVL(RlQ zOMLN3#*<-@zj}eJMrHXEjh94LD$!e2WH9K3i;K&*Hh=mOj|o@*PNyhX{{m2A{9GN# z9CH*4>lvFtB%*G9g@IMDQB4brdup-mRGs3Qg&POwE$J?FOm53IDFcoDqxa}ytZ`!V zQ+W7bYP^t?Br`~AzhGpPlNm50eyDjNu8$vOKrF%5#SAJfA{>Vc!yuJOV~{48kBV*b zW~e#gXq;w@ZEoc(HF$G9E(}Q@KEVXU?H|%)_3I6<$b^yd$W>%>st&}5j^jpaye4+-Rnd|t->SlbE7vO;2Kp8#+x z*pW=l217)V@d&ZG+C61$9XW;mVwog+=#TAQ{G@`_nu*h1khw7vl{QOmDR5k_GR6qT|3L4qDiYCmS-*|M)m z{30O|r@##rhFn_w`ey3o{r%0-UR`7>jz`etx?(SBZGcyqCPBK?YNr_^&X-GDH@9^| z2HHZIw@i2$pvs|Xz)lg$d||1n$k;APZ7>ZL z$L(H#7jUS8bC@ygHj^%08_Zi2+Fkn&aTq+5wPn(`-CzzM4OIW58?Db$?%6j|f=w5g zPaw$-EVBq8E`itsPI5|fGW;@@k2HPSy$xzM!6c(39Sk-1J~H>>TLj}HW-~y~C!dp- zti!fQ(#^pNDKbf;GmO?ZiFN`z zhu5CB6sr}!ZZ@fCI5>^f@qC|ukWzSIx@Dc5}J0C=6 z4nJ0M@7!E?I-Q#MJ_(hyzp>Zrb(*zSb68_R{l0fW)2xHRCQMQ@ zzxtJ<>He>*44(yaHLXfxPLB#9wpHl)kSYjJl#Ba3+pMQa8n zm+55ly}$$j!}ztD=ht$^zdo4J8*SDA-x&a7NtdejatT_`FP)^5 zSGfcA{n3d#ZK#v=z||psmtU7e{36DEASQd+j-uAe8kZUumkP|C+hllP z%=QM(5zgF>KlW>q>#>&L=f?d_mnVy}KJ@0c-_4F@VFX+2IegkGsgLx2cAo z8#~o_Q&ZJ$rR&;5+IEiS%qb#+yKZ}wR5drJT+dn4j%Ukn4H;<^E;N15nf$!gLGeh5 zcc6|{5P`N}h4&g>eERY^_4;J-runbru1n3t7`!h`?DgD6;0;OQ?&y>}^=tt2ues+* zwX@5RoByH-6K2Z+5}=%YV`AnjN^r3ij4Dmkfdq+t;jztJm2YUqtzQc`4p(N5)C_rL z7+`;%_ccG-Rnk4cFh3oyT8f!BB!u$vO3qVXcrSOgxn@%_HD3rXw4XcNI3$^Lp1eqp zl1`0~Ex_h0uS_IO=H~YGcuV1)@SkCF&6S475$E#@4j|iMby@3CIK`6;kA<=~KpV1c z$FtF=uUd!ned)g`5Y)CUoA zcLzvp8y=jC*bjOLKz{Psq(0JB_*1Z--3U1ec=STSy?0|KMF_#NiCxgb z=MvfgU>_9YsYpfUC;M+HV$-9*TOOyMg-`c5E$WIBv>j==TPX7U(m4Em<ldVVMh z*z+{;pOdC^0;fu6%<$7mNiiii<0tuzl*t-@D^U>s6et2%trUdl6$YxF4h^7dw#Hm) zn<4KO^^yC%w)Z@p;!u{=zdZqmAAdE^s(&We7=N~m9cu|KCmdymAz0Vedd6g$Hr>w* z#*fx|PR{TrZH>{3lhIe`rcO7OS~k7t{>eE$LxYser*=@VFW~c6v;K-m&=DUeu$RoM zu_IYy=gth~D?@D{vWtH`IGM3j*;sxx5k{_;IrYVqC52S4sMJAN(|gFx&vbEPfzz@# z#=80Bmfy*D{ZWO0qpwe$OWbdXfoc7PDBRN6;b=xqmPg}j)}F`_E4QP{;@FpYla4Ix z4xQc}@UKbot~i|0C_O&z3I`TGy~v(dur=zg%8ne~N$si;ov#yAhX9?#toP?`%z+b7 z-+CR)mldlnsJ^O5_)wNbnxQCHj0Y;;@m|nXPnF6)AX*TQ77wu_{KvaY!zM|3bq;VL z3NhgXuWS#=b-Bx-r8Z(if*0_86s9sXa0o4IYy2rl!E|$Ix?eio|qlWy}gy zASlWCY9mNER3GQO7xYM@3rGYJn?QsU(b}DuOhwh6cORz|5(?az=kS0SGkzjU#)u?U z>_8f`f!o8a4E8snI8%yg)@0o_e9-!m07qb$pS^>y*5al^dXnqq1DnAoI&K5Ss+{n7 zA7DJet_XWRs#|g-W}y;pWI0RxlUyV`^Rz!7J7N8GlY5CRh?a!laPKW(qq}coluUvT z;6z`AnAY|b--GNa9!f$lHqwphhLC9O29n6Z@CLv|;~YG8$J=nHRs9S0JTb?a$!mM0 z@r9Y?FmT(p@-6xYB)RjjRdaAE0kLhWv|zb?Rb_DIWAdWGGTf%8kBmS>MASg7q#-&b zqfL9rwBpPekQRxtd`nFjJ%3yU_;$sAPu};_225m+)a#aG{4t+4OzJK5jgwB2+8aI_ z`PxsW2&j{%tB}Dq<5X>x|CJnGXJ~IPIJL=F)bCIk+rr+w{KHvuau_`;iv@0DM%D2( zKMMfaPdIQTJH+4}`^#Z7G1!0eRzr0LC+`Wj)yMnlMh1Abz0xkAJC!n=P!=0O@R z&!5_Id|buHLn~dacF;NPbU-Jx#330@7rrLr>1xLNLv-Jdb(A5Md&CfW<(3g$XLBt_ zu7T?k=aNZz<4NqSM7sogLXNna5*W0K`PyUX?TB)LwnFwUV<-1+u)hTCZFq){MCW~^ zE_O}eH4V|J8HHy~&nz*3DCVr*MqBywhidf=I2W zDpTZfc!(nBaph53N>m9$T}KfuSKvOEci=grMRhm7FrND+9h-4OOtcJb-g zr?#~ZSNTNvnZ(xl5T1WBOfa)^FBn~%$C?Z-O$ntoi@ek<1}++}eQr4a?+A_S!)N;Y zH?r8q+`RvuVt6U25ZhB%hDF7lDV_HR7BeyD0g)6RUJPX|dtz$~c%j@fFNy*zr<$7D zv=__dx0(mo)kX!Oy^yQUUOylXY$T>QEh+0e_kIf z`Cw(Kz`4FoU?xHB#Dx*X6q-}xzt#;eD0yha#ZCJwb-?&CX>u#)%Q>I1o6^9~(-_Qb?2B@($=BzddpNJO)THe?#7tJ}1lk&&y)AyM8V4 zePb#uHQY!gY^M-!l!fqmO3X7Y%d)r_&>D}VF75Qsm+;C+2> zUNxhKk24LD_GTyFWrsP9D4z*$ZoH%3AH|-)rJR0LxdTJSHaEu8bJqQPLqf){YDKD|%b9{CX*@2E&90mWf@d+z(=g^TeO~ zs{W9tDtyG-J3v8<%Gif=KXF8S{B`sAL2$H-0@Ar27_4+tWrfaaxf$nt1%&*mh11|K z=TyGzY8K23Kx!$bH9se4cz5mkIyudC9uFvj32HQS3eYGstti}^%;;2Wlivk8So@WJ zTxqMj`Int6E%?4*^&Y$V*}%leM;9hKeSYK2=eY@oiF*gY%;2{Wq@(<{WR0m-H?WVTKZUwm5cfb~v@72dFjw{+JcH zjHa~@Z~UtZ{TR)*0U-uh8}92Fo!|_6_EkHH%T@l5#ep`ehvjAyFpz{_8;yR+G|Vx~ zvAS(lw)#V3D+nwLic|!2?-tM{>&B~Gg~(4kS=Bj)SLP<>4zqjHC{@98Dj`lbcmEhH z)U3J+I#j|~cx8Fq){&Dj69*se*7!R?8Jak~d0tUsFsu6PKax?6qX48`ykLQ-g0QN? zFolyduSgkKH2z&mN4$gL15I9-%1~BD@6dY~g`fg=+*|(Fst_zZ^u+da9 z^lHd?&fF!a>4Xt~-pJRNPMqe^CjNSXqeQ!m6N#p0LI8{N^TBjWY^U~8MDSV4RuiR6 z9Q+>;xu=maAC=>qFT26$XV)`SA9(vYF?DfEM*@E=jn6hdSIpbur4s*=Kce5gbrQm) zz!Av}E|1QfjT!tBl~p?cw=0(um%yPK36kU(_XRbYcsQm=@Lz=| za4C4>R&%b65;0Yyd++Is$$vm2=X$~ZI&G?Xk$<~f--qRxp^41r#$&ZwlLE?IYueg^ z%4W`J3aUPaX%i(;Uku#c75}(&-7U6H1OCVy&o*a5#y{jLy{_r7B@yg{Vr-LV|<#VsLWIWm*B(LF$ zHq&iZInwj;SIk@*2a8wbc>4%b#4k%({eEK`jmUHobdc%Y$;x!i9v(6B9@}aAD3Dsz z*Qft9^V&Fty>H%1-EHS0*q_0lTBARaBeQIcRnL^SJAb42D*rsDGvkT=Q(}gdmnJ6lrz)S@_IQ#rspq6__^XPWZ&_EqSa~|vQzbgG zI@6xXI92Fhcp&y>|9<}mH1sKBBc!!!gq|7A@zt{Is(10p@RMiN!?StKc_bzQT|4)2 ze(aj+{cpKGZ?=y?L8^&NNYx8lvRAm$CehUVdwi7Rz|c<6qbuHaBG4hGHD%U$0FJTL zH}Of@souM;6EmJ^!A)a}D=4y8E(cBu_Fma>+e`I3?eh7Ebv$~Mh41D~rqPdq#gqD- z#-;zB6T+3DY%l#0+J%1RW?R=43K?5BQBR$GLk5SHxQ{Cx{@sudkbm!enon7R%LhGW0DaC6za7?+PUme4)>2ZS5(3YZ#@eqNC`OJwWG`Nj){IYL(c*C_!K zCD5Pw;RkVW#5wJda(k7wsAF$G_rU)ebUc+2qo#smD)ap$GSPv3W&qDCQ>^J z8UYVG0bHg6uYq zD1c+23bP7;y|4;Y`)zM)NhBGRUKKOuAiUGD#W>OQ5zn`SyUYUUjgXV})UyU^#d$nG z>|(>Tc-CeKo*E;9FBqhoZQXhTrGkvm{Er&i!p$mY49pdm@Ma2!pT&=ZOt zHO`|fVBVVks@U3(2Xxg`YrdZ~*+9Le>4&d%Q?`)JV|~RQ;Whu(ARb{k(CHBC)2Q6^ zK#sFz^BtI4l&)>03s{6FcHKDeMAee%Soymksf1?sHS!;>Q9wa)$)I^4#ft`XR@L^p zQXHcDvmqLln275*9^Cf9PARBa1&&_fAV?Zj8@io+L@AWgDtKu^`*2M))E zHrjX!$@yOt1>8I1u%8tPYRMC(dHqG9NZ&?P@|_)W=o!Aa6)W$#>^ME!CPWt(FRs%k zEdM77`QmCe;2Lu3W|`j3NQNdf(X7Sy%vQD2zWj3Oc^BwlMkMrdcVZ)9UcFMa3wR4C z%p8(&)xi_G`pO^l$>exwBPCrpBB~7@#XdigdQ{w1s9D=irK2ru_qZHDY>I!bCx7=)V33f`#F?8)Y0oZ&xN_iS90W zPuXspAn4WKf@~h;*Nu&>@f)sz_k=a3!XDp_9Ri(W41{0Q6jwVSggJN#fPuyUqH3uf zv=1cku6@fk7#Ijhb52-)%C;}KPk+qi2yQydq z;EY)4p3!^zt=-X7-%E~{y|yiSh-;_s#}xM=E$ttWK-!v*LXl!d9Vb~~9MMK4WtMv( zS>Sf>JV_Uwq+G3Iv$eoS!f)Q zP;X$7L#W_C>T(a{d9aq)jRP1KWOWAw@fv`8E($5JlW>3x9xkNoCHjg6SJ_V;KiZn}NvdRBkvoS7|M7gB=(Zw- z-=_zjiu5NM?mm+c{&b9}RxG;FxQDk-W7!|0R7anH{%`}$i=y|X5?hc)^b+A2^Fml` zNoRl_==^Fcb0bT|?dW?R>usqhIcP4uj2iVu*Lg0bvOA0|j92KjGrD=>I>_sXh!wvZ zUMqUrw9%dWy)bZHKF3BhnF`}d3SDR5>?p0{CCRiG{ zEz1;&R#GbW<$8%ym+CdtT+jWntJO~AgufX&RrL@TS4w{33+}hH-#Xk=n50*|7L`4< z00a`7*Z#SV= zcTOuXPq0RkgUUK!uk?L4I8Kv5f$PUz9e@p^PtsN(nW&2abo3U>obaNnNrH3G<7Ia@z&AuPqQV2p2yu+BiVkFmvBFS3 zqYbJ1gJpt5_8v-d!7M3Xg^)mJh5_iNpmjR~p_N|z(&|M7mknDenzp0bUVt9$)Rz49 z=~D-joDnfOlDUcN=;5V3fIuj9GU~Yps`ghq7gMJ!PaK!MtX@ORueheA&IazVyieB` zoKHKR6X&w*b)>#ClccYl#+F3BGnco_a|6qoqtp~;>F>hov^UTRAR?(Pf9&z-hbX2i zYa9&lp>358-m=$+oAoH$Rl7K9tAuBNEWtDgX`FM9txxR9?n0Kl@%TfeQ^4G3H40Sm zDuf4d20xda9*7Q+t#jN-xGA+gT)s0ZQi$NI(hkCI9L(4zt;-Jmq>h_mcGgH5+mcqx z`&JnAdc2wVV;N`7wgCk0BlFbZ(Dp$y-iJ+hrttGh?!0f1PxoB}GmXt(J96svZ>cjQ zo@dCBD;=SuB6@)^Z;lXPTIKmNo)zy@*KVRTyw2t!V{Am$_iKWTk&eDsHP)b&M~V)m z^T%kOv6dRBOmF}*v9_OG7UPm1vLaw0QUB0Cx?OLX_F0m2irA6NEF2iJYEC zgokKDZ%z$b1nwu4>I=Qyh2?J-zzBD9+-m%jrSkQ{Q^3$WZ^-la8?q@-Him{rx{jX6 zrJSSUg)ZH_R(jdfTL5YQ56Gd9ZWHf@PrubX!oY=_Ga-1G$40N!+y4Atv^Lv3Ng94! zhhy$EeIHoXHkxjw+SoA!dWmvqjDTub(flq+ZkdMO z)u>2pXpwoIAU!Jb?N4HeW%4Lx)%R5(?L;kXma-Z0Q~P(OzY)!3bfwNOa1nk!bIBq3 zK-J?$_1B%mN=xQf60`{m|Y8CIwh#K+C zwM)*)m&f*qh`WR~pPJUZWOGO(iFtIhZY3-NZN#h&qzg0dPpfT)&nXN|@d?8AB8A=|ix}b%rlG9QUl#O@IH}|ooXbf2hLXmP4iOfDD zSZ~Rs%vKXo#j%k{Zi4N1dPcuA(z_4#cySqWDU@>Q z&d?x#;()lHA%|=Jx<6+Ma41P~;Hl75n@m^ExW)(gkJQMdH_~9FG0C!Cg+Ci4s_eT! z7(FI$G0s*(AMb7bAs>OqF-x%!Ws}E#g)v@RJg+oTWnwddUOyW%@q%RgM+va!4OM-; zxPp%(NN`0n2+jr7=1@9xxmi);(9Jxcf&}Rw+P_(%W2VdpRJm$8zzDPh0Txn@0(TXj zM&fBwL9qiBS5)1gZ&&^gn^Bv=L^Qzsn%DOb@gJvRv#s^q4sm3A^)NZ-bB)+^B+&>x z@Se6%Ugcn7Q3*2pvpVoX_F~Q0o+eK?mVt8tr7(h<@lt@m4ZSEEolodXLID0;0u#42qwBV^jY zzxg{kQ-DoYs7#z`aA)74R=!cc?*ZNR2yS8Vo?7naQF)?>a-rXwW`D<65j%(-SsFmV z=h9dB)FFl!iXY%rN(BKsa-Zi~TZLv5ZG`Yia$d1^hls8#{3MXEsa`f3UZHXKM4pv1 zS1R7D-O&=wKfQN~iL;5!x`^$`lfC8ZH%q9f!w;Vd|HBX^gQvovDa3Xh2T(`%gxC2e zF2$X7&1f>T&_^YdG#E80=GF=>5`#POdje0F8W1}?xb^+O<*C~EHFP*|3*TVg5LX>? zcH<~qAirU;POg~|n%sN=m?z$7Bm}?3sPN0Ct$ufGAWC!vC`MF#PuuCWFQBVMl%g#D z)D!j{5|xhBa(xPBS_zTNAxw8(NI{L~tNk*qcv9um#*pVenQ;$7!Jk8L3X&bCfnFTI z7BCj+OL+p|r`|t;7~8m$`xoe15NjoUq6qoS>t+>1WuhVR z^aEHfR(QUH#&6jhrG-1)Aa5C9gS36)C>Jlrq2e=dA8%$Y#zJ&{evMh@f7$zSfti#j zu@)ox<3`~z<`r6*O&VuNmw^HWjMyexae}x=PqNQJ4*7STtC|k&49j)_SPx1cS;|8# zp~q-CJW@2=1Xpo~3{Y|oF{!z*4M8G;QbMf0`CMm_ZWF)eV9W)59!dY3iX0`as2D%| zKpmD8JxbG8^Iav{Y1jG*52Og`vURMw3-eYtuVTge1)sL-D0l%OggWl8r%3HpriV1m zI5S-rd9}>nc+fShS%f55_g}#4j&cK~gKQEAyKt5;r3AjrrHY@30g!4F|>O>7#Dh5Fw&QH|ww4^(%RQcyT_+FpcIB(rs~jNJC@j^^^Iym4=q2 zmcrvql4Eoud&(>8Z$K^Vu7Of3^6|2fhB03cdkR2zi*F=W6?5V^>wWlWeKLl%V~)l` zwRB}}bj?$BK!aI@Eb~;wF8yn7Y7h1Pd7cn|GMY0ffFV~i^mDeqcW!<+2@BYa=rMVk z^)&-1vf9HiKwo=({(~mYh!{$jf4r{D0iQYSjFycwWwqIDAar&;u=g$Z#Q2*pWPQuX zc&j2RUJk%vc`{zR22@$43=DVOEL;^jr6f`U<(}{rcDLjhue0Lkm$J4;1W7mmJ9mPN zH^ka!KZB67e=am8__}ObafW_G1#k#em*Mf{d=7KWRo*`!|E(K}dbcw_K@$OwO%<;wC>%*|@AyNPNivnOy9> z`x~AKP%$dCx5I~e@z}8Uef^xdtOFqo1fJR7j<5Av`8bo0!}ryC{7H$Wy`U?hamyr> zL!f6rWYp<$6N`L8I{a?x6omw0?v#;=LNUxGC03YpMe@tH^tqqcOj_E^y|??fiy_%zZL0u<%&0yq>9;xWWmJ`Q3}dTO@pBw%4;_$kMEarl&$ZGO z1tn#+5{S?on_v8655;ngbQ!v#C$k6nO{(2uk%j(A-I)!K7;^M?1imUf_EL%;_*zs} z^xE%3;qR!6UaviCPf7mfOb>O1EXA09YG!p>febm#*0j^kTzZyCW*p9+@*+1GKV|%H zljd3fu8JpHmZ-+F`B8Q+zf7~vaoSSz7>)U5a_Qj#>N~5-kJ(e;L>}JqL1HTZlefQ zS_iVq8X2a*>Y}yW=5LDryi)u7X5!W{t`4^!Fzb_*YqOgv`tE+0rL9>*RnjMiIw{tz z?ECSYe|r{_CkH;&Z9OoH@fGIkMShIW!)w+itPV2BgKr>}@S_FA_S8j^Ox5WL>K$78 z_P)ui!1Qq2Nk7tqOG}dt#A0UU{JYP&V=X1-3(31{8{=j@#V7s&0dHjXgsVd%WLOR$ z-B{?q$tw#*9w=DyRw=qm?I|t?c}YB~2I2Z$k0x-v+;dmoyw-Cjag@T(0Qs+$Xt(6T z<~7&I{C1UWPYmx2u@RnRw%Os?-zM6HKSI&gj&WETl3NFg?r(rhl{b_!NOm@Z?>8$X zeJ&<|(@t)5;3v+nH@ouiW~W-B5^rO*gPjT|1hE(viSi8J&Hy13!yIswH%n|B2rOek zD7kWG)R=?2h<~)|(xJA`=|JwsYcPcT2Fth4 z9YabgjVMT?bV|$6sdV4(_I~pF{N8_nIhbS5wb%7oYn^9(4i$t?uG|z5(<)HYl+f(f zh*y{A+6EJD_b~@2QO6dPawNF%r+nM4e=n~*ubsmJ7C5hjD0~kK$#;)Nh3<97s~QD* zIN>=e&iA`=-E%2N^f~{4mAJ`a1Fb@_I-UqUV1;!Wg{+*CV~Phw`dD*J>E@5KD6lZYg~$B;7$da0zt zh=mC*MVn7_l{gkZG%squwFw62*PIuks06;d$p%FW_$=qkvXV&Gslj)k`lC*pU1jMuP3{jamF(&jpBpmzBH}?ebuo^6AZFkO zkr~tY3zWx@xZE$5df;1_H#BMd4z^tjyn#MaZ-CE*H8!6K#hW2KhSt+UH+{*c1Gs|> ziuED7=&mnES?klo&$Fy3Qc{u<97aCOmg=t~fzp18lr^(G!DMB6kh}yOHtjJsS@nGF zC8(f|vJ5q;CHJl?n+nx_Ay~E};hi|%yx-6}SBw6O>r-Cip<3;vdP{J+& zdYr-sZz{RX{hM(dK8UOvAwZP|jUz}0_Y)n4DKG>?+Y04Vk&KZ1R6H9D_p!;s^nRzo z!QGIt$!af}cz8a$%j4Dq^8UbF4N|jJwy&qrACgeB(y62O2p+A`AREW@M(o*Is z!dJx3PWm@ej8D*}sG;Z<9EutEdFEN_&`${p>IA8k>e3?CH+joG`>#^7NMn|($=f~F zi)V?8nW&{aN3jv(M_e{TVBx8HqltJYv+Yi1ttP%h#Eax*40hDzk*6tFQ%o7eAEU9C zK5n6M3)+@4>NJjHsIFAGY#C#C@q{o4-vroE@@MT&hA?P56}V4^APi-30Cd+QvB1aP zQo(SEf+EU9KCGW@WLWQ?#$Bqiz{XUjQDip8z^7#z(l*YBu%Scw)JP@7?`V4?JDCjn zAX5WJiIaKRH>cyCV&NB|6zS7n{Hrg6=EfG*t7n@bT12Is;@uoF^Alz{tS4g)vm8tsfEv(EA=X7n>l>2FxK zZUB`COt*!%5x~my;j6$K*7LhPz2r7?*KHPnsimfsWDjyl#pWO}qZLw9C*aCG6R9k> zpsqh>4>Xxa=q;U|;`s$?aZ=c##1rU7qxMj_2u3mh1* z$|g_a`{NDqs*hy(1JHH8N`b5D@$>z(zNyD0tA5QDk3!HW3+ym!+2E;)g>w<7aU=?z z>L}_w;YJyIqs4161#H9uu7^WK7#z|YC_lLcuc4!HkZ1$H|72{4%V~cqy0;`GG`L0bR!S3_mjj> zfy)u*XjanJLx@LVt+}==H!{INo|=a~7Os@6L+=4-fkH~%s*@YDSOEA4BaUBwCggU~ zW!-A01Yo~wn)h~+#JY@VVjL-V#QNh%Ck_6Tbr+xHNXdo#9xRKN7w@G@y|*VHmOX+o z7N~1Kk|1(l`lW0Wt+HlBi*i=}44nFMDf8M&?#FVzY7-iZr43Yo;$~br%Yti882Dax zsAW>s=cc03W}<-N{4Y=`7|`I(1A|Tx;EreWDH04R*&ysue;gbq<9U!}QDNMWrP@4f z?IDeX#~|a8SccsIIYZ*y^r#T(HUI^%h%)2X*B^Y=Q^Y6y_;%zb zOUxh1u`Ar*OyeMO(}e+qiGVOzVrC_+)xk8ao&sXSoTdTNw(Eai)D}Vf||XVg{hs znU6!=ca^+|0n=4}7J{KT*!Kp0H68Mjb0+}sND>1^vK9dvwg#+n5r0i7ncQD+DU7!( zT2`JTs7!G~fInhQ!^{wmkgn#@^FCYZ8;C`Pj4xO6GWHlb+ma5eQpmfJJ%KV&O;P0% z6ih|4v}jU=Q9nXOwAkxhByNELqOT!|_32MJNjcLRr5N?Ls$hCF9P9=cQF&_!TwaHV zUU|t2i1s{)d?2)+r$Jk>X2?24YOtU+%WlH1_9JvulxtO!vfL~vOG+$!u$YM?@-(#b zOWG^c9&>SEn(Tw(q!sa~P;^WxP-ZWF5Me7$4}W=zmof;TvWk`9)2^P|zbmny_i7M{ zN+`*AgYL@9rLNUbZS5B@$>JCyp%#I8tgVwA4UAiwVY8u=s1iHAXBF(T4EXu@+HZBO zyVzkOs^gl{SXdf_wQhD01+tWQe?S*Opbf?x-zMXfc3O_S(Kb>F&tNGqk0v_8jel4B z@}Av^P~C8I?SXEz29-i$f6w758lcH^pulHoL2AwSxpB&=pj4626UGxx23r{mo^MCz z1S4}315+1?x&&C7a5ch>EaL@^&r33~66&|(Q@axJ?)pRMk+9My%^=JCt>SgR1d+%) zxB-@#NbPc{p+o=&DN-=?+UNoR~MS)`!yRPq^QloowoDSd`2Tc9_&7MS3f zj9F+NqCe{;+n8QH)!u^B>$%lXY^>#*cQx<2G^gnen}q$)b2$zbOH;1KkWStXSuC>` zQHI41{gM;8nSEjYZ0zyXc!%fCI$e)Fu=qWIc{MFzw7WHa^6U#IX5!1c_a3o`BV8xF zj#vV&EA6sg9B!|$uKnx@N@j=Ma>vk5L=v!L!;+UPcLY~HS$-R&SGjY~Jd36z=Iee( zCi(lb(s488?ga^qostXKju7jZ{NA9V30)m4lY)&XtljXJ&T=L~!Ia^qJ}GhdBIF0CMVNc?rR zQ`QGLI0>dYH0Zf30pVwMs%Lik@e4nVsNFyyR+^!qA?6QB3QK2ngpLUo8n_APwv^Db zT3^PpXC<>|`;9ppXqI8Q=M`;p%4PO!LtTd{QnJNwS;P$BUQ7w5Ibn-rP}Ja;SC%*9 z<9L*4wB@Co#9FABPK4XhIM6OMo3~L8-LbZ(MNht|`-1ZgZzk%iS&ee}B_7CfSm6&l zcMcZJSfx3%GnVAPK2d>UC`9KAF)i(e_WUONK?oqjA*(T?9Q7>&y9Rc$qRuCPr#%qi z^?AS8iSSi3@jSK~(Tf=J+Q`jOO|tZ$c3 zhF9=gIJX^lqlT`F50gEBH0VQOP?Ac{my3gd4URtyEg^5k7o&T(GH>4rLLxjYkKCXt|G#Pd5{j<^I%d zwr^;1BT{jnk7rM&Pm|s3URy6s56OTn&p)Jg7iqh>ss0pavf#JyfmpU6#WTab?pHcx zKr@lkt}o{(fHgRnSi6Ye40qBCkXd$8QdbY)+AWk%>%#B&RY)1+ii5eY->mkv8?F;M zUkU9b^Aw(eG6CP2uFKkXysu0Y&e$p%+DJ*V5!W*% zP%THs$vQSNMm9-o_Czy!8nkA)%7a3&O#ump-Lbo%fh^;-YWWuwabQ4NE@fBKYWB(LNC5odcG< zhQeW3bVL0B#Stq-2yF2|2DQGlVQSA^ja$-G8%*dWBGNX_J~+30Mm3b zSQ1rMP)&0>3A$fDjw_xtw02pjs=+h}B?uFK;I%Zsp{|?a1vNgV-zFm&yk2^FHJi>P zy3uv+!nJxrPQu=cgyQ831~vvmXjP5Wu-*iCC5#3)lu#c68`M@eN!&$FUF~s$7d`fi zRfyW7Hn<9wn)^Hs#%T1?wF72FbzFclnJ{=IE4{DJ>6a?(Pcoj6!bld=8TF|rt|Vmc zcbReo23jCb<|H61P8uMaBKn0q+m#8kFk4;T7sqW4N$LjL=4=_|KNXy?YDZD3nu7;v zBI&{v9GF;AbCHuVQQTj$#+XBMogygPJg^ z_U7&{P~Sq@fCcBqJ%}L&`-yZ(<>7$X_Dc3Rd^%AP1J`qax!fFKJnB34(;#=8G=3mS zxxddy^ip6zSpAVwBz(-YKL>aTxbU4J#SHQ-ir+m}39AvoeME^Z1Pq#?{5bGMkP1p#_E!!oUUK&ckPIb*=d+C^5)#O(pogQsd?^IinkUYZ==WD|C2Gve*p~@K z&Rh=(r|5?QZgbx;quEMQ1{T=vt}dCB6@JQyre&1+kN^!zHKjU-E#{`MMMY6>K@F}1 zSJ%aR^2nBC_b|04QXK{}H+f3T>lyjRBhGJcJemvx!44`8w>+wNy{cJ*T8X!j$ux&E*BmJ)xXcvV_W{IqT zdPknA67R!S)doT%>GFJSD@iG;J1Et&tFm>rWST^x>KVu5DPWOMOi=+(91(ltUDm`T zM3g$}D%vQ54I#TYLj=oEvH+f$WRw1vjrRd<<*m|qv0LF_sBX-v>j=&beR>`$k%Ks8cXUIc8?|9Y-lwz?4l3D-bkG9#CKy{RQ;>+ zT}ZYrl`fNBrdtrBk_-K?9OGnZQ4>7o^{2BnH#_;%T1R~YB;gb^Fii++Ck=jz(>Ro5 zkFg@;Sq7~Y;Dp4#jK=6&d7SVDE>4mqFnE|Soc0x|A9>xewx0RK+qtVyV;l@p>Fa64i%xqn%;zCJo3t2n|7LxIc|{_BX+WCd+6{5;IP;K> zNIC5^wu4c^M*{RGk4psZ!kIPRx!ITro*zpx6@S{HzPl*HHu}cb7xC~pG(;~_T!L(h z(m|k~z-KobqhA1g6w=Rir4DDdRRqQ<-0Z0g2H$fKPsRSSd&!!Rnj(QvL&=vjk>Lo{ zrCn~2G+USMMFPA^942oTH18cY7ke@t?uj0 zXi`#xVh{ABQ)ud`<61(-@Aa~E`aR#{m1J>7;@Af=6kP6*U;xxdOoWX;j)Z7#QPLjq zm7)^4c@uDAl50?`D+t_-H==;LhD1LRq^6(@w^CkqA@Iy41Jws9szsJ4{I-`Tkyog=_bM*&tj?=>5vTVmS|!n~Idq zv~d3k!;YZ;Z=l?c$C-h}CN64ata*$W!ZxhFZ%Lw=dKX>3Z+oGpe&P8wo&dw4Sf*Nz zjqBlBb_>RMQuFlfj|7qTMku_!Ib_?LCanX06O7qPTgNZf8$;Dm*H9W1_6<&Uto`e+ zJn=F_nWyj&9|mrFc3vhE?i$U97d6xB+D`cutm*;048)IPd@>oZ) zeD>3-mvxs3>!_2EFMbrF>Xds~;fKxmHSp!#XNK!*F`Ku9w_6{}tN2sKPs(E0g+KQc zI4p&x#Ea7in%&zMyGR!y(XlYMwpYm;iL-f}SAlAQ6Mhdj=$jwi{^WyysX*(q0hxQm zl&8gG^%sbucsalwhww}3J375Bsk^wR5SN(VT7AaBH@t31dsOs+q1f#~b8`FV7#+;D zqrO74O?6j(v*+1+wzq=xI(VJ)8_olrmP|Iruw0n$Suc^OZM-Zi4lu=CS)Ju*tbFUN z2~}_*EMfGdQ+$U@UGCm8S@*MGQ;e~KQtBG6CxT;;=NTfmMEERvs3SE7=dGKZNmFXE zBc^-(J{DnYGULk(Ze2Y2y-SWC>6v;%C+ zvWZdl%$)kKoKggSaQP1sxwmi$s0xLD!7pGE3#-FK#bgw_cTi4#LNg$+F=>YY zxp~tP^3<4N;yqtg2&DPXw}a0>cqlOa?>g8-{lCr<*}PeJVS9 zK}fW-D#aekj@W!|``|W~axxSFnoNs72%0B>mV20;Y)=m4N8ydXr!5LIDmJd&3o6Uu zy{Tp?@vKsbzpk%U&7&oW>cK6F_E>dKpoyQq<{f~lNw*F|fL$sjM=gvc*Rtl>K>czXnpQ8>Bd&UQ_fZf|y*v>?%}^m9dZ0TXKCBV1rN$Qig}E=hQuVVvK8vISsN8(oFK;6d)=qd{KwPYj?bFM62}9d$AcI7 z!t3t70%`}vi%&)INR)jzd&Jo$uAAV1@0D}be16Ale&m(M*-Hsj+JS-ZOiSQ%geU{Hh@WmF6&BG`-HYEq@^Si{W z&Bzj?#Fa8B7g+KShV(Q5Ixr=_0L&Wd7z<80MjAE|S$UM*1>hLlK-RfmX_3O)=-(_m z4AaHN{QwwhD3}{!;S$_bh_H|`11AQ`H7?<7!&GW-5`RBH7B&xoAL=L%26qoQG!z94 z9^Xvkfx5bP$H$e!Fe5Z`6Lxik2ywg5kH!0)j^rvTFopy@MH@*Slbj9$cBm6scfJ^) zII#8jSs~8~6$n(NR)Q^%_FcQtIFudnfPysr9e7}5ilVT*ViI6qs42N`?nMR0ff&m!AhAfM@3N!`*X|t>fE08EuoE5W2n}6k?|I+dLxlwM zi9tfmd@%!^1}-Z+e*SOcnu&*QlZD&DNZ3U&6OVFd2FT-BZTb6%JO~F9sZ`NHHQQVj z_vw7U@0D2-AEOdv!xFX7%`YP{VIA27_Dhz%OHfJuUj1szGWIlEW+Wbyg{90sy4OZx zYO0hOIzahyYFF}EktN7>F52pmx0RKKcv?ti9b@6XQrVHjQ$X;rEx{p4{6aLZqBRRU zGt_78RDKdl$eL(%8~AA)pKL|RU3`%v%MZMN&z6|??rA1tzTk|Aq}1I61-oCU1FpPX zqH8aZRqkEBe3EY2fxn-f)S#3F6E@RkGC!k&()oDq#!u%Lrls{``@#k!qJbx6cLKKI zdG}kpZH%}oYrBwaV@Qgh_~hd3W}36ZiX}h)?D}mJm3zMfKE+J;fLJ&vCK5z}nXP26 z*PPHwD|lX(_~@r=Ib#KlJtq?>CLN2W0te35>njo8;=U(%#i6nr1iJI%5!$|l zi~^&+g*aQr10r0pYRp`@huu6z_T>2%7{GKB`9>>CDaf|N`+WaOCu&KV+&h^omuo|7 zh|q#>Kfw=9!jUY;vUI04R-q?JBo&3$ZJ`GY#7S{Bg#1v12> z#$H1_2PhsIYq9mJ1`^ru+*>Tge;9>>i@TV3g!_ z`BAX!OKIt}{-cKrc#<|VKKZKsrXO70%}F}Y1-qin9*-3Z^NT_2aG#!9xxj!yqGIor z4WqLj!`Ik=J#42$aLc~9G+#LSJD2HNP4Mngwl0YjnQbEXr+6XFw&#qIG@l!5wJdn} zh1zM)W{Z=lIY4};VY69SBW@BGB6hq|*z~8-C>(@J#6yKDlFh1r1Wnj_en<+@FTk8{ z7$aS#_dRPH8xB!E2DiWn#}XBfMVRmx%B>tLW&@u{Y85~ZOoGu*?Y8Z@hEu52hDLEX zaEj>7Dk8!WBS;-+GglRGK}Q2<#~Q#006OylDy93tWV{)pKA1S6hV%JG?(aTHaWQX+ z2jBN-;dC8q$EEGsw^2X17PEjx6$ZeFxRDFcesxJGGmzaPla2}S|! zh;Ipn$SB~?j!@uyNF8X`fB0@PJ~@cE$MsnF-#5r$0WH>NG)4J` zF=9QZMSgTL`Xu91vtL4`aRwZjJ*mFo)pWi=n0o8~ zkoZ0%ey!SOWG95ucCz_vi&%R68^*^SNLTK8(C>w zMZS5QI~)@42h1d-*5 z+?_R>{)@u^&+M==FNq|by*ls;@)xL6-`tu_Gp3+-@^d=CtvH(Pq_)yJfyywVx2KE> zdela?y!M;hcWeq`o;Ebji8b|Tep3AP;TP%>3BNnABne<4jpf_&`at$DgPc)JbSz1}=qZLBHptx_j#9>#{6IE4x%FHPW3$M}@Zx$4fCXKb1 z3pBDD)JU-9=s)}d=+Hnb?SJXe7`ONYw<^H|9njgkBb=HA{z)m>RjLOnWyrkV%xEk8_ z{cc7zh$Zh$XGiL5C!?Rk-%RvW-X#iz!`| z{gRL2ch}a(015fqGo3MY5^_*tCw2{o%ztB{?cTa{33QFADsGqZ3zRbrFX$QwiOv}a zIhTc5R5^q52Fe2L!ub_ghmA%!Ulr1E}Jq6MWmRT8;}i$_o}D7T7M&<9km_x zZ``$7%7qW_PL_kSaH9x}K-lNJ@sD1{2~;IyD?GPt+H^K~3!gV(C3)#_ z=V!w=wTmt91FMrd3BTo<;WfX!LPo1AaBzJ2ZJ6`0vU%y-adO+TC{E5fOaVT9?&>%F zKWl)sp?(zEeOJw@tN|DIg1X8AO@G7tOoz@*0#y8_8V35kEjDjxfrL#>Eb;x{2)~2> zi|~8Sr=9GT>15pn`aMVX>m+rply`VRx&Lz0YX$&opMB9_*^oqV{UACF$#43?V|9$X zSbFBQ8zj1=yy&LN$4Yw7a&HT<{qi$gORKsKK&Bhm-P}EYb(ET6FY?tI<`Rnk^Hut2 z&m8nGP`HPTY3Zjr|2F_g#(F2#ni1z5*`}+LLclfd4BPOid4l`wc-xlx`lNa3^%oB3 znjB7`rD~Y#bV8bTBp0-;3!VJZ#f`O+EK#Cf@*A|bmDif z5tDvLsWs37d+408@{UUYepT(b8YDhQv7dNT=RYUYw<_P7liV~nieEmvhO*DuC+$Di zFsB4edfSUeHBUr^zr?e$@*}veUP6lbu_4YCO-YPlpKhHWm}lHo8*ET8RWU%Ge>&vLE1nS*;+s`cyNvM<_I zB}BVL!IqSJ?m(@7$ea^b9sh!mc$-)P6nd)D{a5+?O#sCvkoYgqq;B#2eo;}= zZyotjM6!}AooX`Ib=}-#EZF6-x52Z6f)N&I0RqvXaAd;k^kxpRq+nfP&%rwS&0cF8 z80v-0d79{~G93oMYDQdgXPr$ub98@vOyVfnX|)a0CGHDgs8*AQ)C=H$NM|J28R~9& zt~19INNMGHn@>Iu zXgC%P?D+{-3^H;{aOa)~hK=)jSQzv3AJihfzl|W;ULT!ua0nUPJoCe6PDi+X-_pKS zJwm9Fo5C>jv&cvEIXalr&Xg;8H#X_Kl)Vi^W+TRR1f8jS>mV_Y%8IC&q-^O4O^4eS zKUWH@mb@A9g+Wss9T9b%NyXFWhOfdq)w#X92TYpsuG0=*bF8fBPF@^4D;LM?6tjG7 z`PQ0HR32AO<;g_Rfml#&SCyLzl2YVu7d(8de#=vs{@s>cg)3<>%&6XeFK|FL9D=hL?nQB4m6yLQuC zd0tljAsP?;hiJU0-Z0u_o*~-vg|`u4lYaddoAh1DBQ@%fQerPAa)Z-i2%t z{;l#C=mp2hsu0J`55FhRz%H&RV@^oQJ0TrM=YJnxcQwt;PUdlKG`{6FjX~u*8=rR- zyi%4(8mO#;Z8wnP3FD`VZ*vQCtC!OjRMsC*!;iQR{RiHGdtbYWg0&8U#trf z*#t&N#B|%B(QaC>p?+>bziAnP_X=ehlrnCH z1n54af0)cQUTKFO|EQqu{;r_t)OT)MyJ-|?(^~ldtAeUXsqcl;Q?3CRa%C8-PvN~W zi_3~By~9`MLF$GpkN4pZGj+2g|5Y>*^}XhFVWbYXm2^RnWq-66ax9%)If?yz)d!GK z`Koc=^l7_@k6j<@Dt9m+w-~aVDh#pg{tc34it8bez@4+-6KyO}*D{(=W~tI>;Z{Y| zcz$pHv2crCZ6E_IBcS$F(!kCTMXb;D8#fwV#Bc+QUe|H>n-(H#dzIOf)y{U6l#?1B zb^$Vfp|z}t`#9VHL^>x@$pfZLkQ9n`6es&d;6Le<{3IAPp_Drc1U}xJ* zpK+i0#_#w{BySF@!`<7IaaV^UXsG-*e;l*%gZw;T?<%LB05(Pw#}PbPm@l%Y)=$w! ze*rA+4b^|~ux-)Q?0{&8h|`;$&cGES<~EY|-Imw^BN}+D*8P5UJl#b-j4Z8{;%VYfq{ z7bl<`6~C)oLhtuQph@K+esT3FcLk0M0Aqf6!6~o7)7~|p*ypnFr2Sn@GqT`7%|0xQ z?JK{nvNc7wAQT|#k_%P+4hM`19C+Y{{e_RM18X6FINY32+%X!FN|HeejP6m9O7193 z2r!|74(q1vd`Qhkx#|+l1QN%$YH}lI6uj0TdORwS9Zka-FNgvXyWNRaEcGzBBTz^& zel7ZtnnM%Ox;QGZUe)z3DJj9k{a9W;&P_00P&-w)Ru(xoHyMlv9umRiMO$)N3LEPL zMWnR)dyY+3GNe#_54>zqv}ogEj5t5kNb8lo%O$`kMyXaI5R9gj7(7fCoFVBmO6dkn za8yLGCxUdpO6z&yeK5#Iw$WD>5b@O{nyli@HZb^;hasnklG5uYw;gRq?8*iTSvtMj zb1{BbIQC70VbC+u-1ktX*7&diJHwl~E;ao~HlY<;))%GT?^MrxpZyG}&fJ!qmLF$q zGB(y)V{0+;se4ox%>&JY*JVtviD{y5h1(cns&%Pa#YRQ^@cUCQjB=2%(-tQwTO$kr zY1d@?^ZMJ(c96}qyfA#5gYK(2=#b4@V!-a|9h+>wSDRn?195IV88Gqu(L}b_L?}6O zgBVZ<`uP2>!X(J&gY!@ZT63p~!1 z+~VG4jB@i8NE!V27ymgTuV0SSjL>F?MyyOmSuh%*Rq|2SpuFTXEY-Byn)M>ZAdSgP zABD0T6uNZ2RTigePtL*Xk(a-BPkU3_p4nvnW?Xg94O4U9@KyT5e*4aCZNiqO_fw7| zl!nHOvwKHYoJ?&upgfo zIO&Qiv&GqI_0p6l=p`pCA7>{F$s+i#xB?31iRI{bpK5;YHxk`Nu8Y zeS3XlFE8DdKC;+l15t?$ZJB<@Y=Ygr{5fNu9chW&iu+^y@z|pQhwL|_9Dlg)9)Mb> ze|NFnS@i9ZEHh)XY{2_hHM6V03L>IS?kL4L#~`8NFA!G_C33Fr9Q2Tu#;9$-uJCK0p^E11^$S#>M_Pv3;@q`C{Y=}HXXK`Fmjg(Rr+eFqLOrDvaN%vDGxcYEZXdK<`TKJ++mt%-eMb1Ho zQf6a7N*P4~u{!D(bY3-y#@k|6U{WypHl#t(>hww*YzfZ|xgJ-*B?tgc4q9MzdI?w@ zNFR!=BADdb)lwcF;o68lLm$M;x1|I0A&OE-Q_1Z5hD1&a-1Y>>Echs_$bq?!qF+V` zD{53$kc6ubdcZSyc{X&3+>cH_64l^yRS~*<(8>>vy-xTpzB|Ti4~#(?UN7eR_JQsA zH%P^6+<-R3LV%Fpbn&#>xX)0fj1vqa@b#wdcP^*}#>{c-)RW>Yfj!qwxP;kN;Je(5 z%GQX2Ou#OU(>v^kxi9ZU_5K(bjs8e)lT8e@Pq?fQ|E3z+I$~#&IHTV3+I&QLfQ-h6 zW-ny8M~^lvdvH9mQoYgZAx+W&Ied2B#}lB}@rj0?yT%XsOj(q{Jy@mF`$wqTY5S7cqzm0&@-um6 zLwQP?pr>6`(OgO1Lli54zt^ao=M{+Gc8~gCq}XIAxwUFG_*rDzcrnW2jw3PYM$0z! z(iId>N=}Qg8MzQlAN*(Rx*4XO2Q8;4D%igEhnk($kUk*=-pFLVukx>Nw2pWSm#@SO z?D4tw#Gi0*HkSe`vX_O=Dg&%2pb42kA_+lSSUY!-u4J*+Q=kATTOm=gi&re+uR^Qt zR**Lxuvb$9jMRu|1@gR=@BBD^3T&p8nl~%tqvH`XG>Gy4)ZmMxa)P)|&lE9mBcZf% z>f-4oB^Iy)A+-<(0RZxU_27Xz9c9>}p^V~4fR^69J2ZwAuU0Ct0qrWp`cNW-$W|=4 zKY@p;m^W1g!tz^($n?A@te*CLaP{pI3MEINZNSGha0x6psf!>MVX|_N5|}W-G^f;M zu!M_mA!UG3z`+AKtC=;9Sou$tUg;2^@dgj}x!bK#kbI4w|L}0eYleTT`fWd0qynv0 zPb#Gqo^5HDK{Jos*9h&Q3l_AaFFIcYy)BkIfN>`*UGR>5)UDat_i->8rc3p66Rx%E3;MiydH{L60OQ z*zfG2vDyedU3oRJjJaCc$P>}T+$Wm?!+n4&$7;WE^N$a(H$ogRe(~HD&u&X`+mx^f z8moDXOW`iBm+OJd4$~{f?+F!wy_d(V92|8&mg)NV$rekFV(5J(I;B9lM~?3CmXa4o zR&WpG@WwK`pX8I~oXLLL9n#x&)7!ar*jmO5Cqg}B#o09`BU#R*+Vb3 zjG2}_%nI1>+&ZeV1OY%+ME%$4JVo_1nQts)8y$R2rYuDzO=pmifrgrEBmXze*TyWb zwK|Dh&>PYig=c4q{{uBlf?Pm8kjTLX-dLVheAxNNrKZy|a7_E-OS9xhl!5%ZT8SVleu$)fCX&gA6^0hj<_ zeVd+mod$ai(1z#!@rUe#cv^_5pO~g1z2CUOYU6cjm>kbH-%NZl(f|8JX-vedK-GW) z{C-j8ifVgK_zcVd&Pi5u-U?7Nr%Pda*U*>K1n`0Zh_<@2jLGebm<%AC-1zj*aMG$U zxg>}%Bw55y>*vzaW0C*HF(=+dTEAux85QRkVmz&3trVzrG+9`5Ja0+jWwIQrWlG+Y z5^me3ph33}&&d-QRvbYreAIDvwyiqzt1TzjcTh`P&}@>O0Sph{^8OI`Rty2If`Unm zC7T^bm3TSSk|n`l1)*g%`GbGwvz5s{n>#Iwl(lUAKL{5MH0rc6lm5CLln zx}@4FU3Fdi4wsbZKnL#2;sV>MAA6R3zDI>yw)$nxxvv)pRV`(yKK?JRbD81U@TjTA zrzpx~@RnJw*?FB5r7VxbFwvWd*ldjls~m;hviHW=aSI(HJwHVnn>A!x1WunreN~+* zDF9{t*7wRPAfMmmOPMkhxu0Xbp9GMZ)78(bFO+5S#vf6ZGF8yDsryz&H z4TN_aPmeHXe9p=Gd!3_c>G5lhU4QT9GE5PMqwC+{FaZ&{K!-FLroWF54tMB{;+)a9 zn!LIOF>Hm1UzC35hxael?x{|^+Rr!LfP|_CxK%r9G;?&w^?s`Lq1>PAlxqSGAGCiS zJ{o@?J|)hC8KV4-vj(rD6&)sHys}qTT^@2mJ*qjiSu|3u)!l~r_&OA7bcc4Fp(*2Q zZ_`f-_`Yi8ktOR>@CodiL@*@3UD8x$p0r;U5}EqYe){1|*1Ln+Gjr1#Gd7XHJ;VUX zCL5>!mEgCAz0k_85Q|5$x3PxqflOP=lT)%baraQkr19vg@mOXg<_Ot>MpIkb86Y&N zaURcn&nP*}X?2n?EJUZNVh99x<*zyZoEK-@wx4~dP`24+3Hb5+kRc;(TO{v%pPg+rXEa|-Zo5#58p~XL%vsi2tjhaVzC?sFinV|)tIr~^@+z&V>I-jyi{o=g zXMc`kD~cAIg!n_x{)qJ_Eb?It{3_T>J~wloGUUvK*CpQe`U6=WZ|d}x9f5}^>N>yF z`MpFXL-%&eAktT7V4PN!E>3VcG96&jUrLp8l(g#=^r`vA@8e~nyK>745{}ilPDg*v z2{I{HvT+mq^3J94cZ(XT^nOPys?aahxf(O1%U>WNmQ(fA^@1x~fs54iI-icLts%>= zBgDzi7FAYrz|(X!6xpJ~E{|14-uIo#{J76D5dPNKrajwiNbvN4C#LPJADjL!kepL& ze#vCp%;E7rj4?BI_d2mF1lxrYo}{(E`a-}g`%^WR8rUKE$my3U( zud_lYIWiIgqvH4Y9;3oFH6BOR4~``#JW|qG6z4!}DgwKeuY6u9_GNZ88Kav1I+gp( zJRfMqk@Ii>_Pa}kU7$r%&K+Cx#{vs*k!PYLk@sdj9`qM?@Bafb7UHXIo@n~f&>N?+ zL1I=b4yBz*r}`7e+V?dUaIEkH*hfPyLqpWOZoQo&z!xyNEl-qWKJ69 zNqQPsU1@MbdbFI2N2t>DiB9m}z1xG@S6;;O@H8~=D53g!Syfd`_Md)^&X&U2KTEB8 zAa2&hZ@F^V>mMnd0J=^9+xTAkT{D5c8_Eu$Y5&J?y=kNIKPjS4vZ^)Hr16|AU$v%W zw?xnFRbCXa~G-xtMlJ=Ua{t zxo^19(#+riu)P;>;A2c0&iraJ0luD4sFWpR!s*=gRIHJ9>6bqpDUEECXgAZ9^tIvJ z58hriPoLz8rb&_glDKC@$!W0!*MJ!5RL($giM}^#APEs4h(!qVa{*+X0ZIrkoup7$ zfA9$TyO@#q1Kk_6XOmxN&ODSoHa!7d6jA!kas_^)* zN>B9hfauj_5y{KN{RiHs76cfeQTyN$7{n?_5hT06KSY*|YMMh&=g|0;(?(P*O{Iqv z{T(JF#a)HV+LLWS)|6b|g32wsT69slWQ8EewQ?WPi{3^%@dYOL!s*p4&9DI1coD|e zVW6gLEp&sF2;ZEFv%o9FV(8Kc)uGHUll_pW06tDl#J5Uiy)*oFq%j^tjLK1(dGMN% zvEr<1M}gsPn=y8>GkPh>M?+!ba)en3#gu>BWGP4y?VOASQ-rV-{TUVx5=@terswli z7IU3V9*z$P0=TArRc^7;QDTB=XRI2!EVq!D3?Z?g%iX@mOb#R@5{xbC;y;K+VE`Dw zDq6yP?0P){{Cj|=t85-$?8UM$?dSU)l;Ne{H)<#p_(O+k8dL--3WZ73`F;?90|mqI zp_60_GYg~No-H?{f{6%vBESO;Nb+LxD1l>jcWGG|l(voHt_s0a;S78qVx`a_KOBm% zmNLIdCmlwPrF=h9txSX7Xl@Kb6+#|7nX>^J_bat|l%SXK18t?Q@+d4%ItUuOM8x+5 z#L_?lW`Ox;{#`kkvMfq6Ap>-KDi4(6l|cS88&S){MiX^bCEX0mX!hGatt6o!M5ahc zxvCEPM>jlyx6qvCj^nBw-i(VxB&7`~odi@e%Wr})6MA-~(0K5Y@?)YE=A8)zylC$N zwZ(%8A_|>DHrCXrqxwZP2MbeKXfQj`3A-$#u`TaE4i@r};)beVL)6qtR%_6jMHwT| z#szx6v=XNYZ|4Ftvns(M`K$L1$!+pU-x6{rD~bKFMg=`7M(og-Wj1w#1=fqE)Gl?t z$vA&Dv_HXJ%3h8E^>o@|yE8G(n3nH)UJ8M2&Pyn@6!wn@PpT`YwHXlYh)a#t+lfEY zxLlLnrb>Ig$;d+xN~~ol*NtYFQPohXb2i*@s1LCYB!GrIFzy2qY+@79x2U3NBX8@d z&X59cxTE2_CAtP4kr?X+R+9dH(s8RtAJL`{_*{hAGlau}SN~`?# z>+*{P&YnU;8m29i*}kf%|DDGj+~TN{@ktJfMcR}Q>MlzB&4zYMbvi)rqBO}98|82; zuUafyy>(0t+~xhzRMERc98EeEs|~P)H;_M?F5j#Ibm-zERHKbR&sb~Epi^MtW+mk) zsaUGG^=ZhM2FiZH?8hFRi!-FAi&g%f;rpZ7f-0{7oa~QwT5Zp{uf{|Oo~R&?mM2rGHk6qE1zMth+0Ibyaiv+`Z#?kG7uuq4j2d&5N)cq`Y$m2d?b~)0>|J%fTKO@>e4^B>VwiYZ&2dPr-|=& zZXfLX?vT*Z$D7dXABg@WoUzu|_=&!l(^~(-gpOXSQ*T(NBsVR)qxqt4)T$&m%hq3- zy%n97zqfZ0Xy-|u7gNdh5Ye9P81SI_Te+^S=|_}MoMrTEshBMb?MPk6)*o|( zRTF)(+sgtPY5%GSJS_*;eWo;PqG&_@uc zH_&CZFvY`-$?e?~20l7EI&V&mN4}g@Se*J@{XN3=|D)@ze~_e^i2J0>El9bzcMvRq&iBR8#HSrL;~3d6I}vYzzKhWu3Cs< z4zycAgj1C$1CiQxsSD2}8fU@Rcw*8b2DBXyCPUcdh_37F!3wh54*xRo?j@pVG+ps+ ze$*_aWI8vcq8<^(PtEnVil%zSuTYE{Lgm0o3`Ty75PKLmEtXF7;^**DevD@q;u8x6 zkj8+g@96urYZ6{KwD3WLPO+ZJLSOn%>QN07M-Vf3y-2I3r+hS1v}gUo~p<$1h7+2TVxMK3VTwm<=bfS+++6IUY29@M9_^!W7)R4aLbnbtq z=*)7GACp`o22GMWON1q&GvZ_e{g-)?yEjc-2dtOTPiSpFL)70T4rOoZBa-=R32|&V zb}c4qexGhej+Gl`jKaEkKj^s4;j%qEbB8mLRSubYa7

    t?!&);7@bY%vjaUZADG* zXn{3|P&abWBKA%nf=$#_yp&9$&?qCv4S9Mww<;}NEOke+JFvjuWsp?kqK9H4ZRYF= zI?8q#=&n+fF?0}jH2o;MLEhV++<92p-zHn2Lal)2 zOs7B_*_sCK&~Ul!0)1#rFwdI=(W8r!LL)YsN__^dA2~6+2^Z7Sr)|ZLikPXW=|QNN zT#Yw3dm%uworgN=r@^h#v4~6gx*dVJ0?`C*wxC^;1iAp4L0`UnftacU(ci-pFW^o* zp8Ho@$$)s!*6Rih@(%@QRzKR-!dKk;fKOcnut1JZv6yF0AJgUkd4Uf4XUEP{t;a}t z+8+?1#TX-Fl40I|2H2dxoD-otXpQ4GHx?z=-g)4v80iv3&CUf zhxd&$mjqk)c@Slq6bHocZR=@3CziWq0qv6J4(7A6va_=LP$0{b<8A%KF#Ms~lisq; z#^a5f2Cj#oIpNIgUz-+2K-rlF{Gf`$<&~L{`ufTE>{MpDkRl@I6~b}jA_WgRFwUpS z!zxX3Q^4a%ZNnQDLrqzcJ$N0C1r-bn^i2BG5?S@Wx7;q^WxmjFpH|DTLz_5mrmKmN zsLaTyYzWO%%_gF1Vu`nQI)VsD)lH1GZ0szD$y)@Ev>)`F){Ya?GjhpYQ^@eLep}8>s0>8;X;6CYTktQ@%17au#*_T{W&u0EheGkJEZsixWe0;S%1JiD^1@D zl|U`+bm-d=qEK?>nv26Fd0W(%)|X#Oms*Ww`dn}k-ptqjr8SM6nBX)Ky$O3xW|7N~D z)aF6MbMyQIEReRUfOW^#E&K$!a({sqf#l2^(}|qPH$*e0_t9547_G5^^^{NF9+b~^ z!9%U7XkHC~%|@KRT=*hLw{55+W8X~#?624Tt*4-&ZDdvgAN6i|a#5&xHF^u}q#t^? zr_ayob=`BedH7_}iSZPPGbq}HY$FzItrp$@zgGR(tF15OUFw~P(;g{&*p0VJUEl># zZ8IOM(}VeggjsJi-q zwyURg``f)Y{{n&iRc?O(+0GddQG5^bg%9$_SYp00C-<;~@muF{ePnPLLmOWs<_Tck z(E3avH!N@Tfl}{Sms-FcT{W6tl$|%yiV#-3CmZ0CG9pP!75AwgbiJADXBR0MJr4$t zt7AyIMVVfu-=fOZ!#WJCFUj?jDiG>WUwp_x7ib(|8EntWTKk9Wlx+CgMiLL~CaI^IOEC zZVYFzs9P(E<7bqf1RD>jE<#hN=byhs+hu=h^fRc_1ltXw;919`<|2C_v@W0IaRN*>7mXHUM0pCTPOIdOKPgq55ubC zzN`w+Evdg!X*rGmc;;Gf$p}$CFg0DssMO#HhQ%dHAS6-GPF#}u?)kGy#A|slO1P?h zKRv!R5G<^M+xc}=VdCR-&(Ur=pC;DI@3SWcL1ImD?8%9I2l4v8mcxy&dBi=0WzwL| z>?Z3i7j9+#&g~zJy<%XuMVWEm^Mh%SKb3o*+zUjbn;Drsd{_Wxk(Az4QMK-GNfn$Z zO6GVVo-x2#>Bl4yPxl$VU@NrL@z8d9OVlV?Z1`g7vg)o?JS{CYz#DTLg86hs=jY&O z`Lvb&?u;kBrCi^mwM5d*=;ed5`c&AOM$tw))iFavG~j%tqRQyrcddKog9f8Qu}i^% z4vP9o*3Ml~*Hli_WL-tXlM@k7(vv?u~rS2h^=`ZR0zrM+VLH(GLS7U=gz6$)2z|pJ)~3N z@dE;#P1Du7rjx#Dj-*Wzc80?*%II?@=)VN~lIMOe3~5R~@u=gQCLnR&KOS(&$;H-j zk3NxhYNgRzO~sJOt&2n7&^wJg`EF+AFzjn?+^=ZH7L7zsR;XHc z=#BOKiAstDA@ud?Zwc*|B} zK!>o1XH${-4u?r=_^8tIFqIyMFsU>7mgqS9I84kd*qqO!R9`*6{%;uIFA%MjzTb{S zxm2bU4+#b}nUM5f8tCblBkw;Gp{k~V(%rCR!cSko7)u0H>Rn}GM zj9`6f?N(*R`>H!jyWa#W2eKX2Rf_i$tS**nb1YzyX){pB*t}g}BmGvoO}a9?A+pT* znugusLRt%AJtkx-?E;*~{TJx*ALv#&AM7mEhoDs1H`dDc`U7$9`)vV62dlhSi|dn_s1uxEs=*|{DT>4hI|5F%PL*^1;f%Hfaz)D zUO6b55y%Xv^5HFli5uaB#>~uM{=qg7<3_!30O;H^=p!YMirTku@G2b#_?{Gi?*U#r zyxQTt7Sln%wtJhXjX1|L4}FWjqh;JY&OU07Lh+0ph2`e<8?#wD&AnKDP)|Q{Y?;#C zCy`0=h4flO)qfmxw=;U8M6+Ewz)v7vujB0gLCB=lnr%#J%=)WtoONFr`gq`0XpqV>+Sethb zK23GT=EX$qL)Ke3W9A`MxH~F(lKZ}3UobN-INly1yBxET5@b^q{AB+(fFo#yR>7%A ze~w4X=S5iHf5MV=k3GcF_mW$oN4gD>osX$+Re_Fxa0;AjQTd<3?E|<43B2EPMS&N*NxngkeT>gyqkRD<8s22J)9u{->DtQk6zrJ{K{0t=w2ozerIMkz@QIp>u2&FbmI!bXo z&p%=w_QbOYl=&)hT=I>TF}>0f+AITX@&7&{nx+k@3>%c9=AL{kjrqSvgy3`}r!^TV zUU9in)Z9U!lZTCsAT}A7&JU2)02u-Q&F2BC1vB%rvx@1(h2q|7xOwx%&uM!x1PTRJ8Cniwv;$$tT){uH-m1`>?Czibf;(xgPf)x(v>w2Yv>#2<_ z#WF@ijQq`@$M4!5Lr6em^9hRG94qWO1vjBKVpD-1+}ox4%l{zW*Q!rb&3^0J1Rngm z_Yl{Ud-~&)W0~c+($f_1NtREH`g;QIFF;*4JUPkj?80CV6pD9bTr;Ew`S@S2Y1`UG zUj{uv*?HS$DBG%nan$mgXJ^67r?9%U!sgdQw(aMLXYD_DyG~+I)SaAKai6vXWT;be zao7y(#J<}E&<<*=7gI@6nw8oTovcen&wmg0`|u0cS6P|!xNr906J^_#x`&Yw6bam% zbtA{Wt>4W5A%>F$RY6Z6!XHch|IEs=2@6G&G)NeRzR#qXzCJmujk`Ft@{wG?HcSqL z3!wQ_5`u_p^Nhqfi|GAEJx=sZ@Dp`RA|IcAjNXHgQ?0{oM-Y88-Jxc{<$T?IN3sI( z?PG5s*u50t8!awX(~^b2N;WPQSLwGIwIKPE*%QxUhrYi7iCvN2KYgJ8l-Q|Gys)Qi zLT-4u^@lzAhpvzy3ViJoiFB8no)1(a&Hrm*+JPq&D*iS9JpUsGFeVb2N`_P&F08vw zTrwZqOG=T1{>>W>lFwQx{P+O8qR+m2w-yhy-YOEPZ&QdK13mGwT1&`P*f|0KtBdA& zvIU8AC~`2QTyp=v$f0slEnAPub@&M?Z7YR^wV-8Wza9AR0xp5bQwsx6?EN_8Q=gIl zrp@{6>!HALU3q1ztiZl~^})wz)7l;`Om0=0$Rx$)&aPJ_2GFk!JF?E}_svBD?Q*iz&r5C;hXw*aYrh=*B&1 z((^4P;~uW2;vyJbQikNfoho|Q=GXJ-<@ln ztiCY~Z9v(T*hbOCayD<7LfH+?zYEBW|Ig8Zf!EeZ8Q|QwSZJ)qq0oN2JHXkn`nr99Exu*rh+jF!j9^OPVb74Qr@L8PAb(9VkNr z+~#e*9=nKF#2PjwQ(k}xfzSLu=f^!uS(^7vj+6!zUX=wrdU_B1cCJ*`ns0|pKZ;Z* zR_eJR*Rf1$@u>XybR-o1W+ryytODu?Oy(d;6`r2}fGyq1>akE}R9nv}n60pO4G|Dr zbH|BOwA&V&6ch7qgtJlH{=G0Rc(izK{@c!-=od4efN-0oLL=aV5hX;QSg17f`@J|6 zsR9Y>U2b@$8OA`lonOD=ey3f%3*YMIz|4&)CV~;y2?#nd6DFIb@c(?E#(S>mp5ZA| zbhrvaM8i&tnm`w?Xds-W<$n{q+O&RiCNX_De%C^Z=UYaM&h;Tkhv`I}8+H{l4L&i|m2S`obF^`K9M5L3CP|DNnt9zv#Jq4+( zdVvF4EcxOX9XPi?{*`l!;#ib+Fs= z)%&U%>1NUfPrUSec)k#)qGo<;<#+>WL`L`ZAmmisJESO**_3?@0cM+Lm;jL#`#ro-(Ijfvfuy1f#i z*3Y?lNMkWairW>3z7jx_uwe2{Y7%``&W;95`{rDKj?EOVq*y+}JS30{;lnx--i7GX zR!Vh5tlR*xh7Sl}CYeTkfRr$M)%6?D9NCmaHVu9KAH^;SKE0=?wb)3(LK8L_q{(yN zgewi)jdXOyF#32c(K?SMi8q<9o2|Q%v3x`q4TRKw@J!~*@f8UOrBinrM@EfCM-cl; z1}{A$pH9>ZbsCE)eA(8`Pf=6=He?jYdR-z6));F?h5LLudBTo0*dqxifu|+%z{~ZJ z+j`3?Bs}ut(YK(3VUz{dIy1K$q>q6lQBTEE(gAHg@}9-pp&!1b4ChO&B=L!f?FlUr zli!UXLSs?}tk{U*trcX94R#HR(varDBN3mq5?6k!h?%qiPL-(Z2KhhuG}VH5KrVX7 zOI}TXenykzt!m@6)*6Q=kWaa7# zhpk!lK1MI2FWTK=l{yo#{L`o5YpJ}c<_#fmt>rna`40-dX@4GSr--Qn0irrKaCdVz z?QJ&q$DU5r3lG;~3E7;vc%-B*`A8G(IA}K11jt1`;wV$#yW@rqJ&)gJBgf+>V~Nav zrJ`tnYzx!FAD^qZA_hd5xh<6J2E(T@P!UOg7MxLa;!O$7lWbBZok(b@W)ck=K3W0_ zkWVpp_YZrChWR&O76d<-L1!l(sCtlOCtaYGkBrkM%l{h+GUiY`5Va zulF6tokL(>Dq^W>n4t{ZfoxbTqjZ6go7;C`;~t2kjyzU?3_<|FHM!iJ>0<=)^Iw zmafKEaDaPrQqWYXx6ssTa>cKE2EmQ$P>Ej1{MLVvnb= zU;j}5HdMlD?$asP0V8zch8K(2|AiTm3(60Kfzg_qO2X`8U+)`jYh}2qSZaP4WK= z6cvUaX|K8;a;Hm>^gaG&&uPu;vq?YN6nfeB<(0c$tzNm_f+(A_TJ;`D5W#vx=HFbS zQ9FOzFFX1Nl9z40fyjW>lgB?cw3(ZK#VtH_Qm~8>^0_%cqK zPS5`!7?!<-`^*KSzuMmK7M#y2@>n|r-fi3RC@ToAknol~^Z+lULFHc&)iK3%nX;_u zT>Bgr+~)SoluM7lOwUswwE|bMFP=Nn&b>h{u%WpF>Ua9FX^G#ph3QvRd7au>`G3ek ziUd$VxgIwlOg#qZ2uzO$1ik}+hH zkQ;^%lOga_27}LHK=zK8#F{(&DXR0&j7meF3I!5PSgs&*pH2O$L4tcb*3&%ikQg$? zEmerq^GO^IDP?u0<$h(GXMDpZ{Vw({A&b4=wv`42a)=?XX2|xbnzO>jh>+-^D9a*6 zVV&QttGcfhKW6bYzt5p>Y$Kvn8Ljp}1`2zGQe zPnbeTEJr+fvdPQ3wRAy~-Nq4V_q8*gfjL*tGLME&M_|i__4SNt&LnKj;`ts8PRGxX zjiC?5b`|+8m4@xv2kYZV#yblIHJp;#f2VL6339Na+KC&@O)x=D)(x^%w>%M^XHQXa zox4f8a})%iMYCIZPUA&F&Z$ki^<-S(GNUh7bDP)ArsN+zKRm4ITx%Km$P+T4E34-A zIBSikkWx$CFs6bW>cn2>kJ)l@>)RYVc>f0^KPzZ`9Qepna~kAz!w)_Vo!)EVqG1%py?-D;j{tT1 zG_!i{I8F>&?rjQYEJ&L~OgD&VczTe_W@JVB+#%PRruI)BYw(rsu0Sr|iT*9fcm!Dz z8q!Jop6_oe<*h8ZAbiCZT0dSVohE&{%pTMx3X~|+Fi{~>R*LTjk@@ikl;W{MBzc|h zXs?Ge?zDk+6bMYK?}eI&PBs#}_YluE(!f%Ikr!ao@0n33c3y4jRE@r`N;oM3In-Rll7|BCkofC>mD^EuZDA6^K{*D89zJec$hDe zpVbj1eP)(!F}I&v9)In3ZPm?oIw&o9b6&j9#EwNY<&~^WGiu}l^XO4ZnskLEEKw-W zqh-f8q}S2w0}A(|G!XU8D*Ih$*KHQukvRG7#9bNxyGpbj3^;Et#sL>@M9NOzOnmrm zRq`&Az}rgtTL$ddnwjRcazE=;i@hTYwaiwkc$`4kO_URzq*y)XY|IpzJ5$oscoGaV zf~I}8a5#NF(Ms3-4SiDXT<*oHxg%C`Yy&06H6!bmXLBlp@(L3dvTkiLA+fD!Ft_#{ zuoEU~+dNGqMp=KKzGiz@+t?~IHG3Y2UE*1@yzfC~y}%X!X44>!f_{m0elR@`vWM$( zc{R3o%zo2r&w;M{Z{L8z+9C2qUJw!yuGG(>;(F z^?Ne(OVh-Mb?EgYdId2Nd_N}VxoWN#Q>oRRXm*f&$&ompdCu=WnH!wZ9NRGok9?J- zkL3(Vc$Vz$Sp0@*^B#-VKX7s9lCPxwApMI4Rvj;a7w12q9D8b3v_-g*z_$YGE)>vE z%ad9%mdtI7_O+CztC?o=;<@8q+TF~rmlW62@vAVq&y;3Mvz&xu72(b&Oq+;15X~Aa zn9EstGIUC-O31MMqk!WUqG>nABl=S{%1Bdb7}+InSa`i@DVBIyL+*;P$mM)%2UDR`12WQEmFJ9~0cx^65spCS4>)6j9SVvWq6p#eqDIS1*x#;i z{gs)WPxdaPTE7@7%8dV``i?nK(Ijl*nk{g7U~;jvPrpuIFy-cLsHzn>*9^iO)0PHn zmROYK?@Xk%KN&f(A)a_qE%%(!-U~Hsk`Hh=^$iD`8>)5>JM@T^h<-uTob&*`2ii4j z-Vas#m9#NA^kq~BwTRA{lVvI%6sH$sT{_lp35GCRRt}scd-+HS$^Teyx7&^~W`I5j zvN#50-WOUTe}Ovk=)du8+@a688`3g4!PPS}r7>Y~F{QBrE|-*do$79L&;lA0Z~U?r z4(yVS$OJ^VSJk2HS;rqQ`AZr`0n~89v;5o={--gcZnI3EJ$+&CjAmQ>Ra*BtN$)|a ze@lolkeK3~=T&PjAvqUOt;E5?mOUl^ca*_@+r5o|B!ePEWYdaURO0DmiYM@8{9`t- z%bowmLy&Ewu$+qKAfu^g!_$2NkdD`yLBH-*jqI0hm(fP!J54P#I2O_8S8ord@1FVEq|j7aeDZ0Ty4)cn^| zo7q-k$>K#PNa?bWOR(jo?7wm`$XKQMWoRs6b>M%j8pL5QA4O6s#SYReqz%f3bu@kt zvKmXXt@7n$mty_^>ud~dk8_E}l^UZ9@;oG4CMx`rjO>0L=(p$~U{2!zT$`1GjFgt| zPAjD^p`HB@YbCWX^xF35@x{B7*F%PyzOvyxpPUM05dYiS!hVeBrAjB^VA`s`2 zwWC&Ui8tec2oEY0dP$?iS9YIl_pJhh>u4jJ{KWcGt;g5v@9p_PU#Zt(1JV)CkHQEP)=O#u z{ezkFmp;q1PV%@vnzrG6R-lujaM`SG_tY4GH1eZW&zE6b9{e{cwbnafSWh@E_kU|o z5&)WpwsLVvaV4Q9-x!&hO|{gXRy;Z{YrP3ik7DWWfiM@*X&II_XYbRO`on>?EyQ$6 zqjXDP7VgBz9KHb`W6vr5U;e9;H$|j38l9D%5Td5aubjJ9c$#~RZclsQc4&$9^3kBM zf$2DLurPfhd3n|)HC}5yVpKa1tXU6GXbpa?lwrqCsk)m#5H*^AuBFh*Wx zslEa_mK^UoHNP1)kWBBJB!^@qX=jP=e0N&3P9NAV)h5&`>lr;f-5yAULj(D4wFSoi zklVYKPn?MZN5!>C@Zv?@Z#}QvioZFsii*ZJ`ikgEm8J$T$9K$bQ9W{`Z0NuDnyc%( zMWb)1gB%huSz5d%0O43Z2A!9!2$nCa-J*suiM)q?+yK^Xs_6X2lTNT%rj_wkpYwno z8xRta8TEEgeF+7_I=N1^$d?YSwJ2~pWtRr<%I7^n8kP*v32iF0uK-o8`!bxCQC+`( z8wW&nP;Q#(HY6w2Hk6sV&5WUe8C!(1$UZ|GDGI}=pMqvrG4l`vk)^0$3+w^7cimAMYzR2OgL;Mf3K>O%Fq)P64m9JoDs9iFiuDX0mRozQw;Q={*Y9A5gbFGTu41f+#)HVGy7~hr@wv zEsKdFM&O##EjMP`>Yi*iy^!%nvw0f@lbH~LGFfU4u63|8CLF*= z4Sb-|mcOR3hZwv)^tvp$G}Ti^HW~WiigGleB>H1MWRMi zXiU+K0ih^o;=jexjy%LCNR@GmKYu&cm(blA{cvd?l|1q2b4IlK>IiG}BoLJo zY(_!-XE`Iq+B!Eq_M2c?Q`?;~?>9NXLxweL&y9qIY5u<#%|A0zXy5Jed4`5-(Qz3f zmA*YN*;)4c1#A#i#+!~qt>9YriMT||@fTe15Z3mxua_I{w@YLv8YxOc)O0-m_ZWCy z(afUbV(Q&Am%Y4g{#}^eynyMoR~kPoxUB5!X*PV-pB;lh1yno&cGmKMruId;O)9T3 zqmju0LHBWmz(4DSwg;y*wu_{LWF+Vx2myt(PVeII3Z9}mKxw6$Q1o99$iRI6n z{QJ%p2cX$Xpowd2o!2v?b11Us3{d_V(t+D{*-a}iL%A8l z77b(fX^*Zs0*;X)qdyBbA*NXaexa(IcV82{Flue*$Nx!D_}3|5Wu4!TA-pJJmEQin zc$KpGkD?*CZ>YZL@5COo3s8S(E8Ca!qgfCT0X^vdJqG%wd+ z$B6%P2o+p*6ui~4)#KUa60-H~!A}YWrXjLd=4tRU<{3jHvu~qjW($S`7SkC}kVMeF z%{6!RCQ^TjHjjfyFsz45ium=iP7O^aBJf&HPFlm1qJ#6Lj0qwQqWiM)W;k@nK}Gd* zbuG)RfdLpnQLE zl$l|uy-MdW9(CRE_S~W`sK|@VQ`H5CV9WsR9+krRKWXhEol4RnH6jj#=#XXV{wVM7(m!8gIDy=0ONZniL#vfykZmi%~ zo|F(gKXW4v=YQRMwwC6ihV8dML%=mjZ4Dr`iZeAPLul_E{zv3=^LRZ}Vpf4fHyvCu zfML@RY1HgXU_6E4|?CM>PW(3>J2`H3|bgD&+@5L?{g} z$|R_67Y6RYb#tHb8w+4UieE}PydAP7piQ`mM@Vmwtg3*#^Dr-HU&VkG9}-K;nex~t z#CL{yDrhLdT5V&w^AzF4Ka z=(t-Z-wiJ#>eirThVIFXXCs^q@<`46=(_aixhHrytd4s_M));z5CdySsd}80;Ovdv z{TLOUcejf_5`GBdcSgfbo3=E*EACmE@@&TF7~L~JyNx;=5Vp<~pFN~3AiGAJU=kTb z661YCnSS#U;tr=C_f3z79skNVRwfZZA4zA^Fpp^gLgh zh~?7b;8o(@pl0DKT8f}usHQt?^Jp!dB)jwX%0&mvNts1LREId6J_m3^&^61akj06h z{K}M-_d!qAXHwo$lXUBKm=N$o=evkwxFhcEiFSi;kRGwFQ*~@d#0Zg-Q?syZ+2d0| za_oaiH>cgQx(B+o?CUuKZUwMq@X`p}Sr-^h5_D%2VXf;9jt8x;E+vQ~9PV;qrVCxQ zxaXR${Ad$8MSCGXm5HM@74Q-7xF27&U3=u%13G;!VBLiMlGhGAJt;mbE))6kUK@QE zfjjEWz72qjVuS*kAJrG|5#~dgdX%fWo<<@pD|>{=c+X0A~Ytg`Dl+I^5V60 zfniE_HfvxB)AP@c`rfI*Caw0FgT&}#Td3^X#H zI2z7E8{ak#BqqC&^;1pJT7Lf$bFeULh3*&OI~w|J$}6E-%9|R%#yytZ>!IQ_JW+bT zYsoN5;jqIRB)bTtPKTXd&!uttIo4x_zusRK{cM;+Kn%G`BM3N!|7I3 zf`n@$hM~{AS6}7YW12ZlQMtiW4(H@6@!agh0hx*oSNTdSZerA}pa=GmJJh%tWgo=1yVb}FYY8i|3Ha#9JDh5a`e=8Jj)+<$0 zDpw6P=?{)!6;<$gmTdfpUh@#stnl2#!I9fMhx@V8+uAk$Ruc!wFOg@;K@smDQ+O+y)oN2}8 zg)Dx7T_uRj77AdK$ChWHsmIUhJ8Kxkf{7gZt?=vYyOqG}k?sAg_aXP4dXm7CRcdvi znp|*}!(muTt{N(XLjK$Me2pVKJm|`_Map^S3CcQ{%S#*KoMgIAQdFFcUxjFNKKd!F ztP;^gEWJ5x3cgoqKmA+xi=Ggew1`{zxO=oQRwTWqh%Tctk*QqMQcq-hT|8IaM@_qJ zG~+u@HSPw@n5 zb{x-rI-8i)PEE6vDEJkkHQaP1*D7s)*!EQY zl67&^Ayr)88`e*Fp;r55jVdCuH4qR2R(!u}y(OoR+x3{U?vd6t(2!+nkD-~{2piM* zotw}H7COGFsrTnX={hC`H_mJ1VdKZV`%jgEOJ~#%`ky>J_&GRXpm8Wox9hOUE5H^K z;O}qA7QsGq*Xuy>pq~~``3>S_M)TSj5;>_6)o&$!IkM=4W9v-8zG@pB(`|mkkj1J; zqBALIey7OBL)e8)n^&5VXi6^k$*2T*MPU&;wgim0^|YX-%XOp$oA_xyQ2ksHd(3)2 z^$~*N%W6t+FpSz?hWg!oE1TF=`rDEMCn?9vXxL)|OIFDj`%K+N+Qnw;4{?GnU@!W< zCsz_vU>UXdqx2?+WOFi@8;e&`;)6@xtQb43_vhB$UNqM}gD9;rd55{sG-c~yy@){`d-BB`w|dMT`dZ zoD~DN!PXoa<29B3p=d~1Vt6fo3^x0$!QVd6etM}US*Apm7JXp#^n(>I(bIASe6%^= zrvRxndC;eL{R`*}1h>$f5G`ns36)f9W{$kks6Sb#IW}YdwP76mJW44*W*Kzxm7#o& zoKDZFqG7U%Q?W2i?8#}Ds%fmLkF7pk-wRQdgs_&NOV6~X377?&XuYE9NDqXx``}mk zDLJI%=l*WkPo}{swI5eSc|D;MMcY&Z_njA0css7xm#qv>bhbkexV>e&1o<^WyzeSug%AR&~CI)(WpOPHqs;ar|%iOnQ2Z*+4foV#Cv7za_~ z2k$ae#pDUPIU~n(ZlKXP1F^2utm*wP~;h4fY! zmXG{qILh$0BSPv|VfjZ+MOl+ZhkQkKdAmX{C4%c1`kM7kC9V`?bIa(XY%uS~EqA@| z4iSe#p3;hlxQ;a4@ZrK@hIIH*HWJLh9SSVs4?zV()WuP6kJvLggpWs%v5+6_mH*LxCxJQf)w+@PBmCH z#P4e>epKLPS+1}oDaK@dZnw;3x(z=#pVaYELXm&|+2x*r|ERv78o&J8_|D4Xeo8%E zx4SV9DZUjZfo4dECgY}IOnHwX?VYceUM>$ZR~XEI@e5f+>=hu9yK|ZD)c3eB?u>-j zg4YSF}C+e1(F~F)CxTV%MA!;k{d45`BzlTrlie9goy3P@_c15)h(UMtxST znfKks(uy~9UdSXtcX)}V&Dif=@R_?O2+3sG0qJHBuSqXrrt^s&WuKgl(Wq*$0I6SO zJWC2GnHR&b&w^*e_aNOm1`@owxSD;%QRe-`PJYRp-4AHmr zQsk6>kvX1DFz}kI=BVQK+f@#V)MA$&cLr%%PK^g#3K=i7pR;s=_`GWod4MbW;wju+GNg*aJcxAkC66a?uhVon4D@E`0Lox|@@k#VN%dvmP!;VhrAXpXEYTdr#A?fNHo`ea z4>c?hH}o?go1uA7V_ETr5+mTzc4HS_4;NN^i#vcG7uh#Wfhnt4Os9jf)3wx;Pbv6_ zKX>Y836kA(xC+(W)%vt{593JMyFH+ZWWFi91=$oc-Lb1G&Gf|N>0gVcz{&}=n}W4tHk@^hC1Tou@FO?^eZY4}%h3x|uSe8Q zlwTC(k3RFV9C+N5r5IdDS!cPbdmRZ`-bWr+sv2=6Cw6gXr&_!VXaC--u4SbV8>l16P6jtwboH`(}g^SAg@aVM0QL zs3JLRK*gWQv1I>Sc>uSquLfu>yxGgW19U!qNEV3>7sa`87C(Z8QfSDn(DDxw@AuIAoXb%nI|58(E!^)}*#J zd4jWT0+=o+kLekOrxj^#@=z;gE{%q_a`Y#V4GLFvc&A7*CYH{p-pK}UoXXxcG9L|~ ziI|MN#-_C;69`8W0pp(qf~{!0f#= z*RA9*=OgRy5*@b4Qo7CV_5#Ce zO%6#xECwbvG3NxQA5tpdjgI45^!37p(hEdYZHhRpf*(qQyr^q0gFc_^d8(wmn&ru= z46UO>aJ^>GJ0dH4?ZhfNbvD*CU}Bfz7KOg_AnT&Q6RQ!Tfk?q?Xo@51BW7lo57tga zZP(`F(xulo&2Fdh#7QRTD<#H6=9bILDuzB{Pfsi0bRO^$fIOpLM;ke3T>C7s%nB%u z3hlS!^+(gjnW<&%)%77H-&GV-y*WGZ05wBz&vAB?f44v%1lPUZw-UhWrL6htCh&CN zyG7om7Q<%lUjkNr^kjoC?j@APzk=xP9TM~b%7FZ4=6d5%c4BJ>%K^$HpHk_{e~IL~ z-lAGNERW-l4|h+$9ys=R731 z!!)b7n!fYuAhrn|fAF~m2oqf^w47v=zf9XZUCrIQT+f-rk@R#GIZNBi&zyV`{8O=< z=dCqWmWm?ayN!qf2C$l0h{PtgY$LH2{&mWvz%CI({vIT5(MX(yMN+;=&RAG8b?SFZ zjG7qFTbV19UOJYVj+I~eMyiw?EI_g;+o}dvqy9Ejq~~oUiNm&0$0Kh%S?_U9q+0bf zkw0WZ$%|a@`O0C|XrvLJuKYqm7;a26PsT&CVNK463C7PTy}UP(A{w-KLvzHP!{|52 zF$e4L@uh---ct15O{GiqkukAyJ_3i#z}+q}*RNE)M3~Hp;H0CuBJfYOco9|D(f#X2 zabM;}g@rD33oMejoApFH69Ai!HD5DhU!7r}^@YwDr(;c71EuA{Rw299j)TpGp@RP; z!A@61skv9GoX3F8Q_b-rZcZ#G!^#7@!AA37mLaA=&qI9UyYDW|*yue?pQciCB%>qu zT=$#Ll^qG1(knD+qhcczwZSQ~pD7kgcoK2J#=qRHS4k$!lL%Ihq|55-xZkzU*l|#+ zi{eZV%v1K*;2gVn_&6XZnNm)s6h+={4@B_wN!-=ik?SNN)d#k}F;>^Gcufk48V+O@ z%7f~Q3WrTjYE4v^0B!!$=jTec`b!nTIzR3tFhO(egeMS+K{C#iO4jDDkeWx;Wv?aW zCw|{8u>Q@ZRQF?b{F^hZXEx}r5;7T>D?+W5^UTU1Ys|$y>C`Q?4>*X2>?5 z{dUFBo%bh?(dLpT)nD+e`tw|7g=sOcIaOY0$7{8`(Tl`eMZX}zIs2WN7Wg^OYPjSD zCe{ZtJbs?o=w|cH>hgOQkUqi4lsNBY=ZYSZ5=gGIe^S=etaGVida!)Rz4)+~q?pbl z(eNM>9$caX7aH!U8sj;t$Ub`bj9n#ms?KV_=x)*GoiE%?X$*}Zcs=e8&yNBAiTiaD z1$slqJKC2pX3oi9Ps;<kC9Rj-*TTHu7`T`7Aa$w){EKcFi;>nkdxQRI zZn0~4-VM&O)1ty<4C-r)ufO}yFB&As5%=?}T@Jg74mM}Q%rfORm&o9Oa0fvXUY~Y{ zNCN)mdFsl{&4&Yi`G|2B>B^)z(ytNnZ37_%MYgkmxI*^Bfoq2y@kv8ukIRK$w*Q3-nV^I_88J*H9!Sm*t%{#2-Z|A8bu*@=_&(b;iHfu^azrqk;m`DF#_TnC}{AQ4HxiE+F= z{H%O1*v5QkS13Ev-a^aUCKE{MM!Fh}snj$i4wue0%_zKRI>||$=~iR;=5esLJjZtQ zc5>aqm71I4edg71zf%tD^|CJCY)v%5%Fj&;&94xOmXXh-VBIg2eHzyBKg!)oMuu{d ztA0aoIhp+E#HLVvphi%jreudF<{BYx_%Q%Rcw>TC*;Lo_;$0Rr0z(5VQPQ=1vJR zuV12YW25{=?hhrN27xT6LIIVYBZ24|9$%l&EcTI=H9OSeAUJTxS z5D)pPKYyVi{z81fL~A4vv3kOFog96RJ}Mt+i5pqV3GQEL-Nh`;-3ta$E^nKX zAZ1$eihlSPly9{lwgQIBjraTl52LWZu1qwkX1XfoRZEjqmAKHiFpzC-W{i$=%WtBU zckC+Nt0u|r@VQlzt~jEenWt0tT`8+qrHAw=L%sA}{Itvbf$ji)A$oaT~~1B60=$ zvYESwLb%?>%=~L%H}cVQm}qi(ePy{~b;_e+cipr=%zaX<2|+}Jv13Xv_0N~x3?wXY zy^hj5PUAPirI#>9KDMzouUQyYxlSny#9~azHJ@4_89>@i@JJ2)M@GKQp5DyDzh{;s z7bVmo0+PDI=PItV_{H1c?FGX4b@OwYLWb9gWt8Ye|JhcOhVQ%3?|UY~@g-%Cmo&K- zTUHJu40rB(vsmP@)!aNGI$EmrOD*l<+-QIP+bO=PLIs%a+!g6aWbsuZsn-{b3mTDP zkUKM(Zhc`JmFDjr9R00gtX|6>#1+nqdj6TPCa0!&PLWjZhP%GfLnvO)(~5{3({`wQ zI|3o%`7KJ51fjs6vUit2?hB_wL=lV9uN$p7Z4A^9y=x*t!i)H@y@ngY1Zxi+L0 zOEG%eI1FRKuK+l9dnV1)2#S#=A*BLkJDA{zGI&CJ166RgEKYu**t}{-oK+ma~7Nn1Wc2CeID_eaiG4!hGrY%D|||;p*QS# zVqTxgHd$)hH82#47w}d%&7s5)-Dw>az|0;5=f89nrJG1|Laj!dgGpY*{B#rTmvZu5 ztK|P-YvheVvsI`8_US#}^>;qcAyl#%fG7jX$=Fx@86 zC-n5b@z}Aqo$bMYT^fyt1SEr}Fu!~!b4@NHPL%DME8PrA)PsWS82|pnFU%vEo~|$R zAw{6lVg^Rwj(>yVar@IR@Y*&4%X}ar)4yoYqV#{TP_GNgZHzdP8;P#D+`J#YJEdGv zgBKLnze>Syq*D0_xBr}nrpvQzm2bff+_i}-z5q7Bbl>9awq8*Dq`}5Q;jRHFaV!(2$jqR*kCgBM;Z)(9_qyev47ell+sRr&4asQZ<5tL-} z&0b#QR4rTUx-=@?zP0qN|4ESE6FQn&^*=@gAN56pebl%nx$FiwN_${cZJufxGqmLP z^3@hVo1jHW55y_g^V?89n-gV3j&fzt*sY)Qh3_RkG(vdOw?p=@XBU8?@FzD>cq`BV zpdAaf{*s2l^DRF+Xac)Lo&lK;DBTvkL!lshsuNx^|Bb0fX7yRjq7n~)8x5N?-vV@9 z@)r5v-#bB`jln3%FohcG80%qORuhWUV#5$+reKLgp0Ml zycVV$o$HAQj8!nO7O98OGxF_xX}vzoQzisN=&5R zpRX7%sz-iMuW!rzBgC;VzYV zZ|T!rgU_2GzE}RxNKL`G{V!05yqN7*8#!Pk&f=bwc?f0gR3@HDnJ`XqBMV;$6{ZTy zpgmp+XSWmh>vL7$?(_DY_ z^_MPZlYsJ@^$hFA+iFvsyN>w=N6JEgkvsABr5`=&WUMG#wYv)8z-RWw=+K$~&xvNdmoc1=}?*&rV_j z3ISOHyzqIBl;Wqn9@eD7I426i3wtv3mzDJp2Pms;D|3l3Yi{e+I9oWHbx%qS;&)l$ zy2GLB%e=-C4RQk|;H){?0L-(@p+D7|HDd z<+Rtxivg09acQIM?^eGvHn(HmFup&4)=)#>)B)dJL?Q-U;qN4ybe1WPYfU8^i`}r2 z2k=BRuq&4Bxa&UD4QrFXM^+oWh@rI%1nBp*jj8f6!qsC?V6|`=G_yd@0Y8ZIkmOwxo@=)I`Bd?ztJN5Ortp%Sttp20qmh%APAH$t`4U@+b zR3Nod&=?Q87Q)qPeA~e^`!rjMn(kQRZhMNGm)etGlyyu8Lj;*^@{{xHdJGx+@p|Hw z!-fB-!UdC#vOY$b42Im)=OLrUB!fITzpIx|e!sfDp7gupBpVzP+Sm%$K(@j6m<+li z-jd42?xvofAMd^~;{Sf%cJ*ft5y*yg4|0vd#_JiN72&39exY4SvbBaV#XixbjeM77 z4AbRg$f=1J)~O&;BI*(qXZ`_YdCubBg?t*h{r>SErmtabRkHaWA$KiFZzP5|J2?h} zPF!5ps2idxUO4yT1~O^$E=J@wh)pDa$ROD{X*)mC92#4dTcl zVyP@U983RxB}7GU@`Jy(XQ>nC4g-G>NYdCW01~rCl_P%3p{l(%jn^deeM!upYqRZj z4WEt$lqy-5UQL3dNn=~oGL@NURq^d;1T2W*!lD@ExyKpo-B2GAZ|N;Zs_`?v0p2Kn zch{zFW8}_+Y8!Q7)MD_o$rnVv-|X>(4p2?}gf|qdG}Ib3AI$ZY!Qu~mT?}g;viiB_B?eTFBhAJlve7)^?m?*NGgIw( zDl<1_3t++$dYJ#v>7z?J(lAdqlxO*qgy}IL5(X!$*nKe2>TOF4xepWbmyJkqbPIM! z`&Z#eUAu1i0%Zjz3y2AU_M{G7L6~_R8Rq@4# zPPm(F*=pvBy~?OBpsAh#{htx1Ia%_MBTbKrgPe- zZv(D(A+)Mk;96b7oYfw72VcwehtUZ8y9KIpykCC|t^;1VRx!0(dWWTOz`QjBD(i2D z4~xgWz8EJ*A2wc%7hG58Gz1Dit&6Xu|4LamIFK@Kks@Y4QO!?=W5%{GGmn7~w%C6}QV(wZ3C$=beJKPfG`+|0o! zn@B?Ab#NES2;LS?0(nX*dt6g*_aH+2_A|=(L$lFl?JH zF!|9iU$>>rHWPmna4>S-{CdwDuf#n&T76;r*=25^k3`%fqU3Iy$lt~Y-~1ddh~J$- z%gG9v8r9G)2VBKjckzwfH^lN8x=4Jqh_gNYQyNickpFd=ryinBUK(G=BW&D2NaCKy zqP3Ylkyix7vW#S4dNa^z9JO$J`P*q_K@neKBamSt#VKz57cUfb?6no3X0BWlM*8-q zYFB8dZU19QB_(yWBRf2LpsrA&dagYqpT8{Sb>uhw->~Z~g9a0I5nAkzTp*rdTml+E z^tT9I+3g*8k+#t(&2fTpYNc8$b0gM)nuoZWoJTpvmz=Kihvw|v^u_pJwKu*F) zPo)6mly&MYiITw-e#{nO{S39Q6d*L4(q_B|UToc1t6TcaS`r?=7l z+g6`vEIfYbhkjAN`t*l>!Qs&Jjhj)YD_=*r`&4Z2+;Q06*(kHAs2TcY?2AT3aiWiz z2IAFOUqAcI=eY5cl~8~FT$MYc5grApPMHHsI({K7t+Nz^Ffa&?m14|RN>4Bx8L8bs zfzuFB1-j2IiJZ(Qo|3UzJsDFo;80BO@*h z4+nDcn1*T(d>&pq%G2zRAF7-@CZiA< zIQwI4-D69*mpIEESJ3k(r`EQC5Npi)U5S8}4>k#pCujL;S;2k91(B0dI0{eK)rMaj zryVsz!M!EZhgF{n=!SAk$tFbMbdDrF5Y%cpM9ao$zJdya6`M(Nx-}-eU(Gd5fR+<4 z$!>6iHK0h&GZrV01|Iqsv+tYd*Lkd%4FQ2JrNK zioBfQJr`>t*mXzpx}c=K6^uaokAkl0aG?Y4`Y;2~{juj}UQAXEs?$e%m{4W7alK1-Ce2mEXXBzR2kd^@l`*pc5N^ojJY_KoS66s5eU zpgoJXkdJ(Fd=%D+@9l)tY_P9G8a6>Uz@LFif>Zdr> z&jmVFxyVXI7{u&Rjk$D6RsokkL%8FjK%fw9j@}eb=IAH1mX+n>Q;oQa-%woGefxvL zpaN9EW&x;$_P(OT8$2#9r%^z(RmKr+CXc7|dj>z)sR@T%XfLH_eBT5LV*{~;u_T{t z7^r(#!m;MdY)`ew`M;`_1?7b!R30&8?$79d7uI3L+Lc8bV9m_N2wv5`I>CDM_%=kM z0$U_2JY^m}3z1rht6z?J&A2aU2Er>Lj{g?<3@i>}9!nmGz6~wP8=_A^xg_w$PNR7G z8+q$lQh_{F`9#?)X-7?9QfRB?Erkq^rus+mZ5U~g@<(MG{P9jYkjWkRFtU7@B_f-6{p9>?= z-tA*ULM%Y_vHZF;O3`Uxb#GsZae()VDjGJ`Jq7EOc}SbcXy<>jh$QzePM}K{! zQ({C!5z$w<++U-wM#Z>=BkAL|IAVmA_O>Jrk5yt}&-q~?To&Pm!3>cr4~=o2y~7Kf zD4rv3b)>j-z=PkB#!Leu>AR0gc*97l=$xY%?DBDSx7frqXHI`pXU2FgoajvH(ZaL} z!TH1!%mTpyg?OLGJAL|L!3OjuPr0@+4i&gQcRhQQxQLEzWzO20%BAj6XXcl@P*8tI zJBa2cA6m(=Qxg4?qsZ!w_vlz&RB^lVudW4l{1m6IuElhgqp1xkqvSMIdVdv(uf`3n zv{$2pA@)$(FBu-n)(o^w1j+ijON(7LB?XDjyD|-DDD@Eb*1i_rlL4&x8qN9>oLJg@ zMM^f#K)Gl=eDOp1$Mzv@qa3x^F*>L$>Su}>MUPhq#<&U6Aqea(lxthKtI@^V6NT>a zEdv83O`=o7enF#2De~&5R8mONzQNbNRt5~jd<}=eOnT`y)3>A`JZxSl;>ei*!~GQi zwrNy6boVyUR5xic(12zxRWF-+ZL?J3t3B2(T&+N^-q2%-XV51{L zp2oh+-Jd#=(?P^!nw$oBG^HPS;{9AoXFgnDt;>#i%)|~G-ba$m5?}qX%i;EL+W5vFQuID@?U-v(GVq= zX)~}=$yQjMuH|0Zgni`6jgfm!qNa6oQ^6`#B={^V+c&2J8xhv;o5!jZfR(;J|E?vn)M9Y*DgY0e>2}NLl(}!flE1g}EDBeBF&qv0)vLWh!@9Kw* zhPiyATDb80C`kAQ+!FNE$gHmeO!$0%l#?PYhvufF4cmrEwh_Wjy>^jGwwJ$ea!F~b z{La;JP%aOjyCc$C5V+71rxxYS*mmK6V2-Zv?2lC`TnuU7a%CJY12Mqd5}P#XCKGOC zGKQ@Cuqp^wF%!E@A4R78lsISmv(owP)OR|J*p22q+t)YKIBvM1v=>Sb6Jz+3gONyC z;FyGz7}z?LFX}_+$E+Op?*gpE$_mzI$7Rdh{qH696=R`!(R@*PV~Kr3vMQ|yfu1+Q zOZ8)4hapi|61QFB)Wnt(ldYW_Mc(4fd5^iJXiPzEBfgPCrLV5QsoTrX(&4D#@K!!;(Nk}c*x*Mr_;_^FG&_7gxmY@S%t5^qMifeeYg&xW`AH}H2V^)!= z(QILf*KF20a+^)HsR~wNg@*}+RDQ2yP_6NGa@F8xQkZbcSp+{hWyl-dY2}ry;On4Q zQ#jGK5c2F-S$~iIh?9awU*p(8$Wa6r!uEM#I&*N3>dju zULE812Rl2VRQ^uJ)$4M~{ji)BR#VoE|E%x4l=!Klw~WZ#n6%ZJw>Gz3l~OuTf2L@H zF;iax@^|*G_p+ZSBR5^w$f@M+U}A4X^k5)7KbMLfSe7`+FIA%@3Tt3U4VpKWRDE8Z zc%u-fw>2_?i6@&rlb&dPQS;rII)+3NYdPMe4H+Oz)gnb-_cEvkKE)Jm_HY5Y ztVSQXP}#W#rT3+O`$ob@t{>5IrwrKa?N&z(1igrEcy6An)~y4V3xkuqnbp#2fe!XV z4zxo=0=f(s(2pBQ))V)NnFlG_?GgecJ_|r+r(dP~XOMRDYO$}UDg(l7lu>Zu(5Cfq zL!7F)_~3!hvE_wG3|jVSj>OZ?8zo^ehAo9ssz;&e>9x*Dq7nT6|9lk}|<^7JPOu8l*;I z9>GyvdsNj=+Cqs{1r)!do!~*f>hujYjI*EKJzhUGZ0gVZ{$ZJ>M99iql%t#W3S0t7 zAW`ZKn78$yDLvh~6+4~|YtB5r7Z(F$&Rza@dAYwYul`vx!m5?r`9 zB+?c@n~nE<^==}4C@AC0#J6;Drb}~#8;NHB-N$o0AN5){O1|M%l7Wmvqv==C$ve81 zNf+@@vrL#_D-lWCsBo-L>8A3I1SeKfP)7838P6pF%`-UV`mO#5EG~5J<;fL8j)4j5 z;JYPnZxXy9D$S?tCqEv>e3N|oh=rw6YbIc5-=weU)#2Jg3a{nGA^sAKl}3s?gQx4K zF?+(|X4(sR{?gt9@XM=`SHdF|mq)5sK zsx*Ff4wrA6P}7LjPv&*f$5g=Z$HmG4#(gDWzj=^u*5 z-rL#TKsx4y_m4~TVU^~zs;{@qh8F9r5?BBg)-=_yvsWf6Xv0akmR$K2>&)dgA-~gz zj|H0`oQ_}0GOFP4Fn=oVNCJaq14zV&(>#R>@d~!$a}n&e(#8G3H#e19nU9~3aGoC< zf9KclQs{pkUnnppQSRPF5Jux8SHRbP+;@=uQu^Y%FA+2@V*8+1}DQgluB94a(lx-(LN9} z*k@o%hn=)v{6KKjYLHGyNR&&_qFli6+dEW%E;rz83GQq;|>UmX>R%;y~zon%TWPm8>PtQ2|Zp4 zwHO9}VPZm~vXPZ3*DVWz`Uw2}q`8EsiEu#xD0Raa=hIKxLe&i?0u1D~)VB0IE`@>v z*i%|eMLZsius4MbC3XfRs-(Je>D>tk9~Pj6PuIpjfg`}vzSDpha3!!W`ik6wObA0! z9cnT^Y3Wtp@Q#-}p`;%$Do7zj%$F4w;MqIx<(Jh6^J4KEoxFHC1WQ4TxusMa!t+F-)9!oJZ!D^Q1@6-6!TShrbo*N$lC)+kVz#NHei1P>RzVKXxwAIA zL!Is`N~svG0LEwuOJ4(SN|x0bCx&UQ!q1f9SC#6I)UhK92)yM7PvkV9E9B$|=Wixa zsI=48@a3h}56Xq%8&_ynJggGX^D64&6+IBf0j|WU@i10==C(c1IE{!LWHC%pblBSy z;foV|K|`~zu`zhPaeTa%6G+FloEW0Q0Z}gp0V~*+-_ouR=b1IgpVqft4Hl*iR0Yjm zJn~73*|Qi0BFW>?fbkBofDzNE z#uEa|@eF%7)_xLP0Sh9`N7~6qY6||4YQ%UPCE7g_3oT!;SU`W9mn+V9XN3}p9-kyv7fXg} z4}9rHe1IvJl7ej#y$~TjDuljl2tF!13BT;a4bJp9Zhpp`fb)2YLVhoi3s+}@i?b6u z{XO=@MBq(fJp=33at%n5t6_eg3Pke}_XJviCTzWxN3Vvb2w_ZRvztEw%*+sDKZa!S z%~U0=;WqI><~%`~@89t`OE_F;$;IS?596Va)8h?%$0T;6VwCk`#W!X_9xNfM3MF=q zYznxq8QVq$*?szP#K+}*<<;d|Z##UiMmc(+WbVjqz(=1&FW6fP!kQ}ir2a{VIYq4o z8vm?tq3zFv^ITM^{7Pc+TsFSScIq1{Vzvb^79$tacIANhy^A0Oy6f*kb=2v5xx>^=m#F`AwXIk?FKEEoA21WK0M_Fa}!z**)lLpsZMG479XDnyC&R{wIh5tFPY0*fXmtR3U7I`WEJ5*1v9 z5chQr6;H+TULRCh&ZJa!Di?V7bgE#EXD7-%rC%Ja`&FHunRR04)e2Kc9N3wE|I+b1mK#j;cPsz1T3wCDU^ZdZbM3po8+)|J z>+!V)R83&F4Dna=^+E)|Jp(1TGo}eAV!p`$T9vU#o8=^aQ=W*1KcOFjYyi~hS;D8b zc~JV`EA)gVXS>mG8H9oI^!F=(AYqsr9|#51k)PIAVMzejcC-cxuhoA}Qt~lGRqdkM z(qmRmI7fGs+X5;(1+8t58iHg#wZ~2tYP+gAGfL-4jj{qz%Ko<~0bg;|XaeIPQo!+O0!Eq0hg8aAe z#Ewo!0!KzYJzwmPdOY(uE*XgkQ8&MKf=~`Z{3uZyry11bFaCf`v~c z9Q1-tfYocsUmDsf0BiKH@)W>dZ|0{ipf#W7zX5*(;o~L!1o+owx{EE0N5>(O?_vy- z9!Otv50 z+J}zV7B!?NafXG+@N$j(Lrl?GkNOYi2A6H#BX9YBak=g33M%weXWiWV?RlH(Lu%?V zM-w|W>W8}5(>yfNsaEDprz#4)DpkIEe(@qVvrOz+$0+cAt|vTRz&Mh7+7t{%`qh*! zE9;<>h)7qX^IGIx65}_(_TYe!0_@Ns;yN-d1FWO!6mDSE-KFKYJ zi1cfnb@Q$DI&bsw!Fm;gY7sW;4Tb!;_&E5Bco}v^{OP?3;QwlA3t98L|8jgi!4$MEH`<3~L`7Sa1WSm*x3hS28uhN$tPy{c({M#;&`GA8jd-h=xwpi486Yu#9%>8L_ zHGgx+tFWqc2huiW&|D$wkZ*);Ox3Mi_c0Q%`PiKET%>nF`q)HH%(}E4%r&$o)}s0I zc#9jUwXd75Vfz?9@@4OhwPF8rWWaHEiMF}dJ1GE*l-|4*a{I!=eQ{g_ zCV|G0wS3mqa%h2`OS=5a@Nar|Hp6jmQq$Xkm7O=;;7jQ_KgbUD_H@9168szgP4F+_ zS{P}Kl3-J6#ftyAvmMZRJl};n{}*T~ziK6#7x}8XGG5=OLt^lR3vL0R{A-r9IquLW zQz4XrR@!Xi5;OKTy-FRgf>5m$eK6lHr_dK)tlfNJ|LF+cy(~iQV#F1v(0gBqr84R& zb>B;xO78>8IdY|AI~T>uqRcIy`=0(69>w~ zuWQ|{XfD2J8?UzShlsfH?ayb({dhq)neV%sMEg7T?wP?1PMo=y12W1$mD*U16Z_^y z7zWeK43>JS`?vW&Vqxu6>MSDC{oLG4Q=;v2Z_9I0^CamzC&2!==b7ub{x6W{zo|RV zKHFV#^FFEZSUfM-+GX)YUCr&+I*k-{G*?=@i-VLLr0NFK3@scBAF_k(NhEWY;1(80 z!$7GjD=8OD#*&ULB|W5eKJLyAaqPhq<-s49`|H{s$1PmvcGdLowpPCj4G0)&G*rSfyvdTYaWwsV zuF7jSw*PmCq`MIG&y~n{!w!$bJDF`*e-&h67Ec04(i^xmjWWlWOr1R(uD+q4e!KLc z%sQ;l3{!nzni>En^8c4|+~CGfvd7K7;uUYyt(Z4-n`EKpEIEqj|BIL5&<8=oHZN&lc`($pAv_gt;% zl^B-WMSJWtKh~0WUQhQ4-hB^>8V#Y477qI{YUTatXxU$^F{y3#e%t}VxRFP2b#`kpbh6X^5h+M}r<%^XW>5UP|+kNqzYa@M4@Vzf^Rz4Rq# z@${rk?IbPp)m&k4;u9u|Er}CSx%r%ao>jvODEfX1fVdq)at$U35C$KH=GOwlP9An(XYp&D`l|x@pl|8oplZZkefXNv+!WxIt1}>gsB^jrj2C zQ`1(pReN7!u2rt4&U@3{r*AeW$YLztHW}L$aul5)0)h_OWsF{~Q{88LgIBAw_sEQ6 zo!tuo^xothPpQSFKktq|BH#U@9Sum!sP(cPyi1D^XKH(B6|VVtKYR37BF)k3O!e7k z!-*-9t?X<~50*Mz!`oToc!Rg?ydAD3WxrFQf6$0ku&f)!qoNmK0ox|9PeJcqCU2UH zVX=ph+NZ=<&fG$_{En8|0soEjYQWouF2@E}Qw+`=&5)H1pKi>ef6}G@P8pww^lWqW z=xrm`?{lWm1|EF>BWL86qG%k=n?xicudvqgtfA1m|CKT_9=EZyJ1@lAcn56ziC-2q zJyFylu7EYS75^GuvX)y7u4B>7w#@TV=oU$cS>*ach(#GbPld#TjbA5)e8YmzoX2l} z2->(BfBP<)p;)V4M6tC;+UPuSXR^BasPLzt8XLEE#@4)5dyB&0v1aOyV)6Usj_uC4 znuTqFeiyFz=O1T6qniJ4Tz}#aO*@4Fh7^RMIJc*Z&ZqFz<=2&);Jb=ttkSI%v*8Fe zWgm|#F}}~f0g*z3a2Y|f5R;v1_ml?GB(VJhf=NxOaq3USXTigY56*$RV+ zE-~0RF|LE8#!)hf-w|>VKQ!gMpUA3dugaEcTkLNWLh_DKhnSkSsM~7sz}u$}Y|N$; zxgP%=iVoX5+*hKQ33$Uo8brxgguc=5K2ze2a#?nGbF!93C`n1ZhZkRZWT+TEbHiN2 zH>Cb*B?0X_S8dq>LOVQDFbsY?@l~$BJS8CUZv|08>zJgT_7tn{Ak6^Hs6oK7Eb?bD$wp$ z*;JamH4^k@vk*UNC3r4^kdXXSN`%B!0ghqHfGfyTpf@pld`tcj+-E`$lUhc1E(|0U zz_1&}-v8z(ST7477mq3%+>o+=tR|@ZmY-lVi;}@#F4`RQL{6u%7Tcb0Xn+4y<0)Nh z@$FS%M*=S~C>${_J%h&1m5WKVi?!boKO8k=u_MBCmKWaM%2#wLupO6XHdLBnkzzQ$ zDOa)hy2W4;N#!$cflqTEqNZU&6$Rg8xuiK%{ifvuhNBuSHj_J&)-chOCu;lzEXD=) z&CHv}W6qCA@PqUo(|=+h)xi8F7QJy()bm|qG^qru^ZoBoT^$hBBX7>%x}j;wu8K0j zex>SY2NK^zwYe~=25CQzFe(QI)Gn%9!e}oipcVg(oQ4aiyX$MvRfWceI@_9e(4>vK zRfnz&v7A1uOl++S+?Mf68t4OREvrIa9nW#A;m<4x?b8@gkQZ%xJfTOVVxS{9#?8{e zn$WsBm1X9x0Xba(7*#MUC89S~D#2!n0%nf4^z{9H(iJ@z+(-EO?fpVMw zoSi+I58ZMd>#Mm11xou`Jx|DMxu8k$z~j;6ClyJM;I8Uhl|i-F{#pFHFDPso_j!U= zcAtUSbu7<$E*{Ca1<45l)IR|(GNyj{eugHK@ePo;j^8>YAqkQ+@8=^b@cbb;A=9QW z4(o3{3f7-uH2RNvKsJvqonyG7>PFy9n`uRx$Lz0KES&FL{BJ~~nwVQsTeppkV!^Ka zi%W-2``g0rmjt?n&Vh%ao2;T1mnuc*wg;6y{sa~zQ&?^}G?~7Gmd(n{BQBKQpF-N> z@CX+#AF`>14=Up{q(uBHgXF{|RQ~iEB)N!G@R=D!kuhUqw)Pxq{FlxPb?}$zPi=c7 za4X0~izgd9V>0E_)qc_r*oAJB(h5MHJ`usp51nL)G((p%j~tge4s;sADo5KN8rMOn z3gsL3bnd+F8h@9UYkKK58$rL|1iA*ujKt&}7EAvEt-hTEDjP?~QKqrs!xwCkr^KBA zRt`D4So1%ip4y2f>{v(`#>RGN$YD;jngOBC68i648Kdc9>Xc?-+?6B*w)7%dKNl#^=a4i(8c^8@cmkkk0#bI!&%RD>55}D z4;2sG zjeiYYE^Q_v*nB!7$ASPD9`jV5=+b|vwT<)LbpE4|8Ub=@fYem-HC-m{zD%yX;@j+X zz2USGDgo-+uEE!@c{k}HGhKgdXDojpA(vp0lM0lkv-zWLfLSGVcBFZ0n{?sAe7d}{ z59&Vk?u|)(D#h!5(h@R{f6@WJ;~l_P=XnNnOR&{t4Z@QYg@9Yv%A)@*s{$~i1BJ2u z&-cwc0m6!A$L{`sg$Y%9oKHC1N9QYeF;&-6%>sd3bb>B-jFsXUt*(jIRvEakZd zDP&LX2Q*PqkjWPQmrE%)tt4axg^b7NmKf^UAbb^PSpi9uqcf$hHgTe1YV1`5Gtq=d zpd$p^R2I*n`zjwksc84^bPzU*)++BnM?ylIoZYM4~p4OTzk&cU#Y2Zi0qo0>;-5W(69GR9Ik!Gm8Wv4vb*` z&BC}2N}ladYIXz!EIUInp#~UopCD%oixq@Nvt+p3V@C1aCB+WoQ!E$bCvCS$bPW%+ z+01QJfoY4YD22T;Q*nKz&W6-c4;8uAqlguZ#6|?9KBb%~YBOdSB-mZz?Z98QyN{YV z(U?iF2ge*HYd@iX3VBV-9L*aY>)!W5(4P?F(2Xgj zptMqKI8#=Y&UUr|8#3{)dMU1O!#Ro6bpe{USJbJCns{MRiY=0LMdqXH_s!nr))R(1 zJr`g}PeIU>DUzlB5Liy=M`Gn$P}U0=ulF3NX=E5_l9vi}{+UU3WDsf8R zJfvA{it2^6$zFbN-Fyt$4p}j5>SM+7jXvxTO=E{?rZnSOhw$i^#C;>$>XagjZ48&k zzS)fGNe`V8a|l`D*W`SH5z9bm>q9)ToLD@SYl2;?lNxHw_avBt)*DySkX3-Rb#Eb3 zzVE4k!gfHxQ&ZoC%VYWMM;re8eXLYF^nk(4V#b4<*9L1nQg1fe_K+>Co7fpE8?nvfUqh8Po4{Kk%tlV9M1nje~2@q zOja0Vm>{r(rT^&UA~E<{D7``Iiesncc;nCL!pc@LD3zJ$njOH~0NJ>^P~d+W9DWEl z;Ad%--pj$&s+RpR-Ynx>FDerW^Y%Hs0-z2#d5LZ&XGW5tC5}IS{_^Di@cdjLg=Oap zplPYpvYvfXC#_WW;=;$Du5O0THCO0*h@s@B7r2q*`t-zoV~e@Oy?*MIVLv$G^Y8Jp zUQ)y(fuE1;JDuwjP8`k#w@*VwS6jIq>5Bd!O+FB&z#Hlc2dwX3%$|%{2M`8Wudyr)wm@+y{z|+p;7i@|;T*?&A24HfBW3 zx;2_6T!y^QSoZEOi{_uFGNCBe#@6YRe<9Or)Q5D1$+tA>4IX zpo<5gaV+MxA4uQV;s0SLM410swkr$5`}!2s^o^RGdfeg9GGM-PX`H=ZFW*%@s<|Ph z|1>W$YYd1${;O}1UkR0&;^5M%!W_vfX&tu=o;6Bi$p6%yu>MS>tu4qGcK3O1ZRw@m ze6|#qL65mNfnG>#&}T=QsVc6XRc>Ka4*D|4%C$qZgQmiY>=Pz5>}^Nb&|&z>%*-~- zGyT@{_Dy5vv&G$)qaOFerUzp0u)KRNsS~7zxtjnV<@I^10Dob;Jr{b5deS;IYQ<2S zW6EV!N@n_F`voAS)Y(4e0ShMWK1!yS=(CoDyBMdjoKkZjxSUiv2KO>?NaONQvI#T$pQ(mmT&L(;2PmyHHvDn{6RI(%5D^*Zks< z?}YFv;d-^EPi6aZZ!iK8er%?w-6skNB>}KG71~2xctky|XV-EF3F;|gt`jlJMH+?} z{G9&*L3cvZGL5oD+t|NUF}6oalSlR}!yg(q@|qsHo(Q))>fo>_yiPv6THf_2e zMh&R^xO1MP*#+Rn=fg7ir}}(^no8~P-V%+sm1+v}hlaEgyiHEaEgApWm7J*JyTe^3 z9VQKG6XEo$?g%(vd-=!kDmYwq6K0tT^O=`6i1O^(SU+ntyxK`BTKGP?=J-|c_B|*+ zXq1PT1V&_+=kisM7;!(S`-1hw8O2Q%DmeTW&h>Of;9ijK_ zFFkPc-hWHeo3|8|44#bk^|qc`nKNykKlHH9ya=rZ>_Aa1#B3DB*bd1&KZ5_esYVP3 zcE0klpgZcumZh8GKc%h)ELx8{?{D8c+Z%cVTfco%GSc#VrMM;^D%tULqMqg}bHPc7 zYvKRI>+iYtqt~8Hd!+RryviclM*TgrGK`4IdBM5%FVH{GY}QZknM)74g^V^+rD+-0 zA1(KfLZ75}N|YSj2xg}2&HF433DwlU!uFl#yBvM`bjJYc$VU(DoU3s|r=|i~XKKjQ zD_8;w-3(k?ygwrQI21v!O`+DX9V*hvm{DoLXXJ=|KjU=TCv)p~%2!g62c^o?>$P*x z?uZ4~xTp;41DW3N!Of?Gx{~9y;ayV0{Lfz;pMvS@6>4+p^$_uapIramKiI{8DPfx~ z5g;y89 z|Ev>;cM6Q<`iwoH(Dp$6jva#*v1dA-F9UOymo<-EOB^fuS6vL%1l5b!L^w$oc2WFD z7o#+mle8RNZG#{g{-$$}0I{e#@&=bou7y}{?_ORe8lu2j$pcD{DIfwo6HVROAN_mi zwdiwQI9&OH0H}ukfhQEdnnWB5zHiyX- z2;}|1gkcre*Z&y-d%o_ul?@h-4J@XF@w~cPS~JyIGqsR2F8;|$pEEBy!pi5_yK#m> z2hUxtNUVSQ=T87}->Xcdv9qN)^Ld1eD-ZVv@62;Nxf+Mr{QoBc9>c!t7r(2t(WN<_ zDh>Fj<^k%Z$;E?Crt)+)TiArU4a;*JqIDEr-9>ek(&GP!PivCYCzpe}6hjQJBw*gR z55}+CeaZ~l&pN|V(bKG6L#Sx>9GrjWQcJFe=9rcB-O z0A@q^#{R|4OU_<6!%6D-y>oO$Xgc>Vp2l&E52qK^6{{-N^DUYs=LU^62Z+=1E#4f9 zkmVjvu;6=m$`7=C#?G65F8%b*L(aMJ?3XnqfV{*p$!DhZE4{u1%`^bXyA_)!K<` zog&I4Wo>N$^T-c@{`}?T5dvHvCy2X;)1jcpJGPH+=>&bt+HBr9K(<3|n7XGQ`LqqtI4-9(Vx#b@$C-OT0GBy63-HQ+Szn%d+dg_y7v_s79>Ni}K zx2T#{nA(AC;i@BTk*omE&HT(_-piWh5<;I73965K*@FIJr31TCS^B839M z-8Hzo6f5rTTHGmKDD8Lh{d=G1*+*`3lZ&i1v*w&*jF%)jJF;$l!qr{s>24J${l!NW zP*p{fUELg*qx42rqt5T8T~H!6wo_hjSqTe^x4+cM)Ik%H=R4|@r2Wawo8omdl8SdD z$*tjuROAeRy7hkv7g9jFY&YPxw9B z_4|~IB_sjdsbbBal$q&r89CwGANk$yuUq|N@=x}^53;I>F(mgHao*Y3rn99}bIBAf zpVj5l(rK%i&N7AE!#dV1PKbJc5xBVoX`wMm3`~F`QfX>JA(f^?WP%&-cW^Nr; zOTwn7ZG9+c2p9CaDEyCv!8~id>rxn5KGx)t{1b;hoXD|1dcv=sb|bxa3PlS2SEID&Q(O>ADuF-j6wr>c$l9HOfKKE+nwrk>rrIcWZC<$Gdc5_|%9 zE^gc2XU_aj4PD)JKcKZ88T^2a*}kL*DODd3nss5#o&#TGCog5E7T~(Bl8kT`3Mlni zFr#Pv1f80?u+LTiW&e-*SyZ!}l4)q=w}EffEir+m)6a}EPrY_0@U;PEemUtg8TZ7JR-gAqQN^)R!+ zE7uLH$M@=J5{?QD>;zNAM8*e>Q!P`ONT*GGcUAI3?eY)L2JUbsiYd*(vemz*NF4aW zl0V3>Z~?=0$Zubu)7@S34!IMqnA7`zUXJX;zN$vpB7NYBxM z6hJm<Ql64rNR zP5lwGH$H;bAz6{t+ASWlj)bVF?c0Imxg7kgX4*qrk_#RL0+!``+i)+jNlrgp9^UG{ z;GxwR*&8bN(|Y!`j^hdYvpF6E$Xv((iSoFI_^0;eqN9Rc5cz^fOOC0F^+Qk;?1OQa1ZhsKeEO=dW|YUYlvkMD z5kegkDsERIWKIc$6xRLC7bbKG`bea5nyl4sGTho z1Kb~EpV>M^S`VTggfm>@mckx(l81&xN16U?Y0L7HReJ<*tXGKe~YPUz5EAQf-qfPt^2;)K8Gl0|y7ub+#9werx1 zpz35ymLCquOjXRcVW5e@{4 zy2E_)3g~p73_cD-g#@D(t9)?}{8V#jEJE<&mn4-+O0VHk7YBd8(fzEv)lUtmLHrw? zE(u(Pn88i)m_`(DiCEd;;y4l%y4ZZ=g2E|*R!Q8ThgAR>ixVP4y!+X3Ht)rxCa8?> zbg@6Q2r=K$~l) zU-1f<%&Zyzw{F`jrZWP5{uj1<bVt%C9R6=-z&Hr8Z>zPfQ?zkXR}Urq1hW@l|AM4bjh`SISVNy zjhu7v<7a_L=)}6#iPPwRb=ihm&5GnMmWzMxjptnq-UFFZk0YjwSPcAsy#tR(@d|a ztNj$|*JuuAYPjyh262{cA_YAE>FmhQz|;|F4OiD8k&)y9l}w=O#NP{J`z$wx)Jug> zW5u$HA^Y+*w?wB47a!-)uhlHb59EX z-sXBmD$@TRyt_d6o-(c!c5~AZTuWzbPdWKrQF4-!p3F3 zdff%t`dvSlj+{9ge|2o$Cj?SlUMkVHG=@c7HccBcRNJQxP_h`#XPa}RI=1GhGO&FH*mo_oCB zi;k_8sCnKBXFfj9MLiCJ!O|SeixaHE`A~97j}ng@d01rH{1^QR^&7=gN|%Y(NM4q5 z`MNCYuZ1gkspRiP3N__LjzL7mL1c2y2@<~oae22~32j85qmVW}Z7}&8d!=52Y%HwU zqD9;{x=eMeG*?E38k{a3yC5XEYcdEh%q!z4<}!4rT%oa@GH<#WPe|TwEI~$xnQUdBpmwDQ^xfS8CK8 z8XKa>^YA5wN)i?#^xh>-3kHQ1+*6T5pUnt3h@b*8OpBrYqxGUnQb{{P!bKP^!aPQ5 zN`bO>`49nOhCSL1hZcA8t(rg%f`Zr3ttOOEC5$*iWf}+vp}-y{%@>S%e)g$+>_}YI z-3S2wPP{3?H_>C;hq72!Z&dfvH_ss%k&1nAJd2?Bpy#RGz8eroV07>hrL&Y_u?lVQ zox;$qov+q)KsjCN1cmAOdB$HVUSLr71@No$rzja&z;uYk^CuS$SBp|>6R<3Mo)!wI z>vqlG{Myg^AYm5r9f^dr+d0suuVmguS&Sh7oU}XNg?@{C5^8UV17k$Bi;?Z|fqDT3 z&d0FC?|gi)U97yKY6#z-o&tzk44d9aT{E86D zIqX*0lwtr~dCfLL!DO~3u3#qn!?k7yR{Y96;=2ke&f!i61zer7$sO@oYgJR5fqhjD)~b4YAzjSNSON_9ta#2JKz zw12BKuQkQW`5H^PN?tJ$J*cU}tBkR4;it^G%o~C0$su6*KKW4Npc?)zU`|EHm)KQo z9VD*X^u@!-_RSc;y6UYW$1BNgzO#Vv*>DoASdXH^wGgdBt8`p3%eF8g&B?L~tUW~Y z?;!9?VJTCa-#6;@iQN5%1$XB%uM<73ksSc;Ky|nSa;i;f+M+8%+(I|5h3QA*V=Z}w z+;5T>F-dslJQggH+K7!zb(3Y{1$mny$M;l*ET&#$Jh-*pAFfVAe(4&ACCi;EWm*ohd{vM2JTfJ#S#a&VD`$dI};-e z_~U@G^K0ylc@ioGhyaCvRoXlWWkif}s4KuzrQNv_$d(1yGWrR8gpm61qBmOHk&$E% zt06v|cq)DwvtqRXK11wM8T_z5+?7~S*P%=Grdm|QR88YTzl_|M0aB`V|Bxyeh`#0= z$D!6`&K+%kMbnT`EG%=qVX_+q7%EspDT%vWdR$WDD*@DH4dtBBk$X=lw4}Q;VR*r< z=~Nei-lRBICcu$rMagm35>J+19Yn+-&Csqfr^>`ao9rEHpzQDD*EH$r55qg6Nodw$rHb^0 zbeV2^v;W-8R%$T{?(<={(M222TQu<4JsA#N7X&@S3z}9;*(97})*jsD|n8 zw{fh$7i8v;#O1M?t7CTsOA<;OtMPJpQ!>rfG^s~GLe**$V}=mAtl~jgB)C@-uekAh zf@MxOzvO2q2$;GtVC&BPEMA^>RvMQ*&e{!;GX#W5enG(%oaAg~hA@97a&^>s(W&fW zwbr4}*d85=cXKFoZlz2b_DFsA3v2 zRYjyL5P%T7khm|?smlxT5m55~tM~ZDDTN+BMgKLY$en*Oura4pTm1Az;a5M;q2B{6 zG9YEwg@eU~?At$c`3-#p7a!1LtAGkoCtd~|p4^d(QO%03M983~;JN9u*qmM4`SD%A z-r>`n>VeJha2}xvZCeF~$iZIFb?NY=y1cwwK6%T<>vIhFH8OnxV%RL@l?%ZJ5jx@; zXOoA9O<%rmdoxCVhuu9-r6Z)a81^LL^P7KPY__O?Z52${(N(`&?{IiGiE{c{NV2L*wY&Kr%b-_)|P#VD72G-xJ? zcQr!!S_WiA>UE80Z+$KMO^VCBmr0m&Scb)-|i4x1e5?crYT*`<6C=2X0+X3o6NcAA?j;pDc7v`%ZjoU` z91Y@|I}b{^wtcTAWpq4r|#qtB=GjZgSQS zG88?R%Syke65O9-RC22DhUBw7>Z!7DEFWwcLiYJuIsZ&q|C%q-@fC6rHd|qMu-UC* zBWa6@2*m$kntVeXrmP*5VL;_8?(gvGWP?SHaG!4Mao%`WfQF`k!O*dPJS3;H_m4v- z#!T458}!QP96|yIQXG|UuDfkOP9iyn>(&f54@v{ckD+1b$7&HEFNRkGL!(>#BXr5E z)y6PK1s=QT7T_px>|m6Ttdc`>@uCh+g$i=pZV>WYXY#jl+Q(F%>w%sr77gIjd~IWP>5hfcHHnHSL`PIS?)?xw{;>KsA4cxy}UcI7)l*uf|AF28`*kr2#RlB z$E(0ulaN@15U~%7C>9?I=)-O&BL)Zun_I*0SZM$RHr64$EPG}rnUe!vypz%g&>~YP zSQy95Nv~segN{|K$9uBdKwVi{de{;7Ieh+9m`H+#D;U&PW;3KGR;>TnIV7JuuOG0* zTGXWz1x>h#a=6G;6jHIpHAVA1Y#q>t{QHKc-gx)Cu#xNS>$<0)%|~#6kDBE_4`#ky zd%Am`U{ zEQc6B3b{aX@XtCyX ziJa&qBV4n_3Y$+00cKGIW%X^iLoqvmaeY9Pf>VC}A&ul@HEMq@KlA&? zmG_HdGc=72EDaJSJjP?%sFl?^=DPsgGn03HEMpna-x^^MK0D9nsMxu zywb5&^9i(%{9}|hY!hiigMX~lLvkwTq9PkJ+$z9DTVC0#nguS6LiE&whVHt^#ad@U zN}W1exz4YIc3aAG^;NgI!P&Z7g9C&o;uXyb@P2o; zK(PHEl<+@#?~zmIc<_t5IIN2ghtJ56PeE0{2(Qa|^_Y3PlJ47mvFh2B{nn@!H@2F` zyDIX<*iX5C*9+ftaXf&JY~tUCYf+%7&=4vgZWjFiWM7d<&co?OVubvsCZoKBvm20y zt%Jnhvw5~iE7Z~^nX#8dn6n#I}r_O8j%-^&^t_yz=7fYPG{SM8Kq zUrqb}mVbqQWL7Qua}~1gJ)mHk@$au$QDVPfE~>FH=WvUo)Snj^_zyC~yM%?uU_;~| zlr_`B2XOU7m7-;&WDl^9NbNr=u!5{i@CZ^lR^D*#Fi3(#spnJr!p%dVWLzrfPw+eJ zJMwJY%~@QSW8zF1kN$0v2|V?oVAa3Gvh{?M_eajBZ8Il*VPWq8|Np*qtl!IDQT`>J zP^2oa)JvIQdkBgCY+r#dBL3;AywKmV@~NW4jccH_!#B#Q0fIn9UC-|z&VYlw4RD)E~19sNmmm@`D=+R-HH7Gv4e!QG;QY{hJY)5Vdz)ElbZo+Lh*zypi<@v$&&HAYf zo#hb2Xh>P_rU1C4yd73zm$={yevln=q1dSW27K(e$)Z~1&(bgFeHVc6zaA^^HUYhv zPu*kWcdt~!LD{MOZs1)u=<*J!fbd^Ex$idd1r*v_j>>^jq8)^_@MYLCzDKf#q9EI7LDjuO z-OTLW%DLB_#)de$0g32(mmMD;AyKDoSaro*v_giCssT*c+h2IARaL}?0O3*ZJqcaP z*h+AJaAYoObdV@|Dmtr9Jhct%Jp%bjzEmz1!#;AP*7-mE0;MVjz1$_m&=8ZwaONz3 zk>=)2GZ04haPOulAVzS?`0#(@a{o7I8`trBwI=p)#_R;-Jg^xl^JM5{V-+#qdK5{`{CcfU;k%j}diLr+PYw0F6`@BdfC@D3>~ zp=@BPhHgk=3igVy?!R~~H< z6yG0kBNI8aDq|ZG=R=G0ZnGl#p1{ziK`pqhzNr1;0NoSa8yVzj``$dvJ zJUWNOirxw^%-={HKYU_7O=#N&-jOM5n-4}dU#67z8OKe8B#7&Mb=~}MZ15IqO4dM| z8jxj`mlDO#E-e^vk+jdo=38MAp%qGR;K<22rVt6sn)>>zi5;HLSjAh#z;7CGd9UeAq`I-GacMBAGT#_$Ch%D3WzPvC-rB6ITWXy~``iKZ zDMf&FBH=nBaDTBO&mI{N@~Lj7BXgcX)$H|@2^ zKdb7PA>)%Y?SP%oFCOY^VVat%6nVoeiE*!)LR1Hi6c1<@5D|66R_>bb57nGChBiY( zB`B$*(I9fbsY97rfT0^x@uzGwh`w4D@x)sU-HXAm6Fb<8(Fg@>fBPx$F~C(`VFXz=u#IO@bKM|n}gsnTnbDba0}Px z(|9T>$oeN^jDZIl4pPhh`&|mGplHCyKA|-XEG^jmLC|%wjk^c7sZTx{=b_|ZBvbU# z)a`OM3a-sY-ElR5k03^d>c4{BfIHCS-wg^#HO?4vNfx#^;tw?rVMH2o4EEutZQqfx z;>nQQ-;91YSZH_saD+WP`t_bR&8pc)f@lcb8UO2~`2BOja7&CgHtI+KgqGXh{DOp~b z@tVT>uYQK1_*@-#{TF7!^^DGNlH4>CX3q`;S8Uo$Fq)Lq=IUa z_!62tQ>*OpuT2C>1XLT<)$O(+A|NfqhHP9N!6 zmn^37!;mpAR;_oYw4e!k`QXp);&)FA#r(fz&_PfwR)rp`Y9@f*-7#3@jR%ResxNA{ ze*zM_oA%uwxgj7GL9OS5*>}EpIqh@Td#)b+HNaD6xl-mmI*QG08O0zFaDS=MqjW}O z{-+Oj2Z0H5!mtGJyoyLNSkHD1JZ7~D3Q;Wr4u z(znuNio~FPx;vIFUmzBqqIc96sY1DvJve;?Gg;xDLyjuY zW%rRuAd3B|F(n}z1$GsRTH5JzDLXQv5IPuJ2ZhB^%sEs>Wh0Y!83 zLQrRU2ZS?8E$M}DPvAbM81qIz*%O9n7qOf8_JtPa(F7;ZRYJzu_Su*pN}OH-h0z`R zbyN&P6i3>!ncJ9iFopE1m2><~=cF3bdC;yBPheX3;WgN$<%-6`foF%c$hNM&pb;=m zLDLD%kb_k3C4ditFZ3kBC;%CluZ-1V!ZC<$A~6~<;_zKTSk1|dd5ZPh-o3m07LbfbnulW1i0tP$VJ%1Z0R{mu9xIUFW^}TG_z;l`SGf`Og^~x>zOK312@i8#(Qg zm=U5kxIUI#2XMZ0f_<=O%BbdLzsmO9?GO}h4sixbpE9$>pPK3YEOUkG4NBMh(YEbw zSex+NpO(DvOp=p%<~P$WD)7)KOgSWHIaOJ4>5uP~%vj{(Uw2zwcJDvGMGTuETY;7h zF{zwngO`ihxYr-Zc~E*qc6^{Ay+Zwh=SE`Ib5($RC^C>wJ~r?UEs^23vNZkB=~R`| zs1{;U^wY~hM=P7nA_sQt12*Qns&~5A6kz>F4G#?tA+t)Qn4U1nEU$AN)%m26lriZ1 z?qV6Ed7(V*A5@_pcZ)u*X)Pd}iE=E^%#jM~mbQ&jN7MNarVwQ4LSKto^6D>HGgF%D zS;C(wau-tvqw04ido;4-5@_VPfj)6QS^joWxa);V{MT3N(GnqDxOE^*30xHiZ}dbN zA;w|SgY!iM$wF9qDt%q=VPugBXNqMo>{f`>(u5OB1B|4*mbll^r9nF=M^2BG_7#^s z`PopeVzSGeSuXK=%(1IbQGbB#K!U-LSADjo&)>ZBN)yPBVytW!G)k3G`f1C&5qf8iM7?d^30!xrAUS#P6;gmDD}MzVwb(rT{6TrUUaTc(>fqZ9WKf#vI}uh zmMCIM40$fst(|KV>&UKUf@7ip;!ppQLsZ6E8(XvcRM%c7$ed1anJSHI%Q5!t<$RtO zwtkCbD(A8jbVgjTYuC<^yDG?^zs7j+^zy}tI8?nqnNgkhn#WyrM)YF)BbRkIRHJ`L z*L#DQ@E?>N-Pk=2AqRhIpNC+I#Z7uL3tmhDBZnk6^K&K1mX!n)lsS1=@X^7AvdzM?>&F;gXmdwiK0T^l$h+7#g5^{V9x0&#+Xl!TaVDE$ z9uGJ<2~dm8swE)lDI?Z%%LWGytjak4a__qQ0Ehp=zHyScjZzKTzI~+~&sb~y z39BUkWT7>uDi1C0!R6k^?7v5M2X)yx2<5tg4|6-IVUi?6YW8MtwcjT%5M3;tD8u%1 zxRQ=aLOkZLV}F@r3*!0@KS)8}ysXx)ZPJ8BRtLEx=j<4=Mbynwdem>Si&J zbG;;6$mHybB%Q2@+9kBi|C|p&_U5E=2R`lPfK@@R;G^HJ=9aD+nYqQdUEV zZ(deza57h$zKbp0lo&~&Pi96pofQo>Np>0QzI5K>A4bOUW~5B$9DqK359EC}`pz`` zxAymtm9KONkNNrIl8fw%{DSwtf|;ygOh)ZxYzGu~mCeGA2i)SAHDR`|sUjoX`AmQm zQ%%5=@Ao7Dj)RNpqq6DNUbZw}onz;^VQW^*GlTCxL<`tO?Qitba3=C4%pY6`CvtFO z15fpEXQA6-G3#0j4>tmfAlT?n+tJwER zi6>9~cqZ1V#I;8#+xYV!)y_#*bvY*o`jmZl?ZGq8>x?jmx;aRDx&lNy1jCLJJx0Uf zI&Nd4^^J};cK~JWvUL0auTIj1^+rE48wTvJut8nOd`XMN);hj-MN@BGg*1}W{)9XH^ZZg3NkA_Ehypv1<7pbtxKyB^EQKYh~pjrkkpq z5}MB4Pq_b}_-A)w&vj~T!r`nloiHjKC!H6AGrfEFdCkn}8hTJ<{MvZV7dJs46N=lS z!Mj%y$=((~GAhPr!Ot2}u4!U<*-_dX@I8APzdRlJ#X~w#?A9qEWQ=xp(B@FCMiRR0 zeF+;^aKLXZ9EJ&zcdEay?r!s#!+EC0jdFg`eGy^SVEG<%4ra_~?FvN42E@xN43G## z7GWM@lUF%vz}M-NmNa5EsNZ`!HQ2I2&%bWKbHA%FE&YSCU~KK)ZBQX@ay>HC@_qH< z-z9#3=NOHVx8(64>(>E7<+V$OTz1@htyNIE`(7yUhf;kbJFvqYoSU-5nL(-*;su)-VUNRuJUqQh?|b) zDin|st-<&W^Hg*cC}hKN&D0E7jNQ>j#&1w`9fNRVzo{;<;BjmR8`6jyq->Kp|CL-l>xE zXXe5;&$#@lA4>8?U-{jWzGevf@MO?*G)5$f!BogE3jfcK9RrVUt(xgIUV;?}1vt$T+-YRpB+o&gQ z$%6S*m4BagQnq)h$}NeUP{}sYbs5g}{IbsTw z_Q3BdPh^#li9)Prw+kP$Qa4z?tvK4mpCA#QAzfmU86$n2T_zu^6I;s7zasKIXiOlh zDxBCl{JA~zqZ|@!eAPq-1>MC?{i}^&gaNp6ZFht`v}}cuur+jlO*9QhBniw1*@g4PILMlmp%c-G;*Wt^ws z_~OZ?p-xMxz^uVVqkmz+B3lgo^Y#~4cVs!@FD>VV6eliln547K8nhpnIiClF7FzCq zte2_cR8DSemp-*yTHh+&33H(iRQv2ldHQP+T0s?+fm3v+syYikD{6n+e$6+F<)sb^E!;vEnWO>C6mWw=2*!THE^-QG>6Uy~s{yHN|iB3WdWl1uUis5|!%;h{U}v9f-TcbMY~ZNL#JQ7z zx$=yU*RQANZhLX2w5Ynq9y#-0Yz|mhq5f)V@MrI1*%35`W3bY(8X_@plAYz6Gl^6| z&YU#c7|EjGtI%*c#_zelDQvm(m+r)D3$ixYCzNFlyCY9>{O**Ic@VWI@E6jVJK?Ak zViNO}i*vZ5u@;-o_@H;Et3g$mdr3&I^1;xs;YJp?viu=7=EH>7>C)||NEhiurv|(i zSG%03fSs0#|CYbpy4?g8#h>j4<4C#!A_xCEJPvHWnSArMdU7@2$T61B_5%j`gd%6o zET;idKP+rlGgBSgeq>^R{&G@pk1*%1G0W{j;@^+{+IU2S3@YLIfD~<2ks(G|W=-(M zq>n`%Rk>-+R1`0nPhK!vTxmq>>u{=09!r#XU9Q}jQ#bu=S2M zx%*pV0yIFkY3?MK%kk8O+ANbijGi~>r;@V#YHgq4zY|1Y8}p<2ReNV{#!B?y zM$Yo%deCPX;#*+~HPr##Xrm(pIZMDfi#HVfZrQ@Xl;d=>r6f>)0x1o432eS5#T?e( z=(SALmh;FWO=xfs>5y;~5mO4N_tc*luW@=`;`UwoN%htQC)O5MHO8;1d{w}~IrH?> z;OO6GIW-IOB75k7wWiyzSI=*_V4iOmE`*pZo5Ng-2sS=dDNz-b>%tL*4x;S~RbB}? z@9(cQ+tpYrLCT{79v~?EFIIW+D#(-?4C} zs(2!6w|wtP+PLIwWu84SF->bIKu9v6@e9R*d_6j2Jb6;QF&&xF)0EwLT|t`&Qc;TS zX`v`>CC>?b2)N+-hKZI4figWHxlOBx&ZM^8uGVPKP=h)*o~9Z>71|9_rQ&QoH)utPw+ECld4ZVf)~3h{ zPzHD9(Ucx#G46`e08A)4B)Dgo_Wz{>`sT5pi9LDCu;WdBC9hpdtYm9FebPgT9zO2?5Fw0&@F{)--$bG$ zGk$cz3(C1eiGLHvKV>ZTIc|^;8=;C+W&ym5r$H)f9J5&_ul6i1B*H&x%^0#y{)3WP z>^Ll8E7o(o+8T`)9PkYnwLtz&jpkyaOx*dJlBTK8ZBel5cfT|w>n)#IU%*}nKd1%caYlUdppK z*Cu`zpZ>yw9i@edujp29vv;Ke^(E%sXeY!(I}kd*z0Tu5WcEIn1;?hWqn@wN)$uC% zskfomNX}w13YitsHZI=_Hf>OCnb)?>)F@fCMHDjM4{zUGn#?6jbfaB@7v|9RI_}X%7Ip_qmKh&E$v6&CgbXx9E%Y*6$M6x z5gCfg0Gy&AdsS)ZOxVe3G|Ne{Wm^DmH<4ILDb?+>vrRpgqY>67vCpgAE^@%GLIq;xT^z05pXy!xGUL^A=;r9 z8q+wqF>Ke$Ot5a>n(wF>nb|Wqt0L97TBpr~JX=#WKXhmmHX1Giv4UaIH$>1_d5wd* zd8jjf$OvVTl#O7Z5{%9fB1)lgq1hy*D?-oIt)?}jEr+!Y!*vLaJKuF{EvrqK_W84w zO#il(pxgt3M}mn#v+i{)V-%ehA9evOR@qOq9Q4=WWk)A{&;Xvw>KHO`Lqne5oh}CJ zT!{Ih#+q7%jnyvhhHXc_d|{gNx)b9vKWL{SDy`9f#hH)yV+0!MGzsTXU-~j!p^Ccj z$7v1C>D=ntG3k31h89^0Txb?DW`gs+%<@q)H`|vje;6z{>M5AQym!Hzm9fD^*=7n~ zPu40|jn}1-O{UsQ5cq(NaIml*;~$vLt=D)9IHkhzx!>+C>yIM>CivYZjmK!z}z3T_f=Ff+H*}(?%|ZYsm3%`6!`XWT!s+C)4)<+?7eivuy+k zMDugTSudk4U{QQ)Gh(+Yb4NBW+h8j+7A|*j(%EyG>qx}|5RKs3uP5LNCJUy>fj#LY zlE+Ma7m*tRH@C?C9+6i8Ul`pn}-~} zWsX#?w5Oa(WcFFQcp1k#Ja4o$xy&2Ka$>|2I1$tY5`f9VPduB>JQP(4#C6hx2^iJ3 zf6^If9R^|k3;m-?pz~kS9Z}qxC`6|w2rK6C!)8He2PpE0RI#4PDRQ`k?aaD&ey-9b zue2X~lLSY{!ZMmBy)p5Ay#{n7-Ek2ANLXUIjmlsjykgTWg z^Ez_4S$3c{77ZtP{seh1A#Y7LKFg2nC#oG5=4X_34=&;FX;wYiLZ#?LR~nD58`kOj zRADbcn0|L$TM95ezLrJh5ydf@aSu)Aj01@?*7N9Ogj4X#4pHVAi#i(qOmUYdq$8@leR5u3K@6IuIoIQF zP|ag#J7*3T@~xMJ3Gj{7>Q|%hW7Y~lVC?y&8YN%lbYP*q#+-em;Nf=ghqcxA#X+8; z$XN%ZkHdE@SPDD3quPu`0Tmn1Aaa+sZ+{W zj;AC(^t%XbB9zxA@i%zSt@#;s@`tv&;%nPDAx zsr-mjso9h**&6G^gfLcYV~tgw`zA~nqtA_3~QSd_9UUk!&)a z4}IS<7P^_rUNl_&tR%EDy@B3rn#Yt2OU>tK(DsH@>y8@?Oa6oMbfmhoPkEnR)t1TW zug_S-o^FH*5<6B1(&$%{uZ1q}dDD$%Ho&GXETE#^7*s6!tGs~yKp34`87T4pM%vfkyB!q0?c+j>ju1=32O`|EHf@-GD zN5~y>JuL!^M7$mOH?!f?ut_|8CxhjJQxv17ieYt}xR(KWnvGqOW;n<7Trhsm!mxQh z59>y+eWj~H+4%f+7$nsR%(E%B;+vQ&hOit-f)krGb)QRNm=_%B;iH<^lJ^BWh5%R9 zxNnJbr?ULUb>|)$SOE|Kma<2Gg36@-Tx+hS;xct^m*&1oQ(i7)^ck6;u%xlA!YdM= zs1h3b+m1iy*S4U4-yi#TMV0nybLJ9IvtXoGENAmu7n4}JcnSo zs(l6Nao1b?l7Bcl!N#w?{g~%_3g93(Q*9s-Ng(>MCKMr;-sMpl=vahfim@g`SC%i( zCR?2v1pgGxa7}`jG}$XFVjbG6gzin2(aNgCOAXXfc_>#&8j4E6K=}li#d#}d=`%|_ ziS4M$q~r6_T-`NxZ}jT%>*yK|N-zji!P)rOD9*9qqWlSU(A=qy#^ zR+>3v`dI=sN^}R%?!+4~;=~q9=(2~$Km^FxT`^Hq7+3jY9LVAp;IXMoi|GP#7FjMp z+IiL&8p>l?hfU_&J)boMXM>FUpo3?(6(rN{YI}MumPPbYZGb0jXx+!^l4HdY$Gt#p zw|0(oGR12Z$(z-v5cx%Jr0V_(T<@oN?eiHLKPA)_q~I5ho^yL4rTyYUtYD|wqm&z$d*k=IS>oWHvDl>mpkoq-4eEU9 zQ4VRp=?5`bVNZZn(1ia!6f3^vAW*mvxB9HiwBtqyE+bzMTD-oaP_c2|26$tIJ}UeO zhJHm! ziWZrH*QwYfqyf`V_&i`UoIY|fEFzvcj7v)@wc>CEF$^NxDN3n@5aqWysmfEn#;1+~ znJN2OyKGIs!6Cqj>2$OFXIrLXxrcI_TTw|&jP{ELPw$pjA|`tF-@><+y{kkx;jaFt zB!nPNjlIwK&|FvwtI!2DRw=eX$ny~u^PSj}-V0Z8+Q$kii!FYdj-C8`_|RC+E^BC| z>b#ExUDZ2<0L=**S0Q{0pE4WMS{cihdG8|rkeJW3oIS9h`QKW=VF+ry=BZ2+_|=&; z-QV`lyj3}d%$~>E?(6A1THaE9%d@V1wc8zmdH}fI4TcZbqy(CvK|J1gF#vv1nT$wJt$ZeJ7yKX2AC0{xPH7G@-s9D?>V}x)A zT3-<0CsnIX#7G_UMb|7X|`r+}G z7CIm_82_{6+-(~>_pJNn?egG0+U5<)O$;1*YF6tTF<|y?gN|G|K}?#5#86rIuC3Mi zW2e{!3;mb`r%dNn)~hF zURJ!~>`abdJfUi;c&-pg*~6SdGRfN8G$ymtuX*z+BHlbDj@HRZ&;O0(2Ch7Z57 zT^*bZ-a1@0n5~teK@fD}MEbyEqtjB;wN;LDK}- z@)=?yr|*!k?`N^u;A8rPfI)D|4c3ebV_4Y8P+p#g1q*fUQ0!tbMuJYDdDcNWW2-Ac zOb?YhX76&{Futpt@paM5KJ38?`jo=*iUFlK8;{fKy>S*)xXyOdQszmO z4B+#e;;%>Osfi&I`~yblq0(>Ot7?E`ouwHxF0u}<@)-t9@$)qZc!CvzCdGgU5$J$~ zlwKN76)4NiC#i2*{nK+mgcYJpeBFj%nVOhd+e9z$FFEgT>Ahkd=^z2xE6leR@2 zTY970A9jHRs#$E59K{!mk!t((pyOq^i@$WLUBPOW&cWjId~G=Y3q?V?zI^gAiUua| zPSSrGX$9;i?%tWC35v{4G1I*?QeYpiu+3Q`jGH=oRz;*kxSRvirah{PVuvK-@TYMh z+rZ0osbt8JWEd^^(liuF$PMTy0Yu#H&Oiin(t>O-oE_hd0F{T9+6f&Gr2yGoWCyQL zYHVsG>pn4@b;V7KxPu*g@MzeEBjJH5&lN}+;y)XFSN(~jE|UXdd-Jg4uEE!zdi5|g zZ|^h9%xiM{sQA6-RVSQhHR+x-8C|YBNZhdF9jR_?Ib|n~I2q4Q1x0{`q*fXC;QLmH zhbsWN&r{BL9@N-#3=n=SLsW@# z6U`)T!N+<yh$}0I2|jVO8S~D4_6ma1XVz|9CC44DBRbY;x)qX9fE<$=BY%6>}SueTU)8d8*V!K z)mW9OlP`*$m_ug^$T{db(iN^PwbrL2dAn5*AD3}Ef%;Ij70oy;S)5IEA(gTC3RW&M zHsFjzGYASj2NbL>bAH-$A=<+j{c3D#rDKxu-}+oO_Aqkt$`JlE+A8-t=q3KjRkp$1 z8ifbg3{vH>kzY=pS+0kaz#J3vbjy0xBthHhnzhE0GX0|>Ci!pxPG1)DXcLUz0D5s&xU0%<8?H#feLB`|n>02dZ z23&_q^2nHiM;RnlCS_rhqC`t{rnM6>ZXKm#j(Grk*3r<$qhsOl^!FoijI3e2z*v74 zD`lV(zKC&&_VPi%?Lsno9#DKWCHqO`xJS5>M^?r_!x4|jQhJ&}*jpcmb0BR`SG-8{ z*fP^fzy$zv)b^|;p{+M_+;d>!EzFzB}Jw8)1BW*yEudRGN%meC%b9)?)Pt!-d9 zv!BiUDXm3zWnhX5J?r7!?w=G;N8(KVk2sL$ki6GC<6?P?E6Ez(=k1mN#~5jLuU`v@)blYkbkO=c>`7xFL}1a7Sx7nj zYuAkKk1C`ZGpCJX-#ZVzEL{FHqoC!vy!JR4RU9__j=A+Up_A0BK9=Rp)I$v0O9DFV z=~E^pbUh|gxhhfecr}@|%n$G1vt6{|dY`6001 z{jN;+8TnO?cKee~;@Ia45B0X^C3_C^?nUg$(^Hicqi|SYiX?$HnSRdnyrJ@^F{W|X zjtxOqH0G8Qvf}4%)H&ym)X>$zGD}N~Yxs)52HyDZ`Bd_u+_fYzpavE^4ngF80;wR} z&KEO7lPKX&815;wCR&R2GxP7+>AQ-Xjj~pdIaXX_9lOzS6321&Q|26TO{;=uO>3^( zjj18pK?nTemoA0IN97mA=0)+Yyd(RKe%-M|o=7WsQR=9f++| zh;dB&XTv(=ULez8)YXA@TsZC+b?IFTQ-jFeHvaNrDo`o5K$)M$U00V+7oO)?s=<|T#) zCp^+x4Xcd|cI9@Xa!LN3-${a>J9F0VYUEKX>ax9jwPI79OXJRO}0J zNdN-hd%aS3C`JLWGw;PF>;ra!MoteH_xjM84O}G|T%THFdX>W+zc|6|??ITkVe*65 zlbQ-lBgi~cWW5HqS2*XcbMI9U6gv(*{{R|KP!ZX>uLN*vOI8!@G7p*h4)g`CN#`D< za!LOH>(D)i3CQ_L`FZO>43q70@S`6807_^>MeK>Vw_%!~O5?w@ra0Y#nByI4ACY&l zKlXt@GC8PM2#q(}h$QtrD#p<9eo&2|XQ3z3ox!aKwxX}{G3qf$i)ctL)Zi)O(ADls zR~~Oul3SiR6k5Yd#E)|s0}sYBN$u-UknYj;U%(F*9cM_BLc3yawDucG?-PB~_#O>- znT;)ZkD=kzj4cDT|=uPY2VAK$xHac=e!dT#J+Rrb8L99P)G1nrVp=1YG2G zrE;xuMSx=hkaCgZ9OIKz-NGus-zfQyK9qrv;~4|%^ro~WA<+)lp|X%;A1~s68Y1ir zUoUano)3CW+!`C43t!g%A1gHYK?6Bzb#I5b>2NckY=KT4!40>zR&1vbGU`vUYF(*eQv zoOIpW=|HSV%f<#NEe2IE^*Qb_Oja0T9SP#2m@EP;jNk#DKMHpX5=NLAQP&?zp^-}; zIb(`8AuARZK1Mpx%o2^sRO5sGO-1fF#>2d`AUGYW)3Dg(fVK(9Bl%DlEG@St*s2>BhEZSrb~Nl)(8rv&+cRgvN6FwQP#OCLsP1qdn+@L=qffQLW~@GarjUORv8CxdP`AT zQ5fe0bt4r~C}|yYR5rxH=N%0KS_3ZJ7WWkZ*nx80`&E(va-e~V1c}oF6u zpTdOh5iCdZbsYr&OB@@H0O)FYg2lL?!So#tD%eR_vm}@}UJh|tfmP-sBfc?8*96GK zp+|n%sS~h{MBA~@@#{^5M!fuTc0$i)a~&3Sf$bI)o4D-juq!l=y_6|NhO-cPxpQXl4(IsX7SqQxdLq%6Z60)Dh0 zxn&d{0sQC)qDPb}`)9QlxYn~(DKVSDB!ixuP{ftD z5E0Pzra?izQ^z?bk)%;lLxIWQRVG74V*Rt?k=8ccZKM?q4@55S!#)p2MT=B60G5gEdudQ^*^ErASQ-06?00ysh4=cs~ zD~UeO9Azxxlaj%XOBM9visklBPUh2}DfRv4pKSzXFaY#k1$SD?$DKEKspWdMl?V(X zkpBR?O^Vk%cJc15CS}y*Eo6r!LC$g89jYa%tX+?uz9{@!IyKkWG$@Dmjn3HQD!=NZ z1LYlhRcII;r7VpA(BNujV@6+BsnJy!Vul^4rx6B zJA$#~cA+bj%LgRm)4ehoAocVV(h(sY20_2g&k^9uPP&zGIpu044E6n$T{RtBuGZU2T(bnxhoY}!eozH2}K#D z$3LY@Rt7|^o;_-T7Q$`=j%XOALV#P=fE$gZ_YMIlQONJ$b$C^`J-DQY;m;~g>DfNsQrhZ*WBSfcJDK6-Z*C>k6c4l~pAq#UKC zl~%tyA1|*o>?;s4z{>QFO9C~9kfuVq&zQ%^eorjmlQN<+0D$1$=9edLO<@x|U>Y}bHjadBq_{HMS_(=Rs za<=SEt)K2=!Qhqq$MfR7`Vr-gkD9MPX(rDp^BX@n#y_oW(Sp!vm~I*4t`Df8D;AkK zmkYB!yHu1hA7S~qLH#QCIpl`!&nur=3Kw?cmgf|%I|{M_0Nb9TrJ==WBgzQf5XX8N zB|SzNHwIw5lm2m5CmlzL%Hh|Nyz@ro+QegdyUX-F}n4U>Il12#n)iNAxL{pyp@$bzm5>6rM+z-}^=xT$?z!^Bm zq9YivmCFKn13vzgBtje_AAIx29_06`xZ1d)B1q2z*S!}LcOT^rTsCv*{OTJVP~Ry_ zZ5benR|bW^BySxu2eoOr5)dI=1NTYk-+@ylp;2NSC?s_s<4tTSM3G3_@?dkGXe6!jUyFlfdB>-bXKTN0}0E!fcA zi&~9hGFW|irY0srayp*Efj4oXj#!^s2_#dH6}t2Sf!@dgJPx!CYKN1th#+J6Q$ukO zI3Q%>9jOyFahwd5=dMqsGzkxl_F#6$TA3@A6VWsqvu$k`T)s#HwoPF(M6Pwgt}Y5S zvOBj@I%D6OhoMFP0I=Uo`JPZBJyd<{W7dKjCyPn7gl0wF#OE!^-ZWhT6Q{VSr!*bNMs9@bJw26keSHa-E8v+Q|6O}{3tBcOPLiH&T_?h z&!MHbJqq&OOK?Gu;AfxCr<8G(%-uKuB$WmXk})~&&ILI;67*+LrQcmZL55~T^r(}$ zaF&JJi`L6X$0VHO_cXanZpLyz+KJxzP&o>F)4hdu%@u+;6AZojRi|)h&bzoh3GI$5 zqZ1hzAtkw1J9e&kCaYo!@_9BWWk6a^GDq~SBFyAgZxmd#-)B%6Hf}lUImUSHTSiAa zO&VufNa2#^WZKH4uek!Lvf8=BXp=sp5?=&%h8W8;0gt_wY<_jmQm-qrHibT?%D)o6 zBlwf!hN8X&_;qb_28jc*NL6_YF{dhK zn|1>ZqXWHjayc4D5~6mRH|%BQEOL00R|?%+LOxu36U`2TK=G*cEi?8&@M9m{HO=&c z=Gr7G3imk%w2cEdi*nGIe$9Rav6R}aq)yC6JjtAqp51G8MRqWFsdHN5YCiycA815R zrz7nfcy>IF-D!Iz*lN6&Q<1y)4dJbzKAjpfpOI0|BkP)lL_V=D<;`c|r-pn{V`HFQ z+Q$XGf|QO(epwik{7gANjW>r)ht_2sZf3*qAH&wsycSO&QSyLDIrQsX?+n{D`qrA9 z<=?=Wpz|FhNg-s~i_TTOYZ{n$eGutlQao>1_*>#{4c#^7l>wO{JT!UF<3fXjIuw-8 zqP`Y+yOB#jDn~R&PxS8eSu1Kuh zjZ|-;L0QJq0d?u`QrU5jLqZu*Bmg!UjYaLDRvssxxeEdHf zM{3SR!X|sGM8!wSbIAJAR%Viwjg1#wo5R-wQMSQ#QVO@B;+=?W(tj7<-!pm47A7UI zz4KEPJ<-H!jzrHg6SiM0gWHY|^Q*ZD6sK^*V~!N(9cqyTnq}1bG~aB}Pwx&g8NnST(JHxtuZBG+EPax zsc`M`>|_c$w>hhfMB6nrD}~iylG$Sl7!?Q);ZrnJS)-=frk59yf*1^K?l|vRh?w5w zg+1z#P1udD20Htia}swMCzjw6xmtZyC1WWH3ENL!FUPiTT&@Rwj?dnxJ4t`GfP%1w}e;=gJ4zX$w5 z_Dh+xJAwjEH^fNJ7iBWBFwwF`~?PrQ81fR%K8dnf9fv}!B zQ$~c&{Rlm1xeYcm%}$xX_oPZ!6v{v)PDVTTG$3ljM1_bar}I9P+bt^(hGk+SPPpQc zGa@%bq>G+$k=)a;BtmBy1y>%R_M~V_=O!?5j`^xHwuCCk7>5`f^Zpc@6hz)fu*U+9 zYYi)dND28y4;;~ZkCcfWfDEUuNgkCq=roUA_#NVw&^%jZ<~||2Ce^{|ha7&j&4`CQ z8ar?meU#HbMz$V7&lU4_KB#$Y;PlAF4HIzPv}AhJrVl|BWwt6YIdCaxZC}eJtU7R1S0!RZ837~cnaog)o)+Hb^01D%fde9de(fH|( zlnD*o4nXh0sz5w2KPbj{sbPB!APxsgXg4Es&feIqM8#hJ0EK2lBF0C2)$Ad=JhSyQ zZUW;c)_@!n18-UYaf|qeT30j^XYlmTYNA-Gfkp@6Q*u(dCj@67{d%BiP8zc=)(yP} z=4b|oZ3h@XN&z7RV1FvBlO#x210Z#(xQ7(l0Y5`X29?O&+LFF_ZV$^5C02Bp%%=hycEZfEdSd zAB`5c(ACC%v}_IB^KDb&u7{+|_E%nEkr<4x-N@tgrlWHiROQ^y{{V%-pd9&rV;(a>_w&hwySFm{+#P2tmq_+sRR`x+cgd*9M>S45%(}S=9pVUm(=Wr)+cBKIqiyu zhMC|VG4RNN+g7$*J^+*`CvYA9warpJj;K`kO%H~?9JkgF_T#d&5XrSy8DQhF9kEK> zr%erA&!8F=AOX^|z0TG{EMyGQh$Kc6Jv#TR8e^B~!Tl>H#4wGAp1paiL%0>s-v0n1 zs4ZbO^O4O2wn?{fC%!5NVlOO{fxxQ*R*Q|JJdsc)NVcrmTwsp0?g(o_RPs2-6+E;U{x8X>;=v^Ho?GRi+>e zf0Ij;B1a=|YQ-rof*q^hInSjt zIXy@WrGXjZgG-7fSw31AT&T&Ca(Kphri7iws`npvsH9Nr4EuDZ*#sw?j?{*o#q+kD z0010NkwT@$2LqhufCF%38T>Ion<|XAJ;|zQN!+k)a58%FQYjj7k0g&nKqOf60w^P{ zds4A>6i7x6Iq6I+CQd$FAFuSLX4Ql;fu0Xa0jm;k3p+oSNf`5v-7#)DEVsg1$Z7R)@!t^Y#S&Fw26KWBImJF(keTy`j{IV6?W9$G&l;1->e#AKDLbDMU23t* zc+<*WTepx&^5vPFo);C2xG`Z|LFTL7B<}Z}@BoJ#W+}cy+ zJ>SD$vyQ8!vOkYJRd)pLf8*W>-LeO{YU`&?=;EzkTOUjKf8no(w5_)GS2x!ZfE&z~ zXD9N_5`wXmYRK$0D89oOj^23@6dlC5>G{@v&ia?_TRGo`{x6pM#=1U<1kP-W${3eo z9k!fxt}6CNt%ilw&$WVqf_fT@l-WFBFK)DvB;%((l|VN;Mn_5tOhY2}Jm>PDE<$8E z$DpNPNPhg|Zz7e(hP1>Ec=V#-u)`oAk&j+`(aH?0@`LM+^+3pEVV}yACETgGvPq>(f?IQFUrG2eG9#&JopqJ)Gt0pN<5vD)HnW*C0PfLafJMh9cwovdFqz#;w+J$|${ zM3-U-Fg{i7L|EjkR*{16I`^l0j!x!uk`wawq>&{yR+!{_W}J#hwy^D7{#21@wHmeo zJt$^xP$PF8vB;_s0SrSN_n-<48Av(&C>mEGk&X`D+|g@pC#eGvIrXO4Mc7j)?d_UH za}D!2S1ULI=;(&>>6u z^`HpLvt!dV148d4mYDm(~&pd&H z$jo_D)bn2Is*&M34Xcol`4EtI_ZvW zq7#EcD^?@x7DeHUDBH(T z(y2`{nj-Tf18T6y=Q$kI%0$}Y#~{dKjs{0HN@;?CG>M(Ws3(kMb)=X{SZdrRaPA9w zXPVGXH`tWOgdL2e=KumKT&yJ)xL+JfqeyGa{Uy z=}_cXCD0W)IP}OA_Y%^qO?+m12sLU$rDxG>nkhf*<$E>xpo_R)Fr ztU!I{3O%Vg6&Rky;p0xqJxfm79a}r7-lK#3s>zU%$i(h`-G3Sw ziC#dQ4oAHtu1&{BHsOI)U@VCb%$e!UOV9~n`T6`YOqyikAadEj!5HmILwge>(Z(9D()L3#YTH8FtO)({N!iu5A z8{#xp1$v*Bv)rp0nuNtjjecfhj1T8qq-QBy&r3zzUQ?Fr0qI&MjM*K;r)XRTJuy<1 z$ZW=z%v>*+`~VI?trD=Bxt|rP3FVY75Jrfn*Bxo>XUlPt#AcOa12N=v`qgt3m5!fT z*U}i;!%VkG;$`y5$2cPfvW$6|T-G_uElS%#f-5Z+2%r&+e5yM4JX2JYVsmK8yzwrh zHeT~b2kY+#^<=5rfF9U3E+J`wMi8scZXfDj74nNwqyVmY@MgE z?^(Elb~!opvWNF1vks>xgYQ~e#98wmkEYwgwwCF3%*SW%Hud}~m7NIk{{S1@N@j{H zefU+$VV*hfThWckl&o?V;n?AFyH5i=XVlj7jf{EujmucP*ZWRz!}zntY4X@4baw9G zqM6wkoa6XMzAHNoOO)KT)P>N?AlwNY_a3zqiepn~d+FMJUN&98Z!F)#j&eQfc?9HQEYrf9dHGHTeJf6DiZtwV*KmU@uP5G= z#q{|z{xqD2V`s}p0plRYgS#G-F+gOteqi4R3~~79rfL~&*vh%mqq$+{WhG36YR$7! z?UlsV%&^>KAK}mO3QQJetU~lg>Wysby)o&0ewCe85$( zK=d_nA*-{Z@cavLFPkvLQ6y!($sIYNXlZLAzO5QdkbY8IDxnqGA)M;16ncxlP%K?jCnKe5QdTaBiw+N3hA|dZRso3^6*jQ$S^G#~ z>+CwvqM1DQG_4|AktTaCed`*LvAs5YW$}yQzPqgWnoGY8>DM>N@Wv$a6L!`EzCEi5 z)KEL{)Ll)FE`NjmHc&s}oz!vL_cearJ0@@a#fIsJ#{{UW(t;GN7)^!JaNXG#mW)9#eenI`i!3A)4={O=l&!*hB@cT{{ZXI z@o|uSMtyc1JP+elU-k8yvf67uh|$zBBdBXz{TnU}U!+ zAA)>j2rZ!A=l;1Ie>zVW79UcdVSnKW@u54v;UB#nkM7Uu%}3VIeMW3i;6ED?gwQX8 zXS`<^_p4aAi|TS(1NaNZ_yM#lvCm&D^!({8TuFE-j$Z(H;GZn$7hsNrMtP?3Xd{D~ z7ycFJjuajG1>RV7*m(8LPuCI~z|Hg`9}m2AI(UBUjPaPyHA@$8SSc1y!@nK2U9=mJ zyc}#i()#Kb)TJGZar`dvmm)GJYf}7IA*WnMu762}abKfj^=90$6nmiL)4sV1%5V+f-Fg;H> z=7{DI>JI}U(R?5A`Of_q_r_Zo^`$JrBUlMYYy24ag5SJ4KNtXf)W5VMgX$7a#EI}< z;tOE5j#t}#CzvK_{hs=gKfy1Ed>Hh;GyVQ5mSGYnfRZF%f*%n6WBro2UUFL>ttXf$ ziDmDot?)bI5#cnU{{VgWrTwCrtIOLJz6N|lepgCfG5-K9J5r8hiT=-MkbDL4`{No~ zlh;0H6>Bm~Ur=e1#qbx$?4%tvGw&s4^Au|G@+IlVrKfE8EO3YDT*{GHufIdI7k}Jz=C0S#2 zkz^8d+H;yx$0iE{%6@|Ba@|Q~Z6>HOc49#={{UjZOC$OdDY0z%o zIP|En*&?q&-m75|Fg-eBJW$FciD3Jy3P)D)PK0gTW~1myZq2vT-%4FK5=3v}sBklqLNpbHV@c^!o!kkve6 zxfB&~talEW;B=~HW5_(8T9T|qj^B?I+qpI*MHGre3Ku!rJSL<5-`W|#RKLWjiYmP?Lk5-V+4BfLPBJYrH1af>52&zV;J3@dKw4q z1~X&RIsX9bQDIzW@V_YTKUx`Lg#$V2NAjQraBv$Pcr=ggP zpvm3s#TEkk#uQ;c$*l>Ku-`9dKZZT%A-j^Y;Ysg`0ItWc=|J}&GGLME-jiWrncNS* z6yu=Uv0@M!Mdysv%%!RD-Q4Sab$4w)3@)cJ6aN5R4+gZOsyJ~F_nDZZ5_xF2C!7(1 zpYg7^MDyn|Un1gBh~ERZwN%ifE14HME6sZx|&a6F7R(ix>k-N2WCCYkf z+*tu`J5ZTPl|vEw{xvLi9u$rTd}f3p=bV-6{OW*mK=Sa5kUP*9HZ1gV_-O_`vr0sk zpGaTf9Otb^F-eRXF;kv+t3tVI8wG@d!#%m?har}Hl?#F?SPZ+nf0t_d=BO-Uc>ze@ z#wj@tT1Up zAOX1S4FkAy_fK=hD+4y+Aaoq}KGncnnOi5VIlI$)>~giCfZrIC*x ztvd{FBx5=Erc9Z3+RjJDPB(X?-N8GWX=SkqBbsRwxPr`+xb__?n<^xpUI!fqQ(2Bo zsPDAo9x0iMXZ{iS(l)tnH|%@!O2S%`a6rduV;syefz+SnKoNB1&tCMd0|?*LbmEJF zA}RaF)|vueFawd_tt*qua+Hn}IO=JMBRV;9OE(85g2%Mn^Xb8=NY6mDvumk7b^X}n z@M}tNIk6Qx5^6J*9$ZRxsUtYzyH%0qO>-O`t#UqAoE@lhf;-Ti$%;J3Ue!QW$s;-Z zYiLHsGkuSp{A1!V3LG~~oD*9{Bqwv@A0GJC=XSSrwggr;GneD zbql$!rc_n)b|XJOyB%>}ifSsz;ZWvxJs(Vn>GsR^&4yFB22tvGAC+@TS2yH5SK?ob z#j$-B&CiW<<=vgE5&>`nN zbInPM93L3ZUiE1L8d&3Rq2SZ7h8O22ulQ2|g|_kQ)__`(?mwj_>@>t?$NRmi3b_MG z#s_L>QXvus8B!Q_Ac8+icM{lPlOSh~*{UppM*K}rFt-Fa89iySF%LP}ZwY2MXxN$;1-SJ7RV0a?fOH&C z_OK79eFpR&AIv%96xmUCBrHH1PdzDworqPLPC6QcJC>p$G7mXC&{8d_Bb@O|a#-!z z81G8M5spAPO5+D#WEgBAv&|3WM)=svwT;&fidp zt*>JeM0qND9D7o@N<7NOVDQF|fDMcVN$6LlK6VkO&_m%Z6ySY=1OEU4r_RZAk|I6~ z&>4$9odM5ZmlXY@TMv;kGvI#@4ChXO=+b^c3T$Srqw8`S z%iuA;XCDiJ#J2&DUPeC}e_W6}x&%^w&Au5tH1{O&&P7kxBudNak+XLeOgT>`=svDeG_+GL1pn8 z{{XW`hMjTe+<;F{m!(ZS!O3$Z(t6qMyq}+Nd3+Fy`!V=1o@DAJD_ZLId#m(%EmxxS zLH(T+JN_AyOCKoIW$T_5PxyZ-KEE!u`8%(ZYAvrf7`ObZVSi>tl}GHyr?D*-qcW@Z z3b;R>Kb0yOqp1}pt#qBW()~4z9-eWF?-j6~Ss0Pc`!d;tV`-?&7;*!u;F{59T*~%q z$=d75*~wqMq}OKm5A5ioDE|OvD|t{$E~g?h0(Na*)aN;&W|6D!(^64-#Z4tO7phZB zMKr!7w7tZ#*!BDlYsB9Lt-J#Sddun!a^b=Vil|fX$2?b68OiA@HneU(4f^u=cJer} zG(DMCIls}wSil%0n%azCD(1EAt+u~gc^-X9Sdv?mP*wm+0(d=fT{YD=H|(#;cgxJJ zE?fJ&%F52$=(XrVZSGcf4U>!v^v-`#QBf{uWYWIPsWs%~A9hW5T0PcrDD=Zr2}xix$Rj~o0?K-#_Ig7rsL$=(Y3YKkD#JQ zB*7$fQb@@gtE(ABQmH6Krj(jZJEoJeY4uOJ5R+)L_JRiZh+&=^7|8loRU-u^p!uVB zXJ;N|(ek}xb*-MOW@x<25?lq!u3PCfPQZl>&Nmzdz{niuHO{4V zeY}cAuRT-b11xdRIQ%osRN-kgboJghQGRh!_pRHT-nRORB%)klq#HrWKj$a;n!=o% zl5JVFsRb0!KkNER7z33n!4s(va|kZ^nKSy zp`_m_Rz_)a93OkTdRDe@(c1lN?yuzfuRf+J+^-F}Ro;2s&Q5k#z)aOcDU0&M% z0PWF)zwjtQ_l#bNxTIE`g!za7^IPQ9FFi#@|nV^y#^Bu4QL!R+>J)3zGY#CE8DN*-RMZ zQpiqJl_2qqeJZbhmh!#r^RmCKm!dHrV{0Y#!a-^`5Wtg+XYlP%v|HcK&NuVrZMffl zR@+-PI6%<8@ZH2KzTjqe=^FBWr>#o7bbqJlKV}xq5Rhj@zz`N>(`yM)FXHWKp9wbA{@CO*)X|cDjCQ_I_&WF5Ryb z`=zjyj-745i2=c4s!0PKs~Yi8lTmk9c6#c*YA^4KeoJE1j~?-MrFExY{hr%y!w_Z+ z0nUFD{LN{FjFMd2+g+Bubd08#%5z<%E#7r?GAy+zoA1LDDH$LxGx_4W9=&houV?1D zlx1)6MlZZm(8~5Yn|rHgFTTey0uRdFD8$7nK3x^vwNn28$(57!Nhi8RCv&1(O(tET zpphGH;731ET+ud^KxsB-CeCEsP7dy$K}Rg3q^)(oE9Q;*^1Cap&dTee5=4ok%*AD4 zupACLe@cpV`O=b2U0%-jSLp7d@9P-8>1-T^(`ok+#No**6yu!aeL1G;DQd58?^#R! z-cfRjeeEeL?IyJ!AwuRc_oGr5j=gd3RXM_=Zkm#dcZ!v{)OvGUPHTKt(&aSmsfTq8 zYbmz{S<{kn)Ow0_=(;j+ZArzo%^!wV(((T5-FXdr#zbi)q8GC`B%Glg>j+7txvhI^ zZLikeMDiL-cCxz+c`O)!4;?G785l;aqfYKBPnEk}#`<2`Ufr}ByIPh5=0P0M@PCY* zz#px0)V1A{O8YjX*OQce*)`p0_gWPZ^I0^Yv#0LQBb=3^o10XeZ_%|TyquCrwYAb$ z-pIQZlQ!E!0#l;5dgs47y{&$iy}Yiidv~(AZD?N?O0LSsDl!2b>!%q>QK=|J-6=Gh zcTFc`)9RmbQe}Aqd1v@bZ8+hxOA}5ss!A|?$u^X>=1J)*dG1nWcpTU{wA@U4 zjt^XcT4QO(6=xc5@lt9o>E0>3JICF6by{}NnsU0-r>K1QX(RG{sfhN#u2jpiWjT>b z0WZvPxC8H3xr=8nd1mV3TVg!C5LdV(-l;nd#&4W=1S1WMdS;tVlY0^@q11qS3Zi6CvRE-d6|+-E4w`qjoZGnS-MnS&RZUw3xScT(lJBtdPd%B*eC zPubU=I}ur=(=|rN+JR!Hk~z<118TnKG{jc~}n3?M~9&>+nJ^ui9zu`cl5=eRBfA57K(y1_Du3Pw1KFGYE z%9C~_M#N>wBoMs+0I<0JRBUQJn2w=9IOAgeeJF0=FPg_W+DBiwKf;6pG3WqR?tW24 z$Wgfc$jIsPiU}q2AC)-dbHL_=>`jBtk$~iJ>^P@zk`zrKZd=%KOJTth zHN(2$&oxBFTxZ%PJx&Ksf|D(xL2~?ak~kH2Gm5x|;oK7Kk6cv_!tlHxTkq+Eq!LF<~K*nisOCk2V5ot2E72|m>zJBuG`m7!L!hG|D7hy+!s zT$d30OW^$HCmrZ=Dli3}LC9m*o@yk@aTV@dV1_yA!KRpqjP6Oxo_)AfHYR1LY0DdGAPR4glu^l4t_BILYr)SupGY>q9bQdiCS2 zQE6P09Vikb#%L2H#~CyXV)4M_cBF>I>~X<8DHF^p`}e9C!TOBmfZPxh(DXD34kwIy z&@v@oen&w-TEwco=mC-R&(?t;l0Z0aou~#VJPKhFCj;?4=o1=9=hlG_P6Y!(AD`yw zpGpGP5tDG^sGuweJiH8JwIQTRMras)++u+?ARPD2XdI*QuoXQ$YcNPq6l4xb<23Fu z5q6Tp)0#rHgm3QtMubXN9tIA5>D(eTfC0(x(waeXUT^?ELswx%i;MzD{OD@py~Q|O z;PSZrYDC!d;~<}U2_2A~dLEwC39>Q^e(WAS`_))#Rv));!8`&e*nk6`58+H0f-|3E z&O1_j1;&*^GMFQu&Z^o9_aH6+I49DO#NMZq!2Yz*}e7|+;*U(hB7f5Pt;IJ8C>Fm;#YXW{NIKsCA*Mr3xy`77S+bA=RYS0 z1pY#%O5=jD@O-Y)+)Xrp#XN+266Ut0qB$yjO&crzk%?SpML#h2>}#qH=bKWSMA6Ff z1BD>;IsSE0A{rtCZq1dKr)q#msWq4dSw{mWKJ;>p6s_(j@SdceD$>Cy2HUh984m>D zcO7ebQ{^J6x%K}5guF*>tXju=WZ~nO1_wRsZd08zzeBl69XeBNvbD|arJNsZ)Mk#_ z5}~sx0RFY-)5gZFIMlOT$vZt7y1k#DbD}tQ^gM@K__^U*XM0;|WW01Z{lXUM?~2}~ zM@~*JqigOp`l`0)Bz`357bH3v?TI-LBxhm$D3wdS8j|SM?Iqn^Cuh34Pso=|N2%(1 z2Z${-SQdLJR%qM0o|*k?ojBD>QFl#UJ2iCnc9K$FjVIkBs*LTSwz4aLQ;%^T%|(RaBd8+qDaYmO@*c;!+$^v^d2zxVuXsI0^33mIA>E6n7_haBYhh zcc*yJ;?DEudB1P{YmIk|waeC(dyqTVInO!gQ4G>GNpwIiEFRb)x0qd)7UXk3$_Q`i z@d4y3bvBOERmG9}-}#+i1!3nq zesHUcAUAOICA5fU(ow_Vhc%tR%Yi-6M8y$((Wif*;pPQvx^o&1y&(56^nt@bhi%ri z<^P3wk6CQX5X9b~Cf=cB)E%4es9u$SYdSH}u^xC0O!>6jqGmjafG+9JlPB&O_H2sx zdvAey+8jUqgVuUm@DG~H&~Um~7HqardWTs~cN?s36?}K;fHXXr3w~^oHxJN8jf0qr zpX695qppO>@2)G|W~dd}L>-c@jWRvWKPdw_Cyn^aDfMg!r8PcD4L*6!46HAv94K`D zgT|MGLczsH-K#6~`EMrNXbx@u->c2gzr?-Py%0&6hv91!o!mjVK+NKVv>s8_Dk`RX zkA`VW%l(t4V0=an2v7wNSGwc?_N%J0vQyPoLVXE7gI?-x>B#5?&q(wN7RKNPm;dZNw7hmMhNsRBiX>y<>akN`84Y6}0j*F zXOE4eJ==6L{&Ar;ZhRpjg^QytS3hMlz(A;0C0&e^)!C zu0n$wj4nAv-9?Skhp?zINzvBt&t>G^eAwE|J(89j7HulVQg?{2*>%GrqiHx~*75CM zrSjKSbd>&_bj)~tQDSLQJaxnvrvxI*&Smn&_4kxeYN)a^DuS*knd7hhaBk3#Q*S)s z`_8#02meD!#hL#x&fu^5w@-FyA7wYpd=`2h*d3(mkaKaK*EAnCI3OEXVcx1A`pf5` zF6dHD!Ac_#*}ZFa&bTeG^#&p}lFrt2_PSi$N1f$wwe%O`Y&8JxpR#lBU)AKk4tp`9 zfU=>1J{WJ);Xi19!-6A4S{?m{at@pEzHepP3{hBwn>ic0f!l(HtSov1Z~Sl|N7PKBKg+ zK$GT*H?R=JIoj2y1}THm{eS>|^CQRpc3AkZ=yq%{9U!X0TTH~gPVDD;SA>hFIfeb% z!a5}-EL$bhQc}3e3)K&%qkt^M3tM+j6rDLsyO+hS9$56#h!>`RQ%6M&PdZWo7IXL0 zk=eKoBhcM7$y;#LttESsudqsrRH7oWR=51DqCGJ$r*Ee=`g;NJ5BgJ2q&`dmV+8xv z+k@}S=%8_FEt_ZV$)e`ZO$U( zT-AjJ@O4`#X&u$uBDU0U5!RLl2vbEoQ>w8u1Hc4BC)aIc6Lewm~ zwcC;}^X@yYTOd-ThCav5-2VIEoF^yb&=?okWd=+U?u$)RRhcT&De-2ndq8d z;KD27L!hX7PTPnw$+yDfc*yj*(VKlcl%N@LnX5Pk`$^@MOP=K(_&hI$(+0;jFd=*< zV=+SybGWqSwq7I3y=JqYC3mOH;a%l#UuwTe+dSc|@o%K17#)Ins>{AYe|-AQ{RCgl zg9&2#52CzlnrPrhmxWY?d+o@KOjE`SIF(1+ID^$4lB)rY4Lc8nm>Jo8$z11(gDPyEzR@VWRB0E9p#0bNDee>XU}hhI3Qj zOjDiYWqn>_Hse)g{rn);X(q=#G@|>STRr4CU~vxVzch4bwsKTPppV}~DM?3bR&b#7 zL6?+I8@Qhg|DA*cm_j%ky*m3c8yPJ~}~;ZEx4~l1g>2zT)!C8ye$2q zIDMU)uC7xEXUrZ_E^MoURv1K*)xEFe{{2EBuhI?1qLpc@2_EbfXcIt~v*d17UNHTU z)W1A32J{F2bcIcNT>@|4p{su{zneu^scaJ~c{ySDY6O9XRTfP#Rn+=*r4; z-5t7&xfj#>t*GN=d;1kv7z<%1uU4p?xa|ypQ|IV<7Bnu}zpX*)g57+^WENZ5<>XZr z9NU~OE{y^g3C1JQJ<-2X(sEx^+7D?(LG---ul%I{>SZqPvqv6eRFw8^RH{ezsKhN` zRyMn~PdTO<3;jgbG+#wL_-Hi>$GLYh}9d+Y45h0CV+xTJ0TCR)mgK`-JIAdZ3-U(VP+>Oo7B0N76& z-WWX+5gm?v)dj74hcgdHjD^*UKyf55LkoX7Ssiq%+A=fNKH2F$;I`|`5pcI)?oSGl z7LKQ*^c7~|hY9=Zpe|?CcCB3s`7?f8vNBnbzniD!LR7;Iv)Tn{nmrS`Dg(C@)!d zIyDutKa>JTS8w2!9;pIXvrFdicIe^`mlR%d$T|T1T<6celAD^+Na5mnV-XO{3tO3I z36f6gCYiv7{QGrV8rCI6p(Lv1YLgc-7SdNWpKgGCdaO%G1h2ey04`Zix# z59e^eQkCx>L9RW*##8BL)!20&E0L%7c&u;SxvdI`e&>I}0XlO$GKx~7locQ~HT-i}2YawV7lFSMnfF=M=dqaB}?zY69)%@S<1$}bE%a=hp`+V%%5bs!l2d~i8F zGW_^^ke=rAWv}bl+mlyIMHgO3&$X6lVQT3>Ve0UH1~eaJ4}TSX4r8Wwy<@@Bh(PDg z+^0dKgafm8%F50nXJpY#^J$VUFA3Z}TvmCrDyc85r97SdzryNFfJnA#xkF?6%s@*= z=&$wXLLV*k8e9i5VgDhK@94hb{#l&n7G~4aPt6mBtRTT|?k!FN@f~MnBNt447yKAl zygX+Gc;o<-zOaH(Va5kUv3Mp(H<|8)ggL2;f6|%dccR(>9ClrU^dHvl3L6#H-g=i* zkBc|i?2f~?vxzlAyr_j}fn9j5m^!*dm=I{4%VDyAZ#-cLT@pJ;iP6_$8w5APW@E4B+F^A8fnvbB_xl&da|i?-O*#;d8u&prIqs?mo0 zuXNc;8J*I)dvdsoxJyt4dGK5*89DvU4m<^qNGnsWM*IWzK<= zz49+uI%^GZQN|S9m%{rZr$$!DzAT_TB^w_?YeGzHyI`t(;y41!!)mZ3vVJ#UsN;U8 zCP{zF^!Wcb6Fn;?8Qrf*e+=#kxcqVHe(})ahMWg~_mcAj=9fUuEP5s_UpzTL_ctsiBD4>EiZ0cx#aH z(W$!Q3-~t^moXvNit6ogi%?k+7l;Ia0x*ls+=;!dnDBd**bDf!5M)P{IP~&@zM)2L z-;OU#eo>xWZPi}h*+IJnst7K@bkF%wRzbWF>26OINd}4KnJpt%*Tx4dJv4J-e?%YG zMH#grDrp1!Kq7jBWwzyg>?d7Cjy$hd@P2nI{V9Zs^x~VANalC&h!p)DMh~aEI3+zw zFTe;@XZ)Wc(zvAej&r?QRhxs_~mQ8@>1~zm;&e3odpU z70{UFy~w|X#ti%|`{vItlk7GQj0K#_+!Bq?m+Q9hT;aYqrDiO(sWS~@jk@Z37f3Uv z%D^{iLc;6NC^;v=G8|S4$rtOx%5dVp!n=rf*cW%&L^9trS1a7}3NaG#_$n#C zQPz~4+Ed~l^%PmUaK{40kQ6xOs@Mt5848S3&FPGoXL!Zp4J?)h-_{cvEOfD<>}yqQ z%K~Hu&&0m)RboV+H`qlH)+TwAH*b|9=lI^xX{~(dbCbZqao8#lzRF+!de(l$7eAYu zo7A6If?soVgTatJ&2zS#pyqc+LHV2#_b1U912r3qg}b5xIh8kU%$un98ZAP6!X_2Z zj;LPS6)_HKl5sYguXyC%TGsL_I9Z>gkNU9j_doraVR12^JXVL zy%|>o#SLMf#Sd-}E`DS1EujBd8YWZ#GDRG%NEIt^O^h8Swnst8Fdx)_jrln|UIGU_ z4$!9%)HxmRL^tYp#n<2bV}2;Ei1HbYkcpsXlr1{dGyieSk`lhimS?-C7iGi|y9`rQ z8|f61@;)yzEPf`kOXUXKS!GZ>!}Z2p0TDJ3qi%e8`Qog$xT$1=xnHG{R1%cF-#ENz zpxK9v8Oc~DTZhhuNQ>(n9UMsVNNz=8S(tH)Y=km0fKiQJ3}8GsJz2Au|G3sTwwQv@ zkrbDvHR^LtS$q+~95oJdHRTMXg#%#ykoX1gR~_&}!7*{!BXmCzrc9bb4s zTi`I;`j~7qnnaf}tNXf;Am0Bgibd-329VZQbiq&HZI_(|nomwGqOr(a;i4v-N(^LlsFr3UNg(uzIGujaQfeBa zrQ0KgmEAR&E_+V&J`npvpF=+G*{NMrbr6Y9C@130wK(al?J&M@V-nT+KWN@!<;cEW zF{N1CM?AYoxdB6Xs1GChru#%Ps_xtFMa-tAV$CeCwVO6FDqBz7hI^?-^jT&ssBrw4 z_EQq(k(gN7S)IucM0&_Q=XVq_Ij1*00Zj`A%|CLe&ySTryZI9jR$GI*|}TBEw~Q9tXvWJT3)s7eVQHq@)kiE5ZuXjkIjci zN>VhG_#peY-Go~2^)-4A-wc)&4KowDINOcdhm`3Jp$qyi(kkXg@^Wjas47;Kjsse} zZ#P`Lvd3z}YB>P(H$AHY{M&urvtYkB5X?H9y4mz4m%$^EXBQK9*HmM)T0~%gblCXS%7-6*%wKSN3g>$$p7$x)b`e61{vc&wLiUyL#x)M{BT*_6 zo}^T*HwtQDXJSdlKTZ=8$#qUIsdTk8%Sf1JSXxv5L0gSZHm|hVxK@R$tkNrc`PTac zy}{W%O6MiRpv~rfsePl{C#YXUV4q?8$|(W6y5ubHvd z%d}JfldK)5?pXmBvG;4(4@~g{So{tbezQ!2C@dE~V4U(V3jkj3oS*C%3p5;HM)6s8 zFN#`6?fe|V%{1k=UjSEt7X_x20iemDB?I-}3*m&U9=i+-G%<1?wSM*LMzR%sE9{o$pt^O;wV62uW zKNjjV%&;7H+W&*LR5z6_Ry5;a3cY~~hV1h+Ka+dUZw`9Sm)@#2I;XEcJEwo)j9p=G z{#N>9p4n%d!wTSJQuvBM=LXTvJ4ZLpqKM>GOj+yIgu zkbi~d{-{9sJxto(^X9H9m{4Yjt zt?Z476M=6;K(KqARG&}@MQv$I?g?qRmwT(fxPE!--lZ|O(y-QiU5~B%VpaZDQuN-@ z+-3d!c>Xc|60?yoRygrqkXbg}nuVT8^$)Q)-ij#ihm>QP4?tft2dx%9{0 zq#El;W1t_5os$$=dzQ8w9>+z9bKDBlX9X*})(?DWeuq&K#LljzbE)7^arCw%^#MBzNqb$kgeZ*jFy6l~DdF*ukRIjTzie=skMQjZOZgzpRTI`IBIX0&+WE40)2g=Bi8%-9q! zm+rLx+XOI9w*}Kf6xH!*w5OxZ<4G%HMf**h)dam6JS;qY5C}+n(kDMaVGL`F{$(qqP?kZ|F zdBgZ6UciY^uS9v=0kpNNA@FW%r1%%`=^)))N98R~YX1@OSlFG{huBz$pfd2R@a6md zdl|_E5Z@uu(?Xe#F$tAR;Y8557h}*}Pt(;;8rHkA{9gLWpm7T0#@X6ryz3a5AM={M z*-WR`8(DMEi|-Hb{&<`*v{|??E`tet`!|iJifrt(3Ca$GNN#%mz)2NqCm6o!7>oM+ zLDz?tLvu!JeEi!oDvj)vx+p#hZQ`8STt2t=33QQwGd1sZa@^R4@-EjUbZ=%pvIkXz zI~!y8Z*u;GvTtXR1v?C)vVObkEz|7rOLZF;T$Hf}Vv z*4ihT`=(zu>6>f5g#@bKMIiiu=Pef@5)v@%i~I6;BemZ8>hx1gc84YXJI7{kdk=ef z&EvjIr&AMJ#RZ52Oev{?SIl7z%K;fi0*$Q`7nG$@b4FQ+qK5P@zsuwMisloAo@Ko) z?*+0@RxIl6=pz9j&-x}Uc0CR8;2Yq^Qe4zsU&Tg;LAfC)iBeUZ=9eI|IwZ>F47iBe zdmY}J=#)bMIr5QMtm4k?w)QCgD6quNnX@q{TmE5=ww+sOE0CujmCf0h(pNhusE>I- z`L<9+fWs)dt!9zC&8@-VCEW4ntE6S&nVLY@vwe*0B`Vluh z(-}n*LY`aC=En)L?>6znju3Z?*Iu1-9KLS@>VC5G#IC|B3yY6a*#iZeV0TNFz$DoW z?vn5|+ATegssA|roOSOO76r|(4ugL*vVawAF>A=Q`v49x!U8bZh4IqRW~gE2UE4osBrRP>$L8J{U0iK}4e#yE#Jk2WN*qC5n>UMs|DbhSKatdAkd@%P z!stGMK4qc=G{o}}ufwXXMA*?)vT;=4v~kRp^BW%8Qr#_@%l5?RI&aha+auaXCO?kP z8wMH`pS6D7HJMKqF})#j=B#V_aGuJp*>+$9yV9f7r_rfpA?tT(uGrnZh7Sk&x(1m8 zE*t0e-;y_B*gNfZ@}x((y8{J(PtGi*JOwm)bzZeK&e`(G`ZAy;Jq0z~o>U`Uf1EWv zJ?AtS->m-+bt93317mZ(sK;X*x7L zic^hkSiv^ftQhQmB`X1MKve5jh-uyIMZ9OS(YT7nMR(nMt#sLm*T+);-1D@#xtd zWyDwbRk$M8BbW-B7?6bSW6(S~orS!*5zydmzI8lY_xGonNHmGBph65@QYa+7W(Um| zz12GXMaQ4*y5@(#?m{M-KhVtV4^d&?ma_Geo=6xduknb9zppPG$PG1b3+=PpkT$pD zWuQ2jul;h=90ub1dR(vU2?^XD!X+me|3Rzri1Nd=?BnV8OO|@Eedzn5(gykr4Fz)L zQ;C^T+=XiB7#xRhKXG=&sP;P65q5E1h)*BCrCv+uW5*#7+H58-w~|2@M)opDTZi{Z z7zr@{>Dd(He$F?D__|(pi+sbQk7?cIE`yHo`mZpRwj3_QTs1<2pw0#(vka-}A5s#6 zGed`u3lw9Qg+&OzI!Aq(g%Sr;qLZ>8pKH=rW;I{tV$b}f$;JH#O-fexg1E@`Oq}ra zZ7zR@x5g~d4%Y`(>lOV_vqu~+h2a_a=+Zl)5X{fCV1IoR&3=AxySMVNotQjckv67G zOHtoccpE<*dp|RHSj8b9Bq;9MVupKGI;eacX4_a!P)A5;c0wCqf(x;9vJBvoGO=E{4W`kI-`C zW;5UdAH}9$r+vUnz0V!LAQaJ|wMlULarE0il4XsWoeNw5AQ%-G!+}xaZhSaoMGV`< zu^sDLr@4hg{U()u)=n7wD!U+IlC1~^lU}<+>ph;OGdqpNj*&NicS&vf82H@Ci%3tV zi1Br8pD)>E9w2`8tJug;>2ScV7*@b+2L2@=L)b+L6-d_m#U7_UkCXhPUjgsymX08) zM98rOj_|Qjcw+AQ z`-1K3QkT92Iktv#Y)80|?Eq$V_0(#~cLzaEqt(Y^x+GgQU-RR1eTw;nBa-v3%-3v} zcauiR2zkcSa)E&tb5`JvI+00Pe(+N?OVY=%bvuIRQagU2F_IxTY&gLIdUZgktjJsa|P|?G@}~n6v!R>7q+3@Ws2;a>X8YTtE)C;cO8_ zjNuR)!hdo9s>|4$^U8~fwryq9eSA(=HVGtJv3J##6={USh>H%*q}2?+i5kk1L&4Xt z91haJ!{$42sPWPd^DF1IT?o9BDTO*ay-55W+MAjrTLQF zaNBJ##!S*P`8~}t9T+DQwdyA-Di&_9sXFGY^eiIYOheKSvIN!CcvnOv;tS{*n0be~ z@52+u@=Ep6TTxK?bGh3-Q>#1i3e94+Bx`&;wAmRpe>R~jXJ^-+CAlqCvh}V%afz#r z9n&*W>O%9*{gIOC*C@RtWZ)xck1(ZSxcDgY(4!KE>SYXiLJW} zz@&_}ZIq|aZ+1jp?Qch`xq?gT`7y4nnLj>;8<7)8AOM~y&<_9GCE&@YmBu#ow)RnLEb98% zSWhu4)T+PelxZqstm``;h8QJfgo(!kn>=q=!_n`iZEuv3zvCkhEUB?f!n3Sj_sXUr@rbFwC=X$YZo$3gU*yUvB&zILuoj%I zegeE!{45N9L3!FUBCC^leVAh`ZX47HgU#951|DkkTC9msg%1=KkyqKbm6ZFNdQ9ay zy|<_teoX}ynVtlLgaM)sRarT@J}aW$swLxPuQ}osQI8v@J2m5chLWyK3a)`wBXHSp zM%GVcESZo;HwVx;-@iLUv$OgmP#+=chMh<54K@2bV3CAw;!VDfr|#a%P7+v2d@;jP zpk-8*810_;bYZOSamew7u;R_~<{BJCj#8o)uJwZX;W?gOy1#%w*JH6vrYA~KFAr4l zs!w)kSLQC}6$+WH+jsO|X1t8B0kRk3p-lyMUr2ldM;Pdr{|c?rE_?R+N|w=X@p{MQ!<)X zPscX%YkuBDJGcoz|d;V^* ztv**MIBpd~M-a57%e{`8XJBB+cHq8*`LHLnY5}WkL53Aow%#bW;=-lHb&XuhxDrVS z9gW|)@*6|_5{gK^!sN;ehyAOdz@AQh%Xv2mpEgrJ=yg?un%lJlV_^eGwD7L*uqx@m zHt0v|9;==ujP7EKD(*)yAkCC-4rQz85*j{|y9m_FZ>1VAs39X0`WTCVJ8%-BWYEPW zUylnWRi1Dd7I-`26u-D-4>%nKLn)Rch7}i%sAIpGR+MwUCLiZMIL9z*1sm~I&yF7a zo0BSRMN;ilY*N!ox^n4#XGU|*@@Bgj{cx-OIk3{D(GQNo=5AvLuWLr15MR(6e5)$? zO+$LhD1qCq8yx&PvFj^>E$y>t-MbZJb~w_s0STN^02J;LPe>2{c_)6^T%gpKjg?5TR(=92i;UZ9X zYObml^1pUmt+$-N@J@gJ%xLVZuSKna&iTPVfTBig;;s+rLr;zRtG^yS=`#Yn$BB~- zs%WvOi9eNDEPFUBt!QnlkH|G{WM4TW5DOXoFs7U9!q>NYg0FSf@lxTmI+j$ZQvJ=xx1K!eh$0iS0hG0(muMYc1k#i zF*L*|bg0h|n48&x#KjI|gN|28$WetbIPrnbb)R!++JUotUxLxoi$1FoTsFF|vfreZ z`SeYLp6GN^m|S@z$DwQJ`sGG|bC`}@??9QUwhMRb4;b((m; z*b!N&N7Jw+iJmBq<;SwmQq!CIl8>Dd{ffIrkbgJ`eex+eBqE(&U6NOXAZUGDr7_uh_}?##!fAx zfkA&9^gxbXbQqtdr*m(*h06lm9@BXBDb6O1y%M^#lyM|&f5N%_`|o4lF&j!92!q+V z*|{m#*M1swN}rJ<8nZ(G+9!IB;y3Uq!B%=63hpN>`pLV?wkfAWp==YRERD~#z6tPb z#o%u1U|wwU2_>chi!r^(FGvU@OO%s$+I80P$xaVJeb4*!c(Wg2^YT2ofOQAn5)2WRqG9d znT==#dKrMz;xZ}|AN##;?|@HLOUw*|&k&PG{$k)D&S82tom?>DFk3!hoL6{xAn5qS z+yN$vziBO@GwD>7D-c@*-1fb1MoMQzC37YShE|H{H7U0W|doYsO@9AjcQ{92=au6zj^VVG)MsTwvCSKGP-5Mb0ZyG} zXbs)tpN%L6;a0T#c;@yY z%A5ML&yVxWoup~m_i2>se}MKn@uw3Qi3Y-9R8|et!_x1_Mp<7Gw7#~%y?hT!OXLz_D59fFStgo- zgI+v$t>;a|6GM&=O8&L*M5;P`UipQODh%lZasIBLBrtHMipA^lLqRyWEo~!U2a_#k zCAxz&(m%aWAgF}8qTg-4E)W#lp&h!36+55%65345rNyKAvZ3xF_c|}vI`m~Tc_Ara znA1(_Di?n?ISdV%IsQQ!n_J2OyA~|`BU>aknOLj@bMq{Zj%LdJ?2(mT)_?ds+m|*A zBbv-tI5)L|!EWDAgGly;IhXL3RoE5j$biu9Vkmv)98L?}#bs^*FAz)1=S1xXdt@k! ztIMybA1hMc;SD;&v5yWEpAjTu`_tf{gL#5a9=&HGYd- z>*6{ezJZaIKaYQCxk{_j`NjYwX1kd_O&dj3iRC*i35BB4FVM0Vp0%1q<{%9U^KG4fV9OEDT}C zBD$HM3MUz{znI8}e<9nt3-aI=H@^8wzE^VfQ~5aM+#|6DcZrVW+zL!asUkiMAD#AvD};?jq(rNi>8$5UHjU_AOpIGd z#kg_h#n>mAw+4M~Ui~BrPntt&F%HH|?Rrh*w4yzE918STyeAKZSCOsy>AgxV zo}7+3thb+gL`_;E#=6bMyAjVb#aAga9Y0JX_2c|V?(1h}79k6=ntnAH@Fl~`+-DX2 zNUaH(p}vP!D6SNhwmtDza#F@zaw;kv13{`HvS(myIj|U zKOTpR?dE)@ISa6Y-)+h;Q%Boc!ZHtVjU)bzmZK|O#FI^zuWv{BK)73=v4 z#1H`2&Av!UPrr5Q(^RlPqUvp7(q4krFGj<-Uw-}<%~0BE^CJ5^HUPr$;%K|Q>!M`; zn#z&>!f!U4cBfftRA)D;{NizU7_ri{v|GJa%0AFVQ)@LOu-xZ+S>>q)4DRXrkHRV* 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 z `H*ppS_oiDO?112L&lM<^$YmsC@358ekuoQzUz1JB!^TCK>MxT|xYl=L8GlR*_?V!(`($o%m_2N8xqpvRI3>5la~ z7KbSa*isI2oKq%b`@!QJl6k4U!q;LvrAXWkIOKP$K*WkrqXhKnLqL%AY?2u9?M!W4 ziLL_>z+etOwCq7>PN#W3N4^XhYWL<=$H( zITVWI2D=JGY6;^f>p@!<9_VcV_NQx;xf9(MBOu{NYC_naA|ITApHoS*RLNB#Z00~% z4nM++*pydkRD7Tg58m%YnL`A-h$LW)^WKE6N*TN{9Q7UQMJ6DVao)$T=~nd`MEjEi zZ(5b9L$`uKCzI(_VlG)$4YY3K9OI~=q%_Gs%opbk@{I9KAZ&1SJQLHUQ;4~&POrBF zU=E*^2@`TdgL}$Wp2&Chp^&adQ;*V<(9-uq+V~T+oVhvUwL1{mVi}x`!MHt7dR7{D zCpRJ}@P`A_`q5$Bv2UqLV`&*iSmPjnp0t!knWJlZ?svN65x}I?#GQ-C>OmV?$=!)$#b~r$JrlMoaQ=aT(7d(H3U5V$^z|{3!kV@!q6;FC2 z4M#ehsPX1eJcdUkvl2yhoC%e#W_W`6DhnAGIqU)JSY343$aDzbGtqH>rM~} z)GQ^muDQo<)w)(No4L7ZrYn)Pa@=+6noZc4?sYaABeQO0+6d};idMPSbP(7f)*_< z!2_Yiiv)LfX(70~mf}uv=Q(-a?|kE&_kYINBYW?$vNG44_Z6(Md3QHmmjIqG=iKOg zmH8W?n5Y_g^Wz-v&vjp=-AHR1quF&@0wi!)#b~-rBN6u+uyyBqSxj3_;$}!(yA>aw zegIBRY()#_So(=dJ@%q0mpQg40%yweWGnmc+O(3)VkACECWCyR>XH~&s0_nkdPrtJ zCv?$igIS&rwIC#~Lhs&z>{f36+%v2w4E=%$-5+L>R*a8FV=Mb_C+pE=P8#r;=z?N! zwS1!nk$z(y+!)05D(ZV02}XC&iC!Gs$8|8Uv^vAmAB+Ey*HN>#A)DL_q)&;XY>UI6 zo_N$jd827*RqDUa^w#Y;R(xj2gMF3<<>+_B8z26b$RL@DY=Ur7G77-+T-NG_7}g5f z$kdAE!5siqm|dP5xdKvpae6`A^0~k+H@nUhaO*R&Wtzz^H6Q7d;5%D_O)h-J+gZn% zP}4swaREAzkr|)|YRR9|K;MP6?(uXx1$bo=;O%%}L`XJhKv?q{Ctufx)d|vd$!}F5+b4}@)xSPj?E{Lu|YMnjB8?U%ffieVmt<;sB znSu((OZdRin~Px4E)pUCi#@i#>#xkGT)o8YC)OLr{F@+SjlYrl>{kPX*4GaHF9FjK z%$M}rROWKie&R0fk3KZD!=Y;%TMj<&_QGW7)7%Zfj$A}i8s_w~b*fc~R`!4bVB(jn zqco%*1*Zaj;j&&f@5qxna?CC~nrmq_*Ni==L1nT)-lk)c9R_3R(+fRRO??h_8WCtU z^=EBR5OQD9wHCK-Uh}z|V06ljm0E<^SuQ6KtO^JMde}I<#VdS4?2eWII-tJmhW>lNph$4s6nnGTOEkYqVq z4!EZAwsl~N+^RA|a}X0I5Sd|yxE5I6s>uZVtUWZLF3qPUc@>A2Yz|btEaltPU9RDJ zhV;=`+>(Djgw=PJghTK8v5njOZTSJMq)atzXk;9iZgIhBoFb`2x;3%w*bg?! zNRz7_8}tl3@9V;*BS;PFAn6Mywm2?@KE;@3!JQ%h^%rNJVLv3;W4OqE38rB)GeIY!k6@WGAVYTIghdzYgJa* zO}9yBa*wzzSF?*U7>mE$B+)_sc~JHlYYG&W%-Iw)zKw`B3l+TD*U2$&OX=RBQJ5j9 zr*ECQj)>K_VMi_wcKcEu<$>AS>pHo9Rc&7O+LJ9SEjMv&eWqYf__9-VU8>OI#_+y1 zte<^~3bbFwzHB~t`z%w%t@jNbltHs!7a+QkGeTD&VQmh#Vo18h@qEc{Bg60`Fh2ti zznFxM5L@Hv(c1?FR3GtCA`n@=QDf z7oUx+*Kde?@U^rT4M>;fFN>-X7vwHpCLzC1`E_jP8r=;`GXx|^8g}l7e9to zKJlR4p*A|kw1h3ZaCDf)6Ir2|I_dYCHOTloph7cxDGP;nKkeiuM*rt(fP+&nyACEC z>5U8A(;muUklDoCL?`b9g%OVDAgxB-#?_X`v}D^VMgRItZgIB8MzvMY?BdU&80Cmk zn7n$n9#PZgfJSDgkeVH(gA9`06`k_DS52yYNXn9yXGbiv#DQOA6cA$ zcu=vHz8A2NJxVYy=1)Pq21mO9o<}{SFnCGnPReR9lmS%?rttJN(bU^2wxO4oI!28< zRh|5ZT%&1U3@v-5`ef6O`{iFx^_MX3UmxnH>0Tni*0JHvFP~X+n?3Fizq}9Pd}b;4 zg5A3QQ=-@V1UAZ|Zd9Bz>+40&Yvw9a&S05)e~Qno4th(isG-65QJ8sDO$YYuws8uh zfyV$%p#YbRPFvRV>E8vt^!G@F2A)3r*pJ4;EZleCy~K}IZS`KYTphf=2bK2?EJk#j6nc-ykGI{Qo1H^7k z#FA$u>Z7p{qra{#H8_qNXfz{4LyK$z0yc4RN|OQ0gmC&IW++;a z#bP%W@X^Mi-t-IzP+htZcqPRJoDZel@hb40;ghcgO^jll%x3ltxnjtDO$E@4j&D-t z+qrbQ?=)Xr7so`Hz2BtjD7+|Pnzdl)0GoXwr}ZdE1=>Dy*KMHe_WMQ{`xK*+GXaVJ+y{bcg#!yz1lC0pcOoX>`ChyG<+oJ zCL0+zK!VzB6)fhp+iFtjO5BZ#7Z)58*3)w4F5O4@%V>*#GoF+1PWcR*Gn z=<;P;YN{wYWT_djV+RI9}vhIx}u$_k&-RFY+ZdkfrtT8X(|0hn*yn z0wT`x58C?@bB?8v_iu1qC}OCa$}B0qVN-d9Gui9n%DV_T$&P(QMMe~pBwoA>JJg#d zT;XQt=fDk827>S>Q;-m0dHn!lDqydoRn!}Xcv`Mi{jjmG2$@iXBaV=u{<=+uwacP5 zRXeMSx()qLKe<0+Hxl*!BFIG|-bLMIhHr#)&dJ4F)fuJ{dQ144%vLfwh6eXJeuj>| zg&%rAT$VQPc<2LB8MK-0K9|LnVse{gK1MV1YZv#9#v1{p^!slymL%%C31yeLK}{zI z29SdNtjY!rdh^{(;-4*Y;heKmGIdabya@IbvCWJ*>nizk=IG={tV>o8W-wm5Q#s46 zgvs;71C8~V_B;TmHMp%k6kMtQ(-4vg#Qc(b>zRSUkTBrd z4nmE3%PKbg$J)Dr=WNM<0kZA#5E+CjGfntQTrj}~t_I$A*pCU8HQ(zItqr>^se2#a zaru!2(a#w0GLBBZ%ZvQ^$?+aV$=FR7VJ#v4B*FI*a#Xw0&G1Izfe;!*Ly+Y& zfQpUco%y=t%_N>abbgF~ovEIB8UH|IK9wQ?l9jri^9ZNx@| zobk#Mlev&&saaL(eHE%Wm867jzMS$R>0daBwww+Jp#qXGwn~&0*=nX@Wq4Da?c&S2 z`B_&rDnPOuBg20R$i6!^{9*B<rIf;?(uW#YWg!%*+hS zKJKFTzXF)r{;n+RA>(-zBb8NyMDJ)SabU2)EICPgtjH zoO~#E(JEN?(O@qrRiEyo^_M8iZ=nFXmMf)T2|g9KSkW(KA#VDAL#b3AtdVvQg+-vd*;EtFD(C{s&DEcz0b+ zPvo68e_Po{O;dXc@l8#29M-jE2B1BAv}2T^n&uJK&1U^_uuihL!5ng-+Nf0T%*CZ_ zvD9sKXqQ}`!v((t5w8{g>^W^em-D~xe7*N;w6m4=8GWUg4s(M&Gu>{ZxQw63DZRq9 zsjzj}2D`n*3)P2CW=b>wsr+VE*+TP8EMm72-@3xd9w9M8i365ANn9;;iJITLdu*t+ zXsO7c7)lD|;&!!BSf9Vuzk=R0W#LWfOH3ImmwL4hFZOMI=2oGupU=&WQp}ux$e%gh znyz@E_$_gXY#+=FU8@8+_|(x2#@9Xo^JCvC)lI64)5oTqTK*_izA)y$NH#gVjQs(( zzA*jK94qN6XMkVM(wcl#^@l|jzKK7U))16L)G8glT5Ia+Wh2^NQ8=;|lJ(NyGxW*s z!>~x4SluF%wCg95z%L^&i2#7t`;csfk+`17P5)IaM!9x9EykQ9b_|>qA1L_wxOIks z$tC}4$h#(w#k?0;9n-z$va2ix;VnsKaru*<%&pF5rK%cs&!=aj5)utM0AuJe&{Uot zC!NH&zDA#s&?wvpG9(@(t%yVzh#`D_GMOA$o!OUkJE^ek)r8EboVuOSDJ)t!M%&mb zAf&7njUej-l^96PGU_V3{C1C9onb{cYpY>B*MaOQkpMoaFw;9rs$GyqcptXCyatx2 z()GwA#!h^**esw?EXl41)7!xfbmv3j(~ujrDkfzLhSI-yY$+j4MJ}?KBr%n)hEOnM zraCF@b$Zp+a$6wJVhOt%!{Ph5@&nDG;$%zLFP1#8z88}aF1$Nf)FA8^t$CUjBS=1` zJMLjae6mD1PX24wQX^g{9=^hx;QDSZgATqf^j$Y~#`*d@j`IG``saw(a;*4okAK-w zub}t>zU0gS`nJ6!q_9>BXN|Kc_n1@G#dm2{TIYm}XR2lv^-RfpL2*2BDn6dgp7bnZ zXL$dhji$%;CzrAQemk7~1@|4C@Ru}22HFkC#lK{5yJ^Q&nbarCmStXhpW6UTP8%ok zj*Qjd-Ip<5yr%868sdbL`kp>h3LAw#O$0G~v&+l5`wT?~Wj-V&$a}HOL$*N<$a82YUg`6ExlR<_7 zh7;?&LC>e(zEorU{MZSy3!YY#c-eZ623}t}apy_$Yf>T}Rxfu90UhcnP#GO>~Kmd1%4~jgVYgXe5qdDZipdqg-$K z^sd@d!~-O&;&)wW+BFrTZ1po#{KT_tvD(#B7^P{OycWSF9utS#x^a#)iAEb=+6kc^ zr$S0F2jg_Z-$HSt>GfDj=m#H2D?N3cj`AjCnLpp0qcDCH5lWczy7+ra!Xa6&)d*4Z z7he4x+c6V1r4MHLb0#$3stZk2($#8*wkes1ZzypnSShs9Ox>=c3)b*kbsG#!Y-^kh zqZ5SDIvzBRwR-h!bvK*Xx@(zc`b_d@GL_1ddyCAyXu0tGeYIQ@+cZZ?J#=V>)Prho z(?+-W_3`E$EE3E_WAN>Aa*jk{FZE5s>B*gaproMxw)9-bH6?BEGbGcSsrZhRlNren zYRd!mLw|o)a#boGl};6!okmYE zm2s%v+EsG1jbiw&Z5M)Rx}2zyQd1dUjZjI{h4y_*Stbf{c-*O2nlVD(VTHmaWzFXA9XQjg%ej*^>4Sc{P8xd^z}H| z`HzD!%4&A(ol<%FOs6Gcx%nWrxuXA%#{Z+XCVdwg9ViYy=-IYO}K7Q4FdyV|irq%bh-mg!_bff%+2t0QB zH6wf59!6%Bi%NQK<@DJjSNf2Q(oOW+{Y#q{_Kbvx*iy;d;!;m8x0`ch24AInCV94K zH_8Z*Gd{5(4JUo5xO?ly+6MtN4v~pCutJ+iGq32oBMI+FN z92(@_GtgK{)<~&E{ED#oO~5gly^i(dX~2<5F26TNIu=pN+O06_$n5Cevb2ga2FW`1KzOm#5d$6k zH|G9-UWHl8rOX6cd?N#h<<+}e-kg-F$I9k6=OS$7U?^2C`2&|OCxY76wVmr4Xg?0| zlzaBNXZBbqr0QY8bZo;=!>XE4lgO4oGr!rQvOK@yh;atx)NwoZrV|<@-J_BnhX_yh zl+-fbaxA*)3DJagR0z$%+uLGuk8O3CG6U2&b+})kd7h3yOs#=a(M7N%sH?)2T0=ue zL#Mx@r;3!L_OFq`4~rMYZTC!6G!d$MdO&2r#Ruz>Z7q0<8?#krqt*o69R8NB)0<|P z=h|&VL8Iiu|nFYDLu24tUhI;Mo+W!C@zU(I!>eey{ z`y-sktaA(@fWg&Oel{=4Gym4!R*5)TU5w+XTzAB_e1AOr+${+@>vHATCueP6o?V!b zU*R2BA4%kql<=H4!*M0NPX*b+l$-ybL}7NoIs5LdQFY7gm}V_^T)Y~5I!hx={Wx5- z@mj_a`nga|A#+(HE!wj+_M*M6z18O3lG;|-KWHmPsg&iWO3gBYWk)5eWAzVFPW{3A zER*YdW-pT?mkF1xZ2=X~(=cGu6f9ZYuSOqi4CcIm%|STLix!T4#V1>8*Wwb1oNB5v zENa(ZY#Y@4gVvZ=$$mo73c|AM->j$N(H43W6a>OlDJ0nt;57GjM}4O8I`2QY;GU<| z%mnNMHDPKv8nZ|zoDi0Vict5kKG$2g*0%6t%Ft%w^=l)-9#tVDU4Z^<69B9EB9%Wp zt#~qOv@|>W2~pN^VFu)Mzy)%P!QBE3=>`*CG38gecfH5i8jA2i?K?9}o)2Sn+20|k z=zHgwUynv*dqxj6$Zn!^|a=iFK+KJaPTC=eMw_7EKVqv5Eq_%U&Yqz zp=SmI&)hx4KMZ;^)uYh+kzU<}`n+vDF_@mfcH?qN9ix8J^jhP<{9QoEEe^^!SNUeY z*E&^D6GQVGwc5rFRt}aK-hYITWjENysx? zm!FbovcW=)d6n`}9H;&6;+#K)k;5ooN1=?fpZ9RkDbkl%M>FqmbHjsOusH>)br1IR z&C5~P-h8`%E5l5_0ou1ma;d-`{-x{pe07bM<`uM-TS>NqfKg322)0LLN3k(?IDN=HS zSVu{#EvSRhTX${G8AX*-hNMd{bBpY|TGRKYzc!0EEl#D=IW^P^L92S_`_ zOHVk8`Rp8n4+>qN2wH(+c1aj%OatG|Wud0bz?sq9RNC_F-iX!AQG2@fLNz=CHbOuL zJxv^cWGngXZn3tQ6m6d-j$4k{c${lFV^p|<2gBDc52k6HW-^|Pnesc-P)zE1wC!=a z4CtkaEaV{W3!t2>o0Y%PVs(FPyW;S^wAIT@c|&1`0t1iDnDgSPlY73|+VQFs9zt&R zM`h~odVM)~Dk*xRU}~xG#vtz>w7@~dT6;A{_9TPVS5f3S#tDBrGPFVD_wvP#?wNJI zcY+<;b5_XANQ>CaA?gLHu19;l@hwMZ>xIgn3cN-zsC|iwR1!T*NJNI7h&xvv{w7T zdb+}XKf>=`(k5YFt}oo73UNdm#&KZuAi?GqhuFn;rF8 zp+;rPA$Ire*#A+N)AV|BO$4i$e}nAI85uo%#ZdRLzV^7{CvP(e%-fasgP1Phy4S;; z`{cEnM%HOkG-}N>4CbBOv~oDck>$I@+|!*2Mlh31!yMgYR(TtBI;wpOXP#$s_c?Pe zGMWD(WiC{hq6xnuwN|*^N{T(QKWnIT`gSyqiV<&WodZ4#2fnzh@Z9)c&fxZ%HQ^S4 zjpIVH5t26B{=r&^)Y@t`KGo(9Y%`bk+f}`pBVt(8Z5Px@_Yfvyq|H23f3dPRr7Men z5=!%>&k|x`S6JY}GrwJ!GWLWo^rU3@_21O1puVeegdB)XKYT3SAV*SFk%Kuxqq=cb5J7@$ylIDOVJyJaBstZDn-gO;W zm;c!uK8J^krW@PwI0${_#&=kU>)8=OVwz!&tf+_op?+`)(t#pSt5q|5Y~`)w251wX zd}g!@ibr}y@)tYO7EX?vW@pu1N@Z_lZm&363HIxcQw-xgBaZVyMM0Jv<2Wz;PC5COw!GXpm9}WKw4@kq zS!|HG@H$v7U?$_w0P~xv+WPgAw@%fLOmkL~Q@M0@qN8Facz@zp=YrMjxb~0747L3= zjDM3nr1bulWJtQvjxFPxx+8uVVVy$l1bjt|RURAEQ=-v3ZLl1H2+GVeSjK4IWcQ%hGF_Kk5h~gcSiR>z$ zlJr0h?vIL-6ZFsHv!Rw@IYT%C*0Fbxv@*L4GiY z8kt5$V7_>}A&S;?q{NP617q22zNL%JxbDi8^7-~wx%s}FPzpm{REu+dvZoK6Wej(r z>99+x(%EklaKuZVRP+lr2qdN#QL^TgwDGe4>gb6%vb9mPrV&%>W>FF=>g6VjJ*siq zhr&-WU%M6AKlyTHat>FccSELWe$}(|WZ9F?y%TFKeYloCnkxo@_K!>pT{GJo8gt~0 zCYe9|g=BoyqxkeKXKwEuva&?Mq^X%e0rO?|&Yr4iUR}KM^ce4ISp*g7mnRJed!kpF zc>EH~x86g5wTwqQeG6*q_19+XuYxcVR;^}kGpl2+`|6!vLI#$1-u4hHCU};HWd7=` zx0!fJ?s1S|288-J94T}``S!Ji3LQ63ST`t2CadHlhSw6i_MZ5M6OMlW47AuFzsMg+ zNFOrwK{XE%H+7icD1$n2AecYKm!@G~4(%E!<`d$RDW~`#H7J~Jd4V1TDxoYhP*hOl zBB4wWo=lFGQcTQnOS9BF95d^8<;z@#LZlt~^_bCM-oTwZOnVf>+s;JRT-e+i~7D(G9co(m3YJX zivVy{z@&B0%S4(Xr~)W*W!gxyF~u!~#Uca33)8lv48kg(|ASVler666hl@nz1T4^B zAc4#Wy0NW^*g6@t1j+#F@ZwgI@X?~|ubd%SO$Vxk?UBje(J)luxbCAK4!y?xk~(I{ z63LtIw??AjNC~9eY&n{g9v7q;v$7M_Mw!iGKrOY|fa=|XNf)SQLnyQvbwXr9`!Tw^ z0HD6hf^{xca&*^>#DN^>6=T1Xafqs$BB{{_{@{#vGBUR2QWPP0bDZH)JQwI`QE%WE zAVulv*xK^5Q{oCLUqanxgYHu5)|WjlSSPBDQeC`>k5i9w3K2QEd>`D68zSVgOA_U~d?~nK^Z)E;J|3Ul7e&3||#>TBD65|!V&we9U z1eIRK@lM%|xn9F5sKroMP$PynyRC41HU&6cFFfEFYM*gYmTJvfq*vO!!3N}C$30(> z8e!;}-3)I2g|Fu%#C9c;iQYS#^2W`;9u}DsB=i;(SfNl?;rXZfjb1kKgT>8|*C~!$ zp)FnR__{cQb?}Y2ck2`BOn5G=Q$3y3a9Wgi|A>QbvH4tHBx<{bp_N>cdhY(+7fBQi zPrRQcKArrSt)%jPp8Bj){RZbt@tOL$)x3@o;!$N%3cNRWV1(`k`hK79_pHxUBE6Z~ zMIl6DvicR}n%55wSr^aPJRAcAwz`fb5^>*kG){91C1uZIMo3+ga zc{#QvFtWSrR*4C#KjUPLI(fwDGlwDxmGE>`wVH&=*u(oMUML;~E#5*758tNq;{7jX zjlaE>QI1pBca~jRCcv}JeZIX!qY6B~3EKyMZ!&l<1+2T z`7cH6X1BFL(YiBg({H2*zIx5JY*0|^ds%1h`+QH~d7ts-#kk16cR_JLdFF~7$R;u) zbzO|E{a!i-@l(2)7r0xhm#dN}#`XYKC7if$YnUevEPROyg!ai(P;C`0?KXNb-KJgK zowLW2DxkkjZEljy^xm79>a{7u*vGW~N5gS35}g}2$%w8L0zj?i<9!jEMZoRl2$zyF z8{E4=xct?hqt37yix|0=8PZ4U-2*89pwnu&`OqG0`RAb6vdOv*wrzqNl&Z*0iN~kf z5Jn$<6Sm=NjAnCY=SIVtNaeWk>2)6&s-EtwEV!IyzZ)R)AaSa>6M3>dQ_rdg-e$<` z16(}MMSN@s<%s+GXEbhcCyLW#E&r3Xt2deQ*DUr#yU}J5>3bOr*+1O_m6G&>NlhDq z8j+)dS@!DhG5l~ZcN+DgNxlPD|3rwo7t~`MzAxgy?sl4AVBcyd-e~Z@t>$UcZx-Eq3jr`pNs>-y>X9>W$v!*wFXk6ue*wu! za!b%=i2s>yGTYnzoi_mwvjSASOu=3!>iAhI@L6BEA|pGL&Vpi|u(h!qcOvJ2vzt!r znrtBFIh5%)-7n$eI)ZInLK{!8*QhaP!`=gB>l6TFGz#wr z?RwpwxhlA$Lkqd9;=%&e_~HOp#oH9pQ4TI+bQ`FDAvQ6g7fd|VfzN$nu1S?*-Vx&Q zUDtNy@JaX3n&igSvyArW$WX04=URyFBk|h?)xg zdmtJ;+GW8?FJucY!6A|~=93&jCmj~Vf(NF$H%liX9)3Xp0DUEt2@)aVn7`FI&q6uV zfc~i8*$1D@LkBUmQ#PPl6mQ=v3&$1mr&o)GmdSd?eJKcj@1kOC=eTUaHt&?pY@lYh z?f51pgxX~H3;kqPZ*LU#7&D6aHgoEomlEC~-#p(_%ZxBv{@nZXcv0s(>7%Ks;rhpV zAkqhFw#An@qe#0qwmIroLlDvGVoCl&lV7`2B>~!r2_msXnhM67 z<;sF&m$%|+udWeHgytRNE?*<#6_TTsHv(pLFfg}wWmI`B_Pp5EFc`fz=G_Yhoh5{L z&q&sAtX^r+wKTto6GTmw9i)XiTzt#|BY`jeDzklBKNdQI_3NDXeMP8Y?+REZp7APs z-+i8e#{U#@EAHN;25x@78?Xk6Aw)H7qzRcF?0*`nJ`Wm)YBi--oiyG;F;+nV z$$ChL7iq;z)!5IA5f(V1nhs)1h5S~fUH{d5V{ntn!VAJ1jd=unVp~~ArTWyk>Y!!y zyVVvV{R609qrj)s4}r7;AsHG1X3^DlI8aGttg-qxq=x{zzp{niYuCM>63t%gy}3>H z=u-w>=fek@`cJS|`yp8p7kBDgZ+Sd{$A<9PPb~XiF7hwld3}hE{=Qt>0tZP@1=OV= zNG+Q)^K}p=npJ{DmjxF@)B6q=nSx!hG6|361hKaR14qzbu2a=!N-FpB1C%~9XF1IT zg1IN%v==0yO_34@#7I9R#eSc7Xja5qAEx1=#OVXU1PH_ z%R!XQ6Ue%{jMrSYIf!z|V1TN;RJ86K_p zeX4q@u!(Vp7O!JFr++d-8M-(_J36zpr@P$Htk@k$9)NnE2>p7&&W()=M`u`~8SceN zRkMg_d-?J_o6nRP+4sAb`STkTd1` z)`mGNRgPERf4tll(GGrgnVUR42~#pO8ok!uJ z|3Cjwslr2y{O^I`K*z3M2sxntvVwfNX6mf*kGK9*no*^jk9%b)=o(zFucN6cdsZUl zHZ~{F8=kR06@$pL6>6C&cZaDNU!AG6eA+EJ9H@Ww4;rh`rzgv<4G>yI8c8-=tJ0Et zhWfecw|0_yMa|mj?NU|xpw7AEtt|&WJZ%u5Vwi*S$G>=^qo<=?gTBv)kHHP^htK`L zA`^d7IWEOTCmA(X2Ro-63r*gMxVPByA8oedgVx_o%Ej1s2(ozA`pu86Zjeskh_;AN zUAP*%qv~46uG7<}<;HzA!_=Jf<{1gDe9N=nZ8SEGW(PeDmRtJLRWl=#!Zh3<#f%7X`^Llfk_g7HRw|3Qnx z_y>&>0mMXSF1L>VDU}J960`;9Pqo;JFlB4p!xcQ`8gITL+1X9!3BL3x*Z)y`U6A(B z{Pj$~)yHtjJ}XRAE_L6>s)91VnyPaZZ7!|2xfjST2%n7`tDlWq)uV1_EA)3P>T^Fd zH$fG@--7(vcnB1f~-D=|W{awfIh4dxHYqIb)#hNRGd6RQ9W-{S3 zC)P8@ic9VA(X0UTt+7Zkv~QB%mlrYZbukW)x=atnBS<@pp;yTp%pSu@Gk|u@OB6xa zW>jirX^dCtHmJ7>400b!ouj?;iOJqEoQPJKoVlFf^w~x5x07skwsQ_s?5e_aO%lQ} zou1(WH!n#&ek5meL5~-UZJ!um0mTg0@}bA>TEbbMS#J}vzY~vZ)37TVADj!SSIZtq zrQCZQC(ozwH0M42eHc40EBXxwI$Qb^%~e3v6(^K!zw$Q-Aj#lc!5JdfkM{)BXzXqZaZP} zH`cLLh7>jD2zrX-oQ<%GWhH!5Ese`-i;a@ni6zbQZ1_qHaZA%l9e>HN^1|q|YbuC3 zCsiX=vm%Ydd5G+9hUham@To~W(_pW~5vgBjou^mHS~TFJ!1L`(VNP;pADGb9EYn32 z4LaFQu9_a2q|8~6S&`;xd)CZe$ttkW-ji>+YD?`3JKe(CTdfIQsaFyk(XC`^5tza5 z*|4ro`<3qcjt4n0@W@_px43s(ke{8O=RRkZuHtUV0!J302V8J>p>J=bHM5K8Rx;-q zl^l^OIG8v&^sOf2 zN2gKHfuAEltrQ@+%BI8|V4uIJyvK0dl3zK`dIT}Dl3m0*%vOL_sV1pjHP|YM8xu;xg(08{7#mN>Pmrypax);<@ z=IG0BIj3)W-+v8K}_5@uaBv60@49>oc9?nD&fOMZ|Ql>tmMX z!|dUN`x+(=v?f>3f6~(4i&ZRQ_=)D{`@Vs1p#ym8I>UM4CvaFfosBtX) zA2g<#&T{y5btyKJVPLSlco-2_L}ta^)9#=>t8`*N4Al=7%@&l{?R=iSqlY>r%HQx^ zsP`9WG-MR0OwLE0fu|M@%l6r_sEC#;GezeJVNTRfQJxyB=(0k z9$_2v%U`c-?<+@!uOHV6#l!DXMv>AGUO6W4z$i8q8=KmdE2PEK(a_;&#xZX%mveA? zHW5PU%sGjB3*i}SUQ@qpxzzf~f2lI?9h_=x7X{Wt%j^jmf9J7>B!+}+LmgT5mIv=d zK$^1+yL$8H%h~HMRdUw0;qm|>a;E=yuqt)%m9+he!#h;1IBd%Rrce7<@FIUbsmAuU z(EVX*KU+eLwA1sREQYoF;L$s`9{Y1rXroeL$AR4ciq`H~A?i){fz`G6SJ1c>b^~Sd z@lrOQ`~Q!A?S7Nitb1cxw=1#-L0X9Y}OC&eEvOLK_#x` zk$XXXh!EpY9gEmc0OV9KyPpiUYDNyjRJ3iOeL-fLUxmWKppvJvoAgQXM>nDV1@tPA zJyyYNapA)5T$16t{g@NS7elNAv{!4}6{@xMQ|C%xaWK=AVVWaoeCtPv3wYCdt{nJZ zD-?Bzx$1lC3UBlSbp^W;wb;X%nF~)}L&JmffIPdNreB0}t98ZHvNNda`0UtJKXq7e z$!4I>nT%3o(;OX`wGTjAZzGp_cI4&gT&Uzoad*}?;lMJcT4PF;7qdf-o-wmwgM{n; z#5+~96*)I#n)CuQd(1Ef^hy~lLD!zU`aTro)@l5&#OhD^ZH1|AbyLBFT%J+IkJ4vW z`Biy`cH`ilh!0{H8WY7^$ll~Q%Bw8mQR?zJ32LY1xeZ2qKnc&F!%IWy$92IbEgEj} zi(;oIBkj(Oe@{cMr1K|?v<(`5oo%k&L8pk735r>!{3eu&+AAq`k0uY)rdp=My-8~O z2-j%70UmD3d0b-H2Dv-gk`#`F?DxDVdRslBA^!X%6xHYk^d%grn0bT-{L{(WprnR| z8RPOaM}eNvr=4!S z%SVQ$(!Z^2H(X8L+gQ~vQ($@S&_dFt-YWB#C=hrlC@~ilgQ&mh-3qq8R+Q9Jy0v&g zw|5ZlGgy|xDx~nx=-0NW`0eogtIyJHlyOn7Cz{h*P=*%&<`&5!s^`bo+h75zOcv-( z32pj5pc8urz{LW|Ap{ADiVi=^bVWlfwrY|&J#q52J5-^PyrGx!f3om1V}@ZVSq+5K(+osmcl{aBwNkF~2lA z)xS5b?jl<>8G=l!lYa4yeJ`##M`FxPRgCU;u$I{?&!5*t$(U4_Uw`&bQ@SLcF9#{Y zdiqD3PDh5@B6F6Kt`j^iM;Mj2m}FN0Gs`capA!?%e#WeQ-Y}Q{{!OpitKu4 zE4Rz4LjrieOe9vHuNkS<5ayjvn-u>uecD-y=$DfYWC|L}g3Eg(niy}cC*(RHiB6I3 zawMP1{@y)7$jqO0+15sUWF^C|^QX;LbGoO6Qj96tbDy;LWk&0Q@)Y2uxr^;2^J+hS z*TR%O8&IDfoK65zigq6q&x~e<*vHn<){aSi2dIT@0G`zs0$Bp$D>st2rYwBq!Ge~uop=0fK)$%-j#zl!MZ&jXNl`QrK8(Zbc(8OixpW&gyr|*d) zMtOvT}XGX zD*gA|lIAa)^q2{+^$H52fqH^Q z@>DG2I_)U^yGdfSgZtAP^P|gBxRM+WXL1L|(`@6{zc9tG>!=}y@Y^%`n8xIsCi<+) zC2T`VQr0Ggoqfc&C-*vzZzLsfAO+k-oZON zF|J%>v3MV6#3c>LW0kF7yIv;6XULs4;!zQt^U(`#_r8ydFovkR7#CL?873*&o*93$5o52f)_3zB)R@~g&z+$r~Hr(v=##@rmSwxRyUpcx>?~54g9|GSe2?iD4 zn!~)!Y#GhLBSZc=MXeHx07^6wb*F7MHnt%PHdnE_STjiom+L6l%oSWvhdnT`vcI5& z=tGY$XHN+hB4q0$!wEzy!9YX*@jT9IWg(fBg^?^DrUkZv=`*x2@DD5NWK;u}ZOd_z zGcs4pVW~n}8JkHkButAxBV%Q?JV7`v&{U!eyhp(c zKDCrES8$0!H!D!2U7yvU1KGVL-$z}~cE^ZLqgr} zCZ&(dlUTK)i7?5_y(7t-p_@Lbh+bjpygy6zE2JxRiDBZaOK|#SLj6C?L+q5_`acV<;`6$@BNHq)&pY`EnglPfM&k9n<#*531Bx#A2UFm_n#sZOB)jM~` zrJGW7=rry}#%jViwo!S5bf`8IN)$(Q^w{9-sad8g6$ znii9Og1sC>vb_DjQgx_%uBb{8LsEYfcE(Z+AJ5 zwfIQklOXGC&A&&JzlscsbQvu0JVP?je6-c%p{-PzJAK(S2Ac-+}a#3 zlx!E9A@=-|`A&10MA`x~hn~u|fFZnQy+k}(w`0XQJW8I_c;{i1n%q(x zfi4j*Ttzf=lwh2{D)cWvy9(={ss!G$RZ|k+KTi*`O=RrXdQCROx~Gy{nnYd|VRPHE zol{CQPmf6+&;&q_d9<-tgr#y!L?$v?sp(h*EoNx;@&vunB%>O&edkW^>jddP`8Ry) zj|IBtlZ)_m{)9G@_f{8Y6i)m%6iFT$wU(gVEy1?ZU5s+i5+`jtDE(E2<6Y^c`CwgE zd5cvU#B7QM{LBNf!E~70POf%v#Tsu1>&Q?Jt&N~@-+Smxm0s{qA-{c`^IpvX2*Vdb zsT8LLG_U-y>Mx6B)hElOknD1qt^pk|?q`A@I|5}ohZ?px;UX%t>8SBZQuyc$73Pk# z2VD+jPGz|26lx0P`Mk}o23*t}RVfuRdn1eP z%^WD~<5jx-mUe>Kt>1ZAV@UEW$vMXV@VswBiKjhK+zrMJD3(fgr>xvs%MN&{rcDB- z_hfkU@c5Fc3>(U*3832J;T%Zj5lKJJnoi<3O9di_ce1{$C+9OnGhauDyAUQ|)-xQ7 zVCYJ8clFY}?ta}IuijMxd$wwJ%y4;qnO~3j<2S!G^K8k_rU;8rHq<%8MA2kZGaCRY zGC>Ndp%02{%evSMl|SS13d+!Ebms@rpf#dhQcw5vFa8Nyo~J#%QI|4bYu+(ML&d1E z)k&0cf7X=~U5801Fmmwi12@Vw12y|}$>K6u-s|D$e%n^RBq1f#l8QjhD=UeROuYYe z`_d&u{dpO7&WVUdviP66W;4HTturI|8U)`p2B zM<*cQ40Ze{NLL&NdFQ4-Dx`+lBv?_Na0XAY%}YTNK+3ttLC+m&*qFUbXwhy57#ww} zk_7I{j4j(Nt%61e^`x1iMtjH*@!Ot1tx%qTWx*;NpyX0S%0m`#ayiGf79#crkg32u zIXL&G(44L(+Dt=f@5K^Espv898IA}&I#Na!EQvu-&A>cWBGM)kkC+bJb4!%c_CRhG zdBD>$xGFZ*XdXlZ?4isb#ndwz@7P!~F-^+Zt z?kYr;iQ;YFDIkmvr-}mQnCJ4qL5vTS0n(`=TQpXEs6zAY^`wEwd{RD1lK>NfJBm#W zYE0JxGqO;pAY+czDOgttWrPr{KvVkFvXdJ<)L{MLj9@73P?f>1rhDBae7MgC1J;{~ zYGc-9ke1E{I(ktRVibe~64`PG=|W(&L!y<5J0IpA^zCxs^fw~BV4){FoOH*fPbG=w zFKH2dqV4Y7;y4$-sr0Pbq)wtsh~ojWTa4qi2@TH1MAuo&kHZY&s@5g4zuH3Z56*h~ z)8)8qM=j}9EstSIM&eSrktOS~EX0wHG1j(mGPzP&v(%B_ng+~?CC4GXNfgpCMQNq| z!^@4uLBKUFSn1PotvClAc7dAFA~~)?ZUZh9{vPzvoLO$yRGJtT*_1ZXjE*y!mWR+( zxt4Yd_eXlv$XKBymVA?pR1DaTHC|hx=M^tPqF!5-MG8l!N;fJ_#au2fZyi6d1ZfdJ#DrDj@o zE8X3!eNVBaV&0}-n=R8}K>(l5i`YshQDbPRGTdZj{uPvs;}ZA@l1ajX7eB2c(y;i* z`{#kuf!gDwA7}+(KPlj1r;uclFtr|D03#X278T0TtGn)T^#1@FXoiC3^{Rx#8)(aVBPe=O5(z;(Jtk{$5lfO$2H=5*7A&vei_O=Z;9}h7}`jF9yNExRA)*k2tJeV9~6o zSki~U_WL)00`|*w{c9JP+_+IeH;3&l#~XO)K|Iw%8rYo`BRRClG8~S)b?c66qBx80 zVzB8IX0{`ncG`NMZ>4oo#hKK@qGZ-CH0eUh%u@pl4{r6_3hADGOgl%c_)o`g8Cc7c z&N|YTrZR&*mGHlgcaW^u>DIX_(Ydmy;?Hl<{6QVg4td~$J6D}rk?CQp_dP#K)QQ_8 zXLoVfir|!4=*E1X9b{FO=lO%tXjeR~?T^rt~JoH?&d!1CGAf z^{Z0QO&K!4>u5wrU0hI148*g#f>sF<032{v1t}SjYi1NA)$NJW&&Bns5_sxgk^Z4V^ zoy=Rga9=SSVr&tPYSB&E7QWe$mgbW~j>KssXDXbNlR{(Xu@j)i?hX$)_o}{xty!3D z)Dz_r3E=u*(t8d_j6*zRy|ja#4;d6RRCGaVWPw%#jj9JChC=t5d``^3^zX;{>q5~M z^kd+ECV8O*kj@xqsN6G;rfU`kkeD~ifq({0Ug#n?O1)PYABJ;9v>Gi$dCHzitlF_M zk#!{Cags5TDaiv|q^&aXkC#3D={TAxSicmFobLG#YR*wBn&pvpP=4@}`q9gvl&oC0 zniAwUM+C4w{*@Lk_cGQmvlA9e5KldO@l_o~&0=S`>Ac|jR?${7t0BK?7&}j2!lmje zYTArTrChI1rBqTyIdc$wszdUs{D=JJrcY3c8q(}tj7T}gXk*ZnOb{wbmMnJUQj!vP zWUnU8s0Md%dFjOoGTTD=Qn~V@!D2Zi^roU^DJ7ujt}blMw$7o1oH^-?bgR9HlOt(! z83BfR(~8g=x*+q8GTF%(#b(Wtx)^0ABz4AWqU=MBhIz*sIppSs?kMUv&40hn2Oim> z3R-L{T=d@9BB&Jkh8vbrL2RC<(x9m=2_(2}x#J$SNfw>aQb|Jd`H@VR?lIWs3yhPB zmM8Br7L>2cpK4aQO%n&&K4a3UB5nqK!H7Na#WbucnxKkO2`|&8Xt`E)Nhj#L4G+yZTn`(v6C$%CPxWM}cPjk%$Y$He|Ex2S6gHj3Dg!(HUO<7WR8M$1t z?>u_;CZW3xD~xx@+0cX9uW(3-Smfm6Jr8PI6o}qn2_pf90sJaSW22l)lBX+=)|SMi zAe#g4KJ9eh@Ct{(QPZ`{~#%PA4waC`&o~J6OKGdFrv1S{Hh#|i4B#d^d+$=FJVh!_> z7apDJWup-S&Apj`Dxi=F@ARi|9R$Gl#SBPnj>(4OAJUp&(2sB=JaT<=ifIgAwF8a3 z=ca0m`K~ree8vZyuN-^OR2|1jAtM>d&womov9>hN$IX#~GHJ9msa(qH0ujN>5`F0= zOoPuL6glFkOpzxnha;%LG;UHrvg}*|NxKO|d@_8ac**CVYK90?Cj1D;B<7kx;zVXS zJoP@DQ$V6hWexXEM>+gy6y1aea_nRCWbsPZ8Y0OUVcQrU^vROcbm7}BNcH!iwudh$;bl-`q6uiF)WDTRUurn3}AHa&1N=8mk`@+S$2>KBk`t~ShBa! zWfXGEPB1E47cGl3-@ziT<@w0l$81(^M@KG&y*E~~vqJMWWg`K7G1D}pu8E7Y8r~_3 z4lYzPV+f$*2iM-QP-e1{IgMjgp6P>aV3->~;8yg}jP*HZ0&>j!IKTtfJ!@93NeDzx z!OjYTKpwu74xWr6D$KFTl}sF-M3(*TUT}#HZBVQ zawv@0+(|-i$S0rWNwLBV%4s48%Vyrh^aGPn=8)kYhW>})U1wU9CX1!rOy`9@Qw99U ztenn|W!Uwre}n!j@cpZJhg;K{*3|7*C!Tv`cKX*msv1IrlDW)X+0D~w=eX%RQF>{i@#?C#w#}>J4b6c4Nz9qPM?$i2g#xKsm|gw%o<59E)FF>bDOO zww4hXWej>84h?A)VKhOd7&VB^rQwlXP=;sfuBU_f_o!gBIDd#<4vWT`Jf)%!sM#(Z zh|ir79Y?7Hn&+t_zMSrl0Ptt*{o-E~*-5DQMWVQl*tnW5M2WMN{QG;?R9(@9R;8iu zp8@_Qc%Q*OEYrL(;>NhKk)}u;t}+sM81y@aGBZ@4GBK1n8TzwzW&78;wwO%|vDg6l zcJ{?)lR%eJoyD5Tuyona*10R@6sY`iOYZ*wGiq2_RMIHtbsa5Pnouy^20g2dXH;dg zzxC>Me`Qr&zVpMrEO=1(uT6UfK3u3bqpx`sa8J|>8rC@IJySw>NyTh@Y2XhDOXEKm zX`T@Ym3x)*fdqiDoVIjhdIG0K4la3aZxSfTWfp>;!uj9c2SD(s?VBD_dTj{ zva%RYKst5$)_q575(Lgd@;cKgj$!G>C{Dse9#(mvWKR$2#R7Virc$SB`{y(iijBFj z$J&5oi(nDy9Mj-HL zY`E-0GZE5+hK!=*^)#7w540TTx1}O%3nMwtZo;TBxdaO>CakH0+jga+?s`=(! zIl(_p_^JeEw?8jxuxMs{wg*3SgP(CkUn@){uAWEc_r@QFcSGV8&Y9t>N0{nGZlhEj zDU2t$_STH^{YO%YLgh%@{GV}M_BLKp#IDL6Yyn;I(4u1 zj;wG*w?u6R{n3$5=PcdX@79WZIbj~10Z4YIEgGtUfzREjh)JI+d|L4=zA1TpGpEYy zWD2aVr|&T3hcz{7Sm>ik&euE$d@s{(a%S8IVS!xItk&nD3JE5dQcrE-!S%FGB;fCo|DtujY0BT$RUJeoHq_9p;?hUIb6l*%4M8~}d` z0Ijs-fXmWnnX;1yN}Fpe>zW4V|>%d z#~^hTZCw#=!WMZlPfUKaIOtTJ)rsxggSl!fG)QM@I-b09=~cGH4oOOdT;z_K>BVHo zEUdUH9F76}sh1N?j5|X_2qS`j!j+Q^i*Q3B9%{+81_>GD)Hn`OB9du?c{_`)c=o5r zkdwI63xVd`VTKBf`%q5BFk0C>v^@LzQ$~n{&gZI(FG{4z%OO~Nymjr@ik^ELDou*oIfX-9k1r>j z`_QB&y9BXY#;xR>wlEGUr(pJGPuTEI;CKVytzR(>63b>)I2>p2sce!bvS}9}a46;) zAzK1Q0LC~tt!@m3?MNBMNAtxO9f=LQC=S1SpcN^EhkcvOY!Fl)O`-I_9;mq7zE^={`FBr&4^?JIUMIdl{*d&;F5)6#{d)h)mSboOv{qTj?}GU zFL8m`Hd(XJPijdNn5ft+N8KROYQ@}Vm>ahTuO6K#SXa1$5X0u+nx@9d0mnW4Xhu#X z=l5zsz{eu1VW131Eza6^xFj?mR#7UFjk^5UiHR8WNAhG1|{Zo-5d!_1*hGmtTltveZ|sWZ78y917+-i^wW8@x9i zsMuB=6x{H5#{~OOS1re^>;AK-JP}BgO0y1x4(I|hJB9N@Ra56u}ts3K=d(gnK89{`0 z1Rq|4i(H;!!F4P9vZU4^N0m7xayozY>tzrHl>iy%p53TMYUJKw&d_#_X#F0O!7HkvGt>cOZq%8zX|C^~Y*%n4<1flIwOEk0kW;to=>40XdPk z4hcLH?NWy1HJr)!agcLWV>KXI7~~$j9w{_5G|J4vH9N2e9jaU#9A#u!SsXDW;eChm zrjbiTNcxN0s|e0W9-V1am4Xqu-RYa5vy4i3Z<)UyO=lHzN{+;jbY?jx0A~WVQL&cn zr8UT7&UquJr8`_|MQ6Din;p6ur5h6FQu}ye$tS-)wQ4pJ(5%-5i6G;Q4?&ttmm-|b zND9Yy(wafcRLX($&mN;SN+wLHbUefnnF22G*v<OPsF#A;0tNTz2EyMl5B4ALli z5S<22NamKpinA<44+>8nloe|`mywn+f<|hQ5@n%uRADj4BZ^ieYTV(zV}eiRMSyc% zwlKVb=qedZu??j6M{@!fj%zbcTb)I|kctN7&M-22aY@R?u~s@*)f6fZuRr5iJxvK- z58q2xnkQ-^9hxP2|a12b2P4OT3WQSeV*NM+wk?Qr!%4y?t6EJ{5G&e zCb(X4@+lpC&2q|DHd^F+T7q^eQUB9 zix|#<6ReOon{LDqM7G+!xeAnE327F95bZi^*)yH&y9+N zlXgf0@;;Rg9NH7Cbv~T%w~7-{L_T2N0ME5~_>4a!PeTid=Fy(xq3Y=8J;w|?W7Job zCCcY!F{3=>DAI6|^D-_&W(Eap&dw9D?yzs^I$G2^%EC@fs z*~Tl;r#@tGP8@`GH)|j#ImcnzoU{}j%LXAThC%Zlezld$i!NGf4{I{5z}xe1f1OFH zJC=$aLOw=#=Wkv`XJb{WJo{PGp2kzup&3*CD$tBGHqo*{kVXmgqUa>7Y3Wzu(1?l3 zAIgykqpxYEZTA+K+{zA5u4>Sl7RE6px-1jEnm-17U_TdiwrVq%;)vIeBeZ zvDxym82W)*DIA6*w-Q-C*ohmzhp0bF(J?d$t0`@c+hhYZwT#-auWzYj=R3=GG^Vr~ zb|jf?u9U`ht6-97S4bx8a~Ik=DtW)C6{>bJR%bVHVI{i-j^zTK>S`sbLa54@C2cq%|uO$mkz%Bb;%bYc;t^YE+wShm+4a{A;6g32MmIQwph^ z4o-UgDOhSud5$$5a>Q|t)jJolFx!&L(08Zo@2Nc28su#({Hf&C+Tka0RiooQ0pgmC zf-Ie;Q=AU`{b*>JGSqho60rntW1f8g>GaKLm64m3*_ii0{LV?q=klz1Y+o?fm2d)e z7^+%mB>E7w(t(#C9CMmY7NyW=pE<+x>Fra?a+|qS+=j@{L(Ml6ILgCK&CNb0u;Bwp?W3O7365AseKYRP52cL6KVZ{x3f#bRF+KXH^5b{1& zTE|nJzXW^Mj1Gb4-~J^F|5hBw&w91r>5K z_#JRDz^2P_7_utv{{Z#WTIDBUS(Qj5liH|HQZ{u2jQby@OF?@P5*UrAr8ZhaNZE#7 z{{W>((imhacW`*;@TCDgL1yIp_w=VIi3l99BpwGjs)`24grP`$k;%Y4!J@^8@`84* zPdtBGo>FgNqE1*INf^xzHx=#)vLl>fatNu8g&{X80;Bl3%}~Q|+(-Ze=|B;Q)ro%i z&*4gJRvt;0<;NK(G`1D)Aj*NB-6`BjSZfz=lw)c1>r7)=M0q6fRG6C3M3f=UGlAZQ z%;LF8Jn_>#vMN@_saS=Wu-%?dTAphIS1gCf7$+cL`g2!%pi09XTc&u&H8(GmbLGHZ z_@QfgjiIALvI6UJuLugq5f0{Bu9eZY_ zI|Z&ouH({AL*M4nK8cybBj6-kmCL2R=ZIl#{yXe_MJ2wTZuLxYTG zG@2zc#E#IhjfdUtDOjl%R(R%(QBM9FBRX)EjsW77t|W;|ZsJZyVL@XUhWU>epjNpNa60ky zp|YTei=L-EQ#T@;~jXP@3NYFkO_{YTsS4h#O!+#vBwR!ibl}j4No!!rG&_83p8fu##Si7~b zi2nczxM%!ED?e;(s9he}p?<~Q9kay#B)^{WUg9<=zfJ{bEJ39@JiDI5qI?YSPlhR_vaPIn>g^&KdLj4IRC=ND>T)Y;>~5pcjzs z;CHVF1D0YjvU6*GvRZtR>Q=?l!u!91-|soiLPf^gV$Xxu-oBcL4pfGhkNyK=$g7&B z^k1tujaJm$sobm$dJxKIPg}?CGLAko-$Ti~KVf6=>&3SJ01*TS?DB`Sy9>!*JAoh` zxfnlM^|11Br^?J~$}*CYKHHAsD~QtO*~7%(Fk#SwIIJYOSU7 z86QmMfU#q4-?}&_@Wlbpjzf=?dgBxXOv%ubk=CU$id#Dll|W33gT(^4^-w`0iUds2 z0=YcrAFTjGEIH@5wLzya^|kb}+%Vi^=7j7fBV_b7ZHS6S-PhKY%1EUv zXWyKPH!W;t%_e$hJ!uLk$C-iS>r!ZDyqivQfzbVE0ugY>fsb6(qDoHNvPZ2^LqKUg z!8qgEg{h30(hUyE)mKq#c;8S_v(G9Es`c6rrDIZ)siBXyQDzpWc?F`km`DsdlhpfG zPcDyE$au*~*=TSVdaM)YBM*#o+t)SEJfafWv|MrS8|rxvigkf)Ce?ko2Lv~I^D$XP zN*0t`erHu2bSmidJR8McFPY$$Dc^L88)@yH#MiZyVqBLjzVpw_Fv>5QC&3;fmP^a` zh6XPzjhAE1dvljVEIc&3K8F3Aegcn(ddllM;_mR}gXU1maXgAMv+16-&Xw8KIdZF? zs+JMQqL{Rw3s}Kv0w)4E)DAcUIO*$GW6qS@cQK^#E~#cDzws)VV+0}?l$Br)Tn^^6 zwT#=;>!P|B7P0CvOj;S2EAo-ou@!4pHh7=JuNFR&7xpfjF6-%=4#54v)S8;o=i~QP^21jtEd9DvV$ON-DupS7iQTvEr*@8o19tXu#{&>p;rVl$CKRt7H;E0MT+3 zdz_Y~plLVci;GB@k@vQWxVvm*>85$+rSP*vzbs>m%3?aG?^>$u8Oscg3s(3SI?+@rh$N$#;E_2f~(ga8pFCU4iWj#l{0f1m~*&I_d9+68E zEQ+{gJo;j#>S&GIokitTSX8dVocA>j2ENeAy12ZR@hq9(V{q?R6D`Q?-bleRfWRE$ zrRr7eT1&o2k}?4}$o_QDor{n5eZFeGF@i&VC~_g91u1snA$2T3z#Zz75?3#cJoJ$C z;~B+EsA!-vYiU!Lh=|m1{g2Sqa|%%@pDop7D0k$8?T+HKQZjpzs;qg5ml@=f*P1!T z(2-liAOsDh`_gg?1L@I#0=F3H@1C?=3a@54Bd0)paa5TlBN2~wdSn6ZPjT3-BDgGZ z$jHZPWkiHXSp3}=ik_lkGo9Ok?khx-0gB8sBaR5`_|v%)Kpcz{j=cU9_a+L$WS^bK z1of%rD#N*dx^vIgtC*C@q5?uobRV5X%2K%=RFVe-{n+y zytAB>`c({nnl|pwUtYhJLnKhDPTY=xUaPwn-bA4oUXKCiMud1V+jG-FtddXbDST;Pn2Kkdp#RfExto zKGkiP$T!SVz-P8k<3iAxAq0U`H#x~YXkh|i`Qb6Q9Xrx0PQ!9yP|MFb$GsvG9p;P- z@N#p{UTK#B1fwOKVEWJ`G0y@>&*AGz!Xyuo!RLyZ7i*ygRkO)IUYM#*mofKDxO+rFy#i*H3?LB$PJxTPd2};D~K*d))_o1Oh*n6=bdpN~P6Iv2W zapp#nDf^(QC#FSjBPF3mOQj5B&P#LjHJV1(xgebafHDtiN;U-UNVf`zUl;&$_3uD9 zj%%zCcy_*K{-?uyND&4QiB zBBsQ&RXO{ta%%6PHywrpjAsKlqEA3XY@}z?8T!z*8_=Zk0>BgV5&2Nvf+km9J;{c%OhEVSWr;QYPw+ciXA zm}lCFY;|Lgz*9_u+)^2`6dp1;>C&2a5=O1In>E2!mB&tlq0jhK+@)iuveRRTD=6*W zrJ7pi$}$Bp?Z!u6b6D7=qbK`L+$@J}J0!a-r%HJU>qgUpm>QIDA557RVB zlyo+hilA>CjzFkvxGS4!9xy=Z&{lUeO2zC*4q_iLAYk+Zu4zc9>RGsqs+k<)`BqJu z6=BOUIKuJzR3RehI|$ESwRRZ{@52}AR+Y@;>~r^;qsrn42IG;QdJkHzQaP?^SX+pB zY@X-yrd7+$apo0*E=J%7xjvMn>?lW=_74SkaBcf_@|}x-9D6VerW##;skp(mqDkd`~8` zIgq*XRle~g~?u^=F>zz9vgVV=G}m$0x0E^IY$QIZ@%-&xohhr7%FP zwV0>?=9K23I8wVh4F|(XZHvuE=a7-LeKYG`Wo%XUJ0ndbc9O{*j3(iLSmFhV>;SG8 zCnHvqMJqdeuBDTMauiHtXX?lE9mIWCNxLZ+eK}Nv8y{bIJH;t@k+^Z6KzjXa$i&dI(Dd+_ zi)hby(e*cwDdGvdi({Gz=Dfv%Kj>f$Yh~i%E=SOF%Zy{5Fqk~Z>6rGJ@e;GsO0K+4#Lq^eO zL!(_X3_{z%=CgV;M9q7{735$^hRMm#T5SyTO=jHK$>k1@(2q)#DLqWcB=Z-`Cjf8{ zp~X`etE?L$Qs|O4{D-d;(GoV5<0EvMZ1gSJv#B}LPC0+eZs{iZRYLN z_a2qBSCFi~S;20d>f*txGM|?+62xSB4_Zu#y-?J+3xZD5*J&Q~hdmi-ZbaD(M&5wtt%8DR zu(Ppc`MBg_oE62e@jLPX;8igw+>Ysv_=v{c#YoThhDIwH8zfj96$zfl{Ae>S{J8{U zAY+PlDZ4U35Oah)0YXJLaTQr|56jqQl!$DSH*8_OIjJ>hm2OYVyQw|BDcH>-+TW3c zT>E=a)q$eg-jlm%>JQ^k)xnaPJj4%@8BRF?MQBAv&k zPvM#@N{xt8<(R39BX8ztu|lNNOCiPrjzIUS0$uX*pnx&nr36}JLS~E1VsbDCzZ4-@ zmOG;O1-@cOPikgGn}Zx%V+8ICgZS2jrLD+ha0mqB6$vu;WGy~3gMr5atCy&)VTO3e z&issH9qJyVNUbHx^#>R@q>Wm*;Wrz4@rt%*5-~6Y_Z1A*!Y#_3!1ebWW{}0+r;tWR zN@)t@Wz^)8ggj@|`ctr6kAD7~l{i02X$WYLt`(^`lq$-g9{!Y=xo#^=xXC|3{OCay zVglj0UI`f^`q0s7q%^bl#z%jxAl!{#cX5zN=cPLm0rC7pApI!VP1tKb4=t07RG>=w zfN-NfdvAJn2Chf;g2WNURjgD9+J7u=kmY}sD_p4#^N&z)GecGvLPeCZ$Q!*zdQilO z+EpYB5kPg*r(F!+DVC7NBkwWCdM*rinu*6zil?a&9J1^ja-xgeYeCH-soKY& z{3#?dBR(=m-Cl;NAOSGoXFIx_^uX%lp-68+S1zgy+#f^fN$Lne!j{fRIQ%HMo7B)tStUlDFi}X~mcjg} zxY)5qq$(jH&%H>REWu+lADuZl3-3wDX$@^Y;J28g36A3n!RMOJ<#L*~QGKb_BC5k- z19uSEDh5?Y=21Md!-YE+tIX)~QNI8l}4jAN~9 z%w*NsRb-vAgz?)HTvo9f+O)iqc+W%p=`q7W@mQ(cPTZ>Q%Nj)~6Ro^^0o~7FJD*Af z-Psvfj9VA)ch5{vYp~Uh6K16s~B<*s9}j0G>j~dUeG^hkBHtS3-)at?O|XTNpL_=KRnbr z$s*y0Z1)WZ_952p@i&Wgn61?F<=f!5>s->WV|dU=_dgAO$DRPuK$BD#I-I}s*?=FV zXYH{D>WNCK$fYyn5pj8ryNhZu?a z`_j0;$C1;TU{aRc9b+bj;v^PZ{3armB;N_P#79ZF3} zHk&xt=VFH)Kr<{>GQcbM$R@K+;dzRrFm1ME?w;Y>ocPZNja}o^VIv_PPhUz4nbf&jeJ)PoLyhz_QauyGTG9xk z(`5NJjfy&B9@ULnM`jwa=qrKFGBd_2k7K>E!Y@KU55j=CVMfuD$n>BI_K+|*pc=Tv zfXF^>;|CNH(AjK;N38`WQ+qCUrcW8o1GqHsQlnIhNL2-^cgPH*b&N0{u0T3)i zADEIyK|l}3IUTyt1?WHnIQmk!uVUO_VE+J0V!g)^o}C2+BFPv4e-#9tXsmIJ`qoDA zBb4ko?Le5>4?GS#3WAF4`#AhRF11!AkxLkm?ruo*ri()C&V3YfK{6%;zfZft80$*F znB$24TB2GIHhsRd(1(5BerRJ#<5`a&@#tz^qOnd{er$t|Xe`cYi5rJr-<1IqHd~VH zNaT7|6k}XJ%mCO(M zWT0@TrfYaa^J~@YV(Qnrh3JY)X@mh7`HB=B!?3Lp&lhvfwV`))bR;tmAqOgY6YW)E zd92Snyw)X(S<>|cQI2DfobDdAMi;mG``V2mo0&gSmt@v2KhmZeuFTC*1|bZugnWxQBtW**rfA9GG7 zS11c@XH(Qo)7-`Vi5nB-l>p#$`KicEr{hl)!{KWKaLfd!F~u0?amIM6Ug{mWkCXiA zwFi?@x;w5e7`qeLp5EB58P4xh)1wYlX=vJ1`nBvjZIbSqViXTgdd5uZgb%#@C7{~) zKTL~8vjcVkna?Gg)}k>ra_n@5>pyt&R7eZJyo1OT>>)nW(B}uHDKUs;!RyyFtOYq7 zf^kfn0=l5wXa>sfar`*rH0}(1GoD8vW2H32k||!;S>C40sFjz#MI6lvP`Slw9}Dy? zOtTn7Wb>8cw2fwr9vL&w^cC8r~CPWOOfcd|jF*3?Ijfqjl zI@GiYlL>LhKE{TwSiWH7wtj+|C89vUWT!*G&uUiH-9!z2+u3(DLn%B5@dsW>|!G%ZO>{++!&(G2HAJy zlaI^Rn~5WqBMIFSg6cExMTVV=?|(C(TZpqC*RVY)a+)cP{?siW*`-tEuOC6%6uAY? zP=H4nXB^~UA?fw2A?j7Sj#NHvteeJibN$}<_o-%to_t|2s==|&eQJeLHbrqdugt{Y z=Z@4FrE<^O7Xy24QIn5KXf1M^N?8274D_L}BVy8wGh?wdA)>bDJwWF*a&`$35L6Nd zUz7S!or$p*ClR(s2O_HE?hgZ_27K~A4r-GItVz4Ojy*e2wJQ1mV9WC39Pl{n#%Li% zVshdl73 z`PHpSk{*o5chXbE~tv2pev>d9$g>P|5I}XAJV9bOzbJX<3Src{xf%31R zIq#YZ9E;A;kTLn1P1wyMP^5go^%*~n5qBy`jo7Imo-x{s*ozDo483qh2&%Zrt=PLP zZTEfs#TOh1{N0D;;0_KwC_yEuCh!5zQ~FTRT*R@=M=Q`{HJ-$EBMx67PXy%Erb>>W zWzG~FvmT#H2Q3MVn87%}_4GAjOmkc&&?IfX{{YUBLsnHh1~|u2{b;b0BuSU2rvve% z)r6!x%ZzO4$m{7$p#-1|u^gP^rxhU8z+DMWIX;Klfy8SzaAPDP=soJl6fq#=b>RIf zS{fYloOyBNV;s|h2{HcwXeT`Wea>mvnJc0}dR2iu0CQGlu`HKQAOv^8$JU^z$c=8~ zA!1em81wB`wM4Wd$Twj0C$G|=sG(YHKLF>cH9L*y#4Qlf-) z+QX>y_N`!HCRR5rTYotA{&k}g^Cv`+h6Z`=XhUz5o;biISdc*NNuW;TGD#F!E=l0= zPh>+W$*J;2InNmWv^|EAl=p8rA~rutgfLkUFms;g8O2jzjMxN`$u-2MK6HhYc2(#H z*A~u9m#aP*b)pDa~100j<=}sF8 zM)kZ3nBT_J{OT@BHbjdG?Nu4|qjO0i%QF$z7{yB*2EF>H?#cOw>q!)cs!w_IoGgB) zoc%p3HtcE2ZCF^v5DZi1eDZpp)eNJ3E!I3Ufq~F^)G?z{+^7YH0QUBz*|Ba0FZV$T z21zxOkw%Q0(y0lU zR~J8MK1^-YoPUv4v@n*WDGESBXLBA2s#=pJV)M*g`B9vAC(r@O{3z*iwUOEQD?u8x z%Q;`%uiejbdYa~`Qs-R=TXX0crH@a6RdI#kK=d8!7)O{YNk>z_e1GGJ^tfbbS4l59(&xkxj;;D7(hK*d51n;j#q?9yAH7b10=L@WBkZIQB%5lfa2YU0S z`Pu3vWOy#KtleufvLP(&aksTZr|k7Kgf4g98}Ph(d}8Kh4RFVfyc}1VTN37XMvp4F z*p-Uib0$tlBi^`F^%2W>qWmV0e8>2p;Af{J`PP(d)i8ue4<(8ZyR(~hU~ zqD4et9Q^dIP~MBsf;v!{O$elnvE=j5YKz^7L)Rz#nzx|X{p8@2_zH2BqH9Ch{0iGN zz~iTzCToWgqtK(gk;7Vz?$OwIJH=rC0HfR%+71CY(}hd3%&AX9>R*SxF>7hk)@e9n zk)G94f|@y#=yS?NxWQ)+s-yfy|Q@Ca9Qqp zP?gV#zBPP5I!(l$K>5b$p>Dg7edYYQ72AiYb*YV7cGUUe-%&B(H_OlE?OjSI65Q#n zbp>IzQ{bHKp=BG|ppDw`^qdp5nEPtYsy05=%cf=0+ihTya`+5aLlY+*^Pq z2#^R2wJ7DrZtz#mTOJK42yAh5m;`AogB;4_xj5F)cYOaLIYDl+OZg|Fj zN|CM0YpF#m4g3uLIjXSvbuI~_kPxKq`cRQA-$6uRVS52dnqQ#Zn>t{g=7BLD56kKOM7#Qy8?O+j!4w+Uz8}$ed}1k8MarJR(#Ezk~(*( zXf_&V2*j4-iY!ze$mVmNy!GOh`V}I+LlKjLc*pXoYQ$WA;hckx$G&NDn{GAd`9aSl z@%|K^hIX?U8*m}`$0U22mTE`lFai1Rka|#nYfFHncB(?K_n3||!5GJCO^9G}2?{Zu z5A>yQ5=)i`9)};DG{)VA2MP)9GlTr;Zfcflt%@c&#&}*SF^FzP z!a2{V_Nivk*k_s>cK~}1v|NU)Ipr^s{rlE?kdQQm03c-g)s#YJRXiNvbM>GG8TRE! z&vA-EL%ijFamF*x(yGN=aG6KX>VKsnM{wNIF$>3fY#!p05R9Lj)9XktVmEx9sh&sS zM&nux!Da-U`mF`iCsG$IbCm-a>%~Jw41K2!oGBxxZ+dPd-%%#oFjtYD)U9E+Vmt{B z2;qBHZCFoHk?k1SkU7N(4QM0EakPR7IIUx%4aT5U7+<}Po|KA+jUkNuzcx9+^r;+O z$*^Ss@%Optarx4YprfH~D+!w*#=|``j&nqviLqz<3UH4*CcvX4mKplvH7ZR5Cd}AO#rqrk%=K71H`R z#v{qeB=Odhb_px$Oqz#4ib2mHoPR1v5d@dgmRTV?7NP_}BYPon5pOR8oOKmxTpO_)J;D-HmjwOp zXttu}6=qo-VUbGYHs|%@Bm612lgw0#aD;+D#(ApcB}-Df+yY2m*yfZ_?ldznATd#s zRP_s7h~awvy(pAQM8*7|UNO+;2mJS_VjxK+Ad(0ib?MrvqFjM@INaQ4w`#46+;X#J zw*$A3KMEM)I~d29GDyhBr9H%lZ*sY8e7!z`p}PsO%*BV#+>QlbFp(28CIa$t$LCZj zA?QSiOB~j1YE+hk7EPe8+=4OqP{$pJ4i_q!1E3W7iE*(Baf6NsB;Wx3Kmxy>d8CPC ziy#1_o`P{(OXBTi=Hz^kAy4aByiN8m>ggW);osTA;rEAvmD1z7b^benxS!Utb(=Je zB@@~-%@<73P(!5H+Q6NHM57gqq|Iz>Z*z^LmGt0Kh{agPZnVivmj?ryS1RMyA~-zz ziY`TqCLz%MKN@2Iorh`wLWeoW6ad2ym;s;)k8PZdxuVwsAF~ALJ*X<+*7)G{scPbj zvGU)?--jk>PmOeVvdP8NXuRO`emxIb%KWU-qUTy49=hZx7(C=2--UI?S2!FV$4jN( zeWEdCF$Q@4;p@3iZ>T*hXv*lqq-=A#_L|qTEyal*X&7}KPjJKNc&#aUm`xo7aB3EC z!0i#ZlObCN2WjtG^4O)Zq*_=cM`&9v#2kK^r70P8IiDK%GA|NX`EX(@=%n*4U|$= zGV1EqyO~uS24U(s#cYub>58i1RCdODnszBNHi&foEdKyX%##l0*Kzy4v;oK5quI(P zj1b6k#axkT*z~^(>uamT5%`r!816vtToq|sW7DHsnH|(n?HN7&D+8gDEPRY}^{6Qm zZQsYYH0&hFR~X0T_*Eu1sHJy&-OUMHL&RaYJ!vuAVUHOCnC?L}xo~mRaX>N=0a1?T zf<-ZH7(F>T_n@RSL4p&YGy^B{hi;Vuu`>L;;;b!Va5jvNqcjM1Iuq7_Jj;L&w>6Qx zNOBwI@9#k}WNtth?s^IuDkKFv9-Lx}gqVuKa!J8F(!S2NaD`BqR;KpIQkiIml%vB+x4q9#8`pIq!-YNf?vd<+d+Qrm85SpneNC z9jI(ZRPW9~$jRcQWJjsbK|m37`g%|gLq^`w)BPd%Q=9|*>!uMnF*Q30C;${4&p!3K zN1Y~N-?GMscLSy<8Ib_qxUGMi`o1QuX#*LyVq!u^!x-!lBzuSp8-AOW+9p z5%_s@_#zYQlc$?^CmDAmJ2E>Coogv*jH^of9;+4hrz%A&z_EYNMPt*BF;g0sG4^HI zS*{S<%m!V4W?I#0sSRtPi>Yc$rCYxIq%i=@Pe%Y`^H#fs`X48FmtB{{_rm^mA_(^^ zF`hsK=XX8vT-B;;W4eVdrfef)A1zB3JOSM20~N;3xTEXug`Nyw4%&Zh>MQ>M6A8!2 z7!0E0`qDaMq3SYCmfQ!|+L|Pc$~Y=da%gBwlg>Hg(u4?NP01&q??V}DaQo+xLjWK@ zBkM?HG9mljiTx?qL@b1yC#@?CaUEBo^`~M|u#2AO)~TRmsV+Ef4`WbKH=CZFYV1mP zBw5eh9V%E@p?ha-dNy6ek}362Pv=ypVq6nAtw-VRfvSzuTL|)aG4aoO(lr_}o*grU z)V>1g_alCla?vpC$}nqa;;d)&G;kW1z};fZ8Eqv=@Ns|#Ijz569x!U7Gn%ANCh<+gmN2}ND z=9J=Xcp)Br7TWt`5h-@#p7j*van_BFl*c0S6oK3t-8+~PMh8gy9&=7iu7bwf4hKQU z;YG}&xnQ^eHV#40)}77J(;#*%2e=g^vBkh)vy683_n{(KtUgkpcE=Q4B0K$9+E32I ztyd{x2>K~GKhmP)6DL4VUX^wW7DEgI3BV_cmaYhJY@8m4ztWY0PQ-560LRC_^QKBx zV^DzEUI-kTNnE02R>{vJj2gQW%sE+*alvelrDoAgd2sxGzLbWT<017mX#*a!NTYFM zoOSi2(I}Dc8vq`M`P7cY=J@tNf0sYuK;$_u7BD2(47tER{c3Fp4B|rGW)zX0Kb00L z_eDlQbJBq||>M;T%k@CQB zGwD>v$}afj7&ymo#;HhFEsiDKB)5I-ACFotO4Ms@C5R*+ zT4{<(py^8CYmZgNRCMNxkp0p{`9lT4BM0=MvfzMp z4&QS)KUxzlqG*h4!_UZ0m>%^KdX6gSB`BOjkf8CNzlB*XSdHIia8B$T{{Tv|QzS_U z9%FJbk}EdC!PvcR3hh5NjNpISyOY65M%4uc=9BAT&b z#sND(U`8|TReply5VUQE83gqHv`RK6_7J{4T!MJ0L$&O}GCb(fZ_|*|5a*OH?e(~h`8kWoDvMc$oIolf&?L?VTh0j3I zd^u?p2U76_n1~#N9Zf`aFX1q?{eMcxhe?OaP%)nMO<0Z2QSLrQagEr*`(~hWje(cu z4tW4oL>{A*2=aZi%_cJBMO=aD%{YUVk*RE|H(-75UNKFgRIZI!f~fh2QB5KlFr0ly zNUR7$m(mh&qxng+7if`t=n7o7J&KDfkPF6Z$PUlhK zKMbX$f7(}r_slwW0RI45^07FJ>~=z$iP&6Sh(U=D9^XpgOxEQYCo+t#N}$Q-whcp( zoMLf)Dph?p{Z+we;K@_h=3&~pC~C(&51PXf!j65b*13{G78u-dwDkJYZo^2>vC*|H zSQDn&$simS#s}e8I;m=H%5`!4F7X7wyF{qFK>?U&rE~pqEN%vU-^0yv%Y$vW4y9NT zR|@f9>70$ttk$iv?kA10f~+fbK4Mz20Xf=7O4L?6?+y5e`#R6;#Bt^mpRIG&ieQo0 zTll64Hx_S{WD|qVYaeBDqbq1`+G_Dmqsm~z9Ma{n4pwF3tjA=b*XvkfX(=F~Rl%QRXgZ4CM#+qaAJ46Ll_6$(bZT8#JY}JO!e66FV;YCl zY)1QY-M0S#5BvymSwdX0J0HHRerx!q$~`LgbZS=G?hYtyGIo@Gc`+{G8q zYzmwdJ^L*=#L+h-b=nTR6fLaG3O94>SxyB)R?(dm^@q;4w%kda@x@@>j*-^7;FZOt z*b6s5Lz-l^Gg?&CU~YeWqbu)@aY`sTu5qSwaR5{IhdA`@OgT*WoH!P<9EAi1>Buw^ z$zs2sPGJuoR(tw%t(Jmp-bu2eRd4cXqApjyRk@^=M<4#r)i~Y*4E?6l@W*WZW+(#T0Kl8wI8cmS?Uq_)>udDfms@@ z4k47l%^o=%XWq3=;Vp>L?cv}budOpUE0d2b! zYaC=RLVX2EqgNFr8%WOM>q)UFgU^wkLjlcIv>SHNX>8@Q$?xe=C7>vcX$bkc6H<*Y zVDlBf)(np4)9F(otwL2K7giV^rl2L{KO5@Ly)9E_>vtaq{`GW1c%z|Xd7 zM?NWw;aL47&bNF#uEe1Kk`@=clj2Z`WZVGNE2fjTjY&}Ro00766 zo}H*FBY|A)IR(8bG)#!V3dP7I{{W3<)y9KiB%lljV~&*8gL;l=Bz^!Thrg$KE)mc} zYU;*7M;(tjrctkJD1kP-XwEWnMtD8Gm7CNe>}rD*%o}8pBW}^E_Qzb*Ct}Hb+gS5F zuF{-iZ%pz1DK~MYV?XUS(YnpX;G`YRo;@*|(9E7c5{MK-Xd_Y2&$ldd+cgOkm6??H zHuDB`T)7*tIO|Efl{8}RxeNumWE0Nr)cJ+TUHe4q)j%T|_B32JD;JtZ^8?^u^zThb zX$<>0T!QSt3=(~*?n=~-C{a081Pl|O%B8!B4-%%*2^^eLNT;bS$JyYDH&)BI%K$nG zTa_tWL9H#hc)X=>xcSR>Iqga&cGP>w9&a)<2#9`F9WXooH0(JtM4ge^bMmlmqO^=b z7ObyU2^L_xiu05H6r~VSxn^BV$&jdkk<~|2??)|$-OBQ6Q(X zfIQ@m-&&+gLy!Ot-+n5jQd$I32gn0}2|4vO0!&i)Kmq3%`iiKJp&4R9$0YDG)BK8L zM{!8w zvvX|L5wY#R1pWh$9(b2khs5Qk@aB;IM)f6p>A?B6k=S&sr&QjR3(59BK)gHfgTbB^ zRZS~Kw^tu^QQVH)h}n?@U)3BkSr9S`!$;gJ?bTLw5oOOmjdLn$|m{k_(U? z2@s>H=s~EGHKjWro?jTg9lwCJmRm$W*_UU|w_(bFda3jv(N0{uky0Am@p&X@99+Zx zu?~Ow_0toQvO49NZsPvXw!*Oc*cdy#K7`imU5;63Z|T>@bPU655Hh*W4OE$p?rCn` z278Kz%du8)j)Vcp;L@=h9zo)*GXDTX)MD|!hIrKMb8> z7jO=7nk1|=bCigpay3> z=m01Q&$*xo++b(DCIbM*0q;zvE(qd+N%6;Q8lGXYa6s%ZdgiD^EWVw^1tZLl9Xj>; z)=ackVsVV(gv3{oisgisEbJl_+IwO*O{b&aZ7f0^F@7{r;ApB$w4?p8d z#aMycX&`s+RA$wPnZej zs@|pz-O4B>PCMqUB5!lgHH}+_W+wm~b6O%%;r=P{7Y;XY2jyEvCp?+*w~jn!l1TAy z`BNCd_NtPxy*S+Yw(8;atB1Y4B-%pXD&U>(*nTFkoQ~RYvp+%q0A~+_=fjW>h#o44 z9a8QvZ6bB%-Xqh4+>BOI9ZB0neSrjFK$Y@A!9R^*GbD+O;fpMJ9Xk8cga^;im4c*Y zU?GX+vD9}p(4%vi%Twjwi5@dLrON0UQ~v;?M5ShBAckUdv}3hrT6WPLcxqhQv&~a7 z0&~f(M(oc*DEF^}z6Ac;x*jCe5UrKFe(6|oBM$!nf&NvM?#{Tz$oiSoE(Se;`c)zu zAQ@%adYTw9rAOWAo-t2xq(oGWrG^ei(;Q?Udk~E08;}{BspZExHAtlHM6>NbI^=WGp^(5zyIe5nG5OGy#}YLP-#U^pRWOlT z?2mKumH`0CsYp%OL1haJ1sDVZeGN8>K-zR)z)FC6W~X9G-(i>TB%d}jliIG~VRl`j zkr7!4;|GqFHz|>CyF~$`%V(XZfmh9PY+8#@mM%8B4B&nTnwI+x#6N6SR?i@wan_oU znz#qujlB*D`cUO^eVI5-ia_M&x1|Y`K2S+f+qj{zrEx-|?vh2w7{xTlBp^UnDHj8| zKb=!EBWU7{uv~^8l~B>^d3+PjTu-etrlU9rK!lO_<-bWbg?e;Yqs*F@kN}udjNm1C7O#E`DwY9Vu)K zm7?lE`2YhX^G^37O2fl(f;xBgqU6bqC6j1=an}@F6S%_c41?0|j%@z~bkja2R ziogrR<3zPR@lM8%eD zA9UG06?61Gt0rq}n!bCuEI#i8G$NWSeW{q0D}V^*sFa9Ijt(>5Jo->eM4=eB$-pO^ z(Qr}f#9%Y?b@UXCH#Bs{iU;#%&m8edlPOrC;=dG0a(sw6L>w(zRwet#4{noOxOOKw z@7k24QjLz$BUq9!!!B@0Z(4!LTpB~T@%5&Oim?l$JgE$)6q1NcejA6m^6qhXq*_<=mA$m>-Yktfi~utPRwmpgJW2f3;;Ox2O_ zzbDGH(ClS2$f4zKLUZ*efIkyjN!Wz0dmqD(4ZKnPy66_Tow9ws0QRm5k~?6mta=}a zHAU0mXw>jCocmU^DY}O~DyJeo75K5^R=Jh!<8V`)^IuDbq@feQa_74~Rco*9E9}UA zSjO|uALlieCZ&$7H7mQE?}>a!>np;fGOwZQUSa5Y9(HxO7I^MRJ5_-yPf!mvokewH zT2EUZ*1EJea3t1JE5y;Bhq&ksc$Fi{?03CUPUh+>RWjZ(?eCL-eX1OL8AaISWby5e z;^e+V9EBe#FZjL6?LBGF}I4t0K zT1MJ|LFCrbsFvh5eLvt&f%di$rlaCqT-=^SH~=r#uOhiB;yJWLw0hmdb~cQ3 z#=^@AfC*91fnI#(+Bzt!l_s*>o@A}Z1E1+!%12X)gLP~$TcF#(99FTI!n{a_V;AD_z;2MA}|9BfEo%5QE2h@*bzPP1&C! z{?R@FA8D5V08NYwEkrftu~ChaFZ$U1x%r2&uG~DxuS)9Y#rC?M%-dZIfsnxS$UW<= zGnZQ$Zu>xZ56jd6+LKoXdZ&YYQ5EbTgi!@m+2ih(3@)A*n zW}S;_=PMqxZ!Os+K3&XzhZGYX42RUVpR}hS@Z&!Hs;p9DCU3Q~O&{H3kTXqaCNe9v zk$%m1KP{NnQUvrev)AeWSpEz_(#jjan_a=*%$ z=Q!k5DG=jv=_zB8)t3kIq}{=h#sjD=obABJt!S2nHc21I+nb>NRWn)&1!yE`q1xe< zzUjy#rDm1RhRplNkTz71d*Yq!LrJl0HOrf67ByxnMggfV+MAC!xcRg7szR9(u6{sp zag5VuP+Y7)-#^NJQQn4z<#tUM%u6-`obgj)vnz0e85zYJ615{~TWW)h9t}j9 zTNR9fB}ZaP0!Gu{ILGBuYL&}o@1A%7a6Kua8nEWOQa<1r$4Y2SYe=q)#1cjh2WnH$ zxT3Le?ZX0j8T3AtT)?1OiVrlD+yT!S_Ni=s%$PvR%FH-Fbmy%Sm4d?p5=ddux$T;K z!4zpcFiOoLA1@#UUcCBL^9{s{3lJ+SDli;_)`>|VO2qdMzBRdzIqRM|?TTp`*pwKeU6Cm*j!8W# zlx!sIMx?kPwhttIDYR5sT&Pq#i6Ht=Cdh<95K5kXX|Y66ARC6$oSwa@4ttBgIYq}m z(w{BFhpE8%dSaZf~?a?;3Ol1Hu&u&LM@Ban}jsROwptD50!h{QKezO)6d1eL)&4F3Q+Xr!zvVRnxE z{)U-iI01r#&Q5DP8Q)R3*updSvsDxlh~3*8dB;!IrLv&yppU`G@0`+$2}BHoXwLzT zGg?@su@lX=uLJ8)^&p4NOmozKT183dJ+62RI+OZRY$LH!Ntkr{^HSt#6jwJ($jBYJ zqW3eJDv7i5fLI?+)e@DBBCb)NQ@6As?j=aq)y^?Ps*)eElR10;0Ek{6vLZjViCB_9 zcBKBbgsU2=46J-`*9)CGEUS(kx_(uRtDP{QW8Cwz`FGi1m2}<|Owd z);08YJMj9WyMCbm0DJQl&wCr#lq+N@>p?O!5dj?fk}0Gn%h9JhM{e|3&9dlFIPdF1 z87K|yo_bYWcO=+5bv#uGl17;MPkKm_+NTEttqhqG`8?$J0AuM&;L`&U7{_`=Bq&8* zox9Z{WFcOJdh<-7fk@yGFgU0H+8EE>VFP&t64q zPI?@bX|&Ay8^fp0uDCYxF4-6G>-7e0wCfaDO?Um$NKe&4y=la%*a~oLc zH2cYCMJx|1gY8-}Zf^zi7dRNkGt!;KDBR|Cy*=+5+{Rf966BTcjHEK3)AFclL}4-qW-4dFg%>Ce`L4Cl2Q2yPVTucjzyNsjP#sB{_IOP338 zJ7hCj^eXw#*p`-n@wG9B;zIJB=t>oPi8_~5F|sC zBOr|OJ$dGat++-?O7VA3XRfQG*3a)rkgKJ_2UDHPmHHYat)X=0swE|}S6?s)BtTRV zp3Vx9$8c~#_B5_2yQ|r+CY)OJi?dIqR8vYy z`m5@ie>CjV@@ng;2$^I8NXRP6IRr2u`VdGzP;o<6(5h2YijuQWT^eiT;@n#EO{dYc zG|H@hcFM>&5=L^YI}m$=*wWXohL=xRwI$KT-ZEVrUsU%`sw#=H0d!_0bk4lv8j+&6pjbRhI2 zKDA9W?DsOKQZ*u_2AXQ=t(to^dpk9$n70b&d~B~7l(VYtMuLV*L>Pa;FrmnZwVmSd;A%Pe; zAoi(Ro60UO&qjvI8aF8-kVga@a7S)3DetgOGN$b%X17{s`)PIeHj8N+OD~dyGwv!j z@(w*I)Axz5`>X1movyZio<__v+uOi`)wiPn!H0bE4R^+yhK%qYDma9v7j)8T_fJ&J zTbr;l(kTtyTc~eCRTgC^wYq8bPj%${(a39>ihyHIGDNLIg&@%r37SoLP>sLlsihb41v6xjttm&uBqbD2p z##WSHlS!?bx%G#@FM}h*n#1^mT!^0y>2kDos=xzrDx4N72>^a4uTxl4sqJE=-6#EQ zX^+GGRdR9tJq~4FP=SDD_j2|>pX-d}SSJBz( zuC=#A?fpK^Eh5q#Dj2+kfp+<1gSETzI5<9)dUVxy4|yw1a?7l4pDXJdtEXqB)3fMG zB;EshrqlIJr_qp?B>-WvRsfzDZ6mfAD}HJZs1!Z){=Vkd z+~26Fw$gG|cGYUE`&w~?zwjtVUE>#_A;S)EeLb;FY*}7MIRSkIBq4z9$;UKU2lM?NrO+#?tx9R4)Z87TROZZnzy zX8v$^9cTdzxLu1j0-1Vvui=1E{w3sbOTIgG{yPgQg zk7u^{ zovm4@j`UkzM}fq#OY#xU2p!Mm z#S2nVDmV%@pPMx7U5N~t#&`hpQq_SXJmh3@2l6z~q#$q@oc7>Su!%pqWXA@oAT;yT z;BM>hib7zdkQ933C-tDGuqgSl+dR<3g&1HRyPRN9kP^r?eCN}jr486@h2+mgAOe3* z^wBM9GXx!^lkN4SRffpMHQqAE0Ahks3Bfsh<2d|jq%wanH_W{-D6rcViC_~r^{Ln_ zGjAje=REy;ewA%pO^dadugrUN^r+<;C1SwjoUeR!;8SH0#VPKj40ZIWVnp9++&5=y zclYf`ZCF_bp_uF+BAPEw$e{Iptzas zX!6P*&27B?G!%$`c z2zI*?$$`ii?N-s9tSH8JNT+XJDlA%MkzpL!Xl4iyZaatGp)e_!Hsfn=1Ru_ehb_h% zXCaGY0AzkN?j;))E+dh1fOh)&QE@#4Rb~0dRyZEDVF5#DZU7iO=ifCv#)QS+W$^b=9*%)i4#1r`+(yE-0@Yp zZ$m*Nis4V5cJ3{Y!;Wet5;=vqlHJHy_M(ge2lJ^)#)+BJfUZ1)mBxOxaUw{IgvlMM zt#di(HatKX)Zv`&eD}{vZX@Tq6ghBka(MhHrC}sVxkF&{lY>t72ChrEF~=m4fGJ#? zXgOtJ&}W|G(v|L0RztF8Ip{~^YQ#yi%=y%R5Av+ZYT`0{oAHs~o@tsWk=$CBUotWV z+-KMD{Hm{EINX!TjaVx;%6gnqy~|MvEwE14`EkJSnpY*D17dC`<@M`|dkMzkU?=Yv zKU{S~9t#kE&q`LfDGy>F3VCnqO2EWb z!|!5FF_j0UT1I!X6CrZM^PF?uhFg_|l1wQ@Bp#mBnLiPZ)=MnAv!7A_0N190D;F)w zM6DX2!S?8CSxwk|#QtpIGmxqY0QWu5;43yX3Qs|g#9&su~z zQNwPRQMn5U-cC=j9QCd$l2JONPUj_g35A_lFaY{{^HCY|6yam6@V=^GhHG-;18XjS zP%DoSPg|W7W)K!NVTIySBHfJwW|Mak|{j$kJ<-A4GgK(c^g}*%$^AqAot@Dmkob)VAgu>TY<$;>L;K zi}ulVh~;ari0o5t2w{*p?^x4Z`wq>XYk%=`Lci1(QPQmCmh4Ebt_tKJO{GqKd)BWG z>}^h5g!6oA)1xjmJv!whjPbW=3!hrWV5H5RTa|y|W$4ugRE5#^AHyFKwVdcn;BZIv6tN51Ee5DbGt_-S>t2;7ba6Gx&TiKJSREUx4hMcQR^5quodh>~8E$P)E64+k zXa4}NQ1vQ09=+l37B01K_8me00D3Y$VO-LQymdV9#I~|&_YEW*XOMkXiv^K|XMG!< zqyzHc{$L7%{Z0)u>_gP*?e4|gV{rwSpTen1zfNc=-IZD$r{)+vk7{=yTsZrVayt8Fi;0%i@r6AHe)XheLyg$sAQ|1< zAO5ux)O6OQ;rE{}B$VLf=bvBjtfMPvX(eK_D!AJxPUf_+1#h#a><+{X4|*CJFDBFj zfrFprO2y7Y_p1ZI8UFwxhoLEs*Z|*=$@R`LQ*gD&3vDOqRFMtpIKLEH#g^@+WM)Ek ztDyvsr~d$2pb{LL2>{?{k6J8REQDuuNJipEPf8Ysb`jBo6>bK5eJazi!DAyOm}Kxj zI*xKgl@OA5WRZ%bu54BEgqUs$fx!2wi#g?~Jdu=K77NcndiqsH))lN$lYC%|;qjag zdWOv{Vnihm$~Y&Q1ktr7gL4FHcQyhayU!%!)6$@(v@$oc5RaUX=~lHHS`f6GKw>fP zReprcT@ji0kDs79sA|MXG3@&kKT-z=)6%5fI}DaaljeR)ejiF`CAiZj&ir5>rCN3} zCyM2ha8f>CK?bv#q!^gmp;QA_hb3|omG8mz?^AG5u;e-2o^#LZS0`adaT!i`1C6-O zd(!3(Td_{o7*ozZZ>>e_Cag0hzV1f=k4(`fIFAVKaHA}G4xG~FG%PBTp`2r={AqIu zq9s+6g5J3_?q{(hMxbsTNybGa%V=^Y<_Lp4;PdD@(!Go28mDpsv7F%U_RTBUluD2m z$!?tBeiZL=)|wLifW`ro;Bn4INED~%vqs3mQ|gN}gF&0?)! z7ZJt=7k)F+l9^679`_OuyAToCN#tkJl$o7~QLZKVE7*QCu2c~v#M2S6KvUe0 zdM*-0bb@QS3bEe%d-dXz)V8!3Y$j-0XAD#m#(EJ+662vjTbM{_#yxZIMXoejme1w$ zA|nc;IQ2a$qJhYUSz=dF5iP)C4|CrYt*mDeWw?qbV5Hz5lzLPkV+GE|`3JA_pi5y) zts>*6ektc2| zvz7y&dStXV62yMY`rka}{poy>@y;GBb;RV@wUsM9V+$2c88`qSne zhaY!E&Q53voqUI5ysRTK^~y@2DMe2 zM0*7T&u=g1zy0Oh?;*!VVtJxYlm@{59c_*B4hzB2|wqlH7Ks1>C+)$Lk-%&ka9>yfviwVpiWJm7Gw! zAMXLr>sq@U+lwrI69qK9bT-;7fmWw@|0oP7lek;`)0dZ@{#ax7cg z%y{WS6D+J`QVW+7-+jr&!Txm{GglsEbMxL~EIXoLH*NWbIv%|%Yv^)H z7nP2$O`St7mphLxOf)iQl_Y)B>`io1nv$`OE`y|OEQZcsCRM@jTiV(jZCL1GoJ_kj zg!cBL!c2ncnj(uK9$7ftdV`Mjoy{VSGsQkH(tI&%b9Jv<3ES>lDFBz0u0Z-=@@ac+ zQMmJHYkEg32s3fzW22NT=M>% z=mFtJZ%P0{qZvJD0fc}^29p9N$KC6SU_rDyVX_ZX`OsC%Ne)Ixppw$U5FOkD%>w4R z;hUD-RyfyUpa>Tmc7fX+vFTX1cYV%^bk#VhrOJ}BR^_$2a_MVrYiY3*vK1{Gby7!u z-&!NCrnMo+++Rm;>h^znBaH0CY`$3o8&4Sa{3*%b%$TPI%Whj~Zr)mU*peHRnlUmR z$l+Nr+#W%qP~~=J6l%t#RN(HKO+M-BpWHaATd&#TDiS}HN`2f820gtf=5p2b?ri8P zKf8^s9TzXdWuoQs?c`EP)=(uwx;Fuk;EaRQgMvR1nre3@xt{M=s+Ru%-iwr9tYp*OHnlRPxC#5H@v(Rq>4E9egzu>N z6g|~zEfu!;ZKueB+DOtgSX3$n8&qQe0l*mJ@~11`Qz{B73y~zOtd*>lv`X4pF4}e~ zGySPVpo|p`Fja>>>PSCONc1#GS=;*jb^FSpQB;bO>XY3|fA2-gFV-?~d#2W;NS;(- zLY2rLDN>|ku?GZw4@zIxf5dP}C1lo{G~(Bji%G?<%_g>Jp%k&)M;!M2Lg=iVW91_w zkELBmxXGuwW>`wltxhwi@X9I2r@GbFoirX<-{z1ok+~uGV0(k_>r%Aa@Yv|*bJj_w z^=e-deR;h5`H{sal@>_(N5cR?91)&}nyEp>*_czTs>Mz_G@8+^9=kg===C-%?jnvQ zyIBiKGVk1T_gH5<^UZWdmm}qUG(5@U)+s8GcT!48>#CNi>#n|fnRgeMLeKKH21av( z>6+QInip|SO3vD??c{RWo}=ZBgn-0-(Nf7*w!5Bj;w@z@5>F|^E?aAH$n1C|bL>yn zwxruyil;9#8j}Ta$5OGuFdXz*W=B9`zh`rmBwO`lO*8$rx@ygoozyV(NgY{ zIx)Ckt5uyZ<&%$Zg|)Tc=KWdmw~lq$E;SjnsALjJ=NPvD*x|9991-~QS-RZNQtqyG zRKWdStm!v?SvcO!UzN3cG@8F=lkShBaC)5EfG|$ZEg*J1i+prcAd zm?93iCt=%`894f6x^`%+(}q#9x|K(O);Sraxw-+f1M406S(AzjN*%c72|0+^r0{lX+Fe` zDGZfYx#u(wlus)oBaXdjxFvE$QJe||BxGw^OW#_|k;&z-QsIyA;Abb=w1T|y{>$tIz`Q(GTOcvHiN!}gI`!~uPz&Uzi>0zRXk(z%Y6?DtTO&wi_@MIR6}rk9zo(ARvjMBZBBLyu%TcN@jfu1eMzo}LhQy;iMCTA!joww~E(jT+QiXvl{=pQ0PyjAIq_!ROTP%n@Logyw$@Hu4^;=KtmTO18lrTU{{Rjz>~{#$ z%>Mv*V}n$yCO3v_R&jcVhNiS1ytjP!DhaJ4JDjy3(a+7Ln0{v`k@q&>iqXi3K#18$ z6u1PDp1reG7HHxo)?5SBp1ze$l2&89ko;$oGwDe(2cMhf1aY1zrdcYx0szN2{HfSY zh^~4A$3a76?mr|99B0?kl3>t^`1xBI#Ww6a*p<|Ala=fBsX|(fl$8Z~HgSR8tueAP zha1Ol(~1~2T04N_k%L);M(^(agb`NCmyk5U@>_stQ6ZJyKr^!k9e$MC0$8@N#~gYN zI@I3dLNEs#dE^?=F<4}gq2vtl$of6b~2p~-AJhRgj0vOh)a2R2_9CY>mv;kM_KxBs}p7l-K1~t5~@wgsG zUZ7%x#+AjAY1CntJoTzl2N4qaxEC>ybBvDpsdEln6E*a1O0wXd02JdONR~$^0C9uv zD*2G?O|@_UZV$aBB*D{THi5z(xa(DODI!#jO7p=OAN_ik>}eDu#-DV7w1bcH^r?%u znGA8RGsw;`D@H5aSAa(4cVnJ@w6_`>AOLJqJB-pui0(l=Y%{P1T!HUa5*qP341jPt z`cmd9*F-=wf;w^iY4Zq8nZ|kybNv4RS_Lf@fsM(5{6DU0$xi5q_4&S^fTY;BBx0;W zsLnV!s<}L)utCG)ENEp0-10i-6kK~6+FjMPmB-p|P|FY)!u2PCQcFgrsjkCxrEQ=Q zsZop$gZ}`pO2SCM%x(&~IUJ8ded@O=O2gM{f2wRM3}S>#UB^X|gdo8jXTK-t&$Op%-uTUgHb8!Ry{b0$c}Ks1U> zsVsyq+4p1@&Kt2G2O}hm^XpD1Y_8L7=s7>2qnypF z5F4ChY0DARcB19PaFZ%ohFcix$oHd|cCdz0*ld6f2R^=(o4A^|;knPv&T4OPiqvyp zWim02Xt`-!kB(F>126*_=cNoK6CTcGcAn`6`q@|m>KBSdHKC-l0N*byo;@k-OIjA9 zW+SFC>F-oaS{H4t0Z3(77uY(%|Q0AZ@6Y+lO6;hVC-@y7*ZYgL(67Rq#BzH9AO5D?2B8>Gotd5k0o>3APld0*B)ksoy zIZMgf;l@~FupgB(6{%Ou5u6jA)oEO&%jRGg3OZvnG(^!Yy0r2P^h2C}xF(de2*&5p zeg@FRg^0hK@4gAot9n-jSzVp+hb&8a?e~;~l73Orx5HDrIB_%OJ|pNi#$UXqRpr2kt*9OWSo4&kAF(ujCoO<<;>1bB1(l( zh3ojzo4YlPbkK>VQr=fA0QJ>!+#->hvH7^%cwV?Xnk0thW9?6Yo&xaJx2N4% z-|8zAl1&05J8&9S3&`)bxG@dKV|+SNPUjT<61VX#p{r^B6=`2k(PWg8;Q4dK8OO*! zha)^1hbLuoC{nfTL8f@F{{TUGlM{2_rL9LFAEkoTewB+(x?b~z*7zE@T^!yEQQ>fzo4XS&`mufyAu}KW~_J|nn zK4J`G`?#-Ojec!TSyMcJUPNg2TQ=s6$Ybh#1$%gTo^@qpTkwUX&a#0M}7@$2hiZJ4yWiZ!tW6I&@2qVv}b|Ryqv<7^*b;#=zS{{ z-sOi;w>?NF9jnRavF*cM4}-sHe*z_q&CTYVn__o2kYk`(Kh_VXeqs36ejax@E60_e z7a0Ps;n4b5UgksX?j9E786AF}l#54CX?W4%Yh#I2{#6e{OPz+LsHV4Qx#oD+4h>|+ zd9j?uAssTnAE@v2sWe8SUKJtEHj&8hobgo`a%5`#ph*_P!w$!|ts+Ira=(^ICn=CU z`KxS}L31mre+d~GA5(!!O7C!U)}Khmb- zxe=M8Y(LBgZq;cS?nmO3T=!iVl1Rr7v zGzmo!t-w-FPXypl*pe(--IbPCm9W1iIN$=fKdok^W@_Vd&zia0)O-CaUTc`xX>9zN z$2|Qi(;x^_fTw~#{Z$t!q9Uw02d@H#$yyI$;j`?#o<4)MYXBGt1n1KO29jj*k@-yRx@-^+%Ze^(VoA!)D3J~r zD8cunRCgs)v}60ded|IcxnycrD}gH)3&2+G#}$)8OsO=R^7$DDk}8w1(8&rk1bQ9DnZ=eBCD4G?*XTgm|EI632`7ZXIKc>e%s z@K3!;cP$~GF~C*i@k4eQVPnFnepfmC>2q8hY%F103P}WzI3B$za}bdy$+fuT9CJnN zRJ0*bWchHQk(}nKtAZyBxdN^i2dzUIM6tp@iM!^LWhjz>n>M=u0qL5DA<8x@wZ*Ih zM6(=s z7a++r!8@p5T9qJT`4R2?`^e<>Cpa{@nPgvOfs4FpxCQ<$ev}F*1j?t&jxY)B+JKg# zG=(2#a5%~BK+!tR7?yTBfH)($G}0L_+oV=tRBi3=NQj!VY9j1qqf~K%ao&J4{KA=$ z7^4CF>7{bnTxt&pX!@fOk@W9Rl!Yr1$#7)j8P6lqgoKI`76&|q$7<2Uq{am2C-bRn zQCf~Fqvc{w21OysYDjj1IiNx_DN1^AR*4>?dnG~ z6Cs<5at}QI6d|n$p5q;Rb3mIJyr{^>r{h|JWTs94$IM4u`qbX#NN|xj;O^r;){{i0 zM(wnczjbgvv|JhhpnSleYA!8>C4mTWjP)Pq)}(7v2bqQx9A`MIPeIt7B?K0e9A={6 zhlz2@b6Q-Ku1u2_z+;b0R4q*!CCMQ3j+h3O!HhEi#9$16g$h8CS?3tqN79s~a&2M* zHr$iWdwWt$)gmXCJOPk8QoX^hVmF^aW|`y9 z&mi~Wuy~}7ns`Yw*7RT4=JISw;yqkN&Pu`j@OkUede=;jINg(sZk6ir{3XPv&bGRg||jjTo(twLVXhAR`B$ zKmh$KEB7>vP=qs`t&%|XrE#APe$;xDTBfCA{f{EaE}0V}G9Fc#i6ODuirSPK)aAri zTO;AWini8XJ+gvGkz>C^C(Osp2t29$bNSVLER`iRe0iu?TxnM?VSgEpXwDf=^!7E- znS)j{2-`>M95v2n>h)fPg%)H>AUuqFj zRyj5CeeRPxL#14Qqe!FW;IGhD@GzP`UO!>a5cm^Tp7TMmfgi;-u}3<~AjvB0^91(? zucdX#S~?igc9og>JjWz~{&=r3v$@22fshAL){rd;*QRsMI#4Mhc;n6ndQgn+Xrgck zJt?gOU4=Jw9cjo-mfZr5yyB7&^(Qzz1ycfaBp!NDm=g?xo`h8aF#hPE1tbnn-l?z+ zVb`u{H((gtWlvL0Fe7B@MLPi9yb#qOFrdfH&rDN7u;FiynL6X8Cc&Z1G79uHC6O`} z>)cf)Lm}V>R>4*UTRp)PHFBXVG=6vdefV83gtedeNHk^6m45l){{X9zzVe@J^r>1J zwRv3m`snOq1b7kw^JB3bic~J7c4Oljl-0kj&i6*tBJmBnM={0ZBWn}JK(A3V<>ai% zk)^P0vMEr!mp)RR>UMppe z2vp%&zG8jpATsq!Ngg$hIdL-eY;b#Ypc6RQ*85DDU5OS+VqnO?W2dbTQlj}?&!hY; z;uw5IW-g<^ole;h@IwLV>0W(We7hd48ocP}Oj#c<6^eH{FJXo~ywedPE>EQZP82EU zsGtY*=71LoaRPcJz?Px2^E#9GJC zGm=JolUXCTpvQge%_q#nWS-O|V3eGnGu5yJ3@QKs7yxvp-N}qpRhEcRFC|Z|X%s`b zR0yLOP`Ch7y~u=8R$CS1l#WI-{uG-msE(1RmVhb%0KmWibO2Lry;+c~vHNCSW|@~t-R zL}H?>wnUzDI~gQ741QvJ(n`h7PEEJF89e4fNj&u=_n|8Uq~z}PWnA&kQPzS*Si~w7 zM$}LM0AK(*04kep-H{4$rxh5alF=oiNo&63P}Fvm(p+oOiK z*Ir1Bldc>9disj4MrCuv{9WQ411mlPlg4`b*6@vqJ}~%+<4-l4Y0h#KXZ5R;?2YNu z<~Xkh=vTVM^cGrt2IE)M7)J_#NQg1z&(n(KsZ&F;3fmv4{v7x}rg(2e(==UBwb`}Z z=g9o;-^;1bJ8~-ox|r0LGc`OZ@ZZCp8o#>n28(axOL>5DGw;VeD@zzocSokYiVoIn zj-=B@PFfs4jXZ6qcs9mMyP1?o0opP-J%wnarO8_8kAZdH5nlM`PMF1Q8V@%NXm= za(|U_?srB!sQ0-Xx5|3;#Zu6c79)Bkxo>B$s(wbV#-KykvvL{>!y&+FL(6dNWsaRgPIm#?$n~n+rGRj+v@ta~`|lJwNQuszyQVeR0;Xl#OE( z*zcuH2EgCmut-8~Zh1R-{{R}w_hyY*A0zmWSUTnV>Pmi0?Teqf2RW{&oXuZTDk-)M zK5>$BS~f!5?0hTZ9Z$j9lpZ4R)b9n%P9NnwFbAO>!K`Hqmferm--DkS^v{dBV09@L zw-RFF*nyLSjqB8rDA18JK6PUE=OwCID;CPX0|w){2Qo5et1TC z9A~v^s-|+fO&t8XWRdO?#L@G~KGmX?#mZItIlw4-9Fg^^M7W5sFl-!Pb4js4Y>B~C z$Q?3j?r9`K&4H1~2b}uU8MG-qBz*haM@T@)eotBfjM}mvED!;~C(u)nfr6^w zHwQfT=}>?N_q`7oHAHffZpTiekFF^+RmTE&1ad(%A>2hiXU~i-IHhY171)vh^!)0s zAxinbcem?OfNChfLI>RgA4+Wv>OHt50yr4vm4sKo<;FU7{{RX@kkyMA+Qbh`&?Gik zq*3N>$?HJmAHBx!%7lc3GD^xpL!9K1)YG|0jjkC+N|2;-5BOC!GQ5(3n7aZ=G?KWa z?l;T;l7Mv|P$-HO$(m-A10lkinF3=sZe6Gd>(G5@NYj{!R|*0-0F3_tPAQ~9Eka#T zjoDxhGxg$;b{{R&@L(9jV>ut;M>UBXHRwcCWMjJo`%~s6p^0|04aYbKpHqsY!5}wK zqlk$C{`Lo_N=`(^Hf*rv<;K<-;0kJGC2~^kv3V)NsVDL8LVAN%E67M2lnmtXdE&Jp z#6_J*`PV$){uK?0JBrf9uq=v0FwRFzRYy{qusX%k6M}tcY?ka+7OY1uH+9EDNywF` z<7F!2jDyHI>6+C$q0EL>ag(>E27ZE->8jr&&63bz7)YQvW3?c2!<)c5AJ6l6VbGoM;Qktn)gLaPwC9eeuHud(!`#;{U}3{HKVs&gXlX}i4fh3@j^4`hk=@WrY=`BR2&f>2B%_dUXDV?BA(-A z=t(1m&;I~krH(GfoKPOK9uFi^WyP9;KowO09kc1{P*N=xSulj2KU#)dbuL?zAPhJd z=B2xoqhmrj5l&mKdHQ-(uqpke=6{glF5vg(rJKdrwt7t0%u zrcXimbgw-=W^Gm39x3C^Tw6lmk&+MVUd9dwg^a7Mk@@lQD^@ez%7}O!{*~@0WO2qW z_dajc?=Zv@fs@T)DQI`W8TwVY)Na)e`mE&pbI)4xu~TUtg&6ZQSH=3=K|iuA4qKxY zJY&=ATo8q|XH1>6I4ey$=HZgo+6fv-4$uOe=QUHTqOMFS^E24={{V#7T4WL>TQHg;V|GoFBrquP3oFibv7E1@)P) zFEyLH#>x#mW6=KfP6yyC&aDd(Dw=3y_?fRYSfzr}O@+xa&7N>iLG>9GnnhCAQ`q!R zh&~kX;fb$HTf|f<=hPZXNR)l_Uf!(YF9|n(V^ioM(R_x{6V^nfX0+t}drMmv>AS zTZsg+U|?hp03Ma>EfAD!F1x5EuQ=4f0}2#@$N@mbR33y{+8zG@hgZWo_L=r=Yi*_M zLtvG7-GS8mSkGADLW?a4g$#*(oQ%f__FQtZ0y|nYU9gb=sxn0n?`LsL}#=2Vge$L`3P#6T8)qv*@&pzPs zUfvR=&T8>EeIw6Xm}EI%!-MR3=Dny$^XCKTFACf;Me>ZD?X+jVTHZ6WIO@jd+aC<| zce9?{lk!g*xWUgo>TwkL(>Wni+0Xj!eXXHh8;A@*<${I+zHX#>U5})rFLviM@rT1H z;!h33sK5uEZJ4AUu|9uQJpMJM30ap>^CR)*S$@x`-)MIO%ek_Zk&(DNdmLA%7MaBu z>PnJw0nSM4Q)>rO)xGDCcLT`JAEj2|7H>g*;0Yr*Cx`fKGlqonW4o+z#JbkiN&HGHR4ExZV35&tRy_Ry%~B#t z<3#08%aT3)MODb>jHMhDHFLxYfNlAv`_n`+6FDIHgl+!-16E5b$f8v^IL}kk~5#{ zRS;1iHvp+-;GBLLrY9kR!?s5!k@(PM4OoIgatC3b#+{9M#u6|~ap_9M5s(XQTw|x> zN=Q*GENH=soD;zvxUAxDEr&kYSP43gGg_o#+KA%`kckgo=96|O;v$q_@Hp*?70P;y zXWVfXM_>V1RMK=N$et3QFT$okEu29^FqIcA>CJ!$iu%E1Y#1>rFAW zam$X2&PVw)n*^*##K_+-0kNN27(|(emdAf#iV7W-b>W&(@K97CiPULkxrI zPUPC-noNQRB!P_mD7i9L6=OI%Mq7`{i-{|Vp1X+j=eebGMH>&35#W!#oYHczG$4>R z0`)xe>57Dfaq<0meN?LsKaNRx8hR(cusY44%Edv?&Rzi1IXJD8TN{SJT?1 z&ckugjcz27a2O2nlm2^B=DDi(P}qc%F*7*>JP}Ue4avUA5`4vpB=shwm#Zh+6Azhw zfAi1dO)Hep@QTbLQ`3{4+)&kt7$ph`Cm6u`)bf;tcR;)myeL0FX^kt83x-@Ve3*V(X7RE0llg~~lLL}T(w`VvU3QYob5K0{3&H(wSXqGjYHsB6G z$r$|Utpvq4K3F&;fI4D^%SdxekCfw_59^wn39Ad{Dg0`bu0mG~`Mj~mIOn|y*tUkN z4Wq6>?LuN&3MVV`_dlH?mZMvM4%o9<-YshDcSo^x~3bD2|2K2m86} zk7}T5!`5&PRE!QW@7j}NNKtY@AaQ|!Pc;`4h%>hy+2)ImF>Dv+8<_L!OPILA#1}WQ z#h*36=Zx?vISt0;7%rr}Kk+VxONTihyItMsIimfOJFOexSB^YJL+LtGgmK55LVhPT zgTzH06mZR>*>oS-E5*8w*4M8s?Q!>z5afPBu%0s89TC7jr?KdNvJZzX2$x*FxVm-Z zqB&J3@~(Me+d5%`NcK$w;ID$bI27snN*R=W_dAVcI<1?k32b^qHg@((63X5b5vGZTX zAB_p&_}|0c9dOt3FV8UKDDR5v!{Pa!yB=;Y8O!d({O;B~PbG}^5~PM_xH)p%g5LG( zdlZ$AAyw4k@7-fze544kB54;LrBHG|5zpsdWms9;%=K{dy1CVOyWwPhGw_v`vl{Hz zZEaDv5BX?-aINdcKU!56CZ)oD(D-id32dcnTa?)<956njgzigLJAV$h+1+F79LgCo zd-Wsmr8FBJk#0B*&}9B*vy&<;lJ3PXV0&4xRl#4Uy(DVY&j{5txiq_$w3HFFt$6$L^ z*q5o3a~n2DszSNU-rF(h)0&$USMdI`CxX*N^F*>7=dDT9_7FQ@ zDeuUjIuXk*K4D2RQ3;%52kS+OD>cFAXZg)E1!?CQo8=bEW#2xDyk6ZrjUB3m}}+bHDC&DZ>U$IBmF zb``ZMe9Y#>R^*M(Kk+Ast}m|^&cRwZw;Tce&hfE3<<}#dh@-lzb5$_N^IBGSS10 z-}2Fb$RB~lVL4x8(4$Vr+^PmP4h{w?OPeCw!6f?=_|QW_ssqXIK!tenFu3nYFc=d6 zHh3KIMaxJ{pyr*!ls0W_fx*Q)mMSmtD9>h0kHykz0xwsKDZdsUS`V z^89JG41AmndU1*@Bu69ul}QrJy+cus#uuJmfN(wQN^!Z3Y4Rh*uibSSUgGIiLi~Kg zAP-8}D>KWKxt-bO-XQoz;Lj8(8n%@Xeo1(KR->s=osX41C;ra97VyMzYML$O#AaDQ z7Or<^*9RRalhEj;H#cFrUY{MLakK!0MFKTFxX0^?v(9&))>^VGsRMIn(JiEtU zG>1&Gn!`_WZ=9HhM@;o2=sVX%G+{P)Mw@KxZ~(|SCc2_?p1dbtn zt!a8QLnKTGB(HybR~1>I4lbs3Hr$@{8D-p8#vGB=eg zD<1>=aQFeK{3N|=n?-w{4a~&Da5?hwcvk%@zULgN*zimZrOrPJmdu=PG)uFm2O_A? zbFA>kigh0fU%{^E6B~QT4nryH-v`uIbA`*NK21^j$?#v}ex31N%v;}33`cpa!ry~xkLcJ~yn78DY>Zu#RqYLJ>MG!aeyx;1PZjE_-O z%w*}@!MgC4nSGHYcw?NNF`A`OqCTvSa{J-cg~-|wPBVaU{VPvu%&K8g=h}zDX5`v~ zx7du;tV>28Rkp_yt9&`Wv;|dJkyk8Oes!|MT*`DBIN7{Cb#4kgE>{`I=~_mjWF!*nm zfOy3u$RzndU`En7U#(E=GFHw{UUTkAszAoCW9inAhdUG>H*=g)28CAg@t?YQ{AdKm zxn|@XcFhfq?mWs!>zp115oI-Er<%;%50|AonWu59fTX4=*rrU<42*Jd`BYd;ayh_Z z$m{P~2^Qj2kYwisoB{9Fply>#$~aMuIi+D*Gl2W}`p*&4E_1Pq)U3L;SHAx1o>%m-1{ixVP?*$K9gT?oJ>Tbe8p zWWv%#8ID#t_3QZ4Do*3d$+NCljAz<{8Yqj~m_aRUA0!Ne*Xv5-uOW{^ z-xV#~X$^Td;ahx2S_32a3a*{4V7unWFknCn{yH8*9#T>)Ei(|?J+KB@a$2jSbDw`!D z18^9Gg$p)F_TbY@ixR|Kv044P9{&LSYKs~n>?UQ}?Ar!N1CF(JGoIw|z+y=w3JH(^ z#L;594NGN<_&{TxX|!gwEa2_=xgC$EG^{>;gU1}6TcAJAtCWW9#hK*TQa`+QfIDE; za@^i4scG;ISGN^u64@Y>E(-d0r?8qXte7LvbjP(O%q(8EjI#OJ$Q34!LgX>z;QXX> zk6N^5X{4nA2q=?7j-~ZuBIKL^I#y=3Eg)Ld1{o_K zJ6YaGz`iuUGF;BAe~rHkab2?5)|5{Z)TY59j%$)m$6Yw;Q?S;a!Dd*<^BfE}ao0bc zan(tkv|X8R!rE=#rL5RLmhwdRE4}fNv0LUQyz28&i#k+pKJuFXqY>KkRcZ0BX z?fBP}-#RKD>pWk?zB|3tZRWO}*qmf^=bmdy7<)?QvYpN^z?<%Db*Ph&!V)vs?myvM zR`{2pndrX=HOV1ub5EUyQW)Y!{_tkV{#Ax1J26{Bf5bYlwX~JvA29&&>H)0b4rXYY zj8B}dz9nkp8()wNk(_czVP1@BrJ*X7*5y_Bg|4wF49vYc43X$6ToG}@-(y~Fdsfx- zrqkq0tBaR>z7@#Zf(AIpd>WNiMAzyQzKG%9Ot`ZKJE$c_BX%A(&(!hKsx?%$G@cf5 z)uINRC7`xdA3UC8eE`4}yit>h0$&(7Di1j{HDfgbW2zEM06{!;;}tp~dlrq2E@@!7 zx7IEG{89-N`VrIeHB!|O-LyRd!gto>n%?d6_L$^CPfkWb{{X(Lo;3Mco$h$Mf~2V( zI5oT2=||B&47@dUW3Jp?;5D=sZ5uf0l2f0@n)9p8Tjonz9<$o(Z( zq-QzD&XQoxdWB&jhp`uecYipaGCB!p)syM;tflWIx^4!vY z7)51wZDS~6w(0+C6o?*N7lBCjHMfr$8x_@jzIJ^ceyNa zkbejOnl_Hb4^Cm#b z`*T5C5$7j8v(kwoQ`Eg0mvYJXSaA}eBoYJvL*%7!|9J7IpVB@dhNK4)vn=-5qZib_jp_@p_IL-(> zRU{%CX9ZQcVZkD<`U*fzbO>S|Q0NC+H{%2pf`DAoe1G49Lj9>FY_3JBgE=3?3<5Z3qr= z&N4CuHK8$x?=YzVo_hOKle>fHYCCZQN%+ohK_0mBu~%QLt5Bdteqk{uG?j z+}bqT*xS=IU3bJ-8XlE*a5`^Tj??_B8P;9Rqe4veEf4l^_=m2L@>->oZQf&o2h%l_ zu_`FqI5{5Ap?=3jw#(v;VasF_6bht$Go05u#$4%+1$8}#Lj9UN5229lZ1-{l$(W2E z!m^esOxm6iMD_hQ!n!7is~(T0+dv0(iF5hlv2`0dRU~vGM!^Y%Q`ihvZ&H+OHYV5+{`SoX?jm7f& zsQm2l4~r(gx|3vuuTF#IYZm!s&iKjW4e3=kJgfWrQ4kR)6}$!&kt%6Xxg-9 zE652~LOS!o8SF)LQ=c)#TAP8nWf+qg_2=ta#aQKfonDrqz9BBi~H9ya?vmle&dPv*c2ZIq5m!H39;I9Xuts;qR(O;Nz_){k2Yy)%nV0%zeO6CwodJ#bfBY$g> zTODcGv%L6k;TpSa}N=OLL91gU= z`GKSdrAgS`)rzvdLFXOlB&#gBUOj0bC_KGKrZJydU@>I}xa3ff6{VL0l6!+d6%2=H z^ym!$3USt*#3tR@IpEM}mV}C~3i5Dzn(vK1RCsl3Ip}%5sU^0T9NLx9JtE~z z;Hymr)%0H$GQf4alw%~A8xwBO-%Rt(dC_;B+0%%QmOg^`yW(9pz!x`~Mx7|QTUlN| zG#{0KBmyzTcUz(2PpSF2@k8QO?z-~Y>GA}(Ba#WrQ>HjV=g$!$?=lWrL)Nxt@r{eH zM~MO`?~koZdKxr+dGJT!g#ILs8~sQ!Su2p_kGwO`X1L`mo`pIbs_gr=-p)NfDD3Ri zBr%LCk5A=9PKB{#sojH|=dDOZUvc|M8+#58D80tUz5oF^I6QqQZozAhEO=w|`c$?q zQKfN^M--6981f2^x#q3A1;>OS0Y&a0zykyB(sB!qWma5c(ujg&W)Xqv4@w+|altXe zeiV~r*m)as?b@hzxbUmDr9iD<3xG-NGg??tBP;;wYc^QPNE|PfQFu8 zSyw-G6nxBo&wAD|xty8vKC3_WrlUR9?d#?+Po{fUO3=kVV}D4p8^aGkYMiW0_dWN* zT1v8jN6I~`nsP2E`h(&3fd;jI0?w!G@i3A8Uc=w(T(W%3^yscseVY_&h#^1%BJEsp zj8@i2&Tj0Xt!WlsA+VQ3*I-MFDbTA%;1Qn0X0?p0MAgrSJYV|`S=~Ihz68~cxnfvb z&Y2wc2Q{Q>BL_(NYsH_lcf=0{mj@Xg#h-iJHEbqfbqR>lrH`x=QtCc$@4Y=gv1CA>*M8-?<_3Q0cg>n+akC*c`LmFEr z1n_79?VY0?JK~cShCVTl{B`|mM8-1i=0F<M0q*sn%CO1o#B%>Ywv_mwqDJ^&UnTJTCQh2DmV>W;eMxTcUr4RhpquN z(N3w)Qx9W=mqMNinjO)Zmn!k@0f8Ng*1pi?XrAR)82ob)sxLGq|w$ABwHyNRL3HOO>1!0U>Z#9Rokf-~>> zR9tL!0%VRj;;B1@hMsc2#r)`E6g~z=8KuksCI!0pC-kOLWad2n^CaMZE-G#-h!ijz z#ySH?On8LGp%d@t1oo$EisPhgWe)^#MTRtv-T26%I{_GvJh$D)Ppu7&j4{44NX9e8 z30y8jy?1f+q%`h9Bgu>b*PPW}>}}Y3;l^9_rpQcjU8K64cA^E5G%L(#Kp6i3CX*8) z@^CP`j;4gkVy(BChi(s1N$NC8h|9u{l=VLJBq0^K+71R!@~Uj4G2D__1~bMzs%%B| z81NJGH%eQY$ypHYXjnfyb^2h_Mow1Hjiq6gPI>9;NZP{|a!7oA)6jcWBqU0XvN2^{ zihX-#rIaX0*;(1};Nd{%N38%gt=lZJ$T|kV>CFO6MzzUS>OH732`!L%Ww1FNsU~Wf zLVY*On|geWwC4k@2$sszz-|J7>;NF-b-=1}0=Ljz$pG+A=}4n$8yC87 zHOXfrAFr(m88X4NMI{35$2srKTP3zih|z-4;1Qnqr()9{st?^D5J%K{(8}i|ci;j? zKt8nMWhHT*X7E>>=QUzd93>dW?2(F6Wvu`)VZq1iNi#NCj!ZD=kJp-QgkyG1B(RdK zGle^kxgNEGe8)@C5zBlfKOn-9jz7<>Y-MuNfatj4k0y}IaYDd?$L9C?Q)tRe)sHcZ zFG@{Vi8AC_A)U?+aZcsMT)Pn{dBHdztwSBGUxGh3gTUk(T-Gi+nvuw{sm}+Xtl4oQ zY1&Wqc_jMutl4O{ZxW~_j^ltsdLK%Wn$V$s53MOMj7_K_;BEk%0rjkzs?fR5J8{bW z@2|JDN+?EeECZp7e{Hva$?Pvun- z6v>%{E5RA6*qhy!bVyd}=>Q`^+`d(TBX-a|>pHT~x-q*x&q!m^tP;~`{mf{EecPYs zUQ3rVJsEqd#|^K_V%@m?-U+U}Jass+GPF;UJ|JK3cOkLpK9%oMR2`D=9G4&P4R#rM88=q8sD$rWpZSJMX zOLUWH&vzk@*A?@4s;*M8-OFTjo+`TgCY7k_INTwHoCEbA(zBxO?8$2A`BPrGVzG$V z@5EamdW`e=*QW%G(=vP~sJ*1&<0VR;-J$CLd{I?>e9=d1Wa7;IK{R6l5)!xDNF z1ce`g&2m(C6^%`A_twmZl>me5%@ELsW9Lh45`Ak}O%lm>O*EwtXBoz8wo=gSp$=wr zV&WeST(p{e3SK5C!f&7E2fwd1&gA5DJ3*e4;lJ90#r_qO&eHAl+~a5sYNTV+ttnyo zwYju$syzNu-;rspH46x(c@AsKd_YGt8F^!uA-)9kDuY;S0{Hhoy;r8ACNj??7w z=MJm}!~Hp-v2s|k;Qs)J8kdZ(CcChBW45=MjISa2M$?{0aqC!Dt;(!+(}HOC?}s+i z+DEFS&XUXJ$A@3Keq{uK>DLwKRg*HR?V*S9Wr}!t5EGxaM}zcMuFMj=ujF$yd6tcP zD|mYU060695q`Nj{CKXH1hKn%v)Zb$$rwC# z$4c|D$nU|+Pnq==hjNizCEDeNRQ2rK5nd~HXSupwhvwhy)!@MmzN&4(a}aCjnDtBz z#1CSp^shq?Ee=^)_CGc}E33YfB4FYRj43VH+mq_s2@j>Ree;bTN|I`B>*Zm^rB*DY2%{g;i6Kd(|dR$4Xlm z9-R#)#!rth4=iFq+t)s|N!Wz0M6dRU_b< z&1PuhbFWwthnsEA2d`S{hNcc8yW<0+8rNf<+JInkr>A^=bh(l>v01sn%{$zM9#R)` z86=$G_4e&e6!j3w8~2TXd;8Er(1pUWI}TKF#XA!w+amdufMJo7NwSi$rjjhg0(OSR zarsv)m5!^BO&YL1S#0#@rEg7`HFB(x^t$A3FH*B9G4nXfJYA zQM)7$uYYRA#n`KglPq&LVx%x0y}10Up`e)Yu$&Ng4A7X!fQ^Y#K58b5TZVKhIqV7QKMIsN%b`^u0gDlkImgnOGFC(~+XnsUd=P%-J0E(a z2#O?%*~>ETP%@*Z&F@Kqb}FlkJ_aagYDBE-DlBR_7^+Ac6=al+@i7gKzJh?*jjl@! zKO~$QEGdyYu{qDnk<+y^GIk_nbQsV0QfRb@isY6gj-#igIOr=8sUYJ$y8F=589I%b zIU9gHQn(9~(Kz6d&q|#|aSl()PESMqDA;M-c~V9Odf-vGnB@+?FMfkG?!?J*P5|I! zXZcgPqk0hY$WFOGku?TGnBaBm&|}~HC@e--JdS|p6c@{&gE`9f9Oj%%(zy8}1Q$QT zd8%lu4RqV`mHHZ%A)!GZLEeyZ+;I8+UYO+2K3fcY3}cWF2A4qUHJC9fyc5aKTE2xx zasb;KY3b`y_5~|4Hj|z2#Z~Ny-HtK?jmH$OQ$nyEM<=~F$VxULcjN`@Q_L;KXL9U} z`_pW82^(oR;~(MvG?TGAF|RJt4^z<6=DBtvB;asC91uTBYDKgxf=5zN5k|tW^fBbA zf5YCTyA>2GT)+Skl3KEL2B24#@I;%HLgSK2z~k#jv_+~{FfTk+V`K|m-Nu<60R-{% zshwfMiOgJlNz#YyQyM*`6j&C){{M2Sa`(rIBnsxU6wG# z3iJUZQPc3Ow=KaI7m!IkIs9lXM2rE@b)aG|JWvFLk%j&f){6*wkuEzgwE&RJfO*b2 zpdN&goQ^3lu%Hv4Tu^{=sXPx)>r|MS(C3rittK((dSH)wJxNaN!SO$d^xp?*vTL3p zm_utAI3L9A*e-hVYe+|(*%MNJ&0U|DpBR5>uN8Q*>f-Cc7dIMKl>t~~fNk9(u;Kc5 z>0X5_H%Xo~Twgw@@@;clCdNBUSMw*4RppV7C5Xu<>P>nS;FgHsZtmv>fTM5E-s@Z5 z!nMXtB7uSTvH5XR&2cqjK4);dpyEXt-QI^As|ho^(={}R+xUV8+ND+-pFmrH$MODk z=GTWSJ8JT9X_?R^)Zg+8!OQi z%X=1ltB;mI2LeHkf8bmiY&gW|c`-bTo8Q`y{Ju4l`&c~l?8cwC~_g;NAM=Pl5(}s>w#!8&4 z3V3?9W;LVCe?p(KZ^prosg0uiYH^yD#EHUW92|WqZX&>3e7Nb}v;pCGJXSzBMmrh- z5ljH<_|rfV4&Ia?ATEoZdB;z!DFGm0z~iL}fbzwTy9slb##=;)Etl zv2sY`27p30Cur&GNsNf(?mdk#807XipjIomJdXXS3lyawleF-ErBc*I89L;3^{Qh^ z%<>P4KL>QLiExXFSlVjwuGnsrpTIY$toGP-ee`@u;;)B(GWdTe8n&KqEfXW{Hn@C+ z=vhZf+7(VmK&Pbm{{Tdm!R#+cj___EKgz?7gjUX?G4^c8o5yx`$@ZA#T#uP>dg8e% z)w;2@EIzk9$HiY4buDAgw6u}Dvb%6b2Q|lYvD2~9{?6KNr}1+})jk|}nkI`{@Z955 z(OyBY`6aT*dhm0`eXG)htdzYBB@5ms(s~x9EN?x%(AzXWD=6%8E3TDQH*?ONJ7{_? zk9=k4HPnu2BeS=ga_tnzF90$RwtqScBzS{@M^9>-kYe20(EHE?tj8PR>M1^Uenx zel!8{bIXD6-lXayGZHaPiIn7%<~csN6oC}vV)!HRpkyLNkDoz673GsTCnQxx0~2{T z!QfJ20^5hugn&_#^8S>DYDI1xNB5{4jWKKtdw+}9=|GW}Bn<8$L6UeB;)#^Gbvn4< z8g0Lppm~lybB=lKUX2JOj~5eJ$((MXA&l-P09LJ>vOawHhpcOC?WgIM>h^MNLfuJX zM^9nRX?r56$6ZWItBZX(Wcws36tZEY+5qPt(xpeJr7ced@vn)t@5}Nz=Cmd#`J++0 zeOhL1*+4++_|{UDj+$_=kZIm=@}mTvg9Du6xhhWDowVU|-~JK&9Df*UF-@w+i#P~* z8HPdU`PT!NGd((RQ2eU2sYrtCGzUaDLq>f$s z?Km0yDxFhBM(5Su0sWYaa>c56(oynZzRsZJ{ZC4XO6Nprq~-zwO{&|OI-$Rq}HmbIfn=5w2(gV}5HE@aMVykpVn}`Ac!>^@uT;qCy z13At`79lN9o<1=6x>=n(8KPzGBsrWfbwQH9r|DT$mm$?c7iWfDSe1!w&}8{!jQ3;E zeznTAI;5=4ZA$h#IAy=QBW!8CnD@ZI6{I0?v*wLk#5bNHhW`LnMJkMAMQ`rHta1nY z%tdaMh;Ks+Pqqbz836wPO0pu4QSk1c<}gAs4mlmGIY_9(sr09TbdR;nw&=YM2e~!J zRoLmH8|r=g;NK3Wfnc#<30wwq-1|`oolV&6XFxdvo-tZSQ!=P+q?5@!Qzk@2l1A>m zs20P7uO4v6Y3e$P(J(n3d%+$W@k%@%B+{*}LvUQ64bQlz8MH%!XU*O#{f)dCtd^g{ zGf$<@&e4*|pU2*POP?<$_WjVn2ssZHf8@hVZVs{!Fs*ZT3 z2yxB{9XcPzf@JJFIUQ&kcS8Wl&uU0YB#fO_lV!10!Z7D(C!X96YU#afjOr~9#ovp5 zD7n-;Nq?)@&nzt^)U2jABaOrkmDO|3k~rNv;}46pXA5np8Dn4InN{9 zu5}{H1_mp8ght)}04)wHU#zKYVfAO!s@hG-1*1jyR^7I}kL%iBdZB{6EH;DI(lb zL**k4w2(bUb5wdgJq{Lt=#3#gt(2&(K!4A?Qqw#0>Oo$L=rm%%LGII+a4+>D-I~#u(meQBv@=1se(|atPG1khXhcxj*5GCiEJ1b{pp;mmX5_5I_&9Vtf9T zlo6|UF2)x=TzFtd7_E{y+qQ;`NO9N^gM;Z#)-LxhL{$gQaz{*h;*(}g7vo}2$VXh} zrLeJXG;l(Z$;ju>QZ5MAflz$spHO|O3bn~4yHo%{%ai&VLWtFc-kHftUmjqWKBl)**0meBTRmEs$GGrK2A?gMJs!GD; zxkh<|9mIFz@TA?r#>b_6EYsHi09=L=av}y<4mbdEE0-BARb!(KtdFI&n~&Y3OV(L) zljtkXf!kGRdB2F|*%Oi6a%$3|;s_#@%GpubMlHxldGGr0gExV?KnM z#!=>#!`pJhm(1~5!NSNs>ty~Tt#u}1kyuDT+ea{RkCPb$RLfDL)AhTbv>R4&^La>k z>B!D23p1TsETd&0XJ%pZ4CH?*wRA1np>Yk~fvjEF3&ys#ic-=pcJBpw`FrQ39Ey9J zb2NJw!c9S@({&jMJCc7bi9GE*f%?~-i}xLfvtoQ*Z}^a-9-nKEulq{>0O4EUAH8qu zp`78VBu$V$$Q7pLu14L0BcPRHLW7b@xb!$E#B5v$5K$C z$@&ppSaxAi^0V;e?7qa~OOzFO35|zvQ;b)5N!;{b4BrW%YZ>s<#4@Km?eF;-r7M{= zW^{_sa2!C82T$Nx_0sfOFI7)}~0d^ce%SqXaz<-8}&mBPiXS zMZCe&@Zi<7Q6P}U!E$#1bMKQ)E0VM=OZ((mBErfK<|)Mz<8fJ%&JmTJ4tu@RN0;4~4_N5u>OyYFn`DaAjHnS-McY5hlIV7w?8)NQlhdk{*zLb+G zAz0*m{4nYG)`(3JoZyCTe~_k_%JQhl+hSqy-j{GfCk`}087gS_y1_asnJWhD7> zzn9Xmny}FKxr~jwNFe7ug=tL_C1SIXPFLUct07CE=+k$~#ACmI!|@rm>*kiyP z{ybE$V51@f7;k4ltmidV9EGuy10RGrLxWA9+F{zkEz~W4N4K#b zhd-?e5Qrp2bCaBorkh2UMeOK2h}?+toxQoCD+vqx#~_9rXFUE?njEzfL?GaMP@Ra_ z&URuzZ&H4g)43#{cO`psN;%LN5WbYnNQnm{xg`Gpg#x|D7=g$Q z&m7R*g=-R`9iehFj?NZ%|xTZYd<2=&1Tn00cqabj9ok-KLtT*moW5>N( z6V#MPj0OXqhLhCMXovBQ%j;4m!bS|)=oi1JtF?^SrvQGnENNU}%4Zn&q%L8gZv($M zAD1W6+MClqL!!erb_0oB#%MNwV*$H`+KMc?Yc^kc`{0frH4;;Z3n6WJ%Ntck{d z3b^QHHFNcs{t4}^t5|r4!|cSey|v1Y*kvexRjS3S#WSY{?V0EqCDndMhtG1?cS>wN zXh3ziY;{sNAA#vxEm@RwT9B3)+L;TE3G0f|D^od6GyKy&&GWfv&CmLR9V&A%dx?50UsovP&hw`u4AFS4e4BM5)Qfi#U!rF=Fs}5;F

    Y(0{5R?(TCx9R3Pwem}al@ehSUeYGPo+@lZ!?dW;+82xKFt1_JK zYW~XFUyi;3_`)r7RJUL3JJ2ofRa_B+%A5n#9zPoFbLLh#WiClv{nWIQE9fG;vtaPd zf=JjN3b!J-Wgb(|PnlgBk)Y&()}_d#T2#sYbcR|84-^v7AWZb?Y1{`7x(Vi`j>8yk z;eQ%wg@%wYNaw8=3l!&{s9u?%OwBWpN{)U10F?kvCM$tWp+J(mvf$1^`K~rBLJ|$pky*+WqoL1Ld0i^5Yi%ZyA7TP^`MrF$KdhasW3%m za5~bs%JP%9KT1Jj7oE1U6S+@SZbAGF7O>)ZkBR;ocuU2>zqhoQ8Q%oFYN*-&0Dy`a zQb(M(?8Wf$vcK8#DJy~VlaF!qsN@`UHgvz)*T9xhBvM!zUNM60j!5oCDwI&B&s@@c zIi=`pANED0P)Q6z6_HeLC^`bz$^1=d%-Q1q02llS_EH}lXwj1c$K~F}qoH5A{Cjo! zQm0dqkzR*7x;&>u)jsGA!*ut>di3SYk0zuoq3Swq=HL(ER*WolHtwzg9QOKC8PMon zAJsfhcm0!~+PsWM%`Oha`kKadEI7r;`VU0?nXRTlcj9~L9#+~+NU9Y`_s)9P9b8+n z*99i><%Tdmq=8KVApodcbmoNaPcYKh z=LV=v2u=X)?Lgu+V+ZPKT(-**wp*XNf2A^ZCq@H|_o!?W6prL^+aA;m_~1*BGvBDF zXHeFYXx*9<3l-&)aQEnGfm_Z$r2s_Dxb9v7{VAakfKwoH5BOC!GDG?fl_}T-0O0=s zcZx0|c;VcBUbKevHKRkfp1gjP2^vMfO{4Jjpl7pq7vTn{ucB&K3bxTnl8*gx>^_xI zm5w^{x#*Jo57TW>wdKT<$bRtziq%(VAG1fB_@Cgulu)*vb1YJhg}EI1){&~%l{C+f ze0$)%f5Oi0<~z#{e|sMczfoOO=Y0-o)3ea|GsRvbR9PJuFb4$s5!ScpV|`DSd{M7H zqcOKu`9UW=={9vzftRJ(JakP@T0QKWM1Nc{) zR;AsKR-Gh~_n(G5Id9>s1k-JYBbPp=lvRf((2G;>W{Il6mUmWh?2C5YpD!$ONylGW zwytMm1}}v^8&w#!BOO6AlBALb4;<8j9vcS)fDU+}qMIZxV+4G;9fgVB;gGq_q{b9HCpG&(@{0 zK^zSH$Em3$phW=g9C22pCQ9qKpGu)2I(^egjC)8x+&YR}!(pD@l+iaiKN)J*8V;9p ztyv(E?NrKFuH;@=eQ}&qi4$re;eQnAemB#i@dtpHx%+n z#xq9fw#vGN+;&j4)Q61p>CI_I7dh+H1goe?m@9z zCA#M{)JCOqg7MdiqVR^E_oo6z1!5kp*!~8bpDHdfyF5$bwt+3oviPT1V%K*8{G}s> z0Gyx1_pd%u=Vz-)nq<9CBKU!?MLZJO%GkEIP0|J9%#pZ_Kbs$= zZv~+&^Q{epnq|$TXFH(AKiy?N(y0>79V*DU45OO2A`$Jr71OecsHb@)bNFJp>PYH@ zZhg)0XTc^UI?dw#?J=+(?OdsIGpR?FA4eWZC#d4KwT#;s%-jHZ7^*~wP60ISa-uiP zA%{`*q$wgVQJw_?7bQt7Mm;{2X#jG1dU5zr#65mM!@2&IHUX?NgN{c-O}hZBcqEb5 zq+m{Yvd0sjVn2OffFV{6*JpJjof) zJfG)VwsJ-~T;N&3+{e`8^QdUoV@AIE37Q6N|B#>u`LN!B7lyEIp^z8 zM39XyKu4&_^s6qy3xY7c$>-@wGA*fSTq(->eiU4Cjf)<5=sCeS{5YWpFe`w>zfRQ1 z6i5gxxZr0!%>^Z({{TD;?CbQUaV2mMk}-mKq=I63gaI22`qc<kb2aCO=EI! zNbirzfDl3yoN>1t`{J|$SK}MN#yA9iwFm@a0}~kMJm;VWsWB}?ZJ%@=bN>L>q{>V_2j#%y+)*&xuOx*>;f#J21&UXG zc7S&0r)mn^fubZ5dIOqlk`E~me(+|U$xH|ViZ4=sDiXNZjP9~4oEBVTJqZ*vCNG|T zXLT7Tw{N8@2$aZtv9t=b^aGr`R=>W}Yz{&^?=u0^h*OOFWryWiRn*ps>UxFM?31`j z@In!{Z$L5s0P3x1tC>yTVkeL*8G8Hr@JH!en3Y~Oz}?6kf!dk@>bWO_&tGalXd*7- zB#V$&01n*JXdZ$XGnP05sl{4BxG+zdM>y--H0)yCnFO*Z7+!I~rje%O1A+dpAc6eo zV2cW@PE#j7-u0D9XjEZ&T(xf==XpwOF65uUWBOE6cPgr}auwa%9Cod_jM~(;h#7_s zN&P*kT$QUYq&+tr=Nu1u5L;79Kb4A}4oSbN&^Wu4-Ar_Xm7q z<=ujN3|4cItRi$THb9C#HjGpore(XG{Pf0Yp)_-Pt>#Y5@_N-Rj3v2~3}obIqVj7y z8l_-hM<2n(Y@LW`Nn{MdFnaoMJ!?g&BMJ$fNX`a0tgmJ^^s(<>17KMt)iojj0g?pu zzyzP^To}1r>%!Brx#{}M-hJ{YztfdqidY>k@6RbuNvmw30=Co;~(eVr<%u7(DSI-%*9XMAdLMEYbnb^YHH^0 zfZH#ocH?kT53UbCoq5=uQQJu$UwkHEe102=DS{9hvEkDG4@pG&m59ejYlLccHauITP9j138eq*{gMI$D^Np2k84AAqeY z>Z}`|R(L-~wea1j)ChKh>+J7vM^zN$xI2%q1NxfFG^FZMvi`JZ(eU;qP^_f( zwZ8U`uD&GeUKH`QygE*>7GrJmhYY#&#&cd)28^jIpHZFWRBJ}py}#g}H|y3O576NI zK7(v$)n*_;67$rayqfhBYgW&MuZxV8k>`Fl@NB*qi*>_pzM9lrT(HmHl0v8H(2DP( z`O)OLU7jbmVN$EPTz%2)*ZEfWvC^J|kcb?8&=^spR0XiS`MGVOa|wX53F-*1PR#-}>CP?yPS3 zcHq9AZLQP?RtSB|6J0eWZB9w6=zA0c$S(oP3s?f<{h@$!^*q$mmD!b5WORNAV-}-s zq>xL3euR(luVxz_WTUC}&%&)k&i?>dan1+R-nsE{_kXW58ZOiRyPsqDZa`o>=WBvK zhl=^?i26Emx-vdHY3ZwY1*ac=%IQc0(bSLVD_RcHBC5P@eii&cM6&TE+$u5V5h{+~ zI)Z;9YrPo6#FH}?tGDscGk z#c2{*Dmlj)ILA+=CLISz+r~%wzz^apNV}M~(5L2x0!A2YW~wZftX8(WD94;0c=qX5 z*)3e@w4W8rV&PUocH=o5VwWw*i)h`|^!+!*v74xWb$hpwjk~?;7LJSE9$(@OB0z0n zR@o(}bCP&sYSJYmD%(`NvycnK2Wbqf!>urA*OpUyJlj?ZbCyCqeJYgfPbd@smS9wY z&1(gHOx}YSAvrlCrxYitHo0BK!;YiZ*P68MF{_3hIv>>Z%?*@Da=0suayj~XR#P1} zW=TAo@IV;b#~nwlTo|UcDUwtIy-)e(td$Z^H)m0e*~jNVZd%>|`MdS^r(v=^jUn24 z432wdroyu(5|m%z>5hK1nz2dPq`(iD9(oVTkT-FgH#XNKXZarHorq6c8gp5!DZhG^ zJ%Q)ml4G`{Ngz1JM`KW)r6pr8#l=6ejqdz4oz1+!kKt92D<7uTYQm=G&_%Q5vy&ex z+>hy6G(ym3B@O0e4ste+%A}@6FPIgOF~bv@EpSf60wCBRoDP&&cPH|Ta&UX|LWv34 zhB9`j_WdfXE!kwFGJvN9@IIaCrdrTyGa{1AHjY0&lw3(%JmTMXrBWf53l0aVIi}e` zk{fX61M{dFE<(rwz&p9cSjgC;e-}9eA6mqcGY@fsM_+vOpsOJzT;(?HIX_wg#A<}` zBV#;~Kt&6UoEoGLRz}1U032ue)iM*a9pw^my-sT|ZsVgT_=Y*nQe`NTDu6bQa&t+U zgCSA1dgC;Q$}tx>2tH$)v^0i^3o%2-JZI@mjGZLijok^)9+a#bjdwAw)dZhUfAVTr ztVU%eaY%flR#ICh+av2iQHT~hPB=KtG)1gOxbGW@$nD#jNrkLgRV3hb{{ZV!MJ-9A zUPkO6P<`r?2`d7HU~`ed&S|+0D&!7Sl6vPA4ct;z8zkFDA1-l^dM-X&jcd)PFW)$+ zaw;(^$#P^QgN8jwr_E$bi4=xjLV!Tvno@ciM5!XUK4D-K8Q5=k_P z8nb5rvBpoeHBddDbLbBdd>YgI1E(gt@e{;$_VGx&$7;9FC2F#SToE!pECf_=@*Y!(GZ-cO^j}1MOJKO`S1{E=P7D zzJpL^CLqQMGv7TbBt&_Ynq z^U$ft{#DA>r$T4X`rIZvhf&8Z{LOCzDV*sUt02*`=PU1=Q$$H0pg*uyxNJOoK9=o> z?{wMF5AQr|u0J8VwygQ7{{UT$FuF+nf&j3{uORg-E<1WqG5&6Ij)c;%g(oe?u%;IP zIm+~)86aJxp42c%TyeBxJXEAr>^sXJdY!_B*v%PDvT! zDf>v+{FjqUxrS!bH5o`~-Mqj!VA=VT@4Ih^Fbv%(Nv-X#UM;3XEl&*Bo>8 zuDGL`PUT-Xl>~E~;MEbzQZSsHU>*R^d>T!SAy8mtfyPhs=9e*c5u^o<(}n0yr71{u zx#`~zJ`eb(;$_Tso)^>R@>#jMbRrZ3xMPfw=~GfkBS=zh-2E4`{f{(VAHuW5vo*(x zyuUczW2-11EioK-5j%>v?Q^)dx(~KFwGzCW>eR1@VDT2{A-@1Y;74` z9ZWI?%xrVC55-P!NAj#zhPTlA_u)cp@V&cq-6YME{{USLT$YIB-JY*&aUqDda$_Jq zI_)Qe_;jTbCe2mF!fyZ-VboT~Jk`&zzh|!=t^5t(jYYrGZN7VEWA~A|sP|K!z>1oX zx;Mhr=zUV802|cf@x^kbW4`5~&&&ldBqNYWr-!5nZq|cFn zde8+Dq4@O809ACxaCz%N4H9n%Gm)Ou4QN91?QfQg4G{^!I6Z3ZVr*J7h2eR|e@cc@ zF56v)J4FK}l2L*)o|QMa4KfA{PBYr53XbFe+*E-{<>L#`3{?YGD#<5SK9tZE+52_H zAh}tj;{yhm)}=`t{yx-5W^9s{Bx8(>8bKvt+p<9%ieQm`BY~4ZnQ1Yc6G9tTG}1Wd zQw7=yAYq1983Y`R5$Q@=l?hn*>*8O5kAU?deW$7Z%DZCefN>jlUtoAYjdbDa+e4QZ zL+v6x68msa8-ZSwWpsH}A#G1+@IH+5(e!A2Z|TVtSH#*OOMSGd&nVMIAuPRu5A}sajiAlpKylKTt^Gb&VMw zGBKQIwG2nk{w2|lmp}G|3*Qa^>JRu;rc!2d6_o?VcLwIE8s6lHF`Uw63g|+C^u-7Y z#N>t@2>!I%28C>c+NlW*0A!GTG5J#qjz`>}p4?DOw?i?;1QS3JX9ss+XaEO4I5=G3Pz1aH zN$0%)Op=8kFMhvTZ3w$>Ib*=&ezhA8$I<@)1AZJI6j>DCeD!~({n3Zu3v?PJfJjw@HY``JA^`_L$}$b3bpg$xN8?^?u}Xnfz}ZE+Q3 zjqp%|ka}XespvyLD?UBP4TZ_O(T*dLiDVw9{{XLDeAY)Yr>=+0mR5~(C(YF7tzkJG zl=eD*%l=A$pv`>+n!J7 zTve*J?0PtAT3w#z;wvZe-~cKpjR#BsI#w}9Or@dm=ZJNOvUY~kA8M71QS;D~%Y77b zYh@iwZ*%8=5Na`MS3lXdPrlL@FTC^SJ^;!52Nk*zqommcArqnNk9rY<)!6jiBTE86 zia0p!ScOl0fNA z6Ct3EosVjUtR*4&Ad%3HaY&&~ae+?YF&~_CqU7>{!1`4Uv%x=Uja+Ge5A^`8hq{sr zWf|mx+n9UswXPiJudavW7O4AKz5f8MT%u&1j%86u-kE29(QHlH-M7a{?Y5s3n>GO-mPe3jwP2Hop!u)v*o zEXsC+?^NbE#QKO!7l-r@H!301;8C-?k}v@GW;8-P!l|L;Hu`+1j4s*)h28(BUULPgDIUA~7Es4A^e|zt*V@p{pQe10$zQP}wOF8Pqdv&mYpH zM4{CE{sjOyx`D~}{VAjbQOTa8fGA)oU{C;Xc**Zb1y=IT;mGbgPy|xk;F35UXf;G^ z<$(?l6cR=ig6?zbbM@^_G6lnQQNiz0%~~Un7{O7?4l2_j=qjk&}FwV$3M!8i6Yk^l}^1$?TQ;2mv0kGu6?L{v0GYf9_=G!{(x33 z>T69|9fVt06W5&Lx~Z!i({^Q+ktbqXj+;RDtFfN!kV_P5RQBSj39=D#ry+O;)~JNX zeW{1a2ekuwp@w!jAmDWRam^^Py%5hgcsV#>`qef{h4&OL>~n%oT3o{}MxYJf#7;9y za*cF>;)L9x0aO+uxobCl4e8mDM4KE&Si1!qkJhf5u&NhR7%IG+Ro>my~gk8D^Ki+495 zSqX13&P4-@GW849Kv{pgRbjatl+u~o%#*HpAB6@j-HQVemIK@Kq9)1cB$5RlTO6@a zLG~2cl%zmGkb*KsamQ@aOi_0%Zt}l*{3D`GwxB|S) zPOS8B-wEDdNt>5-I48Yj66AR|j%N#QP#$rfe=}aL5+{*~dY=J&R@D!i_7HlEupgaz zcCnNXoV9=6tTy1}VUB*Lv6OCgElzUOsJukR3Cf>vMRL`89T1I;OEpBif?>paytDOU zG5o87tI+ABkFGu+ru`~sJOI;VeFyj&@M>v4>$$R5X9w|0Ql1#p6!%z{pZe;D`3mg9 zKX{3|A2NBx^l$;s)n{)Z|T@jZ&bsXm7wug(wEyVXNZzP2o z*|Nmv1Z0u)ts@koWqbEMbKvFHjiKt#t@yfg8^alBH)Q0Vgb%OstY=Q*ld*yE7ve0Q zEYvSv)k0ZJvD?Nwh~i?y>A0Ml(t_nOiq_{Z;JNhsTf;W3g;Y`$k--P3{Eca2M>`{x z)*ymA>5i65+HYWtdyiVBp`>MXsfyn*!0aemnym{~(8$QeIuW<=G?^`{ovx*?-P~yw z+IFdM(lwkW*48}n6h-%t2e~BvH8H2VWpmu-wY$%@YBF5^00XcfdJZ`JDx;>vrJ*PG zjl@=yTEOLP?kC*q>$3%aEYRuP8Pw`NJG<3182mS=7LlQu9V92JsA07Jf6j_@)LEUb zU(s#hm&1;36qkF_fR4OJyB|!}QmOCQu3Zktz`6uB7V+xyw(`hsOl*GX3`Ai4P6?uQ z8+J0>-;UvptdlEdS)XfX*Ez}hlU+1_LkjIJ4&%e~I^0{yYJ9`LkU7a;Ps9rKD9c06 zoOM33_)mBH-!C}H$OnvbPZ6vRSgTLweYfG;f~rTja7{`3~qnv_S6qg=Z!nQxHOVkHxld2q( zk_Z$faB9xyMSlpEA%6(OnZd`WT-24hQY(VPetE4@B2P;jkhqluiNWqW)soXllXoGM z^tr>`T9|Sl2N_eIe=4$MRI#*% z8H2IHm3|LQm0%+|WQa?>te7LzDI*_<70)%Py*FlO==Z;Fv9#0)1*V2JBy`D9 zpVqbAT+VQ@tfM27^A7bpl@;7ZZ1Be;)83lUorU?Bk~sCJxGhI)z#Q^u*mkh+o>|H3 ziWa1@!hwLz#~pn;(3OEpp#wk|0^_O3_o-&9L@}WZ#l3ms(y1A>Vb2%?IpAYI;YqQv z+fEo`fKCYd@lN&xJhs!g_x_bFl=m#72Kik;Jm^gTHeT#uELF+_vh(Tdy3a4`^1CSAB`46 zwTEvTc;k#_ixqK;C&~y1kL5(PCPRdqa;|vy^r=Xz=tgAc1Y@|W*dpvXSbgT|fa0^b zt#O<3epA=-tL6kKW+!_CgT*GxmZW5WIXyTOt|W;$0AvjG%>zKbt?B%_RJKmg`D{SoMyn*b3Qu}Xg}jXjEiU8;wpOytSOUIUGxB|LS-PnjLk{K8 z@3h~8zB%y#M$+`je6|3VkQ5yC;EIQdM?`QkJzq!tkNiuhH=ClcZ1$kyZj zJ|hmSPdIVG{0~}FTAIdM9(|*DTJGahhThl#x=o;;Q^)nK6VS~ov)TMXX8H&a@W3qbHvx_I355lxWSg~ltJ_mZZpl8;fvVOV! zi}5c&mP3S=cDFzF-ZG>0#cq}0{(q35?Ir4u-GRemyk?JGI}bF6A%I}<&MC19MjIWy zXc*)2g1t!TiU5{1z`*NBXnzDyF^l(pT;hhVBuaW5@zhgF#!qlw2q%JZigHCM3&SG|z#5XIu4I*<8KHUb_TE3hXWhDI^z zO|oo3HdR9@8R|3N6`PVS$E5fJ;Qs)NJ|#-9cvi+kY|Vzcl~_ikP0BE8Xv>w@ zy3yuWN5>x!ye|~{u5H&5`*DIf$K_tNIi5u0sq*dQCrG;zWA_YpN;{BvG^ZPc9;Uo< zJ-cmV<`~8my<^W`z}Gxu%_|)@(EE$wx&-jHpSSL`O#c8~&P{1qS=i*Zr*N5tywyFi z$8c*T4P5E;iDQR0@-IQa{6E6BTA0lpHIAt#hwh=*H0-SQ&KzT@Ps@Nxp|XU*h~79jJt~llwve+G&UrlgRkS8p^7al7&6>bA~irZ&5dP$68#%u}*i|Fby_RGYf8P&?fF!jmnXZ)Y?`9 zK|XG@go{bYBzt{nBSy3}ZN6eX`%uh?_3aMR#P$;CdZOkTR~gUDtZBev!R%gTy zq+WPGRF}iLw-ZFiV-7>Ecwt_J3f#)alZm3>^gh@9ovqT(O`F6Lb8&fe$e->Z1M~j? zJ?e2&(#A9))cY?@x-$-aYk{Mr>Eabh8`DF~b)$i9C3~A;B9MF5O<0M*@?RC``_Y3A zwK0*A^W>mu7e>-kh~;mT_5}X`iLGMpTpf*cjC9XE%@WYqWTYtibf%cuOFK^){{Z#X zhzVa>fE0{z>^~Z?BHgzu@681Aii{hm>7Ul7!OTt%zt)iAd`={36iPuta7s8T!`Oq! zBedyXC9_vwG3dmoCnMQ`Qom4eLH0C?rtYt1yqa-q)-KIH z>7>@ok1H-5ZVJP4f(Sn`?hhmJs+NpUlAKhP?A7&6Kbm%F`89RaNZDjnWFV{Hh6FI= zb|8>`pyH*gI|`iC(vq`HUq+hwIJXwO(`oc=4@M7$LKz4oGLS(YppFRl6g6$f87V8p zrk>3-(_PbAH2O88=m_3w<&`x;Vb6?w?eCnD|3TwebFlXQ%0y5D1mSFY#^} z-T00xS53n4d#xGdM;8oCBUYQdWR#-&#!Bh@(GA7)cd#ww54sr{ zJ~8;A-$KlE~!0t)b7S$C4;Rx5^1s0i9aB_?FjHMpZYf>m2%L>fO$-P5uafTTg z!5xV2RW-`mGoe3g1v@o#ousWLb$dy4YpU*A04d!YZ%mS`JC30KH46Prmo5FrbKkEJU0Q&*B06z&_P171sOp-~Rw^QJ3Eo`=s;;97`HX+j7bY*umG4*@pyr z5!Q(-Hor@L9X$-N^<3bj?W#}RlALv4W=lyf(pojDBrfXSTXMsLjPOU)1Nnhbd#w(c zQ*d^c>qox-05qT8lkSlr1%G!Y(96LncP@R721lX5`cl325{r(KwbuNvnm6mqD=V(f z%Il&eERF+4+oNtnV;LQe4@}X@*87W^GS&|1?Coo=j?Yzf(1$KnRz%vw4eO9_dyI^O zk5R>1we%*NlS#>0+f{Vz`m4t2+q!K&f^H3#PE*%|$KXi(i5~P9DJHbr<^KS-xkv7k zU7K2nHv}002>=m>7&-J{t@(g`K#_ zHt?f8a8FN4mWxbZIOmQ*G?Z=(k)&+#)BgakNs^ev3~~DNO$o84HW{k0T!(j4-}=;8 zY_Yg8#(Hu1)pC<@JkWdcC}_0FgQAVha0hSeO$m(NI-b<*Pca+FMhN73Qb?yOBj9h^ z_rd`$wC@|jgKY6Ntjq`TCnIs`)2HKIO=x+wV`g%nv&ELLYc%@Br1Hb2xG|Im3nL7U zhqphaL?L!%Ql*uTsFqUSCv$_Jdh51_4ar@A`5T`90F@lKL38Hsj=nu@G7tDgbjb(W zWp5KVTmH(^`^>+>fRZ#V+uXQe>-PrJ$m)5+=_8M-^2PCcZs-Sa0Wf= z3C_l}V{`9MhCUP;6^dWa7#9-`Jwn!TjrBU4vFaPTob|0p5M*In>ME9`vB~ps+Z7^C z<5b`So&c(BLST|h^zTwJTa0bN0P~u=h>4C4(cED zBk%$KDh)}C3~}D2p*BE$F~>@wMU9e0jBjEBCXO-_(S2j z{??f;Ws>1-#z18l13uj5x~WRX9ck)(f#V<9=i(2Cbg6t#tZ5}IV!?f_mQZ`+)0%DE z#ZKqX00N{Q8=)BFR&qwsXKUe0aXr*3SF3aFT(UMt+&Xk3+Roe&v;q9hXLD3%Y8r*L z%rk=PyXRR0cE=x;RAM>HL(Qh~wvFNVAc&QLWhZVIt~40>vdJ?7$I(=A_zo&39Y~ChD_Wi-8?;Ut z1C?SrWc43~5L$$uhJ1Hu>Z=Iai-0Sqn#L+O)Wy7!r<2R+k^HJ$u4`)@R*F|K+CU3R zo}_f7!MwrM6+#fZ4j%1B%s$H+Z6ph6=c{{UH@IKZH3TxuMs;~kE9pwhxJ2ju?%_4%NlQH1V0hDLB` zD{LyAYrtIpF8Ft|=gD zz~~6t!kG+*1fMK(j-Re*0tei=ZKI5EDv6vvfu7+8-ajhF8p~6u%a$gMxMv?I+A;kr zxigWwh(PC-h$iD)MNipM^poMmDXxOu$f4E;L;LzT(p)E&Zt=Y!wtnh|YiG?3pm z4hK2@buLyLjnQFHoG||YIjT`|8Fd7e=@cE~?L*Y&Dw$hQmO zOOD+|NYX0m8G^=3gYv$@7oM5osw}B1>U|UNOc=a0E)U*$8~N9li1?335AdCB?4P`H z2^s1IL{R0S;eQeJGZakBcB-#aUd|6=!o*A7XXihRFJAukNjdqB0Iy106-gdrsY;4U zukekF>&eNkCo3JX)Z{~XQpR~0Jv-MeM{{_dk#*rK_%sbcQ1{npmnGNSCyqwf3>Z{ock z_Dw2QhD%n0WW!`T6)Bw8lLg4l+vYxTyVP!NzSRWbmS<3sG2r}%*1Z_TNf}94+VSVa zJAW95=VC$WA8QmS1Xw-@s8L`G8E|;BZK&Qw@wp5#<=J0qAjCMnS49ODuNk zl0_j6yybt{_4?5zeN7>$jU#!bnT}YT=hrlDXqASkEg;Wa^)!>Pt)b9r7GloI(ZS+Z zm5=^A{VBp%6Gle|0CfKV8qsKs&qC4eSm@T)gOYFOC!hLapl9>0c}H87Em7-HK=ztJ ziBPWN963CEs6Ju&;MOa1p6wYIv!#xo4a)ZX&+DOQ>if)a^Kj+$qs6?fIX)c~j zg|ic!sUG!fK#=Qe$4M4tBxCyGv@*H2(kzjOjQqr$icvvPkXg_B!?W*fT=DK}M$F-JqO~nXPv+lx|4pAd!x^IP1kyS0t{;#P8jXr~D~c3hbG|Zg|HPHaCm1AxMZV zgORxXXiCJkNbWe_&UhH~rOFCcE4r5)o~Md-u}$1=2qn1AIQON{Rs!WQx2GrZ6)Hs~ za9KBe+5A4WPDHWgvOZNH@&q|3gii|Vz_rVk(X8coFG+`u-ml^5Q zkb2e*kcOHU@)*D)5$bk5pLI-X_Vaw5`>nE5i6CN*4K?taR?;xSJQg+arl7!p=2j>3(J!z$4WA8DW z%KW+O{W2*HM$E8}yXS9uRxNG?fdxnz?T<=ka$~}WIURB{Q(-Mb8v#F$a7mJP*VCX+;eU zj$)*o3}^gvLlZ=gC<6g=j_24^mvO;M0#xAVjD8gEJ6wh0E5>;2X`&jjBdG%^+k^b+ zwQ^Yya!y;3o<9mU1*k~kKuZ1|w3E3~LrWeB>7KO=sO%@1#(i;t_|eT_@?3?kTRa>f z98|VdwJS+58RsMr0TdueVqCiZ?GAbT%?*mzCo)LO=9Am=sJU&}jkYNwM#&>NAFVdV zm4qYDq7dRL^;*!)h5&mJ7r(wNFZtbDe zE#=eo7}i^9)TD^OkUlGr#LdU0ANX3;H%t!^(C5(q4DpMJu# zo~1_U@2_-Ys92d87~?E6FHQl;!S}3rP1`vej}qGG+pTnvW@4dTpP?Xi_WuCuQ?pHcjy&B)yJF>0Oh^wyFDUHE^u5`Pd5|z&> z@myRaqq?8a;Fk-C|&r5VlV^v)v=)=I^ z@;Izco0G0_p4t9&n;cN%)PJ6pQ3i;D?&v3CN5| zkO1kLp(Z_YRhhXxaro09u~QDGsTqCJ&dKLJ#}6uRf+Ny%FeB!KlA`bL<-nXmsdO$4-eY?bK~li~s-v zxuqt~n{t+fc|3Q`CP{ucLIRlXDpDI|=;Phf{Pm{vGLgyrMDS&|j`Rz^4&EmAVdg@5 z5hC&k{A)Uq>Td~YWAg9Cnj`6OU1*xJ6}*OBm^>4Vis+$I=Oub}*!eTZeixPiXDgIF zfBOFbm3m2YBhOOhXOl%FpJ$TMKi9@v%l`mrSP)0$So=M0bSdb5jd(Lon$N>pO|8Nh z<`xidQ`w4)gZS1}U%X=lbEFsm5OeM6P>Ys^)|whvy!9C|Hr6Au_CM0LMiM$QqC^PC zoS)0mspw|*KEC~%d`82pLO z?teN$AX{@7`G6eNH*hb*ZU_v2ixn-7<%PFgl6lAY(zu(sCzZE_7@>_J+bIaIAmav+ zb~2@MGmdeZ(4C5nFLOY~GmKz$#Ue_q++_3unOl&vV~+Wt1TC~+o@gm6lxCMB=KN_C z-HHP%!t!d74P3bq0B65yOd?!_?)$tDDGeh^FPjJTrLfEJpXE%=?rKChByc%7`qVaP zk30CI;C1n4p1OsY#;0Zb#2^g1V+@)4bNE$Kmm|39)Ao@f_!q3Q==PSADA}Jb{6NwNlw@4wWxpEMld~dATb$R2^(ECTlHmUUtWslf{?hUK*41OF zwK-iH5-|&g=N_K*5k+oSXCJ2(psXQXzc4)WpT?yOjAUn=f!pgtKssgQf$9BoN+3TR zmg|aa1A&4%6U_;M@jk_YL}-S;=AO;d`BT&XK1Zd+TYE|#{| zwwn)@FDSBiQbEWgr`MWE-&3W*!MMJfe^;~n&|txsnKl&TZyaNcamOCi)UTqh-pi%V^tAcS~u~%G(pJ0`R*>A1@qxam6ROtp#MPt>xRxO*HZ& zj#iurr9U%razk=`!65xXBhb^5wt)(cqEdUkcT(T`(Q=FRjGB9<)}(YBI72XN9X$4 z{ra9}4-p#lqf!dWQB5nw*)*D0gOnbfV<|`ZTUwrZsOk}{2+=8yGJvWT*i>VHRO1-* z?L?x~o!#B{-|^~B7EzTrxF;0itrodlRkVwXvx`ekTPtjM7P;a$Wwnmt-{ghkRz)Lj z)gTZt+XJ<0Rt_?0>eF{J%d5h@2vnrGV<^SNTb9vjIIdonT3e>a$iEW2b}gfpNf@K^ zklZjn{{FS4IIf37sVVC#ruAxH5`B5R`}v;)_?KLt#MfI8kFzh`;Eq0o0zWFbJMLW? zX)8x=nl-1RNv}qe@-At*S-fPrIh46BWyvLp=W`R!J$dH28{}NJwY0Zyxb2-sh?A(~ zUtN$uZMryI-S+s>SER_i2*10ik?3@=W^zEJ7GoAyk6eKdeaqQarzHjq>qQ>7SJOhK%Khy*H zfPJaR$}a2vAN5gxdQZAR44!mpGYzGHY-Ai{bjaZSMK-xxMtFLTtQ4BH(ssIby4veU z>a=|aMt30dc5c8wD{f!GyN^TOhvoiXfpptxH*4EoSIry$0Crk)F4D5P)FN?l5?m-N zxCYvBk&&KpkyAMGyAg-2?VzTUT**5<)z$U2)%_dwEHX3>(J&cbl;haqmp3xG(^`|I zCkMK1eZ)dUm*$DLM%=4o86A!fOx0Pf_b}#+wS&A~&epo1kuqF>_V2zXO&G8DN7EP8hBR1zE$cg_z0bfiq3 zk1_bS;Y)uS_+slpxgi;yB#i$6b(HW&>z}Q3Qdc=KZ0EeQNNM>Ndo_t?Vh<%H_db*!;%vpNMXCTh_U| zVAnTn)4qC)k}+KKcRT5>QkRE(YcGYTwzyVig5CENU*gV25A*yh89?Y&4`ld<@oP=- z9h@3woZq-~65cQb5UcYT!T$hg;C?hyi85!+?R6%vbl3MB?l}wDN1z_n(Gw1)){LvE zUww+ylN3WTH)3~3DV~634+}3 zZ1*|fS3DOn*BJ7n>!1Q*5MTj?70{8L$rxwuV{oTpMdT8#$juKyiG!c+{{UVnuv`fT zAk`)S4;=BH)G-YTNdvDn0|118aoaVh6Jv0~@G3b$JB?V#1h;x@LKx5994~)-;*xg( z+k%20=qR;-X`g|fn5Kcd13rIB8x6+r0dBbG^`hWLIpB^6$@zWdX+?~?IF@w)hO`Fq^!~8t3d2f{@To6uvwaF#W?MJI?{{Rv#bZf};TZu+WkDELx z9AMM-V&**KS=UT=b3>*$@~?8vGEVFsSRcfSsGyTPlUurNPU9egiZ&?i#c18gMIA3$ z)HDgj#+x%EspJ!oaqUe5)bI6Qiw~>Vy|vYZQD1DtcM$x!&r-wJ-lgisqIpab5gCth z`P(FCkF5x&sic9U10dk@?Zp?k6@-oEg#?kD0qIkF1fz6)d;30k5*wTK@dlv2VTl>z zLID{cC?`LTE0(2OyB!qi*=l}@d^)gedzTDupc1hZgedOEJ-Ty1!*Kxeanl3vpqU6c`{Q?RKs~6~h@{F>>2{Y& zMDVFSh#18t%WzgX+rI;8mq&W3Lym(7nmO5ru~Io}--VG*H$^g${ni7I%CuEXr-nxp zfAF&H9hx}Gr%*r#r%KipOecnC33=cv*hvi;AQO$tjMkB^nUrwuCoys1o2ZHZ07iE! z)s%25oY9vfxsN`MVJ0`+yd07}de+gJW^;>0No*N8&PGlM_NwM0#Rh@X?=L}&`_twZ zDHt*#0|$3u{OLAb>^IDjKJhsjr*Sk8%EaLG$RuO07^YG!iGgekvBo{Q;)~cw1A@N! z{{>wT5D-t{O|1mSM9Nomr|$AG?NBpb8*7McF-n%m5U?>=Qt-B zri|3CL?dG&>|>nn!0n30riO`@!~g)NuX-X|G}mg9$_N-eY1-yZ*t8DewT3Rs|X-FjF6*6ICd<*~*vTW5N%<`m5uygBE7F6VOcNZ+*x{Q;7fu6qq z0F`Lfh)l%Uu2dKHhAb@fywo8qKkm52&2Pc}F4WfiGnIw`{&kPg~L5%hK z(zwyF1YxtgfG|(KYSeBt%zqhNn5;^sHnWbN^pdeMK8^TB+dL(0k}_qLPvC3Hukjv* z4I*?GlV(>_%C0`0DqyZTNcp$p9q*TCB#3@#4#gg%_56UZZv>ALvb>LiwRuL#Zd>p@ z@@uwov9uB8chY7;ROK^*Ym!RmOc~D^9px;8J5LqMQ)76e>c0SZet#TkHx}}iYdIC6 zP)0(P83&I;UpHQ&gztaq=YPc$ulQ|m_8$vHWj{VpxQ{-#m4N$3N%Ru&-N{6t!ox_;M+{DFpfy6FjO_SjhcJ2aH#rQdiX4 zoNmlt9QXzstE+7i+=bQT!%BJEm*}V8lUq=(*}YnPtmh>7KL>@iM$^1mblz%U?2iOt zhI5}v)>XODn)g}TL#6yZ)9v<816^J3+QGkxKplDYu5~twsj9iV2C?w^*+-e8M#?$q zl0{R5o~NBRV$@o%!h6;bYC1rLTx~45{5$bg9%LTY#@?6ko8ZTdGaas|+Fa*_+{YQu zxy55!5jZU`_zpGheL1Lp$69Wu;q$3@Hajc(OGpWo_mIzlo!k@cn&qR5lX{MA^gk^= zB59{j)SpO}B#K*RC=ohfo*g;i#D(eY#}za#OpYXSGuyDPmQ9Y=!b)emwzU5AzbHPffml`dV%eNk+4Mh*berD= z+u7Opl2PW*8_JA+>B|r?_+q$dH!|u&l)}0e8pfFRkk1z2fz*@8E6sWoBKeMLu~r$N zxPmB4@_6a#&|hS3tn98GNA6joW;`}?mHfpOA1blN_qq0OhUaOl znMvhw{d(7fSK?>6Mpue8Ja03_;T>dx2J2)WU!6zzQl;@B)%aQYUE-}i<5z-9dnEH6 zB{E<8OaZ1thE{O%(eW zGIGR?-1}49ly#PO15t&v>x>m6Dtm*)GLyN_ru%tb)xiZ@9>jM40PE9IMlvtk$&Lp~ zwCpQfw-kY-Dga-RNx|+(qjFlYB+a?}_3nV2jPbktXj_#n5khNmDwO~dM?=MEMecGJ zdJ7+(-0|o?T4{-n)0%5Z2JGY?)KhBZCu6XJ{z>!aoc0`gdQhTf-NhgfcjF%a0HtYb zk#ZSYW(yH=RB!?3uRK%buQ2lS?po3O@#xhvT6Gr*+LQFkF@ zfzanX{uM13au*~v9Aszt)N+pY861lFJqR5KdO1LT^-=*mbj>i>YRX)0UIsX+9EB2K za5`~P*jnWA%4J-rILSRRNxPawSifvp&c$t`xgF~{J0Zt&%d|O-w~2NAANW4dE>wTM zGQ@sjrkuHzjj<8YGr8D#%Y3=!wOVR(6UD#)kC)fht8q3?q%kE2PJq&EX^&BkdJKOm zf(Pv1!Q-}l>f<7l9O_&UzfXQBxqFOcJ4p?|865i5+)QWBpWWc|{VCjriAxyB&vT5^ zWkj98AgdmE=iAbta%h4;F^0hz&*@Z%VZj7P)lChQmB7ZW!RUSapXpL)ksF<(<;lnC z?N`vv=}?p_gx)A`-Nw(j^S9>5#oRp}6^u zPf?0&5c4l1Z%*`BcOT}QjE)a#RvpGPm;=^}5;$-;>T^qRy@k#P139LZf$TxQ*Yu_Y zrLZ!3RI#Rf6Z=W&kl*V!*0%~BW`ZIC^$`qK6r|PJ6<0DpCp=f8NuyjeWDyxS&tcCa z>t2;P-1DUi7*I0B8%Pf22W@o4nMx*o!$_=??I^<=TOD!G(vem*F1$ym>T&&^?%~=V z071YQ9@K?n97Vx2BqKvhjpUHp#4_v-2dz5-+|!d%n?@qnpEYpUVt6OkvvIj;*x$O8 zYMOj=XQ)5@dV@!*JnnzIb5>-T0PDNnw2B6flFCi252rP&*vamFq5CIZY1&7`^Wv`< zFqGV*MQI}(`EyOel1@n4Fr({J2P6pDe=r;j)=e5* z2`+ZkEeUKrhiWZw5uBf|G)F;Ph)LVmpVF+!>L37|em|8o>@sNB;|GC?Lril4le_O^ z40=!uwyHXJ1FZ&kBs{4djRO=eG3$x}yNudTH7seIXNtZXcz4FvwtBycEYj+GFhpCx zBinX*q(W1Lirv>G;$MqE$nmlzo31r>NG4$zQb>!*GeK5@m+!N<-od8hC&zuI`^)VDCwd4H{qRj9~}64(_Pb-WWQ&Pnl|H%V2}6- zt_tr{N@HIrm^l9c>(+5%dYYO=*|hVmr2ha{a~O|4j1LF;epRbxa#lJULPFvAKJ`u9 z%GW#ZhMprn5%Eop`!+4*f3wUC+mu&uB=>V%6^e6j=j5oO5t(kZ8Or2s^a;e z4ZZ0gV|VkW2CI;2#gITzO+_sYB@y~32bTnP;d7ibV zH->UDJMB8=@LyQNqd5oBjpCKaCN0Fs%!_qu%@%;sGRRS-mm%)jdvT?0f!`sVtym z_Tr)Ypq-AT95AinJr0P<?dhtR7;v?Vqzx`B>xQ}hcnnpRu=QJf_NlD4w>c#~C z2-E-v`BE|WxaAKTv8TC^9e3;SQD1-LRK`CoSojRV;r20+FaQuG|1H0384n+q=6R8fu(WVv~+}+vw3;Q}~i>7!=E7G`<_Gx4Qb^z@kpsduca@R@=m1vJy)#poSwhk0< z0PHJf?sG;dD=jQ|AB(l`AUF&==QQB1M30XCCHVR)7~P&wqyt@1i4Rlr+r?fbo5c4Y zWVSmkQ-QQ#VNXClwX2hE>?mQ>BBK4a@Ri%JmFrK|l1al8k4lqB?Dp;8-@Ch^^in$M5ieS*vHl8`b;(|mT{pc)a zK^Y#j!XuZHlSqO=r|27Bb!G}~uw2x)WlBg0x0ULCPZC;;DpWFxu7Tq9#jhWo&X2cFrakejg<@_O-(r`n~UPU3e5 zu6U|i3~(SFp1uuJ=TuBX8&6!( zx*4HirZ%ct9F<+CEI&`uoFa4LYTIJQk7Ev=TE+%vjuKaMb;zxnvOL+!`<_AjKxz@j zY;0Be5eF-toqwUF2XY#*@SlrjF0u#vyn%z;HBVz&ZpV=5Gp?EaqpdywgkbC6d(;QKp(HCHYr%FwY9>K5p7A*(DT6c&hQn&YaMk2jFO@#743Q>0y zv^h9!M2I5v7$08rCMIH({qIgU}q%Fc@BO{!IWV z!NGpK&_svwC#N7(=3$UW2O}M8M#3vXBV{Ikcj!(9H10*L zNA^jh`IvM$%~0+mMC+C0d-~G7iF%BU1bGDDp1k@|a7dV8Lwa;S)`*p1h}ij5amPPe zE>9^Vl^g++{uOZoHzf{7Qh(3$q`-)P6m!oMAdw&gw*Z2)iD(Hp#(Bx$(ql^GGB*Kx zjD0DsNd!0`k&~0pYOYWgL%;){{{US>0yc0)&Ybl0%~g#Sf^Qhw4*+pVB5YS9%{%~k zKmBS}B#VY@j=UWDQ!kW-_Z)NEue~HeUPV!W4p`*#>s5Oe5g@}7K2gpO>rLz=^*TxC z;h7xyXQGcvh?+`PLt?mr*KDlJS37b$cl~PZb1q?`<)hpa8(8z-6>0?D!6YEy@JQ=U#L9XWzEv3O&MI~$Et7;} z!wtOfX^vWf2mlUx9tW)dR7VUOuL_z=s2q-D;7jx06FQ+LIlf6gTwHka%gVFElW|% zKmrlLBPZ!mdz!aoX~v}U$@#NV<6*a1Jw5;irOY^YH(gUES9hr z;7H|{BN@l|b6LsQr4#8-gqH!lF>Mh%DVdMCCyMebO7cA#I~|k69DlUkPhZBI9f_Ld zK0Wy1dyAuC8N$T8{d4{m^jKABCU})y<)QI^h~+S_fMYzC1ZS2Q{VM8ebkjViQk$q8 zWcK!~9*0UQX?O5iNM7YP06JGSWu}JkS|3#WDEONmg`_Z4RacTyV;Oo=&XAC z*4TQSuHez(pYV-pms3e(kd<^|kCBWpKAzmyqUC)|9JzEobHLsnm&3ALE~0_F#Xwwe zW5EmtI_+RjwgifZmnAp&2?hM zRPYs1S-AG*x?@k0o%@fS&SqbUt!{N)cTv>XywFC$bIBVR?RMqrFb6EI0#0D5O4g`n(9)qa&|M@8ZNNi6Pd#H1oD@slTY z8Rz_e3Yx0%WJOur^zVv(D7o<*7JqKI`$|CaEM)LPwW&&N#XpZ<2*-vl{{Z1J@bqK*9`Um(Cn6~yB>w=w zNe300pDEbkeNUM#t#^YQ%am-4H>WjeT$ZkLnl0z{EYaxKIr1BKknDR7->QPfwh)95WfN*>Ini8;XVluU}ZEnZ>Dx1)k5_p?y61gX0l6!SEeGKKHXCFS+ zz(NNn>S#k!xPh_D9C7~u)~iNxRu$0-jg84CKGjQ6Uc^rlE^@yyIM1l3uu0rxYK!}^ z(SN0D7j#XBNHPH(ah!Y8y@hK5OaM>u5_A3(_e7BGVgSZ_eqCuT3J`8Xw+El=RG69{ z<`>|MfI0k6_|WBIc}5jH72~HShE=Q~IbngEgP*TzBFSh2k@tGzoYkjdTDdrGs17qj zV~DMT^SSMxZ+elpVi{m0fIH;S&?Zrm+~g7M!1~ZWVH=ej`mn`j#`O>lqiY|SWD1tc zk6{{Y@Oa7UX;`MLX)WW3zRUnC!T0aq@vNDB4GTNSnC_KE;CcEAQrMJuuAy|cUlAno z!3lS4iU{xfq0hf7ipqqn+B+v3!1S>BA2{Q`^sbBQaafoQ;I47~5B~sKoy5^$Tb;+J zd{EuO2(i?4#(jOoB(5nvM=%({J^uhwDLnybMp&bqoO6PHw9^FbsSBPJy|4$hBVJXx z8%lQ#jq>y(-?ajo10iK3o_p0?l*f6;rh4_HmBd(*LgVGeIl%t_8g1B2bChf_Jq}OQ z)Rh!AeWRbC`~?NFi(PqrbA!(w)loBRQaP@6uKe}y=~E|S?Q#!4%)*Rr2PUCNzDp9B zPXvA5b5=`N5eu;Zjt(hYN&pA(H&f5#Y70XibOb8$Pf_nuo~2lW&k5Lj=hmgp%(n~l zHLP?!TUEko_IDDqjHyUjhhOuWe$geXDl{8CH$wfNe08twdwn_LLfza~VpyZ;i@1V%6C5yJlL~v=Iy`z4~-VM{XzNaMDvJOs06rZJI zEKHq*21S97cgh@~qyb ziC75Sa@_GpFxH}|+BWmfc=V@hm9WMbCmrcDOCARq?M}raAPLSoW|6f^UXIK>Iz3WdmhPII`VL7B5YE?05`8{xUgp3rvy0WwQR+!9j2eJU1&Ol z7dGrwBt(1wL_xd0gU;n7WO^KmDd@?l^w9m>_!IFD{uXD1Z8f`to9LJ9_k4nU)EL}x z({SgJT)5hNuIu{T^e~lqmAhzr2tCJ6=D5z`;F3)nh>@|9JN~s+vLt@N+>mNh0mXBS zVDZ7HaV2rVK;yBYvYH-9BMa2z3Rg0=qdc*aK&mdn!bx0uarx6HmgS&FP(c{{jRdqa zAI3Ay14OE)r}-5u8888P{AfhI1wn!s@t$dl|uLmhsUFl?Pqrzbea`TEq8%q88NI-R__b?S$PWh%;j4;3<3HKQv( zQ}Tb}*MueTKZq|pH+7K@GF!3eV{SnQzhCE9hN)*`JVh%UFTvk}cK-kt{6j9k;)wTX zdUo8zbBQHCb#griC-ARoD@&d=Npia%UwlLGwWfg#9w6}jvO#ZZ1Q!EP8tL$>i55(O}7boqwGI0ncA*MFvGONALy(07ecDdl~>y$IIT4Ne1i= zDT$5}ZRj)FlUEQlryTXBkxN0F`kvis0h>FXoYj?MGE1KS0HpzPw2oB!;+4S^+44yT zBe&NSkyaunX#W6es^haD-WLb0CdMSPh9ZP5h_jKF^rGV{fYPz!9>3Cybe-)UiA< z-NyEp3K|z(tPi2!(vYIhIMa0rd>g2LWL&v0$@4(xoQ(9(wNzP!YG=^e2aF>TqXUvi z6xo68x>mNcrb~9tYd&jiR9%ju8J1zW4n=KFrOt&blQ_ttvbq`b{{Y1huv@uqI5o!y zb3RkzzlK+)@5LJP#mYw%37=EBjd$|eHzTc)?ej4WwzD-wenxwmyN!lUc;gxCQrL?C zW9Ie$019b=Iw>QLKmAmg(JZ72NR}cm03NhlX&(-i&UTJ-pUD3J^{7W^xdZQg>``KQ zh|Gj?Gn3o$pd?G4IQ1E%!7&xExyF43HaMZ#>M4#u#~l4JNP!%KoxQqH1&GMq$3S{i z&tN}Jz80d`cuz@(7{#1T$Ez;m`kKlIEpsEqn&Mg`0>BV6*18ODbK$>=UlT3#*yU*@ z0FB&kt*OSwGCw*zVdA^b7*5L@Ft*PFJe(fCO4HgTI&r%nrRXOMxki4Shf3$ER_A>6H^9-5nD#{L06&a_C?=xvM&)N0COiwIY!wVN=_JdAI_-~*%4xX zQ`5CFM`x}(Py>ez&*4B1=V(Ush#^0`ljY;EuBu4j#Z|V4l(s<0 z^yA*PJkF#sXFI*mU#$So6Zpg9Z|s{k(kwZiOnIz?aJ|;EoUC+Fjn9~Ei%5?0=Owex zrE)z_MhMCHgQBFGU8buT`^xJs2Sby9e-G(eQ&$y5W_-nxT zF!elCpcI^bl)y*X$A3y_2R}b36M_Z1Bdu?s0Ydj9|_ zu~=&y0hZ^EeW({Gt;PxIjAYOf6Yl)L=bk?fv;=k(s^{nEIVPMpu%_&dPli4#)3x@# zNF-MKG?F1)^YRYA=e2Jr@}5;noaV-rVJ_gO!CV`JN)u4~xb z`%}T*BDU3q-kod@nPDM`vO4`y0(2XSyXZ(eFr00=rBMk(_E>}~5t;E9-XNnqOLN`nc+?aH!GFOT!B;oWG4sjeLB@Gfg?)b!z&cBB*rqsKHvVjQDUf! z@^W^@GtXMMZe=YAVu9prGag8-Sui!y5{GFyKcx{xNS-@w;IREGQzVJQY;TvYMt$fV z$wCI;*Tv25euq0!XjN|m8BG^o*IXLT{XeE(BAdqAnhhlTn{ECoo zLdYbx3G0(qR5e84a(Z!*`O>&-Sxg?kDd>L+6D5~pQll%>_4eYE5nyDVxIHuY)XCTq z9OO~0Y)b$WA$y+nFH=h!s^THElb*(* zq1dc0e8NFLDBzL#RG>(D&4nYY9-q>tS`BJuPUV}-Y?U1cy$DQ(M##rfc?0QIXo*lB zeY(^=$w;j`1jrqGeREbWrZi4wyOEq=ENdAf-{wEgrJ6ONzu^g9cp=neC+2jp#obwIca$aX%jlS>D;$zyL_1Ks$8@n#MtXhp2oe zy9dLiSN>VEjC-&Ie>(E&Em`T&R!68wclKyrQ~WXZ_7qZ$+B2-}e?#HliE|sf*(H$m zV$GjV{}Z1?ix{# zTz<9A_Bs-=>VFUHulz?R{3AXS)2F|@e3eL489r>DnI4tp;vuQOHIeksgrZ#&K(W!a z2QghFEek~W4ZURUI}wWUDzACJQ9$eAo;?(QZ(Sy0v<1`=!F{A4{7I>$K8Es*k>XKm zw{p!P<(^k&Vh1IivU#sfy%IdeuOZ$E)TY!f^|qXu7i?;*dB)ZNJXQ57RYmo+a?S%M7j+`$m zMtSF`=M~?3?s)D7w}rGslT(Q>dX_o#QYloD<*}2{_FYDQD(c?dN%Es8tUFwagpC^> zpEq7AlesTJ%%tGsieQ*yjGmnZ1rtE2xHP8#Hh(H58=`Mxqq^4ZXNcRpCR_uti(?1Z z6*OUCOH(r6Ir&C1dVV$E1asAT9+lx6f+Y}x++?5WT`|z}s;i^z?}9f?4xtOSHWnL$ zcMNv_09@0=uXg7ee)31!`Z%cm^+C0i$!SeR98a6pQ&N)mPJ-&>b0lg<Y=l=k$ zO5o#S#{7bPM;Z02dWj(#Bs{kPsq6$m6#2Twa(_B}*9L`E576fainR14q6J174aYrx zwJ1oHisPQ0hqYMR7~w!|yf1IUfmlWy4WC0r^b#O+;YQ#HC$GQ%0IG!1pz!1XWEo?c zvk8h<9IrT_Im0YQ2;=#8riv6?5_*%~u4ZC~F4;WRV@l)=wEWC)#EyGXYUQLsAOkW1 zoB}^8o>G*oN3(jJ$DRnRq^xM&$8x!u6qUdk9@PeoT?=b+%^?Kqy&cPlLFu0S9>%1X zsXTF(`@;tmn<^-pNJ=R0&lPdlhOEGizTTdd4AbI8cUEDM$s}fkB#81r}UNEGN0q>d}O9Y~HJ{jHp3PqgZ7PK%X~q4Yo5 z2gMh_KDm2uXuN!?Nj1$pUqh*2bv=(l{gC`UV;aY<-bs3MleZ(EOxHBAPobrx_KP*V( zjDw1smPapA2RS$tnW7@W0|JCG;1Y5AeQIQY0{;LiNsuQxqg1 z83&#!n8%aG)BIkaN`%T=3ACJNr45NhM#vcTG+Y`NJBUy@{OMdGe0lp$O%27(jfK8V z+)y$|2T{5A0r(2eD^X3Rtb76DFlKY*x(&BEqESL zbtTt_E;x=@i62AUeGNGx;&{HdrZ$~*Eu^EBVn15AJqXyvY-fSfnhHat1Q7oKj%vZ0 z5==D+BZ>b2*F?K=dye1d+Oq02^e6EByor1e4ywYbyA!z{w+V*j;_HKtrDqVik`%cL zgCy_(9ZhJEn>+ij0CE$qCP>{w@IfFEk&#*^OKM2FqiCtDJTu+6NNw}x^Ul(D zW9!zcCVdaRKV#2`qek&O{ua8EWsb3*EPo2fysz`ED@UFm*J0r&$vYpZtH%}My)-?+ z20CYxRDePX^d8hUN!M2U6I#4B{DxOIcNKaA2fzzjYgu%wcLC4BR-Rf&p zGIcmy9&j;1I}#t8sP#0PGm{Y*cHjy~NSqUn4OkE3^`I?sRb28<1kxjBIB+=Qy;Mgn zO&GoXYeG4Ts-uEBcBOF_6m1#co+?E3Bwo4gK`jNl2gUdHy*sA#1HTzZ39)Q!=dIoY2o>skZpSF`92+qUj|Q|h@O zui!xy$ri5B*p>A-S0B4j0RR)ndQ7Ivz8}=u%H?5B12-O-&23Iv8Pq!lwY9jNo;-zf zl07QYv7DLcUk*HCejn>GN;%V~{mlIK$k=}ZNUFCmMe;QJpMOPl6!ERhExIRA=)<80 zkzRbG%Fj{~<{l*tjAsUW0cQTy==syblOM-Qe_oI=Yy_#kYHa>yy*Nv^F`5DF!PH2j-uF>iCx6xgoXqX(2 zTHBuL#?h6}n*RW3?QJ|aq)C5p!BLZraC3vwxoO4oSh-mrCwvOhCxcGA@fG@&lTn*` z0zZLA2lcN;q`lP>o}TTV+D7B^bscL1ax;{2 zxW|69t~(0g5KmsbQwtH)jQDL%aCrrXf2C2=dy(Yu4_XCcPz!O>BcSx68v_;NXX>4K4v2N@^Qx?vj}ZdcI!$MFw{H6I_| zHQeQv+jk4oBAlyO)}9}j-_iUo$O5X26&-(<<6N?-bE=&y9;c)DT(||73Mp$NrYgsz zT50iGC|HL*>uAQn=34_i^vzi<+;T7FNsi>9GsovrC7|879CrO`#@)r*INd;oXFPQ4 ziU4Db@W;L=6|NZE2nXv-wya7)L9}%|W|LtOaq=C;pq9quFd(1D-kTgpiFxCp%^|ci zzbB5A4&oD@4tK@5!ir(x&~0F}tT_~V0)e>$*g#HtD%!}0pi1BfJ$+=1yp z6O3%ZJoKgX5%=b!o7v_7!b#% zKbJ~nNQtH6e4KauDaBow)SoK3$?uqNn1UisyPvT7W~yH5xloTYvGP8vadD^@ySiZ0KhGl(!6%da>wY8(zmCg6;F8iYD*SkWsG4? zFg?3cja2T5QRpuGP8G@QOb1KPBDpiKG;!Wtu5{{W<1E)PIGxUP9JlXpI?_+jC5 z;t8WxQeqAB^MQfZxux$jt}(K?_I;(ib`Yhs0})1`0raiXvL(vp#ysQvO9eZQck$~%Te00+}Qjae-K0dPm&#b$<`$hY?+zv)^GVLap< zk7@vW9Gvt7ZT)zl1YEZC2GCga^r#zl z8e0q3C!89-QdEYV6P^ZWG#Xe&$MVOe064k(yyK2&CP;X1LH_{Opca93qf4w=TtN)N z+`4&wVePwv_<(BZqmLI-%R|rn74SaG!8fg~T56Nr%^+_!GC)Qx#(3tml#f0q(pI}I zVhxXyB`(9*4Antgi65Ll5cLGSzPY_~lF~a5#F8kPr8u7+_|9$e1P3IZMt=&%dmU7j z*|Df;vCpAe$1oep`GeQFse(3<}iq7TXeys-ukh)ube>d9*SW>UbV!Ell@9x#PSKd7vlxvS9_ka+V{@WR_`dP{*V-NnSxsm>i)`Vr}lm9$ln z&ZT4P?*aTku<`AXyRs`C$|&>UCzT`69^Gous+G?89Q>=o^UYCdi;!>>@H$W@xbeUs zP*d^+W7EI*P(`&Bfyh3U3qqKi$pNwT{3^k*bIx;<+JPr=4o4INVwE_+IO3&@3vc{7 zRNNM$n;F6D>q0A-Zc2hr9QLgQJRA)5z&Whj5RByDr|VRJdE=kqsbD5YZl;=JVu$K_ z8f-{LTyQ#6i;x=)!*hyhgq6y3+FRTV%NlXUKm&@a_7jTgaUL;?MDXUDHnFH5Arx&< z!Q97yKb>n%XEr99N5nTj8OpOos%cP74o}XmRh4tc1HEg^aY~sqKN7qld&R;{XCde2 z8BvdVeB^s0RtxO|SQyhaC?u1*ZX3AoR-{X&T>i$IMDt*1ipS`)bWdz1_eIt-3a`TVM`CmjmK8Cz_N^C`im*`01VlD%{3ng|-?FUY_UdQjcKZs7QDUcdcn zNC+f5au*y9KRRGh+Euq6q>?{6T&AV?qa_%xBoU9strI0=S}4hoG0s2F37O6>cdUHvF zj)kNjB8f4a4uZ3|r`VZJa6LHuYSzTX^d*dPQHIbl&#p#kAZ4{uz<>egzfMI=or+52 zxd?GCK=l5#9OII(uOmu8gk=i#slCceLrU35U8k=j@~TKqMTmCfss8cCC~m~XTN&Vz%yS<1Ncx}aBRD5ai z5Rk1f<8cfAHS}~gJZY^@kag(^4*juLBU)(l>!292j&OLcS?YDc7;|&N_23-WHS}ji zv^(#HQ+UGDSc-3kGf!`+oF|YL09&2`EzEY7?IdKg6>Yfn?fF-&7pdb~=P}?biC!q292R?zH?|J* zfPVlhEJ{q?5jvetStE`{{smkQrDI8IbV=Jo!K@?$RkqyQLZdcE@RR=l>aS9I#>X|< zdLI7(qUdMFdJV4@0K#Er2%?-$*j5HVpLWN&b|oy$(s1u5Q7)RvhKj z2l=_B~%xMHpjpB=!NuPwH!2JnU)BZ4VMQ?T&f_)Q~y;nU>Ij7i2v>0QuQN1s`rZ2Tpc6GbBrm=JJ3Kj%un!f{9A zU)NLb8)?$wMZ8tOl@dXYgy3f$oY&1yc6*f3<{z|fpxsw3o18 z1>{It+5H@RzG6Bd(Y8uEV2 z6LIV*TvF8T)+d_KTp;lDM>w%wswMfkmG7JKP90AYPs84c0`*K3y41zs+ zQi?6g!yX;j^3FYK^)hU#9e@H(H*=FyaTYcnHVlj((y21jxYYs2?*SRe812Z-J;)fy zTaE=Z45=~5%M2aB{S%`%fN|_U4D(LlwjGhlJPw3rjfRk| z0|jE7hn|^r4nCWSkMj0%DX?)Zu@vXC-ozAGEAw zA^DqvJ7ThNG*vC3QKs_KZ$LOX_N3y(q}{ zU5mSTZzIR=qe%uj9m70-g?2Y{hDylQN6Tb-RxOhq4H)HI20baQO&+Dq@st1_dJ1>3 zEnH>7MuY~*3^*gVdM|M#R+09u6!)pQT(;EDlH_M@1~bR69<*}}>PIccenlkXf%x-6 zVrZ_?I{+IP>G;stC1SF;M%g1|4nX$yrEnhC5hLwXEuNjmX*m@bkqh}q&zG=t=Z>At zCsiW(8!An##RF`+xs6*t!^r@5z^t81>{5Y2wYVm691`yY_5^WKZF9uWq20@- z`2uE8q_doiI1DNyE0&@~r}&zC)nz+k10Qf>@HJN@Els-%sTN#Zv2{JoDHfoa^q;{G zh-2ZVy&e3@ro#1niOw?08|KLTMQ1InYffB@{ZX~Jg8tquLc&2cwCE&_!N_G`2>x}! zDDtz?jMR}K+5s!n^uPT~SQD`c1d^lZDWnfl6B`m3 zpReUk#JvVME!1&TLt}!I&~ZTGu1cJrd~;IGO9R(Dbg63NPQyO<+&IluiM_`K$;WCG zMX>NO*PyAEgG^i%!2bX~l#MqdEwujtDg@nzGv^?5?^1zkcn`);jkewgw`~hVbeCJ1 zNXR)5_U9e?{#8(iGdb&4M?2i{ zU0yS|kU7qH>6)0mOKRtoYY_m=k&fSwHPsh$2_urWo%E~Nbrk2ykZv6^jl&P>J?ms; za_7aJDH`T45Lu7h&ZDPJ0Oq1D&cmp-XNxlokiBb2g~(1$M`~|DF_AXL+-Vfnhog9K z#wJPImIohP)X9QYGdx#rBfXHXL(M2MWuras_G9=>{{RVgtUOt)rgWV-w;&)9B;Ue0 z>x0kXT`454%qq*F^(V#KLYGloDZ)z*-Mzk2MltD%!ZN!vi)i@&0K~dlRNl+Y)LFx3zTHZ3!$3D*I?zh8Vi8?=zv^_Ue zx4yPp>#KE<;4+Ueu;Abxdj2`DGQ2f*J<1hRioavg!UM?v04BMUH(HVm0fx?UFbDIY zvX+A}&Idqgfh62}P=SaDL!VA5Jw%BK+Hg8jiW?j`Y#yeYCc~KXf$9BdhNQ4(0Q-0R zDac%;i@^8oLIg^@aZL%13+eUzDHD4WgSWQ?@l-^I0h7*i{xzxvBI;s4ygSs8(QY=t z+I?|M3v2x-0@|n<4gUb^q)A}_>+eaSG)OQ<6-ATbTr_j8=$%Tk`hq%C$y}()$ITkf zk^cY)UaHnAzvxqv@DMOP$NBZHoIOUgJp4@?JDc`$E!Y8A43EfHT&2p7IY(2)z92v~ zSei{PJl|SM(}`D{j;y)&>MQ5!WU*dfc6OuOr(z%YrH6<(Zz1C_9o|zDxO-ME=xz!}KWFg=#l9LoP3#in6Twr* zzZ`Az1i?VSywbIvNg+ zQ3qTM&nSKJ=M9qktT8dH(?Q zP?%-BFW(eeqLLqbiOaEza*s@F0t5#>E4zWf-<~ zYJe2=EgBrsn{-UtY82XZ3EJ_O2TNBcmYrO=B~tzB<|nXlbQ-bf-!^Fy&^+^ zefrZyj>l~KP%8>S9Qz;h`cfoeT%0dZ4FEBt9G|D=DU^vv3+;|;F*Z4lFnVLH0EU(= zj0|&%u@jDeT7VO8KQ~GTak%Q=l{cW{uz=^~JX73T4sJU3qQHji-gE8`=~7n2je>G` z?ZpH)aNvBtxzFKLg<-e@-k80iGL=!e`r?Kn7i0I2e36O(gmvBP#RG^jE0q)kgkV9= zdF?>b0iD_PAFUT8k%1(w1Cf=g$|JXMdXa^#sT>&T*<1SRdGgxsC0JpA=jv;rNb?di z@2&ipi~D0ZszXP_UN_d?#6Bc@L?x|kRNxMq&-hkV=g}RQT32^4Zwza)HYes`k?q#G z7RPP+9Okd6$75?H)yG8~XTKa(MG2l4uj-N%YXX0NG4pO1e-7`ugV|RA`;%LwLy+AT zB{C{XGMW6iu4=UH?;~hbzK5tbh4z0c_CNJfoCO1+{{SYHEJrf26)Ez)4_NTVocHe> zJ4p;Sl087Esivlsp>y;nz@8RQ4e60Y7ZbPz@-T7KQ>7lP-lMjMbpHS-!Sw`v4Os($ z&m?4j^{UW>+qmuQI^*7k#y>e690GrpO@(m)Amq?g%i^n{r05s-%69FyWd!=a z%l&J5W-@2x_lj=bK_QcmnTOO4^)lSv4Eb}!QvI&^AWrR%*0QMdI;i(LUlr>S*(+H_ zaIhdieZuqkn$8*)-lxo3rmHpd+shrRz#XdYYLP)_4s#&w){BY6l4;Z~5aqK-q;>uY z&?fPAscohr@g$0*?HtOcd^?Q^H1ahok^vP_W$KIvN;NfO>x>c|6pyc(L|zWE>tT20KLvWy=tKEsg*`~$B8iu+UfZt$blC=_zZtK=;&m~ zygA|v-wfWztLW}hc*r|Jz;Tn1M|_GBA=Kq(-u?pd?U#C5m>Dzx7vlrBdQU=mhi+gw7zg|*k8yB8>Cj{AngZGp@=5+* zN&-3(XK~}VT1q6z>N6yd_Hp|0Qa7j`21gjBVMUK)&(j>$B8G#&0FIgbs)0L?+<7aE zb5Y6+P;>J31B$RnVDGoM6bw)R`Hvs{dH`|HZup>{VM!`CcNwTD27fM;?k28Bxp9W! zM^orMe+rw0?0hTnr^hYg-9Xq`xf*4k%88yC`?2}~`kLKna8{F(vGSg;H}42T(4WU9 zwMIuRcPU6(M_^d|pdPu#Xt7byi^1ro`biH3E#zQ9#&dx~9FeBpAk}oaKjK+=G$lF! z*%_)x!bJA}03N(srB2YBgt~s2iL!zq%;o1TQMOU`A z#d`~$ho}5b@NbAD320`qBxe!;N9j#gOv+SRI~Xl=?Lhwk#G?KQ!yEuk)5mj~uV`lA z(KP-OzEtytxODYG8=u0og-&BR!p1bZU)ft^sPXOVl|6kcOOTOXNEdEnBO;WFMtfRH zgK#-h>-DE{B#NP5aPu;xazPyhHpZecpC^?dj)T&YkTgWVD9^Skh?20>Qb){ljPXFz zH*{Eq%&iVM7!|Z4MOoPwB#tPUukfiO@Xc*wojaD)`Ox_<(MDJ3ahgT$RaPs)@r)0x zS|oDeQ`GjR$9)O+?)ejf2V+eVwH>_h%y{5_JkZ3`LIrsS{2X`vDoaCF+@|RzZl{4w zne`2e)&I)-bu8-OG?N#(`G{J^r-Z zY!NO5EJx#?^{?n`6;jV6+IqtnZD> z`O>i?ayoYzssZVh%aMRU{{S4)xDq)ll7JEK?@5{{kFvCDnN^TtG4u1#fN_EN)>7PX zTAaP!8rx9|kC|uNj`#%CUd1nY*!ol9UxzkH{kL+QMvAcm(4Lvcu&JExTq*LNnRO?f zJ4yT_f$5Kbb3)i9sqs(8>?XL;FAIo(K7-0r{Ocx6RoQ>w)}SJ7PTo!s+pMP?{lm}m z6~|Xos)TIMXz>-$duXEvfdaQaqzu!cqaAI}l>R7W0UG0I$vE{q*U;hiJc;gnhp#9H zY2b7t)K%0qrg_!a^uYfBIIe1kR1F^qcv|De8nv#0W5kyX2JC&%I-luYUN;b^#{U4< zQ?`XZcVqQa;pc#K{{V(o3!`aq0dNy^vmRN_0MF9C7a5C{X4}~Md@U7DHe2;NonrIs znsvse2+UACstV4&m7QMV`Efal(d(Kn9f?!T(N!MKj!h+`Ob$A53uoe1hWnj^`y z*hJdGLU>e&g2(;SkLD}3q0WzY_&0eyuDkYV@#I_vh0(cICj~+EJaJx5Iay!&>UZEL z%K2Yk&Di#D6MQqZyWe}GyGBs_xH)9&!9DBBr;4-G^(tZPk1*9d4XT@8x7|k4`CzD; zGxM%621nsug)Bs0Q--Y>TIZTxeX==4mCz)wO!7$RFl)XuJi3pgJ!ZiZN75mc8|IZm zFzyND{#_|I%yT!Xg``1qsm_vG#!O*??<0)lVCJ%^K8H*x^<=*twA*#n?qrhzr?j(_ zp4>*6KZyr5SX+vuZ0>xos%lGei)9L`#~A85lixMy(^`{jYI2ug1CTHqpT|7b_d02t zdPbi&h$M={7~zg2<L_eU?b&kujaFGq{t_<5)?Ysq;Ng zK=^lK;r{>*-(6UEr^=50S4nLhj(N``@juqMan17S{cd{MbByO_{cL(ijWj(k#V|dl zu?lWHESqr4*N|(22Z)qqeut-tpqkkDx5mB*xbTJByaC@%BzaSMXBY?Hn)+H5l|#d= zPRzxJS)P9+&->E?vLSCq8-Gr<=~B?;lCja~%B;g27QhGauKG&nmtENVU*RHdc;v_j z3IRUV7^P^O)ML#npLFOyKTos0ck-Nk$J#nfsdpFITOD}MQ~}BAR=l#OP8l=lS|WEb;JMCscU&LoRF%eSSX=@7sSiQ&pLz@> zb9IoiZ6}e}KT1iL5Vyk1wjuKEQ~I7OM96B#UlhBC-U9$ji^Zs>ru%wXRD6qo);6NVq(bY!CyOD|Hf(IgiVq8RK zjzIz~{{VL%odVp9B9-T-KjctbAoB>qboBi3P|zkM z%&bIn0k@#540MYBKd z62H>5PV3}z)zVDsjJsC{y-Om)mgjbGat}0+UgU(o-d+@U`u3#sDJzd#<;ad!0G`?Y zRa=Fa$)tpS?740@{5|SpH?i5l9#^J>$ zR>q2*%&B}^qDbTHv$e?pZVT9o&Q*(8dyqxr7_N&)V*nmngOkYTAb&2E9?-bZ?sJ;| z0E;y^n5Ddn7$h=~yz(nQXxXo@Q9RoJ09U`hVs5TvAdYavWarY8chos7SJPaH`EuC@ zl5%AXfI!&et8|ye6(Cev;e3!#(i3bNW|0Ry9$vQ%7Vn1RWnM zkHd=9GI>tkz?jJMIR}GD>JoN4bc#!>aBZ`_K6w4e=O3j+(4ww=_4_Y;No(6A@Q$G= zWRr7RZ$EXql;_ao0rae@E@XCLW%gP2Cp+{i3$A%jU+GY384)V6`A=MPLkpp(Hk|h6 zsTu)N*~dZu0P3S+LmmCInv!`)!P+oBwC-9~0iWUOX#*q;`C_P>j@yI$s#_T#UEhEd z(;>SE=Zth1q3Tpf`N6E(v1B8X00feFq=5O~<2T0JZv({I2Z!Iz)}$DA7~2SA`14v* zrsU3A)%kQs=eDJPai~ot-R!SD#ErSx+a!{CuE2J{$h!4HL9`m{G-T~lpKIa;^SB()dgU)#TsIWGA1?Gt_iZAT6tvF`l@zOAH(>+fefXSs!8ktp{kJNty z_+r<=nnkaNY>`zh&~6}o=fKH7%C4@*CHtJO#f>}9vx4&(^5k?UxC}G>E1fc+?tE3^ z*yJlQh<@{9gwLo`iq*4N9z|*5q|`0sU0G013|o=0{;`1=2OZC9(bTdl+1;Mc`y=T` z#$Ob4t844oE#S9jxk&uR0n9@y80Q@_e+q7&G+XsIgR@8P3{8{3`U75DJyb}lSn8J?fE~8e7aH(+0*7yRTeO^a5?b{Yj*mFF~2k3G3-hvQp)~P)BQ^rlhfUlpv{ zeJ)GJT&=o^RmW8-dHf2K`BqVtnCdIW$A#MKa@<+077hfrt>q&QNKu{b_zIlM8SLrl zy}w3r;c(pZx1Z{FcHSL=7>30jQj7pe$vE#`4q28?y#2JDzg?N^<1x|0$Js95=8v2{ zB52b1Gf^6iqxpJ#vU#cx-B!ol{CZc^waKCLjq@{tmr{6dX1jv}b2dTfLvUC>4>=`X=*g*iPe~*sBytcXwabvw9b~ z%J|2{`gehJ=GL|6*u5c$a?-Xw>WXo9A?RcH1vPC-DLhf)QqkOBV8w0xFvd9mj+rEp z_zKah5RXU?jtKRv>~2KwjPuB*CRLJB{QA`qYm{DJG!anQqDE|vIV1e~P=UnE2Y<`n zfuuE?1e|xxSTr$6Bc8tfYFJ*ysQPrrGzfMuM{J&H6oweXe5=XnnsyV^XOsm{D3*eN zH&g>e=;d;lB!f&=EE%u{1^_03Bnok!{i!h6wcC#MDV2Mc5wHNxO;v=^VIThh*Fhz; ze_sCp(wi-6D>oSZX+(y=J~{NNV384X!5t1NK$JHlZ+fd0dkmaMbMns`xc>lXX0!Ha zcPcKQX$cP;5rgb1lu|R1KJB^31JG86Z&B+e20GDu1(@L3C$?%>TEw7WZ5?~jaS~^+ zC)Sv(NUOjH>&+{T3Ro}7I@FbG6Ra^v8+p+-1 zts=G=ykxQW{Y_aZTww%|SE=> zdMq6VF#ZwJv=S^dYsoyWYcecC!*Bp|jEvQds|Er4$JdHs%r}F9`O*N#9Q4fqC{VdL z=cNS17?vdV98e(u+73RVf|3ruu4ow?hXCh;?LjS#_dK4b+JsQ7PvcA^E?B8vy-f>p zQ!;fFFR@Q6gU@e4T`5@daWdwSnk}2I)A@F*vB@pZKJoSN(zLm53vv*gjybI&hZFPT zL6NQn)~7C6uC63tf7nt-6~k5Cp0ya-B=gE8Xa4Fa1fNsS=qU}JN#dPmHZMCiZLRSX zYuZUL3mkec1MxMqAZFR-7STP!nWg2Oi!t{+)|MpgG}}$5%uIJ96*FAg4QPD@;j4Ak zba|~Cn}`Tuk^Cpq>5t`JMMud}-`3}(sq@1B0M^F&@hpB1wn1pQ)LfGuFhYPA=0A;k z6shw)PCC^&7KhiL2tF}E<49uBb?5T+ghdM@Z3{5_zTE!+jcrnoDHN;o?t9544oK`P zot-FF#z^a&{uNOez%qI7&-0<~2zXP|x{4bCv9?IhJkZ2QNGGY|9X)9z0~;W1&QGma z+8&wcYEu&z0DxFiY!Mkb2k|t>dNNjwls6c{E&)F0k^HJ0fy{`EjJFv6w9xNyyn)k- zp~YBXIl&x#C@7Pra(%IiQ33*_FJ28W9>cEgzs{6Eap{gYq?s&?j9_=gR^msV{7<#L z)btCD6HDuP`>9Fo898(L4n6TxDx9doqQ2+L`d7dUty1V-M=-S;L{c&wGcSDoYb9Mh zj%mRApW$DF;qXq64vlKvUFI#El3N4+0A;SIZF8QXXXAda_8$%Xk`cS@GKBvCzDEB5 z>0Jq&+q3gq#hQTq=HuLv`B2f(1LuoF_N`(z#!yP9pFny2D;kGfHaWi%-Mp(avB`3C z`POK5Jc;5Q05jT#&Cy+=+17<2j4`%)Q@9^Z{0R_gT4uH4`|p)(8sCyL!8ss%oC?lL z?G&FXJgRwb{w4T=;`q1vMZ}LYGjvrQ2ha{HNxLFx#_s2=JQFRPHVVJEjmweOoMS(g zbEaKQ&YwiH-GX^J=hmidxFgtfD=d)AK3rEkk!wNP<=Wrs)><{MA_fm2#z(2o<;80S zp_NB-iSY!+>ruFqIbSiC+Y84Zm32pBo?02$02b&+`4wqc#!FM7&^7zt4c;cJq(7H& z867`}XQ34`G>oi$-SF??C7+J1GaCrC2#4=sZaQ(5^#_VeQ>qmYMZ%DBcq5u-g!tni zb3@e-BAwY&&riaWWhZhXLk_1MeDsTU zK7-MB0;i0h(up$ShNu|FTnzK?NMrHa9lKB@fZ=nVC<~1|46aTO=b8pCN|WD;2(a?x zV{qf2(t?qKPH=GR#>$bCr}`WnVsGiqod!jp>4ElpBA zAHry)nH&Ltdv@tr$=IZ>TG!@eD)5qwr>dNG_Nq)yCPlxFb^Qel+GeS769Le+M;_Ir zYFNqAOzSjn+GEAqa;#Uv+V(Nm&WkL69M$_)L&L6zqS*e@`aYqB@ivZOe1clo;BoC* zMz?b(hJ6o7(!MBsJni(<0h|| zNm$*}^qI89klm-3AyB}A4pfW|e>&=;sn1qM8#oPx18F%U^{$f?>^WGIxN=5#{*?_H zA+iEndlDD0`e!uBlPsVoX^*KKP*O#eUBI%Ae^X5pu;|n#H}=5#W|3D7#PGZTaqUX> zC6(Sn8`UiIrO2WVluDx>*Sg@|#x2P9;5s<}kW z!G1*_G0D&2-|JFZ(1&@(8|G|apHB3dGL^_dEElGRK`2)m@x<&`6{{Zz?wGC-AfVf@VM?I^K zqp{l+bM7D6li|SAAU-tJP>YL|D+;oJRXZQVWd1erIo3Cs@~`W2=rZgzmEZNT^)|n$ z#|pHg=JMCe2eS};ezo&x_MxHX{{Ry84O2wW4xy)8i>sD!zD`a6a6vqE=M~?VB`II} z=yPT--M97B`8QVhm+>#eD#F^!?D0s70gfY_C-W8cFq%u`e5~nfbA<6GjpLn5PQ91J zLSiOJrIXCh%&Q`(Zlqu_T+o`m%~Iu8DttJySmL>nm>G@E#v_o-21y^zvcx;Gq1@}W z!h+g<077%ql1pRy(xUY$qq?!=dT>c~Yl5VORBRuhUO%07y-|Z)r>uAm;bGM@v*rl= z%gBp1akQ+X^a8kXbotlF-we`~{%7bUnwF1kB=FtbTf*d>%e;PL74r2c$vbPg^giA$ zHZzk@(5_Z%DK8>PHW0;FVbdJocOsoCa$4AlPCFhA;_>0#M(*1G08Vt>8!}^o%HSN1 z+0Pa3VPe|U@Nvy4Y5i_^>gvZ>YkNzw6?g2AkKtYTCc2yDI4P}uXQ}v)UDIvt?KB?^ zN#+$R7%TFJVUSqk-nn3#ZJqVzl1tF@?~f6g8qVTOlP;2nKBhKh$KoD#8wCF}YI1sZr_anp0Omspw+r z8jLsLHCtwJaT}_p<|L8H&QC%OXEd6#G^2P+L+*H|IasULFa6DY7VrvfEu2=%}qpTiaNbrz?;9Z~Ub#7$@WXIQ$pQ^%M<1a{)K zryf&|qq{DAHi52nNaTR!!cOb;+Ejl$SD{Z-anEz=Eeh^Qk!~1m$mK;vMPlhI9kaS# zL-Tj}xc01$gPhduW4&1|u2eK~!z^+m42&@Ak778eoa|cM{MFIXt*q@K$H?~4k?c?Z z09v)(1Ne=rdxFU&gY_eFoOL3tB2zN;Br?GpbZEfO(DgM!i@P}VDIB1I!Qk;pGRyHg zq2+Qo$olvE>7{ci9W)aO5Fi;RkZSos7T`tRNC)O4ACRFFGo-fM2@Eo$Y2)8Le;Uy% zkj|$~iW{;bn~-=OqqPkY%w}tz9&J6m=t*eXf$d2ZYaE)Mc|9^eDxzJ%qyzxRZaEnC zs<{&!0aJxxAkX<3 zHJ}m^w}O78(&Z8b%A6~Df)7F}8nBxH(xBNM7!HD(MG-Z?f4+rt>Dq}hc}6UXzyvu5 zrf7)SGS9c>$3a$%)}xrN&=_R;)d`|EL>Sr9m4{)jO7Yt`$fP0{A-+yV4_|)2%7VED z7Y8A^>SzmckP{nxzj$=#x2;mpmbs5H_{$O}SM!nR>K;uOi>W z7$l!TS$2|V@r{LwlReMPk~S|nsFhT7Mv2K?{6)6^0GBvrbBq$?arCUESh&zf zJ$dmHQUpb4s}RRt{M4$B!*tWo)f!1oM)#>xHF+L|qFgB0=){a|+v$@^rpA=rneHA3f9$)T zw(0HVvdWU7AHu_~KOla!l(sg5*5~Q(hc&4DNv2xsa1o1$!F3&+ec*o@=bAfIu5R_@ z`c`%*8b9JE@uoGf#`YZ45|GTChTvq3ifFqG@4@^ju&}Swk4i{LYN#wpJY%onR5mQ* zlb_O+iAZ4RRQgoj#>j|tD?vm2z6t#)*qf4V&Pg;hLwb>{dC6Yf{V1`ZZQ}xl$glyo zmh|G1DG~#YgP!!+GDGwHJ$U}KhXK1worp3`D-?Xk@xSAhzk)5~(0n-}O{+SUl0nMD zk^K5qMjXuLuU$t(etz6uTwlu9*K!#ql;xef=e>7EHb+P7RA5C-Rdi`h*wwn1`&!L40=Q;C7!Og`{QK9LFLj=pe8}?cUe9454lrwa zaxjuP7_424p-v;fF1?R6q>P~TIDIDEcw1Wj&fU7!;34GauRNb#YfIf0mn%GG_Svna zbn2?i0s0!!EXkBAgcJdPPja$~0>|3_0JENgx|XW?+@Nf*whE;G0D4B+KR|0`9$4Jt zto1(XvvipGo$-u)IIONgpW>Y^Jzq$?f>kVIQ7Qm&hEtF6sBt11GvTdv%_O;wDF$;W zQaX3RqDw=vn?6CiwDMx3IoPe7FUE zgc1#Fv{{>auaW%|>Dv=FpCmlM0R9%VC^Y1||T+~zwdW;UWL|B~< z%5j|cJ*gpXVgTyeQZwlNw48xNIlJy_%k`Lx9&c)MHX>`!m zpYHwSdc~FO7fKDZqDY(%ERKgDk&mr?9vYV<5?fh*M}vu|>P@%j`J4xiv}n9lroNfM zFBy3A{opq#{KZ9hU3vRT{mp(ryu2dsF5`yZC@Pai4jJl~& z`3kylkrxITaxC}P|>aqOcEr>5BFpQAIOj8OBEZW%&;@vKVQiDILKJ> zTroT5NUlKsblb3^ai0)ABWWKD^rzQ#`BXSkVS_(3j0fkAm6L8;6y&0Or|^!`S@{0| z;we5Tc-dKW8!3J~7V~JBlc_vfyMIs{ty$!Gqp_Xu6W^J9>=LY;hFH^7ZNdG(=NZ zBHl)M{{TMJ+7eb5%smHB@T#y_aFmh7NQr}-@_3@mcNk?Yj%txIVgN|vy-_w7J%Hz$ z3An02``suTMYLr&3OE_bqQH?VkVfxOKohwD@lYmJa@&XosBctNa(898B7zbc$9XMD z4QPB`GIHLXshwlGbm!K96Oz0ElbQgqBIr+Ew5|YDHz(7j2m?LwOa`f5znw6Mn}$z7 zXd95HxE<*UyN+IQo-^w}3WFmVG?)N=qXU{r1%~9{Wd8u1QfLQk9sMW^k%hq9*Vdb3 zh}>f%u6g=W8&@1YZk_n80>ZamYEUI%!3gAbH8N#1J1y8_9cWBRSWvr8-^|e2Ee_g8 z$~w|Wy^tPx^c2Xr+-HpAGy>2HpX>c73yntSj``>4Xa_5bB#iYK(3+6wK0q^+IULm?5f#AW(wGUe`Bg;{#=Gq4_|jy95sjye=8>RqxC_pC z{b&JsVS&X2)F3AW2K?#RkR*Ue=tUx;J9Y*+J^uhPK;Ll5Jo<`g%1+4bJU`+4TckI7 znGQJEow{}Z06w+X9Z}@edY#O=U7IG;8g0j6)7rWstd48lpAr7m%WbCkdhY8^V6Lgi zQ;hV$MlMCWYiwYV_rFdkxYN1l8YPit zSc33J@~j!9k8$vg#5x^~_MxbdBUlK@?n?j%>t1b2T=g!$txnih<%Pekk21fzOX4r! zpL5RTS$YtwffglH_eQ}EOtI*|Vr$Z6WtoJ^HVYHsdfJfn3CUo=+XCQIXvtuO$ z{opf^Oa|~c11;K<0i*@SdG`0JKsb@k-^z=C{G0-LIXJ~lfRAwGu;!@%n*kj1NAfh> ztQNV@&2Jo*7UtY#eq$;B0BrvNg7Nv*XAONB%{XYJF`R);=CrEx97l2ZifNr8m0!J_ z3bJH9M($goITbCGh7 z)O9P@jQirIapqPqs8Q3dH2d3`Ue0x37;leo+=r$J{cFgm`6crvFPR>(0<13_aPS0U z`DVS!GQ3g4QaYbLe$pDbv5QN#Qb`fXF;88@DE$G&b!`&}$5Zpe;wG#j1jWYUar6}& z+8aVTo`2xYJ?ENhunR0vNg+Q)HH4otJ7TPlIq?x>h{8L9bKabtim||?WyxR-X5?!G zY1(M=T#VxiI_K+Hx|)rv9UJKu8bmE~bm5%`3J4^h@U0`MoTNH`6a%D7;r%piig}iK z!v6pk!Gs^5C+SrcVYi_dhc25*2keQ7oaLDG_7pu!jI4Vdh4n9Fw~mvVXm z&=1Rs=uxqWLdQ(iJV|%`o#Cq)^$Y0>Fp32v^d}_r{cCD^nYD8c${V|QnKfiF-Ykx? zN8L)CW9!E?Qqa$>jU_n7!GcdU8(JzrLcLve8scR`*r(>eC*?^!2v&|4isw*%Dw0EJu83|>h9a7TJckr9KD zk=OkH0EIHg9uE~ZA;^&Af!Ot=^cr^}U^BF19qN&rRvr&R22Dw-V(i<1ybu1pHpVQR z{G*K33A+G15W}qjxU02sfsku7?g)$=E?c1o@~s5rVHoG->;U~L1$&F`J!-?0e&Bx+ zc>HTSl@v9YW1mx0fuA9KdhsUfzwC&c0wpSW<2_Aj1aj49#+sb%JD8w3kC0e&t{N`qpmwvKqd$dd zCPQbO$`r`J=jJE$HOoCtieuvJgmleIMu(<&Wqi0EQ`e{GSlFcOWNTBjueC_Va&mD^ z=qudd^@+F&$gKH?V)R#YS~z<-rG$>2Tb2G* ze88f59*6N`#$F%C_Fl1Y0LRNCmt1`f3U(q?k?cAL?OWozAKmM=*4l(bZDPs;Vy-pp zbI%H%$D-JN(mol~w#DKdB1=+#iW8ON&{g|enJNt)k2i}vJL1bPwRlEne=abyM%`29 z`APcoUHA#}U;6BM_^K`}XHr#L>`RLvSwMx)J@B(ZF9ky)x{t&a2dkU{CmKGmXu6Pp)m?^vU$3hO|1b4C%5teNo2=@-BZ<{VO_*xR3aYFl(e%JjZDeYbz=gn@!iIO)Z0 zS90l*{5$Z2_|L=^+AcrQ{LeDsfH+v!mi+n;t$3NXC)mON0A0^#0ZX0V`sjY4+B_Ov zoYv8*#R{lM!i)icF<+e4sqG}$^;Dvx8zY_6+s&{f{Kh6$BcUKRX}H-NqZ`KlD~rQ= zLDg;|SxXlCIDfh3sxv0&>m^4K>!d48zk%w_KU{{YPS)?ba6$r{BR;y);(O3Wkk zSxyO6AZ^>v*1nZt+DQ57NalP+@s3{+_;%;QQi!CvyJ!R@2l}XxBfbddEb2>V+O=gGHCm$8wx>C`^XHaEe#M=SC-JQ1 zO?EYnR?*Q}>yxV)7`Ap3yC=BqS-LB+4y)+JU3Pr$06FP{?}|~4jO8wU%W&VzDzv6A zkvYoogZ@oSmB?$9?0h{UY7-^qK_%@9h&MEMog13bI))OIQ%QJ zo3S*`mqx#~(Da=qXjV3oTU(i?4xxh>jJrY4LBJoCMMUIZscQcA+Un`#xU#o(oQwrf zHiIBck44Yp#b*j_3U5mznel>I%b@9cjl4;3bkjI>PK>1kDIY_TT@;ryDK?SrzYF|Z zr+AM~k4n0hPqtb{h$C!mDu54{@#|g=Hw*0M+C7XlPI%k4=I@SmC7)Ee@TIH@WwuDC z1afyW)?pz!g&r_zQ(o*&hGrzqqh`XGUjgMCNVIsqHZbm^6IbUMVztX)b zYeS80&!n`u-b8OC0{h7z_U8@yb5T)P+M3Yot)=@rgplC~82a;E?HWbcp{Ysb7spkK zR>=PVWpmHxQz&V3MPu`ldq)~Iw9w>CEFvgJsED{Ys=kFiL?OgUG2&IhZM`#&)vQUi z#~ru3W=s`iF~7I@{{R}cv?VJXboRn2S|&Kb;QebfifnDPip{aII_9-PdYfVyEe`e0 z(lbpvka{MU0_zdV>Hw8C5OIzO$;YikcL|Xgq_mjemB^J@RUjG`5371L#Iu>*-fyg(LE!fhL=ptYgKc)v#;BS@^6Z-UvF95&OJ9DYX?CySebqfzfosFy-YMbjoM;neZd-l3wSt2T9|4{a2m-BbL?sX}L-%%_%N z%GQLmM{mT@yK#atKBl&&%&Mc&?M}xS=x}(gEprsjj~cL&&r6xP1J6q)uYZm`I37l3>7L(tAIL%q=^C-;5m6i;8!FLn`(gWOb9H;X?& zzh~`XZtN~JV&gFpGAaJ+92|W({4rR`T!gt(;uj$Xr0CK%$+*+pc@~za65W`^{NRh0kCwys}z|LJF$*4kItnH zJ2DbF`V7>`T+;Ue)G76zDVGbBGLIQQa!XjWed~5!28~`tR#6y#-9=Dz8CPN-mT%_JoPG$$3G-;Wm$$hf<;1l z*qW}ye3DRe&Tr~u=TF>8zaYax#RjTiDuDmn?cu3*h3JK9OMqQaAjJ@ zs6bXkEd?uMU3ve9LWP_~vkByEUGoGIG5 z>&`J=b!B7GqMeRERk0hHm;yN?G)3qsMDq*lxh&dQlkYMWKAh+J*F)7D>vPC;Ic}ts zTsh3Ko*U`XwT_5$XAg0DtkNygA24_K{{ZXNMH!}K$Rli+&p!1?2pLM89<;!o*x}a) z9MeF4f_}~sv^quY@!@2-Nb~;U1N_>ylhVfxO$zgowsCgh0o+g!mH4$#OK z9doqerf$MY?D#WSyL-(>9Ihod3!HW=!!=v0oe}BD<2l(GnzFWW_P|}1`TE~z#FCmzWasmF7>ii{9igW(EpQ(X~%O2*u znQVH?L@r8?!jdI{L5?y$l~*pnILjVsT$qyg+&T`l%Ofe*pK(RVWT+Y0B8+92fB@=G zr8KT7%_MvGfIc4!BD&7DxtM@riGae6pr6pyr(?{kTbS>BXX1-r3|K##hq;*yamW7m z8ON~AWhq?K4Hl1)rftV3sbbtyN1!g@!5`<=i0CU4ZrVO?dUqv67bM_xp)y%Aamb*O z*pqPtb>vovT(>SG9^L68HYf8q7#TcMV=eiBeCH*xOb03CiUnfCa`x?t8zq+z{J95{ z>q(+gCoSpJ^`*AJ;@XuI|KNHR(w$%dKhbI_)#DaaZ zM7{N6S{~!M_uNv)GAz)rWOWRT4nqPm2(Af7m7b;fk>}qNJ}2p)3$)Xz>W;5@B9U)x zxCU}@f=8z{KNg6GE>rVb>rmG}XkQoG={GVwvRuo8ppuY64@?dR7!}t_k1D%3r&ZLI zk@~aYuMb&xLrk{t_Ku2{)~F*=1~+4?AF1ZCt2@08)gD;c8+)?2KBlw1!3-zATyaUO znpj65_37S{b_7t7vD5D!aZLgo{0-j5lSNpl&A1gvm`jO2>6z<8HpfPXq9G-xECoROdN#XyS*Cnugd&;)|y zXJ|a<6bqDUw*3%~izJ#)bs% zJ-Sq(v?!RU$>~8Ton+i{IvnPz;L!EpoF0a#g4|)d4!q`*8Z4Fz_j$(@6hP0>?SR2^eo4l%|$)h0ALH3~^y^fnBaIKdsd zREUUYCnxGEz(eVp0Am7p9<%_yUNGEu$Kq*R8nI*y0$bLk1SbTB=m!)4!OtB#kwDoI zUr%}lwiEzxe;iOsR}_FxJcb-lRjeuzoDs%({b*=*9#v1w-H-C7QW00?>(+rHUAP3F zPL(LPu+YP%G709BAu-PRIUEC?X`~mp!uynw*P3XXYA_NwB=w-FGCje0Ju5$?h{(ayvp+3i z6y8muTTSLzhYr{|86^I6RH>$gQKzZ$Z;UKunPs0N%T*wLc>PUaozCX0dFGyv5+AjU zCNYe49jQliNo-GVZY0a7z~lfs3g~R+J54&rdFP&g3YVcvL(w!{FucmZ;43NjJoFXE zH)D0GI?o(nRxh zE6|Iv%FQI2Rb7k$Qg}YqqA`?CgGkk+wUuXq+Bp{l5O7DmCb@*4E4laQ!QYKBc#bIi zH{z+0bpSC8#NbKCL!SMAD&VV2mt)hz;yJfIl4aY&@^U(QS1pddVa2wLkD&bNq)TIX z2RZqvFbteyAb={63J6^H6q*4aDssGc#S2gZ;j@#|fllFZyG{UO&<<$a8?mRS>OWwR z$0F{xe1~6Q+=`?3JT+r0C)o=_4d~7otj)Z@YN{gIrG|ocm@hs$6C(7;^-P)Qu zDb+2456!{r&tsa=8>iSLTmgV^P}vDrBVyfRSJ*ydLbwM7(;VV_sbX`wSk$z>iWFJ?+AI`FZ)Yhhm`Ip7o zxwp9%@P%Wu=RaDxM&-fiaU)c8&edLhd93}JqIMf5sdFGIWFb#w;+m$Ao~06AQr9%dGI(D8U$j47#(z9Ymqj-MM+sq)7qaW6>n=aNp`#`YX z5l2PG>sYpJO&?nPJ@BjxX4;0O0!ikLp=4Z)cdfAT>N<$Lzp~DY@fQ6qG=SQAZw)@h zI~aEW1J<^0Q;u%OrTkUYd^P(mcwM|d@Y_v}U3T>hQeA`$>6`-WPEK*3PL%2B%$BF+ zXWEU+wC=&(*t`3&B%0bO2kM!{Xg`(?~#eG>ashWCUJM z`ShnYX+j#Gq*2C}%CJBJ#~STX(}f&VMIBOo2jpjp87YnjfC2T-(x?*}K*1@~prY0b zj$D(PB>NM}I2;Yfsi1LI7=PN~XcUDE2h6k-m5`wK9dS^?A`G6KksjHGgRGX+MFk_&eF(QAn_ zo0-FMM}7?(8y(MwfK38dBL-Wu{{W64ANw^6a|tt@zkRXDN$9Q9>6+2(N_w7j=W{Uc zlb_DHq;@R}FyN55CqLs^T&AviPLRe6LVZO~Qd+UgU$J*B*X#a$sj`%8jtcruI%0bP zinN50TRanr8E8S1fICtKScB!u9@GIg?Z*eVYE6k2)PD{*p(3PD84d_v#)}aXV%hx6 zB!`UgpK;sssAFjL--Wu`=vuGYWjk%}P{S@dXQ)4c$VezKb!0Y{KqLhn^obJfM z&tB9Oa3l}E{8{3GkMj|@JY%W){{V#sO%OQ;k4`BhO@?HQr%wL>r41S_1{Yz|?&F`W zG8?ljd1HXb0FIQ=C8dkY#@?R3w2IifZa^D5o)51zEtL}buxx?=3;NO%W%Ok#djM)= z5k-$M4p%rm>ojR%Y=rrU>6%h@2%%+sG3PF)IUeGnJDU^8FdI3h%#tKdn~xp8DqzIl zpM27K2@eMYBy`0Hb{sk2(+!DZM!9I=gmPP-#-+O&MO^hJ5oua!f<^f)%w_#qfIlzt z=iahFUs!GPj>OA3HN@Lubg>ev0Z_i=y@2mc6@8%Gz%+wa(@ihT}=s~@1gYP?EMY4g`rKU&lp?l$w^r;$cb>jsmc7S z;WMhPa%=kCpIL*Y$sg;;_BnOPo^-I3|@VD~@t8=ZZ9wG6USBq59^zREwe6e+K#L9n!qMg5*lbZE1syes*bUfU~R*&`O ze62Ubi(57j>RP7hm#B~C9)kwHfy<%bIUN50*;7HgbkijBHm(e<-2OGZS27`LSnx&B zz3~j1iC>a9WDUv>xAyCaPA8DbB^&JRz>eHp0sLa#)8Sz;pcR zD=|h%m^#PXAV@UbM5%I#D*AxR6+!L5AFXXpCXH)!dq2R73r$1CT6-z-#8J&G>z)XW zM$kQS#AorZH#A=D{Lf1*k2m$`dv=p2o$)VJw7S8P<4=*Cp2V;x@z_o)mM@l?erxhI za86I=dBig%hOcl0VeF?ah^L?ro_?N{>{5KuPtfuz=_m6&J3`j=yn^cUH~wNZBLQWB&lJQ;C;PBRo1iKg3$k_BVy^ok$W+ z(A%fg&3P3gsy$fAC8_arY=YtKxhHl8KDDZRx*0fKKbh`-3@nyy!ctWcQ3HBzI2Gx^ zt0T`!%=fJ@OJg}W4HE&h`jgi*r>V3~ziUj({m=`3m5W7K&c9>j&Q3q$+F|(Ol%AF? zBlFiw)CQrT!b#>Ue=PcqkdP^*p`#?fh+F1E&N2!5@%mLqLpET?D_Kf1GL8q}YfZ_$ z$hGToLfoM027exvI|oyow;pqH2*YqaF-7iaW6`w0x3T@1{%1UYg%Ns_CR($+xzaA- zvXB)sGbRt9Qs15hX=|A_bW=?fpq4mh82WpP>WVquthF3sY;9~Y#+8&^Zd-Wf&*1P<7(7N!;& z;E{&spZ>l-3b@APv_@PG8=iVoVPaNr6t6fZAB8mRG8}Cro|R1#YZ4r=%Je7o6(d8+ z5O%j>IiP6~?%E<}jI8lt2Z$PV(Yby15Bl0@1*nev)FH(&5vBt9{zs(SlwlV6%rticK zE9V^Cn`gZkB)LyC)v{dY?)T5VFvF=wJNu$ge{>?8LQ-kY@ zBuYnRVKZAgyhkbk{b)#*ta{gnZ@02;;~3}h=CYoKk$lJ4e*pFIr|Wjs^S0HSFy!zu z!@XqgbW?U`-)Mn26`MDcxYDHOf8D7Bip`QSRKTv_52!rWEY%5&uwLM1kx5)c=L|b` z`twaYiIXwUL(NhUn|TAJ79_4>Il&wgL43mXCyq~lr7M-pF|a;Uz#@}iwIap|1JwRs z{;Fw!{{SdZ#K)1-X~^qRn9&@KyFXHDkPT1)IQ6D96%5fBz9G>Q#JXkXhcbeg;?5khvBUVE!;$!k z+>{F)%JQxU=~Uf{-1CnPc#i8snCLpQW-!}#6P$MA+Jz+{S;YMw_*wfhMXXs`_^ZYj zs@6A3lR*R^@}vSc9-NM%v#RWL(WT9)^@RTb5A-z9r|_t2&AljYj~$deKuLF?w1V{GB6{iIHd__WhkFMYc}t3J0@`&@$J_&*B7D3%c;R? z_S;6$jxaDjwX{Vu%Jus%CP6ZN*)o3-*0n}YbDAR*z)Ap6aC1N(qMx&)pZG<$$IqL0 zDf;11Rn?WOaXrtW>~0wwY7@}ldzysEXLsT2rIPL_jiUW8!>no-)?Zu_!MjJ9F#JO()E*bV;560KngfGW;#^ zZk^(|S%s=fBDzK6d=eZuIpg2zE3yljIQbZJa!Tj#&8_4*oxECwi-)$I7FgYR46ZVy zW7@oGkh5v@x$M%Z&aPY|A17{ks7pgu?m0oh1HO5ndm)1(=}U4D;>6&3j_l^T+VXkK7sHLfIh*uR@UPUazNP`&Jbg-*Pqg@I{3Id>7t;r8{zDn|6&n{g^P}@eReR41-p%2? zLUy^*;&zJMlaLoDBl8BgQsz9#!=*PPR^?puyy)7SiJ?O_+y!(d|-5+#zCz|MNmoy3Im zdYtDSs;mS2-J~CSQUt)hGmotZBsrTWj`YwER>m-W=qAPJo7b=Z0A7JuvaCt;;PLp? zFy#%|&$S|&xd~&>rYg*c3m>>YIs}J?&(P2fjvR~*xS$d7*Zbm;)H&a9Aaozjk^(YM zJ@LS%1%biI_7wmrWdyh5Km#@~1^~xe0Ipk;>&;kOsH6zS)#*@H;^5$g@6xFX~ z_kT)FgH{?r-Ja+F0M|(}qBm(LIlvjAvdIS33%8G2BFRW%jP>i!^P!YTR1@;jWDRb( z&w6O9jRTInde9_19!UDpVe=C9;(}Wm>Ilz#P{$H5olm_>(5|D3Zv)n;0}!C-dJ3z8 zW7T*B<2=-gNLRt>>(}W)F%Ulho^#fLHpU0w?y6&mzGhgm^#}g|uTo2Q9$VLpU;+8n zAuL4=XRjtx>o$=prH*z!Q65*KL3N$Eg_1;-?wnf&Mz*yX%e@efYWZlIdx zRsR4-R0bAhQb;(+$>##JalXfyCutrl`$+tIwfKz`RvKb7vIy2a<%h`{{{RTBd{2w7S_kkoa6Xc9Dl%x#c@sDoz!XRbMy%kAsX7OYvia36sRK=qE;$eobIXMj}2=` zS6I?*W-Jdo04MUTRaUy0`#7Fatp3fO1JzljwzX?HPCwNX$A0FuScZ%xMKjB_PuT)B zCHz0Eu2sRdpVL-ErUr?gWc;oJ|VJ{5T9 zUMm-bynSOlH?gkBt{Hw;+CPZnuNB2tMs`u#Q{B!~WFDMxS+i712vNswzVwo~$np+H z@PS6c6Oacye?v~-D|G;LIX|5V3}YTgN~Eqtw;dnMGx~bckzhT#Dtr_aXZB4jAAYaBM0;};_P)&n7och zPfDiFgf|5J?)4~SZOP(1XqgSj!G{00y5t4idxsrdc-K*;w#J=dX+ zB?hH(RC@;?S7eot(l{M2NhfH>&Bt2il#O7IO7R8C=$;;XRqH2F>IeS-UZM`=)@Q~# zg{9>3$$2D96_}jkj8!=r!DwUocsOn-xkHhCIQOK*b9YL#Ehw9B%O5%QJ%vkQbFH^V z1aBE`e-YRD(3AP9-U{VWmaH6c%1!f85hibBj7y*>M~n|8S^%t zymBiQt2U*f_h*9q9WJ)f+QJH1#sZQLTzXejebWl{Y4Ng81Z&6XlY9 zyHzFE1Bs+?@DeGmaW9{oQ$1oa=B4A2oAoicm$pc1fy1RV6wPo)7CJe+5>1ziyi zLHsBvYh>h+p40&2=sS*;HzM{JLBQwORV8rd9i05j-h#*V9FJmsr~w8CPM_gHGIkzY z9G(S0)}wsP@V@xPSjFeRUIhem4lSO0dwp|RvXi;w{{R>KLYf|jBtZW9<@O*0uo+|Y ztzwL7Nc`s3uYO`!?s8iv-`Df45yjN=%c(aOZq=eeBy)O{fRKyHAI#Md)r@^ccoE~}gsFAD>K+voI*(D^;5Pf8>qoQn5`PQidvi@3&VSJ zT=P~t7O1svoaH-l&*NCwt&Z+#1Qt=n((7=Pf!QSe=p@; z&Kj>e)bVi?xf#?)5Mo)*aCjBkV3myks@PN?HhDix)TA4T{{SGzd1pYWpPvAc2!_4T6WLx5sWY6gWXo&ou?IX?8RTVl4@!7P4U6OY!5naVe0 z%O>HG)GjmY&;I~kp$ay$AUR0^rXQ%7h+5e-MG)?O4bDKOA%)I8-v*XG&DPty5lUr zU*|~xtCd`l^JDciFhheJbQ`%m9@HRWsxc&}8wXSMp_bBU?z|188|%Y+FA%`r_tRsg zV<~hrfltNyh??Z-w(J@tW^&o#n38{;Tw-STID7W}+4sOC`e(P+hoPhn>%a_V*YxHG zcE*-MeS{Cs>MI$$l%0>PG%G(fR%u36IQ?h`uBU$*?Es&x0ehq5Z`#5ylSjQAV9g1~ zC#taiW}&l6d!LER@KxY}pOekZnJBN9)i`TT3Q5i3RcBRnKMxXiHx5LstSJxzAbZ zHyV4FvvP%i-S3L2qgIZGN4&h%E+j`|Be==qo-3Am8MvG2rM;9YvjQ1MPW^h)le!`3 zShusD>3q9%-MI2`*FRd%nI>FKi(d%p5@h*o7-aA}bw8Cus;*3#(^+_Z(La4Q(~j$d zjzwiUs29A;3*l|p{{Toq)2YY#G`Zc2YQ#65ADYU4vX_coxM0fM9tTf)ah`;w%vzGl z?m1Rzp>$27Y1@^?bJyudGA%Ass_|`|&Hn(0wEqAgF=UeAhZ*P-Kc!_!d&ZGzA0%As z_wqSYJ8cBudJjtUlq^0(&X#L=CDLNmrc$ABo3XvEaROZxH-J)-_0Z^CGzj{{Y=gg(v71 zxN#J@DI~kE$m@kpX*cRks%iPVlIkIdqXkrsg!ILBVcnv=5y4(JXJ38c3$YYBoDt&M z%_3WmQ1auS&#ilSNvnTeM~R6|Gu*r<9>}3UFgw>SDc(l7Rb_Tv__?SHZ5L0{{`cDN zM28)57(D)Fyw{^TTjpoXx(1|@c%CbHvQZjYBmnb-MtlH7LA$c~H(r@&>&nqDbPhdY?q;(Z*NEm;;lZ2dAgwM43@Wp^L~nNx?bU z@BT+MklE+=8r*t?h5OsL?``ep4w>o42l1w(a*_G@XA5c8!Z^t=O$Qhq50rNgZ%@Li z)+)`Njnb{eK4x+oIQ*%>YDAgI-9!Lr{{Xw+>T0@)YDZ%~+hTn-QhdOq1J^nK019tW zoWyL_cLphVC$F|DW1(rCmXjxv;$$ap8TRd;%97EOHFKudFBVI?7sh8kXeZbAWM}oR znrOzRh+|4*07yP;cj@n2v~wn3w7UBz2s49_e!u>zT7zin?Da^l0C|A(4hBbI$5B~H z8q;d$2jhD(WAmfz4&Se8!cS9FuFi7W?8|N^AH+DvI6d?9tzv>qz8rE;@D3|YjF_y% zr8=1)LEq4`1&pT9; z_*Y71Cq=Kw!^7o(8II->f88OMuhiBx9;V4?au%3u0ycyFI@O{YIx8U`n3FI&Rj|N% zbS9;tM?<3o+R5d(J2Sx@Kgkryo~NW~4UMlE&OchlNV;hE-v#S$Z*y;Z5ya5CxcaSU z9qervsrsL#YB6e-min9-^5=~l4@`{X@ab8}S)EB-xX+xE#Q;FWj-Bf}l#vM;;B^?O zW`iW-=FcQ>DIup~R3UPQ0Q3I<)}d%A4ai^f_|*WNI{W_sIz-q_z@J)H8$y=u2R(l} z5Nr%H$9`yNab#}1WPQ`0tt%Fp5&4?~k}AV-y+(WHpc1fyImRd{pxRrWlw5I$0DkB^ z(kXTV+eSTl{uK>eI-ddl(LMmb9xhEw!}iio{jC^xNcqIT?PmHg!8Or_sbhx~MYnWm zcn|hkz0_SbPaaGy;QPYb7t0?^kU08QwQDVfOAlvucK-kxe`TKz_~$`bJRxkBTGf6(-35UBEQ zqB1GZ@dJZg@OE|zi1`P^8ZY*3yi#W^aTl1t_BpPYyPUQ>Z&bF%=2ONG=4*J!=b7i) z&9~Yic-Ul)SJ;p7ty3~*n#!9_JLa?q>R*FJytrNI69hlR+zJ+;-Hm8`HpiLd$FlNj zk|jv`*We$BVY9V95O)hSQarI1;4-%-@#3mTR4yn``q*2>&<2i>HIx=w)Wkn zYz37F`flcw{uk&fZ{9~4@f$-;GspfV3NRN^n;(u3^{I}rI_IN4D)GO=J$qT!ul4I~ zI`T;FCN8d#7E(AFAC)*Y1Up>J@TbE)TKiqF(KRR~f(w~~yGoljfywLN8O3i-X=-I! zF30Up!OdbP(!b#sA1mo#M-V-HpW)}e-k+6m;#zL!rGs{jk73T^kzB`QN4s%>-jPgL z^NjV)76d*h+F~P(OFNJh0ZPr7)SZu_JPGjqG@vz2RX1G`@+NpdeZ6Z-Sm3K(=c!&@ z!KPcusNX)=qZvQX6*6X2;mpsIyj$X#{84(>3`*Ol%N%_%$>;H@TAr0UY9}YXv-5Iu z(x}xdj|Yv%wM~n#Fvc>x3J`7~UgY*7s7(mCQIYq#2l|Y{Mo(&J z%_3!x43d6q3ZZh62LR{v^r#hyVkODkdR3xch0y+1Li3SS5@of1G1Z4k0F`r}>re&N zkN^n!RisN-9ytf6JwF7T-KYh`6KaH!V_p-BGmjd zsHr>TEdlR_IR#I#;-Z~P=wV)+ozDom)-OCVA4SxZ$!;7mP;eM_Irav+p(B!{bQ8lL z7`##7-CdhSfZq6d@Y6)(;YsA}J+LudF{|9+ojadzcvs>#hdwG;O=YHBC)!vMExR9{ zHu@g5qg=vEl<=Ps>5rpd$zd?V^S3?6P-`o+X&q0U{{U%wxZ~Ays0qTurQ78C78(Av zH1urjYUzBBn>;nINglmtc^h%&h`>EIG28jz*GxU*DvHSazu@P?Yp;slFSGFck&~sz z{*iX${&}J0e-nZD){u`Sr`VKtJBSl<*NHhSRV=+1JOOyu& z#yxt|Oa&5c!6)X%aYH9z;jl1y??M&sF8#d?F<7$`ob$#3AFTsLxSz0~Owa_LMJ6Gn zmCicR5|h!5?UVS`ncC{)PT9y`r7{{A4lp~OpOqmKFHHK10Usa}kC*vW9b|Gzjs*oM z+(6k-7q@@XniQj94tn(>tWhNcKQj(%FeBTH1JG4~@D6Z#VxY9NB??O9kH&&*G^P$u zAaO%wL~&w9&^mMa;-wBs;xWSD4C9(?X;_bG86*7jNxOhC$@CNo!O-BE(GuN<7Qr8_ zNh1&M4t)>wpc5Dy(zGh#79oy$6V`x4$WAwZ3Ftj5F)||A7(F^xfqqfUNH{&~Fy;X$ zk+dIkLK@Uuj9_%hsx1i2bI0TKq(ftKoDh17V~En*e)nobwj7Ltdi3_7pd4`g zbQA!>GSm|yPdD_U!{!`YIOq>*b`*sifsd|f6eDwzKZi6EA&DEY5g^MGfIVr&U71vu zDm>TY$G`}DSE5UKq{SuAiDX5J**EM&Cnbp_V}Lr>Txr=yAq(FHudVbkmestkRG{q@scKUUfm-8_6V$63(SLE{ezUE)c7h7Q&Kzl~sy&6SbqSl_@0@cnA8 zM2BuUKo&eAw^pQMsJ; z8Et13yha!iV^TRd_NZvj*(M;e0fee>cJgWRmZ@0uUk}D6xYOa6ES_v?N$PtV)-LTY zG;!38u6{uHu@}T1GS_tiK_A)|0Z*^YYkKmwgwt0nN2MjO7ZV+$0~zB#O5}37G_lF} z-YITUA#alz&&%~0rwQ1n2F`NdMKEcn?EpxEKQm`?agaYgD=urZrq)(Dy=O(Sf)>;@ zSflcl2Lpqg`&NmOV;jOA5Agp0inT#uE~EA+84IrbV|G9aN%hTXeGJ8aSkN@KSe8PhqV+!Jv6)&Vdp?b) z8BpV}IsB^`NYNj2{?ES+E;V>#)h0rgn*yt28;R?T(M~rM>e%}a#GW9t_Q#N9cmp+sc$~bY$P)OG~`hQ+1G)#^@Mo)f!odaXz8O}X;A4-WbR7GV2 z1a-)v1C4~r@S~DC8mN{^tZ|Qe8USI=an_jSgR z(&S0v`=nu)JTU89(5=YMTtyX89?TtZw+cf?B8OahFys6y-lslwbH}R>X2}G_$@zHo z^rsRVvL+E1JJ|OiW9vqFEN7+4UosV9M&k&-Ho0U5}}E0=4Q6*@Cx9)szTOqQ%&g@<0Gbox?bMUMI#& zX%pFg7x-nOm-}9BS^h}DAHmR{$NVb-+CHqXvKH_K94-g9UTNI3MivB&9x926^AGJ) z2ikl$XL}I&qPlPh{{U_?{{Y0+a#u{aXwmsOu3Z~#YG(fcmQ%^Q=IhUYu6oxbGjWG!ds6nFC%tJOmKai=A6~dHb<*?jW^qbQGjM-sZOF$?{{Wq2 z>9X7|bN3!Dzn(^yO_Ti<$H)l$&q~%bQ{2WX%(bWZw$%WKR(VCh+{7pcic+FeMTPNB ziE_p>Jj8>L#{&b>vvisWs~sMTL>%3~AZ|+E@lK zGN?i5Q1twBn&hKX-Yb;(+0?1p;{*~p^%d#H%&{WnSObjot6CEx#Bt;XZ1N2>XDJ$X zGyRrjxl%-k3nA;49E{cSb0I=jJ^ujUK81O!+}}xT{!C2|mo&$yR$$Brxxf|U>`j_M~J1Y^}f%#7X(wAH077`qg1)eGIW0G6*iNHOt-Q-|VHwn2W-; z2OpL*UgZfWqr=8V=ek)z6mssg`C-@{bM6L5=U8GTaG;%$;-4M$vmT*kX&V)W#?#It zzV~n!@i?zOXIx=+c+Z1Tq}MMlWM47kifrKHCO}uO<3$bEsdZy?edX|%Pfz$pE+=Il zzPXl9_zJ3^{5Uo0H+FDsbJA=jAa)Kw&OLFOsUbz1(p<%Kzhy}m?FhTod*h~m9%~yL ztxpcy6f*0VFa}fhDb>{afJi?=xcz8~usHQTOw{L!*GM{wa}uB;vS%!9mbtpL!d(SdET4eMM7t0j$A>M;$q-i@3HU z@|C$9W2H9i3EZyH9lM98(wcV}_iyaa@G<6i{vr6fBC)Pbox2`M&Nq?y;p+t#Tt+g(Bc7FOLP}yaQHB{bKOvzCZ~*q91ahx7=>C*?T5h}+;Y~+o-1~7fQRWLg^9d4mRjz}TBikwm* z#^+U`$Y3k;e5?Ky6OG3c*mS2h?;PoZgpPeHooLOvT>UHfBd>pJcyTQx=1Vv7^PZ?i zRQ?$viL0FucSo+U=M{@AR_EoZv7#d&XM@EcLqdbsk&0ykuQ{YcV0}9O0Q#sJD-|U5 z=l=k%DK}$8v=Dvl6UQJL6C`*!&hCT{&Y2HURl~9M1Nze|V!4waGSWpQaYG-%rLxwf zLnQOof|?{b93M(o2cQ=Vz|XBqWu;;@WA~34{{R|KQ6w&S;C*On!s;^{m`dSyslu@X zJoUk$I~LG{`Iszvk6LyhH-#Xn!5_|q%53>(_K*FYtiCQ-HnXB4L*h$um0%PJh7MJ_ z9OI|bt`e~oDEmdG=f)obe`sA};GU*@2jk_Dv_ThAQPFm1 z-(MIkZ2WKGB=Hu5G>(;m`!NuJ4Y0XU^pZ+ZdRt!NqQB(ua06+TV z)k9;NYq8>*rKikz!6WdkDsiD-4lMp%WgpE6pWmKO*;>lnDltJ-jANh1wdJ}ny^hPodSw18@#W-J(e4-5X+B3ytqg2VeulD+m-0I4u6rM8Y1X2` z)-5_UK^!O%KtYZME0%M+J&JVftS!xjo%SB;*4gA88_Gy!)Y??@#t$N*_B2C@JqK*jxl$*B876g#1uo=(pmIq)s?xcX zswkgD_!GdxM^)5yMcsPeGK0|p9cwvA!YiGh zGJHevsqrPr)3ok1=z0)O&U4iJaf->Fr7CJCn?5t1;1AZSCqmR1Ssq~SLH=Bt?1H|homL#Xo^@-YJUi7uW5k{by=`y8bKH55NrNP0s~mI49Yt#zmNk?VmZ#Gm68)qsyln(p7sO>-En*#^ zFL8yCj?bQ%{x&dXUZL+8&A z=3PqF5q@KF7*IWTjw`bdxs6q!{T2Sp9}S0rJSdvhr5@c|RvvtXmkhBVxW3uW@5kD+ z##Fbuzpcx{!%Lq`8E`S4YtLGpwy>shxl(fM1f%88uv6Od08HyH~Yjt?iTE0mDbBplTgi3{!d$E`6*6A5_7 zpy%BfC%8;J=!PI#yW22A(GSXhKj-1=0pEejFJf-rm4?17q4w<90tnn;#j zR_ltShB@CPW2wa}k~kb3AHy^)0AO-B%^gKz+P-@Bp^R?+ao&Ulgl)~u3=LR@+!d)a zCTH4mI`qX-Wo!rw4D>Zfh9P346!tb9~aLj zrDk6Po-H&+;A8<&nAK-F^?x7d#)%c5~;`|u<26DBp&pE z4=u+ZT8^V*ayoWAnsNb~!0pnI4`$;hw-gPMJcELG>-^|QlM8Ip9%nBTfbv?v5#tD=y+asiDYB9;Ef_NP7&B?cj7g z(GpuEOk??)Y;gwL*V2%t>_Nc!hXj9G0TUwv3G~GP#LnZibOL}*$9>^V7%>{P-`rgJ zVET{Z{OhKSI-YhesnXqD0l3E4Vh9J*@vfU5Yn9GQ_fd9>W!IM>Wy1ymha-{A9JVx4 z(E0brKMuSd;$-r*{U+6ScToO_K5!Q?#g+rrJ>7G9Z{32>FA2r3OGGL9@JdS;*#zu zSVz0}tPU6H)~MDMY+4d-CBC&u-04zGQ-Q{CIHbpL+mHiw=8K7HHHT1rIHJQ9ax;^P zyJ$0@&~LnnmPs5BBs`#>_7I$Yl%cuFh)3k~C;K!$seXjbc`Va~=twSoezjG1xz873 zplgjrVRfh;2P%W2antjxb~KAD>aZZREicNU7#1CYTxam18{FjOl_9b7TRUQi7RP<7 z=}9d|bIJT$tUKCCVK^pIQCEz0M+XD|;Yc07&lKAdM@1At0U#5D`ku7X z1GDh{oM&Y{eqcr`IkClPeXrrKhyMWaOuQ_LZ$f>ib1Bap?H`7JO3$Hf-1o15UjpuY zYVqqD#AZDwJO@$?y@(#&YZ$I(5|=7I{ns_EH{rIO9+#%Xg708hqCh@D&p7<+rVz1; zT<6VKSJU6zJ@xd4Nu(v1vF=Yn?agYAh{DBYIM1N(Lt}2i8jR!drE-QhBOaotWP_>W zpYfo{=)-3j_n>Wo89C`d9%v<$abVLvvce}#0ln$lOZx<-z4;p1_F2>RC~qIO0^ z_TPMGJF5vBCv!troPwLX4xPO#I}c-y)TQ&}3OGp)`4uxC_>~Y$@Tnd3Qp#{ELC&uK$|)XD42zlu5vi^sbV^f zJ^<%o#U?wQmYjvaM;TP(_2Q=XDk|r!cxu`1V{11!*ch+kMhE9z*gRJ&vB`|Xb1S1% z!uHZNz1U@Sz&YcuwR>F2E1olrv}5FzlN&kXCmlJVG9*eS$INm60N1M;LM6w|#&Byk z#w!q57|sSLxeg>gSz-tS7(DmRXt*Rk1u9D(IQhQ{8A+ExRU3%l;|D#)Gfc6obdQj} zrh<1Kk{L&J3(y`7D~`pVv~B+YcB12GwE%WspQSsJ%{ZVS1#U^>kEJ`@%Jwy5D0=ng zpc=6-B!GH<^{KN+7u*OwZ0E1$D==&WZUt0lifSc~Is1vuc%%U)$k55tZ&T<2;(?|> zCcwz-I29-+b$$xdR{r!{Twp~9%*6WxN^hZb)yDY4UjEU!`zn$lLI7OwK^%TG**w>0 zH3$S8@_PPehB)ZW%@;~-Ug>Sm`k=v>`wq1edKXP5C4wEqA)hV(Rw)ckhwrHQt> zvvmadkuq*??;#`lR|F+?&q+r_dpE;bgmXeSf5*kNGJ(^e=khhAnKRnQ(Av0ZU^ycv z2R~3VU3h6~abja+c-4=C&bO;I-Pqe{Y(t)LxwD*oKgPN-)qUG9>vKH1jpxk&0IgB! zej@QzhlT8$Q`8#@6qQlco1hi)%L?mA`dMP*MmqeDhCFrSOWzyb8>_Rj*$MKZ2LKH5 z^*F_Q_-rDgyw3{0CRJXn;odUw0kj3ne8;)tkHA*XbDef8OJ^$wx`_#nG6ar07U`d@ zLpFjmEUo6gopN)Ma^&zZ3H)m(DyS#VvLnRgN>sZ zJ@P7K>@?1<>%w|E+DZF{E}&t_KGlk-QX;VM&5J34;{Dmjez^7aqEZJd9M8lFVA1cB zN3#JViryl2am$SV03s`*jgy!*Y>(pa}P2v zDivTIfXVj7bKJ@37akhZnHJ*S;KpPipa*P)S4f)H2OnvPe8mKJ2S5J0<7<_jG~Y70 z^S-_I7m8bZHa>8_lK}q!agcu^F@ZnaP?Od}$ylH>b;0V;PAo z9#eT^CmjuK5k=hg--N#rSHZKjmY}8d>w*lsKJab4XV@HOxN-PzX{!FWJ8;;qWuf%4 zT*s>uduBshu*$IMjQ)nXC{uBEHmN>+PV2zBb)bw|!x(v-vD|s;$0z8k`q!f`bsQ6q zHixT!WhPFYUFhq9BErbe0}kdE$o_xuvc)N{u?-${{V8`ShffJ1XeD0 zHjFG|cmqpArt4lKm0M_*7!ijbG5L?=znyPEU6F`(iT2mRn~0&%EbUoHNiE56dXXt+ z{!Lz;taK&%NRadwgL4UMN@hbv@);kW}5tKdR)F;+%}IB#l|F!n>>4|AFW`` zQ@O!fG|OSGHS-2>XCes)JCvgkbM2kKg%M_sS|2^?IvVL$llX4sOqN$)GrE2IuOA})-oKqt z)`OUycXrMxHdEA6K>&k}{{V$9VK~_c$Q)!Iyni~R?lr0+AS+|HQB;@`tKg6a`Nc|P z6M8uHyG}^UciuqV+_ag=O&YpP>J?m?ECvZ zN#YY1jr?;HM_`*IwYFs$mA>}k5AgK-4RKe*sOWl_Y$ca7`5&Q>M5wD2Y7#V1s;V#m z8~_D*QO(1c zO5k)D{^;Ne)fn_RyST*U?eFVUPRBno1t-5F6b#OBw=6N9q?!bb`M@~?7^D(+GT)Dv z^{OSi6=w$^;~a8Nv8x#a9)gkv$n)RUsf1A_tl}A!`Nn^pBII}41fZng{{R|;`G5NA z8YL^4cSI@UgV57N%R-3+wlm2Xtzu^*sM6%!5+*sv^{$&7_SEa`^Cgw!XYVzw&F9i6OWlrN9WBih|(G# zXYz7ef^kx6HNZH*=O(7t5+hj<@;J|0Nfd$893Gz3nRg;B*mS87#$)S_XGvnUNQZgv ze0J475J_|3{{R-pEzgGMFK=~gA?5}n1(Y!3>6+efQ;Ft6qoVB3M)50HYN|C&2H;%S z&N7k? zD$2<8uxifFvG2g+@~$?nk5VhCA|K+Z)UhxRT5DrIq@x@b?LkdklHLg~BwJf$-6Na; zJxx?%Wm2Mv^lyQ@4IYfCe|!YDqzvS6ne094)`yu|t$dAh14r1JgYh^5p$RVD&vLH7zwf2p!o~?@h+XYC@>O;EqiQB0pzw*RiT)G(=c2 zsac39&)@#|2E<`C`;fzZ<+cu-i9FbxB^$vES$T4-ZYv78R(n8}tx2hI8Z zRIEcow+8_CBefSNV$%HIDdlOB)yb5F;~hV(0@$5N$O9mA{OY1ai_ww>;Z85m zjecJ+oRe2hHwQbPX@1N90J6RBiacqj_>)yZCxtEJj`?OMhdJgys<0sb71o!sPEWBP z#A$ize&q*L!Xkx50Z~BUC>Q{J1$lKR%6!#E&M~xpKb10(N?Cw7V~o%ixkgz!l5hr1OJ%6ouPnTf4M371^FD2j_jvqj zjZz$B3&(tPpcv^oeQBatp!#>AJCkBy-2G_{A#=AmqU5wrl5`oWz4i`K(a3ST^5&X$ zB1l;z806Ay5m$1a{{V$aNH+!to}QH1OswZ=$K^>eBsT<%pK7s*kiB`OYl)gMU}GKX z?Vzt>@(f@K60rq{n2(hHew5k*(88Sh(gB->-NuxFieBV?A4(DdBbRa7Jx+fb7!n3K z$?4LBz`F_DLF~Dqur*cix$mFSjzR=2yYBU*ftHc6^yaKq8uAXKoY8SujJW<98w(J> z2jtKH0Ir?MXpA=ksFUQpfs~|lw{l31M;~;IxSAfjNb?Wf z=~7fis08F>cjB~V6O3^g{3|k3)RW8$)L?qiV@=3efbZ+tm=Uw>Jaf{f*9(iksV9L> z!o9@bℜ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�`~Xox8zdX9MGxT#~f?jN^*{a=)rcJk58pqh)c-Fnq-lg!|(~`>sMg8?isn9+)4V;W zcxv2OXwif~GSVJdjdJ@}Hgn1)S+3)Sj`PUIabAT8wnKI~{{Rtq$4t=ROQ$8Sm05hX z##ra&C;HcANm(RqOH;!24Q}&ayKPGS%W`(7WCyVP2U@~L(N-{Zd%}^d5NFPlfIYov zgl<%g{UdgX0^9KWTjoCJllfP5HOg{U_m5i9JV_PO3v1#PhePTGdUPtLtj{YEO3vu? zpAAX9E_DsS#Kb_j>OZ~s5mhO3Go7wfdnbnV0Pq;{8bOBJ-)?(XC3Rz34Wp<2$`^NV zU!G!({{VKwf-}J%pYyH>Bhiey5$Y19--s@yJQ(e5ZT++JyMBx-GgYC_>g>oQ0AvxL z!!+W?^*o1J;lnRnk;ipz)6NHq^V>74-;VW{9!!-Xb=Y?gwhClGz=kF3N7F1I}*#gZ}`pR*dB% zwebF;B|l}5{Mg9$riqc$ZN~$rZ^YFgQYuOdeJQdYqn-r^lg}UHQd)onWaqa$&?lyc zTi}le>OMZzVesyVg{72$@7Wh17ANuIqIEeDwF(Za(EVfZ7l1V1hk9Ik28w`S12mb- z$k-Vt{42w+U!9*rPKu`+Be%xUw4SGf_*My)mC065Gw$}L*qm%zQ~W)t+?gvACtQD? zw8TzWpOA5nZ^D2D2aNqcJZ72#+)?M|JTG%vk#c2Cr0zboB4aVTj`V~^M?CiLN<}0w z*J&p``6i}H=(F>m_KwlM$KqRuKtjwCQT1WZ>MJ;IT}_XY^$UED-W{3AVg_raBbH3_ zo5DrnzXDM`{eshfD`PHzCIq9M+^Qal`PApS0+yDxdyeH9&JPEI zKgg;YdX(fwB>L6UjoF-!+27eW_J8p2gnU1y{7RjE)vjum$#Akrak1z(b#UnoY%ubgpxIV7eQvCWc@} z0gc0V_O9h5Vf9(RvdVXsjStNt6& zFzT^z@j9H3X3b$zJjZn@Sp5Riu7;y+73v@LsI8oJ&2mXt^*OGSG}#6YMk*Q~HO2_{ z4t;+b5+Sk0LCk*DL2`tvu;3p~p41kZQe&_j9#47%*wvgd&N%97Y*b`4&7Peov3DUe z7wCEpl}2)qhG23i!+9JN(~2xZm4#*`5Pv$9tS0V6 zJpuaWse@MnarDh3%*F-)96{s0+3YHSOrDwP(u*3cM`4KI^FXAmAde$!cl4$xj>mIB zS0vewxkyoV0Ct>u_7qr4R!A3)2jFyvIosGbXZq7adY*rGZ!=8FxDoC7bJyOqLq$tnUQZ6(L#Tn4fwyhv zkUEY%X+1@4Zh2>kz9U`yLe}rDuTh~}X^e2jbHrc5z#m)_QORS_qa@5=NaH<)Qi;9A zVY@4i^vX`-)*a(M82O=<~}2{#m{3#$Fz~>#t zaYzPkE5-ot`OrrxAj)A!L)`V^g2uTdejVrmLH;g>ujxPnzfGg2I?zkdh@Ha(^vydI zJ2+lX1E=LkR=Cm`h6wFIz%~vEvQ9mCq?ieu;c=7NhAvRX2{a}N6Da`XQy9V1 zo|yeJKrkP8usHOfOF(SC0qa5)$&?Ym``(lkFox=L$0DZV3?4R&4D~+L(-9+ey1 z!^ptLwJVGd90AT~wa9F6P7k5YHJ~&KtN3K%lXo7%F&z`8d(%X=FlF-RuN>79^d}i3 zk9v}l6mSM9l08mN8mSJ%hvfuy{{ZV#6~HJ#mg(A=35$g-w0+*x103LSuyy{F3t`Kg z;C@u%jO6ZEXv&Uy(BcW$u0dAYp4Ao;Vn|q!M|w$E(h{(QHUg-tEy!?;l_ZX|Bu_Yt zA5Tyza)&V+Mn@!ZQaG|M*>7=FTVjAabQGAbctOCy#xwd>=PMTgr~}f0tw_MecX|{2 zshToE0pYzxB1v*b-RNoos}FyWAJ%{(=tE-zw|b<;!)QG^o(ZZN1Cl|<6_};CvT@Jk zDv*XN9DJX28Z0HCq4EHKS{fU7EWbTHsz9jVZ61LBHDELh&RvG~uccG0Fx1sG&OCj0@Sa37auHtILPh{!E1q~dM z8{aelon9MDM-7$j$? zpc)>Bjfbv(oeXgr-41isniFG23Hj*&?2cJSAn}?2PC*Ph3IU?jAhFw?xB$|bP(M}t zHdfO`uz@fFS=*2NhAWuksJ-Kq*YyQNW0A+Ht4l&}W93hX9xIN*ISa@JGv2p^Oytkc z4~afJpI^CcI>E~+W4Y9yTDL0`2)Q$u(R3_f&I#+D^@QqN?u9!ZyPf6L4k}{N>(MXWehrTR+xvJ;gCjg*P0Un>JD+93FkC~CgMoX zL!4ro6C2BC2cEg5CNwB*gpS~G`HaxD0T_xJ0Ks5!>C&12+yL+C$GspL03eL?=~gmA zeLXp;LL-(i{I5z)*bLb%@=CTbO)-?jC%C{hKv_sR=dUB$f^2HWgmO=8)S;7i+)gN9 zC{xO>S{nodIUw=R6p4}a_w4!L{nAh4ElB}I%r@bNAMGFMT=RF(#%{>^YT{uMY>xmA zfN%vy$23`mEc>y)rBV^h>o=(!O(P5i6fih#{#-2bVWcFT!?-;^Dro`1Ygep}3NYF; zkbCjPH5-BD9w6}>*r|~ZILR5S<+$1KAH}U>RPi5*E;YSsR+Ki>fl11u1p^8@4wUDj zHKdMfOpQ|JBrC(@AEqmkXLU4tkA*aeZm!|B0}v7!xab#?&%YR@P8`hI);@$Oj3Ry2 z>Gbrj^sKZnl!eabBhs5-DI0qBrw{;6aNdWf(wHJP>OQ#507x#573EP!i=bBppr2z$c)3^aloDPTlilJOnfO1FHr6IA4^KsPkR5D@n z4@Sjg8;wKq;fFma0$rmey63G@)J+j*IX&@7fj3T+hBd%!4@^}>0|gx9(s~NSxf^nw zDGXkFpRc_G_F@l|^VWe})X?p|*?AJM$X;9UHM|kaiI*xpU`e-;)BgaiT?p~|+2YUi9?d|J}LEu~mrUw^cTu|M(QSk$S@sl7ZJle16cUAFN)t#>JXTSa|7 z$S&b5ti1XTJ!&Ib`2(6pB%dvrR^O6|nw@#HdHotQsW^~-4vO5Ya644kp zF0%qxKWT-nmk~(h65hDvWcpGn);YV?5P=vZfCuT`r>SQPt;?Oo zImpl9R^(=t&n4ETAe2406pc?I)aDNRd+w~{bkifZQvU!j7#->j&r|TsK60z5OtUj( z2N*Ri1?*W=ByP{G9HDXPk$^Lf^m31wyKIc#dxB|ljcQ#WsSLxmX;^KLpP!CTG+1tZ z3vk=-JCEx^h_7Pcg$N==+@xTSQCA6avLw1br@%iQz8D_|YM=0tX-a>xuNaaS{#m}!2EH@&p-WYZIa7)$l5-brjTq|goPnTLOI1t1YAW8%Ja@BXrgQt$R`wlGDZj) z&VRy_6~@TNlw57&B>gFjhSJpD+(&MwsRxe0R&!-WH$93d!hDD@r~qHeur#ru56hNr zc&QpzH6mgcBN=QCedrvuJAEYWP%*(hz3CK{j_XWsGUa0*FUa}#>Hahh=IcnS8Uw~Y zP)~euTExz8v0hi-hC!cd)-K4x*D$ZIMS|`;u*p$e@|De8bT~<-Y1_?^oS#}nAucVV zxrOa6lsr0Iiteab9KiRhho(9fvNjY5oKb1kJHP05f z42-g&+Q5yZ9zm-^vCzlkD~Tf(nvvasfhIZpYp#_`7|s{e#J!m$!vZ_Kn5U_^%W8XTD7(Fj?RSlteYy=66OOLA0k^J4txKkgiY`m8%CUnJBQxYW zmEa184MyFJdy6|Of@I%`b`nbQgTDjxrr$!NBCpx4*6ZxhT)RL>0z<*+=}(m*+|QAB ze1Vv*bCXFGH)UZwvIfF)nl4X52_)wL@!qYDD&<)T&PQsd8wlK=mx1X?47X`%ai~m| zb}=-w$Z)8mlT#{+D^NbL_RZ=*>7E8Pa+Vh z5|5Qf0Arx8RVK{dhnskp#J1X0W_yMh=YiI}3^gueIV+z$>%R~#FWtV$gkIPmsjp(1 zJ;cbn zQ$KLI;Cq}7-78qe#xtwY9+9Q|8q{tGZAx{9KA}fG{{WqIH=%^5bJe^n@Xtcf=Ubgi zH%F*49tYqmTWMVxP2WS*-@`g~q70UC`Bo}FcCp}m&G(qsRvxYQIPo;>gtqXyX}4*0 zZzJFU03>5=6`k0qEe@)}%6C86jVlF{o#XghcTw%qxN0N5nT=(eo7?-ja?SR}Qcq9a z#*4?|4QBL3Cud?EWiSITJ3;5z(F0j%c;>H$ZL7c?>tyUiozcsf%N_l*P3lZpQdsh& zFSR2?dDgK3ww-2Clyiew^BP>Rh_4V(4&@x02x{esWd(AhC(@}2=xoGQ{$6m|CYu~p z#F{U%jt1ylW9dyHNW;0AQxL*;JLhQh?V8fYX_=`8!Y8`Kl4GY~LRJarMdz<0o!F{G zMOt*@dSv&n zBNJbp*!nyz6-qvDbJ_m@9Gc^2U91F^G1@!D{Ovi4|1Bz*b zCQgJCjDESQxLCCmf8Om>h-Q}36sYf7ncR%HG2GT`-98o8V8|B33v-Q0natfI{g)oV-1u}X---%%<|ifQ^y`O zgZoKcJU68}Z8-7?vGMpxhzNrr|VdnBt^M#fP0ZcRw~6Qr2ylcpZ@?|GLceQfKz~Z=QIhkHc2;< zMlqk#sUmrZ3z9;x<2|cErY27r^`IpoyNSp?oohD{ZYI-$N2e4Jklc_CF`Npqtprvl z?)Cmu>}Vh$bBv$xq(q&-4k%)Y8*!3P%S_OeeAqtV@kq*`)W_Yp=mzx(~fUOF`TC8R}`5Vc>=o1?&Lx^Kp+#mOGs1h%}VGpH0+A z`Rp%YpE%?I*guCgI~mqo$oj)Xo>{Jtzz5mNNMvKl$Rlcx&XVqV(%#3YtjjV8Bvok7 z1TY4nnVK;=;3AEnV*qp*rX0kqa4~^Eijue-p1o)T3hxM%)G?-u);6Gn4a=N=RUNJ4ako5HK0`=AdApk_We1rUOVIf+^UR$xkN(zGxWi z_Z`guF5WTE(tsK`Tw|c`>S|D=BCrfW_NwSYB+f9vV1js|GeBJW`tef6Hzl+0#wb8f zyCXQksu2z|$mz~%Sv!f>kH($N9xtL~{~|$m7$cRf%F4k2x6hs7N`9 z1*tzU=dKM`D4ecn!){~2Jg}xAk8D85=N&&fvK)nu&wn`Pm5lj|BTwJL=8jUi%TZ~8 z8*Vz)auVtizL*;s>L{?)LYdN=ki#9gq~a$sDXeg$b^uf~X$hFp+Z4zkWSrEvn)6(X z$=nYZ>G;!$E=SMg^#`X>T8`Hm2lsk`gFxD`X9Vy@bCX$;LO3A(Gg<;ehs<(13e0jI z6M{!hd7u&*v}Xr79=+%(p{$&4KA7UHf#atqCV(H3J;>sq3dM4F_3OoHa>H)!qkwp% zL1!HSIUVW%fOH${L9K}Jdv)fJg~onGJm(b3xP?OU+%7ONNRbBa^vXo7DN-@`R${Rb zIQfrSu?nOdASZ#&DUYZVh02rb%^^zSG2QbX{r>Xka{% zoO_S2G$0u1obJaI0KlUh{c-O=4Q1Pm`cp<@o8}yK8KhET;4s1b=qPatM>+b?1Z>4P z9-qpZ)P^@1`LWNXA;fqfa87Us>p+MAZcPC4{l^TFwvs09PY0 zsU1%b_>JPV(xZ^OZNMk3bU_$4er5bo_?tezdfHBu%z4AOImKw@WJ;&ZaC#?)3XvlM z%t$2nKU(LM&boB$diICm(00npfCe#&n8%pvwuhiW0z{%U04VB5dg)QIiD|Gf593sV zl&9N_i*siq;sgdi_bimk>x z62uZeDuyA09XoT=>rFchYm8u?^;>{}IKZUPmV{(68ST?GLmpED2fqTQ;va$cPXrEX zYz$0%!244H%YoOE-krc{Iphj112dj`^TklbN;71Yl$3;DbR#pz(pnsQfB< zK@qZtKQ|f88xq*nL5_I$rkK$6j|U@@O29bb21j0)rxA_=cOY>`FcJU=W6;!y)zLJW zwfp;R8q56jR%MH`+W|`0R_4R81(~^ea&FbNzU%YOQG2Q zG>Li~!(Ke?B1V}-{whcj&gvH|`{Q&tP&1x~K9yu1eW=}FG?1|F52i(2MtQ!ae8{9f z-UQ^*xk&lT#+u&EN)KxlZBcs!8HoCsu*eavz zoMySCb<#ep@TQseJ5_QAnJx}}7P@H0$hwl~j+H)9yRTZ^nE>bM-xUKT`?=hB9-m5R zLK1oqInVQ|xX=IzBn~}48k-0S+raDC{c4l$CMqf54hCpriY3m`w>>>Gn&2s9;eTH6tv;1)Q>2jfklk2yGQPpvC}5Y50C=daR`$D!YDP{O0cNh?iu}* z0o46T#Q+*y&po7fmtX588_M<>sgtnLc1xs=IWF#-%YgwbXS8XW)|2sTM7Pv$AYZU6 z6lmp(1nnLBoc6B7v_5Wlj#=z@7mY17zk;$s<39m;llXplHqEEY`@tV1a6JwOKJ|=~ zf$vbK992Jge^x#7!5%r&{C}h_y`_&Sj}u#TF+Xwi&T(DzWSTxVFv9yOw6^~Mg3Wu7 z+_IbxO48>OMlIaI2G-@fRorvf=WZqvXL#n6nVb%K{^x!YiGc0EuoyYYRb~J{kkzJDaC9|G-Rx)Q?QLkkm0E5W` zK9!xyXR`P{-_0f*anyZytSTE**!wr(K9aLs#_yBlM$CQ5;C@-64BFO5&?yUJq#XCEEShMGt_46?SZ(pv zlVE5CzyWwP#c?sUcLUUS^%W7^Tb$pDyg6;+-7@3D`hdh&2tuAdR~)J5(BitN)#YSY zrm9BA=B~A+PvOh^jSl)hE?ajf$LZT9jO5i?=4GIwJ`?WaCqBGYtpT#)uLVa3JXG9exYUoErcO;VqB)B$ z2^=Zy*P0P6*aWJh3J!g`^rXjP7hTJ>c{r$Mi5;hfG~Xy4LP3^Q+mqisRug84Sn5`6 zF^ztt{{TwJtC~=d#|Ml7nrv4#qXI_SdMFf-C8^ojC`iMv7^GWAL!?~cHJ_Mz3=T6| zb68PDi8N-35?26;4gl}PM5HE#pTp8y&E>uckOBhZ9Q3Cpb#X=OV?x`)FL8P_sElG( z8OS4VBRzdw8<3Sa>5)QrMsHG-w(*3)7(d}n4KtRyi_3N%{i|q{ zig?aJ?@S3AK8(F+8%N!r0`$)eCW^YYim2Mr`EHDuW<#FY=LduM*M*qL-*8Ijr|P%J z3mJ~pT>Qk~dsh`Gxf#nwkDk17@jp(}RjqXCMa|xDLi8VquU8L;zM<6li&)ohHJRGx z@p8-PfPi%FpnQ%GH8W^r^KG_*3&z4(~PX)Zm7=!f2FPbL^F{#2Pr{mZC99X>xGF$?oa6JRwJ)058Yw12 z1{nvDTA5hSk~JhcfLj>I?d?GlGOi=st?Euk(-opbrE?PGg~u5=!N+WOq3A7&(mP`r z$Q>$oD)&1t3F>UDY~(-1fIpF~BFLOiL2iLqgURXXPQ)z-?G5u2fsE(4sIb~T(fyac z7)2_di2Bq3fW>T8)b{>7AAX#6uP+%{tr6~J*j`o7CF%GdZ1IxEf_r~o#=O33?s|w- z0eWZNm!U-1-Zr=A`qM~Edd5Nj0Cu#olV$y!ah|n2q+FapPBYK7D+S9agzyKoRANeY zF2%vh_38y)!fxcji3D^x#WGs46C7}Q?*!1@OHPxP#IX3=^doSMa{SIZNH&VL%{PUcdLk2BTn@L7Q4 zuk@-$UlHe5(E!J}>&McXGI|(NscaH?LwzLi!z0;a&f42E{p@jA*Kd^S!PAW9l(xD)8t~4u;Vm1+AMlj?N7v2Xre~27 z)xp^bCu)&wmtN<{o+ka3@3m2P;u}pyGj}Vz#wjFHcQMZgHOp3;Z2C;PylBSF zx9RdYar-Fvr7eH7WWCeaGQAJ8%ib-T*>5hj;cSXG zM*+DZh7V1o{vw42kq;XRx<$QLWPK&z9|m3cJ4f>Gbu`o+%Wd5%Z;w12l6q#lBXqSs zTNy#hUhca80GY^qQkTK7=(E{)=JpwGBaxoh$Y9d|KsW>*xy~s$+BaLC##M&0{paIn z*u(fg;%hBl33P29`g^-LP&8uUessw^7Vlm3Wz4lcb3LONPVxS?Jy!NG!GY(sY<%O? z=WbJJAaFVgq=Lskauo2`Wj(5x99{LdlOS>at+>yj^fio)VI$T)3+jf;QMuA2Y%RiX zL)fzOkISWURMhow@;;B>jtR|kw05U*MU#)4gGj5Q2_@=R?^8gKR z9q2^f;}uI*qe+S6o}e6csBCUG0UIdej`^exR#qI*5TX5r36m64!0XzyDXWfQ*dB43 z0ScfDXP~4;z&>Gt#WB6cl^lbd0&_rf34?*R*P6^Eh>m#2UiD-TU+bUFf|9u+Fd&|p zrdvXV$-u`00RA+HdJf3v(tzA-ryv1I6qSSrXvaOMdXmQx+%+&vUBD0rIO|HnXSMhe z`J_iK-*~RyU~)BjG4%v?>slgCFIj;upe-LE zhCuhlGLz*wyEY~;ufwkuGCevHx-``ojyl#X=us`~+mr80a?-Hvqqka{fVsiOGBA0h z#Ffc0&|n{WqU3>>yBbI>VVKAm>zW#{nz)RiP6_E%5eTdYC$Fsy1<2L;!0AMg6Dd9T z7^F3*{Nt?y>IXe@!8EQXxS_wh>55}(u;O=T@WC}U8Wf&(=BNeBF9)v`10A~~JxKzr zLjcJu)v?6@0kQYHkITIPDzVQr0TC_EIpU_`)#squu{{YseAlh;Md(_-xNhP`JanhZP z?WnzZKJ_Mpvz%j$3Ty`{=O^zht@5t@q|#zbZyn7|p=uWbL>ukN&ztja2ux|tx|U^oG{P7IH@MW9AFv-*yH`&&`A|l!7Gh8CkL%2 z4G|~Jjxok6#}*k2f`1>%r3y?y#F0+IOnH8I9CghD9EFcP`kH~Uq><0@9%`&16}ub( zOe3h*By{R}nq{&04l+Lq%$CUZ?Ex!5h{r6s$-p`3NfRLp9u>MCDOje(I3Q!F?M(=c z&f}0fb3p`!NXFjZsGzb&IRx}S{d!0SA6#|oREg#pk(^Rt%pI}m!1tgzLvQy_uM`I< zVONZB4tej=lPHAXl5@xZ0A8JdCFiFgQrLz@tZ}rCO)x@k7~~xD`WgX`iH3f2`S+oY zEc-*j9yhkM@LK9u@&Oi|8%I2ZaT1qS8=K`)2%WUbgu??s= z9PwQV894~OKMGik-wSO~H@S zjfRHp!S%?Y>LGBT5Nbv$$%BrSb`XpU+^7X`c$HAsPKn7Nc?}TUqZT{ zQvT1L5Gb?w%JmO9hS(qceTUbl=Umc}g=tv&Vre)fPCI@zna5+6)vpb_MD;9okH)mH zT<32mj^5wN53rsK4^!Xssj*QwIrVjGN0}!Rjm`6qt}8@@dA;QRN)X5AW4W>GPhdQk z#F~+WIb-WZu2s*G{v+$_ZxdUH3<&qq)-sq1@kVQ21L< zI?UsFTx>(po2Vb-S=#4H(H}$nJotg9{6N#v_f9Jn%xa=*eEiCNy}c`{FG5r1JItN9 zJu+(25Qut)s~Ijme=ns#gc&>@bNWy;$v)u+{P9VH6FlP_P=q{^ypELG3yve7o4MkZ zz%i0R>5t`2ARIXN&-AG(A~pffekc<{XJ`dSY69Yi+zvq$4kNHJ)3162BDM%&#s@!* zQ$hea=chqJU_WMY?NU1o0APXb*V>)L$v^;O+K|(_BOfw=Pe0_)0`Ka$$o~KeXib3N zh9ior0W4#5gPfKiaYR+gsO+wK&Yfy4E#r$nbw+-sx}dChwWoGmG8Sw%PEWO2k;0?3 z<;~CAqhsdD{Z?6=l8A23T;wiLnjUcZfDN)}G% z)nlrvkx5$KPssE+z9rh;GEH^iJz->1k__>535J!b5B<{Zxl(#+;)pcWesdzr* zHO3?T{h|b3dY(Avsjg|zyFCS(PKvM^#vq(H;C>JB%G0xM=`V`W6Y2ikh^kD2>fapzR2rzsCR7) zJO2PGhG>?Dy?7$jiPYnbr?1oeYblyQ`{&^{jpXUFUOMwDDh4C6@^Sf!a5t0C_6Y4G zRo=j2wK9=p;Ren*9D7uoris#Ygr_T$igG&04EmSRqG{!L0E&5u_HCA;+>N`}o+CbEFb zAdPuoS042jG=e>18%46TSP$MK=K9tW)Ya}~+Dc@(l#`GGfkP#$GoiO!VD`YN8M|p8 z&A9i)1tYDqQb#>I(jCn>35N30U_R{VI{yHF<^HtElunOO)I5#g@F`p+8yt<(%XuN( zcpbCqDU#jFh6A)7zl8$1T0qAKvFGxj10Zsuiv{`*-JS{O93OfLM^uzfRK zff?Cx9Hn_f)DU{mYYEu=+W4dJTVD8gG?!NqHO`fiBc3&5fKMBTG+5J`=Y~1~^A1N& zC?-T8lDKh>ILB^j8o;*-7jW(Vu<{SL6xz8~EkUKCvAJd5;kO#+sES$|PF7GETN`*Q zSfo=H3lk%5d}A3II2BeE?sZyJG26KEvhsQ&mOrLyTpQSzD;DSQX0@)!=Si@hRNxQY zFu^}jTEd&^L#S)%{{R4dYkWM&w3~%f>M_sIin&u4wMgjG_GR()&&)LPgz@vAN|g>` zU1T-CWp9WwVq<9;bIAFQ2dCp&^7JKDSGii__GkE$Yy0o8r0d-tYAc*Bt>AAESq$E3H&Bk5WF&L+6h@maQ#`X$v6|J4 zS18Ef@(M8L@fD{nfk?_QsTl-hRTiWmQ}>4=v$mzSbzT$kP4|OuQ(4oTt1d%F*}?S{ zm0T*Rxt}vk(eY=+4R^(om%5k8gy#`Qz{jN&@R6snUS|d7@A;T~-oCZEL`~dPT>S0O zcQv9ZogRVV%}2zN{gXzwd7O|p0CtS})VIoJeR1Hwgf^ZAi9A8$Bj(-_`?vthZtN6& zdYY&^nNC(cU36=WN>QlmiV`%#TiXx10OS_;;8#RZ%_&^jjeNErFUy>Y3=GX*Qx@gb zf7iBlARXwjRx`BwCy5OAeB8)MW9jKshB|MQZF9MgC;Vt?;F+bP_=-zeg6}Mc@&>bN z#_8Q1-lcf&r{7;&f##U-tJ`yMF;3*zwWq`_ZR4}uxWgJo8`LPpWYyWU6^=W_kci`G z&no>n=bB@Y<64SHutt-R%!{zN?~Vcdt70T%kV1}n{{V$UE(p)KaskQU4!>F!qv~@& z`KaPSoRR_e6*dT?iYT@hjU1mWZ^)`eml^z_lgeWUJm#8LB1n+P0LUy<^ONgUYY`@C z+guq2);Yi&`qNCNh@@{UsX4}T$F*E_GI|v*5Hjxv9csywMpVR1FvACqDWOSdWyqa} zUsFYkiqLh8=GIh~o=-HQOwVT1=UbSglpN#?{c&484AQyke+#?;b@3BiheLpWqplv} zOyD8|{cDpGRZ~|wurxiq{FeTQ>eYswZ=~BprRl4(*4-93)DDWHAN_M*JyLE??D}}Z z+AhV?0{u@)NnB4t!l7Z2$@HgUd5cRIA%Ofk(Q!E!VTW+%wlP$-F>dA5geW=f+r2O@ zZ2Fb(F*rD#(B#!2o6v^H=<2@*nAVZGzEtXaU zlYl?Z6yBs9r;l`{);v9_SoLFW%)EC`n13qHqAn-p*12w0X9JO+r)sF|DI?5vsFiYY zf&NWv6B!<7e-MrOWVUITwsQBZwrlgAFivYov88i`xZOGP3BvRocA=DtuA2!$0T{{0 z@~T62D@ePeDhF-_X$7f^(KGjJ;61PQZ-6`>5G7Tt7DB%4#Pj*q)01bLYqRK>(Der- zQbA%;LC>d5eQ7musdAh)t?<9WTHCbxzKaC2u_dGf3{S0dEGlm4w0qQeilic;B%1T| zvB%Hw6Tz9^VwZNf`L@L|9G_~a(C%d{*;IPPB1HHj;p9>Nm#GXMo_$lIiCL?M!jcsmG|P z_6cfSGda^%RxxGxRpElCFkEA)-6^Vcxq)UctWzuh0K%^DggBM-h~$2txg`FzDuV9L zi06{0tRj={Z(CScX;JwaMWj}V&O~dB{cC8$kn-_($zo;AFTkfP+sR?UIjt6_Dlo4| zZ^I&0GrS zdQ>H`_DW5-d5Cfd$RnW!xn75-BmzcbyC;q*TIHpn(nvhyRO}=(0%b zM#g$_MIvo+gPeNPDa4b2F^bHdQX&e18?RGVEr#yN+&fbmcMNBP!N(?mklY`;^`Ihz zQ-O~7sX(2HPDse(K9t2RSf?BV)0z;}Mi35EboQoI$CH7ynnd#U9IO|E$Q@}mLBn|S z;s%-U`%Z07RdqA4D+RuOc^kJLob{~bF2kt#QIq>7{8iU}Af0CKUbkemOMqaP2Vl-d z(0XxKC1Z=9nV)}YbBl>bA1VdG?n$hyDV>~h>;NA9>aJm8Maz8I=d~aov^ITnKosXG z67QMS7rA4BO4lhIuA^rfJh$FztR+J>PaIVzVy$zC@dlpp!zIP5#-jt~KXi|Je8PL4 zbYhZJ^FSsiFVE+IMf)A!?Ph+nMQ(GH?A1vVKrE<9*tVuk)U@u%| zgzQrckK*Y`iq;W8>VB0&O2Uz}40b(eCA+dB$^ZwRwJF$gBi?&-?^SD(vvg1IQRX=mJx? zf*5*Z@Zx|P2I0?I05@&Q^}wJQ-nqm&fv1{WtEr8KM#p*qGv`9}m*Sk2Dnv^M7?w@%e@M7dbJmcsyn z)7F|Yzfw=Ke-~cV+OXY5$)dDTlk3~wiy8A5me?o~4yV$bP~7fHA;&nt&tLGS$Yj1x zahjAOUnl{Nr;5;5CyEU4!{({DT%BSVCESex__(>!s~r&5Z|9x@lH z{c4_oQIQTXM<8~l25hnH9FNAKtCX2iNb)dhc}AU&l~a&6R2^vy3=b6S5**40%5lbN z4kJMaj<}@2dhyBWLK9*$ZT|ooV3>;3147^)4sw z62x2|x^Qz_IHrJM0sd^@_2<%y*jBk1VT>H}(t(m~+7C2b zaYMNv@<`1jOArt_9COF@rZK?e?LN5_t|mv$S-s6Wfzl-(;R?CSAqUTE0Xjj zLBTIW2#p`S?ZF?`fRMx+d2IbC1cc;#-uR$Glk4127aGF^oN_1@mvJ0t<&j4qFzM6^8X7XR-wWxwY6P{2a4m8keR*V?Gk?w>K589 zhJ4xN36ahL>c`j)YdOlm-iPR|hM#HSjXn(`+=PbN0u101K2 z74Cdn;v47IFIzb(y*{)zV`xOt(rmX%zJnx#>sU5*!5oLgtw`!Ke`MSL0I9Z6SOdXx z*N9?UWs{`W&eRu}_?J$dx00dPk>&M`m=K5j=`RiP3P zN*3w{D7X$+!yNU+LnQ3cIZV)9JJVLF<=V)?kEz}ZVLS|)A67OpQjw> z`PFVAOn{$k@k+zE>;u6aX|^Fjz$%>f6p#`jJx5waL`BDZP$7V0k3&EUjB>OJ!wEe{ zPWk%NKuO9H2jpmMdmB0xsJXmQ!{kG~kMyl+qn8mrRC-Cz-W@P2sUydeBfFGa!t%=7 zc)+vDAO0t zl}_Y7+=?t|8qZ;@Wp9|U?bHe^9@<^mPU&7{#H=>+#sI11C)&!^FhF~DJmmW0J$|&M zp;4f%7eF=3xdg%deV%X0>8 zl6!xRQ$mZei*$hj+tAan+>T=8l{oF3bNN*gkAD{!`Qu`twsFnz8f`fvh*p7$YF`_swH7qMT3B?+WSdrs+1ez06^l zdKTyWD&P`2Wl$Gs9C}qYO^UOA@bT9lg)5Xs(E-Whj%q+q00a?(jQ+Kv0m4GOcIWV^ zVX=HaO22pb3@n_fK*8Vt@d^fPH#r>p&KU37`z05a^J2k4n4H zu7*ZiB0dx_m#`RbA7 zb{nU-iIzgx0Ob1M(=#>JJ(4yF=a9X*J!;UJFNGuKW6AGM zS6aoydS;gs++4|kv7pK8{Hl3wCo}2~2>!{wCD)ZF@ezkkiMhitXUEVEDE4T|Rjr}) z$A*7pKL%*KWYtXf&N#z4*m3QOe5i+2p4p`M3&UCpta?6|Z59qe+mpprtWP^cOx9`G=;fBd$~pkW6nPc0hJzhA1OHFq2_=@4Rqw>F&OuzkQ8OQ znLybg=RN4K)QoGJmVcH~vMK%+1088trtWcC--UDybs8OGO@d@>^zI(7#pkDokM z`!M(`TnyTB&tW%EQT|`VVx`2WRz7j@N9?oW4J0$@GQ)dq$zDRa{OII1_UmKj9d|~) z(5@Ry)uU)GW6tD$v@?6%9N};}{&f-^u5D=A9sa*E+31$?Pdgq0j1SI`-kYCD_;>by zZ8>4o{B?Ae>f~*-Rt53b=cJ@%Dc?iseFhcMqZS?jvsF!?8Rc9ABZKv#QRXp|vDE3l z9Fo#gsp}U8_V}+3+^UZIN99_@Si(-^mur{9asWMRRLtaZdX@1~EcEY4|vHL~O?`{tT&-A8U_qs`9X(9D)-f*bHjL-jimQ*8Q-qG`qnWnk zhhoGJLUB!$v^@sa{qEy~O+$${BN6HmgB<<>vr!$-L>CP+g^O+uN%iB>v6HdW2x)Vk z@k05~EQ|M}JB0|F-0~esH$Wm|&tH1dCT~L%sNIgdei))`+7CkmP>=;>?!U^VF~wb& z(aDjVQUt8dZ^Tv}Vhf1IS#$VRrc-8ByNl>{uM;T29jV-wi%S{Ua!CYa3cHFZjV5Kt zBazn>(g_xl>`c2Kt}5bTJxWtZ!!Zo=oO@!f#1Tq)I6NAn;EZd)WPJ_yh3o{t!}_smWPL6IhqI2WSFg)M+>rEBTt|KHxhXlo$3xbVWSSP>HhAax)unS87RcO2 z-ZSY{v7N43jdu(l=BX=^%S*L*s#*wKfyw%sR=77|!TUFEl=d3bi#@7Vq8Aw%C!Eu; zTuft+Z_=v3$k=oPwM>v981ewANr2F;p4k5YIjUL#6!C9IPRylndU6P?>TFzZbMoWH zx>>N*F07e$h^BM{rvjBdN}4=-S+(3Z4&4XVw~5as!i94?-b+O|3cSh3Ii2!3^G93028MIdz&Dax?Osv_mp4>ngGq0553eN!zxNuD-Ol4w~%muzqf?@SJ6 z@N65q4&O>?Xfv9;ZmNTh{{V#vTvxHlU(R8~sxZpjHDf5;>8CzZ?Ee6Vx|}{C07^l% zzR;~T7|w7CF!U?N4SDrfDecmiIy<=Sl%AY(nuW2eb}coc{syzLn~>3`;ACTtm7-QE zGAyNn{{R@yJN;@}Y)(Y7L?Z!Ibm>OHa=Ev_$E8Ad9m-C;k^Ca5=rpcXl0D##`J{@m zS>f!pL$-wm;Ea#{wNhk(7|G~68ek^gFnWJlOol6};O@_-=T72it@59_^s5NyH1ZGP zDGPQ+yQ!68K^p=w$0rpx3kq_+*{UTiM89Vj$o@xwat(f_Uh2?@6#o$JDfY zO=S`-MR&%8Hr$+U9Xc9C*pgi~A1CagN0+y552s91xhFZOX)wtNv~(U$-MddrV;;3n zQ%fXpdWMpgk(+xp5yy|a*mtcWjM?QHX-?&;$AHj(unoKnNW_3Imu%z+B{U#VZ5UL(?7kp&><)^e5|8Z3Ni7ecqf_ zW{7hhayhEF3QkBA#4b*9diAMcVp0Jl=Ky-u0UmaNp5yeW82!TpfzL{@5#-PVnRjvy zPG|wS&H?B<)C_YR=N)~$C?%_bUaWfO7^?`Y4p!}-l=6QH1}g*8>(ADu3~n~?IpA~e zifjjl+B2MgjWH2zAZOp2ln+oTk=LG>r_@##$~Xj^1I0HYQn@II1CFPs{{UW-G$a6a z<2(#?;+4R8UZRl_9~Mai9M+ImB2v)YhS>COF^(}?C1aV&=8D^3mL0J`#~gvQ4_XOq zbXMiLJq1|~L)z4I{U`{svsmuVJ!x2c=$Kfj>+MB_?Fj{{bWz%nDO{N?wg8|GYV0XU zw;ixvC`g9xTSXY>(t$EqqAc74ifxdYayx!{XB4gvQbdaYieNZHjt@cYKoS(&j1HVp zdkVu=G0;#JEU5nIq{^`--GJazawaOngm^yKs!W%ttr-3uf|+YVyCw#EbfK~wbt}k< z!;XWm=St(XjOnBGJYtze2_eDHtpI$EfR0Z!&Udy*z&1B?#RQO@qkt$KfqI^lG&_rq z?a)w47~~A8@69wj07ITSQsyna3HI$6J*Z5~fT$Vu>MKI8prj70IjCYnynF(^G5S+N zA%|({)aNvt5)FW`01$irRPHdw(}e3q%e}c5xpccbQ?a3WGeJL|Bz>?nG z=q#B?QP-2!lR!kougi{j6vzfpPI1RHA;?9@8E>r&sE=XB2U01HOfXRGZlq&0ggoFJ zFzJj^Kt#l3j-TUAkSig^<~_Nfu>jrIrb#~32_cL)>)#X-)q@0cjEwc5E+*nVv(FR& zs^lIpdFewyD-wSWl+ZC1z!~bt`cfQ5Dwp~B#R44LSO7ZWfE)L@9jfjK7=C>}Du82$ zI8n*z^r}cgf*2h3=|B+xM>y$9;7k-BdP5_^kG(@c4Cf^GAW#fJ>&_?wK*NDRo3Pax z9P?B)sNgVgPAF_oK}j4IJW@;su>@oArq~Ss04AFO#BfJ)DpsQri0h6xtB4I{&p}C` zBw@%Wq2yEn9tvO@b`{A30C*j9#UX$Ia(a`T&;whs9XeK^IN@?fYE21-;(nAOQm~+J z&U2n9k!RC?1bjL6OL;t5GLJe!Vzwu;55C`zPtLMuHA$Y|cXIQwd0RO-!R%?AZ_L5D zkPoH>K$K2)?eme|tR&7aQ@Fv|+;dPCx#xPWqHXfZaqU(uk09}1imsuB8qf(J%uws< zhk}0!5-mF;=WmF5bXdu|jhZmOFYx-*vRXBKH>=(FPVqHu z9#b6X!12(G=LVBwjI7VUz8w5Xu=s&yJfb7i;ux9|G05&eO1L{69NgO;jf`{OoP%0i zkwD~*!~AItAZ%xz^=M2^MhN^VJphq%N#~Ae09=9(PS~j!xZT$|KD6&)Tpx~l5PDFC z^$;oDpQrMq2yl>`WO8T$74w|&)X)UL0*Y#f$~3-C-u}NzkqS=IN#M`|hTGSttqEK% zG1%kf>M7d8xhF%rAoa-{KSKMWcPY;v3&cgI==&iBIhyI?bs%!l+9 z(@7pqDy8&CR#zOhJ?o_-jp}on(kZxNdC$^;GM&sK zVYG49hJhGz#?iLym&xbw;*-!DC>ANf??WjwF7i<@J4YbqrJ)?m>a0&2K_t@ypSxn9 zgWiBSTg}bE;B_N+jE2dH4WH%oQA0Ehb-A1v|m6tZB9_Zw(tR@osALX-XfDR zyT*CvKgzR{xx7y#)UOVpiXDfW5i611dwxc1^RgUToak#i}>@w>tsPU7VlFrsc?xA20xW z@^M-ubM-V8f90k}UMS=#vdT6O)P7V+iX*`ior(Y?^{nq=*=tSH+WtbIXXd~@g0hs0 zgl>CPotoHNtSU2s&%I*Z&El+M>aDUCA9$P!Lzadnl%vm`)O9JJ$bW?do&AsuGuUGk z6$WnGFYz%M;C{3*MO~Y=!)qMgbUYn_Me+wjg`hH`3}pNT{=+{oz-tmroY zfE~mW(DEy2JEIzm`qti6o9ErRk9_3Sm@?N3zyg3ByFEwJn-J3*GUNhzrEsvpV=HC0 zlefM-Xt>iN7E&B>=qWL%+{)D~X0k~i%ii&f?Dh7|XE~%eLsJISNpo(OQpV7mj_eVCTrWH(6GV|I%BVGQYlGOESt5YgpN#H{(o z!;sj{dt=wC?auH+6I3w`uP}x@HMSiuCZC-(U`p^qfJCqKL zq;TD;(z**CZ6h5v@bw79(};97=ba-{aHO?2p(y4tD+C)$@{i-1-=< zT@Vx;jPN=ittl4CQFFyKu4N}WBt^&LjMK3<8Zz9G^`_Xlh}m}x`teZJ%S;0A z{biEyImU8)m-_c|?((J$-7BwlZcySaHu9O+2wzgNB1~Co@rj^ z8_^wvR%ve-j1QGS0CvFOP$XGi20_8cN(RJibtmwk2wlNDNBPA9NNge8?YD{ClYmi4 z{#9nExO81sULmlZ^Uwu9;aRy7;5Kgx>r;)9>GOG*&N18ask&s?=d~XSYZmHfy3^*4 zG#O_qNCUrWq{30Qr#IxTH)pLaQ(oK+`cV(fDFu@=bdo`SNP(&tPTr?39a{vjgkQt)lV zeBcYHN2vZG{cD!AE{{(MJ<;{Re{AQWu0*VLhbN46=}U482sZImu=XZ?oOU$cr0z$% z*RM*Jv>1ek9`y+pnUyamJq06mq9NpP-Dn7r9GqjEtU$@objCTYNU-4^;mMK+YSVA%F?@W}(5$V^tsBBI*Jn!O1#G4O>whw)M`^)A8Tibz>#~fy& za&JPkf<6I?9};|O@hn!#hU-+mlq4{W1&kg)05e+ArLL!)TBB$0kL>I47fkpK;pp^> zASBlARbKYvIm;3EM;!$`MMbhPjryMd02F>%EDj0lT$Z__c0PXbUYq@ct+|N)>gV^W ze!qM5r%qPTb63>44c0>Qj`VdCdKT}jS6R1hI#y*z+qj{@;Dc0%Iv8yd2+|k^)kF!$ zw-h!6-cSG&j+BO0k@JwFBvQSGkwWbF>fdUl~k;U*z$bU7!t(u)Z) zBF)>sG|CkuW1ZawC>4u98XiH?cfX6ZOaSrV`lFTW|;-nd?Qw zNCzC!D4SvaFKP)TRp@(lrx#!&Z0825T7bZxFCR*jz_1gHjtw9tE1Cdy4+VIj2#Dtc zinPFMAtRoh>98ot76&yTRg&K)rdJfM1sPX>M|{<=J~lbew|}i*-H$<`N*oc>rYlQ; zpbY1!tnMM@M<=(X1F)q=bL-xMZDvLk$H>X+%>gDfowy&Z1#X9sK+jrCfx~wNhduF3 z2!;s+9P>hVDmxDij35-*BtQ)PdQ_s49^GH_4Ck+E&9SjC1~4<6)gof-D<0SfJQ|>r7)UtC=8+N@P~?-)a%m!> z^bkjYa!*QN8yICs>p=pHu73;~8BtdafIZ(+(g z$@Jt>u}$0o>_;Y@h0HX4;s;;OfsIl#obir*=pYHojO65J6dFfuM}^}DJolw>5gZI{ z=BW_H=YR$=!KHBAToK3}{{TTi4PM#(X`o|p!-6Tj0TSd6ow`(xL|ED|d7wy62OUp2 zpalclwL1u0@knHWbJ$?>O#@wsv4$XY;)WpI&M}TD4&sxytu(GTp%4UQp8V1fpl7dI z2Wt-q2?ITIngk#_eUEx*M4)Xr=uQr3U?BM$ap*bv(iq%^=N+g9Azc05q;)g`9n%VU z?~0|UFy}cVIUG`A2gCD>bl_9HfC$_2p8aWD2KT_o9`uGT0mBNR4prQC=Zt6bsTxC= z1C!Gj6zmomoB%P%a?p&rz1R9Jl)QiBbE4#s60sqj-v|SJF&>f><8ml2z3b_Pp~iV2PcqJ_2RU- z2zrp|oO9C^4GpoIn`zoO>VE@GYDuS~YS&s7Jp^1v>Nd;&?Aj@Y5 z9sd9tLnQ>L`MT%541A)#(n%wpywE40)xr7Olf?jl;1Qlr6zmrfl!3QA^Ut*iL%}2E z?by(OV~n0Y=&G%{;&1#npL)AOc;I4A>- z205fMSRpquq-&p;gq^g(f(U;FcIGmb;2JXcl@r!0;fRW5k?AD68Rk<9kD3Q?7ckb2}A_g1HX-!0CT(n9ex zMUL38K+hceRPtGky$kV3h=a(^O5;8H*2x%2meqo;(g??ITA4c%wI8^WMovx#(xJ0t zi&pmSbpBEkl6fP&Vk?4BIZzQ~Itsy9{=cQ&SV7itt>kMe3wUdIdK85z&nV*uhk z`T80R<*FA?jbeFKNF}!C)C^EJvD#TC6-G~L0@gR}M$@>AkbBT1&FFBdH+JTR3EX6o zi3tOOJ9-~VMcB)SY(hxisz^sYv(69aOqNLor4*M5Z5Q#YkWYQRaa56~i2uQYp0jYGMctoWBpmffSX z)FDZm7+^s^&Z)N5iD?-6rn_%_0^3^Z5&6F^8@>S<{BcdknQ9!uUh7(X%EBwC{J@JS{gNj`io?uccCU9Fc*qTbqk%7TBzS706Z@Di1ip>xy2{ z1YvYmmc#78C9<)NKtbP*)oNEI)3HQEB_t8|2+l`b)u&@QMA_BZE$pr0LAP*bW9!ZZ zLwc3UeEad6!t(f!!%}G$>-)=#t3?^(tjkWEb-8iS*s$8wYMPAP1vQ=5@_HT&pqwPh zy+}|1BZ{=FOJ*$06z>NBdsQgh2du$%r}z2irAv0u280gmFAs3cK1KfkfR5g#yj*R5cVppAu;L>dSg8*(VU)z*wo-0^}+Y+nxi7Z5D&FotV35V zESTxg@rq$$!t+kUL(e0g^n}5FVUT|sK%K|rcRgqm)L}dvbk72*5Y>mmFn(_I_XI8l z7O|lw(4L&qNQT5^3P&AjmRDo>R1$oB`$*|zUfSv-?o9wjKkhOA02;x2tm%5AF#cap)^lj(Nt%&7LQAyS;fjfx)d}V;8Bx-61W3!j7ZbwMdCQOj(qY*ccv^(*(@? zf^bJ6Ml(%n2im`|hldwh_=Rz)&C^ZOCYW=NnaDtYTI{FrGlsnSAF&qJ>1?}4QPQC1 zkS8YWE5xi{6c@n}wAOs-f zb*dT(2xWg(fm&ef*C74L!hBW7zkrL<}c!KGiG;-b}9@bBfKHq(dM$x{09P6l8#Z{Z*j_Sq|=3*CvwzuQoyBsGz1*I6XS`rb%ER zeklzr4mjf=eiZIii8F;KuRKu3oru~tImhGpQn{Pekdz~z$BM3Dv_jGIfHrF#MbFFti z)JX(~E6=~ZayC*#gD=AM_5T3t(zrBv7sV}4OE5uf)1zupO_WqQAQ6HOu@w~E+0*R3 z+n#@KsK;&-?JN{ART=KgZ~**kRL*&$zq3|l&vJUxS`c(GDQ}ea>r(X^6~R#7&Vi+K zEzjAgE1jd&qg6=JAY-1Ml?Ov2Df}n( zrk#wIq7}mKJu23vy$G8x!RbcCwm~e656kKL(3QZ9JFh3491PX$NSoMn=|0h%y*blQiWnA`A?DYA#xdDL{Jhns=~rh|z`{xaNlL78+yzFG@++P9$b5Wj?h@ zhc1LZUU)roS}g=Kl{h@qjFk>}Jdr@GPZ?3)kTXeBfN`+H?#Y|cx|$0^lx2YJKn)9=XQ8RM$#Lu3iY`ovGoC4= zPcXX+@y=**C9%=K%)pU~sK-JsT1X4F+S-al7nM79s!T)5?OY0Jio|&11FyXd6BS|&^J6%u9^=Ymh2&F8 z;Ds?{VDK|Q?kdNDxqIfDVr1(XJpdW0C6*yWpO}6>jRhAGa!02$(5yQdIUNovP{{&g zr7$NsRpYKG6^Al{J?It4f}CK1K}D4u;~WYEkm5+-b~FmYV`<6lKnh1+U*|v-Suu^j zm0iGOfa5=fC$N!S(|9Tk5hL^`=xtx#t96QYJ&UpU2jfiW|xU`5Is_ z^1y?U)}6`a0K^=(MihZ)84SXK2LNV(91yX|>E4@S6sgHo;0i7~4P^*$Da8XqZs-p_ zl_TaNEy?;-Zc7w=pdW11j8*58`OphdLUKcK&sqY&MmHhjIG`AV07oQ~jP?}L208kC$EGO&%z0mXgVKOQw(uL0F`wx`G9okgeL1FtIh16czzlvg zFdU#tGEcwKkdr=+_$%RmDk(fyc(`WFaAb5};$ihXQf%h0J09ySn?_gj_UTIJCGKNf z$QO1`zqd-3CUf_91CTlBIIB!|IZaOBDzOLYOi1&cTJt-Q_vVrkJZHqWyLaKa1Eo?K z@^8c~ZI>}dz_W2$J&Q>5O)k;rR@gHqV_ec_Vpd17_+LqT`JuM}l0t$2?^ty@VH4eT zzXE7l^`O(WJ5*wd6=hHZsr3izU2)i%BjukQd;--pE!u~L*xye!Nv&-VW&XqA+%lMh|*nahvi$ z$NvDXuEI3qfRU4tS=?hDFr?>-U_`P4PJKTLu28rTxFC$wfWgPGHE2Qv<2dc!prnVW z9Y;~cQ_x8cJ#Y>=%}6n&#&g<$5R$_RDcC@u;ODPu69EAyk<*T}-he!Ua$BWH#{<+K zr32;{2kK1(y-ttAR-Sd&oJLkYdG)S{BbOIHcE_d03vtkz=utd&SyV{JPxIQHfwFXO zYM~(M(;SMFF{Q^}Ueq#Up^ttpqiG~LG`JUxurK|ee2=tIJBJ?Oo^`| zi4x68h`0ck8;Rum)-p|-%R?hs)^r(xwbU=-A-N$RkOAqCder+fE_)R1yh-8VACqf& z94ZM_^B56<_|zyfZe?T4zA$)$OozkM*y*?FaXtKz#>*M#igzCU4mqvqD;P>wJ~??a z@`GA1C`l>njGkyhv6*oDvVD5f5zIW>E@Eu8G&?nWDIedq=M%k zs1*ycL6Cc%)VWHz=DOSY9KJ}$2BED=hNqkAcZ#60j4}TJ3X^1c2D^2IaNM5MNt!_( zeFRN0U^!;V0M;#?F-KLQ4=IB4g+GQ*T9#d`d;b83ZD9)>48XgvE1slvHH4Y8bw5Hr z4QXQ6OP5h@8d4R0gRMjnw4IM%+%S0Jtr9NrAO|_7*+~!c4nmGcKdn3HOGEMq!N9?& zxIGAh%HGE#Dtqx=7rQxk(7k0iC@_664Ocac($v)Rx8r{v^)i*s z9BgaaSxs=lHRGq_Sh*X)cRh2%J{nj+no))ogqfl}84+U}V;py^*wIFHIXLglCTkUQ z&-IPZasrSB-oI1LHmrxS6S{fvB+P{sG zcZs|xmsd>bwbf%Ps@ce3Po_Hi)TuOvk}_`WHGN_wwvN&`k!}|08b=utU;;?*S-ZAc zNbhbgyg_o38(XMtrfd-F7|+u*t*E5TzwE7U=MrCQcLq=TWOfYFbej|^D3PaxE&lEG z&CSy>1-!`)4>aRMsn)sBTWC5I1B(dRy9gfzw^bR>%aK=Y3X8eS+;|GX&zWa& zb#8NpkE&&9^ z*Bt?^5T=oZsOlaxx$;J%ZES5}Q_Li8W7nsp4P2AX^)DUkH+K-}y8VQfvHhkgOvG>b zV{Gw?(hk}QyB>*Wt7upGxr*=^Bs=!V*dU&9iX>-dZf%bnp(sZjq0LR~Q$x&v3`xTt z2R@Xp2(Ky63US9jN@xsOt<}_=k?1{X>^s=!?vok*VziE=80^JQUic*XP`3-*qT2`{ z^#1_s){PU&Q=1tshw3Xf%TC4{C)zGaJgfi={{XamepNjSiZiv#g|fFZJA_g>`x0^gRIsTMIjVqeg`kG_Okl_WhfF#$UrBMf0bNW4HYEZfUxHo z3y*#UX3HH35l7`7!x{BG%?xRuRDQ`H3m@VSj3d_d7>j7yKl()EfwkNpkq`d2-A zypeW0@Kkx9Ge2V_kjWvCp~$DXFl9eXd^yw4_<O=! z)^KtMK;sAS&0*BqKMDEo;%R=xr%J;ChH?J@0l=f~4Ij#L{Og9aY|mbcx;uWEBph;0VEyAkz%T#~7mhz# zwV)3JoCD8#T;vGZBRK0s07Z`+j&t6#lQc|gChUXgY1+sW)P`ue!97JIRLZWQP7}Xl zK>3Q2u_I|5b4?0GZQInI^+d_otiu^@hoGQxVr0k2=sMA1DG&3pk^0b6kiK?C2kAmX z=Fn@o$Ky`K-r|W5-K0u-j`Mvf8rbqrieDD2ej3>^awXN|AGo*3$j=!+O39}pdHGTK zxvqGRQ1Na2-XQS|uPw~1NDO#UpSq)`wRKXY&oZS;wtlUC!@sifS;H5_{{V;<>e5J{ z>DIEL;C0?}$EG;0iOEx5W(i+Y^u}>5<-pI}1Z)G_>0Wbu%)4Bpu6UP8@T3M^UUgO( zAry`5ewpH>vs!fSeCy($j5?OHn@tH#os)6A5xs}6wNB?;C?m;T=9SFyNX;QREXO&k zj)zaPx;+y}k#D?_C-AyA{ql2L9&FW}k7%+0jo#FZ8nMtqaG(lIPf^lhL(fd~p_Ls9 z^TdUD>HTXaizqd*#&CG_rj>-u`N~FTamFt!m44_~(MQL$Z z`Ab~XZ#)67eZNj)_FIFOhxl04sB;>|tA?k%=pG}q@g29@bn-fU=m^T5_0LwDiR#g+ zrj4-q2i)hH#M&rDU`Ye6Y22aAirjaqC88s5f@xfiQQu}%z;3;1Ugafm3@Or`>=KCI zvnV^4r%E}5qCPkZoz&YYB6!pc9^EPm6P5(f1C#@fI?w}%2a(kFrhr1Z>(;16a~=*y zB>w8Bxh~zj)fHi&k3pXGHyI*`>wMp0+8OZ>SDcn{hUYG-#mNDWo zap-E30$(qXI~*K}O^)Q^9lWmxrAUV=oc7O5{{T7(u{ik!D~%!L7-t`qG%>(n0zGH} z%-r+ECIspU@7s(}wE|t6!0tsdLuYQB^`K~fm-7y|=9(Dg13c0b5T56uphRaRfr;dvQ~6DmcjFj=a;^0Zw$tz!^0mvGFiaaP^hXL5~GM`qedYFy!O7B<8Bc zMG|cQ@G?(NYL+I1+J5l^noWtTid5&0q-4;T(i*EH0g=d}jP_ zq(>+SKZ~g6noPS0&=vvv(@#Qn6%gkQ?^AN^bT5=2biAZUTDJ$uU1C)h^L0~ck z0dgi`+XT~B0sH}#=brT0liXt+hdktD@ks+@YycaNy<07?3&B?DQYmSujDzntTygJL zb2X@eIKlMkOw!^U1}pqr8bpJT4iD)<0T&C%I3Umii7 zK|+SdPMzohPDiml=m3}n>~l#8kgy#)o_`8tilaFIaqB}16UKV&ImzUGDhfd>Hc1%U zRE9yo`B%B%)dWB{VtwfV?m8c>Fo*>l;+4k6u+Pc|Ip&Lz$_}lKzJLl7226(>9=QIr zn9#Y&#CRn0O$(TTm`HH_vS^w0Yez~LwQH63U`VDR)(Ejp6oSb$PnT+LQ>?=DveIC*+KFxN)3I$Q@D=L)~J|=SV zxxEf@{{UEm5<^QGfu5$k+S#otT}|PGn>h=ucG6?9u9b7pXRUH9@{46l1wO@Anh*;^ zI!Fg3174ON9Zsgr7*xZ`JENA=uEq%*FRgbeC)CNsqs(>7;g(=}RocWe=dT=V;>O-t z+~a8A`_;lX6!bnuy}y@PkX<-FSYiRk6*GMfnsLzV{5@m`LHEB(bmjv-AmQN&uzYM_I_myWCN$2C!A zidQ|NBxihM82+_QlynUa)Y`p0O-dO?PDxS5M|xnH50ji^@@Tjr8X_`5>Blq=l#E1M z=KkpBoy5@6$i$DtkEItHVvH#shtiOQ&eC^(5Xhhy*v41qJ$d|%1Evy|>mPaq!5HM# zTT6)+JiM@p5$5Cj0{wsSxRc7cutaX=<|CxtD%t79%cX&X8A71v2< zc{sW2W3!1i=O^axT?<2ru^BkpdQozDNk#`#z^E*Zm=B>mQY9iH0XaPM#Zp6TV<~P% zI`^kyREAG1w*(uB8TRztbAUTkv|46+!5JrkgWKMkM9G=+#EwotC!VyL99e~P3i2{? zqo|-}B%7n^bCKGWhKdu)PF1^RhoH=RsWZs$)`Tk4zAV>rDQ>sBxl>wp|Y)Xdk%@Y^<5Kl1rF0D!TfAg7-B4b!E?#L17k265D$C>v*SVlbz1$*k?EYh$9e zB}Q@UkH)PMUba9vZoMg!)U_&-Hm`hUf@G|5x|1!gqiu4(#vTVP(1JG)$ch0MSXCL&XAm z0{ALBkKSunlif&qkamIi13-<~v<*7eC5Ah6WKIB)Lmyt^l(hzKTSBq_0I5))?hU+t z6*e432=c|G>N-%O4n%=K1RjQ}!o9{}au>5=jm2U^7#IVbXB1c&2Hm|na%qLG4H$eM zf9F7KGspmPIud^>0_3gF)c*h~EF!swji;Pqf!v9d<7o8l?r1_~S3}Xd_Qg92<#Px* z-@(O8Ei0ocW!aSk@rqz#I1!Ov3JoGrxsSyfZak)kQMX>9zjpj~7^1|bV6^eAx-(mAuuEYu;D=MR zdi>N9k-E2VUdCR=Xyrq|DA}iQXw1Ef4fBJM+O=C5T*Q@elHCVNE!3shr!s}l89hHb zY1}PiGUYMN3~3n>E@t_DNRCTmzrAOvtX_vRs@+GaUD??v&RfrA^jQ0!$MvEyxl(pI zg_OyJX2D~}y*iIe9T;fyJCo0FJi^Ry7x`3dIVa@YIY*zz>Waq{{Z!DRyG zO)+wk79)Yr6=Gnp$5enN1@}^sXG#5UIG9)=9S7u zOvPAjZVzffv6&=cS&AI?0y zH-8c0sRKn>6gb*_2sFgXvL?=*Gl~GHa)6G%U&@fR6sCFYRdF?72wQ{3JJQ^0BY?=r z`Ex>c3s{7y$;UkO{3@FgLr4SV9^6#jEymI0e-?f%+59!LF~CIn#HvJ4ft|VjCi+x8 zb{$HJDE!>kb$kB+6W>j%Yg07WvmCQGVdy=pXhO{3oVuS|e#jrQ#J?H5Mw-T~rF=7` zIy~%n5;*5z_32%U_e$*JY0c<<8ScV2(sBC}^@JUzEOM&jb$!0zMy#*FJV+#%o)TqvS zA6hmxNR1W?A2xuRa1Ntetx3`Q$R92kgoJ^M|%42lPF)~w-?)mynMkF6pJNh6b< zasF{rCS9$$9I{7lrhAtO8051aE6vAdH1MkPe|G0p95m|ek3H2qe`#pUmVnLZdJ6fR zR};zUPB!zBvi#3pj!><6Kf6Ry+_hUV6{568lT#8=X+gsrE50{B^3J z-F0A0exP$+jvF|wePw@@j(XTAJr(}|Gm*IQZkd0Zd*W^8JbdE=HSgiGZe{N$@?Y>z zGPVPkRCw3LzY4agrOP$31>+uMY!5th!LNRt)3Z$Ct4*b;^ACi4b#vj%;VdU?s&TaP zt~=(s=LIBlQLO2+?N1B%rpv`v;^xh;kpG27OG-r``f$UJ-1iY#0VXB>_{ItmkR0Kv%_AB8~2Wb?RnriEfW z=Z{K5AD(g3GytvG5z?K&RXHA{9DbC5GnL0RVj2(TXaXb1HL}$?H`2AtBta zD~@{7Wue$1ay!!jNh3KN&;i$iI#2>+07tJh1%_@vjX?zY$4;GU%M9&3Fn^Y40j5AZ zR1V{ZBzC~2fL7phO@QHy5<1fmD8pwt$E8h#-H8GKF^uzyv}E1OSQ(+2vdD;@dG@M` z6q&1UZISaFR)m&gh$tSWnFWCtLFwL_Lb-K79QC1-xiXCW{{W|YEJTNd=Odu15@e|! zNIuk%?_$O~ccvyNIOTeDpnH#vc?4rL0Vz4@NR~G_>BrW99LLgt8l6UZ=7Ff(xLB|Y z(DRyM%1DS~8%{@h3b8ji$Kyda9tTamaY#&f9hrmJg7-aFDO&~rdA5bY+w#L^`UAP zERUNiJ+X?3XhU`+Ty5s2=BXAVUD;y*KS990+o$1D-G)uK01?=C^r_|nH=sFT&s@>W z3qrd{faLY{_NxImu5;6+G)#zITzsqRnmJ6!5@s!t+r3&wh>6L^JxHKe5wN`W??tXF zjbn`Q&!uRImZGW8KgEueGC-Vhjyh6E2(i~Af@;ca3b5(cfj4wJcNoV*jL;<#Oa=Sj zon{0Kc9MHlfW{fX=cO``(nC;E)PLSxr?{y^$$-O>Msd=pn2XbGH zpkR7g%r65O$67>W^ zLtx|SO(BsfCztO*19p+g9cUjY{CDg-{U`|x1ohxx;Cs^8Ll@=9J%9T3Oc6VBm|T<3 zG?3&opvdfKVG$S{kfX0!XiW=@WOeze50q{&cDEqnfiyduln3ce2u=CN9W$Ck6c9RR z+No*`kxw5W^Z;Xw9=w_WRUqUJ4;0u$ ze$a9kw*=A?WME?>sW>$51Bl2koO;mMwmnnf=fg{n7fQF+pvR@5`J170{n718=5w92 zKB&?2*O6a$o2lU$BD%9ZNH(6S2MFXEk@T`@jnSC*zG!AKJMq8y?4*&*AU1!rF(0brEojka~g$>_M+95tG)Vt(X0~x#&j~ z8LMCKIGdjvYFaLBb;yZ{cscvuP-~|JnpML-S9^A6J$xi;YQFsY#uT=nDa+|$BR~vvwEK&{9o}Ll5Nv0{$Nkc2dS?`X{iv8Gd46&2PKb();U2k zItdByo}#g6>1(1kd?%wl>!Qc^jd9-W?WeY<(-u~XV**;mz>Prn&vRXL&`Fj7_3MuH zb|hXG9=**843C_jdQU+Q8B$7~yb;)n61X>G%DiXrdqVMoo0X63cf&hnj{p*VMG_NN zK2GtM!mW3~4ANafZY;t1XNY8D-xW5wlZ}rz;fEuTdLE;dAda0W4l+LU_%HEZ*T%@2CbufXt;C}njuv1z7(Tr!BF zCzt*H++u*JMv$DJT+wkM?HM08Y|vPX8RzRsvQcElvHtTMe@c*OMmPi>PBT=25D-)z zz;R3@Iyn5ou`hG=s*1Us-zvH6dVR3BjUfY~fHPgNR!4AR;->|gH#P3 zX{_Gl6wW>R^)(Vkl+QEPFBRi!cQ_|FBC~Ni5}YBDIb0B= zXYr^sJN+Wt%t9P=>GiDUJD&644-fwUY50S~Fk^Iv=5xUQ>__@mPgAa%x<5_`Tx=Z| zfsa8l)#mv0AO>BnoJV8UPFb9rF+9S`dUga;5Xj^zcY9N~5}SYk z1F)n!6qcSzJz9G403n}@~Ne^k>ET?}Y}R zsn4aj`BBMJjAR=1RJoD!^&`sK8ExU1PzF4X>S7Nkn~V7(*m@C2UTlt&ioDy zB*3{GU}Se4e;Oo;L#4pU9dK(lQf3{`-UqcYy;;a#+Zpa;axkVf89v6628s0RR#_#Q zL56-tK7dfiW2>}oHjiFDlvsmuAUFr7G|(er50HMe2QcQceZLw_6Hnbj(xqUl(jPNbsK9HX(wXR zc2wk_%8Qy<p>ROs1%cv)29@fV+!wV5uaKTuo9EC)dvp{7 zWp*TFo`muE&&c=Z*+jB{bHe)f_2QcZ%=@HU zh|G5?vPZ|?0R3u4akm~9vJP%E(Dt)^?8Z(w?~av839~Zh_gmAOb;L<~Zhwd$-U0Ng z*q%~YbxTb_K1L}o@g#!`4GENnyOW&t&u>bhOLH#d1{gg>Ez6axRb8N6uA3eiuT>k(JNN@o9o=s9#)VU+3wv_~q{{Y<_XVmdoPgBsL?m@C5 z8sPbCKn`~2-0@RY*%(1x>QnIy>25?00Ay7{eeqEpjq68S93&I(cbNU)3WMq@tU0SI z8JdPBRzOG$r<3j}iD+{XM1dkz`F5&~x#&N}krIh&HQX_r=bw5=TNa@CCIt7zQY{73PrWTm+0sOeILBv@Ad9OP%MQy`o^bDZZHq@BQ&H-BD~0cBVL$6oa81c=xh zM^Vq`NCy+s*U(TdQQ+g}9-PxdA`)a}hBH*z1bF3(_4WHGUNUQifdt1XO4K31Z0aJae9i{25oA2exdTQ zZ1IfMqY3VD^9}8}#(CgYm$9Extf{n~Gl9)(N*8DS;!bgsiaABiVpxL2pCHE^ z&rxpMvaU1eXk?uI#k@1jmo5(Y&gAEcEKwc9t->|4 zu48eGQ)re|j?p2BU_fw#XwP1~=?_C5>JAFG-p3RS=WdYT=buACCRg0fdYWi1WnB=; zO5|syY7Lyd=LF}PXirm;)EoxsOwB8t7O2~IXRdmB)JYq~*z~{I+r$G;@l?7yJ|om% zaktgek@)&oC0J;Bm@1c+r`(Eq4xKB_dLD~cEubUj9k{1^i2ceJM9#v_^jRXt^yAG8U@l1V-548ZKRf z%RL8E(v|KO94*P=hzHV@!4jK5N6YzUmoZ$RY|CJd{b=VGE~kk6WcaUP@XpNHTa>uh zXH(@w4-xUzvHDU^n8viZPt9FpSGw^9g)-yj zEI{Puxog&S9lISAu=YH+S=O}=5Y6_TUS^d4016UzjQdtAL#h<)W~@LBq;M&=X!Rss zPp3+2VU~oUa=m!sprpm~m!$;~Nc-?qV1gJLsIwZdx@WfdX7O(A5a*m$t=#e_riY?h zu^=XXVM(w^tF7zMXfXNHeA1DGLVDNC=XvVFdy(Cqt_K0_pEKC=31PnRD3esxW;WIl zuHsI1;Cc@A@;H1AY{q=gXVw1zUT4u&t4|9HEiLz(nqHTq%L2=%A$`Q*oD7_L4@&y1 zCk)Z1uPe9s9u0inbJ1wO63xw*lZ>tvjyMB~^{M65KSH&>GvRV z=tvwdr{P^6QG-@!%j;84_h+AKIy|?=QLC&|+p#7yum@3}=~*nQ5Y{(F%Nr)OI4jLF z>=DZaoQ*A_k~TjiXSG!*I!w7$RThWOy63@I^~fJo@VuT~+-`Tkz+mT|4^dvdEJ@7p z%6j!Y!%fz;e}~$NMS7CkN{x)LJ6Lr5Yod0jjD6}1`yav{GPLo1zngB#mn-+;&p%P^ zTr;HNdUSD0Yg4ja*#W=Ftdcf*>ODuG&T~UTh-YZX!8xgr(-ZGxFBug@qy&N2H3f~% zaz|4`U@2^4ZZpT_PT)P1FHc^dS`Z10aollKAx9r6=}<8kbCo5WfL^`K4l8AA!=Hv?yaZ zUzC0ntQQo_xy@H7xrAv3J#uJBIfp4NfH>>V){av-GRF&m{d&@B!-&)J=RAsLml~Mh z9`uqIF>M!dB#vsLjAY4Ca&wH+XqL;dqLK1?)hOJS%@j?f1JHD9A{QF(1Nz$)JM2B;ax}O5i6@d8R&67A1Og%~&?jiPV$rfN758 z%nmX*12vmuSO{hybm~nsRmjNapQcA@u(id&+C6jLmBczhfO+T!MI;1ZWk@`ZKMG9% z&M;Szj-ItZSThyKVb`doU?ac;sUDQc<_?5z&w2|=&JIpR zE1B|-Jb*vF-`;?bnK&z+LG9^9iWCjQamXNJ6c9B^w@#GHh==7|lY`!p0Sk;^ag&UG z6cfxd<@D#$lM)vs{KuzS8D)nY4tecD0jF+$Zobt)%mX72$Gsv3uqP!r$65;q035Gs z32ws~a=33=1-K4D^`LPSVX_AtP#cIc6!pP4IHz$T$8P}kq&W%*2E1xmdEn-Db1KO4y)NJW5{+>skmfV{#?L)E3i_DV zQ;KIFv*c&d`hB=*R^5hTi8nv;1M{KFLr6yFOW>_1?A~qbC>*d+j-1vIh274!v^@+l zIr??_*G|SmF_V+m82qUxVU8=FI}R%OfCw1puS`^KG=_j!?H%a3Ef(56zbNB8@kkhv zh}k^3)nr4%D}X`#>9N}9jQHc=7KP$q_u3&Eb@wDHDe~C+fM`t4P(DKOkHhV6!40=s zfsL^^ON9if$FHRpFq~P(THMKE>3w4(#c>%9lBpnroQzaSTyd4QKKJ-F@wPu1K%N`% zJc2E0MiH2RvjP7Avs7$#!dFMWJDuA)b~Ml-2*?EY#!WJawqO!@?@WR@V&^I{1v{2i zSoabRc;nWYKG4vE3C=k==AfVfazN`*iaz-20kPeY@xLzsT2n=`xCUf63$ILYW zImoGF+>FQDxa*ohVjN@f^{orJyWz_pv|Xb}GN=m>eXCkAx#wc4J7{{Me4w#CE43rX zWodV_01kN+o`Q*CPnVKUT9U{CX$T9)8Rn5Jup`}!RU}MC{mg(fw;86D%4mt0wo6iI zWl4_ViV!wu$PZ55p7fX^grfs;<2>_@Xa;6X=N|M7%bl^;j`RVEa7QjFFgdHE@|=BX zlyfsq4npysqu!Gw=WiQ#Q}0o0jXh3I^?(dIHVLMRlDWfQ%f{~A=-7QvC-EHRL3GDC zCX1RvHaweDygs~jtlKwHvA|6#&oPmH^J5~inb8w_PmHf#xhDdlmU>6c_{(}#Ty_ok;C88FLyLo) zb>^DXOs|pCzhBCg#44V{r8`^*K(KmoIbAB`|2R3`-W=Arik$$lhh zIFb!kH79makA5q=4=bKdI+rfJ&IJ<*z#hlFbtHNBG_B$Z*Zk(K=tE}Ru;AyRpk{(X zNb=LKQ<|3{qLtSNX#O7c28hIvtc*rD7{x2tv}Iky7<0%ZAIgSP9RSOHeJCZG_WuAk zE$huP4cHK5E;!C89gSGnuQFKXcHea-$K}x?Fbr!IIqk?aO|2 z0ksw_NgQ z26;ny)#9HVg6Xgde8(rc*miqaagY=IZ%4^G=_-fGtc2{~ingU#E|Tz=kdY@KgTbpCM?d2YLEyAaGRWrQ@%)HXbp^Vg zr>#xL7>=~Jio!Ipwj`KP44$VQPvUBuEkm88i6DPGK0fd{salWZFMt{{UrQhil*;1;=@H7+p(NKWLbc0|ovO>%gxk z7gFz+vF~9h@<#n%Q_4>yPJ3<59T^OOb=p zi-U-T@-n9wsc5@c{O9=jrhSjb^C{p<3~~Yf`Tqdx8Xy&QK4b9`uIJ-`PCpZh=t$;n z$C7Gib9rE3AM?dhMsjC2BxeUB0B8J~v}bD&G$qIb_^>cN&MT&gl~*M;V}LoIaqLQd^vXP}!o?=KMXc9}9ScP1lDD1@?Bq9nWnj!i?cgt1fGL6*G`>}Hmv!X>mLk02kSo(q!+V; zW1|8KPU_iV+$i_;t8%bL9LL}O1Nd#B{5Olr@YGvw8FtA#kKQ-q&0{)^osgx_{@^KO6mZz=9e3r32YogXUn=f2hg24MwS22fs zWCLWV0E~3)Nsa7sT8)avKIr@^)~Hd?^BsFeK(ZS}!?sR6Nvd(U+qS2jSjYX7s0Ne$ zME?LI=ljE<{*{`KDcgpsU-3_abiWor*4nHpPdi^6k4{AqpDEKiYH6P}YCZzjz8&6w zYIt%(GzxRDXK(}4IT)_BH6(emr0E{{;ExzWMAB|E5Sc$S*2hym>pE$v84Q4wDl6mjk zR)p9<*#Ln+$;Yh%u;6fVy^R+dWa{0AV^B*cjk+9Shpxl1AYum|wC*9m@r+P_LU1#V z^uT6Ia1X913l1Y_80QC?cNKs)ts#wO$SgXaN&to19QGVg4H5akXYi$QScu`bemKQ2 zWGp}#J^7$V#y(j*jxuYW=b|T-lbqyr{As3Dhke|ubzkbAz70%Bko>6oO9fm_N>f2zF-ydt@)`f)%sARJ@s zMS&{}ecupD>b(~(V&ZaF;%N)x#uBIF$Vaw(u7 zQJ$lo4k%->BN8*%4rz(258Isc#%Wvzu~GNC(*dPPZ^D^Z6^SPq`icqMdVqb8r66j= zWdi>ILG_>#xbidfBlVyGM;i~PUwQygGB7zNfB@i}Qm_!R?j&c9q?%;NYp6lfKBj>J zsLtM}pK1pY;1wH4$sH&tR`~%cG3i3oo?8)}iyyD)O@a=G2Z4i%K)^2{xXl2NaM{S`88i)`IZzL! z0vv-MJ9W(ih|riMFQLhxPeHtnYMK*vJ>%hr!n5KHz9iTFO*TK75b?hq&$UUFNm%SY zA$(thON{ti!5c#&`EpL6ZBJ#VV+9UoMeujSEgUm=w^jY+)x$DG&ysfM=5NH**qV~% z(DoAwZ*zS;qzLfs zY{zJ2G4NcLW9n;2q4Yjv_>1BMirLoel7xYg)O-CaEKNRm*w&2sWQ>0ZY2w*p)?vok z7!RWk)#c%8a!Zw-rEOKupmb|Tkwi>>X?}SRzhPa{o%AN0Pf4`3TUb^E1SsaVgmfDw z9Gnw@Op;Oyl6!j7uvm!awqrLbHa42gt7&?)OFguM1s|v3=|L@A_^;xJz`M-@%-1|B4bGl9cypIQ>IONhTBDv& zvGeRRNeqH}cQMZ!WHRu|NAmZmlu1s<+y4LvzBMO`Q9L=~i3ED00HU4T$D0r(=LInx&x9 zIXnB3Hx@Y^Dp-ymRJjTW{vHonE@+k6hvL9pQRJ60}6i5{Qf$bNX)M;$o#sF87v+4>3lJZU1=NVwF(pWjL& z1o{q5V{@%&kD{H4<$Hd$NRnh+ou}}jI}4P*6aWnVhMzGl7L@@RqnHu^N99$x3RtoE zk8YHbunlO#9(lzkz^x)={JsAGl{c`_8zu+gQjEw6!NKT7RjgW9B0FPXXx7n^>}Ncn6`Yy}`Sk6|`fHc+Vc$pcbZ{7BTCd zwUa8=FmBwclmniaq|H+~qIRrGL=!2p1#x~4r=Q%Cd2oK z4N0=jC2g;C-9_%S(g>CFYzgxIZ2YIKGNYkf1?|^^pIT@nBM{sX$LmRiQ5yyWY3YI}3zCtXV*vNf09TY_ zl6W}d-hf4BJ;|V=J^j7uph$j4N<@{NfhQffprl03IlvsygovEvY&`d(;U#jchXW%% zw9yu^UPWR?@8awDQYfb~2LpH3f_jyU0l*vz3$YB1=478*33?Rd8O}b2or2{yi@SQ9 zeJZ&@X}O;`Uzlw<9DiB?vociO@}8p^6s=*VWL#U|e8+*y8CNMv0N%&S8j8 z6Jkv59^<&7qqhZ5ntGC2I9NibFSibR=AGRN0G=vjUBMF|IOFC3 z^D4GRId`C0A`aoVaTbBWa3To_RKgN%`n zYTgEOdK_nne2E+F*4Yw+wUBoe)fn96Y~U`V5#*sDQ*kaV<|a~Q`Hyo*Z1rz|{{RkT z_>toq9UTESvB)O4I3x(rAq)k=u)C&de-pm|ie7t{+RkSUUg23ar9MmQvQgP2pYzYH$2h50*VFZ!b0wKVedB-dHJvGPm0B8H_>09TOS7kcU#>~6$h({^9!Y$m zn{es^E=hHL_$18Oa`HOYwT1Dtl&)*TSsizx|&OYrh8`G$&n;kdMvBgWYz^cW_oqTnZ%Tx1ViQxlNW4?BDH zsc5l{@?bC-&MF>*Of!t*si$FIQ3C)?BSFsK{Y@kSnRj$J^~Ep{+;m@lXeI1;H^zUB z_P-9Tn@G|ePp(V=3I;?#{{Rs=>*y*JT$wYfqP)+|y+->`@de}E-pKcN^S@kWn4ZGB zVGAS9lX5<^_(S_RyO_LB@c|UZ0BCH3bJHNcKb2FJi-iXDXW919M`;RK+8~M)8&wp1 zpjSNQbFwkE#iR}VTyzx|D6$s^HASK2a(Jj1iaQ>9&;!PLbj1KEa>t&u1;T(740Pn0 zO@XnaU44?|Zr~A$(lW8fiKlgQ(DkiBu5IAb?fI7J!tKXlUnRsh#8iz1(kbmCS}Zd1QEfY4ntFfs+_NCq?#$C%r&=QKv>BKIX;z9mY~*$ zl4|8{OF|FtSLWN_1HEY_b4pIfL8jdsyJ+Vvmiw*lMRQFar5|{G#7lHMxj@EhBP$zD zH_@JHt@tk7$@cqP+g>RR9mHoGj?62jGrBzLw4FC}b>14(Z*J|{9c5Hp#CDfnjyoFX zoNRVss&gZw=cn?hvD7t>r(a4eCdh*l4spTaiwQAvxPCN>9KbpE#Q-WqPkhyq_9a;M z{K?O!)|xXcDi-B{+()HV$S2r&KD^L{&0!3CfIo#2K-pQ~1aaD@V2sSUB9o}ds~-r^-!1aU!Sgpwr+OJL9j z8RNBDGq~;SPs{gl){r5?9=I8xEKIG=MJ6KBK39{^wNh3ciBybbezfcj0e%4QOe`_Z zKC}ZuXMorukVmmL^NgR$f%28ukU09$up|s{K2yaET}W8)2e&kkGA3+rDTs-Vat#2; zTyEN<>M`j+A0f-M`(uyJxsmFOAmanuwG5Iphq3B8=8KTf$%6Io)7qM06hkiDrF7Yhu0j^C2k}{ zaqU4z~SjSU^rbY6D^;z$c-r5Q8oOZYp*GRG+%t>VT6QhSllm(-^Gw0t_4h z)2}qjTNd_iA2%L`f=bN1VAg>V;~bM&qLU*$aHE>CZ)PK8oN>omWrlKb+XjGWUWW>J z9X}dG76{xi&{P2)2VsDE)!eb6InQ%S0iXx7?mI^q z$3C>sHfU(}uwLHV+v*Z*ws{Ad{)wJ{N-isCde@J>D?Y4)!#)yIYolAQmKbo-1>^Zs zYQ`!TXPbCe!_)YmQ-epe7&18AM`g}flk}mn&e2EQ5X5X+EiTG1wpP&u4142_Kb=L6 z2}FPUn6GvWI~6n|-PoZ|w!Xsed= zM@&duhOU!7VlueoeiR1e%sX`LiUiRZI2`u=bkK;$T=p2GG(FP3x!`%n_N}~#QGt$l!P*G!2DFm-`){BLV>xpo?PXd_iWJx&2 z9E0ybSjV^}`06p!qu1d179D4qhEe(^FP~7Jkr_ho&8Q}FbF=DY%Oxb?+!YOFK{QoBL}Swl#ymI$~OvkB(gzZLkx^# znpd$eT@Ri-S*HI0W$LZ~!bo=lE7PRzj|&k`mPI&U70_~X8`fl;spxQNm9e2NLX*_i zOtfNNsQx~bnMMn!$#(VWQrT$~FE+Bae(4=YP;pAdCO{!u7;_2z^Wj4uQ~nedT+(gZb>lY!QTE0B~UC%0M#K){2?em$tL72J=zjLE~zD)?0S7GxX zN&#wAX!3Fo6f(-PfN|6gm1$^0MP?ZUb|0Ne5=0V>!wtac#a+sJ6em#s0EZbA$TKC6 z8Dq~F{C#KxHsEI^yKz~vjC;6>f(YzC8fn;Q<)@d+47k8t5t^;U%y}ddbUfy$Xv4cv zCKmvbcpZWD{3tYvGc_9_aw1V6K^p_NxucZYomU5;I6?OiV4j~!nIbQ8#rp#kaIXOr zXX89`iJ+{o5Sf(~dwNH&3lw(B)dQ66)B&DiA(q zY|2k!M->lJ+Oek{w&UgiNx;Y*DA=^LH++&}!}Fi%O*1BpZB8tNd|(kxf_5$G$+#-7 zECxubfih+QJLjhNNHx_kH(q07&}x z%^kYq^shN1x0wjfpPQv7Oo;d3IcpuiIn0C0c z4sZqsYHV}ZhXqp4LBvH8>D#MoOWoa2vr?51#3(VkIx z0cP9!R_Pq_dYF?SVpV?{zP2X!N2Gid(hjlX?+)qexkuDtC+LSH{*~8gf`RuRx!Qmrjwuk9W0H6o_MjRk7&#}m zG+dIQ!DH*|KqN;afB^NYPQh!H3uN`ZA_Ch;I4gqg;BdR7u=Wi#y0* zszzL7ap_z~X2KE3P&)EYy#;Pr>4hVX^cl29cpJYjrf6)@Xg4Ghqk-EUDW_o)5sm@p zr45C~NJE33gZb35;_OmxzzP#IkzIl9)S4ZIaTt&{4tW%i+ZZ=;N8?lxIUk5xo%W64 zty5Ug{{Z9m+TG<≫U31!XZyWAfWZ(6#T0I;n?DjqkM!hTSB*;X&@i_V%vYaI|iD z)^ca)C&HhA`d`D;T~AeCwd+hWUBD`wbW#0kYE(L@Q?}>4n8`c3)(%%XIYjcpjDg6d zaBD&Fs2+qK)h&WU#t%-tDTGJk826`QhU6~032Ne;<0FI8f`>ML zttN?Vkr=Pf{6oDyT?vxrI%qFty1szhoXZWYjtBc)E5fNq+G13_3x!8claHzEc9#s{ zB9|U!)!&XranCPbM(pU?NzZ27FIw< z9C7;8r*Se5oA|rXHKAHoAmsF+l@gy{r3S>K=HUlDYGep=05~6&3D~O)R3P$sslCbN z9Ag0EzBBJlF*Ra9bH)chr7luQHt+}cYSBEzr-8>xLcNOQg*YCZilkc9v>DD0DQ-lO zD9Hmo>7`;x*RFejMH`8egM*I!YL;K3{Ln znKDGIH+B50GHfRCjz&+VK2S>Hkfeg#ib2XCAh&#fN*W7Te+QBJ&W%NXicf@?5DWQ^yUYf-i!CkOgf2#gRg=YYn5BmjY&^*t$$D0}q5^ff4!Mx=G^ zLmF2kE-{wm3M?y(;E$&i#zM|I_wP*;%t{v{=Hz=+wo*h5%WeRWDv=ie*~upvqQVy^ zgyRO0QU}4w9k>9{COt+54s+Up^8h>kQPZ571V73Hryc(Q8dofg%^|Pc@L8gM@9Z4_|iFXGO_LwDCC~qs5sG? zbl7iEO##neunKne??^0g+N9W4E5V>mo@uUK6&nG^UQG<7?0Bb$b%usEjx1w#Pvh2{ zV{*BVn!IhQq%812cPJc;^cA(VBFCKgb`P{%86V}|*%_>4&bms+vG{*a@-MciBYGU? zr_@)Uh}E6+5%d+cxP~-+6Ue8d4C%18ijnoix`q5%4K{Rpx8Tfgkct-N) zRL~=6P0|Hu$K6hIz@*1YHakWnF*(Z9DUU`3;CAckXt3hRVm;5+lN%;75H|tS`qLQi zIIub3o-;rbZvcF`2A~N9nOrv~0)Q*LxH&)ms-%bmA=}4lO`0X3)0b>_G=x6IJj;la zkG=`5Be{ijc(d4T!jKL#UGY{tDVGocMtTg@Ct?{PJQA4Bc%iYRHw}-QlT4WnB!h}Y z2<$@QlN3razH|JA2@RB_BxEmK(84Inm05}BvHH>(Nq`rYk1Sh@-}QOLey)dz!17!Y2nGEyg(~ z2D#;_(6lwJq3@oClVu%dj-e+3d1{Fl4Ns!H0i_%JxS>Vm+$INKn~LR=I$;y^y4KP= z2w|{brn-$32xzBUngvV=;&6DyEOwh!%B5wO}+Z2mh4Iq`^a18<~laHA?P&9zJ zWemM@$fsd6MsQC(D7iZbp-C9z3P_@x9;fjX4I&qO9Ctj51otXQh55SVng)e9!1U+! zrio=@L+6T-Ud3Niie;@z(l$uiDWYD4B#pp(WYe|Aif_(Ww_KVOopn^x@B4>G4v>&g ziP57GDS?qAgwY)$DkUW%BV|YE_{!D~!Hn¬<1+Nas(o+cUrc^p!m35y zSE3$wy=K%FLQ)$1)NEaldb@sy@)P_5$!sWa9pPPP==X#5c5VGgu`#&}DuOHP)cJbP{O-OO( zj|=7!W@s1;w@<6%WLjF9@QZSuEL?aqit9FCyv%5&0#BY!54e!P_l-959F;OgZxU^$ zQuf_=@xFVi^N%nZ!xGVeP}%#jY~OA$>%vcJh{l%rLAeV8pt$sb*&3cKaPU#dLjSX! zsJdV%z9O+;TfX-5)V%b+hfr!2O0*BmBO#|wyr^ctez(E2~K~K@Webe zQOENSuwk06-siVH(HpO^xmZaj@~WAq8@9Ah?bwLa)p|2}sq|O%-a2j*8DG#$kQ@;@ zBRZ4*lj0zJ33d7Ta06lGTW|GL{2tjAW#vo?(Br%ew`%*MS5pSMoY|pwYOX#Zao{23 z!#eBmxH!F!+&f-~P)^@n8e8?f{i)QH(c99ekdmbmQzYmf*IEw21p%KRJ=hVA$3u3f z3i}5KR7i&v<<9diB=EKEU7~w{5ghwZqS6`84PK%8)h$J&r{@JaO-Tx3!#1a)5z!Xi z2!sU>NNg|-{9Kdwzc#!(Z1l^ina?xaZs1YY(AO*(o>gMtSn%{?GlrDWW3`QtOa)Bn zt>&3kpLK}9g!a+;@s&@lQf)ffhUZ==>%-4>vYmWqwKZXR>932dmi6P4(!G|6A+@3g zpA{tkCm&{;RCw`*T0VoAFCWh|$U=$@2Bb)A#8ub@HaWP7wNVPEzD^XY^Z^ucX(=l* z4En|iQ}KGSTG?!F&!C}q8LVDcp1aM~mQWpIffxHw4dg;j-}*jxtYvaY0j(U$OK}l2 zHj{$VRzJP<$jg0HV%4v*l0($SEHad-gK-x;d&UkiUb5}joY*uH6kh}dU%sT(-(0x* zJC$`;c=!{n^ySz*nV`CssrtL=q;jVvcy&v8R%5O0*Z%;o8?`=n%7qJeG44#Xp5Iar z#Kui^psuY3Bjm8esZM$Dv3%qcbD#HgI%NlBlMhD%=$<1WDf5@C%62-g5`Ki<+X~0n zG%qLYE?^GGeXaX^hbS(63XV6Owi!sbSk*~mJBp&-(@J=mZrDrS)lahu0IOF&l&Ike zoQg5;F%5B_Zj}DHJ?I_D->yem&k+APhz$rMgLf+8tH8m((<9poLKXSSPzFyA%P6xt z0{d{ZyMSj?UCeo|PPcow$)o|2yit)i7#C;0+U+jfjuaP|*k$$5JH% zGN!0pHw5%SX49Vk*$mqbMlg9YYaXTloUTtlRKEV-^z4b@=+0C%V=WLe7TOwiOC)e| zr;_@`9*xN<-Fxnk71oZ^Vy@wCWV(+o+AR1k2I2heW?o{TR|ip*q3mP66X{e%o7zqI zw4#kR%&yBf`!ScAjW!*b*ggHH$u=3EhBH{ zGY|(l>)KTQ-b_Y_FA3y)uDD}T9-#mD$`hS(GrLw&@EJw3Lca5S)56{b3&OV`QxVEL zlTjdQJE1$IXzV6ttMv-Lugk4aX7MSmue!4qc64X$Y59Y(H^80`lB~KPUiY$8SJ3niC8*sazk!^_ z0>=FFaY{)MOKX}Y`zTmTd2WUuU)oZHD8wY3*61_|yyygZ8Kmq>)K+5oMZ~Bj?WAJfA=gbk+@nlMG_5Jilu1tB@WNa%E;~yQWu~$VZ3ponvDtKP z%7=HQkdJo&0>?jF9rIcpbny>pz!FgfQhgQkWr=Kv25Kwq7r>Wz$|F@OJDsm=iCmzS zzc$R^uRZGU80`>gKN1%SE6&c*&bgi9(ky6&KrND4y~J3{w_msu@B~eH_-wo}w?pWr zi7r=*DFrYW6gXR;+lcos`=Fvy#k=#M!*77UxJEBSJ^pn!!=)`VfxtKv`CnV|h9NQF zIAakGEgO8Aivd}jFvke|@Yho1l3?Iy>|J4|$5H=8C=10n*}F|&9Yd#^Sluud5L&w7 z4a77odx$(#w>ja(HxeMEa$_A|>uCKgHYwcLP~Z%+983uRc1N;ALT;g*ip;2F3#G#& zLKHI;Swt03<_OLyZu*T^Yx%mX9J(W-3CZ0fa8n<%A&*Fw9;2>10Z_Rw%w}?iNCws; zR0MfC+SkXa0iUfPIWkc? zDpVz}c8RSvV&B-E1qn?&o#%!<0)F zbWc1>ooJt6m%K_vD@`d+3+9;cv`#H;F*7L%PiyWd0~=shmX-+QD4~^?#rcb`vFp^J zbEvv)@fj-P+81GE@skJL1l@ccZdrW;-MIrCZO1;=r$lkb@OliEG6Y@WtEgtaWO@e3 zAo4*fJk*^T8+;G7-A#0k$jV+=f^ryvmql^s4hQA;;fr)1iW}%c!a;F%4nD3|TJ>C! zzW5OqvZEzQ-FuJUGGB%cs>at!$q_uR!f~4lL%WYoH=?^KvqT4CghSaR$ky5Z>Mg;; zYTv==7B;|@kHbW_I&W!xT*<@D_vi6G6R4d5(YVp~%3^Mgx_yggYj$$=Ws-yE8s2h& zpbw=13P)$SE^Kfu(O+AI;1r6p+6!YzYS3B9%1~tp5%ftf{PgI3yglPQ;i#^p-h1+* z)aug<{mo*hv=x?v+Epp;sdnpzgP~{{G}hg^Exn_*Y&^I0*A=8vy1l}BinBjM!`!G( zH*YKC!9%`GGajaC$Z&m@NayXTz;r89CCVkfLY3usO3n$ZSNI3Yg7c6kP!c*H_PWgxB;vFYi=t>{vw4tfM!?C43}QsNLS~L*w!KEOiucon10S ztiS(*+{7ZmQAQ2@MxAx;S2v}!IO%TRK2%T#)lJr5fi%p4iZ@{>z&H)SsF#h7Z18;+ z=LTSI72srvS~sB=d_h>d+HzoYrH~G*c;liE8DjiUo9G8vI#Cqj3WT|w4bPzJE@vAZ zF@MtEVB7t==}&Gg+zK2ln3&CA-9t<@=2_Vg>D66xg=KuBjA)-ZHLqrz?CLrPo;$dU zfzVKqK+HS9i<7d?koW6OFD|cx9G3##P18^_6OWBl8P=JqMzYtd`E!&UL)3rSe4>Ky z(Fjd_zTS&VE(H?s0H1$z#W6Osz~V=ZO0ybimO;mTeQ0 zd^c6Yu5VUNXVzqi;Slq-20iixwcjH^Zun(wDHbie?BZ|ryIgJLJixM0B zXdaq6L9b3Xr%KMmTuNMNwJ-mPzb$<{y67qx^-QEaqLbh9v7(qqz_QEO?Y!fok9`Vy z2BY+p-8L8Lz~U|!iHuCIMpOxSiDJ`IXn8!!8q9Vx!slU$eC`#Fyy#n+Q7}u;!>OlY z^MFScNyNJMRClwtD$fhJqR*d@vrr#)QWd^{4h(`jSUQyqrXf|rx!c8P_Xk0Jc3jlq z$Bsgw)JaXpNhI7ENB`hwGvdh&Oi?*?b9esB&>0a><9zN8Ip|5|b%<;`*iPj4vZ)M# zt)H1jP8xa{)2i|E-{`wA^CnvAw>4Lzl7Ea=#=3; zncZhJFoK6Jg$#+|7`LOtk74f5lF8n{Nj0YNSHj51)~^bP8za5yQAS{Tq%#W;DJIR$A}oOh6J%L zW#SDvgU|N;VS>K_C%Gd7w#{Hn)ByT)rFvLpp~+hkvVz_!OTampuX`&og7JF_$pu1q zqRMY{H^3zCKdZnw#r(-C%wCf?>U;W)On>v^ss|9CfP?p8Mp*$cz#;y*O|4!+?zhOb z(5O4)lV)x^%p-+QU&i8~uH8p{J9p?ilql3cm_7^SdbW zpE~#F)|bU|`cC;6e6^I>5$q~6(BPh=P(T;N&L-%%Y?w7GS}p6E!%5n%J%j6q(`#Hj zsfWA*Z$YH(Ak?onFWqhxuiJNdyhhQ| zYdLb2coKUW{|AUsU)VKX)|g_ES&SUlO;4fp)4Ot0p z;Ki1>{|_Lray(VBbjs;|NWx{yL{k)PK$qs}}xz?q%R(ddykp z=SAJsQ(p61@KA-UnajDed()#oWqba!OcyhM20r__WdB0hi!Z{{BeIC~ty6fuzVwuC zuW$-|rwk{v>R12oS#cdMn>$R4=uZXdQ|M3*Mn-buC*Iy=+`tk_Aj8vU&IBgB<<6V1 za9Ed@hq2h_FBe|}{A@BZC_TmMtXw(^?tc|ygzWejxTcL_oj3p3ruhW4Z)Oc|$XT%2 zLB8bpL6?HLaAhZukwr8L#yMd$tD0ws={|1u4?Dk{P3BlF9^L{5+!F8d?KN|S*HG3D!d(91PbjJaq+@CLh5|PpK>KGG2 zRsx>;MzB=YX~wwN4*0WloAxnk?U3uNsoBf=^dLUD%}pZ`G6>M|JDu;p)4Ms1ew=+< zQR6!R`ATpD9wD|;_89PFI}WJ)+YvDEG+&RZd{j}D)6~wGbyPxC_DD8qjf8z*Sa4HoEK{XMq6F`6$e%-90vj2- z-6A*JCIZ3mg{u^4`Oh6%mN5E=A?l+{12J;=JGuCGl9*z=#v}E(k!@{D{x#Be(JHi- ziUo7sN(FrcI;+U7rG(ZMS@u?rn(nA5Mf!acO?Ju{2K23K<~-MNNLk121sbZMKbs)s zipn2>4DGB~co8y`?vW5Ot7g!* zp=b7OzYglk*;XUr+u*bP`K7g_G`5D~viPCJE|HE3DMn9%nYoFD6f4a_W+^q?=5tDu z5a#GrEnX2R%lq7ziXCv1rQ1+7vz>D-i%s}7)kq)5?2w#I0$1-^jN*NirpG39dh!)m zhBO=FhZh5BDGKEt{lS|nvO8}cVQ20FJA$um45OED{7zFQ0Oro!ADI+irms#b1_@Y| zE$^gwO*1<3J@TnG9K&B{i*M8IZ~xg>dl4(1wX-`cjFL0Pyr5r&k4#LVT*Dly62aI- z1%vzj1346nT}X?0u!Nq)jdPCW&u;2NtKlJpI?;s0i^Buh`cy6(cyp35!i!yML;_5` zJ7i@CPJW~%w>d`LWZ1U^hcY^wn_;u5bTYJw=4}9bmsn0Rvi}Xa8HmcmadZ4d=}WLl z`p@&KPC2WZ@L`wZscEz*er=nrI7AZ35)$N;Z&Motoi^$F^Y^EIP1n#U$Mu5FX*!3q z7nGwSgH0LoSj%BvV`TnXftth+-$nVuRAXmZDy19$o*Q{h>E|VhFD^{awsorGaLk|h z9T|k(&|SqE;sP1`x$Bj6j1_tVDrEbVws3YdWn?SOj_7sgmb^sMG4Kg&CHQitOp3ut zl;t(Ece=}Wo@PWa2T(TNPo4QV=` z{6|2J9Z>)I*(Q|G5E+P~5v9b+s;(Sc zQE?W|@Azae_5B@a=a4%A`K#Kpo$A-86gLRJH2F6D4bxHSg>CbtqExf@QGeL{2PoAZ zW0QndBi}LxW)rj-qu&g${;?I1YMd}LM-=wPK3K^jbTe^huP`$25z46tW9I%OZ$3=R z78S;6$iq$GGx!2@2j2`+p4I4}J2Di<_&zU8G~QUQe&z1@$8;ku3vw(|kPFC3#@ywZ ztjVl0gtRY~wSrfI?<}GBO=H$S7LGt|$0Ih{KC92!buPZO0*ruWx|y8QCFk~HC9EeL zv%I##ykBaZD{FLAy-n1!O;f?KkRwOeZK*R~r3z-x21!&{AV)4Z&H6J;@oGi#Xp?e;f z!j}}E{O#hboY%;2u%N$*7*+$b7ePIU3N+l1y7TSqYOxvsn zYGRul>F6-%LCwqI!O7VH^ufJjOzfQvWhG&Hg{^vO5EQz-_9M_t|^zov%5LaZ32L0 zD&zKt7waH${kpuSDs$Y%r3s{?8g!?@sKQYtH?O4?M^5U`)p8(Al`*Q>$e$a%{>4&F=J+=SL^E-GE&4pSKP(z_u0 z+VVnvoXlk_Xl-$qapIAer1+a`s-FMkpo+2$=iM8fN}Z2RXk+T=z@Xc}D{;y!Li@ks zG0G-~43@E}n3A%N#e|CZ?+<5+Rn+a0Q}FJi136Sg?q^)c!4E*)5zUh%g-S;KHDNKx z*^vC#@#oi1zYjiSs1FI60Eg7>*^Y)%D$X-UC^-Jy;Qpvkp0VFg;^I%PxVz0F zk8F9|_=7ptw|~aLxHkW`rRl5p8>9EFNP+fE8>%)H4ptsoa^w5>mNw*cr$&Febh;V* z&+JI@dl0^(@Apwpa!^Sji zYsFn}KZrOTkm+D2f~aTL(h*+nnuDdQx`#iP$FhaPCI2}@r9HmO?D)4x;pqZ3 zb%VOS>3C3^O6o$$2nl(hmh$y^Q+&=uyO!&7kw-;0pDw|9KRvv}%(>1V!&PDbDB{`s zRxYRIVVw+n#$cnpHgzUhA~GY!RrqC z#)s(y4*K_8S-UO-;FXt*YVMjK*4!$rY#43!GD}(^#*|4Yt@ra$*e(>Es;1~Ea6ASm zMCR=&znAi#$5mFx1@s-611#Z#r2W!9;-|nYM@D=2=Q@-s)P4<0>x~~oSB_^^ z4t3mHlP17%Gt5l3efmqqHZFnNCnbH)<#?N-yAkp%5F(yYxD0F*m;DAw$8Q zCv8eHYfQUU4+O)l^+t%tX?`;RB4cn}Mmp7@JD2?;DnQD8N8Hc#N}=O8Xmcn1XIp0w z!Jj98;O0kcJ$Hz~>s}O7;QVeXWo2b0!cLOJlfYNlVlvj1LUDCzabF4uzFMRK*Mo-M zaMCmpIEU1@j4j+|l>8+V3KIa8A;5AfB1gzJs^`sZX4ePn=suNgL!mDjNERpVvcPfh z-}cvW#dVHslXcQ@2Ox&et6)oM+5kwoFbu!)s8dk2Xw_nI%*OXY2X|%y5>-f^h-!}; zUPed`ig5z#phGt%+8h$A2bg-^nD%Aqb>YoH`Q&n^mNfyPZxW)kgiOC~vmF##aVAd& z*fCX*%W09O_i;#%oESA!=*gv}E1JWd3OkVUmS*D-CbXj5MbV^|g|{ZFL@yaI=^ z9LFq$;Armv)en(mHonLX79SIkso1&RMkUJTubGP*jVd63Sa-E?)1rveUG3bVtUm_2 zrgE(&&C~-3cnS~TSS_fmmD%z$`QV~p_S@A)r18$-7=7Bi5+q7rLlRpS@HQ2t+4DK4 zRw`~3IH$M^hxrG#2OR&5hYk5JUaY4)^0RVh%k($k8gg`l)sMA0Uk8oALs=AF@>Rrs zzZqzf>V&cvSMxv{a#Un91F3BoFZjU+svc!qdN>Xh4Y?s|Ic3&28hp{qax#yp;p;Z#J6TCRdX5l!X2r7(m8!rHTcFL1+7> z4AM|@U2;{bUis~=5iCCG?8xwR3@UHYr7zEc>xjt-S0()*#RSyoKs{j{k`Vi1ve)SU1zl9o@j% z8G%v)4*J(Eqm;-*E zBBCj*0NFrWe^?~5 zR=MFLMnJ@`NS{0<!`IDVI}xc zh6>l_H3wsVr@p}DB;6q97MCJ@?wxdk6IKQ1wSJFYV7-pT6=iJc%Dh*`-=760wMiTd z20OuxU{wysg#jjNH(ymYy|-6?_xPjuP)}mLxFc#-J^g97cciU)P?gtD3^U>fdshPx zOmR|M7A#JNEkHBWQWDA4SYsD28)OtVs?be>YGz+Cl||D5MEV}w-HP`)AwKG*_o;8A4eydc{Fz40c<^u}$|Kv5q<#|A9$e{PDLb?ZG zx-*EGItt&1h5&;4Hw`0`mUT7*7g&g(w}Uf(0|#54{IEGNYbs{sts9qGe$I}Gv7|n| zX7+wSVvXN`a@17LPym;|K9H*De*jy>=%Ks?6%f*vUFg=kP+YZ}p4oR5-n1K?YDiaA zX3RG~8%r0ur#WG~k*yl3ZeId4ysWz9)z9%Ed3iD;OVz-G1_QG+0d(IC#7v6IA zEzS8%E~)Z}Uws=<;aakLaqEsNw*C#p!pM*Z9tFQ-Lj-Df#sv*MOTPJASN!GR<&;iS znztk&Xj(04=5s@5LZs6Y`c&PTuC#o5Rg`P@)gtd;a?XjE)@<>+0EeKHj<_(|YMhbW+kHV)NGv;fe z(~GZs^7+>MDoTvQvj0uRA5WvgN^x0De3`#@e+RZw$}3^g`*YH`N0klQ*ndE{ohI%IT!_(|R9w zR>bzh2*6Irm85G5tZE>`96l!Jl<=$K0+t%GhvAmKLte-f z9STx1HM~p{f^m1lpo)wPsZ$hawFa<| z%dgLw6jUSWhi{c2*oFCC7OWyq_O~6GI6N-!BXX#~%`rD{5Wy|~n=3|d_5CYL#8%Y^ z<*@XTt=c|=<0`*Z@$XLGJE#e*rvfW~Q>wZ+M=HQ_dp9!T(j;C zLjllL>1^ZR%u1Z9|4et;T=id2jRL_0e$tSe{jtcH=9z16J2BD>a9>%GLl;Y5+#Keo z{{JwZ-5>8{r^u_D7Sf-HKW8ONf=Hz7Qcxv)-iw;IENIt+dLb@u{<;;wLBh@ta{zv| ztV7EEIjTV9{{jy7zD?vb6oC442&3_Uh&649Q-nGnLT|**J2~^|`wUvY%wCO%G8&7U z_hWH7kU%=^uGgD8nwTI2u36K|t+?DNIjkrZdN+r0H_P1J{u8GnMg7Rqy%$`z{k1}Q z0L-}9T$jP}dn(1;nqh05p!`{BCEal=wR23&E%{Ts?TdN!OWV@CP|eMMskCHYyw$6XB1p=5W@Rtt}R)3hQU;oIseg zH6=^es77j@u#ykb78f@*p|yeSB85qtKVoZLotQA8>teGBJe=*mAl`1cqxOar2vv#= z&zh<-D0(hqrb9yB^x>8fL%&K|)>{`=x#WIVJjXOq9OdCHw`{=qg-7Cl0H{Cw<(O9KjDwLpz}8TJCM$dL z04dAUm^^@M!n_+$l^jljV-*tKk{wJZK-HaLh(fms$(u5L7 zUWIVYRR$r765C?@lZ^Rtir39`zqKwj{y8su_Pj8-g~YWo)$uc-*(Ez&n$FOTx~-}xXY%d4u|R@H;`x@?&MjrW-ZpTcB45q2!uA6Orrk=qN#8g7~m ztkJ|*^^KH)NZ)9~w$1tjz^>4Kls8+-Pfw?qlN!l>)|NHRLdmc+tB*nqJb#kTPAYQm zyFPQi$-j)toT7-CTZc2*H@uH2o`f;0Y(F%7$4RVlI$Gxx&H3WU;wyLIovq!= zlQ?~d10vUOuCl^0rhwBG#M+QmI2|Y92 zp@K3DSyC=%)@yT}31B?NOAONMW+=r>C{hSykoP!j7kTRb-T*=dG8%zBp#WkLq1V}z zA<|s0CN{L{M5?f538bw2_mof>zz7i4n_s{fRoJn6S|MZknt0RP0zO0~@{kINngP^a zk<=$mQsKw3i*ni`9ZBN|Pfm_oqmJbFZBNxuvX(6&f-1h=b+XL@st1ir)X@&vON<9- zNXBP`6&f@cjg=%7{`Dx6wnN7-;=YNwDB2&VFP@y1=GyVBk*G9)2ydc^p$CuQPT00- zqa&HUvY1{ctXKQ`<2?UeQQyS9i-^$kMTj&^b zO7aa;re#o=2`s`_3#R|%SUKe!-ZgA?n2rw6kf;pQ8x#Yg5(;kZ zi7}xutPi`XCkNV4tDvYiG+^~CEC!zPK6C!MM+vfTMK0~_9b>LJrm5q%F+r8#DMrh9 zxd|T_SPNCUX=2YAh~ytnR^#|^tHA4rq_*G~;R}?-vInwdZUo5HqW~SE+V0M`roOo? zvTYrn@09d`h@P2rl^vNWCZQzC10UtEj0XO(SoWB|X)tQQ*XB-y0vUT8Zzl3F8&FN9 z#cU}T50Du{q0}_5ZrJ30Oi=;O1eJHl?D8^{UFq^j-Fun`FxQS^=w^ z3fMJ+^@IvE?Ffjz40vGL8+vF>388-itRT-S&9oO5?&HdgR4x!FBO2RsEWEF94C_U? zr}v$eY0UP%QU4fh2E8U^sD2Y{777iJK&eJ+w&G7jsla>t598eEoOZPwn<09DENpB{ zCj%~SLh~d~?CbvkwC$VuFYu)=`13Tzrl7bJTV98Mk~S!lCtZAJ?^1*KN9@!<#S`R5 ze+(M&a(>QAY?Y}B>5^bDur$tPT?w3jew(IVrYFU(=gBB>$`JLu07h)TCyf>HJEVqra12cz+%iK)oCpVl{G}mx2jY||Iyt2ZV@-bd>47mz@n(~$D@-!9qwqYSc41{ zJQ;upipD1q&8imt!s%i$BTK9g`gLvrGou(}EDDnR5WzUCtHT_BDArp(p-0ES+LS@h zOGT{{Qrsl4rOcd*D{;M!%ZI%k4q1O5OwMd3!t|LTLv#TY$IdyYiu8gyvC4dvx~i>l#+UtwYz^60XZ0sLVIprupc;3W z(A%4~;dx9p!_4MFInj|sc03eE2PXFtm*ezPR%ruNm!tKRLDxDNqhUnm!Ux72CdPTG zOf__h93HKMqM#xKCH~n=8GrWWBrVMV=!IKs;GZeqP}zEZDj@1rIqUqoU*(OgU%cLp z5GEZnGnG@tvfCOmxfP|iEaZ6Qw-X=DwT3zCAO^e#+Mwl1Zc?i)cuaM0 z<#sOYV(0xx?IShs!G8i4sh|Bjmdn1^FBv}3Kz!3HU~TPdN~sw3jWyU(Ln#K!9bP6~6%oK!#3TVFo&Hc@0&ldBl-IAq&Q za+Ua%jj2Z&Wa&&3F(9o{c0#$;9;|YTdlt4JtW~HH?>eeI%zJ5DXXrI9ZF7K#Y;{~| ze5i1GUf!tpoQ>|rW_}2F$W6moQz1;fQ(_RNU1P&&P$ZBFFS|E=MGQ!LoNE`>89RAg z;MRH+K39@1zO8ung9;R~oSjSip1XNp4C&hJkpa==8(cX?x|YqZE5G_{JW7-ddo^L! zI2s3&H3v}MVjl3j>CW_k+RGG7e1zzZF-=3F97aM?+zmDd?%?yj+5y)C}$4%%uL~+j~R5EAc za~NLEu(9ns4C#(FRW!-y>>Xg~PI*9|p>Oa6z6&eJDQuZWo4j|b-7+6F1Nu~Dy)epT zkDIvf$e?%cXuTq`O|5BgBIAsg<>z_DS%ZjwGyn)!9Xfb{uX4J?$-~IIq z?de~2LQ`xbBYjVx;6~w}6|k@Gd7tEV20h@!Kjp`j3>GNE3vtz2udiFbGC8e$(iJ7K zQOvj0iT zMiE9%vczUo&xC$Fd~%=w_uo@ttrc5QdIv_x=8r=BgH`Neghcc*8Gg!B)HT-)5Z6&X z+ca8IBy{`@G`TsK{+VkBo?keqUp>yVol>l1$WKkq4G5_p>F>qH#`9`McH*c#R7i6@ z-J;QlPt)@ie139zmvDtcGN1PSXLo7ybM*6b-Qx+X_8Uh?IC?BZo4A}gv%LQzRSxW8 zPi`c&>N`~~Mm19#vn00JtpIzRib~*5-gHloR@F|_{}vO~CbLV?1&@s%3=8nZr?|HV z9CZpX2A|^WW%SGV5X>`sq7D}wq^!AHYOynqW6U}FHj>J$23GfVm{O*y0i-r5x~ip2 ziVg1=GZ&QVsZ|#Z`uXMAa=aC2XN1h&Ryg@d;$RO?ZuJ#)b`P zh;|@54Qa^sm1hBTy}Kvx8=q#ASKB0PWx10@R_B1v=Vm3r`|L`?|$4^^5MntPJue7K{w=861WPr#n&$ z!^v~5R+?n8JgaNWScg4CTZ3*x+-QIYdAw~y>5ft(&y$@J42197iC&_C;N2xut3&ZR zqt=hL3^oaJKq~s4ekVcYzAH$suw$ZJwAPdm3!uiD*U5u59tlutYqmZaltbZ=r`!6y z?{vg0uG~<$XG5ZDzjUxgh)dhy=%Pg}siMel@OQeXIyJuSlC7_`k7 zR()vAFyPE#pLhlS+QEu@vcXoPIEMkqif!ALn`jMhgz7Kc3nxI z!pLj7UH%jq+>OCmG6Cw>-TZ2$uiauE;mJ>+ybqjD)C`)2CI7uKG4poi)6 zcDJC7hMcT>mvj1I?-j@ZYPOE0lnatqd0?ak)WLJoDq~p!^w*-5Bk{%EBho6_Fz}7- zOu8(W1lcuP!sp3N^LqKlr%Wr6GRSoDgfXF{Bw&W5DYakeEmz)*QZarbdrs{3Ni{_v z<`_zGp}ptb$ie3yVI~fxVmkIrfx_xW_!sdCHpsQ)(g*?=j%4;(5FPBh7+zwQc#ucb zm7uz@a5-%P@l%TgfCHxrsFTi}Ga?SnarnHbu5lk}H70whIU=|2swmU2JzHIP|c4(2K>-ScbjEXdQ0R<@9I^Zx3t>=Ib>9%v?Wwv>e7OI!m@=H~Mq zomksQv6mK&p4XVNm3Yy&%to_58;`0pc2+dSnonU#jz|Uf)6GqDXD{y}Z=%}La(sV( zTi@^rVclp5FI0xRT6`dClA241R9VhP3r9o7UsX_dHA4Oe5RC@g*>G{>=JRthMw+QW z$odlzt$qXp?N?_d2w;hUoDe|_%i5fPEDEF5mmro!j-Z5A)S|_8OwVcG;_07+k zwTz(7UoM6-Q_>4Cq9X)ekkjNh!=l$GEnVc_e+CMyun(!x-&FhqQD+Dh%dWeRhu+mL zu@i5>25y^jyxxL=+J9Skbuqfyyzb~LrnGa@M+6sV&Mzq|PZdB^s1)l|ojglp0YNFK<|lDsjWh4Qa&duT)(myyD2S)Se`@*{#A}ohlZH zk~sZVP#WS%42yv&uCSz=`bSbaGl>X4uHh;m?(7AIxdP3DMk5gn@3ULEWwpgltDaj3 z+V-k_Jmbp_$ae6(rs`I#h0b#J@rR~V)IUy+0-@USn3C?i)cTAufRABbcY7xb0@f#^ z9C_H-IjMM$Bu(iR{{5Vxmn#LVw04Gk!`DLk$D4O`|V{y)~4p+GSKWmJAup z2ojVk8i=!zigwj>I#8PwOiN!r?Zt)gX}ZJ>pWyU7_c9{9o0QnF&~XUf+X1cxbYecgJ4v#BgLu zDylzNB%Lb1yeh#N%Tr9a4>c5ER6Sw>Q)^a&E^XyUVn`Z)YKPtAL7pA&DXrvHJ#Ya2 zeP;O2XhFz?x~<^PWeQAIUxm@6LTk{vP~LMZ>tSIHwUp7f2C=`2x!zNlU!Cj{5mtI~ zOYoFXkaNg#0mqiOwOn&Y_2k*!Hua@lI+9f=^_|0sYw6<|52pn60Frbs_1X78ZtdfRt`6H)_KJOIpZkOkza9A^wo1bCm$K60q z`?`y&H&WrKk8R-rZ*^9j4~L+`ed<(WfTU$B1h(?N6_4Kb9Aw*yDPbq#XW<6h4B8&T z`v&kW*>J)S!wqnzW+!j}0x>8vaS94z0Ky|?u#sD{V+60oUA}q(M#{RY3D?xm#+*y7E(Im%ct9l{V%qP?QTEk682;^*6XbuojgQCLY}P? z`w*Tpu4>bwH=Or3q@;hX$;cBzsGt!-j@;Y>PfF$46a{2a$5w&^~089T4dl^ zaZ@qm;UEx*^_De|ixLo6&k>_c%?V8H={)l9dEx_#UcG+?f?e$!Z~(H!XT z!K+R6%MGZ5!2+sHS)%Y;A@;04s|iY#g4chm+5Cs%_qPJe&N+9k+vqU(A^v>-55rL5 z%-2&pA_jB>zpw%&o49!sUukTZxJNpSf5m%u($wn>+auvWG0)tTac}%J{?v4ecu*Kh zsuasPJfJ3P-oFXTQhEO%I$N`eFxsqF{;^GC$c)Lw;A9N{)^y ztLUYpS2Fj8JiWRs$5&-g-5UT2X)!1_9~T!ZnNe$(V=N`UWw32|SHE?pZ?eqVZvY?( z;RKy%^l%$%cLwr^v=lwvG?6y!z>zPa`RuMc#174wTm$WpH!9ZCQ~AIuzDT$2A60g= zpOGZY42L4lkHxXsmr-H5O;cjyFOh`Uxg&3Qt;D0tMn%Eh7DdvTo-oHI0Z9VGUr4Zf?3gz2p!l0Cw z&Qc#VUB(q)Z}rErVp6DZ<25vjqIv{j;n_07`I1%JMrQan^vSB*$dX-*D>9nw*kMup z*}tmb_b>^ZAse8XBaw|xmhRw!h{c`OxW0|!O(y;72FquuNOPP{998riZLBtYbMFaB zK5lfb;vE@=Tv{g?DM`X~pE-Con627Yt{T_8)z(=5`r2}fM|ChAAinv< z#mEmPbJ_jTU{%L`&ulnGT+0Z3a$iPi*HfKRyNenv`#nMMPpE#5PkD_yrXYzml_+}X8kW)F%`7F$Fm~$98pOb`>%lO?B|OY;5g_un3S?9Y4m{l2g3`Fg%|O2I77xKq4n z`Nu7{Ct=~53o_W%(-vA->&e$y95cY!MC@!!k3%eJV?7QpRQfx*+=b||GPut?AE)it zc^ipEpT|m9&;d4%$y^Gk%1D09a^q4sUv71{76}BQI(lVj^_JLj<~q|@kmxMx^9Tm0 z7V^1}k)ZL>jp<{|Sl<;aP;J=J1@Y(>h*x}}iN`&Yse6zt!)ng-KY)z)0&JT^1yc~( zRI-c;Oi#P<@oZB)Fd}(MCoS?f9}I3IdikpH>D9WnFx|2TBO6aWBlAqv)H%LPvHZYR z5<5o1?4tSQ)qKkDEq2~vCh(lJCXM<2wK}!EFFWLtCYjeD_z#qE%n=B&xSw|3XZ11e zi-2D>5>*ys&A9Nfi1veey^EY^ITn+l?JG6X8=Jbh zU(zw$-zz*WJAK^1JoWVA#gi-&OP60RIW*z(jfdAS*<5Z~=XQ+vYwH;H2rvs*k6t(k z%R4Q3zItf*vQ(RV8kqO-z+CR_gGJPDu2xr_%6`z!c`-@bf*=L{ zN&T)jeOcidCxFw~(qpw|HA_hJc+#V9ImmmuzykuoZ9^ms7MtDG9+a&J6me zYR9l`$J^Z8KAbdOe~q;pxJMV8?!Nb@MIdCe)*F0pX|sNJgcebBU3}?^m{ubzP2d>iKhw0+5>fm}xINRf5iOPlCQ>l`VTAaN|FlJ+QmwoCqne^6Lbt$Rsj#gf zDnsYKK4GqGRO$md*!gVouEg>!IYWr%0ii_*Q5zK`U+o1~+z^Z|rENUo)1>d7Wb4Z2 zDzIcYcYJOib(mR}WjEa=E&o{SO)kw4yBrjIh~Po)63zTnFn+$#twooQrj`*rDoNqi z!1hWrWP%E1*A`}BzmNw1r zL~^fTq8e2A838%7GtIXmbt6v)8o2q@fc$3_;HVhm&)Xy$ROTv~WGw{Zv75~ZOc&nW zp0?!!X05MAoX@&zErgM|ZuOZkDQL&nU5AJ*DaL&2$V+>ZWvydNC-pKr`FYFrYDCpu<)_g}BPA zX#B1IR#LcUo17TKR=C{{+b(&LS>+)yWBB;8Kq9;s7Y>6zD4FK%Pz(x*mD-dT9yAYw zV;<^#m;3XF2M(#`WE|bN?>7#D|NjYn=*eN^$(Dh4NNUM2mE*rIF;ctrM%#}8E47wJ zId`aYStwM!dKUe6wrecMohi-)wqBMl7r2FBq&oF%7URSYyVtCu!68dBz;QAUCqr)y zi`F#AuwWyCb5ww;Eq8~q6LEj3+r+I8^!_cGzBT0OLf%p zAGp_CJRYLSv2BVOQM>t(ZG)%HF z*Ko#X8Jz(X9;RgZ1JbbMgQmM62!Xn`q0Ywxc;MtNHfaVtH|>U9fKalneV{<7(YTe3 za#rZB%;)nV*EbnpBuBNU<(jeN;u5X+@af3N(*Ag@@ z^Y{3&1QqZ#(A8wx6Oq~sGEiH&f7f2ZR0y`GU*YQ~C=XU)=||1tD-iyxYgX1)DvTW% z5W6P&wBp)}IH-MkHj;aMGs!l>P@nSXX_q6d>6;+EZQI)%8spl2HNvUoMIq93!$B~9 zmhxn2<}1dQR{p-o{FC)~B~gh;x3>@SV^ikk$eP~H}% zpvW|w7bZE&?-)O!L0+Yi2~vTV;V+=(hA$1FK?T(EGs! zz5;k1SIFyfZ;b#H^odV90jZ)gF)X^g5!WdzIJ)$kDz_Pw$9im^)|X7`*iAL;O|94i zm12$zB9vjV(O&5cVn8%@RxeT^{lwcT5Ur@Z(n6b6@HTY)aZiSE1gLkjA?b-z^L>G5 zHp-yas;kJHx%9CgNnu)(H>|G0<>-wEdkJnQ$);uYp(ras>LT_H%yn-{?-?Sv* zZGIwBpjoR_6X9zY9_ar7JGeyt&uQjN)V~3ME(FM<0_fd|v6C6q!FLSY6g=nKe8 z(;(C1@k!7ROYMeh?zI5pVIRp~6@IRfW9PiILNHwgeT#U;(3R#I=?5T5co-M+LSZw) zC7Th8`CV~s$)|+s@5|Cd5h}rI6P?LM3_5&PZfYwG-N9hPAbIgdxK#FRl4F_`TqglM%Il}W5oyWbjlv8eayiBDDh6{&`*5R zNL`Gj4gY<$7M}5rf7%11pWf{?jb652RHs9Zm=gz> z_T)p(pSkSMc{Xlx2XErq@0qed$3^;JJ5P=aO4a1P|ESjKsulqwe)y!Fjy{yW-l^e7 zV1j-)(dm*%BY6LDRjmlWBV0Qx*9Tppnf&tY46`t05(i&1C$dMr!M7YkeVB47YUx=uSy3{Im7 z=}h;h=vJ(&pEV%ELvFT+5BWvQD~m*v=(0kKPa0J@Ze_K1;sD)_PYRY^zJ zKW<3(_mk_Sj55owrfj2+Tdt2fy;7_nVjmI;bzm>flv=5c#<2Kla8`ySO$^DH+?=%d zkO8fgtU_hEohZqlYTya^G^0wz1d1JMaV?N1Z9&i4wg@zDIEv(w@bZ3biu|ZpD;Q#HONdgfqTNw}a7t3a<)(|}0JgvRhfWu|S zwR_LY--5ZE@DB~?Kj$yW_TFSKqX_&`&iK&TT>QxxK5^QXpxgPb?-$YLrfh7z5zc%v zU?ii8lKHNP>*({pU1Dt&*7NDaZ`sjkpRBN$XB?5?UL`ZDVPJ9Y$BxIUlj08^PH&rG zmSQ&Jo#|QBrkM=m&l-TiYTvV53K@WcL$jQ%5&+CUt3x zGcG!orBI?-SBFSKl!i8)N_-Bk7=AF*z({kds?MCM44_}BDo9cR7)Me1#JaepM73V% zF)xgQ@4J+`au1bMiO@#ufc>xDfHSeMTKNOBY~Iuw5qhV})!#AHov=@X0!4i{Ak6aC z=D%mj|0P+ZG%c3BefFcL;+@{AF3RHee}*#c_`|8n0FIE8pE?Df1s-cWXwG^;b-Vwe z`SH38f62EI5Nq2f_2I|iL&AzqONtvmfBCN_6ZrE_=pF&T;*uQZB@CD*PN6~Q`W`bA zqp{a2zqP46ln@PkX_)XdC?DwPuyi}?4b_0otYTZJ{r;`MxwT~D9ewwEuTN_xHF*?- zc_b@T#ykF#NvGcl@x99PAJCdTQWg1KclL+E zbK2C-Us#c}zh5%L%W~V0_}E&}29+~no}K`=8fIdOgHlk3sawR8k%#-FF+>_%$S3qzK*oR!;Q90ZO3m=Fbie;JaJIZ8e!(}%M`Hj^ z(qM?M){Y{&)Z85PI^H!vLgh(WJH}O$G4J%y9Wzwt>&O z(pgv^?P1U7_FN!dReQ0*)oy6|F#>ngGWbFzwvGvLV{|=RYdjNVD(vbDr-O1unQl$63pb;=9`(e_Fyz*D7 z**=Hy3HE7Nj-_~%Gn5$YyVQFt#j>W2r_pzAkZra@u+_I0Z$zM&`zGu2|D7>+tsWx_ zy7|>t><9%`2XBv93=SrbjaWMeuaZxWx#Z-S$H=YE%qsYLz+2W(4T^xKH7IQrG*{N| z?uuob6oLRGA3ZrRI|VX`=1lU%C2^QTYRaZ!n}&t?LQEuUEk=cSDz6N^J{FK(l7pe4 z_s#9ZUt}mkdn$;ka)^i55Hi%we!TIz&mV_E7?z18u>@fG_HEN?ijXyN2R1zHCz2UOtO)65lY1b8+HI?V~0d6?C?iim^XLhU2n< z0>1Pbmh`$VFE~&m1c9IWh(~rg@i-Dw@-H9}#NC8oD~D=;e$|HRIZE=SuGxcJgFx*K zG#wL(z85+Lrs-9!gKyce$ErfvQC>c|tTXZDTKu`XE^JkL!~Zt^;x|s4^oo3Zg=4b5 z8zn7|#_91#uV+I6a40N@8k2jG;C=%WouMMLdUx|;L?Yd@ZE`4fb|y)MFCB~$JFxKA zVqoBzl!$W+?P;$@YWtsa3p~b0+CdcA0R7_CNZ|3n5aBvd^d8 zt!15gAx0p}jgLHH0L_yMf8o<$W2*pbE%xE3_p^P<&C)qM-Fx}}Mb>4i%U8Bn$Pfn5WVt$?<$AJ>xON!LF^`kFmb$r0t%Yfp0=Gp2 z{I-%cHm(4|nE{g2Q+eva)YIMydP*)zPbi#QJgUEDK=5&-(uw@>M`KHzJ@Sx?>F7Z- z(Eu!s+i#JWm{X#}2o%Q44fNJse~;Pv;RMVF8l14J`h z5AG$xr!cHyo-eT$X>0NrCJUjg?z8kQ;R0TyO-o7k=oFMVY5I*ALB2j>|7zS}lG&sP z;QGX!r?K>Mh5W196A>qh8G@Izi+LXbL>EXj?oO}6H{-QUS-Zb~x!Pp6|vR3EuCKQA`| zW%WztlUVJuzAXg3yF2T5Jtm$}Ws8o^@TctD?Cq3I@Nw&FK8TL?&uC8Fh$sriC`>dS zVoC+_p)niI?!QU&aLqR z{S^wxBvLB_ZQj6Y3H=H6T|z6daa-Cy3=-+A<6*MnJFMsQD zN#~zHvi_&iY>P~)oo603(sH)=W^iq|ycBNNZjmRG6-=F*2a!Pl_2bFgByhuV0G78V zxi=Lb1YODVZegS?8rvqi$f-HA==|74#P6cwG5@xdayZ^a?k*M;->|;ZTknqNQ2ZLF zX%}DY+D?8K;{en#(ZB63hrSj?=wplrg$|NNmgC2M&ksNQmFCNvm43&ttL)8d=^yv2 zCk4XWM*BY8`vMdfh@yL3@ zA~XGE{w`uF+2onalpb2^Q+vBMLD%Iuue9@UKW!lQq@9S0XMSSHCng5UPdb&`Ja6LP)G0~FLn2tsk8G8A z_~zSwJJ6wT3hlnZqXQRf@_P1twEx<6gg!VD7)Cbk`Qo8Y07fnS&77Og!LG;qmg~_O z?{%rhL)REKJRo$w4`iM=0m4pS=Y8o@NLFdJ&HV64)TjJ)h_Q5f8l#3CiN&;LA>#4L7>VE6aHC#>3PyA_6yHf%%L-bdV(x{>etf|~j@}|%Vxl}xtt&DKOA&R` z&I3J5KX*mJ?vX<7Y{yL*^bUB}CojIX_!g_OCF_8hsfBS(Ba1)AO1T&5wVU`YL@Nta z(5B4ubA%Jf?Rar=W2&q)!9lHrYZg5;qf*+x9n`3-N+^}qJXptDp# zvUA7M*O_XV6pWkmQ!_3();2IM5H>Ky?2G21bhH;ntL9bup) zJGTwXUf?1gs~rYMf;jU?U3?;w$=F%vZ?222_e2f{_O3!u`x!?apYhb|!W$;-6n+=? z@2}?NM9+QRHBxfRhdY@{K&`iFckW8^>C?K;e}{V$*v7C5kf4Y_ftH~9UAzL5N23QB zZu|5Y?@(~^?Zw@jL@LGcK=;bS`;2d`nx3eUYH}?!H@~#H%QwH+ycKM=cM5~GMTika zORXJ5tAA!;*Z24_b`CO@zj7^Zf4J%XPn>EW1jc)6uN{vxkL{b&WqT2?ZNMkVPS6UT` zmAei9{F6NZggI)1C6=YAk>p5Y3JdTNFtYw4tEL1d+a@Us9dFqysf(x1W2c#H%HP;7 z$7M5NK_h$#9DX*K4)|>g2lIsLM@_QDA43**lgrKkf<}K8PUf6}7 zDILC3SNn-+bzlC=;W2&3k6xj_=b9WfqM{*_f7Q)JQk}c`A2@pn8uYd~=Dmgo+zJ%k zW)S?&bJk+>Q9QJwJ0PyURk=h?me-Fkrfj+KZlngbo+4f)ksMzB^q8*Im5JL2U-4hX zdzm9_;z}I%IL?;_+mR3vE5&b9AkCV~YDPbi4jh0-44hUVCOw@G#`gT9o||oYe`N&E z_t|pzXu+0hs3bA}#}4scp%ZFzVmN(hPrR{JP(r8ht3p!N*qx_!CE+q>pK#vIP>}ZP zr>auDvJizfnaBI##+lMd!z>9wA8PohJL;h&Ze&-vF8?#nf?N9Z+E9_nUg z;pA)kDrX8|)#3qrL5`bgyBS3cb7G~xXX~f#Z33$g7mm-eSvas=?tjm@ytT46{mxkz zHqQOeKm6(sB?GMkH1?z}JBJs``d^%t$|s9s5PAhm9E_viMjz<2q8zAbqQ2|UOa1i(uhD;g&VC(Vz&d@6 z`BIW~ku`B8LOSkx1kQ>2N*yIjnG$6y19%Xh$re@hkA~fUGb_26+{9-XnydFiS>Hx9 z{FswBv=U41mZ1;LZGL_83#obj9|W1M2T#xx+_EZKZ!tKpUWDIVAKUY^PL<@okjbM` zY73``Y0ML!`I%4NnRgp6 zOeY_Iie_IADF^R#o2a!&GF`9+KYVhlv!m{MX&*7t6b9h;DIw#R1{MIJzt@|-i+jFp z$;poWsnA#@oA(t>QBiZX=7(s`^e!YPx}(N<8o8&HNtohvQP2Exi}&C$(FSu4^cq7!58dx@~Bn|P|OtdQzl8IT~}&*QjY-aglv`o z(RcZ;RI*N4+WT+#E*%V%R%a_O@4TDZDA!v!qUlm7vdZ?u1r zX$KVkWR3Q}TIUG-`42?Sm>@ph^fOb#5U>3kj74k@ZEq0B|pI*aZ=SUm7kYK;J5J%kk0-UeMMf9 z?a2&%%oRgK$Qa<;*A^Pz%-W?$s+D}wfx!OiWjFL&Np9N00l@{3961%k3kc0-rBbHI zep(+DAn0K5kg ztvtk_aoW;q=Ez`5-vO@9w4e%E&SquF1KB8~Q6&*xc%!#Ham z$vWjcqrqX?iVY^*dwugNV&iJiy%d2FMn)>^Ch@oayY5u81zOCV(uTD2 z6f>n>5TBWzqgK%edal{nlhs*-o)bFSmWO9g>%cKRdxG5KkE?x&I0TY2yi`4au(2&Y zDC0jPS?B?khyfct#8W0jm(A7B)Ew6 z!+ZJw^3kld01yZbyyOHPQ=7NAq~gOqCZ?pV#%g9vAvRk0%FSH9H8*i-1VHE{JU&() zv5v9|xOPluo4+mAA7WkxtCdOT8!R}3wP+cN(hZDr zB{eOVT}#e#`t?59>wUIBuMxcGm^z1`-kQ(+yanv`6ynt8!foWd*+mbh^lsQm^LLSIg8PVDca}c+qh9B& z=HQ~QyvhEIVRe3eLdHlT{BS-mR@8WU2hQqXuf|S3uD==834$Is7r!yVEKQy^W^AlQ zoi_MbXkYElPSIi4>$g8(rF?U5%gVc+fGuyBlc9t~z?Zt)Vgc2L7ieB!AD5 zA-}_uW;J?VuI$UKCHSiw4<9gglX8t&=S~ z>PJ`RzNWkmM!#=Y%ddt$UW({-j^(YZSB406*KZxE)58FvuU`?9r+C%b3PYC zzwzfPI&8P35-p&&jjO5!3`hhc`uFWE#`SAs7$B|*fbsfwwK@NR3ss6*)rGJSdZ~Dk zHUOn9TBE-pE(i=pmw2Zd?)fR+fPs6Wh4hLD6Pgh!;+`|`P;yt&>#Vqw$biFpo~8@} zpIw9g$-bZyt1E?1%(2*)m}FgutvFNVC7+cz7c~wBp>UE$w0HMpog6jYU)p zweeGVF(AK*W(nx5ZDqZ+BQd2ES@ZeB54Cf_BHZ#r2|v!zK!Rl3vli2;>E~8GzT)`o z)&1Cy1ej>~T%HHA1|vFz%-b>mInoZseSUDWB%@aVx}~o!0p`!PGy-&qct&HseQ02a zKJ=@hwN&g4V)c)&3w3!I@E+eo%YG$~aF*gL_4D#@BlqaoYuXY|e4ME6hIR;f$nSdHE>}LY6Uey;{1k zl;H2g=Oo=V(Y`t&mx#qeTZBdA{9S&xIdymj?2Bi;n+ef%2?^|w5}<1viG47UR30#- zt7an6q|~8QQ@pVCp8KZcBT3tyu%{v8Xotq)zp?^zrDSGFM_{1*e?OL>pM9oHp!5p^cAqi8ov!Z~y9DO@*4C|aLeFEm3tq-04DSY?py zLhi=%m^%{x0RiJYYomQdy z=S9r$+Z5*!v!>ZXmvh}iUFWs8@K6_2{iKiOldnJWER~*ilg@kkT{d5ltsrVGZF+%D z=3V%7cWvZRnl6+ApC<*oF|Pe^IlC+Q5F(kOSecTn$$9V3edX9cRbAc7taShi?rFhk z>bjj1^0VQkZlWw55}U9)Ol5{1un)k=BnU``#nDQ? z>Dx5DkRMBz1wW??KCQ1;H=cB|QziNo)z>~CCrv&cbv5!Vrz@}OoPi*um#Q)nesg1h zps{6M*lON`)fzI7&teU8Uxqq9LH6PJiE3YFJU5=d_yFz!=YvgDh^6Xu>-8V zZ7tT|q#?D)nSpf+BpWT9M|*)c{A1Tj3KQf;OWD0ZPS<=#@kw6sSY%K1n=6!?j}N_H zqtN!i58rhD2f$CGT!fW#NM7Q>S_k&B5TE7`^s6S^>xqc!krU+RGC=uojGh~tSFG!Qyuy_OIvo_pVDr=e|XS8BF?5_Q`~(Bqo&8&Ki%zi zN}Q?DyEv_zR`+x+N<^RaPg*o9yU=R`H>L-2%c^rV2-_}VAVmfO+2$3E2#omMyo$!` zf`C1D$dzP1V#x(5C43;ZN{*7I%-)RpN7 zoly{ehlgiWTGcZ-lqkB`z%EMNV`n7ld66H6!LP++@Pd**3%~t!@qW?8jS`1dLH_oW zL>ATw7VTar99Xgz_yjj=Zsee?zlY|Am1t88eph;O!t*4wzh=}-2&nm9nEvitYf&D0 zd4HTb$m(}U=94$w&(dFc^~lay@1k?=F|!q6u^}S!B7x%0BiY9F#meBG+LsfPlrU7) zf|1|oFZ!M6b9?)8=#Saj512F!SD$TbC#l+3L)d>(v`GQTX-GaN*;B}Lvx19|Du%ki zzW}CUa~3N;0Uyo8F~y=5%LWH9?^}e#G=!v1Yl^0EfA%vx*}l%jxks;tRRGXTEYxxW z$@wikb}q{1_MJ3e{)3qoCb#2$KR$wP1Sg>AlIxuM;HN1V?_bXbxI$Qb7eMr7{j^WW zE7{K3@|Iw3o{I(=b1p#}M`7ju9sLS9VX9HtmW_}kV5TX9guZll_ilC$aee&SV>TtKp+wm{u zGs^tK59!oS&*lMcU7~DIE!IE2{f-~oHurt$HL4hO)?_~U)9St7hf8YY(<}S&_WuC$ zO?p~U8uthD+!cyPrz2|sUc`@!ao}=LmbpXxy>H*g;5dJPdwIvnwjP5dZL)TVFW`>p zWf+h@Z;!&y5^9L-V9e8?U`SPaTFyqwoPtM-JF;d*4mj~z8w)C)7-i918QEBa8 zV3neo_9ex^4kG`0j$v^$GERzXwEZS#;kd3W6=l!zVkNavohDe5g;6(|O<N2(Sk-27K^hw&NXnf3ri=(C=CP_0FDaja0P5D2$;~%50}dEYMMCnYzjm+%A>iH7 zoAJy_9K_xchoq!C-4|nsnom{8lE8~&ezeU)9y}Wu2L2t*>&I@eJ1+K5CgF@*Ukvwe z%Q^QtI2<^l^qgBXQD3AIlr!6^?aP(qB*d<>UrXnFFHukdyb|Xb1kW0tHZu&3kDnL# znY|-Ke0p4@Xl?av+rZlNuMpu_cXd{p%!yKE!c9 z=dMQ|y%e=~lZ=;O5Eacb3(W3B4h%3wb7Ul}CSv)|RvpC5I5htF2AJE{H*A}my6V;M zv(y!Quo37~P=WT*=Ywf4J7Hm*%y4iyyMrU9-6h$;xGYGq!j*Y@@BaK@q*vvCOty#w2Ne@sp;?HOJnW7UeK z-gJ33Gi>nk;%^FQ6A6<}LpCq(+%1-ecCuS8K{V$$lrm)n`F{__+Kooc_&*iH=f>_J z^bppJKm5fVO6-OjiX9=mZ1LZPuV}v}t!yrJYjYU?deWoiVkDKA*Bf5X4Q*j{n%${t zPcx*6t9o6PmZw1Gr}RPT!ET-O>qz+7ww`l@##cQ?k=?EH+1_a?Qz_&dBdDK2n*#kx zScMujYh?gN!7f1AEOL(vtxEW_nK*tusuL2(1Au5+GjP2kxK67zD_0D>xc08Emy1rk z;=~9<~>DQn1( zZoy+4INFwUEIz<3fY4ms`0-{xvivfb2xUW#wp z9Ux2_BV{P%W}4Wcd4(1eo4!2Wuae^=ZT>|(RkU7Z*xk(w7fBPRp|ur3)m_gZ5$jz% z_ZS_x1^lnqwy@}&hcr$6J9ntLRZJ;q83P={pW2V$H(ZwI3tOM1Vy`gg2M~GY_unD0 zxq1y$5vs*KEc)83Clu19YEtnl6B8uZK~!T;R>D;zTr;r8*7zDrm)skHxtxcE>|;v1 z{W=L9`Iw?x=kM28ljinTf1WY^ZGgF+J-Y1jESM^i6*Ofhh@tKJ; zOf_Zzs8cmNn;d-8L89?S!`Y7-w%I7jWvJTV!xo#pDW!ncbT<*u8R|MBooyjNpw5%sdV3eiHIG;i2F z`2N=9*9*jGNJj@ZfqS!<4u{2EOfzy6t|D7(4ZHv;)b#RfSDb-vvL3mMIeAP>s8OJa zhNAFDV)+i)W=<9P$1~5np-g^vsQf>E-f*!Al4nfsWT&~)vk%UX&uRt-owqu+t`B(s z_gygBv>f{vYv0I)d_I3E=6kO18(6gb;q8;+MP1%>qQM#m;e?pM+g)3<8$QHCG@^i4 zUiMAq+fZ((D=+JoMsK>6N1inzzYE*tbQ^2Mn$*gBW+S!}dn9?pO712)iYmDWfpPC^ zCD>$j$NF=|1*pPi!=CGsXyj2{PW7$IfmP5?jY?nnr1yST&!U8Kh%LTSmEI&Xg3K*F zc}1)GnO7bY$bncH5qEd0ry`X;9Bas10}aU-7RPl6*iN6Tz7HT6rA^BAP#n94SBa-uALUP7jgP} z64L|ORdRT?uVBn`+M?0w16vror@d1=!+6!$xqEiu^R<-}l2(yNmN|z$8}f0V$=EB; ziN>4+hAERLtSc1Zd5&I2 zAFIyN-pbN?O;V>!@o|?Ab{&dHRX9!k4`3e^1URSOhku!n?z4*UX4X}%eY|rep!<&K zv(qY2#A?XH0fLQ#_*24XuRk^I2l*V!PwS`OzuMn9SpRm#U+q%PgYNx*!evZvU< zA{XZ4%e)^7TIKo7j-6lfuSanl)}~td}&*~5NWq~d))7fZ|1Lst?iL890$^-G%us(wzwmcp2mn8wek}^iuh3O zYP~$oVly>6-oQ)m@(JpU&Sm+$Uq0ACcku(5Nw8e$WM57d*$C3LGtHN2-Al~+RWlbS zAK{Lvht(8`!Gjru0NPS6`L{`{!BXOxY>DMh@s*kM)AUXi>y=D;YXAImdBgd+!>R_O z(Tu$tr*&oN9dKXZ=~>MQ@2#NPqt1UOGbQ2lDalV68~s<)i&nj(XU)BgiXKx|Qs`OJ zRh%y@>WDS2#|11i#=*;3DhOLA9ra&Eoh$qY!LtgS)ofzm9_`5U^*6tA;muxFjg{1% zz)`J}Hoe2*PtLF)Q?Vm`=2FL1VIS@P0cy1tMqd0^Xgx_V{3pGqa_@PZ>DF!c4!Ak@ zjsVyU+2J#}oTN=hyO3fnHm(~n6JKMK?XwvWI?D+lih7U*@HL|!LMy*w!&JmQjul%) zAN;LO96z7_Jcj5myjlM+Yzx zj0RvP#Da(&I%jKcsGr{|)>q|Od>MZDe3aN@*7q`%*aL25@JQva9`;EYbcld(Rsu$h z%q486l3fzr&)@qgMfrQC*FB_xs-LTvOLLt3Geo>5ZFHBK!S|!;;rrmFtB71nw$zr2?(uoF`hO zeIARgB`1EoBv*~6VO?~1{Myw(@L5*Z9;JoIF#K2`*=X|C%@RGvDTa*< zngML+!Zaw3B3fT70eWfW#_TZSp^VO(KerxLWINLv)v^WZk6MQ6u@G&tq5%$oI1{p+ zN99#uIx96vX&!>@UYlPmVwCmSg!3W*5HQ&s%&`!P^IMQ-&=(`Mi!NDF-+HWFyS$Jd>fy=}+j_cRKlsBDCRfUO5^_bXW~d1dJ0<10qKII`Yy3F1DDN z`vZamLVw$tgFQ_233X95AXCcKnYbH~Q%;p*6^w>~k#-nT_80jb zK;$;sE`as{VM^=ByjUc1^J{$hXmPo;uPbo+U{<9_Mb?Zv(C#b$tndpAYfgFpw9Z|2 zxo<;@@vy=t>u*nqTw=~o9?gPVsGC-oBOQ-jlEV_!2*Ca}Q0GLhMtx!flAm`&>Rk{* zV?;&1>JQ$P#W#fSmXet%!RnD&%{Xt(Ki{B1ggWR*u;m8cl;zH|G)P^Z_qg-JYr+3e zBSr&UOr=&cNzBZdXY7QY79DrrUq)JKM3L4(WX5WFEeOwoBD8?SWwAlKlM*+0xydLP zzk`qj<-O}=e!A$lTzYCdNV=tUc0cN(p|>#6bn&Z6orQ1^ZICOgn_ofu9-}DS`UbaR zV!aFBRptj*!sGi@IH$|T;QY4us|I8DdI`1~wIS8)VQGhYXPnqn&&NI5_m65PTnv)F zPWxoYgXpb2Qk1PwDhdXn)X+)Ua5mGEGGSNf$$FCTRckXLxylZVm07q{gg$|6 za5am8b%K>=Jw-MLDySah`-8!k=TEW>%qy-#nmID9&}Ju&!fQY-x$euo9@f^fQ~!OcVNvaS_I2)f#KsMAE# zu=Xhemi}e{{5!ZsN`aB)l*Zcj89c+E(5xW8B`ZDI&ODs9PM4l3I&h4#_^SPi$y5o$Tfrz9dTUMV&;5i) ztY3O2kb;(<^J35h*`WUYKv zfB+D-yX_Eckl2$q%bD~!T?rabI;)^pq%O!F)kRxRv$Gmf(S)Z~q55|-o<7R^ZDr-c z$nk(o&>yI1^)Qjl2*}}jbH*j@`XYmYhZ=8E;|@0Ireo&%pd0aPRtyQH2uSfd@xAHb z+>@+SN0pCeU$L?Vb63!}3;gCR5>^irFs)Q-)^MWcs$tc(@ztI{H!zhW-}q{4QO}3k zpM;H}O#IdiJI(4_jUG?Ku|eo#hFC3R&b`!Pn?fXzJ7=!M*yzlajzASiixk^rmF8{R z4$^W2tDWxJPO@dn^#)es@aHo;2DbKIXzY;{O3i0tBpy~XJ>mD&zwlHdPUGvx#4(~x z24KBSTphG^4lV3gPa*50(Fe>Y&4Zorv? z+C;n?zxXn*@&%!|q#M|XUA{JkOWHENVHwpQRdKe%sC#-3+7Ps%O%tq`= zK`k0mg-AyA?=)UszHr=n7e$jCJzu!w`rx1?nWb4&wktSzOF#+Ef$N&C=#>%z@?+-Wi?az{6p4 z50Y7NVfp%%bl{6&d6BKRf<>{h4~;|xy+h}O=bInQ z19JBbW^Gbv?lvL+EoE)FnU{UpZLyha&>&Lf%a2vQuxrt6lVB;yQPK1oHT-k;YKy*$N~j4wzZn=YIxpzv4wbdS{ma-gHpg^DLB%6F;MN z9idGd?9h0$^>r~xZEaaK6$RMIu0c457}14R@!BP6Q5xi-V>d=FiGThoLe(#0{+fr$ zw(S5qOfoy>q^@9aqe4v?7d<_iBp35kRcK)~b|#o~sJl(fWTBo%=tN|Kr9t!;tf#9Oir`<=n=`oDVslle{rGB^h#NTfdB`}+s%m+ju;@w#8vbv>W+RIWR-slT25uzD2x z)UZ6r)KehHUx46dA4fOYxSl}T8#4Rd~)Z-llr=>(znO)Xdj zc8rT{oZ;67mUZO!^{6rCPqRK4MR<~oZQC=?T&F9}tZ}p$tQG$Da0%KCF1S4M)JOMa zZmQFV;_w*b`*_rJtIf9_Mbr12u&3?@n7*#aj9QoBYc?~LD+=7LRISdPpXt@)$AQtO zR>;88xtntK{1gMkDX-2D2Zhj`3>YjKTlOGO>gfIwUN}lKUXsla-wTL&+2AM9Xr3>r zq;6q08oMNvxq;@oOxP#`=Y1-qPfgmfKMgFYs~`)SmdsCX*xAf-LZ@z0BDU-S)czj^ zCpR7Ydx{s`tBqUDAZT$8U$RV`Xx)KpA~f*vbrRVpm$r|cv>Nl_Bdd6`qDmB9tUj_e z{pZMuDu_y+3c?FWME1iN5R;FStm2@AVGuCTueuLp9>%UjCrGADiVmq=A7V|D!w0mU z^frLIn7W`JhE8C{t${WQ^tycUH?;^^DrB&IO#f%wP?Pvf0A9`WdHIIkd}gpB7`!KUMi}7!R^$joU^GHZYYROR5d3Y*fD7 z2feo4Ggv!zQssg#=hz4ulV0xY>d7e~^CCJF$t8we8)y!cI35;tS-ut|tB@a^I{nB~ z%9;rU(i%;ezoS_hp&F8S`?!(P`n4FKIhgWtKqP?~rNwvB0Yv(JT(A;evPWJz*APER z$fc1EOj{Qn9X?zTrBr=A82V2OMx`XX8(sCf=ODZVtXHXK=Cw!gUv=tSUE5P`_X;y* zqQWxYcwI^%10*|}`&lo8Y-E_Pm<}smq2+7Ba^Aw-%Fs=lZwhwJU2C19Kxh#V5X+J{ zp&?7X!TLBtjoBthdT@6cxMvOIGefN)#&OP3k5mhxQUBcTt0}a>NIb0C`m){9S-Omm z0!a^qsj1Pg?_3{o-ZCm~P(T6w$Ta&78JdzQLbBoPz3eTx@v?J(H#d27IO&x)R6y)$ z2K|k}WY_ST7^IE9X3bfe`jhu>}6hc~ODR`HuhL?&Qi1x}5jbv1`v2hOxwt1sXZ8)qSaD$Gb<6*p9+8iW5XSvOrF^3c> zYHHQJOxttTx6>hA!ICO$jRK0oQu`BKJMe!$3mL8<_h+>V>1$S|Eh=z{q)-{t)IJcF z=n_cqi{w}W_x_?9~gTf)d~W$1v+6 zu{>tOBO@c>b>w{+P-a6yOJ%d}J?sqU$urz8on{Qt7CP_8eT2NeDZ3bzxVbG-9&Jd6*agqP@2 z1?^#h)nv6SY@6aI8Yy}cFbSRp{ru9*(zTTkBO%QDoec?t?HOQlc%V2JotG4?&jg<nA^>FmRQcPLCns0QUvIu*dw$fae z^OTdmYa9sEKo_HMo$nh1MaLBs7Joy?>+;AK_Q+Z6hr<}$%a4~;IF#j^S>P!5RQ1GQ z>D)7{dBz`Z=&NFA;Z9*S@#CEhU971jN28+Bg6^fyvQx<6z5a3B&(GCQYt2_RzJ9jx z?|P;#Cf_LE)YiFt8jVXaE)Le`-a31o)&E}qrxTEyb%RpeG0#0#t-i77sbC-HgTww; z&{FaXlX!!xa-!cHUH^&Po8g!}24BzkY~^s9%Twbaxua_fu8a!lhNbenoRC2NdYHp0 z_sVQWnewm0Q-NPF5Q+dXu2nxml1Epa%T4A;ZO7I;47&$_OkiYrK8LQ=wCvUoL~tjZCSnqB!LH)%mmK@q z4%x-0i2*f>`D*%_h^Fq-{Ee9HF}VWK_XV}_!@MTnJ)uG7%$pcmMDV52TQGJt>};wp zQ86aoUH;9Oy45Uvt*m`3;N#Se_IxptUv)GEagF>66!ZO(*Mz~{{gEGIF$*mqso7>Z zxACUAJ?+nCun4ibWk0*jcOG24IwwsRFE%VMU-wybx+p~zBJ}}Rb_kHPj}xndl?Teu zwTrm<@m71^V&yee+u^1&$j5{KWKzv54M%g@M^hT7%19VbiAu!d-!+H60p}FtWD6R2 zLA8l@idM3?IHVInw{uN^T(fG04Y1T-?p61BEGPP&ptkVXHzY*7EfB=_^Vm&XBWLTP zK4{pHy=6{}SSS-Ac{CIx!Lfjq9YrNQMWbw!gF&tGt?U`z9ui+d;0mr5b4zFX-bR< z)l{iOWviGbTOK{f^h#u^I(R_T*Nwf&x*mcNeg0$;TS&XAY@tY>84c%*$u_STY(rv+ zfL=gwiZI`{F`ePDGjvHJf*k=%j!`L8nQih!pnlS74Z{o~R#a;|rEE}er7~|)%@du^ znjA8?iIS9*?h4Jmg>I;F>bx#PSBI6K%0vcl&b3>Yu6tc<3|A2P*yiCn6?e>N7cL%O znjF48uYS6!xj4tV;!5Cf9JrEm+y0`9c-w~A3c8y|3Qp^d8Me|b&WRH&EEawJqy0Np zMe2g$vgnln>vc+XSqU8E6p%EG7Pfwm$~Me}(4$gi3ZSkCF`|K?^G8=t7~DC2a` z5@S5|&fVxKB&xQqBY9>;>ngkav;QodbMD-8be-C?dWM-`Mk2m)HrW3U zgrvXYIMhpb$F!li#0v%Q-zD)$O=Tl53|^49w5&|ry(0Wxqf-9SC(f%2xaHO7LHmmG zRXWi$ley|Ln%PvlfO7iR&`6^hxQG8IrvqtMA9&6$#`k)M_ucy!22kG0A2jM^*s(+s z;+s0}wdy~HhEW9x>lzbNr(D7X z<>oWaqSnP!x%gfkJnVX;1CgKU8ai`IFlJ-npy5>RaJ(?YQ$hXd*@O+Z?AH5+Bvez2 zi;$tiZis0ALqQE(kc>_Eq%?x%+kjZtPt$d?A8; z>z_!7Jx7;o-{|HT4|gooc`mK*-AqjBEi->C^~yQSJ&v`fw>jz46bIxRT2`or#-rQ* zFRpZ+ULKOGa%b+LEO1k6@4EANdyPCXFIvm}RF;_{@2|l;+9nm|t=)G}VQJScKU)z6 zZl=hEmMxK{=W&6(r?4fyFUUEp7duMXl<>+W$YD3wvh?fXw2uxd_gvRj@PK2;DSzwS zh4ZjrM4iIB?mI$zu{0+7-Nuqefz24iZuRl@yD(2AfOow6+_dRZ-t?XP_w*|^g!ZaZ zsSeMst!RUqqtrNbuDN=u0*d6IPX8m)UQfj~zXp zinxjX%k{VFEYHhS)Z3e7%)H-RGgZXcSd@=&3~Jk9=VeOQR$PIMq@!}#Su5v%UKpCP z?tc{Dt)k11!-KnYyPBvwwVaNAYM|(8q)(nm`n#6zT1N)ZueT><9hw*&Z!r{lHYhN z*Fbnp6|iR=6vr9Daj;<`--@n}Drik5RnAuD@?hw|S(rn#XP35VjY*KM0O{syL!HrH z`T6m>UzgMQgeu7gRWx&n1EA9|Nh-G5r))51CsP zL!eA`04;JxC>h7i#jo5ktc}kr9MoRJmj+2KGa$v0I{&cfQ~0j6h9Qt)Fv2)avT5)FF@k11K?zJ_8{PJh zwLV{^I-;)Bdnw_?j?n|TjEjtx*&DUm)6@_%81KDD%erv=g%qrV zd=ZCTUyATv{6o2SrfaKunvIvAa?({J^k~cx zw1Z?o_0^PEhQ(3$M(WY~NF2B99c-T{#m=N43jXVma@M-u|84Z=ip(|viKt#HZ&N9w z8L>Wl}=q`@}UDt)xxL5vjkg? zDfEuw|MbRDQ@JuhFH|UslNTfzI%|i)ejze0VlG8~lr$(~VG_9F0sMzzqZrpGV=k$5 z4im>J1l^YPo+`Y5W7~SH%|vueJOBDHVl}mR{FOpQOOLX3iTWX?I zv#v?LNK&oEaslSHJ3^7s<-5Zwepxoi20(SE*E**V==w8B#hXQ(^H%E;fg1$d{c_}v z{{e@-@-E@z4w@g?F!g|C7FMQ;B0q4%@w|nWPa2#`+#=XJ>M5EkRZP%lnk zT9fzR>r(#n4WcLnz%rJuP*M$pFWxk^E$CGER1QIB#rZ9MAgCY{-PmY5eatSJE@)U0 zeL#W0*W-o3&`+$Sg@BYp1*^W%buIfs|3FX$?FaQDfA{)ru2@xGJ502T5X>NWk8-U` zP>2Ip&djrAon<6S>6kbMSfad~Yyipvz$Rx}(B$lv1#!m{fwNc?J(#XSMbjQq$0{PWV6<$_&D z<}XhmPr}|yRq=@eLn*!4JT>b{E)LNhlYE`4>FL6tMv;}Gq$LAx ztc&*j!ADV_>_JWiiio^cm{Z?Kw>{-)v`q^9uf=mR&0D}qzQI;rS?Qj#(Cv6pftl7r z3NPeR_f^*O2%g_gx(UAB4InO|jhPJ_9qXrqx2zhE{Bl2ztm$4frR1rUIJO)85<@(a zFx1u8@K<2DGj5q&tUdK%Jreh|4Lgy?fNpHOp*9x9AaMTv#3q4;~&g3$>1< zw<$lq<+L2M=yfp?j!Fte@TydeI+^U(Mr~be4P1jx{%GVMqm+}U8$s-+$RrDH4zU63 zjEL!~`U}E+8L){Ure=VR{ zpC19hGFknuJ6CppKcJ>}%g|;1e9%|QP-7ZCf1d=YmdmXtbu|i_^4&dXJbUF&hL!L$ z7H!K=d|rC)m-k-(KtW|fRznlFtUD)eT{@F?aN*;%1|>|abZmfwc9JOeN=!XwWYDVg zkRwpb(DHwvgljDZm5Ck(cU0d|25)BtH8HJFxAaHOe6F3P#&|Tz;I+QqFL$wvk|mkE zdZ*0l^zrP*^$PmC1!Ym%D{rb^#~ldbC}~{>$0HLX)lCUh{9t)`-KbsIO!1A}-PqTE zxBj>kJyIFmy>aIEUrcPrB;UC9DGdDBgU>ZEK51+3)7aW4M36FDo~|Co&BM@>c$2PI zWqL`Dm?|F$uP({D^d#=QD10nLort2Lb$(BW^7LeVRF*H6E6%9MdUKU9ZpfI87^#A4 zlvg=?0L!uDG$sG{B6^xIJg6-rDo-xE8ZCe!8llHkd9|V8DZ;^wWAOl7K27;8d5j&La=*#x?8&-{4U`cJMd?mYeQDPg~6 zM#o!@rF)SZ@;Rfu&GWhX3ylFX&F9a1F;t3T@OA3WGQb_2ic-HZkdn|h@*v8`A|9_V|hBNV&mv-n(a9ib*bwOSF+DNxLY0mAW>){Cug<&U6TEa2GY(0`LZFM z#4A;Z-_H);;>%AyhI4JzJt78mAbqbrP+e!VQSUMJ+BTL;#6yRdR|(htYGe_>{&E5dh@Tk zc4qoqGzm`O#7m=f+>=u}202H85=z>cbvXXR+1OT&NUenfYAJ7^0!!CgnE^qJbSaRhyVa5-x*yvr=X&T*ZTS~g`+nlNlp1?MCO`5_Ju%Aw3zr#-~Hpd~5tnqk?{!e6!DuJw|}1E)C#c;wm# z`F_!*YZKz@6aLcLGIPlraL`)!_e+x6QVR6s5GBJBet(g@2MWyF|Ak%Wsiu<7 zwCaWjDwH}U{mgq)oGVoeY@PY`YF6{*-=xkI+OF^@6A!5ncHx_A@G+2FgGu2i5+L0c zm`JLE1WthaFAD3pm84b~D9*Pc1gwdr|9@Dse4GPvazq2sL9o%MBMP)ZCeR5?6sSzW zi(g3k?hOKuJDQY%%*ykvdO`9m1~+9~ySUQ)wE1df6f{VV(~ryo`iy-%!ZFYA7lrJ# zyxahDp{TGzim|w#nVit%4~l55qhSM>V5k8~<*H}L3+GeTfYvhD5JhN&!m5%8gbJA7hFqSfIQtZMJM63zHb@65;jt5zAC^kz#7#tZ>{(jB_yhSz z3nwq+hVsOnbiC9;v>P5$SZL7~ZXGGGd z!#>Sv0HU?*rtdX<=Y~;x2}NfF)qU&=&d}CI!B13JjKhPGPAqxeAiK57DF!diL5oT(WJo1E ze$-PJMS-^$5GS_{-pgI`ze?Xbo>VSs>*58kt7`jLzhIz_HtkxRB}c^QwKiPHL3Y=C zN0$4#&aF32jchKs*fLusa%boJ59$MUtX`Fu*=L)hsj%h6AOgJ7vO5of;?!%r6B~GG zlr0;9bnP0vG4rZcrZqhdMzYzq$Qb497yH`tfvVWhFe}k>vmqd2U?v4S@#y+O=;-D& z#Zx|TQ~|IYVcJqjSfcAoLX`ajIFdXj>tl}0PnBF(6(r0Ur(e_%BK@YSdp(tsmv~+{ zQ8?AEwZqHBi})9#l0tT~PVm^=bjL_Md$ZDc0;u764`E8iL%*F;n4QwSC%#4Viao@y zNk`PvtxE~YwH#zZ|K{ZM9j|t1IX2ZE@2A3?scN<UAs6Lx$~ z#?3B5=4Yv3(hHZ~H)aEY+umm{nq|*n_t!p`J58KvF^j2{L%%xgTFT#&L~Jj(cFhSF zMB2-8EL?Te^)YGh)Md1s`yOF`@v1DwSMw8afTkisEI-N+rZWsrNu4Q3YO^j;E9XwN zm+^ZP>Du-nN~m?w0ktt(t*t})-FPZ@d|_wv3sAN$$%OINOYPr>R-d+nBd62742S}B zJGav%sh*J38KQduJO#nrrMQ^Yz%mq;stZtmaXILW$2*6?8$*x?W>M@`*q|;qjQ0a% z{o*8Iqm0!Q_=6hx*C7iK{?qwh79&1~V_+HoVP@YLi^D)1i@_n}XLV8EV)O#m(O(IP z9r@MRbx%oaO!G{ggEkw;vL1#Z0)ZK5bNe%1SRl6%4K}W_W3Va&F8;l()+*hHfcdhL6rkRo0 zF3Xp;4r9wMf)B7~o)HOcy`)=z#d z#o(}Jz&lfnZZf9tsvvE2+u(wX&p+LgbZ$w+rl)^2ub8jSbUn81BBpTDL|=0LGrqO{ zh{0fxTO?NLm>h6V){EV|TDH#W?ypD4o>raQzUlTuL$Mv(8>sqTlDijc~8+?=xj~69tC+X)s7my2h#VM4)YxiuR&ra>Man2+N@T$8MU`hqI>m=vT()ae^%N_gM36J*5V;M&Y%IS)4-`sxOliDvb?< zx)p;9gB4DCRoJ)8XSmKthCMR7XTLf+vMA)O5Uh;7KeB0)v-A+Qvptg&8e%wGTpnB* zZKHlBO3Bc~FKlF0{#NWk%`!P5L3zXBn1>khuc%O|4=pCjY*GE(?QoQKN{FsKU##VS?*fXh2Ka>M z(TwMerkChmm)irLY_mz!O^0s8B&CK|Oa`0?N!5%e%ni^*G?N(zv;&RmveGe zsb>3{pV#HJ@`6*h51Inq^K`mQFS80%9_Y6@t3A7VmP`hX%Rl23R+4Ez@(ysv)Y99RqiH1*x&q9Q$^ z9qi81;wg(#NAe=}pIAJunmZvG-B&$^ZBD`f09gLZ016$;a8eEPj2pN8fpfL65P5kt zu(+?AT_Ee<6+Bh$&J&^uvO)E)eJ)UJwwUvjedYVHW@XF0h@79e$es9Mhsz>%&cV=a z%ctVKrS)+!fV^LA)KTdXxx#MnbHlUsLGy^B(}Nqeir;xJ%k^{*Pb7kKGF0w4_Vokf z+>RR9o2S?9iJx=;qKuVO(R1!lmZ;?Ld^YzExe&(0L1@gVNnYvCg6?hiHx_wjDSsod zSbiRfAJ|b>cNU)rUn|~vz+lo5p7AKqCj&$*Pju@=_kN9<{IU>&jXJ-rlxr2WexX6? z1mT({ST(lH7K$_yzP{qS*xcRI zeWbh2q4RcoCgc$Q=-Y>7@3P^F@h5+rE>BxGyN-5bUC$9#h}HTaKmu57bh;#lySzEVz=*keJoPgrnF&jo?{%HA99vw|XaH6WyOf zDA|}J=<;Yv8^I|;PlT-ver>w@d0@=g`z1q5Dl&>`>c{UH8EKz+0T~+GmfY6_X>ZPu zly9HT%Uuf{cJ7z{>TNL_m8Xr2UHWW)?&}s+bS~=U;!M5mt&!a};qB_ljYGr9ko{(l z`YOfiyam(#UD5voeQRpdzt9{g=7X&)u2GuSdvJZQZTnPLfUcG}F_pimn40@v@H-!E@}PtGXMqAD9nm|(SS;N~WD}SK+kPd?+cv@_xbnn3 zs90kI>vFKM2AdSNp_N$i>3*-=xP)sGo&1KMEsT`#;O)WN`s{m9b+WyDoW$%d&&?Na zn;YUl(Jt>9ZrrQf zk`D|yP!@)|xZV1@(*b%9FCynPyN|4ha7d0C6-`PgSjr8ZXuZMR9JUd7LEbTa48}@ebN>%2_3ygM&J}os`W6(IuP{d=kHj z=20(a6W(HBTg~SJ`&QV4&VLrAu>*$S2$~1szqgC#uy&W(tz^>&aY|pf zjYFTBRQ`--G5j?KvZjJ7|EhpK4MTnRL0g0>V8bY*a1&TW>yg09&7fgmfQ+wvWed78 zpXtyJVyBzXZ9Tx~ks(dVQBfEJ=qwO#QlQu=90TOV8v=Ik7X=;{Wnq?BiB!hz<8`3` za(g+Soog2#B=~GpnA48V<7c5+EFn9Nr>#ruWUp$?jzSDwgV2}Tl9 z?O4w*9OyDm^}td>*=Xv~Hh6}~2py%0U;HGT;{pEaX|&&$uf`o*FEiCvJ=PiPS?-jr z!1HSLzq==DJ6eBiua5j0vLCuu08U97PoT~gh*ZG}52zo8k=%H`=~_b`4Ja#UcR1|6 z07tfEw2fvfU6JFcE9@a@=t5rT8u3>hKC@nQ`KKKx$NVS-qpdTneY;p+!KxkeW%>?& z!r*4jQrB086mX8CYJG{`A=NxGize=t?ZwC4xfAfFkUaet9`j5 z6PQykiVW@rq5PK{0od&sDctrpDFl7Nkn~|OaS~kHb#96wawm92QY{UEfbCPjlL5=P z4}y$`vSQ57b%%Z(XA+QwbXy5t7k?!6uj-UyNu)<8^F-ezST6kN?o_U3x$kwvXFE7Vb zIdrICaU8RM>NnlHxvdaz`HqX?;>NC(sC5%8pwB$s*R{T}QDqwnDqT#SDy!r10rx9F zifP_s5J@5vmE2)=qcp4ylR9^QDhjj5hqBbN2~p4WuQVQ^h@ObZ6xt4Y zG_D%1m9tc(fBuHLX4+|HGfIDTq|0SCJSCd^k;c4~8km@}+^N9(vbZ`lYj8(&V=e`e z9{W$A@>O%-aEH``$7}Agdj1Zpuzf&gDHq-!3`S6L{Mt6{c<}>)Sr(e+f-! zYp4QgAD;&mt(HsgSC)j=M_IAcA$6)e4+VrKZ*%|`@#?_uTknU-M8N@tz#~Ict|6%W zkcn#Y;)wyerK+4yLEwohO?{Ok-W^rJ*%RJ<&{!Ap0KSTEWuTcqAF?Dpm?V7wc|Z$K z(nDO%r0_lN2-1Dz@RkP4;gA;_=kp1|%hTCB<;z$G91n9{RJV{yAoyb0IqQkbFu$b| z=1Y77RQYkV+Z&CBwX+TjF%2?dRYmH&STdUPm2@tsc$gOojKT!@a~EJyVSULv2LD9B z{`YN0WN-m@T?Sprd9ND_<*xU^+^SJ*vGe(z|snxwv)({cB(z)<# zATX&9=V8CF4$~*3+WrE3te9^}VUvn@zlT+8W}f^@XKtXnt3xt)WW*#bLvl{#hVsd{ zwzjxxllS(OdkqB;UamUKsQsF0j**rv&FC2to41GTlP!D{F*wE{jR~KiwT4=d0Iu4}T*bE#xB3 zd3(hs!~UT{3WZWaPDcJdMv5uKMfqG-UQj}VzU9%SD{h*4BA@RsT>3#L+;U9(YHxEs zrcp}0iz+A!m5$k~pWRcp&+4Fm_%H3YNX+-_*igl%9C{&^=dR!3UcPx%vcGxbLpRO4 zIM4a{z2*b9d;sh}$G7IGWEX(*%)D;gaZav1El)cDq+Dko90hZ<+YL_tALy%~*4(@G zJ?-VKbsY!6Hf>U-1ok?sx63yn#05_s&1`5$zF*sMB^%tZwLF4k@df%yubWrFb?oWN z_y>r>MAvdV(sS5X^}^m?()%nzJV5IdbIM+wnP@H&T&TSIU)Rgk+_#p}b7eO@s|rBl zhHiEfYRitA(3Nr2HLZ*28x=O;%Urb$H6t8-3lCQQ+nlbuT;@G+QL4duJI~vm!wLI4 zZ@6@#+vhDg@9}@$KDD*}>4z+wi;F?E5BWcOoBHHCz^VC4rqXe5qG>*HLzm6M?O2tc z|0`xwtQPM=u-@FXPRnLZ&kB#UUW_}W)X(0KxKqxJ{q5uvV_}K(kAx2=GJ>yjE~#-u z8mO*)Qz^;n`ZLl}?OsvHdbc0)O87k&@?Bcp&vY@$L!aDk#5{dZnALXcwH6(r>*ZjM zSrs$>Z$MY%iJXrRd0qxsyUJc`SOP;80?P&VMHCUjWyU(I8=e7z-9q_Q>KNGmcW1wu zfIH8=l#_a!mfRmXmFTTJ9RZlI{GL%4{fI=@9LYB~CY8TK{)Sq|O+A!#J;dF7Xe~Zf ztEzS(j`hRP?A_|iph!pOs(&3`85yvQMRFJB$XzDnXF)}Z0?5Q zKCKk7DmK5>Sb!t17e(})gk9DyXnVlqXO$*KT zuKwzH^Fxi-N>z218vC=H0yRJWgGf|O?fPE7)QxhemkQQ=3miV*fj?D#T*b3X>?Ntlirmw_{W@jD zHgHetfWmrniO{lV#hJB1^3VXYk{ZOa|RSP-AdrJPE&BhJ?CkFat9 z6X#gO4dD%zUthNK`S!CMA`KtorYjs=?+ZAre~o!NR_Z)cJ%;lco!wO%s*8=CSQACX z!<%nJ3sIgGeRW9OH4Tc@uP!1JwuiiGtLr2FkU0CA%u)8%fxzd!h3a87vgbuvdD&IB z90nFeU8{UmA=k-cqBqq)hG_JNp21)52lxZLR;UCSJN*TrxfDTot_zd3e61JKwkkgL zAVJb*O;^b~7Wv(!XYcOXpERaXamZMu|I+3BhCtTfN(-NTeFF2>!1e|1+0DL&1^{YN z`R7NW>A&e+r7Et!gSYkQ;mYy{Ex7Ub1`V`|D#{k&3D8S>QG(l@y(5$FcC*gN#5&?c zXhsC|DI5Csr;~s}A2b%FHi}j79JfSlmQ@B^_y4_oh!_Xlu6@}L`ugParrde7()B@~ zJJ?kD-+k;8KCOv?0pB_lqCQuVmI>)8q=lIYA>gopior~bbg^tJ6Yf0veGV^$cCm`~ zkmXDM-5@G`9|AZ6n7@I3FUab#^j9?31LU6|yyzH#=3B&Qj#Nl(--qjJW#dme?RKq2 zm$Z$1X*q2?kn*_3E}ACvdsOt84DVvz8@xDp6x9H}tdOroWUyB78BNW~-ajmlCQecH zZFv)xO1bA}B-LCMh#(HgEAO84>>mysNG?y65U4VH-Blnzk9_gg3 z^}~_}G<*R@$YG^{ECEuIfHLZMiY;vU170F0i`@x5xgA&!3p&eJapmVo=A z4@6YGYD16feNDZxdHNekFb?{cP{ z8T3bgZKOEVBY)S9^F=Qc)tlVTJNT^!eIPG0C0;=5$Q!fi;pphK@)0O^DWQ-NWE{7f zf>FSEJuF@uK5{T-=+(xu(h6m7)Q+%g+wY_Gn)zQNsWqYdsHNTEqRs={0gZeCa&D2I z?~T+9bc2l@bjWVx`&WZxq8a3|D}-WdJ`;BBc{obT7LY(MOHtcw{ zT|LUZ59tx5+$dcNRo=8!oW+$dAMdG{;<#P}R#IKV?JVIg(0XrAg?vJeUquF)}PGNMZYDL z)Nm>c$ukSzK;IX4L?vmN*o1I>_Iwu)06NRl-up>@$(6IlBMTQ8pK?z(uno>Eyp;XKE^nA1z--+C*GIyvME}VGgiY3)6iB@cu-$Z%s?Y*# z$Z{u(ldS?7H07C`C#73_ysGI>xv<^tOzyy z1GQ09oLv*H8L{|5IUuMd&vl~Z)|AILt+JgI#t*fYOOjW6h~XGIZd!@QtBV<{HHEc* zqR?V4k^$ibiCj>X>zFYWj-l&jVCbp{uH<5k6iubl#e{mvHb>`X2Q!z_23a6eS<%C! zy?S|;%Vy(vVpY()GU1_*h{6Rk(*T^5eM=aH-FY0k*JQp|sk)>Qnx%{+P3hEVAtP3; zdW-HJl~C7no@G=NSML4w;O{HqOrE=w>ZyVZ)S{av=!IE&wDAs1ahHG4 zf-gi&2LN`$ft9WWsnnUAJKr2NGLMpa4L@kLUu-{jLENt*&9A=R_46Ip4A@O2vRt0) zOs&#Zh!;oKkz*Za<0^R1YJ4daH0&zHo3!zh#oRn;>#&K`ub>D1)Bf?a#%si9T+GHL z{c8|=ERhKeXU|@X1`_CY^52^GM|olT);iP5-~R^!Bmb)7qTAl))W2&< z*1u){LucJPtuT}-SdZ;*q3$H?F=#*N+23RCjJz#IB%dvRq+DVHbxKBnc@ zzv2sO)_bE=bBWfl94ozO{a8etk`WOPVo6m}A}ZHg4C;725Ar>`oj*Ql2470N&5vhiP>oO1s2c|`&< z^JUi;QrfsKSF)@%!)unZBvuX4^K{s+gX-*DKkIpN=TTXq^_u|>aCD_TCyVLuJ7Gb@ zn7oqw)r`;JgMUS19z#h4f_#H;mZRyQN^MH_I5c9o=$E9Dd8zaTW1S1eX71NnKiz}8 zaVEHEs_ODz4a#p@=;fRXtr@v8Y~UB%tUtOU56T*GEzqGq)>UwN7bt=Xi5Nt&4ujW3 zzuSPpBR=5bZErA79~b3#s`~SA;>&SrVBVVs>bq4a>ocx{(Z4E6)-6$-bR;Gx%! z5q2HMol`?~DFShwk5C=qB7Kx_FqpKcNmV~BdXib|cByDzRP=u!0ahYmf4^Dag09Bp z&; zG;h5YWpVXdq{+1k%_H-}Yq5y`{w(fZ5_ubI)3mwwJ9}b!s(|WWR#cH&ZFg`R5(06| za#T5*KZq<@P>^DQr5=v;Gn-J53pHn0=YAzSdsJXjP4*n)f0XbFMhi3MpgLaEb* zXR{iRQl&M^Pjremrlv9mO#cTu<%gM0!FR$p(Sn?sQ3lZ#c=srTBz8CiOzca!yxa6d zF~@QXQ{8xK)|JS;&)&4c=OGhVb+=gpKV1~%=+Nhe|EfZ(hBw(Rb*sH&2TqHOWL+;z z`s>BQLz|^Sb6vGpK7UohR#GblDz(|9&{{Kb2r+rx?r>I1%}+RPcMUfG7erii`Q$>N zMK+x7XiLztk+eE{&HVLXsm4@vj=dmf0SL9HW20Txz5GvUqRRaFpK$rVr!nP(*PXb{ zTG#5;0F|47JN$Ey7GC}N*`IZ!ClhP=)ZI<*()+)j-lF7<7wC{5UsG}|obIp;dP5)r zFZ<8WxUEUu98A|GCcmAI1ss;odp^%9BIrtzEfhGx06_sq{SuU?l2u(pH}p1Ik*%_KNYuUIuC|+J^DdrZzi(8nNMMSreO{xa zanefpyv-Em(~o+GSVCOO{hT!LvP`4b_!Wh-T6t?8c9{=JG*m9g`W5{DcMN=!B4@Gc z&+$0+Ka{K;n1K351AwHFR`j&f9Hgf zR1#Q0KpyHIRa&FXu2b%D1?}!SUua)l&F=F9p*#Eb8i0SXa^7^RAjtJ~21MbQ!U*Bw zY;#4owHcP0uWyjM#9z8^0@)qEZjx;F>-}WPu!o61-Nj#8*cU^SF-zm)nx~q zR&z*@Y%0}P=HfLZO@vTykq4OS{HoXvKmry?4rS8 zSTX9lK{Qi?|k zTAQ?h-P52(KONGnYd@%b12Ua0+#x@r{N)wXv^Yn>FaG=d9yRL>M4|Jm+xzPwdQtz! z(Ruh&{l9={B-3UQ3W387GO zaI&*1QlH=Z`}+etNRLjh`@Wyg>oV}!z!*ye>MS3RV_X%pEVU=6ip>KTuh(F=tQ6QQ zqEPg}M4L9U3hd;DMUtrd@S-be?kgoFyL<6+GTv1ZBg;N5a!U*?8fb`yQW`NZ)Y5CR z8gq$Xw(8#N`6_%WXL+~@rQPfi!l$-Z{XHq+dT!i8FI!z^;;!~E)e0gskFjuwZbXAt zaU?8eUVvhqmCO*<9{8EYAE4H87=IvMIA1qS7c%T7_5{Y4lnIYCHJK* zL|E7WdmkUF#|<1Mj+h-axg0=0hyfW4lq4<<6R{^48}!MRRlGo-PnmllKd*8CZ<(=u z$PBljI{2I}Whp%%D`B#{rgT(D+lQ2w9*hNt>d>0$tF%GDfemz1RF=-bf;JB69fn2Q z<*^KCLj~Z!s``O2#@^>59>(F7Ky_zxP79I1ine*EVl1k>0F}}y%@i3+wznv2w|Am1LuCnp7IWEfd2Ag*UUxNCo%+#bA_7@T<-0kgPvd_J|^KX=E)`?6r6C`a%# zIQd$+s0Co+QStd-vY}Z`PT%tKfvT!@wHG@k3_UrwW$&pduCMF7h)uiYQkIOsXec%0 z_rc+=-UtNj6%dw+6iF>oS)@YV%o4rA7VTx}w5#76I5I(?bt@fwO~#u#z~7ym3UZQl4?x!n zUu3zI4?PGKc)%i0;?{8D?PuK^3``Nls z2dF4;rl0qC@(eJ>rW@NdzY*WnyZb+3jPiCE5_K0fDIP1Uo+E|LiV0a2t3D@fJre4W zzGg4~s;r*3N><4VvBZ7i_NVFVM51&4`+9*eOMM2$7|zGKvO{W?*(2q6s7JU>*PtM4 zYbbJ@`SFMwe$C#7T4aw2u~4f&FR(vskndd-{}js_l_xms%mLdFFwK)3C7I``>SuQuSJYvmJQx~^8n$l^C>@Fso_#;a_H)lsylvJ< z<|l!1Q0ypaX|-*aL-&C}zEVbGNt>VcW&U-&@Y89NE4fxas|lf{(XOHmINFAzv@7{P zP;y7NWZ9%qFNhvHQ9^<?$sJpM=h=tB=YHmV%Y=lp zH)h@|qSX<{ZeJ8D-cg2#wnWo<8bZinHl7U5lX3!Z+NslGxQgH7$zG{EAlV_>osxl?5#rMW}yXk{EgZ2E&VNbq0ghv{BS3FCeLUcTH$TF^w zG7|v77(u}Oq71oF9h)TXzg{n>+B5R=s63K=we;OI<>L`&bW&^8a;Q8g?-{H#s5#8- zKadJl|In7!KPQKUc=_7^?KpiHp;JNdYI60jVj}wJJ6T5Dc`ia6$obOzW-V5#L^9PT=WSe;wB(9&_FS z0>Ogg5*adCD6%X#Y8hA!YFaJ)cA(3B4isw!O|Ou80G3t`%o6$`~jjA z)46z@16_UpQrQ3=6#L>=IcFRl0l0#*SlInL8eGC(*ylkHEpr-=I zR}2>)DMTZ3sAml`YKxO(y|6|!NV7_7Qs2N|a5*Ef7+=l|@hNhpCpU)BrV5$ofU-?x zCq$T#!$BA4h5;csJSeILjLt0d)}TLCSahGcJ&=u)c1sW|T&Z};&doI7n_J?vn1d3C zojGG?YV-)oQBgbo`DEGpJ@aR5+{TyWG#JxL9-}fO%TT8+*v`=sM02guWO_l`1^Uf%f&{K@1@$FFnM;ga5}|%BTfA@eAFn1I98Nr9mYU}pcW`BTp?PM<*{b50~c zbk!^6zTCVbL#l|{@#z$u8A?VkqPDfrAM&HJFz{;J)$v2ofL4f>3|-bjkGKO$51vV` ze!`g)hILJ|F-EP%q?>i<+u7?mCKV=x42NKi2TZM3{jumc3UAE zj91%~pRMNj!g0+E-DCb{L^W29`v_!*o&cS-2Q`UUaE%!B00W2D47%dJ&qAm4!{97w zd&BGG1kGKu+_K?jHy%c9mIpjeW13AU4(wbf+by@uUHq$(DQI2w;exndW8S0k?d-Xl z{|z7IRGDUB$+#=xz#EM*&6rC3^2S4!w^?Nhz@=oFcM0y_#R0m-qMH1%!%JnjHSs+AZ&Dwg~1Ei(C;$x`Qbioh7 z$$OK@j}{Nb_s^Ye`mk;S8=hA(Qr^PRa4AUGi2w(5oFcR%Q&_`ROc9D?Z zpTN+scc?|*tM%;^@92>7{SDA7FDE4fHl%Kdivo%e)qn?&J3{n+o&|V5c3D-_8&I)$ zI-51d!(L7z>-Q8tQyRt6TDJSCSih3ENYPX-;{l6c_t?TCK%$A~J#Ey9QmuJ~cl6QZ0 zfy4@Nv$n-`rLjr51|X3rvYMN`&-Jn?U z(dT&3M*722I<2r;(tn^*T~6mLo?o#+X}J=*c{hmmxQ@~L-gTqm_jwCVAC02Mj({2n zCWG7&HBwoaoF;)^?ZR&A?+?jYb`Kk$VYfk|o$LkKH=H1bG~Ps6@%^s=Ko^Cerr${5 z#%?5}7eKD)Tdmhi-u5#>Bpx-Ge%WpwUF+$iodA%>?=!UQ?71zo5wYhG@gD&iog+W9 zK3&rvx`fOHBBu${bv4}@cDE$`R{Efn2ERbzFc2IBZQnU==;r9ROVF+tBu4>s@dtwZ#d0^ejX%@Fm{QECo2|w(~eD45h zY-U=usp6}jR)52?UYhd9Fy$<|${y*F>^u1;Bo8Kwt5oCUpDo<+R_4!QmdsYoADjUB z^yzV|*{T%FAS7Q$dw?FWU^Ix-5P19;<9)w>cb?dE__=D95U4q7HffS{k9CXnmZ#NI zKdHc=j%G<-{NjK}%7uPnyF6_4RtevwKpe@H->g>fvt0E2_n^f}^6p8yA!91wo7+ z$y@HGkEPsaZP-6;ola**^i(|)NX@r$rRO3JhH=o`I;<(3^+_bRV}Z=w-MI4)UW$L4 z+uxM;F-WSqxiGvgdlIG3{Lk6)dHsg~E_JbPv?l5I#-#O7rQ5rTEnKiJk2Y|~uqrz5 zll-^*wq5==j`rcVUzXnT8!j1j{|7>POkB#I$I>-6UpqeS=QiE8Ig{LWB=%(+(1G0Ym zm|v4}@XJN1S`n>eIzwIR)^V+wl5L+gky$qtGPvTQ@8;UnldVUh7KVd@nIlC1Uyk4^ zTHkT_r5b`DJ7?)Spq@Mv4P63nUGhYbVYr{eQ+R=tEU}7lG>13Y|a4-gJi^EiXd0hJHmHt~P8?FkA zkLbD0^?|FkoVb5_fdXBRQ^AHq_7xVNRpiF_CE3A=58Y+O(;B`+?(h!m1cQl*$=8If zap{zB=%5hy&4NEL`u#)UnA2D}va4FXeW|Dx!(u_MM(N0cy8lhcUj+(bH&w3EJtLD3+s&t8s<>ajeNCMJJDhdTe=joPzYcU9k^Nu;2pct>?EMz@#eqC*1c zkfSSjxrwwK=NO6toLnv3Wd#SPL&L{A+v_qHJ*NW_`tKPkh)aB~a*o;Qa8sG@uSX zIjs&BgoFZo8>XeOJ_o#`Fh?)un9eA!z_3)Mwa4QDDX{#z@XWm@$@C#%5DfS?eGJg6 z@TZskS)@+o_Q}=WD z!PUR=_jcpg&!#;kLYBJgjj)jH5(f&4+Vo~%JcsS8JLL=>0N4R+wE$Sf`Nc~jx6sAx z{T3qNmD1$GZ~$A8#eRtvVJ2UkE--U^Ogu*;!9}H>BIyk8$8>qH=GwMc^Lx(vHW6IZa=|%?P?TxJ1Ty!V(*&VpL zqQsJ8)zFVw*U*#NHHrDjjo5hHfqeX`X&Y+iZvcqRLU2USL5>NKE&NX)NmMg3wdF?v zt7jWqk5GF>Fd@#2oVB7hvN4rEBvJ9~;7Hvq5hapFTgVK`#W+eB%E4Vyqs8xtY%)e; zQO%zc-PRC4?CL!0XXEhCHi7+!WRSF2|;qF-f2vSFoHWhiM;`+h|Vt zm?mMjB!d2zpujj?K%jRh^VXL*gj&S@Fv!8-ghN|j z?ZiP7f(O;4wU(D~f2rjyv~uI!6;pX9nny=b0iDF@Ipn`B3@3ztDfV{HpC)l!JDO^> zVy6-3_2sTn)7wQxPOj|vPI119uW7holqp`4p4X2YUK8*!@lB7QQHsu0YlZRAXdcw3 z)S?I>Q7}1%bQ~c)5LP%D(pk*dVt@ipi%!M?b_u}AH-K}|GiUMFN-}xA-1DrGXeTGp zoQ6kuog6)}!P(3k$&-+=Cu z5M78&=3%;3+9vn~hczm_pb~~8y?*1~v1{G^+Rskk>aYBj*1|PC0wA<#M$o|$S}+mce(LF$IF>6`0)A1Q7RhCV;`LA}Uyco2Bsn(4 z9Ep`mX8j1CuBgSrM#ToyGAAltvNE1`DlZ+HYm1Coy+UgiEQ3#v(^ zVxFn+B2}Z}tb2vxA>XW&+4(ykw#b`(Mq%MB3QVZmhc;QYX@qZmH(oJL) z!?&A;I#VT0?}Of!inwOSyaN4R`ugK3hWmvcOZKyw?OQY{1QlA|%$4}$vT(8BhTWk1 zfS779+ubU%|8+If?(gB~mgw0w6sRluSA9UFUgRMEI^u44LWv)Mq5Q$Yy@fXaq<8o~ zMP>I+IPC)W@1(*LY)+(TeD&C{sW_J6F1Tn(T@UHx?|Jp%j(yPrx zXE@iSb&BNn-2zvmN^Ulg9jNKN+7mAQci+C^7u<_?B7-TaX;ih73uq*lZU;Q#b%3U z0+TzSKc8W*^(Oc`po#?qT}ddr!ju#W-~j zBizWbJ@vt6`DlLq!y$#mMwUwG#*pQppdM}oFWvu7GzI{_@L8brk=Cni#=id5x_Max zy)UP_i$n;XKP!+U7-q!LB=4>qvVl}8%iA$e)w{L4aDl(C8OwXC?uze%HFcNNeJV7i z8sHLGUr7@d;}B68^xoWX6&}cBYtYfwi#L?tOgz?0VO4u=a}GeWe*AbY>?7qTjk6 zk7gG_$dtu@9lN^uw`)EHynlbMyY!0KwNAEx#5%7Rng|v6Ki;?}JOTolUwc8Rtp?u> z$mM}Vx96S@m}-tSvb758B56{sd`f~{P;Orz!G6TgA%3{SL7@OWxMZezxZ>&)M*YG4 z86jaYIa`YV&B#&14BIg|y_hQjQYAEXfh=CC*PkU7T?Y@NO9*`1b6{2VkJ~NZ+g$iEIxk?_eiXiHdy|&ftgfcdL$4q=hOD#q7 ztpvM_na!3a)bMg$9+nHgN-f#RhAdL`Hn^uAG5>h0q*EUoAM266CL#Q18qP#f;_)|) zS5(m+XN%y80CyJawP?D!&r3L-J(t$0Hdeg06!BPT@sV&|u}qocS%dfXJL@47NKv2! zZ|FYb*g0m09RYFRm~UdLcF246;-?hg0`kdv`PS&^w9VA{;;Vi)rO#E~T-edA#O9x5 z%50^(N<3p!ck6fgemQg5?xtHMO1Zj9f{5cH%cuH%?4Gn!je>U9%zp?FeR)_!O3rrY z&wusOkG+JE4O#)`Il0@UdBc79V(q^_0?V8noz5vfPp8G1WsSxXK3B9lzSIx5dl>Oy z0W_z#ls#2`kNO95lQMj_=KF1NR(kuejjwl7Sj%Fc^lT_RYk1a~y?<+*x@r5T6@xr8 zsCg+R3=i{fK2!UBqwe=R#{}!C^1zVuHwNMc2nX)ftt11*e-HVU&R2ZiCOl5J<47H5VJg_J}PctnMS-bUM z8~m$dy`l?V**R)JFMBreo%q3gXzv7beaPw)yXz!8*7CN|5NoKa&fyMP;w6)AafQ@D zxpy9FX#voUc`kwn)&b}d(f-}WmTNVZU6~{JXMGI5J{j?Abn>Wnj2{8H%{u*cwuupc zCE?WhxhLE5>OaBS9!&-W?MIEn52KSSK##Pb1tR1Eh1LQ}6?|BGHWAwCz}~l-OPm2w zCs6Ra3nEL7!m@nks<(G*m@STel-O6V zyh+0wZP+26t$h``egf_b7PSi+=Qap`8QyS}+hPo+Ag5c}QE}&vP;AlPWgRi{GfbF{ zOvSGU{d=q&90BiQ!wjcF{&_R4UD8*W9JJdVt~7om`6hghNyMT?p>V@eGaq={dpi4y z{^kYC{F&k0r4J__drQfyKtnniO#KXkap{pF+j?OfB<|oMLg@PLd5-0$DP#0hE zY;VJo5jhccN&%CiK;c;d;GwjW47WrYAsvLa+L|Xgvw2W+RIzA@i-dbi-@*KPr@%fM zHcJi)MhfR1@0ox%nZ&g2&)|y%wAC3>KV7_gCQFZsgTwbJ6wTCM)V;fKinVuJ|0FYz>2710>jwooF&+_u-6h1r2G$%9h(5tFhJ_j-+B{lbu@(jWn(Zo) zkuM1Mp^HJ$A4L8I17hi;~KD?)HCbad5391I{j6=^^eU&X}-c()1W;xFZ<7qiR> zOzzDVnPo>#hQv2zIZ|LVAlfK6FU%I~>n(XOiQ+5Ymbqp{W&~~#pQiAj z9%1`hYY>1(A?2~9!l=ZRI1a!>0UT`TB0XU`es}~|?g;hGEFP}ZL#tQ?yeiI+ENz)w zhxw`Qbt3?p99Uxo9?P=mbQlpNMu`9gk>8Uhe`6d}HNDMY(IUO|^R{U{Y5f~T6>R<5 z8W7;>gll6Rg|o#0=cFdkiG|75=eRH;h>nv$>#6S!i?5rM;Y~N12<^qCgUoHtn)^o7 zK?Fuik?-J8sQ%_?VLEha4{aJ&!rjDfWKqa85qkf})|EwC>oT*PbJ*F(YHwdx)&02R21%)VQ?K^>YQ1li_k|beTWvWr30|bLZw1QqLOXFo zN@JagGEw3Ovgpcs-Z*>u!yyMGGRFeic1p1}4jws1{mX+Ie z>k5>^$t@$(M#9+=&H=dI-x-oNr$WcV0;}AOxwe4Wx?8|&90b({fH)L>A&c?}ESj4@ z{o8^yQuSuzIdpK@#f#Kd)A^*A{p+P~tF3|R%`Db&ww|=Vf?SG88%YUSTxDO9HIsCx zt^c)>&6fQF6dQoHX4>17F9JUvL2YvINwrp~oKFSfrH%4$q2t3riMHFix?xOx(p^G= zS;!@eEw|^P-38Y96&>5r7C9(M0`2+Ia+Ic?jcqNy$OXs%Ke0n3 z?pt(9PVrGnmX}Lb;v~AolO{shbrX0qmu0prdB9wM2LJIwDEY6$4}R75Ffo&vw)(0Z zW`X=#wR&1`#@ubu9(9%0mhuCG|2@YU#Wb}6VTHtdwf-HukpSdk3?{(Gav`G^X*Oo; z`FwniFVL-#`*^MUsObZTQK7)V^J~WuGKE-eDJki!*(U@liNgzBV(K?Kx-rgHm5@OA zOQkq+;yCDivd5L;-x`a(Le*lKb2D#0z}0AOOO<_VS^#DNUWV(qD(zhpd>9Oev1yMQ z{?$V}YV6@Q+5f#>ji2=Zm))BI$h|Dcwm-;$p+19i&Q2<5(RBY4s9OoRi%E zP|7?&Jy{DDcbuNfwQL^ckP1(`z;$+pd&%`1z53`XX?y2m>I|Rkn$m;zz;zwj&>mV1F)vp&b%5^G1tQM1J8SBA3S(?&+?iHZ*Z6$(qZ+kF|@cp zXbv`Iqw2QaUNSxdYnii~SL;}RwtgXNt7*Fxq<5e*V+G*jo7<)z!hPbyth9IjX(UY~ zK|bj*EHfXUxUTPOUY4NmvKZfF@J9)MNSbU^RP>%+zIf4>S%^(mjMnS>>7)0=_#n{C z<6*oMFi$10w6Wc*BkN2V`vzIA0{$nGhvX)*JiS~WyTXs=(nvc1gOMLNd_q4KwF?ZFk7D6{&jQ%L)}Yl+Sy8uu!(Vw z%A$~PYsv*Z8nMI)o!@^2D|K9tW7rNCmHaVY)7}^^A9oizF8phQGCQ++!}XDB&#L0f z^PeqjR_AJ=6)P@jVbXy0FiqoC7s|bDT~wkc=4Fi%zW(5!Mkcb#@f}xg3D&if$D}a+ z6P#t{{b&z@8rpyQ!AsqD1o`WA!oG&m{6$Phw$eZ$Gx=DecQVKxQ&}nA?#juK9q~e> zc2i$o(qn1ZM~@g9UUbVX5AE&v2nE>WI{*yKqT-}U9W+iHzg0piQw>FGt6c4bMr z!K^TSLzaiUrD-Uy!@J8Il*t=@URWj2@CdgCoplM;@ zR}lsuHD_27l#N8xWpCFz-?srm48v)6W^T*A>UAHbx_Co_Awvf;+CjpEuQ(Qu3P_s)M#rPL~_NG zs%xuaiof)79hFi9MU-?@zYHd?z(!Vttqy7Uq65n2Yj`(qPEGJbr=VqXFKTAmPU&8N;KT<4y+j@4rxN}pv zS~AmMBQHb-o^&Ld|JJ?v$fD7jMZshqV;byVf863^wyrG=i#WQ)P z3zcspHGCvo{FZ4?56U?YI3SBcpwxs+YY=8Blj7>lgQe&CO`-q3=)a&*epedd&rUf6 zjHGF)WS$c5dUhh=oCALXNzE$NVO$JSryq2s$I5N_Rp4^!8M^GVPBiBxlFlUjFb3}0 zK^wV&d4yVVJstdfXRl_{b11CWdH;82&~7b;mhYaapxelfwf_>rs9-)3{nn(tZ5E=; zdzckF9>`NVxP9lZ8m`gN5UPFYE^c@LwcqK<>G7%FON zZ~H@!jK~A|y7HW!{Yx1d(=obNjP0yw8_r9_)RyFP#Wle!g{yxKJq~kpWd}Z!zWsRH zmlKtOG2Ud)qt|;MK03)_=sr+wnmuQioA)a7d8JvJDUwYR-=GhAs%b~7%1>kUfeP+2 zmHQ-H8UnS0vcmn@B1z*Mj%&IYMJ=)NEhD{3s*E1jq&rxG6%w!iT{bLUZBjpI5Sff4 zs-a=>+P9}_s6rsIY4u!ifBestVz21iG<67HPs5vTzk@u*L%kw@DvH5@sWf}}{_NmPfOOIp- zU3^uOO6!D0wWeREkmcq~vh?=;S^YdG&r3ZF_=-$zO91;@_*pGPUlt@L_by_`dRe~B zX~zays}BP>kSTW!2ATrro%)XSFg68oZUj0xLP#{|&JZ2jFGF`%A+M4{V)qbIe>i&% zJ{v65BlTR@BFHl}c^ee_%$5)(xRS_Lpsru%i+>36ueN>1TU%g;M3xz)aw#5gE$a6N;Rcw*5UZuTL0pnX9-o{Vtz@zpNZS$&#GO68Lj)(ArQ?uBf(l>xOj^rV z&+&rRQ0h$i%=-35|AA)9ndy`M8U0Q#Pz@MC$;9>5W4S4IAlAjZXPd^RA*jApp^kpl zD*Q6QJzsU z0KAZKJ9Y#riR_x?cI9_U7HaopEc%L4SQFDzLydVW)(E*mB9Bp>s@` zszmg0?HKps?Gonx?_tqZA5-3&`;F)}jI1hVS?JU4&nvE5MfqVCB`Q$-Geiq>2plLdWrazi=f1(9%fjSuE@nLyG zWb`~K7vaL5OTQfy=HaW~?&s0pksR?M9{rSKEm=OMi6!wflz%%oUiHh$s#;xj&=la> z5uCK4FcTfmOhaL^JPZO8I(N#Y>dtZji0Ys(tu~0cb^O(ih^%aJ-OuuDD0C4Z`iM;D zE;@S2cmv?_@ZmMII^y93v{s!R1cmRX+cKmHfRKw0$-@zdkBfLh(zln`A*&~zgKtFh znA@x-ftcM**}h#497|^c1kVT>=H>1Li!NU}JG6yRJh0P6=)xm(^ww1JSm%%eQ8%53 zFE!owmPiZ>=;~l-n08fvyN&OS7hs!gWJbAY3`Kh6Yn#WPkET_Ypv_qQ*q}mvqvQ|6 z_m8vLndd;b*`|wFUPgM7u(s$x&G{;IVmb#EBP~r~{4l3}J~ZfU+z2hxE|B>pjD0f- z@}m|z#1yJ(_^6jn7!Bl7pNsf&H2K?Pvt_WZwjSFu zg&#aDlA#+X8Yv2fXWIs=8b`~O;jBC^&1AS`myvTRH7PLMAOA0=-mRon}~h+VN5wp ztH&_%sbGaEYUJP42Uy~javOE7Il>kK{{ zrum=PtQ>UCYUvN;%NMV{r`bPtYpdF&7o9PzGmPvkPupzgNEZlG+=EZW&6p&=1V`e$RwjCLFyzJKH2k+y>+hVLJ71 zFOn|ax}kJf{P@7_h>uWpciO@}utr535Tf6Z6RIn{N+N+Ea8eLF!^@6l>rEH8P_}i-&1@HdaURBB?D6sKlZd~rVGaYwSnxE(DSl!zVOa}6CM0vs9ra)Qt zanp2@`FPYS#>CesZX&1&(Sm-LJ&cQFY_eEO?%%UpX`NJ*r5gm9N=#<2YUZ3{sy{onrVn$=Xn9(z3K^;vE{` z9smB;q_pIB`m5A^cJG-_*Cx-YKuDy-x$;cWtM5;$nmI=dBdZZvx6YI zCOiFk|Lxgjx37=#CcDRwpm=Sdg4*-Y#~AJ#Ai14vZKCuTJ zghCjTG`i4{B}Odfr=00kqx0!5BHr0r71v-!{frg5Fh_a3im@l$<=Sd5K)?4Zi$QgXD@6yd`vtN_=?g6B9{R# zvkH@^n3w6y_*+TUjJ9v#A(ID{VL}oI6X7I#-WGR?_l1I?xQ&^JhATWhaAN;+39`Np z&M!ygl=Jnklc@gxK&VE)VxEDK<9o3*D6BFYKK>l%=?hG1X1+4eBL$PJE#XjkBmeIiM$}G4W zs)e0d3-EgH5c%!7=qtAA)($g4CR6c}5QNXkY{Jd@%en6uHC8V`_-rPANxi)Q=scWU zI~gAaRc$x+AT@3YM|}oOggZ%$p6gRwc$7OKf4+4kLI`e@PFtfPVsGY`A~i3pxP`0~ z7@h=yQO9uq6Nki)#6z=dT)BUG7@w?X&m0R}_z%>2CuWcHKhV1?x`EY3o8RtVpW_>M z{A$v!X?fza{B-+k)0x$)fAg=eOAc5Z-ss5{M=BMtZWVpcH{-R{(=EPL)?~o^Lptrp zAKOf`A2SMYFLZRYB5fvjJandMHIiIJOxC}`qe6Q3`B@_i2OMRW-Fi9}q4)A#fORjmVD5XL+T3yM@ z?<>^&p$`pe#z%?`QKrBw08wovPTg1%5u(q|<|8UKYLeg*3rf9l-<+oYF`DV!qY6-Ki8*<5FbDDrk7Bb_bwaaa8 z7xwh?()nEBpd1aWHz{yFzjpCTct+WG zeJpjF6&r;1hL;Y1&8!Yk9lrm7?T_eZ^bhNXSo4cSpS=OdR?Jv z2>|Z|{@|gWp#MthgDJ*$Lt==rP>Z&PhiZAe&kaK66z^WApOBcz>h00y79Z(5ZmDz8 zmj5=Te)Q%Xc_H+-q4jqc$5EYgx;uu0-+tzMB^1qa_q<>Jsry%J@WWZH`0}B<$9Uh- zxXhJ|KKg_{J(m!_4|AK6A3A<^7uZ;3(Vdvyzq*}3r+Y|MFk(&fkVMCIc@Nzb2M9Y!gAG7GbI)#Wp|mDzPq z_uHQbZ1d~}??L8T&m**3tR`sXkL25?BsR7-gD%3$e^Kko8KAXmxoD29+(nYywLTfA z9PM$W`)aTSVm&TiZdnQJweTDa=#8Ix&g?31*S@y|-0a37gXeWG@G)?f6_x z)4TQEZZ2T**Qf5~t@~o8A}=ZD#IwQ}FhZhDpydO0KZ?r4Ha5%reqLOF79te2k>2(k z+w*C9D&8nlxNUR`L)MmTh1TM@Tc?>-4TUOHVO0*2SG%{4YT^hZ-ufxL9`vkpQYEB- zZcqs7Pj4XTUt-eEY(81V{4Hq-Yc{BC$aeQv4PDnI;2sSgfygwUqaT8lXaJme0puBS zDr3ltLmx+h;K|4>Gze7=JtT-tmBt}qpbfjXtvd^o_lh1eMY5>G?Arj9Jhh#1kWKW2 z4waWJBx-5l7;vdYa@_Cq7O3hHhTp9d8Pz;j4&|&<9j=iLW-RONaDYVQCK+bPwp(>Y z&;)CkocjbEtay2?;dKIVp?33^ssDW5VlP)=W_+xDWg@XIUXl_QB6ckE>uw|H!eB8D zSKmg2a$t+v7>$I{sB#{`b>s%Yx&5*#31D(*$t6d#&)jLIx60Cu@!v0}54^~BN1*>q z!2q*YA#DGWaJ14PNsY{5jM{N<_^LvKJ~eU9R`jD1j!-LwFc}#!+6H=B0QU_CbVw*w z#P}?BsprigT`YC3b`1^5vI|eJWgtW8Lz#gzk_(gZaCv!S@(=wO5)htB$q_iJiKqVB z?+|^{ERMKLM~byo0PV|q%@(8S>;YMJakTceK?=k8^6sR}!iIxF{$fK34OJmgb1BDD z=k%kSvQu8};RW}O)Q~mF-`ZP~?lp;OSZ$H|c*P2-+UvOSqH`89Br}J^U%&)`AD#Hx z43ZT;JCde*4wPM)WaweKv9cg%!{{Df20Y$w|4T8QmT?rXG`+28G#u{f*v*wBlM5Ue z8|RDRdMN1p&vD(X>;Q2O7zmm^{^-4eHvGbyL*N?y>KouHtUYx(i1)Sok~h^_Ey)=g zKI6pg{nUtL1O&-G*$4Y*mp|srhp<$pbN09PfUwRGtq^KUY>=-_Y3kb$YWLn>`5f+< za88c#VF$U4wqfYgx*>ZEFz;r*ifRyw6ymx4e#yQUq<|A0t_I(PX&YWUVh=L4KX0^m z>L4vQK*I;{7}Mc=LE)!&s^aBWk`xXj1?h3=HM{BxDvsG?T@33(9xAv_(j9sqSVdOX zHK6F?R8V4%tXaI5Im6LeFaP|Za5%6r_piqV>y;z?vuERTyQf|fox|ibA%|x&EwXki zVUpbNKX+=eZrS$x96_wzOMqNL>N_9h18SZ0v2 zS<=D&+_bt!RT6XNzc;=7auQ@UG8BIFWclNu=4$DD#fT<+pF0YEr$QAK0)|CUfos$g z>Z-&i0uBR|Mi)uA4>7Q}mVkTHj@qjA-lEppl88Z7e)?$i|1 z%C;84-Pma5RVrKYuSD5(xfA`xeZvBgU9$HK*wtA*Ww7EAL(&Lc{YNeGxgu{P-a}3t zy*^XtNlW@c%=4*mI4!-Zg(*jsE(ez$9LCuyqrH;DZK5qm#YdewA_9&PmjwIu90;FV zKZdB*rrR6M`&kX^QPfisUTSZAiBmTuAxVK<%URn9l;$(dXb||666Y7XMs5))pK;*Nr#8 zl5|;wgh5!+Z@3e^cvcB`Aw7c8bUZ$4)3PS(gXEf(dQ}>Z=xxjfP|n2L1f3Fy_^F;t z0uDcViSmP%ob80W^*%OFW4))vqnIx9asw1yXZf&_{D8wJS9u2iU1ahfd-210?oQC+ zVXZ~p&mGpw7d!fbOHOA$t}?{xQt2BsY}Pw9b0!V6rq-YI^)W< z*wK2~l9J;;UuUx+?HpqPbdvbes!+p$hPCQY#Y(AKbtOw2mwH7wskb2|?Af9xLDW{4 zvr40crhpk5ucJy#u%ClJmRwX>{wwS4bY86sImer$q+4Jxdx;I|LCGp^)fhEO+EufD z+ue1@ZFII_#hbyP3$$eH$(7{;XbwRdlviB%nZHxI7Dx=)zdYTEM-q@5e`P%{D8h8W zrx+8<05d7n9YnMGAb z;@ZP4I42V!Fz6hd;9Rlj5XJhn83k3D1$h!mPVd%q3bGxt`Ud9R5r8btRVHL)N{Q*J zXR7RHw8sCEhY6|67=9tM-?92slJ-SQTln#Z2*hI~w@2M(L<0GKclo#!zCb$r%cf1~ z@SFPjfZF)8G$ z<{nQ~fW1h($YRrSZ%AtGXUKn`xTeoan@$kaC3@T`tr_9>LH6qKQ?c3lig~(iZNr#a z>&Gg+$tv>yN70!FGX4K?e6un4eVco3`nqDvHTTGUCl#g~NjByDl3O%muH3oLTty}c zIflY==O~#-qMSwY{e6D_`NKcvv(NkWe!X7L$0JmsPIOmu*H@9l>fprD3!J9SN>ue9 z$$JC`cLhh#whFns{vGnv-@mV4f>+RFDwsxQ;3!rP+?fNN-iUq}mx{35?Z?A+pW z)X8stuKS$Tlm)w!?hOmajd@M1uAU8Je*c(DcA!2jenZxa*qqm$c86TUe4zUYQ^Dlc zUwaJw{%f=*4Zd10ao7-;!mYr>4ASLB^J&S1N@VgB|5ORg1RA^M`80y~Na^?|ed!i8}sycY! z^#0cEP>*=nhW}t<+QH4@O{fXolV2IgzX5Nq@+}%M9bUZcz%9+xUBBw%DD!MxTubA3 zhM`lwaI5UxN~wiVL%>?#Y?_qqjiOQm;bCKQT*a06rC4Q{0a1xbw1hpuy@O#wC)cW7 zowfCR3t4YMacrbYD{W)6`Mg)u5x-fV{j8QVOR9h6kiHsZmUk@%m_9Viv+?8 z>2};G2&5N5jSc!484T>6zxxj~@SEBfDW%WUc5%@FHYQ}JjcaVK|Yv&9$>heM&wRl|>8q>bZ=JC^j_e|)f zO2p@6-FhV#7x5>v_-&?om@<+83-u!(aoF{Aa>HMW7S`#3 z<+o0p7Rsv#yFbuu(6$L=qfA*JTx=8YjfmMwgB%6-`~F=%SgcOXJ&qtCS8+D0@}f&y zW_{Gpxk93Tkpy&4hR1=G(av|3yDvHka)!7fCvbYAWazu;C{ra1dOXM?uP>;?YnuT!h2bx`4Y!zVK1D<$uP#~0X(V^ zgBbG2aw*W3_76GaeX2yfPzmd-mdZRM#)`X#vXBJCBU0o}9ojMziy_6{iLquP$u{Vk zm2`$@I}w`?sn+%CMpvO3c_gSq z8=ANuzxL?sMQ$6$t@*?Hp0qDuM))T2())K>R;@`wlT+Cw7a3D{_B5|Y5!-(MdT0X~ zPs$lKLzVM_8i?V28+Ar>yma~$Fi|%PZDZkQ?N%Nd+fsya9)7ogO%4 zs<)ltw!Y#lHyo&saDOPk;a=qsCgvoj=kJz0s<$_8kFfnmsNxGkF};#kOIFr$m1v4c zPDJYc=JP9Ol87TR0s9lA$avQ_pp=@iPTuR+J)LrZo30Q~hGhH8(;}10{4(iY9geda zlkL#Ih8Uv=kmABS#ADu5_7IHmJ}^#^V(b^a6xwi;(d`1PS)r|Uv(~^pM{`h+Eqh*1 z$*yMl>hqvn&X{2YXjjud6H<7W~&G5^;|jm^POk;5`7J-`T$(zCW>m*6NO z?^q;=@oK5#meLZH76^cfmm*%`r@m&~{R3bWe5iywVM`T*d@`rX;77k|bO>_kD->R) z1o5JbK*hK2P~;Xgt#>c5+!8AJMBOk$WmuIuNY z>(?ymKYgiv49&3mGq2pxCCXVoX3L(*hgl52$bOBjr=X+uH-7D#q3A2+ceXzXKck}+ zuQVY`JIeo6?j|p3Rhhn$Zbo4zx328omKU2X|H`i~Zpcs~#?V_3L{a-ItSfX&Ul%+D(ouSmzEV#` zS|3dU2#cOL+U~EazPp7K)LL%RxVMljcAuDwQx94X+SHxKSQFF3o)pCaVwWL)d%8oo zlgI08L8xSlL%M=%W(3b)awjv-6*%19;x9!y^YOZ2p7(F3rCJWZca`H(s47qOAQ+thMRso0STDzIL%T1P8Cgl&KTN#_~X`6b8DmJ3NgPCm; zEAuUf@T0AhIW3{eT0~g?;Z}ZKCZDUQb6c)KK47YOSNHsq8rkQCEncV4pYFNOE2&tU ztMeaAc3mB`ZcWe#923FGz(h-qbyN)_x9qQPBG-y| zTolIl4~nN0g)6q#O1@zOd_tFl@voEbHESfED`%H3)U@;F zl8n|=-#34(Mg4ypu0w;jLc5SArFvEFl)A7e56KY}QXYx}z5`47<5I8@57Ow`!(5d_ zqbqGo7u&7A-!@tWx@jiMGcW7}!kE0x68RutZssvc8D`iZ)evz<$2bj?9Wtk zOT!-Ns5z|hV$jHT#S85h*~UVBS=@$tt=fS95pOB)v^(Cya#hHMjZ!Cc)(De+RvZ-F z`}1`0gFkM}d|b=p9L`Luo3vyx?oGDQkLkHB>&GGoqMdEz^HdLiCiQQPD}i3$I>)0b zJ$WWq_MeO;#yVcmiE`wT@)rR>oyNLTAdmG!1NS?uW+A_F4!;3<+*p(k^4E5nHAs2= z^VNd}3{1#y^hULW$hVch3RMD9L1wet1i(>;@Mfo%P&pDD0=a=mlQ#Z(p!Da|&>AS~ z{y&B!G`njcJCI_hj{^H-e?yA9`#%asO_*OtR#9c8R*O3Uo|3EJcMvFYR?~qlioLcP zJ>ZX=yj~OAL5U-WY}-aN9Kv}j#VXR<8Pfz{kWzMkXcdN0E@7&^2daddE?+C;QS6n# zPUSW`%(|tgPH+Hm8H+|nlGdhlmu771D~^As(U^sEu_w(sw^Hh)I1v035nE}E3(8vZ zjL^;)MQxB8{4CaUt-UA7>tXF~r*XzajWp+8Lh)W9)krHCcU14G5K^iGwmcRx+qQW& z-rqmzo;sMDIJ}CdkQYTPdlB37>`b94AH9ya`GU7vZ0JC z2M&s8;QW3EA|BPU?MP0tYCY*4ZGfgSZHfXN4~AwX@v$PG{Y)L&7g3JLtdZm5qwUN9 zck(W9u9t@M>Ls>=)K$ab?D7v6WpwXtJJH>T|8c={ODhqhLe9Qbs2i8Y-seN3zvKt2 z5#>4GsfyT&ex(amHwAmCogVUnxG#y(gLFKHnaUVPHU&?@>*Rx>2Wf%EXqxEO(6Tjm zGp;ZYYe+k#io|)a#+{p94h8ke`H#{xgCK9X(Skcp{6bm1G<&afgO7*EvxZU6kWoE` z2dA^joV&4M@I51A0U@BG>3mBOEK^pE4?hF8B8F2hgDE&-w4W!4TR~QvYs>(6r7E^* zTD8Va7%&&5a<~b_F(iLizwta%jTpt8_hwF5iUn{A1D%Ju#?)6A&|9S)TCj4S*JiUd z00Jg%E;rUuc5WGO>L3yMB^fO@Me^37Wx|?3VD?Km(>`2h|EQi{mzL~)tdOX!pk}kC z_87g!$J}9yPKmOetsiEq8aRZ(^9UV1+jJp9bik<9I~7b|yr-96Fofj=2Kd;(Cas&VDQVzg=j7FZU`zaM*n zA6V9tB-ju8NrJseew=funK#2_OZu=&+E9W+(3)Qp;=!9w;nU=PZvY~LPMVk>*@VIE zF1yMhubUfNv%e`Okv=x8kA1OKc^(JUnk7lzhiZJAy|^nQepFKs9=GG*_O!Ge%rnRY zgVUOH(uVx+jB%Pv*Hfwmgs$Yv!ODTxVpVEjq?Q?Md&?5zGej}|s%VC~DhKoy7zKSd zzRE+TwFa_3o%t~!GtEUq3c-v%_6MQE3JcJKkh6wF#TOBLBCMnwVX%(a^$6*uroi{< zBiB0BV6A`spCzqy{%}&kWbXdGRQR5UYFvE3fAT@KfC}R-Nal}sZmQL_51UK8qgZv< zmg%%S2R>pH-kMP`@jD8&?o3BD&VrQ$Sc*jz14}`o^y$$y@`_Tc z30X+s!Y^#~n5;_+X19F#nE4cg1+n_htmTdeN=t&0wu`68-;wf= z2lmTO4WkUbjnXxu}a(#_Bj{2d^YN->Yxa@G6!^4hQ6CQ8lRS9FhL14^wo# zlPS09(wC#z7;OzBJvSw$$Zi?gmNbF#{zh^v;owQY)dXRI{jdJl`x22Tjx74x|T;JAk zv_CiXJ+XHCuu(zMdA{O55JyX-b%J5Za->ss6k8CZe#zEy6|z;jCZfEtoRPfJz6Z=1 z+=ap4qI^MiE5i#%Ctz5ik(D1>wF<}%qpkuufhJ9@W<58pS+71(^N>QT#P9M#LgJzE zyV`=Ax*H_}xYswt$UiX3f)pWI9bGmH&m9RYv7MwG6b_x`qjHgX*%&!OP8|YGV*fHI zB*?;l_PWPn!l9W_2Xo192DCEq5t>tUf$()grx);Bp`62LL}}St$sydFmoid0RjsCH zs#JQlPR~EJo6ACB69yba9d*}f?hdQI^G9{9*{xlacN}X9Rk9``o&&&4Z&5@X`Ol6; zdYTBVc;7#Ha68FB+bCG^Zt${Q^=lmA$zDDAsg_$}-_t&IS~*?GFlk~X+}7&lmx}#; z+vTIG_+iI0gQ@2SLhKm(zM9NObLXs6DkzNhFK~~)ro+tEj%WNVCjO%Fk{<-%GWb;- zA1`IuZdyonC8Ix_Ty0Wdddv$>x(@5WkR+_KY7ffZOa9R)`S>3wS1ISh?o6L?o`+a1 zFNC)^HnK3*XnplLR<4>ZsP7#}j=EM4@nMq{*d9^~@yK{5r}O$r68N3OH{>_}<)r$5 z9v4qp{hO4N0+HUf$jeP;T*wURyC@lzm&cZnP>8k!K?*@0thm0KJ}WFVhEJ=@g4Dgy zBxT|qo|6Vk>^w4LY+(Pe&eMH+Gnj9~aW#F)zaa z159ozmg}|0X&U&eanJKO>R}m7a#h8_8=Jq`!mE}=pkt42uz*jLeYSOXfes$%UE1Vx zG&WK?2KH*o%L!Lf`{kM>xSCT}fjzgz$Mq_?Q;-l%ygsXa{2%jQFFD>89@RC9F~oTtnboQ1%IAqrPMU<~htgl{{sTR$n$;uxxFt;& zPHAF&Uo}Q#O;jw#>h)Th7_TVND>K=w1T-7D!m(h8PeK-0^sjtRn&qJ7hcQ~~M(Gzm zpX-&nvz(44wuUo%zh@Svl)CJ`FnmnWO~X`;$Ud;4$Ts3EavnVwe=Ig*ZjAUoHW^zM z7DVsSp_%nkqd2SIV)g!U#c*(Bfq+923oOEhgBp6~j|dn+=-2M^DsMU@zwwKzVlA)CKlgU{w+4Y!v+P%cpF9C-|^UY z(W!`DsU1{qD(|$9k{#U-mZhvnD)fM%QGLo1j3DQ*U+eKKY3<0j{u=#gLDt{3P=IcK?&aO8xgQzww-)8e>a-KB3z z`s@{?^%%<=V~2By0_6=?8O^c{q7JLtgKK}lq%M44p#%5g!fJ2qwlN|&sHWx% z(I`^bAC%O|ReCo25PvrC6;sA|+4EptlZhQ>@QzBCESk*GWK1$<4=Fw<)z8Vi>=pXs z&%&hp3xrNEthAuMC;2QE9$V!*_Y}>G4K_%jU1?WW5B{JBHW*7%0&Sf1id%Lsn*bVy zdo?<4{wHKn+|XsdfjXh>LVE`7C@{snwTlPibVp9Kj&J1E$EpJ~xAJRWJ}syvMFLJU z7)dJ=>53iub>2=##l1~m1@yLd0y6sx2h<~Eou8j+V#UM%K#87o5#u^>w~(pO7vPP| zQ9d)~R!ZPs#UT2jg-UONccG`zJ3~4BWydTTKec9dRi;S~D#_M?pL}Z-4>Xi?xYTsQ zqU`8)RtV8R7K+XxF*DLGpBr)YDl3vM+w-b@E5GQ^h~ql)l*n`3X8rcK&O@S+2x%IS zPh3rL-Yx`%?hF~-7cxi(=?DrT`^sQi0=q}w0y4SoBRvYeTXn?OhIL}@D|`Fiz9Smx zj1b^#GmrQ=QHi9`_% zuMOt)g>`yRFNca%qK>}?P;gU50Lasqk1c6f9ZY>tOwAw8>+6Hx+sO7=@bbur^v`k4 zQ$qqZzQ*UrT$;bTXa!m74J46t(p^17iBnnj|IScF6M>Yz_8 z(?l`?^1kaZ8ZNUO0(<~T<_Q~fz3{{O>{d#?#Yx2G)Kg}St7?)jHxm2mDjR0CgOz~W+Hq2<63n98}Yy<^sk?vE9VPZ+$T**qC-rsH$CX+$KPa?U&IEr3$L#A6$=vn1lP6rb=T_o3JlO=sC zl|uYKr|Iq&Kk(-;a7HzxHBE=ulMYp5Tp9t&>k@iqN)U%T-CznL@373`fE|gTp>*vW z-m^)_Q(Asg1;|4pG5>)aEzpm zz$q?5Kvdy{T^Utg=Spe-gVsJcoMPyQ;f zcpFMM{~C8N9cjjhD||;bV2Wyt1{MAT>3tgsOnp|lSKm4kzq48VtAX1HXx;ikr+Gw5 zD3G&_ID`(2yn0;bV2rmr>$PN{)_$6cQ|or~soO&DY6h(zeT&IqdS(?2+;;~RpiivU zr;VikbV=9t=VwMl>vfKV8O>Nq*`t2T-;GGkTmn+TWyNaTPPDQHFlcxaQ~ zF6g!vw@?$%s@`r%wl?xW&bYKTdt4`ZfPv#ifHLdjjJ+!BW47Ke~< z%p9Ko#j zz-o;th?tywiTzW^utKi4-K!9^b{XS7>P*2SFUfhrwTU6oDkYOc|8Nv=#_g9P$1l%Z zWn}-6J7hOk)kqrK$6d)mA}L!gnVM$l-7@CVa|QG-XhC|yWKTdgj%h!uGHLaU zxxwH~_^l$7%SPNAwmJ8X%9Xg^ivf%&X-zE^v&J9^F@xc{MyB^#$7RX}w`^QL#<30C z=y=+>&j=`&*~#kYs1c*(xo^$}v%mjgFXLTtG5JULNwmC5fHqb<^M092E92;!bJ-** z?-ap&&r-5j4vTWqOh5iOKd7>RVQaZCbREzg@lTvKlw6GxL%5MJ2kJG7-%# zFP#2JR&DkrU^=+TrWUW-zDpnYAo3|TAH<-aD{tx&+*q0hEJb{0Tew>^FJ1z#I^cYc zYd^n-Cn*4!HNQ>5fo%?^Q@B}u<#eV4Ym@l3t@a%Ul*+}ok#4JB?46}BHfZ+K2R!8b z(6L)MC=~_KJ+5!fd5U?S%FZEL_eB$rxFP^V#F-oEM|J!1*YP+<&o0$Wu1p-kyNr>A zJ>)#Zoz=+D8)nmM3Cex&L9Xzf$-`h(CIt1pMaD2gNSuQj4VFC|?FU{M4k&D8)F7SA z#2&<}+G?`;(MroU;<%O3gi@U}>o_4K^0-EcOUqWg$$1#bFw8Mmz)A;SFShFo%WXdx zXIl32LU#dS<7`td@=kV|zgxWCN?U0_PDHyD{@Fi^vICN=jP&Nyy7O&}3nz=a-#hBu z|Gt=rx`q5C;u)E#uDIEzd9!{$xm?J_J3^-IMC|sX`sKM~n`(oC=}c?Qn^>-qCDKt7 zPn&YHtDnxxUkzQ^GsE4%wO?p;O`h*IzI)j!#`3j-Y5GT2QnoA~naRsddGN-i+2YD2U*vayQ13DLXidhO{d@K>=BT`&-9vakdtdBLj<-Meo7;+? z6r}IA;Eat`DD|Mw7Q?MA2S?My87x8#7+&IMhAJ%n@#f-;5b6hnVNR|WG5pRq?F?RO z5LfCe+_}w|L!}?|W%M{0ZM0o2N9ykTv;UI3B`1@Ng8dwFPADA6&v^ADtjRiF<{rN4 zxhJub&mv7Z-gVhHY)C-(rdj_$X)Ve0N12v$?prmG*rjtPIcm;#7gCHjht=xo>_zYQ z#S`|e2I6nB7}}+Br~M5EDTj^Z?5;-HEOY2(Vgw>45H<-|_ z#jW5kDPD7Jb@!%S^wejar!+(2UtxPZ{U+UhmUI>c+XTC^9SYSKX;yVyYDp?|BhM1Q z3)Yjb*Js9^{*YVSVNMt*8ApAuSD3OBHxQFY$ul;%dDI6eC0oNLjmZ4b5 zw?Y}7=rTehe8znMoA`*!0J7Y@qKCfZ)aJENpxY6_rkT5ppdw1M|^1=W?CAzWlG^k zD!}}IU6dk0YL@9ZTJ~#ku$)M)?75PKLfH>Qk;UW>ILm=+Fe42k5g7$wHKVa$IT2ip z6{^Y~IVQ4%#94o}PT`d%O@!D7RfFK0dyQ6{|I|cbbWhR?A`GC%RaNIT$f@m9Zm#XZT)`X%yW}ys*{zQcysA!BE)ia#272M zWucU31n)dNYbZdBQK+G^`EL1~D6y__bNOAh>Pgty+Eb$+$O$Abt0(y*GqL@t#M}GQ z4B5G{4j3W*nU8h!>X3f;6vlgZL^N()*qZghN6<#044VqsGjc7tSxqgQVh7A~1od6| ze_SC%=$Ik(0!~bECn%wvA~b+A&Q5JVXa^weH>&BT zxr)Y>2WAt=^<7#BPE~PjLyQSkVpH#>?_9f(rxf8dSnY3sh-fO^E{vBI2Zb{WvRi-d zA=3dnH79AShkpaIg@i^<9sF2eUl9L+p151Y**`yvR-CKwF*S!edS1lpJz#!^eH9>_v}#$qcXOA?^Jvu%P@-1CupFw zM`1s;t*Gx?cwhA$Q@mDi6};rrTRs;aPV4XC4EfV-sC@PuH+YK5o7O%9%j8sYbc@`V zqZ)neNU-vaUyr7zVlfWye#?y|nM2 z^+E0eNKc+iBD-9Z@0|#6Q;qw$mT89BoXS>|x92jx*kRJ!?{Ag{WC@;# zkhcn5l@oE(Wi;TufXQUtSMads!ezP6Gb9hDNR?`bRcus~_}@b;ULzz0qcZ-&sI{BgIT{hxiCPY8pjvHc*+1~-3d|BpjV1n7P(w(=AqkTbj!?x|a+%;MCww!#J!I@)E*41RB%{YcXva*!KB?y8Cx_3=$xAJ@UKPmO$MP*KB5suURhMo8}DxFkh8OimuOen*~dJvHV87PZBhN zf;c^;YKq{JHsyH1Ug5}bV?~Uo;8vepng~M*!zKg(c3Sf$2>n^+!lW#CT0JTLGpojr zv5Po@&q!8DN=Ece-WV=qS!jNT>)al9pV5}qX&Z;WU|e`}yfs8GtGBOzw_36l0z3>> z`0Qtyi@^aDuwnlN+Sa7v?73WZ(B`tKLXuiWyY;ftP zYNP{>ysN6g%D-j7m^7-$2uo{^O9SgghB$a%_^H+@A?8w;KGyMY0Ckca^CVsKkwcfK z+Jwf!lwTupl#MKIqmXtiXQr~h7YA6U#s^W&Ry>&@LsDy3o$WsXt)ec!O!Z29^d$!# zDjs=@HqT2pLo!2B#uVAOW$lYknJ>s{dj7N(YhQw5L;x)Y9jRt5e~(HyZ!gmDM)oaV zV&-JL0h1$~MoqV}VF|uedr#p@?5o0{m``gEh^`|VmeF!l>nRQF`%p>RQs$qsf6uCc zZDM*9JVJ$~AjS7k7n?+VLe_c~UR--dkNqS+fB^_taOPv%(z}lC>c$Fs;eQoKJR2N5 ziz0W-ZqsRf&$F(i22CEd=pXym&8`LG+wM!?A>!`}8}oaZ14GMIVyn*MvwB;!rgJ1vJ$~x$THus2mQ5YBAB8dL& z_${JpO}@~7jj9z-2@`3J%!o|kF%J4P zI-LN>%pUhGZCjf-+!}vPZrXp&x_9c}vt;yhCO6~l%#p!dNt_OM_0$-60*}W{|E%G+ zdWJB9NKPo;!GEa`UZ)2(&Bto7n$B719uCoOSr_d!3Nl2(`AlSR&F@fpY;0HU_aCV% zR*bPeY-O_TPQzWH#kkrd=}6?CY&{V6&l|d7b^0cWs@UZxKak-C6yr0Q^?sQ@e8;OB!zrPS#|QkUiwa z#o-Y$ZfF&{3)ppwPJvwmXzHX`k9;e?E6aSH-nT*RuofeLQrf2-p$8D?zB{+`S{fb- zK{T0k*iqO2z7!4x4;vwOY>ri$=-Dfa_rr%Qpxw`hWa`*Q{#4Y*v-p(`q2K%o6#qO9AG zm4c*HL(5zs_1nwS8{#TMD#KBL3Gu14m{uWhiy~_<$Q@P&3pz?~&^r9_X0)@kq7~v0 zk&$vYpjCQ>dLPJX&ai@ZoD^8H`i+%0yZ>Z66=j2f9dXCQuJB6@zy&^MP6bT{@Cs02*s7wdJ=7RAT?PnQH=aTMRv z4B}U8Pxx&E#By2MJ89t0;gg1p+K`?KQa#G4@ap2O^jJI62*z6sl}vioTJ4q#KW(xA~w zCWz7545LUVH&PWH?o*Q;rC}YiGk%$~^t!-Sf(8FYAFkq~qq5|_5djc;Pe7LFzyu^= zs-YiWxq<~aV+sg*1=*FphIQ$D=Pn5joAwh6a{Ow`jTTLO?mG*3cj~fvhjpCVJEwnt zpHkmSM1-D;Pd#FKrh#|;vh~BI>@rD^yppH6$esD4{Vqz>pAUaClar(AvawaGAUGq^ z)69+36>U(0e#>=D^~5|VkxKtVJA9io4x$7}1R1Q`(fjJ!(aVWC9UL{Js(6%3e3&_E zlpV70ktpeDv-O52YYv?rR?N%gKeV)A(m!%(MKQNbLP?gNh1gxC+2&h^R7q0V#l%g` zrwDum<;GOvQ+MD?br~PU(Im@w-5y6&C?5%@FzX~(uH81GpLkE|?{APD(CB2f23ZJw zn63s<<20!Mflj}IC)9i08HPO86Q~a^(YL9=qqx$Fn7+Cap5LSBeM^brmS39hthOFA z%AJ55Jo#C%7D-^nBC&nqbNN$nN0OB_J1#D6`B%Ny98K`oB&4%Raxf&8VHr2|)Cx^A zkUynbCvCk2`k!$N1z5)<*vIMwS2-Y$N1RC+(-aTF*_=W#*Yc0HjCrJ&M|#H|#(VD| z0C+cjwFfOsqA-uYl~aKDit2;daw9zZjOA5oMz*( zFbVJKwhFg$Jmzr7_*PApI~*7;8GCu(c+NFXh-sI#n@i34H(?tSUoc?_9#_9pwr7(DFs6>TQw9)xOk;^wojL79tV9B*HboKg?!>jFg)rUIuRBEV7RpXeNC zKE@G=6(gt>Q>~J`N;x#4n2_%OvySPx6O|4g6i+EgHfZ158rRT*`nGr#f+bvqCOgGT zAg!bG$6rh zakAh?jbFx+zheO~idSb@x5cRFxLq>qFPbh@hvyE(FiXM1f^{iRw!kXfG1Kkd4yKW% zQyC+E-r(bro&)Fbn%_c?T9T6C`!GIb(h_Sykl}wIF?sTP$=FWA-_s64zTf{mrp^VS zGxq{{vzJb1YMhh)2;$`H4Hw8-Iv^%|CHh)>O{&t@Uv1h-3Y80xa?!ZDmU) zW-oIUPa9(beI+3C@F^aUTEb#ng*pfbWFS_~+^W6YVj{%OHsW{X=)-(MrgGm6=N?vk zsnRXgYH=JX=eeEy9lSkNr)=CSs9z#4Z>3qaKk@_irpZs&J>32S zwbKUzDv0K5-z_`qE*(wK!z=I-QL%%$!?3%N%?=k#re1uGSHLG%dHZW5#9}s{$ZMGm zc8-N_4KYcEa1wS;hylZcims&v4VE;~jXUszt&^E{C3f~6j(>rqv>M~oW-ZMEq?Gwe zI28IF`8Jzyn(*7+OABe~+OkrW8N#wDpue)!riH2o0ZF0yiY&pYo4B(EyRPKnC77Om zyQU*pQtpA*V&W~T1|eE4BS5-Z$c+D9A?w*!%`=r@qU=Pi7zuJv3x3S)R&3A#Ev4*RQ+4x*U9w@MSWq?<~Gz8{9IoX&bMScKfUoe-sHf0QjWs--uc->3D5zx# zfBF05rEf}cWAN*nZ~mbrTwda=e@>i@p$nfJENovq?rhk48GZWf?VakAhU?a6yc5CU zbX~Hu6C+yTy{Z4oJpFBXd`)RE@9yn;i7!NytHctutKBT%TD8Ff@*JSGX2iwvH{XOw z>1ls=BQ}p3eKmCFugu}uIbMWpU9D0Q(`ybm`|;z`ld+feUyaT4zD0HyXGQHf(SjY? zDA&HRNvy9YoLk>|-=OY(Y>pabUXIq=Lgr#GSS%r)H0vp8xtoTC-tF1KRJ_>SwN@We z9w@JhlkD!X=JxW^9Wxxm$a;dtA+7K6v~t~}`aqPq3a!NmXKsk+f9#a2v;IE#iwfoG zSXB`AYe1mBqop|arQmnCCEj8S%w?- zh$BS%5vvaPL}THluN;GhNnsi?G7AJeu=Atql-gLJJ>>4U6Z!ow?XRujZ|3Tn%DPj& z+Q9JqsK^RXzE)&a)jso&xwx+ zTn=jiHTU=@$+lM~5`(8Yf0zgX~M>;_G8Don_mZ!G5zt8hbyNK!Ixwd%|M@e z(i3F|NwKpyoszica7RdvI;#p7iS6psy;a@FuQQI|j5s`XiXHER%LD&hkWmz|!}TR! z?5}a>J{t`R$icXEehXN^bm|P2ra-o>LCcY13b8&9j<&RvILtN^ww+=h`+uV(%+(C= z6bBt^F14~5pPBC;)`3^WVAyepgR$31kc0sb}d&l@Id=}NU==M_b7R^N)tlY+D$M>EXC3V zXnV2aw$S+-TR$A$wk~Hy*H=K0CsD$IoS&z8vlWe#V|M&*S!9_B9uGl8vQ8+n&$AT= zqfR0HNA+A6)V0~^A+5_tUg#tv!{u3=5%&D&iALHTj|&jg$xC+s>jONXbz%x#=^EGL zyY`td{lALBt)ua~>!oY~l27DTCV{W)vOj1cK{TVK>0()sWS_?-fD@HRivJ^6_PCyB z%q=*4`*fz=<62t(h~N&!%2}=k@5lF+t92#LG=9DR@_K1cPaUS>9w9hdJ}QfJ6C?*~ zk{yGeiRpD!2OHg$5C3*)3Yf2IF@$ef(~q!gw1!qe7eK4TTnx-tH^!;YxU@1YZl5In z81^xaTY&M^{RXtzG%jvj2h5e(>8=c6_~DV}0v!m0%{k+Y;4Q?TwGdh>(0kQ7tS7l2%i=TE-$Lv{$Uy$WNti{e-%BUTH7^FhY*ce zi%TE2xL)uBonQH9pjDI3TZjcb4ZtZa`!3iz8>l$P)A}Zx{aRU<$VWdg(3Q@OQP6!L zOCmiH7OnVHK&kyZh5||B1}A@s{Z%_=oH_II;{$k%CO$q)fPW zFpE~YV>)_j7h8)M6zjE(th#*DHUDk#aTB-9vxf6S(XKLA8J1zeki~dm00YXKpXjUC z4|s^bf@>~#f{5~(e6402mSJ2rF=SB=6z}LwF*CehSCP-sF;;gi%lMIug$;h0^|0EcsQl{?Dgmg;CB9p8$(9MqZPiM+#z}t{<^# zYjUzO9F}+Uk_Mxx=4~6fW680Y?-3Fqrm5Lnk)Esx)@|Hsl;!^sb?$*o|Nj>s!`$bZ z+gvBtlrb_h=5BJoC!caFmn560*2U(2nYqjTei!kHkd*6&atR@qlG~D7xg=7b-~0R5 z?=OGx*W2s$e4Xbxk0WWL>^5QYa7B$;@K@OEt`Mm_kQiQa+c2sKVn6ghx$peAg=AeL z)PW@kBp!uWJ+m6}Akmt%0hRGirX7lcf>@VU8n~@_Y3vvcyaT)05Nhmk(FY3--P76A zfPcrAyZvVVw+tGsWLpx%ubi$r3dctt2eDcwT4YTfNPc^_YTo_=`q;oddkdMM9uhj2 zK9!Cg!0-N1#y}Kgo`BQxI+;{)8xHcZf@69B!+xk=?ng% zp!@o*Jb9HqSQBCMqW}#$WM#UnTba^kOLS#E*rU0`&G5t|m3yovQp2`g3wt2` zmi)X%i1k3E1JZ_!Dj|umP!D=!K8}Z1K8P|Nlp$bhGZ-o435q)@u|w&CE$2KG4U z;=NTG`a^D(xE1VgWS)Y>Q{QioP<8xZ3)^>^#ev}}@@jDNqZCN-XkA}W<7oeqxIi;c zY7+)3Y_f3GR`R)_@l28HB#MSHg*WhzKkn|n2E1DGx+ON2pE zr#~!L&*Im3Lm)OvK@YgEgMwjI;G{L+BadqcUrpo`V9M{RTs5(&AQ% z^HR}DwNP}fRPQ~#Q0sq(MAH#8TQOv;=n(t`_S9c<4R)D$!H$?`40|f-2U`)^VlfYW z0PIPhdA1Y5bfmU|%#e<>O=d3C@C!(fm}rQn4ihxTemNTR@szWKmnKB{DT;zI&@OiW z;J-r)c+=>CArApvW|hQQqi*$UmDX{RhACDD;FAv=>A~Qlj>8(mVWj8v2R@XO5AMs} zHKGTS8*Vt>)EEzDrf#^g#94S4DLJc14M1Kx2j^M%@fTIo zm6+6ADJ|op*mdb*!Xr5h=;>vgh|wLks<~_M<3^g8zfCV*PzF=OUPl4MuN8AJ$uCN1s{OH^-n#o8@Jb zw?O6CjB)aLLT#o=o&2Mv5y$brn}z!PMMdR-}odmCH&a_ZPUPAC8-BB|J;reUwG3M z*FTd_d^o`eq{BAKvW)vruYG~?e--~wk-pgag|{cTZzoJP^cU3FBQ(1@Ocfb)`JwrT z+d;gAE6Thj&5_OTPG6F2m<-(Il>2`a^IxM~o;$OGVkCY#$M8!I%*(%?qs{qa;I`0> z_v^&geOy`!fPHT_VPxpdINW$r0Dzp{8f%BlbW^fU9K}Y4Ewv#+x%M}FzTZ7qg*j;l zxfU7~q4zJh=wyj?h7D-iM`0c~Y2iyNehL*u83p%LoPn44#CMMoLDa~Y+I6N(k`fca zpXqn}l4JW*lwTMSmsws@J9`jM;E;U7`LKUa{O8FE&52R{zY(Rm8&o^WroV!hJ(_pPI;3qN=>{WuRsz8h9k&EQ;H}Fy<=ub z&}NJ~tC8!|3Q}H%;6?+}n?q-e>ZL?^#R_EZdBN6gP8fa0#o&2%p^x6h>7%jR zce#S87EPQ5KF`LNI~bQ=%#<#k(@pyt@(`6R!2R;WZ(wclYR5o4PA&`4_ob*Btm$J^QvE-NQ1?z!-IgMnN4~L1Ox|gOFCVH1Lc5QQvvGPj? z6|?M+>J_T#AUp={z!DP{U__HdNXO5UMN_GnzB5%?-jw)u|QV9|;r%cd3 zc?Nz^jmMa(wTB?K0zNGRj8$G@-mO{hw9jq-fv!d?$TdQw6H2#ayr_l8%hAIk0R!jl z#0tCpo(Xk_>+()r?QPoYf&{$}Y03wPj?-l7*amKvy~8^~H;c=SjDtgT zsV&@QXw>b|Jcz(KSSn=2BwB3j?R*1rz;pf-nI}1v>BBN<#hUs!wl-2?k`w@1q?gn% z9m_D@SaPljEqRK+_qQm|*v-oZcNk~@RWOl0Hn!kO5GrJL%;Pc4`5IQL14eYPTrzVj zAi~74OeDu$EOZDCCp}W$adM_L4FcV$%~z;m5Vi4w3E6sHpLC}?QZ2KwH9(6R^&p3P zlpvv>h4c7deQy31hldq4=g1(&GMtS>Sv?%u_>`0-q+r9Ye=y0x9-{9xgn1(_nSgyu zhsaMwjayNbSQ^hGj-Joeo$X>>1V~N3pA9=LMBS~E5kN<0rbjkACA_v9`7_UYH`$a%wIWBkS+l}mgu zg6@qdSvr|sz3Eg)E;Dy{bwR5nwy8&k8aiG24H3R=aA6{*iWKABw{|t!ZWbZ$g3$pk zD}~-Z6CkcD?qkCJALv0M3vQM5t4(04Kn@fr7%qt)X9B!C3$8Y*BUjn%_BtN$PdgG4jP~h)o}wS4Hi4H)4Tv`c!1#kwWKtsBL5};Oc@^L| z8{$L|`*ZT<=lu$%b#SWghqEDU8InM4z%5=4k#|Rx-j@Z1|DHeCLR^{J3n*j7g!V|X zS_sn&MK>o}L_L>yt0GT;q$A)RyX5QU@2wsnfAbN?ivpj5uzF3gBBtO>c8>!|Wp!*F zx;Q^0B`_%y1lyhvG`kpZRL*E>Eh2M*;LwPvfJPKd}6%HV8|ZL4XH3;^>Q1 z5@mYB{d>HX1+BO8<8%Y@0webNI}2<@I+^9uYJ;ku+DvupSqTccKwSp9zwK1+DR-S` z+tyR6L}`r3rb^=zvmu^4~hIGjF;sE#gRu7@{?93?kNnx6Ox*!FIhj?1+itV0?i&d( zzv4dtj7;y=^?YIcJ)*V5WYzREiqB+mHrH6_Kx-IO2YIYGd-6|-*< zWMimvs_X{hn!YM~B=PD{ro%t}ybd0#er>lKw1=D8gSa2J0`rpa{BZHJ>6|tGFG(-~NGL9M?<+F- zMnGJuxNd<44A_FQatZh^A2Wqv{@B&Qk~frP5jBe1 z9KabX;G^1F9TZH@+@kAu-859Q429u8)va?kE``fW1*VUemG_&2D;<1!`G^cHwHTUK z$AV^FCs`&QmbUP-c3r%c))Hu5?;Weqs`^Ua#}iPZmuuC7ZuY;sx9M<6-lF5=3|scP+8IF|Ls6)Sv#$CnP^mmE57G4~3tACx{v2V(4`^NY|9 zUBjs?qPhEtBbDW^{}ak_Ole{>kP1SFdbBJ%s!Fm*eE(U)3yA({ddVUr0&2*n zZN6z^dXvKAAfu=P3V?awS4#sI6*wm#7J+`nM5g9`;@=iIQwO#P6)qF6I0xNC&_Bnk zDGkiP*SY-_{TRs_x4jghLM{tSNh`+V;`4_TcYYjHj`+Bh8A3w~zDMYKbbp9<=YIHc z`DtwY&uuUU2yG~zVKg|J+$eP)t@tp1562B3ffzuDokG8rTqA089VmF4JUN^@f&Tt-S`&Ev(RlrwXYJ# zv=H1j7KzL#21csoJXe@0w2eU{AQI0x8e2vG`C_a=WS{V<*&Jc7phu;Oz?f`nCd4m4 z{xar%p4*J8%^;h2SV;)`ssnOWoXc0x6HYlej>jf+k;_L+T!VRr=?P4(7!BnYV@2?BL;sMS8uJt=M)Rr}X;s zKQ<~8vdreiIR}^x#J|2Va9Q@jT4JzstLkSBu~Kfa*rhrW;qoXeQS^5BMZKUq&s3%Q zAU#mwPag8w&)w%PzY1Jmwkc_1fahAX<>(^M(dYHhiLYy#Jn`|8E;(UDxU+4rohl+o?*WyO6H3qCd# z&_>pZL5llFboO*y+`ZUGPrtoVrkPK?AQ!giJ-1JN0~s$;trVR?U8*>n>pCO+N|Ndl zGWXO=BWd$=v+Vq;#gZ1w9D(R_SO?B8yg#HvdevrCP{WfY;Ojr6yyjh zfv{m}W!;+EG!)b=1~3D|0X_Av?)|ZLyb%mB3|MB9FbqucfJf0?nEEA}JcLn2b-yF0dHyyR)*96YvFdO~`idCcVg0%9H?tE9ROkeZ;{prmI`w5J? zz8AeK{sVP7OOm$T-D2Q6cVtrxhVziVR_321HQjTyHBmCuR}s4JG2HV=wQ?Q)G#YNX z@~iwE@rS;tt}?_3l~IQdzp$!qIgjRU9mc1o^oxr^tkaJ z3^n-XG@C6O&_Q1|Jwfpv`+kq}1n%U=N)N(2>XXt*2Cg55lEU>~-HM^I98C$18_%pMKywNTe$nn5x0W4G!ZFrk=6mUEJ(BI5;H`n?>idovi$4 zhdtz~2HJ=Q|35W@uI-K%Dy zdyiP<(H;SD{w$sa`z~CD+PqKiZ~StC;yDjh0oNbQPC#6yXOt+;!31>3*s(;;@>Y>& zU6PuYfQB`jBgrlGD+Lefm0Bf*v-iQG7%0O*)sHZ*sK&n!7TX*jxA--4n>#|6EtdNb_Ve`HBu60A;FnIP z1##{t1{c6xJPT@54+HVr0Hx@X6dbi&OIj?i!NlA^4BYS0BRYCoF=tqjyfxbzki$M4 zV^`4=K2|BgkE^w0Ech-c&ebhh&O3$N15AlGzy?n??ZCJm0CQB$Cno=9QA_5$?NtIg zyxu~fy>!n&#p;$DMUb2^sU-&pH_zI%a2~fRkVPM?1q%DSM<3XctS*FR&U;_OH32i+O^`{s+WRVfj60$p=aP0xlDgw^=_2K8D= z6*yX0h0wH{>46d~=;6U$DGlWX7v`K%^vTK83pBUVtW-{oXs5--$TcjJm}$?pHAl)E zzBu?0Yf3K4l_RrPr1D~LC2VLxfSHQ~a}4fUoWFQ~QA+$&~&Uih%rr4 zf`KWFwoN;YTZOd?Ad=aqXz2|nxlRyv%>9ysJVI!xV1L9-!x^*^th16wwX^U_<&CRG z)i-fY_{ksWP0UigSwo=DGHncnMN+%NDvTBfqYK15C>_FDzz&mD`&)R5mYV-RsVp}@|l1T;GLB>$Z?)oMCXqx zTUm7wOlqpp;T(5(E%S2~D&QyOYa!#n-|Hy2_OXlmo2KOE+7JnN0ePazo%yc3M#k`W zqP=Gj7$HG;RF`SA9Jxw(FmYYzGhXzX<#RNjXyOkl<|~(5tlM|6R99e{hWJzHr%??a z5l#0zCL@@5F8XU=R)V2V?*Z&ahEH=32&Y(GX+7W_7X4;;5#c-%()zacW>h-RTUI$( zkt8>-8X0&$85U&b=^@aiX}V>u%ry{2`Hrf$N|&tgP3x}4<2ag_p)5zIfPkG*8RHQ-CfgXnwovuC)DtLU(f$9~J|(QwesM$_NgT zsFqZYa%IE1s?r1V6J%LCzTWpKc%;0~W1^Qq%^6W$D7$DVc8=Fv=k!}csCN8kO5Gl> z?)xTAxs8-pP-H0QTL0gTqtoYh$T-#>Xn_w>Tu@AO^+IqIQt;g+A?p3d2T$!aBB6@# zlc^@thF@Sk24zY}?D!3*f3|(v?8BEqyQj@sT4yR-YYHPY2&Eu{6HB z3f^=|$WTsa8f28zn;CZQMD>gYHp=OvF#CU4WdTFaTUgj1e+z%&i^n%;lW8fmh9}itYJZiHDDg>$oQ<`Y^tIu#p z4-Bg9k{uN^fU1TxoIuX0AYBh&`CFyQd2(QsL&fDSn*|6qAn6rzb)^MIj;{-M0b6{x z%-C=j+F1Y{czB9%SR4_0kT#l6Ks%gGdl4G78)dUz@DfS`3dT41j3!k6tW0FZF4FEV zN%l2s1qd84>3>NxRu1U6rnr0I8FE>P;?)sSjT*TU&JzO{Wg*zQTa2XXZXM%`t%x_s z+!ERahubdNakseDF#!l-6yIkhm>)9Dg{LGEZ`#{?-%ZS(F8N5Q9qRUR40C_wN5w~% zb7~zjtD$pQJ#xcFB5N{X(o|LLxAy1E1tK}NX^(0>UOUjUL8ENSF^yPauuY+<^&r0a zADS6Z`PE|O(jib1v~+jnN7=GHRH<2hg_;@4I}rZQEB^U{2YIck6i%ii^9X?13s<_! zeFvTxkmi-|c0KOepF!5FoL2ORf zO!Tt)P>S$*uF6^Sl8+$7at&v6$F&BVl@919*mpBcCpk|YNE>q+;jU!H0Wwz;3klb= zOE6MeoNTY68SK1(>SyN6GaEz~)2fbS`3vjHYxVs0>K01r>zgxV91qlSipm4EYo$Z; z8N}wAc$+O@QMynX8tSrw+NH88BoR}79&#K4g$thx zy6^qx9$g_PLsm(1Ef0_VC=FjfRcgwIr=otp!n+Ctaj@MVtGon!k`3(uv)+z7&1-(F z3)$P(>&MB40!@hN{PP7*E<)fsORf|>`QB!j$6dgaZ|yv@ z+lDbk1@_XNuRlxck6Zu4s*uq9VeaOG-c$l=Wje#yYA(s~N^Sq~vA13Q;cj9Qzd|5K zf7BYr=BBZRK%eZ(|3EPgW(jG}gXN#KpMIOJB8+>>j9z(dV0qKXy7PJuQz*HZF6@9! zn|7nQkpS_@b3~XrHwptaOsza?2puY9Kll&C^-%!3@xg`&C1wW*PMGk26XE|j+F3%j zN>?Qo2}QW~IyAS))*ig+>q1`MSYM@H4~EuURm~1&RI-1R{2D?pifX-KuL0u*?l)<} z+*RqTQ)hjQw1To6Ftxb?XSQ^gKD2rA)Ke}5Iaskh4~^6fs|BsXp1C(!g`nGYfLeMs zq`C|^5>Y%#W?K5uv-%hb@;mviB&{B=%h;<=;#+>@vsW?h5zmVqdu?g~9i%z^m?KGv z)PNN;usavUP*qWx4jROj|3Dv%y_pRMgKhr<)zvo1jq+dxsw-X9IijZaqj03%3+TAu z;s#X`8MiSb#M1!rEPCVKc9TOk4mhmWOE?5m+I5+ZC$UN>9lF@A%WUig&wEmDl5c2u zx5EgJYPG=+Uu*vQpoW!}2~nD5+v+~rwBX?MT|KCNz{E}gI8rrkE0PA4Ty{+S(rG%? zo}#IYNPHp|Q$D8y*eM%aL*V`|qqZX-)q$?5vZPJEIsRD!39|3AV@Vc0CE9^=c^A7L z)u{TSZ?iBBFk3EzK#D+s)R<$5Pc!3>axk;D6GKe+tSS3jDt@M>#1=n%F$C~0TZtn! z2SBvd3z%b3p-DbXrakc3wb6W6&uCtJYlqBX#jw2;)o|rmC34XFxZ=m>Q(e0cG-d}| z52$4<7oMw4QCexeXaL}de1p^s=rk^;zAsqaGY>SfBEBGmASUyy9cxW3@;s# zi__Frw+$q!i#&i{HK1jYunbJdZ0(hJtD*|v^IO2Lu7y%o-+M~k>(MXyz;x!ZN1K)R zb05oRWeT}R_}Q4STc2S6*?4D7MjOomBpCy&~E7r$%?qj2$FJyV~~ViDj(C@nL> z0tx5YTrqFrUmVVyl#3Tu-8t`hL z?>;r)w5HhQ$P|U>j_2?$77_Dsi=;pOFh5}zzWf9+gKM-5V|VH&>^g}b)`kI9^~0av zIuz}$h+M+y5jokk3jXY5dCOchY>t`{dMcZwC|ZYAPE7@hZTX$rWIH{1m97Z9*CvJz zmaXw+dxma0*=ouXv{#EvjpIY10z_h{xl%_$S{tA|2t9T1B|I$F0D}IU?)*D9U||RK z3s=%BtVbg_C72C^i9Zic|5wYVRjQ*ppLg+WU#)~9i0GLY5P#G2Vc&+a;mz#w5Z>vX z`!&}G+#Vmoivu%<{SAvaz(PBg33Azk`dxvEQ1!SIe*Nk2_k#X|(%XVEG`}AxF}8q5lVZ>ZFk!T{Ey}YZu@a^s<182^4QG zLtSs-8rlTBS+gCNm?g{M(@)fogRE-FRL#6xbh4c7xdX_vXI;2k)LD^81C{zH6INj= ze)2S6A)iN`a*J+nqakR*EKGye44^DBjhb?y!wA61B;tjH20Qs}+U8_OUwL?1AvINy zXhFFG+oroe>=~B!^BKhiX7-P-zBq@&upt~)&j1kjF$2pQjx) z4-Ej%%G5b($Egy7OW>H(ji25M>+zBlOkdfn$fCb<2?#-SR}Y)Uh=6ryy6=aPTd1m4 zsgJ^E)y(U6y0-`1c06!~OfN5LN)UIBGI6DfO-IZK(y=2M@f6mt$IQ z;(14*ez(7G+_Q()1mA*-4m{2ya?P1*d1RwOgg$sH$eOZdi+O(HpxMM6+79frIpZJp z13+$79{E+MB}86^#;Ystn|xyww2@{6v%53OrlIR-DEq8a#t+`blfaSu>Y~BlI@WrL z$q?zQ{>r6&V%%MC3bngEc)C}r8!j0&%cptF~Pl>b%Sx0~oQEuMhEg#Pxg7Ea_rmK34?*6skBU%{9mxJNvhY${7! zBM{2l_Nw1$>#P6MKB6t)sus_=XW(As)gomtPtx6YD2y&+TOfg8+(npg9f@mv^97!N z{0V}9=s|#9JqQ&jf5ay7sNDMya_qP+t@K%z420i9Srfcpgrn$^N(5dr4=R0XpR#{i z=aFcqa3)a$%~|ZPZQQ$#ji30IgBMynD$v)Y!}?N}2Im(*X@`T8o=* z01dH=0jtn&rFpUgba3TEPz(Eb} z(@Xsi6!!d&Qjm?wEir)epEC(#he>q^am2f&b;6=X2fXS}^L;`~&LPjt}si_o@b za9{M5*wFp3vegcc@EJRi8PH#6rS_!GvY*{`l0!@fo8wLxj@BX2H~PNRl(yr0UQTs1 zwS_J)h1Wb>$xDi9wEpS+DngJ?#UsvpRh>_>;AFit&+KeVv@*+T+C(*hRt=Up>=}?@ z%evINLT>C7HA-|`lceYN*x7m{p5sZ( zV1|?qoZ%VxWG+@gvu>{y+fgPgaJXOJG4sc2`AGsvrg`S@Ocbv=1m=L18x-7qFxf@# z)Q|kdRAC#Twzg2Mw4eN%?Cj*Tzi_jmvk3N~O@F4X?b0276ZNuA<;gXcr|tl%0sKAX zXZ!cIQ`y&=9~y4C-fEj;o$`zze7U>wT~XR{>0_btKOVp4?J3q$uDjYd-Es%_CBB~i zYZelEJY$6LQw)_N*utj2-{4+v)#IuNYhKvO2$&jBfcN&REv0t4*sP;jQM23G+3Qc2_y-N zS{g$5DBhLzpe$1WEgoLN_JL#vzNyV*#Z2M^S(45?{ohX|rh{XwWyv{nw4(8@L%jcD z%Lj4koV|}Ogc(yh6%r0y~&OY59e2w zIgj%hec-}9$9^QqHg3ocaNqZK?G}?|!al)XJSbm(wEptRJwPpeEF3-hQt4#uQtM3# z|EFV4cF-wu-ui9FF0|aYy$}@>j9G*@TlAObMfKBpu9D-Vw6~$wUsXAZe$}!?p-^7M zla6FXN||&|C?$qkv$KCi zZCGN}|EOS10W?A)$j;*LwHT0P9l*fIYu`CfgXoMks0XgRGZ%x2SM(#XzyN|Hozq{b zl!3kH--kY1!3sPzmuwzT3=v)iuWuH$j6}D>Z`0FsOI<46Mx#nKHcf%eM#$L9Fre)|V0_-=ghXwq!OQ!G~RuFN>LVrLLeZJCAM zQJgTG?rp=M}V*mE$xe6bgxfm2`ftQlr({q+r*rMI$ z8C<+`fqs1_SXwwAg6a+;qNAv%?wqNCXE`b$`O4Pw~X zVFgnsr6{-RLyx~63Qjfevh*Af5F9`tO7^Mi`LKWDiZf&NJ1SCh@@?33;LQ1^rn4S? z8PiE%@3bOxL=1;pHh7(OZ>UZ<4hBNZJVSCzCVqzirH?{S6^`}@(wr_h~z9M0LKDv$IWEEaXC`;%sIABnfsdMqy z;4(gm`I+iFa7YIRqrAX|ln>j$b*3)MB>n0-aaKS^1?WNDt?Hqo7$UcKPHGGwezG4i zK=wBUK62@s>!ppLJp@%>ovu31^}jGWvQjr>NUt~!pC=d~^53|hGgn{SZaXUYJ!#SC z%@?5(-XU8MVg}gK{jGW6aCsl(Q)_@IS<}!jRk%@_!iYpK*UGsp6HvR;m0M1Q1DBzY z{R-;@yY%qicPm=dG;X)E>$eCQp386FwaOl3f)^}Dx><$qy~?ZSJm;Ls;5q&6q!Xw0 zmIHo4>#WDUSKz3_GFm||2)o|FTSzv8>UY&}aFN*X(~&sMjJ==B7#K5~zj_4bk_jF3Yn<5i~R}H)s0{fuy2f-p?000pzTHP!VD}HZeh6 z2lLz_7eO(%2a=%k1R#py<>6QOxeFP)hTl}o331WderlBg9cG3=}N^C zddn%}wNj#HP$W*B157=vH5D6OMl4Y53MrMf&TP6Ase}0r9DkB4t&5F5>3 z>v_KErhAl=@k8dfKYBLo96=wYFIZM2eKmXh*tPPEMo>~Lqsu{gONEkW$gd81d&21= zONAJy{(-EyICx4+-W$2(nNvd){@t>LlGA=$a2WhKOWh(I?0Ya4mWY<%C)ZaJ@A8Wsli{_<{N{%xLM1~hZ`Q1bS2N6Szly~G1}=y8t;;vPp|<-Y z)+4Ap@>FgHoU)&XiY~iK{b++2PmGh>iaYl3ymL?o5qRE6z>hl#${R+aFdYr|6D)il zmdo!?RH)&5;$`lRDoMC7Dc$a(TUHqRh>=8hEQESzR4o1`1CT6v2NMM=GWAMhz^uzu z#@VLwH||$>{N)qN1J=nyJRZu6ze4BoSxddVy5~PP-c%3XYT;8F+#FGOYuWq7R?@~S zLdBIUL&Xo%72wgyHgQkL!~5JlQAK$?u3291%HN`vj#%c;iYcWPt6Bn1BoLP$RcT!? z0fBwv2mmUx#Wzol$0wNed_ng{c|dyfW`eElnvsN&&&(S=$DnhThP26fq11#ASgDGM z%-B@A-j-BHDZ4YqJn%d+HU<(k1oYQIBslG0&(_R(#eF1R7dScy#~$CL-Pb>K6*rCt z;q8jbTjMDO`xJ(-ueRA`JaAR045?6x=)juIqf`}KSj_@_))Q>E3EY%m#iC{4F(#{0 zQS|E0h=_pCqcOXHDwaPGTVlXMqgP@lS?9#*g}Hiu&nTo7nb<__F1jbFLZ--*XY>y^ z1ZsBaUKSPT5WQj}-MbY-LDAI^SV8ebVee{>&5|a4ujaa%32z9#u**Q)KbL~hf1TyR zA-nZieM_ezRbG8*pXz_z%>l)jVax9405Afp>w5Oe^tCSIguv_Mn&&rGiMfi;5TZF)8h5OqM0cYIp7C9J5H{U`1t7bfx zuFKBS-zjr*o%wce8_UZDl&0JCwu7LM*8$wAFKK2(W+i_XT$Z^0?SbMzG<==hQi)(T&1o1qw~n!jeWh&H^twXfO! zZICuzbBhvn=g>d(tvwvn;=gey6Y}yE2n7+PA!Dmhq-Y@)3s@+;j0P%ovK@iPsUKH~n@xh`e04A{BdGUl`Q z{GU3W1yXb4aP;In$NT|g-vnsnpk0QI3~r{FR+H{V1L)!hX&UDS2tM8)Q2=UPQaJgC zyx^1%Wl|I0@nP<2Dk81ubdp@~A&W|#h)`F8h{-jGwuM&z+h08PP1({#MTLIJPt=7w zw57;EcPQ}A^MC*S9cguExg&Y5Dm!4Yn)m1$X zKQ)(5z78)_`k4}U;?^B+g4j}cdIKHw8w{`W>_b1p*>uzjV*E&be> zAkTVnVliL&zVjkx!%FUob;5<%tr(H064o&XC8lp3W2NQUOBOyGZSvfq<`=Qzbrv+# z(qtFOQGyU5J)Jt)EE~UaSn_a22#Zy*X1+rGjoP_aA`X*r+}o!k^ZD2>NW?n{}`g#zD(Jra@t<6Yd;h(S&_CpFQ+NU&9?D*zqXyzDPuZ^tLXq% zq&wNfer1O8!-8e#lz=x*?hb5LngOUJ`fE=I!ZJKn+PB3lgphWaP z5He+LK$S-|Esh~sOUTTMm3ExWFisF4Qi5%E%B36r=?Cg!L$)HaWTg6j&w{C@Aov{= zYKsTlq`DL}nHs?vFl%gRA2lyMoXUGcG4gS1IJ3Tmitcw)>uz>QR!3%aTb774JJ#r9 z8>r%mOT5tq_-xUEJah0jP!H;KgIirQ@&OqOTJi%>>TcofeCC*!lm0k1AQAa_6IXwx zg|{GVgx#9IWbD&d-N$zl6htu*x@sZ(FL@(Il>{W(W+n})g|@EQgOpR;`F74@cu{30 zSC>RSXUx^gjW46C3pk&*@0b2N z9tXO!`RNHlMdpg6?g7AeNxSHy=wG%bt8U9&*N-p<`Bl0hLHijSEPzt1#ey`=D4gcN$5MTjSZ;Yq?rI!+~v#< zMEhTWtn1yOe{qq`Z(ks;msy=drW4p$b()b%tE(rJNzWM3Z;QY)0@&JQ(Zm$Rc8iCz zV)Y)t4(i3z#8&;fSY9}%arsgUCOZJYiCkJLI;=jigM~Fb4Y&vo>RMwS2$rv;Je<>1Y*HR05gs9Fq15(WNAC;;Xpw=tCyr$Mtbtk4P2|_h2Ts~&*eHY& z$DnYzZ2lQ(OMIG|aN>?c94ybrB7+m8xJjSRkc^q*7_5?0Ye$KF^Jf~2E_}UAGX6>J zLRE(NI*^NqE>T84V1pQzECoG&YmO{=0tyx;l-H4zI@aR5niBNqeuF^Mj*B$nX9?fr znWc+>Ou?R0BGL84VSOnjnWHkvSFS>5(~R-*wnJ_I^J_3U4zFsg=LgEe5=&qf>vT z`b36i;AD}?DB8Wcrcf}m*_VxptS!?Xf{s^_N@5U}Kp;v_RH|Ec=fYw*q51z z#lK9=YwzKg_dSGb*|>_EyiaD_wY5z3|F@Y@@Ouh3+mf≠(RCz>$>M%um7Fy*;ax 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 literal 0 HcmV?d00001 From e82ba13b8b192a633330c190c9b771f628b024bd Mon Sep 17 00:00:00 2001 From: FlightControl Date: Mon, 6 Jun 2016 13:43:32 +0200 Subject: [PATCH 6/7] Publishing a working version :-) --- Moose Development/Moose/Base.lua | 32 +- Moose Development/Moose/Database.lua | 61 +- Moose Development/Moose/Point.lua | 195 + Moose Development/Moose/Spawn.lua | 13 +- Moose Development/Moose/Static.lua | 81 + Moose Development/Moose/Unit.lua | 2 +- Moose Development/Moose/Zone.lua | 130 +- .../l10n/DEFAULT/Moose.lua | 17619 +--------------- Moose Mission Setup/Moose.lua | 17619 +--------------- .../Moose_Test_CLEANUP/Moose_Test_CLEANUP.miz | Bin 204111 -> 98334 bytes .../Moose_Test_DATABASE.miz | Bin 143859 -> 38082 bytes .../Moose_Test_DESTROY/MOOSE_Test_DESTROY.miz | Bin 139295 -> 33518 bytes .../Moose_Test_ESCORT/MOOSE_Test_ESCORT.miz | Bin 164950 -> 59173 bytes .../Moose_Test_MISSILETRAINER.miz | Bin 224244 -> 118467 bytes .../Moose_Test_SEAD/MOOSE_Test_SEAD.miz | Bin 131548 -> 25771 bytes .../Moose_Test_SPAWN/MOOSE_Test_SPAWN.miz | Bin 160750 -> 54986 bytes .../MOOSE_Test_SPAWN_Repeat.miz | Bin 131109 -> 25332 bytes .../MOOSE_Test_TASK_Pickup_and_Deploy.miz | Bin 137710 -> 31933 bytes .../Moose_Test_WRAPPER/Moose_Test_WRAPPER.miz | Bin 146729 -> 40952 bytes .../Moose_Test_ZONE/Moose_Test_ZONE.lua | 19 + .../Moose_Test_ZONE/Moose_Test_ZONE.miz | Bin 0 -> 20873 bytes .../Moose_Test_ZONE_POLYGON.lua | 14 +- .../Moose_Test_ZONE_POLYGON.miz | Bin 126214 -> 21605 bytes .../Moose_Test_ZONE_RADIUS.lua | 20 + .../Moose_Test_ZONE_RADIUS.miz | Bin 0 -> 21030 bytes .../Moose_Test_ZONE_UNIT.lua | 25 + .../Moose_Test_ZONE_UNIT.miz | Bin 0 -> 20909 bytes Moose Training/Documentation/Airbase.html | 2 + Moose Training/Documentation/Base.html | 34 +- Moose Training/Documentation/CARGO.html | 2 + Moose Training/Documentation/CleanUp.html | 2 + Moose Training/Documentation/Client.html | 2 + Moose Training/Documentation/DCSAirbase.html | 2 + .../Documentation/DCSCoalitionObject.html | 2 + Moose Training/Documentation/DCSCommand.html | 2 + .../Documentation/DCSController.html | 2 + Moose Training/Documentation/DCSGroup.html | 2 + Moose Training/Documentation/DCSObject.html | 2 + Moose Training/Documentation/DCSTask.html | 2 + Moose Training/Documentation/DCSTypes.html | 2 + Moose Training/Documentation/DCSUnit.html | 2 + Moose Training/Documentation/DCSWorld.html | 2 + Moose Training/Documentation/DCStimer.html | 2 + Moose Training/Documentation/DEPLOYTASK.html | 2 + .../Documentation/DESTROYBASETASK.html | 2 + .../Documentation/DESTROYGROUPSTASK.html | 2 + .../Documentation/DESTROYRADARSTASK.html | 2 + .../Documentation/DESTROYUNITTYPESTASK.html | 2 + Moose Training/Documentation/Database.html | 162 +- Moose Training/Documentation/Escort.html | 2 + Moose Training/Documentation/Event.html | 2 + Moose Training/Documentation/GOHOMETASK.html | 2 + Moose Training/Documentation/Group.html | 2 + Moose Training/Documentation/GroupSet.html | 2 + Moose Training/Documentation/MISSION.html | 2 + Moose Training/Documentation/MOVEMENT.html | 2 + Moose Training/Documentation/Menu.html | 2 + Moose Training/Documentation/Message.html | 2 + .../Documentation/MissileTrainer.html | 2 + Moose Training/Documentation/NOTASK.html | 2 + Moose Training/Documentation/PICKUPTASK.html | 2 + Moose Training/Documentation/Point.html | 826 + Moose Training/Documentation/ROUTETASK.html | 2 + Moose Training/Documentation/STAGE.html | 2 + Moose Training/Documentation/Scheduler.html | 2 + Moose Training/Documentation/Scoring.html | 2 + Moose Training/Documentation/Sead.html | 2 + Moose Training/Documentation/Set.html | 2 + Moose Training/Documentation/Spawn.html | 2 + Moose Training/Documentation/Static.html | 253 + .../Documentation/StaticObject.html | 2 + Moose Training/Documentation/TASK.html | 2 + Moose Training/Documentation/Unit.html | 2 + Moose Training/Documentation/UnitSet.html | 2 + Moose Training/Documentation/Zone.html | 182 +- Moose Training/Documentation/env.html | 2 + Moose Training/Documentation/index.html | 14 + Moose Training/Documentation/land.html | 2 + Moose Training/Documentation/routines.html | 2 + ...art 1 - Use zones with GROUP and UNIT.pptx | Bin 788485 -> 675898 bytes 80 files changed, 2137 insertions(+), 35256 deletions(-) create mode 100644 Moose Development/Moose/Point.lua create mode 100644 Moose Development/Moose/Static.lua create mode 100644 Moose Test Missions/Moose_Test_ZONE/Moose_Test_ZONE.lua create mode 100644 Moose Test Missions/Moose_Test_ZONE/Moose_Test_ZONE.miz create mode 100644 Moose Test Missions/Moose_Test_ZONE_RADIUS/Moose_Test_ZONE_RADIUS.lua create mode 100644 Moose Test Missions/Moose_Test_ZONE_RADIUS/Moose_Test_ZONE_RADIUS.miz create mode 100644 Moose Test Missions/Moose_Test_ZONE_UNIT/Moose_Test_ZONE_UNIT.lua create mode 100644 Moose Test Missions/Moose_Test_ZONE_UNIT/Moose_Test_ZONE_UNIT.miz create mode 100644 Moose Training/Documentation/Point.html create mode 100644 Moose Training/Documentation/Static.html diff --git a/Moose Development/Moose/Base.lua b/Moose Development/Moose/Base.lua index 3586673d1..10f5cf4dc 100644 --- a/Moose Development/Moose/Base.lua +++ b/Moose Development/Moose/Base.lua @@ -380,12 +380,12 @@ end --- Trace a function call. Must be at the beginning of the function logic. -- @param #BASE self -- @param Arguments A #table or any field. -function BASE:F( Arguments ) +function BASE:F( Arguments, DebugInfoCurrentParam, DebugInfoFromParam ) if _TraceOn and ( _TraceClass[self.ClassName] or _TraceClassMethod[self.ClassName] ) then - local DebugInfoCurrent = debug.getinfo( 2, "nl" ) - local DebugInfoFrom = debug.getinfo( 3, "l" ) + local DebugInfoCurrent = DebugInfoCurrentParam and DebugInfoCurrentParam or debug.getinfo( 2, "nl" ) + local DebugInfoFrom = DebugInfoFromParam and DebugInfoFromParam or debug.getinfo( 3, "l" ) local Function = "function" if DebugInfoCurrent.name then @@ -408,8 +408,11 @@ end -- @param Arguments A #table or any field. function BASE:F2( Arguments ) + local DebugInfoCurrent = debug.getinfo( 2, "nl" ) + local DebugInfoFrom = debug.getinfo( 3, "l" ) + if _TraceLevel >= 2 then - self:F( Arguments ) + self:F( Arguments, DebugInfoCurrent, DebugInfoFrom ) end end @@ -419,8 +422,11 @@ end -- @param Arguments A #table or any field. function BASE:F3( Arguments ) + local DebugInfoCurrent = debug.getinfo( 2, "nl" ) + local DebugInfoFrom = debug.getinfo( 3, "l" ) + if _TraceLevel >= 3 then - self:F( Arguments ) + self:F( Arguments, DebugInfoCurrent, DebugInfoFrom ) end end @@ -428,12 +434,12 @@ end --- Trace a function logic. Can be anywhere within the function logic. -- @param #BASE self -- @param Arguments A #table or any field. -function BASE:T( Arguments ) +function BASE:T( Arguments, DebugInfoCurrentParam, DebugInfoFromParam ) if _TraceOn and ( _TraceClass[self.ClassName] or _TraceClassMethod[self.ClassName] ) then - local DebugInfoCurrent = debug.getinfo( 2, "nl" ) - local DebugInfoFrom = debug.getinfo( 3, "l" ) + local DebugInfoCurrent = DebugInfoCurrentParam and DebugInfoCurrentParam or debug.getinfo( 2, "nl" ) + local DebugInfoFrom = DebugInfoFromParam and DebugInfoFromParam or debug.getinfo( 3, "l" ) local Function = "function" if DebugInfoCurrent.name then @@ -456,8 +462,11 @@ end -- @param Arguments A #table or any field. function BASE:T2( Arguments ) + local DebugInfoCurrent = debug.getinfo( 2, "nl" ) + local DebugInfoFrom = debug.getinfo( 3, "l" ) + if _TraceLevel >= 2 then - self:T( Arguments ) + self:T( Arguments, DebugInfoCurrent, DebugInfoFrom ) end end @@ -467,8 +476,11 @@ end -- @param Arguments A #table or any field. function BASE:T3( Arguments ) + local DebugInfoCurrent = debug.getinfo( 2, "nl" ) + local DebugInfoFrom = debug.getinfo( 3, "l" ) + if _TraceLevel >= 3 then - self:T( Arguments ) + self:T( Arguments, DebugInfoCurrent, DebugInfoFrom ) end end diff --git a/Moose Development/Moose/Database.lua b/Moose Development/Moose/Database.lua index 66febcae9..656df9bf0 100644 --- a/Moose Development/Moose/Database.lua +++ b/Moose Development/Moose/Database.lua @@ -36,9 +36,11 @@ Include.File( "Routines" ) Include.File( "Base" ) Include.File( "Menu" ) Include.File( "Group" ) +Include.File( "Static" ) Include.File( "Unit" ) Include.File( "Event" ) Include.File( "Client" ) +Include.File( "Scheduler" ) --- DATABASE class @@ -54,7 +56,9 @@ DATABASE = { }, DCSUnits = {}, DCSGroups = {}, + DCSStatics = {}, UNITS = {}, + STATICS = {}, GROUPS = {}, PLAYERS = {}, PLAYERSALIVE = {}, @@ -100,7 +104,8 @@ function DATABASE:New() _EVENTDISPATCHER:OnPlayerLeaveUnit( self._EventOnPlayerLeaveUnit, self ) self:_RegisterTemplates() - self:_RegisterDatabase() + self:_RegisterGroupsAndUnits() + self:_RegisterStatics() self:_RegisterPlayers() return self @@ -133,6 +138,32 @@ function DATABASE:DeleteUnit( DCSUnitName ) self.DCSUnits[DCSUnitName] = nil end +--- Adds a Static based on the Static Name in the DATABASE. +-- @param #DATABASE self +function DATABASE:AddStatic( DCSStatic, DCSStaticName ) + + self.DCSStatics[DCSStaticName] = DCSStatic + self.STATICS[DCSStaticName] = STATIC:Register( DCSStaticName ) +end + + +--- Deletes a Static from the DATABASE based on the Static Name. +-- @param #DATABASE self +function DATABASE:DeleteStatic( DCSStaticName ) + + self.DCSStatics[DCSStaticName] = nil +end + +--- Finds a STATIC based on the StaticName. +-- @param #DATABASE self +-- @param #string StaticName +-- @return Static#STATIC The found STATIC. +function DATABASE:FindStatic( StaticName ) + + local StaticFound = self.STATICS[StaticName] + return StaticFound +end + --- Finds a CLIENT based on the ClientName. -- @param #DATABASE self @@ -220,6 +251,8 @@ function DATABASE:Spawn( SpawnTemplate ) SpawnTemplate.SpawnCategoryID = nil self:_RegisterTemplate( SpawnTemplate ) + + self:T3( SpawnTemplate ) coalition.addGroup( SpawnCountryID, SpawnCategoryID, SpawnTemplate ) -- Restore @@ -227,7 +260,6 @@ function DATABASE:Spawn( SpawnTemplate ) SpawnTemplate.SpawnCountryID = SpawnCountryID SpawnTemplate.SpawnCategoryID = SpawnCategoryID - local SpawnGroup = GROUP:Register( SpawnTemplate.name ) return SpawnGroup end @@ -320,10 +352,10 @@ function DATABASE:_RegisterPlayers() end ---- Private method that registers all datapoints within in the mission. +--- Private method that registers all Groups and Units within in the mission. -- @param #DATABASE self -- @return #DATABASE self -function DATABASE:_RegisterDatabase() +function DATABASE:_RegisterGroupsAndUnits() local CoalitionsData = { GroupsRed = coalition.getGroups( coalition.side.RED ), GroupsBlue = coalition.getGroups( coalition.side.BLUE ) } for CoalitionId, CoalitionData in pairs( CoalitionsData ) do @@ -356,6 +388,27 @@ function DATABASE:_RegisterDatabase() return self end +function DATABASE:_RegisterStatics() + + local CoalitionsData = { GroupsRed = coalition.getStaticObjects( coalition.side.RED ), GroupsBlue = coalition.getStaticObjects( coalition.side.BLUE ) } + for CoalitionId, CoalitionData in pairs( CoalitionsData ) do + for DCSStaticId, DCSStatic in pairs( CoalitionData ) do + + if DCSStatic:isExist() then + local DCSStaticName = DCSStatic:getName() + + self:E( { "Register Static:", DCSStatic, DCSStaticName } ) + self:AddStatic( DCSStatic, DCSStaticName ) + else + self:E( { "Static does not exist: ", DCSStatic } ) + end + end + end + + return self +end + + --- Events --- Handles the OnBirth event for the alive units set. diff --git a/Moose Development/Moose/Point.lua b/Moose Development/Moose/Point.lua new file mode 100644 index 000000000..e0dfa6cdb --- /dev/null +++ b/Moose Development/Moose/Point.lua @@ -0,0 +1,195 @@ +--- This module contains the POINT classes. +-- +-- 1) @{Point#POINT_VEC3} class, extends @{Base#BASE} +-- =============================================== +-- The @{Point#POINT_VEC3} class defines a 3D point in the simulator. +-- +-- 1.1) POINT_VEC3 constructor +-- --------------------------- +-- +-- A new POINT instance can be created with: +-- +-- * @{#POINT_VEC3.New}(): a 3D point. +-- +-- 2) @{Point#POINT_VEC2} class, extends @{Point#POINT_VEC3} +-- ========================================================= +-- The @{Point#POINT_VEC2} class defines a 2D point in the simulator. The height coordinate (if needed) will be the land height + an optional added height specified. +-- +-- 2.1) POINT_VEC2 constructor +-- --------------------------- +-- +-- A new POINT instance can be created with: +-- +-- * @{#POINT_VEC2.New}(): a 2D point. +-- +-- @module Point +-- @author FlightControl + +Include.File( "Routines" ) +Include.File( "Base" ) +Include.File( "Point" ) + +--- The POINT_VEC3 class +-- @type POINT_VEC3 +-- @extends Base#BASE +-- @field #POINT_VEC3.SmokeColor SmokeColor +-- @field #POINT_VEC3.FlareColor FlareColor +POINT_VEC3 = { + ClassName = "POINT_VEC3", + SmokeColor = { + Green = trigger.smokeColor.Green, + Red = trigger.smokeColor.Red, + White = trigger.smokeColor.White, + Orange = trigger.smokeColor.Orange, + Blue = trigger.smokeColor.Blue + }, + FlareColor = { + Green = trigger.flareColor.Green, + Red = trigger.flareColor.Red, + White = trigger.flareColor.White, + Yellow = trigger.flareColor.Yellow + }, + } + +--- SmokeColor +-- @type POINT_VEC3.SmokeColor +-- @field Green +-- @field Red +-- @field White +-- @field Orange +-- @field Blue + +--- FlareColor +-- @type POINT_VEC3.FlareColor +-- @field Green +-- @field Red +-- @field White +-- @field Yellow + +-- Constructor. + +--- Create a new POINT_VEC3 object. +-- @param #POINT_VEC3 self +-- @param DCSTypes#Distance x The x coordinate of the Vec3 point, pointing to the North. +-- @param DCSTypes#Distance y The y coordinate of the Vec3 point, pointing Upwards. +-- @param DCSTypes#Distance z The z coordinate of the Vec3 point, pointing to the Right. +-- @return Point#POINT_VEC3 +function POINT_VEC3:New( x, y, z ) + + local self = BASE:Inherit( self, BASE:New() ) + self:F2( { x, y, z } ) + self.PointVec3 = { x = x, y = y, z = z } + return self +end + +--- Smokes the point in a color. +-- @param #POINT_VEC3 self +-- @param Point#POINT_VEC3.SmokeColor SmokeColor +function POINT_VEC3:Smoke( SmokeColor ) + self:F2( { SmokeColor, self.PointVec3 } ) + trigger.action.smoke( self.PointVec3, SmokeColor ) +end + +--- Smoke the POINT_VEC3 Green. +-- @param #POINT_VEC3 self +function POINT_VEC3:SmokeGreen() + self:F2() + self:Smoke( POINT_VEC3.SmokeColor.Green ) +end + +--- Smoke the POINT_VEC3 Red. +-- @param #POINT_VEC3 self +function POINT_VEC3:SmokeRed() + self:F2() + self:Smoke( POINT_VEC3.SmokeColor.Red ) +end + +--- Smoke the POINT_VEC3 White. +-- @param #POINT_VEC3 self +function POINT_VEC3:SmokeWhite() + self:F2() + self:Smoke( POINT_VEC3.SmokeColor.White ) +end + +--- Smoke the POINT_VEC3 Orange. +-- @param #POINT_VEC3 self +function POINT_VEC3:SmokeOrange() + self:F2() + self:Smoke( POINT_VEC3.SmokeColor.Orange ) +end + +--- Smoke the POINT_VEC3 Blue. +-- @param #POINT_VEC3 self +function POINT_VEC3:SmokeBlue() + self:F2() + self:Smoke( POINT_VEC3.SmokeColor.Blue ) +end + +--- Flares the point in a color. +-- @param #POINT_VEC3 self +-- @param Point#POINT_VEC3.FlareColor +-- @param DCSTypes#Azimuth (optional) Azimuth The azimuth of the flare direction. The default azimuth is 0. +function POINT_VEC3:Flare( FlareColor, Azimuth ) + self:F2( { FlareColor, self.PointVec3 } ) + trigger.action.signalFlare( self.PointVec3, FlareColor, Azimuth and Azimuth or 0 ) +end + +--- Flare the POINT_VEC3 White. +-- @param #POINT_VEC3 self +-- @param DCSTypes#Azimuth (optional) Azimuth The azimuth of the flare direction. The default azimuth is 0. +function POINT_VEC3:FlareWhite( Azimuth ) + self:F2( Azimuth ) + self:Flare( POINT_VEC3.FlareColor.White, Azimuth ) +end + +--- Flare the POINT_VEC3 Yellow. +-- @param #POINT_VEC3 self +-- @param DCSTypes#Azimuth (optional) Azimuth The azimuth of the flare direction. The default azimuth is 0. +function POINT_VEC3:FlareYellow( Azimuth ) + self:F2( Azimuth ) + self:Flare( POINT_VEC3.FlareColor.Yellow, Azimuth ) +end + +--- Flare the POINT_VEC3 Green. +-- @param #POINT_VEC3 self +-- @param DCSTypes#Azimuth (optional) Azimuth The azimuth of the flare direction. The default azimuth is 0. +function POINT_VEC3:FlareGreen( Azimuth ) + self:F2( Azimuth ) + self:Flare( POINT_VEC3.FlareColor.Green, Azimuth ) +end + +--- Flare the POINT_VEC3 Red. +-- @param #POINT_VEC3 self +function POINT_VEC3:FlareRed( Azimuth ) + self:F2( Azimuth ) + self:Flare( POINT_VEC3.FlareColor.Red, Azimuth ) +end + + +--- The POINT_VEC2 class +-- @type POINT_VEC2 +-- @extends Point#POINT_VEC3 +POINT_VEC2 = { + ClassName = "POINT_VEC2", + } + +--- Create a new POINT_VEC2 object. +-- @param #POINT_VEC2 self +-- @param DCSTypes#Distance x The x coordinate of the Vec3 point, pointing to the North. +-- @param DCSTypes#Distance y The y coordinate of the Vec3 point, pointing to the Right. +-- @param DCSTypes#Distance LandHeightAdd (optional) The default height if required to be evaluated will be the land height of the x, y coordinate. You can specify an extra height to be added to the land height. +-- @return Point#POINT_VEC2 +function POINT_VEC2:New( x, y, LandHeightAdd ) + + local LandHeight = land.getHeight( { ["x"] = x, ["y"] = y } ) + if LandHeightAdd then + LandHeight = LandHeight + LandHeightAdd + end + + local self = BASE:Inherit( self, POINT_VEC3:New( x, LandHeight, y ) ) + self:F2( { x, y, LandHeightAdd } ) + + return self +end + + diff --git a/Moose Development/Moose/Spawn.lua b/Moose Development/Moose/Spawn.lua index 9ea27a16a..8c63ae23c 100644 --- a/Moose Development/Moose/Spawn.lua +++ b/Moose Development/Moose/Spawn.lua @@ -473,6 +473,12 @@ function SPAWN:SpawnWithIndex( SpawnIndex ) end self.SpawnGroups[self.SpawnIndex].Spawned = true + + local SpawnGroup = self.SpawnGroups[self.SpawnIndex].Group -- Group#GROUP + local Route = SpawnGroup:GetTaskRoute() + SpawnGroup:Route(Route) + + return self.SpawnGroups[self.SpawnIndex].Group else --self:E( { self.SpawnTemplatePrefix, "No more Groups to Spawn:", SpawnIndex, self.SpawnMaxGroups } ) @@ -980,11 +986,12 @@ function SPAWN:_Prepare( SpawnTemplatePrefix, SpawnIndex ) SpawnTemplate.name = self:SpawnGroupName( SpawnIndex ) SpawnTemplate.groupId = nil - SpawnTemplate.lateActivation = false + --SpawnTemplate.lateActivation = false + SpawnTemplate.lateActivation = false -- TODO BUGFIX if SpawnTemplate.SpawnCategoryID == Group.Category.GROUND then self:T( "For ground units, visible needs to be false..." ) - SpawnTemplate.visible = false + SpawnTemplate.visible = false -- TODO BUGFIX end if SpawnTemplate.SpawnCategoryID == Group.Category.HELICOPTER or SpawnTemplate.SpawnCategoryID == Group.Category.AIRPLANE then @@ -1032,7 +1039,7 @@ end -- @param #number SpawnIndex -- @return #SPAWN self function SPAWN:_RandomizeTemplate( SpawnIndex ) - self:F( { self.SpawnTemplatePrefix, SpawnIndex } ) + self:F( { self.SpawnTemplatePrefix, SpawnIndex, self.SpawnRandomizeTemplate } ) if self.SpawnRandomizeTemplate then self.SpawnGroups[SpawnIndex].SpawnTemplatePrefix = self.SpawnTemplatePrefixTable[ math.random( 1, #self.SpawnTemplatePrefixTable ) ] diff --git a/Moose Development/Moose/Static.lua b/Moose Development/Moose/Static.lua new file mode 100644 index 000000000..ba6467023 --- /dev/null +++ b/Moose Development/Moose/Static.lua @@ -0,0 +1,81 @@ +--- This module contains the STATIC class. +-- +-- 1) @{Static#STATIC} class, extends @{Unit#UNIT} +-- =============================================== +-- Statics are **Static Units** defined within the Mission Editor. +-- Note that Statics are almost the same as Units, but they don't have a controller. +-- The @{Static#STATIC} class is a wrapper class to handle the DCS Static objects: +-- +-- * Wraps the DCS Static objects. +-- * Support all DCS Static APIs. +-- * Enhance with Static specific APIs not in the DCS API set. +-- +-- 1.1) STATIC reference methods +-- ----------------------------- +-- For each DCS Static will have a STATIC wrapper object (instance) within the _@{DATABASE} object. +-- This is done at the beginning of the mission (when the mission starts). +-- +-- The STATIC class does not contain a :New() method, rather it provides :Find() methods to retrieve the object reference +-- using the Static Name. +-- +-- Another thing to know is that STATIC objects do not "contain" the DCS Static object. +-- The STATIc methods will reference the DCS Static object by name when it is needed during API execution. +-- If the DCS Static object does not exist or is nil, the STATIC methods will return nil and log an exception in the DCS.log file. +-- +-- The STATIc class provides the following functions to retrieve quickly the relevant STATIC instance: +-- +-- * @{#STATIC.FindByName}(): Find a STATIC instance from the _DATABASE object using a DCS Static name. +-- +-- IMPORTANT: ONE SHOULD NEVER SANATIZE these STATIC OBJECT REFERENCES! (make the STATIC object references nil). +-- +-- @module Static +-- @author FlightControl + +Include.File( "Routines" ) +Include.File( "Base" ) +Include.File( "Message" ) + + +--- The STATIC class +-- @type STATIC +-- @extends Unit#UNIT +STATIC = { + ClassName = "STATIC", +} + + +--- Finds a STATIC from the _DATABASE using the relevant Static Name. +-- As an optional parameter, a briefing text can be given also. +-- @param #STATIC self +-- @param #string StaticName Name of the DCS **Static** as defined within the Mission Editor. +-- @return #STATIC +function STATIC:FindByName( StaticName ) + local StaticFound = _DATABASE:FindStatic( StaticName ) + + if StaticFound then + StaticFound:F( { StaticName } ) + + return StaticFound + end + + error( "STATIC not found for: " .. StaticName ) +end + +function STATIC:Register( StaticName ) + local self = BASE:Inherit( self, UNIT:Register( StaticName ) ) + + self:F( StaticName ) + + return self +end + + +function STATIC:GetDCSUnit() + local DCSStatic = StaticObject.getByName( self.UnitName ) + + if DCSStatic then + return DCSStatic + end + + return nil +end diff --git a/Moose Development/Moose/Unit.lua b/Moose Development/Moose/Unit.lua index a4da510e2..cdb8a43f8 100644 --- a/Moose Development/Moose/Unit.lua +++ b/Moose Development/Moose/Unit.lua @@ -535,7 +535,7 @@ function UNIT:GetPointVec2() UnitPointVec2.x = UnitPointVec3.x UnitPointVec2.y = UnitPointVec3.z - self:T3( UnitPointVec2 ) + self:T2( UnitPointVec2 ) return UnitPointVec2 end diff --git a/Moose Development/Moose/Zone.lua b/Moose Development/Moose/Zone.lua index 5ea17eee4..a27c3f1df 100644 --- a/Moose Development/Moose/Zone.lua +++ b/Moose Development/Moose/Zone.lua @@ -65,16 +65,21 @@ Include.File( "Routines" ) Include.File( "Base" ) Include.File( "Message" ) +Include.File( "Point" ) --- The ZONE_BASE class -- @type ZONE_BASE --- @Extends Base#BASE +-- @extends Base#BASE ZONE_BASE = { ClassName = "ZONE_BASE", } - + +--- ZONE_BASE constructor +-- @param #ZONE_BASE self +-- @param #string ZoneName Name of the zone. +-- @return #ZONE_BASE self function ZONE_BASE:New( ZoneName ) local self = BASE:Inherit( self, BASE:New() ) self:F( ZoneName ) @@ -106,21 +111,30 @@ function ZONE_BASE:IsPointVec3InZone( PointVec3 ) return InZone end +--- Smokes the zone boundaries in a color. +-- @param #ZONE_BASE self +-- @param SmokeColor The smoke color. +function ZONE_BASE:SmokeZone( SmokeColor ) + self:F2( SmokeColor ) + +end + --- The ZONE_RADIUS class, defined by a zone name, a location and a radius. -- @type ZONE_RADIUS -- @field DCSTypes#Vec2 PointVec2 The current location of the zone. -- @field DCSTypes#Distance Radius The radius of the zone. --- @Extends Zone#ZONE_BASE +-- @extends Zone#ZONE_BASE ZONE_RADIUS = { ClassName="ZONE_RADIUS", } --- Constructor of ZONE_RADIUS, taking the zone name, the zone location and a radius. -- @param #ZONE_RADIUS self +-- @param #string ZoneName Name of the zone. -- @param DCSTypes#Vec2 PointVec2 The location of the zone. -- @param DCSTypes#Distance Radius The radius of the zone. --- @return #ZONE_RADIUS +-- @return #ZONE_RADIUS self function ZONE_RADIUS:New( ZoneName, PointVec2, Radius ) local self = BASE:Inherit( self, ZONE_BASE:New( ZoneName ) ) self:F( { ZoneName, PointVec2, Radius } ) @@ -131,6 +145,59 @@ function ZONE_RADIUS:New( ZoneName, PointVec2, Radius ) return self end +--- Smokes the zone boundaries in a color. +-- @param #ZONE_RADIUS self +-- @param #POINT_VEC3.SmokeColor SmokeColor The smoke color. +-- @param #number Points (optional) The amount of points in the circle. +-- @return #ZONE_RADIUS self +function ZONE_RADIUS:SmokeZone( SmokeColor, Points ) + self:F2( SmokeColor ) + + local Point = {} + local PointVec2 = self:GetPointVec2() + + Points = Points and Points or 360 + + local Angle + local RadialBase = math.pi*2 + + for Angle = 0, 360, 360 / Points do + local Radial = Angle * RadialBase / 360 + Point.x = PointVec2.x + math.cos( Radial ) * self:GetRadius() + Point.y = PointVec2.y + math.sin( Radial ) * self:GetRadius() + POINT_VEC2:New( Point.x, Point.y ):Smoke( SmokeColor ) + end + + return self +end + + +--- Flares the zone boundaries in a color. +-- @param #ZONE_RADIUS self +-- @param #POINT_VEC3.FlareColor FlareColor The flare color. +-- @param #number Points (optional) The amount of points in the circle. +-- @param DCSTypes#Azimuth Azimuth (optional) Azimuth The azimuth of the flare. +-- @return #ZONE_RADIUS self +function ZONE_RADIUS:FlareZone( FlareColor, Points, Azimuth ) + self:F2( { FlareColor, Azimuth } ) + + local Point = {} + local PointVec2 = self:GetPointVec2() + + Points = Points and Points or 360 + + local Angle + local RadialBase = math.pi*2 + + for Angle = 0, 360, 360 / Points do + local Radial = Angle * RadialBase / 360 + Point.x = PointVec2.x + math.cos( Radial ) * self:GetRadius() + Point.y = PointVec2.y + math.sin( Radial ) * self:GetRadius() + POINT_VEC2:New( Point.x, Point.y ):Flare( FlareColor, Azimuth ) + end + + return self +end --- Returns the radius of the zone. -- @param #ZONE_RADIUS self @@ -197,14 +264,17 @@ function ZONE_RADIUS:GetPointVec3( Height ) return PointVec3 end + --- Returns if a location is within the zone. -- @param #ZONE_RADIUS self -- @param DCSTypes#Vec2 PointVec2 The location to test. -- @return #boolean true if the location is within the zone. function ZONE_RADIUS:IsPointVec2InZone( PointVec2 ) self:F2( PointVec2 ) + + local ZonePointVec2 = self:GetPointVec2() - if (( PointVec2.x - self.PointVec2.x )^2 + ( PointVec2.y - self.PointVec2.y ) ^2 ) ^ 0.5 <= self.Radius then + if (( PointVec2.x - ZonePointVec2.x )^2 + ( PointVec2.y - ZonePointVec2.y ) ^2 ) ^ 0.5 <= self:GetRadius() then return true end @@ -218,7 +288,7 @@ end function ZONE_RADIUS:IsPointVec3InZone( PointVec3 ) self:F2( PointVec3 ) - local InZone = self:IsPointVec3InZone( { x = PointVec3.x, y = PointVec3.z } ) + local InZone = self:IsPointVec2InZone( { x = PointVec3.x, y = PointVec3.z } ) return InZone end @@ -230,10 +300,11 @@ function ZONE_RADIUS:GetRandomPointVec2() self:F( self.ZoneName ) local Point = {} + local PointVec2 = self:GetPointVec2() local angle = math.random() * math.pi*2; - Point.x = self.PointVec2.x + math.cos( angle ) * math.random() * self.Radius; - Point.y = self.PointVec2.y + math.sin( angle ) * math.random() * self.Radius; + Point.x = PointVec2.x + math.cos( angle ) * math.random() * self:GetRadius(); + Point.y = PointVec2.y + math.sin( angle ) * math.random() * self:GetRadius(); self:T( { Point } ) @@ -244,7 +315,7 @@ end --- The ZONE class, defined by the zone name as defined within the Mission Editor. The location and the radius are automatically collected from the mission settings. -- @type ZONE --- @Extends Zone#ZONE_RADIUS +-- @extends Zone#ZONE_RADIUS ZONE = { ClassName="ZONE", } @@ -263,7 +334,7 @@ function ZONE:New( ZoneName ) return nil end - local self = BASE:Inherit( self, ZONE_RADIUS:New( ZoneName, { x = Zone.x, y = Zone.y }, Zone.radius ) ) + local self = BASE:Inherit( self, ZONE_RADIUS:New( ZoneName, { x = Zone.point.x, y = Zone.point.z }, Zone.radius ) ) self:F( ZoneName ) self.Zone = Zone @@ -272,11 +343,10 @@ function ZONE:New( ZoneName ) end - --- The ZONE_UNIT class defined by a zone around a @{Unit#UNIT} with a radius. -- @type ZONE_UNIT -- @field Unit#UNIT ZoneUNIT --- @Extends Zone#ZONE_RADIUS +-- @extends Zone#ZONE_RADIUS ZONE_UNIT = { ClassName="ZONE_UNIT", } @@ -313,7 +383,7 @@ end --- The ZONE_POLYGON class defined by a sequence of @{Group#GROUP} waypoints within the Mission Editor, forming a polygon. -- @type ZONE_POLYGON --- @Extends Zone#ZONE_BASE +-- @extends Zone#ZONE_BASE ZONE_POLYGON = { ClassName="ZONE_POLYGON", } @@ -342,6 +412,40 @@ function ZONE_POLYGON:New( ZoneName, ZoneGroup ) return self end +--- Smokes the zone boundaries in a color. +-- @param #ZONE_POLYGON self +-- @param #POINT_VEC3.SmokeColor SmokeColor The smoke color. +-- @return #ZONE_POLYGON self +function ZONE_POLYGON:SmokeZone( SmokeColor ) + self:F2( SmokeColor ) + + local i + local j + local Segments = 10 + + i = 1 + j = #self.Polygon + + while i <= #self.Polygon do + self:T( { i, j, self.Polygon[i], self.Polygon[j] } ) + + local DeltaX = self.Polygon[j].x - self.Polygon[i].x + local DeltaY = self.Polygon[j].y - self.Polygon[i].y + + for Segment = 0, Segments do -- We divide each line in 5 segments and smoke a point on the line. + local PointX = self.Polygon[i].x + ( Segment * DeltaX / Segments ) + local PointY = self.Polygon[i].y + ( Segment * DeltaY / Segments ) + POINT_VEC2:New( PointX, PointY ):Smoke( SmokeColor ) + end + j = i + i = i + 1 + end + + return self +end + + + --- Returns if a location is within the zone. -- @param #ZONE_POLYGON self 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 7db8a5175..114a0f7fe 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,6 @@ -env.info( '*** MOOSE STATIC INCLUDE START *** ' ) -env.info( 'Moose Generation Timestamp: 20160605_0003' ) +env.info( '*** MOOSE DYNAMIC INCLUDE START *** ' ) +env.info( 'Moose Generation Timestamp: 20160605_2147' ) + local base = _G env.info("Loading MOOSE " .. base.timer.getAbsTime() ) @@ -11,9 +12,27 @@ Include.Path = function() end Include.File = function( IncludeFile ) + if not Include.Files[ IncludeFile ] then + Include.Files[IncludeFile] = IncludeFile + env.info( "Include:" .. IncludeFile .. " from " .. Include.ProgramPath ) + local f = assert( base.loadfile( Include.ProgramPath .. IncludeFile .. ".lua" ) ) + if f == nil then + env.info( "Include:" .. IncludeFile .. " from " .. Include.MissionPath ) + local f = assert( base.loadfile( Include.MissionPath .. IncludeFile .. ".lua" ) ) + if f == nil then + error ("Could not load MOOSE file " .. IncludeFile .. ".lua" ) + else + env.info( "Include:" .. IncludeFile .. " loaded from " .. Include.MissionPath ) + return f() + end + else + env.info( "Include:" .. IncludeFile .. " loaded from " .. Include.ProgramPath ) + return f() + end + end end -Include.ProgramPath = "Scripts/Moose/Moose/" +Include.ProgramPath = "Scripts/Moose/" Include.MissionPath = Include.Path() env.info( "Include.ProgramPath = " .. Include.ProgramPath) @@ -23,17596 +42,4 @@ Include.Files = {} Include.File( "Moose" ) -env.info("Loaded MOOSE Include Engine") ---- Various routines --- @module routines --- @author Flightcontrol - ---Include.File( "Trace" ) ---Include.File( "Message" ) - - -env.setErrorMessageBoxEnabled(false) - ---- Extract of MIST functions. --- @author Grimes - -routines = {} - - --- don't change these -routines.majorVersion = 3 -routines.minorVersion = 3 -routines.build = 22 - ------------------------------------------------------------------------------------------------------------------ - ----------------------------------------------------------------------------------------------- --- Utils- conversion, Lua utils, etc. -routines.utils = {} - ---from http://lua-users.org/wiki/CopyTable -routines.utils.deepCopy = function(object) - local lookup_table = {} - local function _copy(object) - if type(object) ~= "table" then - return object - elseif lookup_table[object] then - return lookup_table[object] - end - local new_table = {} - lookup_table[object] = new_table - for index, value in pairs(object) do - new_table[_copy(index)] = _copy(value) - end - return setmetatable(new_table, getmetatable(object)) - end - local objectreturn = _copy(object) - return objectreturn -end - - --- porting in Slmod's serialize_slmod2 -routines.utils.oneLineSerialize = function(tbl) -- serialization of a table all on a single line, no comments, made to replace old get_table_string function - - lookup_table = {} - - local function _Serialize( tbl ) - - if type(tbl) == 'table' then --function only works for tables! - - if lookup_table[tbl] then - return lookup_table[object] - end - - local tbl_str = {} - - lookup_table[tbl] = tbl_str - - tbl_str[#tbl_str + 1] = '{' - - for ind,val in pairs(tbl) do -- serialize its fields - local ind_str = {} - if type(ind) == "number" then - ind_str[#ind_str + 1] = '[' - ind_str[#ind_str + 1] = tostring(ind) - ind_str[#ind_str + 1] = ']=' - else --must be a string - ind_str[#ind_str + 1] = '[' - ind_str[#ind_str + 1] = routines.utils.basicSerialize(ind) - ind_str[#ind_str + 1] = ']=' - end - - local val_str = {} - if ((type(val) == 'number') or (type(val) == 'boolean')) then - val_str[#val_str + 1] = tostring(val) - val_str[#val_str + 1] = ',' - tbl_str[#tbl_str + 1] = table.concat(ind_str) - tbl_str[#tbl_str + 1] = table.concat(val_str) - elseif type(val) == 'string' then - val_str[#val_str + 1] = routines.utils.basicSerialize(val) - val_str[#val_str + 1] = ',' - tbl_str[#tbl_str + 1] = table.concat(ind_str) - tbl_str[#tbl_str + 1] = table.concat(val_str) - elseif type(val) == 'nil' then -- won't ever happen, right? - val_str[#val_str + 1] = 'nil,' - tbl_str[#tbl_str + 1] = table.concat(ind_str) - tbl_str[#tbl_str + 1] = table.concat(val_str) - elseif type(val) == 'table' then - if ind == "__index" then - -- tbl_str[#tbl_str + 1] = "__index" - -- tbl_str[#tbl_str + 1] = ',' --I think this is right, I just added it - else - - val_str[#val_str + 1] = _Serialize(val) - val_str[#val_str + 1] = ',' --I think this is right, I just added it - tbl_str[#tbl_str + 1] = table.concat(ind_str) - tbl_str[#tbl_str + 1] = table.concat(val_str) - end - elseif type(val) == 'function' then - -- tbl_str[#tbl_str + 1] = "function " .. tostring(ind) - -- tbl_str[#tbl_str + 1] = ',' --I think this is right, I just added it - else --- env.info('unable to serialize value type ' .. routines.utils.basicSerialize(type(val)) .. ' at index ' .. tostring(ind)) --- env.info( debug.traceback() ) - end - - end - tbl_str[#tbl_str + 1] = '}' - return table.concat(tbl_str) - else - return tostring(tbl) - end - end - - local objectreturn = _Serialize(tbl) - return objectreturn -end - ---porting in Slmod's "safestring" basic serialize -routines.utils.basicSerialize = function(s) - if s == nil then - return "\"\"" - else - if ((type(s) == 'number') or (type(s) == 'boolean') or (type(s) == 'function') or (type(s) == 'table') or (type(s) == 'userdata') ) then - return tostring(s) - elseif type(s) == 'string' then - s = string.format('%q', s) - return s - end - end -end - - -routines.utils.toDegree = function(angle) - return angle*180/math.pi -end - -routines.utils.toRadian = function(angle) - return angle*math.pi/180 -end - -routines.utils.metersToNM = function(meters) - return meters/1852 -end - -routines.utils.metersToFeet = function(meters) - return meters/0.3048 -end - -routines.utils.NMToMeters = function(NM) - return NM*1852 -end - -routines.utils.feetToMeters = function(feet) - return feet*0.3048 -end - -routines.utils.mpsToKnots = function(mps) - return mps*3600/1852 -end - -routines.utils.mpsToKmph = function(mps) - return mps*3.6 -end - -routines.utils.knotsToMps = function(knots) - return knots*1852/3600 -end - -routines.utils.kmphToMps = function(kmph) - return kmph/3.6 -end - -function routines.utils.makeVec2(Vec3) - if Vec3.z then - return {x = Vec3.x, y = Vec3.z} - else - return {x = Vec3.x, y = Vec3.y} -- it was actually already vec2. - end -end - -function routines.utils.makeVec3(Vec2, y) - if not Vec2.z then - if not y then - y = 0 - end - return {x = Vec2.x, y = y, z = Vec2.y} - else - return {x = Vec2.x, y = Vec2.y, z = Vec2.z} -- it was already Vec3, actually. - end -end - -function routines.utils.makeVec3GL(Vec2, offset) - local adj = offset or 0 - - if not Vec2.z then - return {x = Vec2.x, y = (land.getHeight(Vec2) + adj), z = Vec2.y} - else - return {x = Vec2.x, y = (land.getHeight({x = Vec2.x, y = Vec2.z}) + adj), z = Vec2.z} - end -end - -routines.utils.zoneToVec3 = function(zone) - local new = {} - if type(zone) == 'table' and zone.point then - new.x = zone.point.x - new.y = zone.point.y - new.z = zone.point.z - return new - elseif type(zone) == 'string' then - zone = trigger.misc.getZone(zone) - if zone then - new.x = zone.point.x - new.y = zone.point.y - new.z = zone.point.z - return new - end - end -end - --- gets heading-error corrected direction from point along vector vec. -function routines.utils.getDir(vec, point) - local dir = math.atan2(vec.z, vec.x) - dir = dir + routines.getNorthCorrection(point) - if dir < 0 then - dir = dir + 2*math.pi -- put dir in range of 0 to 2*pi - end - return dir -end - --- gets distance in meters between two points (2 dimensional) -function routines.utils.get2DDist(point1, point2) - point1 = routines.utils.makeVec3(point1) - point2 = routines.utils.makeVec3(point2) - return routines.vec.mag({x = point1.x - point2.x, y = 0, z = point1.z - point2.z}) -end - --- gets distance in meters between two points (3 dimensional) -function routines.utils.get3DDist(point1, point2) - return routines.vec.mag({x = point1.x - point2.x, y = point1.y - point2.y, z = point1.z - point2.z}) -end - - - --- From http://lua-users.org/wiki/SimpleRound --- use negative idp for rounding ahead of decimal place, positive for rounding after decimal place -routines.utils.round = function(num, idp) - local mult = 10^(idp or 0) - return math.floor(num * mult + 0.5) / mult -end - --- porting in Slmod's dostring -routines.utils.dostring = function(s) - local f, err = loadstring(s) - if f then - return true, f() - else - return false, err - end -end - - ---3D Vector manipulation -routines.vec = {} - -routines.vec.add = function(vec1, vec2) - return {x = vec1.x + vec2.x, y = vec1.y + vec2.y, z = vec1.z + vec2.z} -end - -routines.vec.sub = function(vec1, vec2) - return {x = vec1.x - vec2.x, y = vec1.y - vec2.y, z = vec1.z - vec2.z} -end - -routines.vec.scalarMult = function(vec, mult) - return {x = vec.x*mult, y = vec.y*mult, z = vec.z*mult} -end - -routines.vec.scalar_mult = routines.vec.scalarMult - -routines.vec.dp = function(vec1, vec2) - return vec1.x*vec2.x + vec1.y*vec2.y + vec1.z*vec2.z -end - -routines.vec.cp = function(vec1, vec2) - return { x = vec1.y*vec2.z - vec1.z*vec2.y, y = vec1.z*vec2.x - vec1.x*vec2.z, z = vec1.x*vec2.y - vec1.y*vec2.x} -end - -routines.vec.mag = function(vec) - return (vec.x^2 + vec.y^2 + vec.z^2)^0.5 -end - -routines.vec.getUnitVec = function(vec) - local mag = routines.vec.mag(vec) - return { x = vec.x/mag, y = vec.y/mag, z = vec.z/mag } -end - -routines.vec.rotateVec2 = function(vec2, theta) - return { x = vec2.x*math.cos(theta) - vec2.y*math.sin(theta), y = vec2.x*math.sin(theta) + vec2.y*math.cos(theta)} -end ---------------------------------------------------------------------------------------------------------------------------- - - - - --- acc- the accuracy of each easting/northing. 0, 1, 2, 3, 4, or 5. -routines.tostringMGRS = function(MGRS, acc) - if acc == 0 then - return MGRS.UTMZone .. ' ' .. MGRS.MGRSDigraph - else - return MGRS.UTMZone .. ' ' .. MGRS.MGRSDigraph .. ' ' .. string.format('%0' .. acc .. 'd', routines.utils.round(MGRS.Easting/(10^(5-acc)), 0)) - .. ' ' .. string.format('%0' .. acc .. 'd', routines.utils.round(MGRS.Northing/(10^(5-acc)), 0)) - end -end - ---[[acc: -in DM: decimal point of minutes. -In DMS: decimal point of seconds. -position after the decimal of the least significant digit: -So: -42.32 - acc of 2. -]] -routines.tostringLL = function(lat, lon, acc, DMS) - - local latHemi, lonHemi - if lat > 0 then - latHemi = 'N' - else - latHemi = 'S' - end - - if lon > 0 then - lonHemi = 'E' - else - lonHemi = 'W' - end - - lat = math.abs(lat) - lon = math.abs(lon) - - local latDeg = math.floor(lat) - local latMin = (lat - latDeg)*60 - - local lonDeg = math.floor(lon) - local lonMin = (lon - lonDeg)*60 - - if DMS then -- degrees, minutes, and seconds. - local oldLatMin = latMin - latMin = math.floor(latMin) - local latSec = routines.utils.round((oldLatMin - latMin)*60, acc) - - local oldLonMin = lonMin - lonMin = math.floor(lonMin) - local lonSec = routines.utils.round((oldLonMin - lonMin)*60, acc) - - if latSec == 60 then - latSec = 0 - latMin = latMin + 1 - end - - if lonSec == 60 then - lonSec = 0 - lonMin = lonMin + 1 - end - - local secFrmtStr -- create the formatting string for the seconds place - if acc <= 0 then -- no decimal place. - secFrmtStr = '%02d' - else - local width = 3 + acc -- 01.310 - that's a width of 6, for example. - secFrmtStr = '%0' .. width .. '.' .. acc .. 'f' - end - - return string.format('%02d', latDeg) .. ' ' .. string.format('%02d', latMin) .. '\' ' .. string.format(secFrmtStr, latSec) .. '"' .. latHemi .. ' ' - .. string.format('%02d', lonDeg) .. ' ' .. string.format('%02d', lonMin) .. '\' ' .. string.format(secFrmtStr, lonSec) .. '"' .. lonHemi - - else -- degrees, decimal minutes. - latMin = routines.utils.round(latMin, acc) - lonMin = routines.utils.round(lonMin, acc) - - if latMin == 60 then - latMin = 0 - latDeg = latDeg + 1 - end - - if lonMin == 60 then - lonMin = 0 - lonDeg = lonDeg + 1 - end - - local minFrmtStr -- create the formatting string for the minutes place - if acc <= 0 then -- no decimal place. - minFrmtStr = '%02d' - else - local width = 3 + acc -- 01.310 - that's a width of 6, for example. - minFrmtStr = '%0' .. width .. '.' .. acc .. 'f' - end - - return string.format('%02d', latDeg) .. ' ' .. string.format(minFrmtStr, latMin) .. '\'' .. latHemi .. ' ' - .. string.format('%02d', lonDeg) .. ' ' .. string.format(minFrmtStr, lonMin) .. '\'' .. lonHemi - - end -end - ---[[ required: az - radian - required: dist - meters - optional: alt - meters (set to false or nil if you don't want to use it). - optional: metric - set true to get dist and alt in km and m. - precision will always be nearest degree and NM or km.]] -routines.tostringBR = function(az, dist, alt, metric) - az = routines.utils.round(routines.utils.toDegree(az), 0) - - if metric then - dist = routines.utils.round(dist/1000, 2) - else - dist = routines.utils.round(routines.utils.metersToNM(dist), 2) - end - - local s = string.format('%03d', az) .. ' for ' .. dist - - if alt then - if metric then - s = s .. ' at ' .. routines.utils.round(alt, 0) - else - s = s .. ' at ' .. routines.utils.round(routines.utils.metersToFeet(alt), 0) - end - end - return s -end - -routines.getNorthCorrection = function(point) --gets the correction needed for true north - if not point.z then --Vec2; convert to Vec3 - point.z = point.y - point.y = 0 - end - local lat, lon = coord.LOtoLL(point) - local north_posit = coord.LLtoLO(lat + 1, lon) - return math.atan2(north_posit.z - point.z, north_posit.x - point.x) -end - - --- the main area -do - -- THE MAIN FUNCTION -- Accessed 100 times/sec. - routines.main = function() - timer.scheduleFunction(routines.main, {}, timer.getTime() + 2) --reschedule first in case of Lua error - ---------------------------------------------------------------------------------------------------------- - --area to add new stuff in - - routines.do_scheduled_functions() - end -- end of routines.main - - timer.scheduleFunction(routines.main, {}, timer.getTime() + 2) - -end - - -do - local idNum = 0 - - --Simplified event handler - routines.addEventHandler = function(f) --id is optional! - local handler = {} - idNum = idNum + 1 - handler.id = idNum - handler.f = f - handler.onEvent = function(self, event) - self.f(event) - end - world.addEventHandler(handler) - end - - routines.removeEventHandler = function(id) - for key, handler in pairs(world.eventHandlers) do - if handler.id and handler.id == id then - world.eventHandlers[key] = nil - return true - end - end - return false - end -end - --- need to return a Vec3 or Vec2? -function routines.getRandPointInCircle(point, radius, innerRadius) - local theta = 2*math.pi*math.random() - local rad = math.random() + math.random() - if rad > 1 then - rad = 2 - rad - end - - local radMult - if innerRadius and innerRadius <= radius then - radMult = (radius - innerRadius)*rad + innerRadius - else - radMult = radius*rad - end - - if not point.z then --might as well work with vec2/3 - point.z = point.y - end - - local rndCoord - if radius > 0 then - rndCoord = {x = math.cos(theta)*radMult + point.x, y = math.sin(theta)*radMult + point.z} - else - rndCoord = {x = point.x, y = point.z} - end - return rndCoord -end - -routines.goRoute = function(group, path) - local misTask = { - id = 'Mission', - params = { - route = { - points = routines.utils.deepCopy(path), - }, - }, - } - if type(group) == 'string' then - group = Group.getByName(group) - end - local groupCon = group:getController() - if groupCon then - groupCon:setTask(misTask) - return true - end - - Controller.setTask(groupCon, misTask) - return false -end - - --- Useful atomic functions from mist, ported. - -routines.ground = {} -routines.fixedWing = {} -routines.heli = {} - -routines.ground.buildWP = function(point, overRideForm, overRideSpeed) - - local wp = {} - wp.x = point.x - - if point.z then - wp.y = point.z - else - wp.y = point.y - end - local form, speed - - if point.speed and not overRideSpeed then - wp.speed = point.speed - elseif type(overRideSpeed) == 'number' then - wp.speed = overRideSpeed - else - wp.speed = routines.utils.kmphToMps(20) - end - - if point.form and not overRideForm then - form = point.form - else - form = overRideForm - end - - if not form then - wp.action = 'Cone' - else - form = string.lower(form) - if form == 'off_road' or form == 'off road' then - wp.action = 'Off Road' - elseif form == 'on_road' or form == 'on road' then - wp.action = 'On Road' - elseif form == 'rank' or form == 'line_abrest' or form == 'line abrest' or form == 'lineabrest'then - wp.action = 'Rank' - elseif form == 'cone' then - wp.action = 'Cone' - elseif form == 'diamond' then - wp.action = 'Diamond' - elseif form == 'vee' then - wp.action = 'Vee' - elseif form == 'echelon_left' or form == 'echelon left' or form == 'echelonl' then - wp.action = 'EchelonL' - elseif form == 'echelon_right' or form == 'echelon right' or form == 'echelonr' then - wp.action = 'EchelonR' - else - wp.action = 'Cone' -- if nothing matched - end - end - - wp.type = 'Turning Point' - - return wp - -end - -routines.fixedWing.buildWP = function(point, WPtype, speed, alt, altType) - - local wp = {} - wp.x = point.x - - if point.z then - wp.y = point.z - else - wp.y = point.y - end - - if alt and type(alt) == 'number' then - wp.alt = alt - else - wp.alt = 2000 - end - - if altType then - altType = string.lower(altType) - if altType == 'radio' or 'agl' then - wp.alt_type = 'RADIO' - elseif altType == 'baro' or 'asl' then - wp.alt_type = 'BARO' - end - else - wp.alt_type = 'RADIO' - end - - if point.speed then - speed = point.speed - end - - if point.type then - WPtype = point.type - end - - if not speed then - wp.speed = routines.utils.kmphToMps(500) - else - wp.speed = speed - end - - if not WPtype then - wp.action = 'Turning Point' - else - WPtype = string.lower(WPtype) - if WPtype == 'flyover' or WPtype == 'fly over' or WPtype == 'fly_over' then - wp.action = 'Fly Over Point' - elseif WPtype == 'turningpoint' or WPtype == 'turning point' or WPtype == 'turning_point' then - wp.action = 'Turning Point' - else - wp.action = 'Turning Point' - end - end - - wp.type = 'Turning Point' - return wp -end - -routines.heli.buildWP = function(point, WPtype, speed, alt, altType) - - local wp = {} - wp.x = point.x - - if point.z then - wp.y = point.z - else - wp.y = point.y - end - - if alt and type(alt) == 'number' then - wp.alt = alt - else - wp.alt = 500 - end - - if altType then - altType = string.lower(altType) - if altType == 'radio' or 'agl' then - wp.alt_type = 'RADIO' - elseif altType == 'baro' or 'asl' then - wp.alt_type = 'BARO' - end - else - wp.alt_type = 'RADIO' - end - - if point.speed then - speed = point.speed - end - - if point.type then - WPtype = point.type - end - - if not speed then - wp.speed = routines.utils.kmphToMps(200) - else - wp.speed = speed - end - - if not WPtype then - wp.action = 'Turning Point' - else - WPtype = string.lower(WPtype) - if WPtype == 'flyover' or WPtype == 'fly over' or WPtype == 'fly_over' then - wp.action = 'Fly Over Point' - elseif WPtype == 'turningpoint' or WPtype == 'turning point' or WPtype == 'turning_point' then - wp.action = 'Turning Point' - else - wp.action = 'Turning Point' - end - end - - wp.type = 'Turning Point' - return wp -end - -routines.groupToRandomPoint = function(vars) - local group = vars.group --Required - local point = vars.point --required - local radius = vars.radius or 0 - local innerRadius = vars.innerRadius - local form = vars.form or 'Cone' - local heading = vars.heading or math.random()*2*math.pi - local headingDegrees = vars.headingDegrees - local speed = vars.speed or routines.utils.kmphToMps(20) - - - local useRoads - if not vars.disableRoads then - useRoads = true - else - useRoads = false - end - - local path = {} - - if headingDegrees then - heading = headingDegrees*math.pi/180 - end - - if heading >= 2*math.pi then - heading = heading - 2*math.pi - end - - local rndCoord = routines.getRandPointInCircle(point, radius, innerRadius) - - local offset = {} - local posStart = routines.getLeadPos(group) - - offset.x = routines.utils.round(math.sin(heading - (math.pi/2)) * 50 + rndCoord.x, 3) - offset.z = routines.utils.round(math.cos(heading + (math.pi/2)) * 50 + rndCoord.y, 3) - path[#path + 1] = routines.ground.buildWP(posStart, form, speed) - - - if useRoads == true and ((point.x - posStart.x)^2 + (point.z - posStart.z)^2)^0.5 > radius * 1.3 then - path[#path + 1] = routines.ground.buildWP({['x'] = posStart.x + 11, ['z'] = posStart.z + 11}, 'off_road', speed) - path[#path + 1] = routines.ground.buildWP(posStart, 'on_road', speed) - path[#path + 1] = routines.ground.buildWP(offset, 'on_road', speed) - else - path[#path + 1] = routines.ground.buildWP({['x'] = posStart.x + 25, ['z'] = posStart.z + 25}, form, speed) - end - - path[#path + 1] = routines.ground.buildWP(offset, form, speed) - path[#path + 1] = routines.ground.buildWP(rndCoord, form, speed) - - routines.goRoute(group, path) - - return -end - -routines.groupRandomDistSelf = function(gpData, dist, form, heading, speed) - local pos = routines.getLeadPos(gpData) - local fakeZone = {} - fakeZone.radius = dist or math.random(300, 1000) - fakeZone.point = {x = pos.x, y, pos.y, z = pos.z} - routines.groupToRandomZone(gpData, fakeZone, form, heading, speed) - - return -end - -routines.groupToRandomZone = function(gpData, zone, form, heading, speed) - if type(gpData) == 'string' then - gpData = Group.getByName(gpData) - end - - if type(zone) == 'string' then - zone = trigger.misc.getZone(zone) - elseif type(zone) == 'table' and not zone.radius then - zone = trigger.misc.getZone(zone[math.random(1, #zone)]) - end - - if speed then - speed = routines.utils.kmphToMps(speed) - end - - local vars = {} - vars.group = gpData - vars.radius = zone.radius - vars.form = form - vars.headingDegrees = heading - vars.speed = speed - vars.point = routines.utils.zoneToVec3(zone) - - routines.groupToRandomPoint(vars) - - return -end - -routines.isTerrainValid = function(coord, terrainTypes) -- vec2/3 and enum or table of acceptable terrain types - if coord.z then - coord.y = coord.z - end - local typeConverted = {} - - if type(terrainTypes) == 'string' then -- if its a string it does this check - for constId, constData in pairs(land.SurfaceType) do - if string.lower(constId) == string.lower(terrainTypes) or string.lower(constData) == string.lower(terrainTypes) then - table.insert(typeConverted, constId) - end - end - elseif type(terrainTypes) == 'table' then -- if its a table it does this check - for typeId, typeData in pairs(terrainTypes) do - for constId, constData in pairs(land.SurfaceType) do - if string.lower(constId) == string.lower(typeData) or string.lower(constData) == string.lower(typeId) then - table.insert(typeConverted, constId) - end - end - end - end - for validIndex, validData in pairs(typeConverted) do - if land.getSurfaceType(coord) == land.SurfaceType[validData] then - return true - end - end - return false -end - -routines.groupToPoint = function(gpData, point, form, heading, speed, useRoads) - if type(point) == 'string' then - point = trigger.misc.getZone(point) - end - if speed then - speed = routines.utils.kmphToMps(speed) - end - - local vars = {} - vars.group = gpData - vars.form = form - vars.headingDegrees = heading - vars.speed = speed - vars.disableRoads = useRoads - vars.point = routines.utils.zoneToVec3(point) - routines.groupToRandomPoint(vars) - - return -end - - -routines.getLeadPos = function(group) - if type(group) == 'string' then -- group name - group = Group.getByName(group) - end - - local units = group:getUnits() - - local leader = units[1] - if not leader then -- SHOULD be good, but if there is a bug, this code future-proofs it then. - local lowestInd = math.huge - for ind, unit in pairs(units) do - if ind < lowestInd then - lowestInd = ind - leader = unit - end - end - end - if leader and Unit.isExist(leader) then -- maybe a little too paranoid now... - return leader:getPosition().p - end -end - ---[[ vars for routines.getMGRSString: -vars.units - table of unit names (NOT unitNameTable- maybe this should change). -vars.acc - integer between 0 and 5, inclusive -]] -routines.getMGRSString = function(vars) - local units = vars.units - local acc = vars.acc or 5 - local avgPos = routines.getAvgPos(units) - if avgPos then - return routines.tostringMGRS(coord.LLtoMGRS(coord.LOtoLL(avgPos)), acc) - end -end - ---[[ vars for routines.getLLString -vars.units - table of unit names (NOT unitNameTable- maybe this should change). -vars.acc - integer, number of numbers after decimal place -vars.DMS - if true, output in degrees, minutes, seconds. Otherwise, output in degrees, minutes. - - -]] -routines.getLLString = function(vars) - local units = vars.units - local acc = vars.acc or 3 - local DMS = vars.DMS - local avgPos = routines.getAvgPos(units) - if avgPos then - local lat, lon = coord.LOtoLL(avgPos) - return routines.tostringLL(lat, lon, acc, DMS) - end -end - ---[[ -vars.zone - table of a zone name. -vars.ref - vec3 ref point, maybe overload for vec2 as well? -vars.alt - boolean, if used, includes altitude in string -vars.metric - boolean, gives distance in km instead of NM. -]] -routines.getBRStringZone = function(vars) - local zone = trigger.misc.getZone( vars.zone ) - local ref = routines.utils.makeVec3(vars.ref, 0) -- turn it into Vec3 if it is not already. - local alt = vars.alt - local metric = vars.metric - if zone then - local vec = {x = zone.point.x - ref.x, y = zone.point.y - ref.y, z = zone.point.z - ref.z} - local dir = routines.utils.getDir(vec, ref) - local dist = routines.utils.get2DDist(zone.point, ref) - if alt then - alt = zone.y - end - return routines.tostringBR(dir, dist, alt, metric) - else - env.info( 'routines.getBRStringZone: error: zone is nil' ) - end -end - ---[[ -vars.units- table of unit names (NOT unitNameTable- maybe this should change). -vars.ref - vec3 ref point, maybe overload for vec2 as well? -vars.alt - boolean, if used, includes altitude in string -vars.metric - boolean, gives distance in km instead of NM. -]] -routines.getBRString = function(vars) - local units = vars.units - local ref = routines.utils.makeVec3(vars.ref, 0) -- turn it into Vec3 if it is not already. - local alt = vars.alt - local metric = vars.metric - local avgPos = routines.getAvgPos(units) - if avgPos then - local vec = {x = avgPos.x - ref.x, y = avgPos.y - ref.y, z = avgPos.z - ref.z} - local dir = routines.utils.getDir(vec, ref) - local dist = routines.utils.get2DDist(avgPos, ref) - if alt then - alt = avgPos.y - end - return routines.tostringBR(dir, dist, alt, metric) - end -end - - --- Returns the Vec3 coordinates of the average position of the concentration of units most in the heading direction. ---[[ vars for routines.getLeadingPos: -vars.units - table of unit names -vars.heading - direction -vars.radius - number -vars.headingDegrees - boolean, switches heading to degrees -]] -routines.getLeadingPos = function(vars) - local units = vars.units - local heading = vars.heading - local radius = vars.radius - if vars.headingDegrees then - heading = routines.utils.toRadian(vars.headingDegrees) - end - - local unitPosTbl = {} - for i = 1, #units do - local unit = Unit.getByName(units[i]) - if unit and unit:isExist() then - unitPosTbl[#unitPosTbl + 1] = unit:getPosition().p - end - end - if #unitPosTbl > 0 then -- one more more units found. - -- first, find the unit most in the heading direction - local maxPos = -math.huge - - local maxPosInd -- maxPos - the furthest in direction defined by heading; maxPosInd = - for i = 1, #unitPosTbl do - local rotatedVec2 = routines.vec.rotateVec2(routines.utils.makeVec2(unitPosTbl[i]), heading) - if (not maxPos) or maxPos < rotatedVec2.x then - maxPos = rotatedVec2.x - maxPosInd = i - end - end - - --now, get all the units around this unit... - local avgPos - if radius then - local maxUnitPos = unitPosTbl[maxPosInd] - local avgx, avgy, avgz, totNum = 0, 0, 0, 0 - for i = 1, #unitPosTbl do - if routines.utils.get2DDist(maxUnitPos, unitPosTbl[i]) <= radius then - avgx = avgx + unitPosTbl[i].x - avgy = avgy + unitPosTbl[i].y - avgz = avgz + unitPosTbl[i].z - totNum = totNum + 1 - end - end - avgPos = { x = avgx/totNum, y = avgy/totNum, z = avgz/totNum} - else - avgPos = unitPosTbl[maxPosInd] - end - - return avgPos - end -end - - ---[[ vars for routines.getLeadingMGRSString: -vars.units - table of unit names -vars.heading - direction -vars.radius - number -vars.headingDegrees - boolean, switches heading to degrees -vars.acc - number, 0 to 5. -]] -routines.getLeadingMGRSString = function(vars) - local pos = routines.getLeadingPos(vars) - if pos then - local acc = vars.acc or 5 - return routines.tostringMGRS(coord.LLtoMGRS(coord.LOtoLL(pos)), acc) - end -end - ---[[ vars for routines.getLeadingLLString: -vars.units - table of unit names -vars.heading - direction, number -vars.radius - number -vars.headingDegrees - boolean, switches heading to degrees -vars.acc - number of digits after decimal point (can be negative) -vars.DMS - boolean, true if you want DMS. -]] -routines.getLeadingLLString = function(vars) - local pos = routines.getLeadingPos(vars) - if pos then - local acc = vars.acc or 3 - local DMS = vars.DMS - local lat, lon = coord.LOtoLL(pos) - return routines.tostringLL(lat, lon, acc, DMS) - end -end - - - ---[[ vars for routines.getLeadingBRString: -vars.units - table of unit names -vars.heading - direction, number -vars.radius - number -vars.headingDegrees - boolean, switches heading to degrees -vars.metric - boolean, if true, use km instead of NM. -vars.alt - boolean, if true, include altitude. -vars.ref - vec3/vec2 reference point. -]] -routines.getLeadingBRString = function(vars) - local pos = routines.getLeadingPos(vars) - if pos then - local ref = vars.ref - local alt = vars.alt - local metric = vars.metric - - local vec = {x = pos.x - ref.x, y = pos.y - ref.y, z = pos.z - ref.z} - local dir = routines.utils.getDir(vec, ref) - local dist = routines.utils.get2DDist(pos, ref) - if alt then - alt = pos.y - end - return routines.tostringBR(dir, dist, alt, metric) - end -end - ---[[ vars for routines.message.add - vars.text = 'Hello World' - vars.displayTime = 20 - vars.msgFor = {coa = {'red'}, countries = {'Ukraine', 'Georgia'}, unitTypes = {'A-10C'}} - -]] - ---[[ vars for routines.msgMGRS -vars.units - table of unit names (NOT unitNameTable- maybe this should change). -vars.acc - integer between 0 and 5, inclusive -vars.text - text in the message -vars.displayTime - self explanatory -vars.msgFor - scope -]] -routines.msgMGRS = function(vars) - local units = vars.units - local acc = vars.acc - local text = vars.text - local displayTime = vars.displayTime - local msgFor = vars.msgFor - - local s = routines.getMGRSString{units = units, acc = acc} - local newText - if string.find(text, '%%s') then -- look for %s - newText = string.format(text, s) -- insert the coordinates into the message - else -- else, just append to the end. - newText = text .. s - end - - routines.message.add{ - text = newText, - displayTime = displayTime, - msgFor = msgFor - } -end - ---[[ vars for routines.msgLL -vars.units - table of unit names (NOT unitNameTable- maybe this should change) (Yes). -vars.acc - integer, number of numbers after decimal place -vars.DMS - if true, output in degrees, minutes, seconds. Otherwise, output in degrees, minutes. -vars.text - text in the message -vars.displayTime - self explanatory -vars.msgFor - scope -]] -routines.msgLL = function(vars) - local units = vars.units -- technically, I don't really need to do this, but it helps readability. - local acc = vars.acc - local DMS = vars.DMS - local text = vars.text - local displayTime = vars.displayTime - local msgFor = vars.msgFor - - local s = routines.getLLString{units = units, acc = acc, DMS = DMS} - local newText - if string.find(text, '%%s') then -- look for %s - newText = string.format(text, s) -- insert the coordinates into the message - else -- else, just append to the end. - newText = text .. s - end - - routines.message.add{ - text = newText, - displayTime = displayTime, - msgFor = msgFor - } - -end - - ---[[ -vars.units- table of unit names (NOT unitNameTable- maybe this should change). -vars.ref - vec3 ref point, maybe overload for vec2 as well? -vars.alt - boolean, if used, includes altitude in string -vars.metric - boolean, gives distance in km instead of NM. -vars.text - text of the message -vars.displayTime -vars.msgFor - scope -]] -routines.msgBR = function(vars) - local units = vars.units -- technically, I don't really need to do this, but it helps readability. - local ref = vars.ref -- vec2/vec3 will be handled in routines.getBRString - local alt = vars.alt - local metric = vars.metric - local text = vars.text - local displayTime = vars.displayTime - local msgFor = vars.msgFor - - local s = routines.getBRString{units = units, ref = ref, alt = alt, metric = metric} - local newText - if string.find(text, '%%s') then -- look for %s - newText = string.format(text, s) -- insert the coordinates into the message - else -- else, just append to the end. - newText = text .. s - end - - routines.message.add{ - text = newText, - displayTime = displayTime, - msgFor = msgFor - } - -end - - --------------------------------------------------------------------------------------------- --- basically, just sub-types of routines.msgBR... saves folks the work of getting the ref point. ---[[ -vars.units- table of unit names (NOT unitNameTable- maybe this should change). -vars.ref - string red, blue -vars.alt - boolean, if used, includes altitude in string -vars.metric - boolean, gives distance in km instead of NM. -vars.text - text of the message -vars.displayTime -vars.msgFor - scope -]] -routines.msgBullseye = function(vars) - if string.lower(vars.ref) == 'red' then - vars.ref = routines.DBs.missionData.bullseye.red - routines.msgBR(vars) - elseif string.lower(vars.ref) == 'blue' then - vars.ref = routines.DBs.missionData.bullseye.blue - routines.msgBR(vars) - end -end - ---[[ -vars.units- table of unit names (NOT unitNameTable- maybe this should change). -vars.ref - unit name of reference point -vars.alt - boolean, if used, includes altitude in string -vars.metric - boolean, gives distance in km instead of NM. -vars.text - text of the message -vars.displayTime -vars.msgFor - scope -]] - -routines.msgBRA = function(vars) - if Unit.getByName(vars.ref) then - vars.ref = Unit.getByName(vars.ref):getPosition().p - if not vars.alt then - vars.alt = true - end - routines.msgBR(vars) - end -end --------------------------------------------------------------------------------------------- - ---[[ vars for routines.msgLeadingMGRS: -vars.units - table of unit names -vars.heading - direction -vars.radius - number -vars.headingDegrees - boolean, switches heading to degrees (optional) -vars.acc - number, 0 to 5. -vars.text - text of the message -vars.displayTime -vars.msgFor - scope -]] -routines.msgLeadingMGRS = function(vars) - local units = vars.units -- technically, I don't really need to do this, but it helps readability. - local heading = vars.heading - local radius = vars.radius - local headingDegrees = vars.headingDegrees - local acc = vars.acc - local text = vars.text - local displayTime = vars.displayTime - local msgFor = vars.msgFor - - local s = routines.getLeadingMGRSString{units = units, heading = heading, radius = radius, headingDegrees = headingDegrees, acc = acc} - local newText - if string.find(text, '%%s') then -- look for %s - newText = string.format(text, s) -- insert the coordinates into the message - else -- else, just append to the end. - newText = text .. s - end - - routines.message.add{ - text = newText, - displayTime = displayTime, - msgFor = msgFor - } - - -end ---[[ vars for routines.msgLeadingLL: -vars.units - table of unit names -vars.heading - direction, number -vars.radius - number -vars.headingDegrees - boolean, switches heading to degrees (optional) -vars.acc - number of digits after decimal point (can be negative) -vars.DMS - boolean, true if you want DMS. (optional) -vars.text - text of the message -vars.displayTime -vars.msgFor - scope -]] -routines.msgLeadingLL = function(vars) - local units = vars.units -- technically, I don't really need to do this, but it helps readability. - local heading = vars.heading - local radius = vars.radius - local headingDegrees = vars.headingDegrees - local acc = vars.acc - local DMS = vars.DMS - local text = vars.text - local displayTime = vars.displayTime - local msgFor = vars.msgFor - - local s = routines.getLeadingLLString{units = units, heading = heading, radius = radius, headingDegrees = headingDegrees, acc = acc, DMS = DMS} - local newText - if string.find(text, '%%s') then -- look for %s - newText = string.format(text, s) -- insert the coordinates into the message - else -- else, just append to the end. - newText = text .. s - end - - routines.message.add{ - text = newText, - displayTime = displayTime, - msgFor = msgFor - } - -end - ---[[ -vars.units - table of unit names -vars.heading - direction, number -vars.radius - number -vars.headingDegrees - boolean, switches heading to degrees (optional) -vars.metric - boolean, if true, use km instead of NM. (optional) -vars.alt - boolean, if true, include altitude. (optional) -vars.ref - vec3/vec2 reference point. -vars.text - text of the message -vars.displayTime -vars.msgFor - scope -]] -routines.msgLeadingBR = function(vars) - local units = vars.units -- technically, I don't really need to do this, but it helps readability. - local heading = vars.heading - local radius = vars.radius - local headingDegrees = vars.headingDegrees - local metric = vars.metric - local alt = vars.alt - local ref = vars.ref -- vec2/vec3 will be handled in routines.getBRString - local text = vars.text - local displayTime = vars.displayTime - local msgFor = vars.msgFor - - local s = routines.getLeadingBRString{units = units, heading = heading, radius = radius, headingDegrees = headingDegrees, metric = metric, alt = alt, ref = ref} - local newText - if string.find(text, '%%s') then -- look for %s - newText = string.format(text, s) -- insert the coordinates into the message - else -- else, just append to the end. - newText = text .. s - end - - routines.message.add{ - text = newText, - displayTime = displayTime, - msgFor = msgFor - } -end - - -function spairs(t, order) - -- collect the keys - local keys = {} - for k in pairs(t) do keys[#keys+1] = k end - - -- if order function given, sort by it by passing the table and keys a, b, - -- otherwise just sort the keys - if order then - table.sort(keys, function(a,b) return order(t, a, b) end) - else - table.sort(keys) - end - - -- return the iterator function - local i = 0 - return function() - i = i + 1 - if keys[i] then - return keys[i], t[keys[i]] - end - end -end - - -function routines.IsPartOfGroupInZones( CargoGroup, LandingZones ) ---trace.f() - - local CurrentZoneID = nil - - if CargoGroup then - local CargoUnits = CargoGroup:getUnits() - for CargoUnitID, CargoUnit in pairs( CargoUnits ) do - if CargoUnit and CargoUnit:getLife() >= 1.0 then - CurrentZoneID = routines.IsUnitInZones( CargoUnit, LandingZones ) - if CurrentZoneID then - break - end - end - end - end - ---trace.r( "", "", { CurrentZoneID } ) - return CurrentZoneID -end - - - -function routines.IsUnitInZones( TransportUnit, LandingZones ) ---trace.f("", "routines.IsUnitInZones" ) - - local TransportZoneResult = nil - local TransportZonePos = nil - local TransportZone = nil - - -- fill-up some local variables to support further calculations to determine location of units within the zone. - if TransportUnit then - local TransportUnitPos = TransportUnit:getPosition().p - if type( LandingZones ) == "table" then - for LandingZoneID, LandingZoneName in pairs( LandingZones ) do - TransportZone = trigger.misc.getZone( LandingZoneName ) - if TransportZone then - TransportZonePos = {radius = TransportZone.radius, x = TransportZone.point.x, y = TransportZone.point.y, z = TransportZone.point.z} - if ((( TransportUnitPos.x - TransportZonePos.x)^2 + (TransportUnitPos.z - TransportZonePos.z)^2)^0.5 <= TransportZonePos.radius) then - TransportZoneResult = LandingZoneID - break - end - end - end - else - TransportZone = trigger.misc.getZone( LandingZones ) - TransportZonePos = {radius = TransportZone.radius, x = TransportZone.point.x, y = TransportZone.point.y, z = TransportZone.point.z} - if ((( TransportUnitPos.x - TransportZonePos.x)^2 + (TransportUnitPos.z - TransportZonePos.z)^2)^0.5 <= TransportZonePos.radius) then - TransportZoneResult = 1 - end - end - if TransportZoneResult then - --trace.i( "routines", "TransportZone:" .. TransportZoneResult ) - else - --trace.i( "routines", "TransportZone:nil logic" ) - end - return TransportZoneResult - else - --trace.i( "routines", "TransportZone:nil hard" ) - return nil - end -end - -function routines.IsUnitNearZonesRadius( TransportUnit, LandingZones, ZoneRadius ) ---trace.f("", "routines.IsUnitInZones" ) - - local TransportZoneResult = nil - local TransportZonePos = nil - local TransportZone = nil - - -- fill-up some local variables to support further calculations to determine location of units within the zone. - if TransportUnit then - local TransportUnitPos = TransportUnit:getPosition().p - if type( LandingZones ) == "table" then - for LandingZoneID, LandingZoneName in pairs( LandingZones ) do - TransportZone = trigger.misc.getZone( LandingZoneName ) - if TransportZone then - TransportZonePos = {radius = TransportZone.radius, x = TransportZone.point.x, y = TransportZone.point.y, z = TransportZone.point.z} - if ((( TransportUnitPos.x - TransportZonePos.x)^2 + (TransportUnitPos.z - TransportZonePos.z)^2)^0.5 <= ZoneRadius ) then - TransportZoneResult = LandingZoneID - break - end - end - end - else - TransportZone = trigger.misc.getZone( LandingZones ) - TransportZonePos = {radius = TransportZone.radius, x = TransportZone.point.x, y = TransportZone.point.y, z = TransportZone.point.z} - if ((( TransportUnitPos.x - TransportZonePos.x)^2 + (TransportUnitPos.z - TransportZonePos.z)^2)^0.5 <= ZoneRadius ) then - TransportZoneResult = 1 - end - end - if TransportZoneResult then - --trace.i( "routines", "TransportZone:" .. TransportZoneResult ) - else - --trace.i( "routines", "TransportZone:nil logic" ) - end - return TransportZoneResult - else - --trace.i( "routines", "TransportZone:nil hard" ) - return nil - end -end - - -function routines.IsStaticInZones( TransportStatic, LandingZones ) ---trace.f() - - local TransportZoneResult = nil - local TransportZonePos = nil - local TransportZone = nil - - -- fill-up some local variables to support further calculations to determine location of units within the zone. - local TransportStaticPos = TransportStatic:getPosition().p - if type( LandingZones ) == "table" then - for LandingZoneID, LandingZoneName in pairs( LandingZones ) do - TransportZone = trigger.misc.getZone( LandingZoneName ) - if TransportZone then - TransportZonePos = {radius = TransportZone.radius, x = TransportZone.point.x, y = TransportZone.point.y, z = TransportZone.point.z} - if ((( TransportStaticPos.x - TransportZonePos.x)^2 + (TransportStaticPos.z - TransportZonePos.z)^2)^0.5 <= TransportZonePos.radius) then - TransportZoneResult = LandingZoneID - break - end - end - end - else - TransportZone = trigger.misc.getZone( LandingZones ) - TransportZonePos = {radius = TransportZone.radius, x = TransportZone.point.x, y = TransportZone.point.y, z = TransportZone.point.z} - if ((( TransportStaticPos.x - TransportZonePos.x)^2 + (TransportStaticPos.z - TransportZonePos.z)^2)^0.5 <= TransportZonePos.radius) then - TransportZoneResult = 1 - end - end - ---trace.r( "", "", { TransportZoneResult } ) - return TransportZoneResult -end - - -function routines.IsUnitInRadius( CargoUnit, ReferencePosition, Radius ) ---trace.f() - - local Valid = true - - -- fill-up some local variables to support further calculations to determine location of units within the zone. - local CargoPos = CargoUnit:getPosition().p - local ReferenceP = ReferencePosition.p - - if (((CargoPos.x - ReferenceP.x)^2 + (CargoPos.z - ReferenceP.z)^2)^0.5 <= Radius) then - else - Valid = false - end - - return Valid -end - -function routines.IsPartOfGroupInRadius( CargoGroup, ReferencePosition, Radius ) ---trace.f() - - local Valid = true - - Valid = routines.ValidateGroup( CargoGroup, "CargoGroup", Valid ) - - -- fill-up some local variables to support further calculations to determine location of units within the zone - local CargoUnits = CargoGroup:getUnits() - for CargoUnitId, CargoUnit in pairs( CargoUnits ) do - local CargoUnitPos = CargoUnit:getPosition().p --- env.info( 'routines.IsPartOfGroupInRadius: CargoUnitPos.x = ' .. CargoUnitPos.x .. ' CargoUnitPos.z = ' .. CargoUnitPos.z ) - local ReferenceP = ReferencePosition.p --- env.info( 'routines.IsPartOfGroupInRadius: ReferenceGroupPos.x = ' .. ReferenceGroupPos.x .. ' ReferenceGroupPos.z = ' .. ReferenceGroupPos.z ) - - if ((( CargoUnitPos.x - ReferenceP.x)^2 + (CargoUnitPos.z - ReferenceP.z)^2)^0.5 <= Radius) then - else - Valid = false - break - end - end - - return Valid -end - - -function routines.ValidateString( Variable, VariableName, Valid ) ---trace.f() - - if type( Variable ) == "string" then - if Variable == "" then - error( "routines.ValidateString: error: " .. VariableName .. " must be filled out!" ) - Valid = false - end - else - error( "routines.ValidateString: error: " .. VariableName .. " is not a string." ) - Valid = false - end - ---trace.r( "", "", { Valid } ) - return Valid -end - -function routines.ValidateNumber( Variable, VariableName, Valid ) ---trace.f() - - if type( Variable ) == "number" then - else - error( "routines.ValidateNumber: error: " .. VariableName .. " is not a number." ) - Valid = false - end - ---trace.r( "", "", { Valid } ) - return Valid - -end - -function routines.ValidateGroup( Variable, VariableName, Valid ) ---trace.f() - - if Variable == nil then - error( "routines.ValidateGroup: error: " .. VariableName .. " is a nil value!" ) - Valid = false - end - ---trace.r( "", "", { Valid } ) - return Valid -end - -function routines.ValidateZone( LandingZones, VariableName, Valid ) ---trace.f() - - if LandingZones == nil then - error( "routines.ValidateGroup: error: " .. VariableName .. " is a nil value!" ) - Valid = false - end - - if type( LandingZones ) == "table" then - for LandingZoneID, LandingZoneName in pairs( LandingZones ) do - if trigger.misc.getZone( LandingZoneName ) == nil then - error( "routines.ValidateGroup: error: Zone " .. LandingZoneName .. " does not exist!" ) - Valid = false - break - end - end - else - if trigger.misc.getZone( LandingZones ) == nil then - error( "routines.ValidateGroup: error: Zone " .. LandingZones .. " does not exist!" ) - Valid = false - end - end - ---trace.r( "", "", { Valid } ) - return Valid -end - -function routines.ValidateEnumeration( Variable, VariableName, Enum, Valid ) ---trace.f() - - local ValidVariable = false - - for EnumId, EnumData in pairs( Enum ) do - if Variable == EnumData then - ValidVariable = true - break - end - end - - if ValidVariable then - else - error( 'TransportValidateEnum: " .. VariableName .. " is not a valid type.' .. Variable ) - Valid = false - end - ---trace.r( "", "", { Valid } ) - return Valid -end - -function routines.getGroupRoute(groupIdent, task) -- same as getGroupPoints but returns speed and formation type along with vec2 of point} - -- refactor to search by groupId and allow groupId and groupName as inputs - local gpId = groupIdent - if type(groupIdent) == 'string' and not tonumber(groupIdent) then - gpId = _DATABASE.Templates.Groups[groupIdent].groupId - end - - for coa_name, coa_data in pairs(env.mission.coalition) do - if (coa_name == 'red' or coa_name == 'blue') and type(coa_data) == 'table' then - if coa_data.country then --there is a country table - for cntry_id, cntry_data in pairs(coa_data.country) do - for obj_type_name, obj_type_data in pairs(cntry_data) do - if obj_type_name == "helicopter" or obj_type_name == "ship" or obj_type_name == "plane" or obj_type_name == "vehicle" then -- only these types have points - if ((type(obj_type_data) == 'table') and obj_type_data.group and (type(obj_type_data.group) == 'table') and (#obj_type_data.group > 0)) then --there's a group! - for group_num, group_data in pairs(obj_type_data.group) do - if group_data and group_data.groupId == gpId then -- this is the group we are looking for - if group_data.route and group_data.route.points and #group_data.route.points > 0 then - local points = {} - - for point_num, point in pairs(group_data.route.points) do - local routeData = {} - if not point.point then - routeData.x = point.x - routeData.y = point.y - else - routeData.point = point.point --it's possible that the ME could move to the point = Vec2 notation. - end - routeData.form = point.action - routeData.speed = point.speed - routeData.alt = point.alt - routeData.alt_type = point.alt_type - routeData.airdromeId = point.airdromeId - routeData.helipadId = point.helipadId - routeData.type = point.type - routeData.action = point.action - if task then - routeData.task = point.task - end - points[point_num] = routeData - end - - return points - end - return - end --if group_data and group_data.name and group_data.name == 'groupname' - end --for group_num, group_data in pairs(obj_type_data.group) do - end --if ((type(obj_type_data) == 'table') and obj_type_data.group and (type(obj_type_data.group) == 'table') and (#obj_type_data.group > 0)) then - end --if obj_type_name == "helicopter" or obj_type_name == "ship" or obj_type_name == "plane" or obj_type_name == "vehicle" or obj_type_name == "static" then - end --for obj_type_name, obj_type_data in pairs(cntry_data) do - end --for cntry_id, cntry_data in pairs(coa_data.country) do - end --if coa_data.country then --there is a country table - end --if coa_name == 'red' or coa_name == 'blue' and type(coa_data) == 'table' then - end --for coa_name, coa_data in pairs(mission.coalition) do -end - -routines.ground.patrolRoute = function(vars) - - - local tempRoute = {} - local useRoute = {} - local gpData = vars.gpData - if type(gpData) == 'string' then - gpData = Group.getByName(gpData) - end - - local useGroupRoute - if not vars.useGroupRoute then - useGroupRoute = vars.gpData - else - useGroupRoute = vars.useGroupRoute - end - local routeProvided = false - if not vars.route then - if useGroupRoute then - tempRoute = routines.getGroupRoute(useGroupRoute) - end - else - useRoute = vars.route - local posStart = routines.getLeadPos(gpData) - useRoute[1] = routines.ground.buildWP(posStart, useRoute[1].action, useRoute[1].speed) - routeProvided = true - end - - - local overRideSpeed = vars.speed or 'default' - local pType = vars.pType - local offRoadForm = vars.offRoadForm or 'default' - local onRoadForm = vars.onRoadForm or 'default' - - if routeProvided == false and #tempRoute > 0 then - local posStart = routines.getLeadPos(gpData) - - - useRoute[#useRoute + 1] = routines.ground.buildWP(posStart, offRoadForm, overRideSpeed) - for i = 1, #tempRoute do - local tempForm = tempRoute[i].action - local tempSpeed = tempRoute[i].speed - - if offRoadForm == 'default' then - tempForm = tempRoute[i].action - end - if onRoadForm == 'default' then - onRoadForm = 'On Road' - end - if (string.lower(tempRoute[i].action) == 'on road' or string.lower(tempRoute[i].action) == 'onroad' or string.lower(tempRoute[i].action) == 'on_road') then - tempForm = onRoadForm - else - tempForm = offRoadForm - end - - if type(overRideSpeed) == 'number' then - tempSpeed = overRideSpeed - end - - - useRoute[#useRoute + 1] = routines.ground.buildWP(tempRoute[i], tempForm, tempSpeed) - end - - if pType and string.lower(pType) == 'doubleback' then - local curRoute = routines.utils.deepCopy(useRoute) - for i = #curRoute, 2, -1 do - useRoute[#useRoute + 1] = routines.ground.buildWP(curRoute[i], curRoute[i].action, curRoute[i].speed) - end - end - - useRoute[1].action = useRoute[#useRoute].action -- make it so the first WP matches the last WP - end - - local cTask3 = {} - local newPatrol = {} - newPatrol.route = useRoute - newPatrol.gpData = gpData:getName() - cTask3[#cTask3 + 1] = 'routines.ground.patrolRoute(' - cTask3[#cTask3 + 1] = routines.utils.oneLineSerialize(newPatrol) - cTask3[#cTask3 + 1] = ')' - cTask3 = table.concat(cTask3) - local tempTask = { - id = 'WrappedAction', - params = { - action = { - id = 'Script', - params = { - command = cTask3, - - }, - }, - }, - } - - - useRoute[#useRoute].task = tempTask - routines.goRoute(gpData, useRoute) - - return -end - -routines.ground.patrol = function(gpData, pType, form, speed) - local vars = {} - - if type(gpData) == 'table' and gpData:getName() then - gpData = gpData:getName() - end - - vars.useGroupRoute = gpData - vars.gpData = gpData - vars.pType = pType - vars.offRoadForm = form - vars.speed = speed - - routines.ground.patrolRoute(vars) - - return -end - -function routines.GetUnitHeight( CheckUnit ) ---trace.f( "routines" ) - - local UnitPoint = CheckUnit:getPoint() - local UnitPosition = { x = UnitPoint.x, y = UnitPoint.z } - local UnitHeight = UnitPoint.y - - local LandHeight = land.getHeight( UnitPosition ) - - --env.info(( 'CarrierHeight: LandHeight = ' .. LandHeight .. ' CarrierHeight = ' .. CarrierHeight )) - - --trace.f( "routines", "Unit Height = " .. UnitHeight - LandHeight ) - - return UnitHeight - LandHeight - -end - - - -Su34Status = { status = {} } -boardMsgRed = { statusMsg = "" } -boardMsgAll = { timeMsg = "" } -SpawnSettings = {} -Su34MenuPath = {} -Su34Menus = 0 - - -function Su34AttackCarlVinson(groupName) ---trace.menu("", "Su34AttackCarlVinson") - local groupSu34 = Group.getByName( groupName ) - local controllerSu34 = groupSu34.getController(groupSu34) - local groupCarlVinson = Group.getByName("US Carl Vinson #001") - controllerSu34.setOption( controllerSu34, AI.Option.Air.id.ROE, AI.Option.Air.val.ROE.OPEN_FIRE ) - controllerSu34.setOption( controllerSu34, AI.Option.Air.id.REACTION_ON_THREAT, AI.Option.Air.val.REACTION_ON_THREAT.EVADE_FIRE ) - if groupCarlVinson ~= nil then - controllerSu34.pushTask(controllerSu34,{id = 'AttackGroup', params = { groupId = groupCarlVinson:getID(), expend = AI.Task.WeaponExpend.ALL, attackQtyLimit = true}}) - end - Su34Status.status[groupName] = 1 - MessageToRed( string.format('%s: ',groupName) .. 'Attacking carrier Carl Vinson. ', 10, 'RedStatus' .. groupName ) -end - -function Su34AttackWest(groupName) ---trace.f("","Su34AttackWest") - local groupSu34 = Group.getByName( groupName ) - local controllerSu34 = groupSu34.getController(groupSu34) - local groupShipWest1 = Group.getByName("US Ship West #001") - local groupShipWest2 = Group.getByName("US Ship West #002") - controllerSu34.setOption( controllerSu34, AI.Option.Air.id.ROE, AI.Option.Air.val.ROE.OPEN_FIRE ) - controllerSu34.setOption( controllerSu34, AI.Option.Air.id.REACTION_ON_THREAT, AI.Option.Air.val.REACTION_ON_THREAT.EVADE_FIRE ) - if groupShipWest1 ~= nil then - controllerSu34.pushTask(controllerSu34,{id = 'AttackGroup', params = { groupId = groupShipWest1:getID(), expend = AI.Task.WeaponExpend.ALL, attackQtyLimit = true}}) - end - if groupShipWest2 ~= nil then - controllerSu34.pushTask(controllerSu34,{id = 'AttackGroup', params = { groupId = groupShipWest2:getID(), expend = AI.Task.WeaponExpend.ALL, attackQtyLimit = true}}) - end - Su34Status.status[groupName] = 2 - MessageToRed( string.format('%s: ',groupName) .. 'Attacking invading ships in the west. ', 10, 'RedStatus' .. groupName ) -end - -function Su34AttackNorth(groupName) ---trace.menu("","Su34AttackNorth") - local groupSu34 = Group.getByName( groupName ) - local controllerSu34 = groupSu34.getController(groupSu34) - local groupShipNorth1 = Group.getByName("US Ship North #001") - local groupShipNorth2 = Group.getByName("US Ship North #002") - local groupShipNorth3 = Group.getByName("US Ship North #003") - controllerSu34.setOption( controllerSu34, AI.Option.Air.id.ROE, AI.Option.Air.val.ROE.OPEN_FIRE ) - controllerSu34.setOption( controllerSu34, AI.Option.Air.id.REACTION_ON_THREAT, AI.Option.Air.val.REACTION_ON_THREAT.EVADE_FIRE ) - if groupShipNorth1 ~= nil then - controllerSu34.pushTask(controllerSu34,{id = 'AttackGroup', params = { groupId = groupShipNorth1:getID(), expend = AI.Task.WeaponExpend.ALL, attackQtyLimit = false}}) - end - if groupShipNorth2 ~= nil then - controllerSu34.pushTask(controllerSu34,{id = 'AttackGroup', params = { groupId = groupShipNorth2:getID(), expend = AI.Task.WeaponExpend.ALL, attackQtyLimit = false}}) - end - if groupShipNorth3 ~= nil then - controllerSu34.pushTask(controllerSu34,{id = 'AttackGroup', params = { groupId = groupShipNorth3:getID(), expend = AI.Task.WeaponExpend.ALL, attackQtyLimit = false}}) - end - Su34Status.status[groupName] = 3 - MessageToRed( string.format('%s: ',groupName) .. 'Attacking invading ships in the north. ', 10, 'RedStatus' .. groupName ) -end - -function Su34Orbit(groupName) ---trace.menu("","Su34Orbit") - local groupSu34 = Group.getByName( groupName ) - local controllerSu34 = groupSu34:getController() - controllerSu34.setOption( controllerSu34, AI.Option.Air.id.ROE, AI.Option.Air.val.ROE.WEAPON_HOLD ) - controllerSu34.setOption( controllerSu34, AI.Option.Air.id.REACTION_ON_THREAT, AI.Option.Air.val.REACTION_ON_THREAT.EVADE_FIRE ) - controllerSu34:pushTask( {id = 'ControlledTask', params = { task = { id = 'Orbit', params = { pattern = AI.Task.OrbitPattern.RACE_TRACK } }, stopCondition = { duration = 600 } } } ) - Su34Status.status[groupName] = 4 - MessageToRed( string.format('%s: ',groupName) .. 'In orbit and awaiting further instructions. ', 10, 'RedStatus' .. groupName ) -end - -function Su34TakeOff(groupName) ---trace.menu("","Su34TakeOff") - local groupSu34 = Group.getByName( groupName ) - local controllerSu34 = groupSu34:getController() - controllerSu34.setOption( controllerSu34, AI.Option.Air.id.ROE, AI.Option.Air.val.ROE.WEAPON_HOLD ) - controllerSu34.setOption( controllerSu34, AI.Option.Air.id.REACTION_ON_THREAT, AI.Option.Air.val.REACTION_ON_THREAT.BYPASS_AND_ESCAPE ) - Su34Status.status[groupName] = 8 - MessageToRed( string.format('%s: ',groupName) .. 'Take-Off. ', 10, 'RedStatus' .. groupName ) -end - -function Su34Hold(groupName) ---trace.menu("","Su34Hold") - local groupSu34 = Group.getByName( groupName ) - local controllerSu34 = groupSu34:getController() - controllerSu34.setOption( controllerSu34, AI.Option.Air.id.ROE, AI.Option.Air.val.ROE.WEAPON_HOLD ) - controllerSu34.setOption( controllerSu34, AI.Option.Air.id.REACTION_ON_THREAT, AI.Option.Air.val.REACTION_ON_THREAT.BYPASS_AND_ESCAPE ) - Su34Status.status[groupName] = 5 - MessageToRed( string.format('%s: ',groupName) .. 'Holding Weapons. ', 10, 'RedStatus' .. groupName ) -end - -function Su34RTB(groupName) ---trace.menu("","Su34RTB") - Su34Status.status[groupName] = 6 - MessageToRed( string.format('%s: ',groupName) .. 'Return to Krasnodar. ', 10, 'RedStatus' .. groupName ) -end - -function Su34Destroyed(groupName) ---trace.menu("","Su34Destroyed") - Su34Status.status[groupName] = 7 - MessageToRed( string.format('%s: ',groupName) .. 'Destroyed. ', 30, 'RedStatus' .. groupName ) -end - -function GroupAlive( groupName ) ---trace.menu("","GroupAlive") - local groupTest = Group.getByName( groupName ) - - local groupExists = false - - if groupTest then - groupExists = groupTest:isExist() - end - - --trace.r( "", "", { groupExists } ) - return groupExists -end - -function Su34IsDead() ---trace.f() - -end - -function Su34OverviewStatus() ---trace.menu("","Su34OverviewStatus") - local msg = "" - local currentStatus = 0 - local Exists = false - - for groupName, currentStatus in pairs(Su34Status.status) do - - env.info(('Su34 Overview Status: GroupName = ' .. groupName )) - Alive = GroupAlive( groupName ) - - if Alive then - if currentStatus == 1 then - msg = msg .. string.format("%s: ",groupName) - msg = msg .. "Attacking carrier Carl Vinson. " - elseif currentStatus == 2 then - msg = msg .. string.format("%s: ",groupName) - msg = msg .. "Attacking supporting ships in the west. " - elseif currentStatus == 3 then - msg = msg .. string.format("%s: ",groupName) - msg = msg .. "Attacking invading ships in the north. " - elseif currentStatus == 4 then - msg = msg .. string.format("%s: ",groupName) - msg = msg .. "In orbit and awaiting further instructions. " - elseif currentStatus == 5 then - msg = msg .. string.format("%s: ",groupName) - msg = msg .. "Holding Weapons. " - elseif currentStatus == 6 then - msg = msg .. string.format("%s: ",groupName) - msg = msg .. "Return to Krasnodar. " - elseif currentStatus == 7 then - msg = msg .. string.format("%s: ",groupName) - msg = msg .. "Destroyed. " - elseif currentStatus == 8 then - msg = msg .. string.format("%s: ",groupName) - msg = msg .. "Take-Off. " - end - else - if currentStatus == 7 then - msg = msg .. string.format("%s: ",groupName) - msg = msg .. "Destroyed. " - else - Su34Destroyed(groupName) - end - end - end - - boardMsgRed.statusMsg = msg -end - - -function UpdateBoardMsg() ---trace.f() - Su34OverviewStatus() - MessageToRed( boardMsgRed.statusMsg, 15, 'RedStatus' ) -end - -function MusicReset( flg ) ---trace.f() - trigger.action.setUserFlag(95,flg) -end - -function PlaneActivate(groupNameFormat, flg) ---trace.f() - local groupName = groupNameFormat .. string.format("#%03d", trigger.misc.getUserFlag(flg)) - --trigger.action.outText(groupName,10) - trigger.action.activateGroup(Group.getByName(groupName)) -end - -function Su34Menu(groupName) ---trace.f() - - --env.info(( 'Su34Menu(' .. groupName .. ')' )) - local groupSu34 = Group.getByName( groupName ) - - if Su34Status.status[groupName] == 1 or - Su34Status.status[groupName] == 2 or - Su34Status.status[groupName] == 3 or - Su34Status.status[groupName] == 4 or - Su34Status.status[groupName] == 5 then - if Su34MenuPath[groupName] == nil then - if planeMenuPath == nil then - planeMenuPath = missionCommands.addSubMenuForCoalition( - coalition.side.RED, - "SU-34 anti-ship flights", - nil - ) - end - Su34MenuPath[groupName] = missionCommands.addSubMenuForCoalition( - coalition.side.RED, - "Flight " .. groupName, - planeMenuPath - ) - - missionCommands.addCommandForCoalition( - coalition.side.RED, - "Attack carrier Carl Vinson", - Su34MenuPath[groupName], - Su34AttackCarlVinson, - groupName - ) - - missionCommands.addCommandForCoalition( - coalition.side.RED, - "Attack ships in the west", - Su34MenuPath[groupName], - Su34AttackWest, - groupName - ) - - missionCommands.addCommandForCoalition( - coalition.side.RED, - "Attack ships in the north", - Su34MenuPath[groupName], - Su34AttackNorth, - groupName - ) - - missionCommands.addCommandForCoalition( - coalition.side.RED, - "Hold position and await instructions", - Su34MenuPath[groupName], - Su34Orbit, - groupName - ) - - missionCommands.addCommandForCoalition( - coalition.side.RED, - "Report status", - Su34MenuPath[groupName], - Su34OverviewStatus - ) - end - else - if Su34MenuPath[groupName] then - missionCommands.removeItemForCoalition(coalition.side.RED, Su34MenuPath[groupName]) - end - end -end - ---- Obsolete function, but kept to rework in framework. - -function ChooseInfantry ( TeleportPrefixTable, TeleportMax ) ---trace.f("Spawn") - --env.info(( 'ChooseInfantry: ' )) - - TeleportPrefixTableCount = #TeleportPrefixTable - TeleportPrefixTableIndex = math.random( 1, TeleportPrefixTableCount ) - - --env.info(( 'ChooseInfantry: TeleportPrefixTableIndex = ' .. TeleportPrefixTableIndex .. ' TeleportPrefixTableCount = ' .. TeleportPrefixTableCount .. ' TeleportMax = ' .. TeleportMax )) - - local TeleportFound = false - local TeleportLoop = true - local Index = TeleportPrefixTableIndex - local TeleportPrefix = '' - - while TeleportLoop do - TeleportPrefix = TeleportPrefixTable[Index] - if SpawnSettings[TeleportPrefix] then - if SpawnSettings[TeleportPrefix]['SpawnCount'] - 1 < TeleportMax then - SpawnSettings[TeleportPrefix]['SpawnCount'] = SpawnSettings[TeleportPrefix]['SpawnCount'] + 1 - TeleportFound = true - else - TeleportFound = false - end - else - SpawnSettings[TeleportPrefix] = {} - SpawnSettings[TeleportPrefix]['SpawnCount'] = 0 - TeleportFound = true - end - if TeleportFound then - TeleportLoop = false - else - if Index < TeleportPrefixTableCount then - Index = Index + 1 - else - TeleportLoop = false - end - end - --env.info(( 'ChooseInfantry: Loop 1 - TeleportPrefix = ' .. TeleportPrefix .. ' Index = ' .. Index )) - end - - if TeleportFound == false then - TeleportLoop = true - Index = 1 - while TeleportLoop do - TeleportPrefix = TeleportPrefixTable[Index] - if SpawnSettings[TeleportPrefix] then - if SpawnSettings[TeleportPrefix]['SpawnCount'] - 1 < TeleportMax then - SpawnSettings[TeleportPrefix]['SpawnCount'] = SpawnSettings[TeleportPrefix]['SpawnCount'] + 1 - TeleportFound = true - else - TeleportFound = false - end - else - SpawnSettings[TeleportPrefix] = {} - SpawnSettings[TeleportPrefix]['SpawnCount'] = 0 - TeleportFound = true - end - if TeleportFound then - TeleportLoop = false - else - if Index < TeleportPrefixTableIndex then - Index = Index + 1 - else - TeleportLoop = false - end - end - --env.info(( 'ChooseInfantry: Loop 2 - TeleportPrefix = ' .. TeleportPrefix .. ' Index = ' .. Index )) - end - end - - local TeleportGroupName = '' - if TeleportFound == true then - TeleportGroupName = TeleportPrefix .. string.format("#%03d", SpawnSettings[TeleportPrefix]['SpawnCount'] ) - else - TeleportGroupName = '' - end - - --env.info(('ChooseInfantry: TeleportGroupName = ' .. TeleportGroupName )) - --env.info(('ChooseInfantry: return')) - - return TeleportGroupName -end - -SpawnedInfantry = 0 - -function LandCarrier ( CarrierGroup, LandingZonePrefix ) ---trace.f() - --env.info(( 'LandCarrier: ' )) - --env.info(( 'LandCarrier: CarrierGroup = ' .. CarrierGroup:getName() )) - --env.info(( 'LandCarrier: LandingZone = ' .. LandingZonePrefix )) - - local controllerGroup = CarrierGroup:getController() - - local LandingZone = trigger.misc.getZone(LandingZonePrefix) - local LandingZonePos = {} - LandingZonePos.x = LandingZone.point.x + math.random(LandingZone.radius * -1, LandingZone.radius) - LandingZonePos.y = LandingZone.point.z + math.random(LandingZone.radius * -1, LandingZone.radius) - - controllerGroup:pushTask( { id = 'Land', params = { point = LandingZonePos, durationFlag = true, duration = 10 } } ) - - --env.info(( 'LandCarrier: end' )) -end - -EscortCount = 0 -function EscortCarrier ( CarrierGroup, EscortPrefix, EscortLastWayPoint, EscortEngagementDistanceMax, EscortTargetTypes ) ---trace.f() - --env.info(( 'EscortCarrier: ' )) - --env.info(( 'EscortCarrier: CarrierGroup = ' .. CarrierGroup:getName() )) - --env.info(( 'EscortCarrier: EscortPrefix = ' .. EscortPrefix )) - - local CarrierName = CarrierGroup:getName() - - local EscortMission = {} - local CarrierMission = {} - - local EscortMission = SpawnMissionGroup( EscortPrefix ) - local CarrierMission = SpawnMissionGroup( CarrierGroup:getName() ) - - if EscortMission ~= nil and CarrierMission ~= nil then - - EscortCount = EscortCount + 1 - EscortMissionName = string.format( EscortPrefix .. '#Escort %s', CarrierName ) - EscortMission.name = EscortMissionName - EscortMission.groupId = nil - EscortMission.lateActivation = false - EscortMission.taskSelected = false - - local EscortUnits = #EscortMission.units - for u = 1, EscortUnits do - EscortMission.units[u].name = string.format( EscortPrefix .. '#Escort %s %02d', CarrierName, u ) - EscortMission.units[u].unitId = nil - end - - - EscortMission.route.points[1].task = { id = "ComboTask", - params = - { - tasks = - { - [1] = - { - enabled = true, - auto = false, - id = "Escort", - number = 1, - params = - { - lastWptIndexFlagChangedManually = false, - groupId = CarrierGroup:getID(), - lastWptIndex = nil, - lastWptIndexFlag = false, - engagementDistMax = EscortEngagementDistanceMax, - targetTypes = EscortTargetTypes, - pos = - { - y = 20, - x = 20, - z = 0, - } -- end of ["pos"] - } -- end of ["params"] - } -- end of [1] - } -- end of ["tasks"] - } -- end of ["params"] - } -- end of ["task"] - - SpawnGroupAdd( EscortPrefix, EscortMission ) - - end -end - -function SendMessageToCarrier( CarrierGroup, CarrierMessage ) ---trace.f() - - if CarrierGroup ~= nil then - MessageToGroup( CarrierGroup, CarrierMessage, 30, 'Carrier/' .. CarrierGroup:getName() ) - end - -end - -function MessageToGroup( MsgGroup, MsgText, MsgTime, MsgName ) ---trace.f() - - if type(MsgGroup) == 'string' then - --env.info( 'MessageToGroup: Converted MsgGroup string "' .. MsgGroup .. '" into a Group structure.' ) - MsgGroup = Group.getByName( MsgGroup ) - end - - if MsgGroup ~= nil then - local MsgTable = {} - MsgTable.text = MsgText - MsgTable.displayTime = MsgTime - MsgTable.msgFor = { units = { MsgGroup:getUnits()[1]:getName() } } - MsgTable.name = MsgName - --routines.message.add( MsgTable ) - --env.info(('MessageToGroup: Message sent to ' .. MsgGroup:getUnits()[1]:getName() .. ' -> ' .. MsgText )) - end -end - -function MessageToUnit( UnitName, MsgText, MsgTime, MsgName ) ---trace.f() - - if UnitName ~= nil then - local MsgTable = {} - MsgTable.text = MsgText - MsgTable.displayTime = MsgTime - MsgTable.msgFor = { units = { UnitName } } - MsgTable.name = MsgName - --routines.message.add( MsgTable ) - end -end - -function MessageToAll( MsgText, MsgTime, MsgName ) ---trace.f() - - MESSAGE:New( MsgText, "Message", MsgTime, MsgName ):ToCoalition( coalition.side.RED ):ToCoalition( coalition.side.BLUE ) -end - -function MessageToRed( MsgText, MsgTime, MsgName ) ---trace.f() - - MESSAGE:New( MsgText, "To Red Coalition", MsgTime, MsgName ):ToCoalition( coalition.side.RED ) -end - -function MessageToBlue( MsgText, MsgTime, MsgName ) ---trace.f() - - MESSAGE:New( MsgText, "To Blue Coalition", MsgTime, MsgName ):ToCoalition( coalition.side.RED ) -end - -function getCarrierHeight( CarrierGroup ) ---trace.f() - - if CarrierGroup ~= nil then - if table.getn(CarrierGroup:getUnits()) == 1 then - local CarrierUnit = CarrierGroup:getUnits()[1] - local CurrentPoint = CarrierUnit:getPoint() - - local CurrentPosition = { x = CurrentPoint.x, y = CurrentPoint.z } - local CarrierHeight = CurrentPoint.y - - local LandHeight = land.getHeight( CurrentPosition ) - - --env.info(( 'CarrierHeight: LandHeight = ' .. LandHeight .. ' CarrierHeight = ' .. CarrierHeight )) - - return CarrierHeight - LandHeight - else - return 999999 - end - else - return 999999 - end - -end - -function GetUnitHeight( CheckUnit ) ---trace.f() - - local UnitPoint = CheckUnit:getPoint() - local UnitPosition = { x = CurrentPoint.x, y = CurrentPoint.z } - local UnitHeight = CurrentPoint.y - - local LandHeight = land.getHeight( CurrentPosition ) - - --env.info(( 'CarrierHeight: LandHeight = ' .. LandHeight .. ' CarrierHeight = ' .. CarrierHeight )) - - return UnitHeight - LandHeight - -end - - -_MusicTable = {} -_MusicTable.Files = {} -_MusicTable.Queue = {} -_MusicTable.FileCnt = 0 - - -function MusicRegister( SndRef, SndFile, SndTime ) ---trace.f() - - env.info(( 'MusicRegister: SndRef = ' .. SndRef )) - env.info(( 'MusicRegister: SndFile = ' .. SndFile )) - env.info(( 'MusicRegister: SndTime = ' .. SndTime )) - - - _MusicTable.FileCnt = _MusicTable.FileCnt + 1 - - _MusicTable.Files[_MusicTable.FileCnt] = {} - _MusicTable.Files[_MusicTable.FileCnt].Ref = SndRef - _MusicTable.Files[_MusicTable.FileCnt].File = SndFile - _MusicTable.Files[_MusicTable.FileCnt].Time = SndTime - - if not _MusicTable.Function then - _MusicTable.Function = routines.scheduleFunction( MusicScheduler, { }, timer.getTime() + 10, 10) - end - -end - -function MusicToPlayer( SndRef, PlayerName, SndContinue ) ---trace.f() - - --env.info(( 'MusicToPlayer: SndRef = ' .. SndRef )) - - local PlayerUnits = AlivePlayerUnits() - for PlayerUnitIdx, PlayerUnit in pairs(PlayerUnits) do - local PlayerUnitName = PlayerUnit:getPlayerName() - --env.info(( 'MusicToPlayer: PlayerUnitName = ' .. PlayerUnitName )) - if PlayerName == PlayerUnitName then - PlayerGroup = PlayerUnit:getGroup() - if PlayerGroup then - --env.info(( 'MusicToPlayer: PlayerGroup = ' .. PlayerGroup:getName() )) - MusicToGroup( SndRef, PlayerGroup, SndContinue ) - end - break - end - end - - --env.info(( 'MusicToPlayer: end' )) - -end - -function MusicToGroup( SndRef, SndGroup, SndContinue ) ---trace.f() - - --env.info(( 'MusicToGroup: SndRef = ' .. SndRef )) - - if SndGroup ~= nil then - if _MusicTable and _MusicTable.FileCnt > 0 then - if SndGroup:isExist() then - if MusicCanStart(SndGroup:getUnit(1):getPlayerName()) then - --env.info(( 'MusicToGroup: OK for Sound.' )) - local SndIdx = 0 - if SndRef == '' then - --env.info(( 'MusicToGroup: SndRef as empty. Queueing at random.' )) - SndIdx = math.random( 1, _MusicTable.FileCnt ) - else - for SndIdx = 1, _MusicTable.FileCnt do - if _MusicTable.Files[SndIdx].Ref == SndRef then - break - end - end - end - --env.info(( 'MusicToGroup: SndIdx = ' .. SndIdx )) - --env.info(( 'MusicToGroup: Queueing Music ' .. _MusicTable.Files[SndIdx].File .. ' for Group ' .. SndGroup:getID() )) - trigger.action.outSoundForGroup( SndGroup:getID(), _MusicTable.Files[SndIdx].File ) - MessageToGroup( SndGroup, 'Playing ' .. _MusicTable.Files[SndIdx].File, 15, 'Music-' .. SndGroup:getUnit(1):getPlayerName() ) - - local SndQueueRef = SndGroup:getUnit(1):getPlayerName() - if _MusicTable.Queue[SndQueueRef] == nil then - _MusicTable.Queue[SndQueueRef] = {} - end - _MusicTable.Queue[SndQueueRef].Start = timer.getTime() - _MusicTable.Queue[SndQueueRef].PlayerName = SndGroup:getUnit(1):getPlayerName() - _MusicTable.Queue[SndQueueRef].Group = SndGroup - _MusicTable.Queue[SndQueueRef].ID = SndGroup:getID() - _MusicTable.Queue[SndQueueRef].Ref = SndIdx - _MusicTable.Queue[SndQueueRef].Continue = SndContinue - _MusicTable.Queue[SndQueueRef].Type = Group - end - end - end - end -end - -function MusicCanStart(PlayerName) ---trace.f() - - --env.info(( 'MusicCanStart:' )) - - local MusicOut = false - - if _MusicTable['Queue'] ~= nil and _MusicTable.FileCnt > 0 then - --env.info(( 'MusicCanStart: PlayerName = ' .. PlayerName )) - local PlayerFound = false - local MusicStart = 0 - local MusicTime = 0 - for SndQueueIdx, SndQueue in pairs( _MusicTable.Queue ) do - if SndQueue.PlayerName == PlayerName then - PlayerFound = true - MusicStart = SndQueue.Start - MusicTime = _MusicTable.Files[SndQueue.Ref].Time - break - end - end - if PlayerFound then - --env.info(( 'MusicCanStart: MusicStart = ' .. MusicStart )) - --env.info(( 'MusicCanStart: MusicTime = ' .. MusicTime )) - --env.info(( 'MusicCanStart: timer.getTime() = ' .. timer.getTime() )) - - if MusicStart + MusicTime <= timer.getTime() then - MusicOut = true - end - else - MusicOut = true - end - end - - if MusicOut then - --env.info(( 'MusicCanStart: true' )) - else - --env.info(( 'MusicCanStart: false' )) - end - - return MusicOut -end - -function MusicScheduler() ---trace.scheduled("", "MusicScheduler") - - --env.info(( 'MusicScheduler:' )) - if _MusicTable['Queue'] ~= nil and _MusicTable.FileCnt > 0 then - --env.info(( 'MusicScheduler: Walking Sound Queue.')) - for SndQueueIdx, SndQueue in pairs( _MusicTable.Queue ) do - if SndQueue.Continue then - if MusicCanStart(SndQueue.PlayerName) then - --env.info(('MusicScheduler: MusicToGroup')) - MusicToPlayer( '', SndQueue.PlayerName, true ) - end - end - end - end - -end - - -env.info(( 'Init: Scripts Loaded v1.1' )) - ---- BASE classes. --- --- @{#BASE} class --- ============== --- The @{#BASE} class is the super class for most of the classes defined within MOOSE. --- --- It handles: --- --- * The construction and inheritance of child classes. --- * The tracing of objects during mission execution within the DCS.log file (under saved games folder). --- --- Note: Normally you would not use the BASE class unless you are extending the MOOSE framework with new classes. --- --- BASE Trace functionality --- ======================== --- The BASE class contains trace methods to trace progress within a mission execution of a certain object. --- Note that these trace methods are inherited by each MOOSE class interiting BASE. --- As such, each object created from derived class from BASE can use the tracing functions to trace its execution. --- --- Trace a function call --- --------------------- --- There are basically 3 types of tracing methods available within BASE: --- --- * @{#BASE.F}: Trace the beginning of a function and its given parameters. --- * @{#BASE.T}: Trace further logic within a function giving optional variables or parameters. --- * @{#BASE.E}: Trace an execption within a function giving optional variables or parameters. An exception will always be traced. --- --- Tracing levels --- -------------- --- There are 3 tracing levels within MOOSE. --- These tracing levels were defined to avoid bulks of tracing to be generated by lots of objects. --- --- As such, the F and T methods have additional variants to trace level 2 and 3 respectively: --- --- * @{#BASE.F2}: Trace the beginning of a function and its given parameters with tracing level 2. --- * @{#BASE.F3}: Trace the beginning of a function and its given parameters with tracing level 3. --- * @{#BASE.T2}: Trace further logic within a function giving optional variables or parameters with tracing level 2. --- * @{#BASE.T3}: Trace further logic within a function giving optional variables or parameters with tracing level 3. --- --- BASE Inheritance support --- ======================== --- The following methods are available to support inheritance: --- --- * @{#BASE.Inherit}: Inherits from a class. --- * @{#BASE.Inherited}: Returns the parent class from the class. --- --- Future --- ====== --- Further methods may be added to BASE whenever there is a need to make "overall" functions available within MOOSE. --- --- ==== --- --- @module Base --- @author FlightControl - -Include.File( "Routines" ) - -local _TraceOn = true -local _TraceLevel = 1 -local _TraceClass = { - --DATABASE = true, - --SEAD = true, - --DESTROYBASETASK = true, - --MOVEMENT = true, - --SPAWN = true, - --STAGE = true, - --ZONE = true, - --GROUP = true, - --UNIT = true, - --CLIENT = true, - --CARGO = true, - --CARGO_GROUP = true, - --CARGO_PACKAGE = true, - --CARGO_SLINGLOAD = true, - --CARGO_ZONE = true, - --CLEANUP = true, - --MENU_CLIENT = true, - --MENU_CLIENT_COMMAND = true, - --ESCORT = true, - } -local _TraceClassMethod = {} - ---- The BASE Class --- @type BASE --- @field ClassName The name of the class. --- @field ClassID The ID number of the class. -BASE = { - ClassName = "BASE", - ClassID = 0, - Events = {} -} - ---- The Formation Class --- @type FORMATION --- @field Cone A cone formation. -FORMATION = { - Cone = "Cone" -} - - - ---- The base constructor. This is the top top class of all classed defined within the MOOSE. --- Any new class needs to be derived from this class for proper inheritance. --- @param #BASE self --- @return #BASE The new instance of the BASE class. --- @usage --- function TASK:New() --- --- local self = BASE:Inherit( self, BASE:New() ) --- --- -- assign Task default values during construction --- self.TaskBriefing = "Task: No Task." --- self.Time = timer.getTime() --- self.ExecuteStage = _TransportExecuteStage.NONE --- --- return self --- end --- @todo need to investigate if the deepCopy is really needed... Don't think so. -function BASE:New() - local Child = routines.utils.deepCopy( self ) - local Parent = {} - setmetatable( Child, Parent ) - Child.__index = Child - self.ClassID = self.ClassID + 1 - Child.ClassID = self.ClassID - --Child.AddEvent( Child, S_EVENT_BIRTH, Child.EventBirth ) - return Child -end - ---- This is the worker method to inherit from a parent class. --- @param #BASE self --- @param Child is the Child class that inherits. --- @param #BASE Parent is the Parent class that the Child inherits from. --- @return #BASE Child -function BASE:Inherit( Child, Parent ) - local Child = routines.utils.deepCopy( Child ) - local Parent = routines.utils.deepCopy( Parent ) - if Child ~= nil then - setmetatable( Child, Parent ) - Child.__index = Child - end - --Child.ClassName = Child.ClassName .. '.' .. Child.ClassID - self:T( 'Inherited from ' .. Parent.ClassName ) - return Child -end - ---- This is the worker method to retrieve the Parent class. --- @param #BASE self --- @param #BASE Child is the Child class from which the Parent class needs to be retrieved. --- @return #BASE -function BASE:Inherited( Child ) - local Parent = getmetatable( Child ) --- env.info('Inherited class of ' .. Child.ClassName .. ' is ' .. Parent.ClassName ) - return Parent -end - ---- Get the ClassName + ClassID of the class instance. --- The ClassName + ClassID is formatted as '%s#%09d'. --- @param #BASE self --- @return #string The ClassName + ClassID of the class instance. -function BASE:GetClassNameAndID() - return string.format( '%s#%09d', self:GetClassName(), self:GetClassID() ) -end - ---- Get the ClassName of the class instance. --- @param #BASE self --- @return #string The ClassName of the class instance. -function BASE:GetClassName() - return self.ClassName -end - ---- Get the ClassID of the class instance. --- @param #BASE self --- @return #string The ClassID of the class instance. -function BASE:GetClassID() - return self.ClassID -end - ---- Set a new listener for the class. --- @param self --- @param DCSTypes#Event Event --- @param #function EventFunction --- @return #BASE -function BASE:AddEvent( Event, EventFunction ) - self:F( Event ) - - self.Events[#self.Events+1] = {} - self.Events[#self.Events].Event = Event - self.Events[#self.Events].EventFunction = EventFunction - self.Events[#self.Events].EventEnabled = false - - return self -end - ---- Returns the event dispatcher --- @param #BASE self --- @return Event#EVENT -function BASE:Event() - - return _EVENTDISPATCHER -end - - - - - ---- Enable the event listeners for the class. --- @param #BASE self --- @return #BASE -function BASE:EnableEvents() - self:F( #self.Events ) - - for EventID, Event in pairs( self.Events ) do - Event.Self = self - Event.EventEnabled = true - end - self.Events.Handler = world.addEventHandler( self ) - - return self -end - - ---- Disable the event listeners for the class. --- @param #BASE self --- @return #BASE -function BASE:DisableEvents() - self:F() - - world.removeEventHandler( self ) - for EventID, Event in pairs( self.Events ) do - Event.Self = nil - Event.EventEnabled = false - end - - return self -end - - -local BaseEventCodes = { - "S_EVENT_SHOT", - "S_EVENT_HIT", - "S_EVENT_TAKEOFF", - "S_EVENT_LAND", - "S_EVENT_CRASH", - "S_EVENT_EJECTION", - "S_EVENT_REFUELING", - "S_EVENT_DEAD", - "S_EVENT_PILOT_DEAD", - "S_EVENT_BASE_CAPTURED", - "S_EVENT_MISSION_START", - "S_EVENT_MISSION_END", - "S_EVENT_TOOK_CONTROL", - "S_EVENT_REFUELING_STOP", - "S_EVENT_BIRTH", - "S_EVENT_HUMAN_FAILURE", - "S_EVENT_ENGINE_STARTUP", - "S_EVENT_ENGINE_SHUTDOWN", - "S_EVENT_PLAYER_ENTER_UNIT", - "S_EVENT_PLAYER_LEAVE_UNIT", - "S_EVENT_PLAYER_COMMENT", - "S_EVENT_SHOOTING_START", - "S_EVENT_SHOOTING_END", - "S_EVENT_MAX", -} - ---onEvent( {[1]="S_EVENT_BIRTH",[2]={["subPlace"]=5,["time"]=0,["initiator"]={["id_"]=16884480,},["place"]={["id_"]=5000040,},["id"]=15,["IniUnitName"]="US F-15C@RAMP-Air Support Mountains#001-01",},} --- Event = { --- id = enum world.event, --- time = Time, --- initiator = Unit, --- target = Unit, --- place = Unit, --- subPlace = enum world.BirthPlace, --- weapon = Weapon --- } - ---- Creation of a Birth Event. --- @param #BASE self --- @param DCSTypes#Time EventTime The time stamp of the event. --- @param DCSObject#Object Initiator The initiating object of the event. --- @param #string IniUnitName The initiating unit name. --- @param place --- @param subplace -function BASE:CreateEventBirth( EventTime, Initiator, IniUnitName, place, subplace ) - self:F( { EventTime, Initiator, IniUnitName, place, subplace } ) - - local Event = { - id = world.event.S_EVENT_BIRTH, - time = EventTime, - initiator = Initiator, - IniUnitName = IniUnitName, - place = place, - subplace = subplace - } - - world.onEvent( Event ) -end - ---- Creation of a Crash Event. --- @param #BASE self --- @param DCSTypes#Time EventTime The time stamp of the event. --- @param DCSObject#Object Initiator The initiating object of the event. -function BASE:CreateEventCrash( EventTime, Initiator ) - self:F( { EventTime, Initiator } ) - - local Event = { - id = world.event.S_EVENT_CRASH, - time = EventTime, - initiator = Initiator, - } - - world.onEvent( Event ) -end - --- TODO: Complete DCSTypes#Event structure. ---- The main event handling function... This function captures all events generated for the class. --- @param #BASE self --- @param DCSTypes#Event event -function BASE:onEvent(event) - --self:F( { BaseEventCodes[event.id], event } ) - - if self then - for EventID, EventObject in pairs( self.Events ) do - if EventObject.EventEnabled then - --env.info( 'onEvent Table EventObject.Self = ' .. tostring(EventObject.Self) ) - --env.info( 'onEvent event.id = ' .. tostring(event.id) ) - --env.info( 'onEvent EventObject.Event = ' .. tostring(EventObject.Event) ) - if event.id == EventObject.Event then - if self == EventObject.Self then - if event.initiator and event.initiator:isExist() then - event.IniUnitName = event.initiator:getName() - end - if event.target and event.target:isExist() then - event.TgtUnitName = event.target:getName() - end - --self:T( { BaseEventCodes[event.id], event } ) - --EventObject.EventFunction( self, event ) - end - end - end - end - end -end - --- Trace section - --- Log a trace (only shown when trace is on) --- TODO: Make trace function using variable parameters. - ---- Set trace level --- @param #BASE self --- @param #number Level -function BASE:TraceLevel( Level ) - _TraceLevel = Level - self:E( "Tracing level " .. Level ) -end - ---- Set tracing for a class --- @param #BASE self --- @param #string Class -function BASE:TraceClass( Class ) - _TraceClass[Class] = true - _TraceClassMethod[Class] = {} - self:E( "Tracing class " .. Class ) -end - ---- Set tracing for a specific method of class --- @param #BASE self --- @param #string Class --- @param #string Method -function BASE:TraceClassMethod( Class, Method ) - if not _TraceClassMethod[Class] then - _TraceClassMethod[Class] = {} - _TraceClassMethod[Class].Method = {} - end - _TraceClassMethod[Class].Method[Method] = true - self:E( "Tracing method " .. Method .. " of class " .. Class ) -end - ---- Trace a function call. Must be at the beginning of the function logic. --- @param #BASE self --- @param Arguments A #table or any field. -function BASE:F( Arguments ) - - if _TraceOn and ( _TraceClass[self.ClassName] or _TraceClassMethod[self.ClassName] ) then - - local DebugInfoCurrent = debug.getinfo( 2, "nl" ) - local DebugInfoFrom = debug.getinfo( 3, "l" ) - - local Function = "function" - if DebugInfoCurrent.name then - Function = DebugInfoCurrent.name - end - - if _TraceClass[self.ClassName] or _TraceClassMethod[self.ClassName].Method[Function] then - local LineCurrent = DebugInfoCurrent.currentline - local LineFrom = 0 - if DebugInfoFrom then - LineFrom = DebugInfoFrom.currentline - end - env.info( string.format( "%6d(%6d)/%1s:%20s%05d.%s(%s)" , LineCurrent, LineFrom, "F", self.ClassName, self.ClassID, Function, routines.utils.oneLineSerialize( Arguments ) ) ) - end - end -end - ---- Trace a function call level 2. Must be at the beginning of the function logic. --- @param #BASE self --- @param Arguments A #table or any field. -function BASE:F2( Arguments ) - - if _TraceLevel >= 2 then - self:F( Arguments ) - end - -end - ---- Trace a function call level 3. Must be at the beginning of the function logic. --- @param #BASE self --- @param Arguments A #table or any field. -function BASE:F3( Arguments ) - - if _TraceLevel >= 3 then - self:F( Arguments ) - end - -end - ---- Trace a function logic. Can be anywhere within the function logic. --- @param #BASE self --- @param Arguments A #table or any field. -function BASE:T( Arguments ) - - if _TraceOn and ( _TraceClass[self.ClassName] or _TraceClassMethod[self.ClassName] ) then - - local DebugInfoCurrent = debug.getinfo( 2, "nl" ) - local DebugInfoFrom = debug.getinfo( 3, "l" ) - - local Function = "function" - if DebugInfoCurrent.name then - Function = DebugInfoCurrent.name - end - - if _TraceClass[self.ClassName] or _TraceClassMethod[self.ClassName].Method[Function] then - local LineCurrent = DebugInfoCurrent.currentline - local LineFrom = 0 - if DebugInfoFrom then - LineFrom = DebugInfoFrom.currentline - end - env.info( string.format( "%6d(%6d)/%1s:%20s%05d.%s" , LineCurrent, LineFrom, "T", self.ClassName, self.ClassID, routines.utils.oneLineSerialize( Arguments ) ) ) - end - end -end - ---- Trace a function logic level 2. Can be anywhere within the function logic. --- @param #BASE self --- @param Arguments A #table or any field. -function BASE:T2( Arguments ) - - if _TraceLevel >= 2 then - self:T( Arguments ) - end - -end - ---- Trace a function logic level 3. Can be anywhere within the function logic. --- @param #BASE self --- @param Arguments A #table or any field. -function BASE:T3( Arguments ) - - if _TraceLevel >= 3 then - self:T( Arguments ) - end - -end - ---- Log an exception which will be traced always. Can be anywhere within the function logic. --- @param #BASE self --- @param Arguments A #table or any field. -function BASE:E( Arguments ) - - local DebugInfoCurrent = debug.getinfo( 2, "nl" ) - local DebugInfoFrom = debug.getinfo( 3, "l" ) - - local Function = "function" - if DebugInfoCurrent.name then - Function = DebugInfoCurrent.name - end - - local LineCurrent = DebugInfoCurrent.currentline - local LineFrom = -1 - if DebugInfoFrom then - LineFrom = DebugInfoFrom.currentline - end - - env.info( string.format( "%6d(%6d)/%1s:%20s%05d.%s(%s)" , LineCurrent, LineFrom, "E", self.ClassName, self.ClassID, Function, routines.utils.oneLineSerialize( Arguments ) ) ) -end - - - ---- Models time events calling event handing functions. --- --- @{SCHEDULER} class --- =================== --- The @{SCHEDULER} class models time events calling given event handling functions. --- --- SCHEDULER constructor --- ===================== --- The SCHEDULER class is quite easy to use: --- --- * @{#SCHEDULER.New}: Setup a new scheduler and start it with the specified parameters. --- --- SCHEDULER timer methods --- ======================= --- The SCHEDULER can be stopped and restarted with the following methods: --- --- * @{#SCHEDULER.Start}: (Re-)Start the scheduler. --- * @{#SCHEDULER.Start}: Stop the scheduler. --- --- @module Scheduler --- @author FlightControl - -Include.File( "Routines" ) -Include.File( "Base" ) - - ---- The SCHEDULER class --- @type SCHEDULER --- @extends Base#BASE -SCHEDULER = { - ClassName = "SCHEDULER", -} - - ---- Constructor. --- @param #SCHEDULER self --- @param #table TimeEventObject Specified for which Moose object the timer is setup. If a value of nil is provided, a scheduler will be setup without an object reference. --- @param #function TimeEventFunction The event function to be called when a timer event occurs. The event function needs to accept the parameters specified in TimeEventFunctionArguments. --- @param #table TimeEventFunctionArguments Optional arguments that can be given as part of scheduler. The arguments need to be given as a table { param1, param 2, ... }. --- @param #number StartSeconds Specifies the amount of seconds that will be waited before the scheduling is started, and the event function is called. --- @param #number RepeatSecondsInterval Specifies the interval in seconds when the scheduler will call the event function. --- @param #number RandomizationFactor Specifies a randomization factor between 0 and 1 to randomize the RepeatSecondsInterval. --- @param #number StopSeconds Specifies the amount of seconds when the scheduler will be stopped. --- @return #SCHEDULER self -function SCHEDULER:New( TimeEventObject, TimeEventFunction, TimeEventFunctionArguments, StartSeconds, RepeatSecondsInterval, RandomizationFactor, StopSeconds ) - local self = BASE:Inherit( self, BASE:New() ) - self:F2( { TimeEventObject, TimeEventFunction, TimeEventFunctionArguments, StartSeconds, RepeatSecondsInterval, RandomizationFactor, StopSeconds } ) - - self.TimeEventObject = TimeEventObject - self.TimeEventFunction = TimeEventFunction - self.TimeEventFunctionArguments = TimeEventFunctionArguments - self.StartSeconds = StartSeconds - - if RepeatSecondsInterval then - self.RepeatSecondsInterval = RepeatSecondsInterval - else - self.RepeatSecondsInterval = 0 - end - - if RandomizationFactor then - self.RandomizationFactor = RandomizationFactor - else - self.RandomizationFactor = 0 - end - - if StopSeconds then - self.StopSeconds = StopSeconds - end - - self.Repeat = false - - self.StartTime = timer.getTime() - - self:Start() - - return self -end - ---- (Re-)Starts the scheduler. --- @param #SCHEDULER self --- @return #SCHEDULER self -function SCHEDULER:Start() - self:F2( self.TimeEventObject ) - - self.Repeat = true - timer.scheduleFunction( self._Scheduler, self, timer.getTime() + self.StartSeconds + .01 ) - - return self -end - ---- Stops the scheduler. --- @param #SCHEDULER self --- @return #SCHEDULER self -function SCHEDULER:Stop() - self:F2( self.TimeEventObject ) - - self.Repeat = false - - return self -end - --- Private Functions - -function SCHEDULER:_Scheduler() - self:F2( self.TimeEventFunctionArguments ) - - local ErrorHandler = function( errmsg ) - - env.info( "Error in SCHEDULER function:" .. errmsg ) - env.info( debug.traceback() ) - - return errmsg - end - - local Status, Result - if self.TimeEventObject then - Status, Result = xpcall( function() return self.TimeEventFunction( self.TimeEventObject, unpack( self.TimeEventFunctionArguments ) ) end, ErrorHandler ) - else - Status, Result = xpcall( function() return self.TimeEventFunction( unpack( self.TimeEventFunctionArguments ) ) end, ErrorHandler ) - end - - self:T( { Status, Result } ) - - if Status and ( ( not Result ) or ( Result and Result ~= false ) ) then - if self.Repeat and ( not self.StopSeconds or ( self.StopSeconds and timer.getTime() <= self.StartTime + self.StopSeconds ) ) then - timer.scheduleFunction( - self._Scheduler, - self, - timer.getTime() + self.RepeatSecondsInterval + math.random( - ( self.RandomizationFactor * self.RepeatSecondsInterval / 2 ), ( self.RandomizationFactor * self.RepeatSecondsInterval / 2 ) ) + 0.01 - ) - end - end - -end - - - - - - - - ---- The EVENT class models an efficient event handling process between other classes and its units, weapons. --- @module Event --- @author FlightControl - -Include.File( "Routines" ) -Include.File( "Base" ) - ---- The EVENT structure --- @type EVENT --- @field #EVENT.Events Events -EVENT = { - ClassName = "EVENT", - ClassID = 0, -} - -local _EVENTCODES = { - "S_EVENT_SHOT", - "S_EVENT_HIT", - "S_EVENT_TAKEOFF", - "S_EVENT_LAND", - "S_EVENT_CRASH", - "S_EVENT_EJECTION", - "S_EVENT_REFUELING", - "S_EVENT_DEAD", - "S_EVENT_PILOT_DEAD", - "S_EVENT_BASE_CAPTURED", - "S_EVENT_MISSION_START", - "S_EVENT_MISSION_END", - "S_EVENT_TOOK_CONTROL", - "S_EVENT_REFUELING_STOP", - "S_EVENT_BIRTH", - "S_EVENT_HUMAN_FAILURE", - "S_EVENT_ENGINE_STARTUP", - "S_EVENT_ENGINE_SHUTDOWN", - "S_EVENT_PLAYER_ENTER_UNIT", - "S_EVENT_PLAYER_LEAVE_UNIT", - "S_EVENT_PLAYER_COMMENT", - "S_EVENT_SHOOTING_START", - "S_EVENT_SHOOTING_END", - "S_EVENT_MAX", -} - ---- The Event structure --- @type EVENTDATA --- @field id --- @field initiator --- @field target --- @field weapon --- @field IniDCSUnit --- @field IniDCSUnitName --- @field IniDCSGroup --- @field IniDCSGroupName --- @field TgtDCSUnit --- @field TgtDCSUnitName --- @field TgtDCSGroup --- @field TgtDCSGroupName --- @field Weapon --- @field WeaponName --- @field WeaponTgtDCSUnit - ---- The Events structure --- @type EVENT.Events --- @field #number IniUnit - -function EVENT:New() - local self = BASE:Inherit( self, BASE:New() ) - self:F2() - self.EventHandler = world.addEventHandler( self ) - return self -end - -function EVENT:EventText( EventID ) - - local EventText = _EVENTCODES[EventID] - - return EventText -end - - ---- Initializes the Events structure for the event --- @param #EVENT self --- @param DCSWorld#world.event EventID --- @param #string EventClass --- @return #EVENT.Events -function EVENT:Init( EventID, EventClass ) - self:F3( { _EVENTCODES[EventID], EventClass } ) - if not self.Events[EventID] then - self.Events[EventID] = {} - end - if not self.Events[EventID][EventClass] then - self.Events[EventID][EventClass] = {} - end - return self.Events[EventID][EventClass] -end - - ---- Create an OnDead event handler for a group --- @param #EVENT self --- @param #table EventTemplate --- @param #function EventFunction The function to be called when the event occurs for the unit. --- @param EventSelf The self instance of the class for which the event is. --- @param #function OnEventFunction --- @return #EVENT -function EVENT:OnEventForTemplate( EventTemplate, EventFunction, EventSelf, OnEventFunction ) - self:F2( EventTemplate.name ) - - for EventUnitID, EventUnit in pairs( EventTemplate.units ) do - OnEventFunction( self, EventUnit.name, EventFunction, EventSelf ) - end - return self -end - ---- Set a new listener for an S_EVENT_X event independent from a unit or a weapon. --- @param #EVENT self --- @param #function EventFunction The function to be called when the event occurs for the unit. --- @param Base#BASE EventSelf The self instance of the class for which the event is. --- @param EventID --- @return #EVENT -function EVENT:OnEventGeneric( EventFunction, EventSelf, EventID ) - self:F2( { EventID } ) - - local Event = self:Init( EventID, EventSelf:GetClassNameAndID() ) - Event.EventFunction = EventFunction - Event.EventSelf = EventSelf - return self -end - - ---- Set a new listener for an S_EVENT_X event --- @param #EVENT self --- @param #string EventDCSUnitName --- @param #function EventFunction The function to be called when the event occurs for the unit. --- @param Base#BASE EventSelf The self instance of the class for which the event is. --- @param EventID --- @return #EVENT -function EVENT:OnEventForUnit( EventDCSUnitName, EventFunction, EventSelf, EventID ) - self:F2( EventDCSUnitName ) - - local Event = self:Init( EventID, EventSelf:GetClassNameAndID() ) - if not Event.IniUnit then - Event.IniUnit = {} - end - Event.IniUnit[EventDCSUnitName] = {} - Event.IniUnit[EventDCSUnitName].EventFunction = EventFunction - Event.IniUnit[EventDCSUnitName].EventSelf = EventSelf - return self -end - - ---- Create an OnBirth event handler for a group --- @param #EVENT self --- @param Group#GROUP EventGroup --- @param #function EventFunction The function to be called when the event occurs for the unit. --- @param EventSelf The self instance of the class for which the event is. --- @return #EVENT -function EVENT:OnBirthForTemplate( EventTemplate, EventFunction, EventSelf ) - self:F2( EventTemplate.name ) - - self:OnEventForTemplate( EventTemplate, EventFunction, EventSelf, self.OnBirthForUnit ) - - return self -end - ---- Set a new listener for an S_EVENT_BIRTH event, and registers the unit born. --- @param #EVENT self --- @param #function EventFunction The function to be called when the event occurs for the unit. --- @param Base#BASE EventSelf --- @return #EVENT -function EVENT:OnBirth( EventFunction, EventSelf ) - self:F2() - - self:OnEventGeneric( EventFunction, EventSelf, world.event.S_EVENT_BIRTH ) - - return self -end - ---- Set a new listener for an S_EVENT_BIRTH event. --- @param #EVENT self --- @param #string EventDCSUnitName The id of the unit for the event to be handled. --- @param #function EventFunction The function to be called when the event occurs for the unit. --- @param Base#BASE EventSelf --- @return #EVENT -function EVENT:OnBirthForUnit( EventDCSUnitName, EventFunction, EventSelf ) - self:F2( EventDCSUnitName ) - - self:OnEventForUnit( EventDCSUnitName, EventFunction, EventSelf, world.event.S_EVENT_BIRTH ) - - return self -end - ---- Create an OnCrash event handler for a group --- @param #EVENT self --- @param Group#GROUP EventGroup --- @param #function EventFunction The function to be called when the event occurs for the unit. --- @param EventSelf The self instance of the class for which the event is. --- @return #EVENT -function EVENT:OnCrashForTemplate( EventTemplate, EventFunction, EventSelf ) - self:F2( EventTemplate.name ) - - self:OnEventForTemplate( EventTemplate, EventFunction, EventSelf, self.OnCrashForUnit ) - - return self -end - ---- Set a new listener for an S_EVENT_CRASH event. --- @param #EVENT self --- @param #function EventFunction The function to be called when the event occurs for the unit. --- @param Base#BASE EventSelf --- @return #EVENT -function EVENT:OnCrash( EventFunction, EventSelf ) - self:F2() - - self:OnEventGeneric( EventFunction, EventSelf, world.event.S_EVENT_CRASH ) - - return self -end - ---- Set a new listener for an S_EVENT_CRASH event. --- @param #EVENT self --- @param #string EventDCSUnitName --- @param #function EventFunction The function to be called when the event occurs for the unit. --- @param Base#BASE EventSelf The self instance of the class for which the event is. --- @return #EVENT -function EVENT:OnCrashForUnit( EventDCSUnitName, EventFunction, EventSelf ) - self:F2( EventDCSUnitName ) - - self:OnEventForUnit( EventDCSUnitName, EventFunction, EventSelf, world.event.S_EVENT_CRASH ) - - return self -end - ---- Create an OnDead event handler for a group --- @param #EVENT self --- @param Group#GROUP EventGroup --- @param #function EventFunction The function to be called when the event occurs for the unit. --- @param EventSelf The self instance of the class for which the event is. --- @return #EVENT -function EVENT:OnDeadForTemplate( EventTemplate, EventFunction, EventSelf ) - self:F2( EventTemplate.name ) - - self:OnEventForTemplate( EventTemplate, EventFunction, EventSelf, self.OnDeadForUnit ) - - return self -end - ---- Set a new listener for an S_EVENT_DEAD event. --- @param #EVENT self --- @param #function EventFunction The function to be called when the event occurs for the unit. --- @param Base#BASE EventSelf --- @return #EVENT -function EVENT:OnDead( EventFunction, EventSelf ) - self:F2() - - self:OnEventGeneric( EventFunction, EventSelf, world.event.S_EVENT_DEAD ) - - return self -end - - ---- Set a new listener for an S_EVENT_DEAD event. --- @param #EVENT self --- @param #string EventDCSUnitName --- @param #function EventFunction The function to be called when the event occurs for the unit. --- @param Base#BASE EventSelf The self instance of the class for which the event is. --- @return #EVENT -function EVENT:OnDeadForUnit( EventDCSUnitName, EventFunction, EventSelf ) - self:F2( EventDCSUnitName ) - - self:OnEventForUnit( EventDCSUnitName, EventFunction, EventSelf, world.event.S_EVENT_DEAD ) - - return self -end - ---- Set a new listener for an S_EVENT_PILOT_DEAD event. --- @param #EVENT self --- @param #string EventDCSUnitName --- @param #function EventFunction The function to be called when the event occurs for the unit. --- @param Base#BASE EventSelf The self instance of the class for which the event is. --- @return #EVENT -function EVENT:OnPilotDeadForUnit( EventDCSUnitName, EventFunction, EventSelf ) - self:F2( EventDCSUnitName ) - - self:OnEventForUnit( EventDCSUnitName, EventFunction, EventSelf, world.event.S_EVENT_PILOT_DEAD ) - - return self -end - ---- Create an OnDead event handler for a group --- @param #EVENT self --- @param #table EventTemplate --- @param #function EventFunction The function to be called when the event occurs for the unit. --- @param EventSelf The self instance of the class for which the event is. --- @return #EVENT -function EVENT:OnLandForTemplate( EventTemplate, EventFunction, EventSelf ) - self:F2( EventTemplate.name ) - - self:OnEventForTemplate( EventTemplate, EventFunction, EventSelf, self.OnLandForUnit ) - - return self -end - ---- Set a new listener for an S_EVENT_LAND event. --- @param #EVENT self --- @param #string EventDCSUnitName --- @param #function EventFunction The function to be called when the event occurs for the unit. --- @param Base#BASE EventSelf The self instance of the class for which the event is. --- @return #EVENT -function EVENT:OnLandForUnit( EventDCSUnitName, EventFunction, EventSelf ) - self:F2( EventDCSUnitName ) - - self:OnEventForUnit( EventDCSUnitName, EventFunction, EventSelf, world.event.S_EVENT_LAND ) - - return self -end - ---- Create an OnDead event handler for a group --- @param #EVENT self --- @param #table EventTemplate --- @param #function EventFunction The function to be called when the event occurs for the unit. --- @param EventSelf The self instance of the class for which the event is. --- @return #EVENT -function EVENT:OnTakeOffForTemplate( EventTemplate, EventFunction, EventSelf ) - self:F2( EventTemplate.name ) - - self:OnEventForTemplate( EventTemplate, EventFunction, EventSelf, self.OnTakeOffForUnit ) - - return self -end - ---- Set a new listener for an S_EVENT_TAKEOFF event. --- @param #EVENT self --- @param #string EventDCSUnitName --- @param #function EventFunction The function to be called when the event occurs for the unit. --- @param Base#BASE EventSelf The self instance of the class for which the event is. --- @return #EVENT -function EVENT:OnTakeOffForUnit( EventDCSUnitName, EventFunction, EventSelf ) - self:F2( EventDCSUnitName ) - - self:OnEventForUnit( EventDCSUnitName, EventFunction, EventSelf, world.event.S_EVENT_TAKEOFF ) - - return self -end - ---- Create an OnDead event handler for a group --- @param #EVENT self --- @param #table EventTemplate --- @param #function EventFunction The function to be called when the event occurs for the unit. --- @param EventSelf The self instance of the class for which the event is. --- @return #EVENT -function EVENT:OnEngineShutDownForTemplate( EventTemplate, EventFunction, EventSelf ) - self:F2( EventTemplate.name ) - - self:OnEventForTemplate( EventTemplate, EventFunction, EventSelf, self.OnEngineShutDownForUnit ) - - return self -end - ---- Set a new listener for an S_EVENT_ENGINE_SHUTDOWN event. --- @param #EVENT self --- @param #string EventDCSUnitName --- @param #function EventFunction The function to be called when the event occurs for the unit. --- @param Base#BASE EventSelf The self instance of the class for which the event is. --- @return #EVENT -function EVENT:OnEngineShutDownForUnit( EventDCSUnitName, EventFunction, EventSelf ) - self:F2( EventDCSUnitName ) - - self:OnEventForUnit( EventDCSUnitName, EventFunction, EventSelf, world.event.S_EVENT_ENGINE_SHUTDOWN ) - - return self -end - ---- Set a new listener for an S_EVENT_ENGINE_STARTUP event. --- @param #EVENT self --- @param #string EventDCSUnitName --- @param #function EventFunction The function to be called when the event occurs for the unit. --- @param Base#BASE EventSelf The self instance of the class for which the event is. --- @return #EVENT -function EVENT:OnEngineStartUpForUnit( EventDCSUnitName, EventFunction, EventSelf ) - self:F2( EventDCSUnitName ) - - self:OnEventForUnit( EventDCSUnitName, EventFunction, EventSelf, world.event.S_EVENT_ENGINE_STARTUP ) - - return self -end - ---- Set a new listener for an S_EVENT_SHOT event. --- @param #EVENT self --- @param #function EventFunction The function to be called when the event occurs for the unit. --- @param Base#BASE EventSelf The self instance of the class for which the event is. --- @return #EVENT -function EVENT:OnShot( EventFunction, EventSelf ) - self:F2() - - self:OnEventGeneric( EventFunction, EventSelf, world.event.S_EVENT_SHOT ) - - return self -end - ---- Set a new listener for an S_EVENT_SHOT event for a unit. --- @param #EVENT self --- @param #string EventDCSUnitName --- @param #function EventFunction The function to be called when the event occurs for the unit. --- @param Base#BASE EventSelf The self instance of the class for which the event is. --- @return #EVENT -function EVENT:OnShotForUnit( EventDCSUnitName, EventFunction, EventSelf ) - self:F2( EventDCSUnitName ) - - self:OnEventForUnit( EventDCSUnitName, EventFunction, EventSelf, world.event.S_EVENT_SHOT ) - - return self -end - ---- Set a new listener for an S_EVENT_HIT event. --- @param #EVENT self --- @param #function EventFunction The function to be called when the event occurs for the unit. --- @param Base#BASE EventSelf The self instance of the class for which the event is. --- @return #EVENT -function EVENT:OnHit( EventFunction, EventSelf ) - self:F2() - - self:OnEventGeneric( EventFunction, EventSelf, world.event.S_EVENT_HIT ) - - return self -end - ---- Set a new listener for an S_EVENT_HIT event. --- @param #EVENT self --- @param #string EventDCSUnitName --- @param #function EventFunction The function to be called when the event occurs for the unit. --- @param Base#BASE EventSelf The self instance of the class for which the event is. --- @return #EVENT -function EVENT:OnHitForUnit( EventDCSUnitName, EventFunction, EventSelf ) - self:F2( EventDCSUnitName ) - - self:OnEventForUnit( EventDCSUnitName, EventFunction, EventSelf, world.event.S_EVENT_HIT ) - - return self -end - ---- Set a new listener for an S_EVENT_PLAYER_ENTER_UNIT event. --- @param #EVENT self --- @param #function EventFunction The function to be called when the event occurs for the unit. --- @param Base#BASE EventSelf The self instance of the class for which the event is. --- @return #EVENT -function EVENT:OnPlayerEnterUnit( EventFunction, EventSelf ) - self:F2() - - self:OnEventGeneric( EventFunction, EventSelf, world.event.S_EVENT_PLAYER_ENTER_UNIT ) - - return self -end - ---- Set a new listener for an S_EVENT_PLAYER_LEAVE_UNIT event. --- @param #EVENT self --- @param #function EventFunction The function to be called when the event occurs for the unit. --- @param Base#BASE EventSelf The self instance of the class for which the event is. --- @return #EVENT -function EVENT:OnPlayerLeaveUnit( EventFunction, EventSelf ) - self:F2() - - self:OnEventGeneric( EventFunction, EventSelf, world.event.S_EVENT_PLAYER_LEAVE_UNIT ) - - return self -end - - - -function EVENT:onEvent( Event ) - self:F2( { _EVENTCODES[Event.id], Event } ) - - if self and self.Events and self.Events[Event.id] then - if Event.initiator and Event.initiator:getCategory() == Object.Category.UNIT then - Event.IniDCSUnit = Event.initiator - Event.IniDCSGroup = Event.IniDCSUnit:getGroup() - Event.IniDCSUnitName = Event.IniDCSUnit:getName() - Event.IniDCSGroupName = "" - if Event.IniDCSGroup and Event.IniDCSGroup:isExist() then - Event.IniDCSGroupName = Event.IniDCSGroup:getName() - end - end - if Event.target then - if Event.target and Event.target:getCategory() == Object.Category.UNIT then - Event.TgtDCSUnit = Event.target - Event.TgtDCSGroup = Event.TgtDCSUnit:getGroup() - Event.TgtDCSUnitName = Event.TgtDCSUnit:getName() - Event.TgtDCSGroupName = "" - if Event.TgtDCSGroup and Event.TgtDCSGroup:isExist() then - Event.TgtDCSGroupName = Event.TgtDCSGroup:getName() - end - end - end - if Event.weapon then - Event.Weapon = Event.weapon - Event.WeaponName = Event.Weapon:getTypeName() - --Event.WeaponTgtDCSUnit = Event.Weapon:getTarget() - end - self:E( { _EVENTCODES[Event.id], Event } ) - for ClassName, EventData in pairs( self.Events[Event.id] ) do - if Event.IniDCSUnitName and EventData.IniUnit and EventData.IniUnit[Event.IniDCSUnitName] then - self:T2( { "Calling event function for class ", ClassName, " unit ", Event.IniDCSUnitName } ) - EventData.IniUnit[Event.IniDCSUnitName].EventFunction( EventData.IniUnit[Event.IniDCSUnitName].EventSelf, Event ) - else - if Event.IniDCSUnit and not EventData.IniUnit then - self:T2( { "Calling event function for class ", ClassName } ) - EventData.EventFunction( EventData.EventSelf, Event ) - end - end - end - end -end - ---- Encapsulation of DCS World Menu system in a set of MENU classes. --- @module Menu - -Include.File( "Routines" ) -Include.File( "Base" ) - ---- The MENU class --- @type MENU --- @extends Base#BASE -MENU = { - ClassName = "MENU", - MenuPath = nil, - MenuText = "", - MenuParentPath = nil -} - ---- -function MENU:New( MenuText, MenuParentPath ) - - -- Arrange meta tables - local Child = BASE:Inherit( self, BASE:New() ) - - Child.MenuPath = nil - Child.MenuText = MenuText - Child.MenuParentPath = MenuParentPath - return Child -end - ---- The COMMANDMENU class --- @type COMMANDMENU --- @extends Menu#MENU -COMMANDMENU = { - ClassName = "COMMANDMENU", - CommandMenuFunction = nil, - CommandMenuArgument = nil -} - -function COMMANDMENU:New( MenuText, ParentMenu, CommandMenuFunction, CommandMenuArgument ) - - -- Arrange meta tables - - local MenuParentPath = nil - if ParentMenu ~= nil then - MenuParentPath = ParentMenu.MenuPath - end - - local Child = BASE:Inherit( self, MENU:New( MenuText, MenuParentPath ) ) - - Child.MenuPath = missionCommands.addCommand( MenuText, MenuParentPath, CommandMenuFunction, CommandMenuArgument ) - Child.CommandMenuFunction = CommandMenuFunction - Child.CommandMenuArgument = CommandMenuArgument - return Child -end - ---- The SUBMENU class --- @type SUBMENU --- @extends Menu#MENU -SUBMENU = { - ClassName = "SUBMENU" -} - -function SUBMENU:New( MenuText, ParentMenu ) - - -- Arrange meta tables - local MenuParentPath = nil - if ParentMenu ~= nil then - MenuParentPath = ParentMenu.MenuPath - end - - local Child = BASE:Inherit( self, MENU:New( MenuText, MenuParentPath ) ) - - Child.MenuPath = missionCommands.addSubMenu( MenuText, MenuParentPath ) - return Child -end - --- This local variable is used to cache the menus registered under clients. --- Menus don't dissapear when clients are destroyed and restarted. --- So every menu for a client created must be tracked so that program logic accidentally does not create --- the same menus twice during initialization logic. --- These menu classes are handling this logic with this variable. -local _MENUCLIENTS = {} - ---- The MENU_CLIENT class --- @type MENU_CLIENT --- @extends Menu#MENU -MENU_CLIENT = { - ClassName = "MENU_CLIENT" -} - ---- Creates a new menu item for a group --- @param self --- @param Client#CLIENT MenuClient The Client owning the menu. --- @param #string MenuText The text for the menu. --- @param #table ParentMenu The parent menu. --- @return #MENU_CLIENT self -function MENU_CLIENT:New( MenuClient, MenuText, ParentMenu ) - - -- Arrange meta tables - local MenuParentPath = {} - if ParentMenu ~= nil then - MenuParentPath = ParentMenu.MenuPath - end - - local self = BASE:Inherit( self, MENU:New( MenuText, MenuParentPath ) ) - self:F( { MenuClient, MenuText, ParentMenu } ) - - self.MenuClient = MenuClient - self.MenuClientGroupID = MenuClient:GetClientGroupID() - self.MenuParentPath = MenuParentPath - self.MenuText = MenuText - self.ParentMenu = ParentMenu - - self.Menus = {} - - if not _MENUCLIENTS[self.MenuClientGroupID] then - _MENUCLIENTS[self.MenuClientGroupID] = {} - end - - local MenuPath = _MENUCLIENTS[self.MenuClientGroupID] - - self:T( { MenuClient:GetClientGroupName(), MenuPath[table.concat(MenuParentPath)], MenuParentPath, MenuText } ) - - local MenuPathID = table.concat(MenuParentPath) .. "/" .. MenuText - if MenuPath[MenuPathID] then - missionCommands.removeItemForGroup( self.MenuClient:GetClientGroupID(), MenuPath[MenuPathID] ) - end - - self.MenuPath = missionCommands.addSubMenuForGroup( self.MenuClient:GetClientGroupID(), MenuText, MenuParentPath ) - MenuPath[MenuPathID] = self.MenuPath - - self:T( { MenuClient:GetClientGroupName(), self.MenuPath } ) - - if ParentMenu and ParentMenu.Menus then - ParentMenu.Menus[self.MenuPath] = self - end - return self -end - ---- Removes the sub menus recursively of this MENU_CLIENT. --- @param #MENU_CLIENT self --- @return #MENU_CLIENT self -function MENU_CLIENT:RemoveSubMenus() - self:F( self.MenuPath ) - - for MenuID, Menu in pairs( self.Menus ) do - Menu:Remove() - end - -end - ---- Removes the sub menus recursively of this MENU_CLIENT. --- @param #MENU_CLIENT self --- @return #MENU_CLIENT self -function MENU_CLIENT:Remove() - self:F( self.MenuPath ) - - self:RemoveSubMenus() - - if not _MENUCLIENTS[self.MenuClientGroupID] then - _MENUCLIENTS[self.MenuClientGroupID] = {} - end - - local MenuPath = _MENUCLIENTS[self.MenuClientGroupID] - - if MenuPath[table.concat(self.MenuParentPath) .. "/" .. self.MenuText] then - MenuPath[table.concat(self.MenuParentPath) .. "/" .. self.MenuText] = nil - end - - missionCommands.removeItemForGroup( self.MenuClient:GetClientGroupID(), self.MenuPath ) - self.ParentMenu.Menus[self.MenuPath] = nil - return nil -end - - ---- The MENU_CLIENT_COMMAND class --- @type MENU_CLIENT_COMMAND --- @extends Menu#MENU -MENU_CLIENT_COMMAND = { - ClassName = "MENU_CLIENT_COMMAND" -} - ---- Creates a new radio command item for a group --- @param self --- @param Client#CLIENT MenuClient The Client owning the menu. --- @param MenuText The text for the menu. --- @param ParentMenu The parent menu. --- @param CommandMenuFunction A function that is called when the menu key is pressed. --- @param CommandMenuArgument An argument for the function. --- @return Menu#MENU_CLIENT_COMMAND self -function MENU_CLIENT_COMMAND:New( MenuClient, MenuText, ParentMenu, CommandMenuFunction, CommandMenuArgument ) - - -- Arrange meta tables - - local MenuParentPath = {} - if ParentMenu ~= nil then - MenuParentPath = ParentMenu.MenuPath - end - - local self = BASE:Inherit( self, MENU:New( MenuText, MenuParentPath ) ) - - self.MenuClient = MenuClient - self.MenuClientGroupID = MenuClient:GetClientGroupID() - self.MenuParentPath = MenuParentPath - self.MenuText = MenuText - self.ParentMenu = ParentMenu - - if not _MENUCLIENTS[self.MenuClientGroupID] then - _MENUCLIENTS[self.MenuClientGroupID] = {} - end - - local MenuPath = _MENUCLIENTS[self.MenuClientGroupID] - - self:T( { MenuClient:GetClientGroupName(), MenuPath[table.concat(MenuParentPath)], MenuParentPath, MenuText, CommandMenuFunction, CommandMenuArgument } ) - - local MenuPathID = table.concat(MenuParentPath) .. "/" .. MenuText - if MenuPath[MenuPathID] then - missionCommands.removeItemForGroup( self.MenuClient:GetClientGroupID(), MenuPath[MenuPathID] ) - end - - self.MenuPath = missionCommands.addCommandForGroup( self.MenuClient:GetClientGroupID(), MenuText, MenuParentPath, CommandMenuFunction, CommandMenuArgument ) - MenuPath[MenuPathID] = self.MenuPath - - self.CommandMenuFunction = CommandMenuFunction - self.CommandMenuArgument = CommandMenuArgument - - ParentMenu.Menus[self.MenuPath] = self - - return self -end - -function MENU_CLIENT_COMMAND:Remove() - self:F( self.MenuPath ) - - if not _MENUCLIENTS[self.MenuClientGroupID] then - _MENUCLIENTS[self.MenuClientGroupID] = {} - end - - local MenuPath = _MENUCLIENTS[self.MenuClientGroupID] - - if MenuPath[table.concat(self.MenuParentPath) .. "/" .. self.MenuText] then - MenuPath[table.concat(self.MenuParentPath) .. "/" .. self.MenuText] = nil - end - - missionCommands.removeItemForGroup( self.MenuClient:GetClientGroupID(), self.MenuPath ) - self.ParentMenu.Menus[self.MenuPath] = nil - return nil -end - - ---- The MENU_COALITION class --- @type MENU_COALITION --- @extends Menu#MENU -MENU_COALITION = { - ClassName = "MENU_COALITION" -} - ---- Creates a new coalition menu item --- @param #MENU_COALITION self --- @param DCSCoalition#coalition.side MenuCoalition The coalition owning the menu. --- @param #string MenuText The text for the menu. --- @param #table ParentMenu The parent menu. --- @return #MENU_COALITION self -function MENU_COALITION:New( MenuCoalition, MenuText, ParentMenu ) - - -- Arrange meta tables - local MenuParentPath = {} - if ParentMenu ~= nil then - MenuParentPath = ParentMenu.MenuPath - end - - local self = BASE:Inherit( self, MENU:New( MenuText, MenuParentPath ) ) - self:F( { MenuCoalition, MenuText, ParentMenu } ) - - self.MenuCoalition = MenuCoalition - self.MenuParentPath = MenuParentPath - self.MenuText = MenuText - self.ParentMenu = ParentMenu - - self.Menus = {} - - self:T( { MenuParentPath, MenuText } ) - - self.MenuPath = missionCommands.addSubMenuForCoalition( self.MenuCoalition, MenuText, MenuParentPath ) - - self:T( { self.MenuPath } ) - - if ParentMenu and ParentMenu.Menus then - ParentMenu.Menus[self.MenuPath] = self - end - return self -end - ---- Removes the sub menus recursively of this MENU_COALITION. --- @param #MENU_COALITION self --- @return #MENU_COALITION self -function MENU_COALITION:RemoveSubMenus() - self:F( self.MenuPath ) - - for MenuID, Menu in pairs( self.Menus ) do - Menu:Remove() - end - -end - ---- Removes the sub menus recursively of this MENU_COALITION. --- @param #MENU_COALITION self --- @return #MENU_COALITION self -function MENU_COALITION:Remove() - self:F( self.MenuPath ) - - self:RemoveSubMenus() - missionCommands.removeItemForCoalition( self.MenuCoalition, self.MenuPath ) - self.ParentMenu.Menus[self.MenuPath] = nil - - return nil -end - - ---- The MENU_COALITION_COMMAND class --- @type MENU_COALITION_COMMAND --- @extends Menu#MENU -MENU_COALITION_COMMAND = { - ClassName = "MENU_COALITION_COMMAND" -} - ---- Creates a new radio command item for a group --- @param #MENU_COALITION_COMMAND self --- @param DCSCoalition#coalition.side MenuCoalition The coalition owning the menu. --- @param MenuText The text for the menu. --- @param ParentMenu The parent menu. --- @param CommandMenuFunction A function that is called when the menu key is pressed. --- @param CommandMenuArgument An argument for the function. --- @return #MENU_COALITION_COMMAND self -function MENU_COALITION_COMMAND:New( MenuCoalition, MenuText, ParentMenu, CommandMenuFunction, CommandMenuArgument ) - - -- Arrange meta tables - - local MenuParentPath = {} - if ParentMenu ~= nil then - MenuParentPath = ParentMenu.MenuPath - end - - local self = BASE:Inherit( self, MENU:New( MenuText, MenuParentPath ) ) - - self.MenuCoalition = MenuCoalition - self.MenuParentPath = MenuParentPath - self.MenuText = MenuText - self.ParentMenu = ParentMenu - - self:T( { MenuParentPath, MenuText, CommandMenuFunction, CommandMenuArgument } ) - - self.MenuPath = missionCommands.addCommandForCoalition( self.MenuCoalition, MenuText, MenuParentPath, CommandMenuFunction, CommandMenuArgument ) - - self.CommandMenuFunction = CommandMenuFunction - self.CommandMenuArgument = CommandMenuArgument - - ParentMenu.Menus[self.MenuPath] = self - - return self -end - ---- Removes a radio command item for a coalition --- @param #MENU_COALITION_COMMAND self --- @return #MENU_COALITION_COMMAND self -function MENU_COALITION_COMMAND:Remove() - self:F( self.MenuPath ) - - missionCommands.removeItemForCoalition( self.MenuCoalition, self.MenuPath ) - self.ParentMenu.Menus[self.MenuPath] = nil - return nil -end ---- GROUP class. --- --- @{GROUP} class --- ============== --- The @{GROUP} class is a wrapper class to handle the DCS Group objects: --- --- * Support all DCS Group APIs. --- * Enhance with Group specific APIs not in the DCS Group API set. --- * Handle local Group Controller. --- * Manage the "state" of the DCS Group. --- --- --- GROUP reference methods --- ======================= --- For each DCS Group object alive within a running mission, a GROUP wrapper object (instance) will be created within the _@{DATABASE} object. --- This is done at the beginning of the mission (when the mission starts), and dynamically when new DCS Group objects are spawned (using the @{SPAWN} class). --- --- The GROUP class does not contain a :New() method, rather it provides :Find() methods to retrieve the object reference --- using the DCS Group or the DCS GroupName. --- --- Another thing to know is that GROUP objects do not "contain" the DCS Group object. --- The GROUP methods will reference the DCS Group object by name when it is needed during API execution. --- If the DCS Group object does not exist or is nil, the GROUP methods will return nil and log an exception in the DCS.log file. --- --- The GROUP class provides the following functions to retrieve quickly the relevant GROUP instance: --- --- * @{#GROUP.Find}(): Find a GROUP instance from the _DATABASE object using a DCS Group object. --- * @{#GROUP.FindByName}(): Find a GROUP instance from the _DATABASE object using a DCS Group name. --- --- IMPORTANT: ONE SHOULD NEVER SANATIZE these GROUP OBJECT REFERENCES! (make the GROUP object references nil). --- @module Group --- @author FlightControl - -Include.File( "Routines" ) -Include.File( "Base" ) -Include.File( "Message" ) -Include.File( "Unit" ) - ---- The GROUP class --- @type GROUP --- @extends Base#BASE --- @field DCSGroup#Group DCSGroup The DCS group class. --- @field #string GroupName The name of the group. -GROUP = { - ClassName = "GROUP", - GroupName = "", - GroupID = 0, - Controller = nil, - DCSGroup = nil, - WayPointFunctions = {}, -} - ---- A DCSGroup --- @type DCSGroup --- @field id_ The ID of the group in DCS - ---- Create a new GROUP from a DCSGroup --- @param #GROUP self --- @param DCSGroup#Group GroupName The DCS Group name --- @return #GROUP self -function GROUP:Register( GroupName ) - local self = BASE:Inherit( self, BASE:New() ) - self:F2( GroupName ) - self.GroupName = GroupName - return self -end - --- Reference methods. - ---- Find the GROUP wrapper class instance using the DCS Group. --- @param #GROUP self --- @param DCSGroup#Group DCSGroup The DCS Group. --- @return #GROUP The GROUP. -function GROUP:Find( DCSGroup ) - - local GroupName = DCSGroup:getName() -- Group#GROUP - local GroupFound = _DATABASE:FindGroup( GroupName ) - return GroupFound -end - ---- Find the created GROUP using the DCS Group Name. --- @param #GROUP self --- @param #string GroupName The DCS Group Name. --- @return #GROUP The GROUP. -function GROUP:FindByName( GroupName ) - - local GroupFound = _DATABASE:FindGroup( GroupName ) - return GroupFound -end - --- DCS Group methods support. - ---- Returns the DCS Group. --- @param #GROUP self --- @return DCSGroup#Group The DCS Group. -function GROUP:GetDCSGroup() - local DCSGroup = Group.getByName( self.GroupName ) - - if DCSGroup then - return DCSGroup - end - - return nil -end - - ---- Returns if the DCS Group is alive. --- When the group exists at run-time, this method will return true, otherwise false. --- @param #GROUP self --- @return #boolean true if the DCS Group is alive. -function GROUP:IsAlive() - self:F2( self.GroupName ) - - local DCSGroup = self:GetDCSGroup() - - if DCSGroup then - local GroupIsAlive = DCSGroup:isExist() - self:T3( GroupIsAlive ) - return GroupIsAlive - end - - return nil -end - ---- Destroys the DCS Group and all of its DCS Units. --- Note that this destroy method also raises a destroy event at run-time. --- So all event listeners will catch the destroy event of this DCS Group. --- @param #GROUP self -function GROUP:Destroy() - self:F2( self.GroupName ) - - local DCSGroup = self:GetDCSGroup() - - if DCSGroup then - for Index, UnitData in pairs( DCSGroup:getUnits() ) do - self:CreateEventCrash( timer.getTime(), UnitData ) - end - DCSGroup:destroy() - DCSGroup = nil - end - - return nil -end - ---- Returns category of the DCS Group. --- @param #GROUP self --- @return DCSGroup#Group.Category The category ID -function GROUP:GetCategory() - self:F2( self.GroupName ) - - local DCSGroup = self:GetDCSGroup() - if DCSGroup then - local GroupCategory = DCSGroup:getCategory() - self:T3( GroupCategory ) - return GroupCategory - end - - return nil -end - ---- Returns the category name of the DCS Group. --- @param #GROUP self --- @return #string Category name = Helicopter, Airplane, Ground Unit, Ship -function GROUP:GetCategoryName() - self:F2( self.GroupName ) - - local DCSGroup = self:GetDCSGroup() - if DCSGroup then - local CategoryNames = { - [Group.Category.AIRPLANE] = "Airplane", - [Group.Category.HELICOPTER] = "Helicopter", - [Group.Category.GROUND] = "Ground Unit", - [Group.Category.SHIP] = "Ship", - } - local GroupCategory = DCSGroup:getCategory() - self:T3( GroupCategory ) - - return CategoryNames[GroupCategory] - end - - return nil -end - - ---- Returns the coalition of the DCS Group. --- @param #GROUP self --- @return DCSCoalitionObject#coalition.side The coalition side of the DCS Group. -function GROUP:GetCoalition() - self:F2( self.GroupName ) - - local DCSGroup = self:GetDCSGroup() - if DCSGroup then - local GroupCoalition = DCSGroup:getCoalition() - self:T3( GroupCoalition ) - return GroupCoalition - end - - return nil -end - ---- Returns the country of the DCS Group. --- @param #GROUP self --- @return DCScountry#country.id The country identifier. --- @return #nil The DCS Group is not existing or alive. -function GROUP:GetCountry() - self:F2( self.GroupName ) - - local DCSGroup = self:GetDCSGroup() - if DCSGroup then - local GroupCountry = DCSGroup:getUnit(1):getCountry() - self:T3( GroupCountry ) - return GroupCountry - end - - return nil -end - ---- Returns the name of the DCS Group. --- @param #GROUP self --- @return #string The DCS Group name. -function GROUP:GetName() - self:F2( self.GroupName ) - - local DCSGroup = self:GetDCSGroup() - - if DCSGroup then - local GroupName = DCSGroup:getName() - self:T3( GroupName ) - return GroupName - end - - return nil -end - ---- Returns the DCS Group identifier. --- @param #GROUP self --- @return #number The identifier of the DCS Group. -function GROUP:GetID() - self:F2( self.GroupName ) - - local DCSGroup = self:GetDCSGroup() - - if DCSGroup then - local GroupID = DCSGroup:getID() - self:T3( GroupID ) - return GroupID - end - - return nil -end - ---- Returns the UNIT wrapper class with number UnitNumber. --- If the underlying DCS Unit does not exist, the method will return nil. . --- @param #GROUP self --- @param #number UnitNumber The number of the UNIT wrapper class to be returned. --- @return Unit#UNIT The UNIT wrapper class. -function GROUP:GetUnit( UnitNumber ) - self:F2( { self.GroupName, UnitNumber } ) - - local DCSGroup = self:GetDCSGroup() - - if DCSGroup then - local UnitFound = UNIT:Find( DCSGroup:getUnit( UnitNumber ) ) - self:T3( UnitFound.UnitName ) - self:T2( UnitFound ) - return UnitFound - end - - return nil -end - ---- Returns the DCS Unit with number UnitNumber. --- If the underlying DCS Unit does not exist, the method will return nil. . --- @param #GROUP self --- @param #number UnitNumber The number of the DCS Unit to be returned. --- @return DCSUnit#Unit The DCS Unit. -function GROUP:GetDCSUnit( UnitNumber ) - self:F2( { self.GroupName, UnitNumber } ) - - local DCSGroup = self:GetDCSGroup() - - if DCSGroup then - local DCSUnitFound = DCSGroup:getUnit( UnitNumber ) - self:T3( DCSUnitFound ) - return DCSUnitFound - end - - return nil -end - ---- Returns current size of the DCS Group. --- If some of the DCS Units of the DCS Group are destroyed the size of the DCS Group is changed. --- @param #GROUP self --- @return #number The DCS Group size. -function GROUP:GetSize() - self:F2( { self.GroupName } ) - local DCSGroup = self:GetDCSGroup() - - if DCSGroup then - local GroupSize = DCSGroup:getSize() - self:T3( GroupSize ) - return GroupSize - end - - return nil -end - ---- ---- Returns the initial size of the DCS Group. --- If some of the DCS Units of the DCS Group are destroyed, the initial size of the DCS Group is unchanged. --- @param #GROUP self --- @return #number The DCS Group initial size. -function GROUP:GetInitialSize() - self:F2( { self.GroupName } ) - local DCSGroup = self:GetDCSGroup() - - if DCSGroup then - local GroupInitialSize = DCSGroup:getInitialSize() - self:T3( GroupInitialSize ) - return GroupInitialSize - end - - return nil -end - ---- Returns the UNITs wrappers of the DCS Units of the DCS Group. --- @param #GROUP self --- @return #table The UNITs wrappers. -function GROUP:GetUnits() - self:F2( { self.GroupName } ) - local DCSGroup = self:GetDCSGroup() - - if DCSGroup then - local DCSUnits = DCSGroup:getUnits() - local Units = {} - for Index, UnitData in pairs( DCSUnits ) do - Units[#Units+1] = UNIT:Find( UnitData ) - end - self:T3( Units ) - return Units - end - - return nil -end - - ---- Returns the DCS Units of the DCS Group. --- @param #GROUP self --- @return #table The DCS Units. -function GROUP:GetDCSUnits() - self:F2( { self.GroupName } ) - local DCSGroup = self:GetDCSGroup() - - if DCSGroup then - local DCSUnits = DCSGroup:getUnits() - self:T3( DCSUnits ) - return DCSUnits - end - - return nil -end - ---- Get the controller for the GROUP. --- @param #GROUP self --- @return DCSController#Controller -function GROUP:_GetController() - self:F2( { self.GroupName } ) - local DCSGroup = self:GetDCSGroup() - - if DCSGroup then - local GroupController = DCSGroup:getController() - self:T3( GroupController ) - return GroupController - end - - return nil -end - - ---- Retrieve the group mission and allow to place function hooks within the mission waypoint plan. --- Use the method @{Group#GROUP:WayPointFunction} to define the hook functions for specific waypoints. --- Use the method @{Group@GROUP:WayPointExecute) to start the execution of the new mission plan. --- Note that when WayPointInitialize is called, the Mission of the group is RESTARTED! --- @param #GROUP self --- @return #GROUP -function GROUP:WayPointInitialize() - - self.WayPoints = self:GetTaskRoute() - - return self -end - - ---- Registers a waypoint function that will be executed when the group moves over the WayPoint. --- @param #GROUP self --- @param #number WayPoint The waypoint number. Note that the start waypoint on the route is WayPoint 1! --- @param #number WayPointIndex When defining multiple WayPoint functions for one WayPoint, use WayPointIndex to set the sequence of actions. --- @param #function WayPointFunction The waypoint function to be called when the group moves over the waypoint. The waypoint function takes variable parameters. --- @return #GROUP -function GROUP:WayPointFunction( WayPoint, WayPointIndex, WayPointFunction, ... ) - self:F2( { WayPoint, WayPointIndex, WayPointFunction } ) - - table.insert( self.WayPoints[WayPoint].task.params.tasks, WayPointIndex ) - self.WayPoints[WayPoint].task.params.tasks[WayPointIndex] = self:TaskFunction( WayPoint, WayPointIndex, WayPointFunction, arg ) - return self -end - - -function GROUP:TaskFunction( WayPoint, WayPointIndex, FunctionString, FunctionArguments ) - - local DCSTask - - local DCSScript = {} - DCSScript[#DCSScript+1] = "local MissionGroup = GROUP:Find( ... ) " - - if FunctionArguments.n > 0 then - DCSScript[#DCSScript+1] = FunctionString .. "( MissionGroup, " .. table.concat( FunctionArguments, "," ) .. ")" - else - DCSScript[#DCSScript+1] = FunctionString .. "( MissionGroup )" - end - - DCSTask = self:TaskWrappedAction( - self:CommandDoScript( - table.concat( DCSScript ) - ), WayPointIndex - ) - - self:T3( DCSTask ) - - return DCSTask - -end - - - ---- Executes the WayPoint plan. --- The function gets a WayPoint parameter, that you can use to restart the mission at a specific WayPoint. --- Note that when the WayPoint parameter is used, the new start mission waypoint of the group will be 1! --- @param #GROUP self --- @param #number WayPoint The WayPoint from where to execute the mission. --- @param #number WaitTime The amount seconds to wait before initiating the mission. --- @return #GROUP -function GROUP:WayPointExecute( WayPoint, WaitTime ) - - if not WayPoint then - WayPoint = 1 - end - - -- When starting the mission from a certain point, the TaskPoints need to be deleted before the given WayPoint. - for TaskPointID = 1, WayPoint - 1 do - table.remove( self.WayPoints, 1 ) - end - - self:T3( self.WayPoints ) - - self:SetTask( self:TaskRoute( self.WayPoints ), WaitTime ) - - return self -end - - ---- Activates a GROUP. --- @param #GROUP self -function GROUP:Activate() - self:F2( { self.GroupName } ) - trigger.action.activateGroup( self:GetDCSGroup() ) - return self:GetDCSGroup() -end - - ---- Gets the type name of the group. --- @param #GROUP self --- @return #string The type name of the group. -function GROUP:GetTypeName() - self:F2( self.GroupName ) - - local DCSGroup = self:GetDCSGroup() - - if DCSGroup then - local GroupTypeName = DCSGroup:getUnit(1):getTypeName() - self:T3( GroupTypeName ) - return( GroupTypeName ) - end - - return nil -end - ---- Gets the CallSign of the first DCS Unit of the DCS Group. --- @param #GROUP self --- @return #string The CallSign of the first DCS Unit of the DCS Group. -function GROUP:GetCallsign() - self:F2( self.GroupName ) - - local DCSGroup = self:GetDCSGroup() - - if DCSGroup then - local GroupCallSign = DCSGroup:getUnit(1):getCallsign() - self:T3( GroupCallSign ) - return GroupCallSign - end - - return nil -end - ---- Returns the current point (Vec2 vector) of the first DCS Unit in the DCS Group. --- @return DCSTypes#Vec2 Current Vec2 point of the first DCS Unit of the DCS Group. -function GROUP:GetPointVec2() - self:F2( self.GroupName ) - - local GroupPointVec2 = self:GetUnit(1):GetPointVec2() - self:T3( GroupPointVec2 ) - return GroupPointVec2 -end - ---- Returns the current point (Vec3 vector) of the first DCS Unit in the DCS Group. --- @return DCSTypes#Vec3 Current Vec3 point of the first DCS Unit of the DCS Group. -function GROUP:GetPointVec3() - self:F2( self.GroupName ) - - local GroupPointVec3 = self:GetUnit(1):GetPointVec3() - self:T3( GroupPointVec3 ) - return GroupPointVec3 -end - - - --- Is Functions - ---- Returns if all units of the group are within a @{Zone#ZONE}. --- @param #GROUP self --- @param Zone#ZONE_BASE Zone The zone to test. --- @return #boolean Returns true if the Group is completely within the @{Zone#ZONE} -function GROUP:IsCompletelyInZone( Zone ) - self:F2( { self.GroupName, Zone } ) - - for UnitID, UnitData in pairs( self:GetUnits() ) do - local Unit = UnitData -- Unit#UNIT - if Zone:IsPointVec3InZone( Unit:GetPointVec3() ) then - else - return false - end - end - - return true -end - ---- Returns if the group is of an air category. --- If the group is a helicopter or a plane, then this method will return true, otherwise false. --- @param #GROUP self --- @return #boolean Air category evaluation result. -function GROUP:IsAir() - self:F2( self.GroupName ) - - local DCSGroup = self:GetDCSGroup() - - if DCSGroup then - local IsAirResult = DCSGroup:getCategory() == Group.Category.AIRPLANE or DCSGroup:getCategory() == Group.Category.HELICOPTER - self:T3( IsAirResult ) - return IsAirResult - end - - return nil -end - ---- Returns if the DCS Group contains Helicopters. --- @param #GROUP self --- @return #boolean true if DCS Group contains Helicopters. -function GROUP:IsHelicopter() - self:F2( self.GroupName ) - - local DCSGroup = self:GetDCSGroup() - - if DCSGroup then - local GroupCategory = DCSGroup:getCategory() - self:T2( GroupCategory ) - return GroupCategory == Group.Category.HELICOPTER - end - - return nil -end - ---- Returns if the DCS Group contains AirPlanes. --- @param #GROUP self --- @return #boolean true if DCS Group contains AirPlanes. -function GROUP:IsAirPlane() - self:F2() - - local DCSGroup = self:GetDCSGroup() - - if DCSGroup then - local GroupCategory = DCSGroup:getCategory() - self:T2( GroupCategory ) - return GroupCategory == Group.Category.AIRPLANE - end - - return nil -end - ---- Returns if the DCS Group contains Ground troops. --- @param #GROUP self --- @return #boolean true if DCS Group contains Ground troops. -function GROUP:IsGround() - self:F2() - - local DCSGroup = self:GetDCSGroup() - - if DCSGroup then - local GroupCategory = DCSGroup:getCategory() - self:T2( GroupCategory ) - return GroupCategory == Group.Category.GROUND - end - - return nil -end - ---- Returns if the DCS Group contains Ships. --- @param #GROUP self --- @return #boolean true if DCS Group contains Ships. -function GROUP:IsShip() - self:F2() - - local DCSGroup = self:GetDCSGroup() - - if DCSGroup then - local GroupCategory = DCSGroup:getCategory() - self:T2( GroupCategory ) - return GroupCategory == Group.Category.SHIP - end - - return nil -end - ---- Returns if all units of the group are on the ground or landed. --- If all units of this group are on the ground, this function will return true, otherwise false. --- @param #GROUP self --- @return #boolean All units on the ground result. -function GROUP:AllOnGround() - self:F2() - - local DCSGroup = self:GetDCSGroup() - - if DCSGroup then - local AllOnGroundResult = true - - for Index, UnitData in pairs( DCSGroup:getUnits() ) do - if UnitData:inAir() then - AllOnGroundResult = false - end - end - - self:T3( AllOnGroundResult ) - return AllOnGroundResult - end - - return nil -end - ---- Returns the current maximum velocity of the group. --- Each unit within the group gets evaluated, and the maximum velocity (= the unit which is going the fastest) is returned. --- @param #GROUP self --- @return #number Maximum velocity found. -function GROUP:GetMaxVelocity() - self:F2() - - local DCSGroup = self:GetDCSGroup() - - if DCSGroup then - local MaxVelocity = 0 - - for Index, UnitData in pairs( DCSGroup:getUnits() ) do - - local Velocity = UnitData:getVelocity() - local VelocityTotal = math.abs( Velocity.x ) + math.abs( Velocity.y ) + math.abs( Velocity.z ) - - if VelocityTotal < MaxVelocity then - MaxVelocity = VelocityTotal - end - end - - return MaxVelocity - end - - return nil -end - ---- Returns the current minimum height of the group. --- Each unit within the group gets evaluated, and the minimum height (= the unit which is the lowest elevated) is returned. --- @param #GROUP self --- @return #number Minimum height found. -function GROUP:GetMinHeight() - self:F2() - -end - ---- Returns the current maximum height of the group. --- Each unit within the group gets evaluated, and the maximum height (= the unit which is the highest elevated) is returned. --- @param #GROUP self --- @return #number Maximum height found. -function GROUP:GetMaxHeight() - self:F2() - -end - --- Tasks - ---- Popping current Task from the group. --- @param #GROUP self --- @return Group#GROUP self -function GROUP:PopCurrentTask() - self:F2() - - local DCSGroup = self:GetDCSGroup() - - if DCSGroup then - local Controller = self:_GetController() - Controller:popTask() - return self - end - - return nil -end - ---- Pushing Task on the queue from the group. --- @param #GROUP self --- @return Group#GROUP self -function GROUP:PushTask( DCSTask, WaitTime ) - self:F2() - - local DCSGroup = self:GetDCSGroup() - - if DCSGroup then - local Controller = self:_GetController() - - -- When a group SPAWNs, it takes about a second to get the group in the simulator. Setting tasks to unspawned groups provides unexpected results. - -- Therefore we schedule the functions to set the mission and options for the Group. - -- Controller:pushTask( DCSTask ) - - if WaitTime then - --routines.scheduleFunction( Controller.pushTask, { Controller, DCSTask }, timer.getTime() + WaitTime ) - SCHEDULER:New( Controller, Controller.pushTask, { DCSTask }, WaitTime ) - else - Controller:pushTask( DCSTask ) - end - - return self - end - - return nil -end - ---- Clearing the Task Queue and Setting the Task on the queue from the group. --- @param #GROUP self --- @return Group#GROUP self -function GROUP:SetTask( DCSTask, WaitTime ) - self:F2( { DCSTask } ) - - local DCSGroup = self:GetDCSGroup() - - if DCSGroup then - - local Controller = self:_GetController() - - -- When a group SPAWNs, it takes about a second to get the group in the simulator. Setting tasks to unspawned groups provides unexpected results. - -- Therefore we schedule the functions to set the mission and options for the Group. - -- Controller.setTask( Controller, DCSTask ) - - if not WaitTime then - WaitTime = 1 - end - --routines.scheduleFunction( Controller.setTask, { Controller, DCSTask }, timer.getTime() + WaitTime ) - SCHEDULER:New( Controller, Controller.setTask, { DCSTask }, WaitTime ) - - return self - end - - return nil -end - - ---- Return a condition section for a controlled task --- @param #GROUP self --- @param DCSTime#Time time --- @param #string userFlag --- @param #boolean userFlagValue --- @param #string condition --- @param DCSTime#Time duration --- @param #number lastWayPoint --- return DCSTask#Task -function GROUP:TaskCondition( time, userFlag, userFlagValue, condition, duration, lastWayPoint ) - self:F2( { time, userFlag, userFlagValue, condition, duration, lastWayPoint } ) - - local DCSStopCondition = {} - DCSStopCondition.time = time - DCSStopCondition.userFlag = userFlag - DCSStopCondition.userFlagValue = userFlagValue - DCSStopCondition.condition = condition - DCSStopCondition.duration = duration - DCSStopCondition.lastWayPoint = lastWayPoint - - self:T3( { DCSStopCondition } ) - return DCSStopCondition -end - ---- Return a Controlled Task taking a Task and a TaskCondition --- @param #GROUP self --- @param DCSTask#Task DCSTask --- @param #DCSStopCondition DCSStopCondition --- @return DCSTask#Task -function GROUP:TaskControlled( DCSTask, DCSStopCondition ) - self:F2( { DCSTask, DCSStopCondition } ) - - local DCSTaskControlled - - DCSTaskControlled = { - id = 'ControlledTask', - params = { - task = DCSTask, - stopCondition = DCSStopCondition - } - } - - self:T3( { DCSTaskControlled } ) - return DCSTaskControlled -end - ---- Return a Combo Task taking an array of Tasks --- @param #GROUP self --- @param DCSTask#TaskArray DCSTasks Array of @{DCSTask#Task} --- @return DCSTask#Task -function GROUP:TaskCombo( DCSTasks ) - self:F2( { DCSTasks } ) - - local DCSTaskCombo - - DCSTaskCombo = { - id = 'ComboTask', - params = { - tasks = DCSTasks - } - } - - self:T3( { DCSTaskCombo } ) - return DCSTaskCombo -end - ---- Return a WrappedAction Task taking a Command --- @param #GROUP self --- @param DCSCommand#Command DCSCommand --- @return DCSTask#Task -function GROUP:TaskWrappedAction( DCSCommand, Index ) - self:F2( { DCSCommand } ) - - local DCSTaskWrappedAction - - DCSTaskWrappedAction = { - id = "WrappedAction", - enabled = true, - number = Index, - auto = false, - params = { - action = DCSCommand, - }, - } - - self:T3( { DCSTaskWrappedAction } ) - return DCSTaskWrappedAction -end - ---- Executes a command action --- @param #GROUP self --- @param DCSCommand#Command DCSCommand --- @return #GROUP self -function GROUP:SetCommand( DCSCommand ) - self:F2( DCSCommand ) - - local DCSGroup = self:GetDCSGroup() - - if DCSGroup then - local Controller = self:_GetController() - Controller:setCommand( DCSCommand ) - return self - end - - return nil -end - ---- Perform a switch waypoint command --- @param #GROUP self --- @param #number FromWayPoint --- @param #number ToWayPoint --- @return DCSTask#Task -function GROUP:CommandSwitchWayPoint( FromWayPoint, ToWayPoint, Index ) - self:F2( { FromWayPoint, ToWayPoint, Index } ) - - local CommandSwitchWayPoint = { - id = 'SwitchWaypoint', - params = { - fromWaypointIndex = FromWayPoint, - goToWaypointIndex = ToWayPoint, - }, - } - - self:T3( { CommandSwitchWayPoint } ) - return CommandSwitchWayPoint -end - - --- TASKS FOR AIR GROUPS - - ---- (AIR) Attack a Group. --- @param #GROUP self --- @param Group#GROUP AttackGroup The Group to be attacked. --- @param #number WeaponType (optional) Bitmask of weapon types those allowed to use. If parameter is not defined that means no limits on weapon usage. --- @param DCSTypes#AI.Task.WeaponExpend WeaponExpend (optional) Determines how much weapon will be released at each attack. If parameter is not defined the unit / group will choose expend on its own discretion. --- @param #number AttackQty (optional) This parameter limits maximal quantity of attack. The aicraft/group will not make more attack than allowed even if the target group not destroyed and the aicraft/group still have ammo. If not defined the aircraft/group will attack target until it will be destroyed or until the aircraft/group will run out of ammo. --- @param DCSTypes#Azimuth Direction (optional) Desired ingress direction from the target to the attacking aircraft. Group/aircraft will make its attacks from the direction. Of course if there is no way to attack from the direction due the terrain group/aircraft will choose another direction. --- @param DCSTypes#Distance Altitude (optional) Desired attack start altitude. Group/aircraft will make its attacks from the altitude. If the altitude is too low or too high to use weapon aircraft/group will choose closest altitude to the desired attack start altitude. If the desired altitude is defined group/aircraft will not attack from safe altitude. --- @param #boolean AttackQtyLimit (optional) The flag determines how to interpret attackQty parameter. If the flag is true then attackQty is a limit on maximal attack quantity for "AttackGroup" and "AttackUnit" tasks. If the flag is false then attackQty is a desired attack quantity for "Bombing" and "BombingRunway" tasks. --- @return DCSTask#Task The DCS task structure. -function GROUP:TaskAttackGroup( AttackGroup, WeaponType, WeaponExpend, AttackQty, Direction, Altitude, AttackQtyLimit ) - self:F2( { self.GroupName, AttackGroup, WeaponType, WeaponExpend, AttackQty, Direction, Altitude, AttackQtyLimit } ) - - -- AttackGroup = { - -- id = 'AttackGroup', - -- params = { - -- groupId = Group.ID, - -- weaponType = number, - -- expend = enum AI.Task.WeaponExpend, - -- attackQty = number, - -- directionEnabled = boolean, - -- direction = Azimuth, - -- altitudeEnabled = boolean, - -- altitude = Distance, - -- attackQtyLimit = boolean, - -- } - -- } - - local DirectionEnabled = nil - if Direction then - DirectionEnabled = true - end - - local AltitudeEnabled = nil - if Altitude then - AltitudeEnabled = true - end - - local DCSTask - DCSTask = { id = 'AttackGroup', - params = { - groupId = AttackGroup:GetID(), - weaponType = WeaponType, - expend = WeaponExpend, - attackQty = AttackQty, - directionEnabled = DirectionEnabled, - direction = Direction, - altitudeEnabled = AltitudeEnabled, - altitude = Altitude, - attackQtyLimit = AttackQtyLimit, - }, - }, - - self:T3( { DCSTask } ) - return DCSTask -end - - ---- (AIR) Attack the Unit. --- @param #GROUP self --- @param Unit#UNIT AttackUnit The unit. --- @param #number WeaponType (optional) Bitmask of weapon types those allowed to use. If parameter is not defined that means no limits on weapon usage. --- @param DCSTypes#AI.Task.WeaponExpend WeaponExpend (optional) Determines how much weapon will be released at each attack. If parameter is not defined the unit / group will choose expend on its own discretion. --- @param #number AttackQty (optional) This parameter limits maximal quantity of attack. The aicraft/group will not make more attack than allowed even if the target group not destroyed and the aicraft/group still have ammo. If not defined the aircraft/group will attack target until it will be destroyed or until the aircraft/group will run out of ammo. --- @param DCSTypes#Azimuth Direction (optional) Desired ingress direction from the target to the attacking aircraft. Group/aircraft will make its attacks from the direction. Of course if there is no way to attack from the direction due the terrain group/aircraft will choose another direction. --- @param #boolean AttackQtyLimit (optional) The flag determines how to interpret attackQty parameter. If the flag is true then attackQty is a limit on maximal attack quantity for "AttackGroup" and "AttackUnit" tasks. If the flag is false then attackQty is a desired attack quantity for "Bombing" and "BombingRunway" tasks. --- @param #boolean GroupAttack (optional) Flag indicates that the target must be engaged by all aircrafts of the group. Has effect only if the task is assigned to a group, not to a single aircraft. --- @return DCSTask#Task The DCS task structure. -function GROUP:TaskAttackUnit( AttackUnit, WeaponType, WeaponExpend, AttackQty, Direction, AttackQtyLimit, GroupAttack ) - self:F2( { self.GroupName, AttackUnit, WeaponType, WeaponExpend, AttackQty, Direction, AttackQtyLimit, GroupAttack } ) - - -- AttackUnit = { - -- id = 'AttackUnit', - -- params = { - -- unitId = Unit.ID, - -- weaponType = number, - -- expend = enum AI.Task.WeaponExpend - -- attackQty = number, - -- direction = Azimuth, - -- attackQtyLimit = boolean, - -- groupAttack = boolean, - -- } - -- } - - local DCSTask - DCSTask = { id = 'AttackUnit', - params = { - unitId = AttackUnit:GetID(), - weaponType = WeaponType, - expend = WeaponExpend, - attackQty = AttackQty, - direction = Direction, - attackQtyLimit = AttackQtyLimit, - groupAttack = GroupAttack, - }, - }, - - self:T3( { DCSTask } ) - return DCSTask -end - - ---- (AIR) Delivering weapon at the point on the ground. --- @param #GROUP self --- @param DCSTypes#Vec2 PointVec2 2D-coordinates of the point to deliver weapon at. --- @param #number WeaponType (optional) Bitmask of weapon types those allowed to use. If parameter is not defined that means no limits on weapon usage. --- @param DCSTypes#AI.Task.WeaponExpend WeaponExpend (optional) Determines how much weapon will be released at each attack. If parameter is not defined the unit / group will choose expend on its own discretion. --- @param #number AttackQty (optional) Desired quantity of passes. The parameter is not the same in AttackGroup and AttackUnit tasks. --- @param DCSTypes#Azimuth Direction (optional) Desired ingress direction from the target to the attacking aircraft. Group/aircraft will make its attacks from the direction. Of course if there is no way to attack from the direction due the terrain group/aircraft will choose another direction. --- @param #boolean GroupAttack (optional) Flag indicates that the target must be engaged by all aircrafts of the group. Has effect only if the task is assigned to a group, not to a single aircraft. --- @return DCSTask#Task The DCS task structure. -function GROUP:TaskBombing( PointVec2, WeaponType, WeaponExpend, AttackQty, Direction, GroupAttack ) - self:F2( { self.GroupName, PointVec2, WeaponType, WeaponExpend, AttackQty, Direction, GroupAttack } ) - --- Bombing = { --- id = 'Bombing', --- params = { --- point = Vec2, --- weaponType = number, --- expend = enum AI.Task.WeaponExpend, --- attackQty = number, --- direction = Azimuth, --- groupAttack = boolean, --- } --- } - - local DCSTask - DCSTask = { id = 'Bombing', - params = { - point = PointVec2, - weaponType = WeaponType, - expend = WeaponExpend, - attackQty = AttackQty, - direction = Direction, - groupAttack = GroupAttack, - }, - }, - - self:T3( { DCSTask } ) - return DCSTask -end - ---- (AIR) Orbit at a specified position at a specified alititude during a specified duration with a specified speed. --- @param #GROUP self --- @param DCSTypes#Vec2 Point The point to hold the position. --- @param #number Altitude The altitude to hold the position. --- @param #number Speed The speed flying when holding the position. --- @return #GROUP self -function GROUP:TaskOrbitCircleAtVec2( Point, Altitude, Speed ) - self:F2( { self.GroupName, Point, Altitude, Speed } ) - - -- pattern = enum AI.Task.OribtPattern, - -- point = Vec2, - -- point2 = Vec2, - -- speed = Distance, - -- altitude = Distance - - local LandHeight = land.getHeight( Point ) - - self:T3( { LandHeight } ) - - local DCSTask = { id = 'Orbit', - params = { pattern = AI.Task.OrbitPattern.CIRCLE, - point = Point, - speed = Speed, - altitude = Altitude + LandHeight - } - } - - - -- local AITask = { id = 'ControlledTask', - -- params = { task = { id = 'Orbit', - -- params = { pattern = AI.Task.OrbitPattern.CIRCLE, - -- point = Point, - -- speed = Speed, - -- altitude = Altitude + LandHeight - -- } - -- }, - -- stopCondition = { duration = Duration - -- } - -- } - -- } - -- ) - - return DCSTask -end - ---- (AIR) Orbit at the current position of the first unit of the group at a specified alititude --- @param #GROUP self --- @param #number Altitude The altitude to hold the position. --- @param #number Speed The speed flying when holding the position. --- @return #GROUP self -function GROUP:TaskOrbitCircle( Altitude, Speed ) - self:F2( { self.GroupName, Altitude, Speed } ) - - local DCSGroup = self:GetDCSGroup() - - if DCSGroup then - local GroupPoint = self:GetPointVec2() - return self:TaskOrbitCircleAtVec2( GroupPoint, Altitude, Speed ) - end - - return nil -end - - - ---- (AIR) Hold position at the current position of the first unit of the group. --- @param #GROUP self --- @param #number Duration The maximum duration in seconds to hold the position. --- @return #GROUP self -function GROUP:TaskHoldPosition() - self:F2( { self.GroupName } ) - - return self:TaskOrbitCircle( 30, 10 ) -end - - - - ---- (AIR) Attacking the map object (building, structure, e.t.c). --- @param #GROUP self --- @param DCSTypes#Vec2 PointVec2 2D-coordinates of the point the map object is closest to. The distance between the point and the map object must not be greater than 2000 meters. Object id is not used here because Mission Editor doesn't support map object identificators. --- @param #number WeaponType (optional) Bitmask of weapon types those allowed to use. If parameter is not defined that means no limits on weapon usage. --- @param DCSTypes#AI.Task.WeaponExpend WeaponExpend (optional) Determines how much weapon will be released at each attack. If parameter is not defined the unit / group will choose expend on its own discretion. --- @param #number AttackQty (optional) This parameter limits maximal quantity of attack. The aicraft/group will not make more attack than allowed even if the target group not destroyed and the aicraft/group still have ammo. If not defined the aircraft/group will attack target until it will be destroyed or until the aircraft/group will run out of ammo. --- @param DCSTypes#Azimuth Direction (optional) Desired ingress direction from the target to the attacking aircraft. Group/aircraft will make its attacks from the direction. Of course if there is no way to attack from the direction due the terrain group/aircraft will choose another direction. --- @param #boolean GroupAttack (optional) Flag indicates that the target must be engaged by all aircrafts of the group. Has effect only if the task is assigned to a group, not to a single aircraft. --- @return DCSTask#Task The DCS task structure. -function GROUP:TaskAttackMapObject( PointVec2, WeaponType, WeaponExpend, AttackQty, Direction, GroupAttack ) - self:F2( { self.GroupName, PointVec2, WeaponType, WeaponExpend, AttackQty, Direction, GroupAttack } ) - --- AttackMapObject = { --- id = 'AttackMapObject', --- params = { --- point = Vec2, --- weaponType = number, --- expend = enum AI.Task.WeaponExpend, --- attackQty = number, --- direction = Azimuth, --- groupAttack = boolean, --- } --- } - - local DCSTask - DCSTask = { id = 'AttackMapObject', - params = { - point = PointVec2, - weaponType = WeaponType, - expend = WeaponExpend, - attackQty = AttackQty, - direction = Direction, - groupAttack = GroupAttack, - }, - }, - - self:T3( { DCSTask } ) - return DCSTask -end - - ---- (AIR) Delivering weapon on the runway. --- @param #GROUP self --- @param Airbase#AIRBASE Airbase Airbase to attack. --- @param #number WeaponType (optional) Bitmask of weapon types those allowed to use. If parameter is not defined that means no limits on weapon usage. --- @param DCSTypes#AI.Task.WeaponExpend WeaponExpend (optional) Determines how much weapon will be released at each attack. If parameter is not defined the unit / group will choose expend on its own discretion. --- @param #number AttackQty (optional) This parameter limits maximal quantity of attack. The aicraft/group will not make more attack than allowed even if the target group not destroyed and the aicraft/group still have ammo. If not defined the aircraft/group will attack target until it will be destroyed or until the aircraft/group will run out of ammo. --- @param DCSTypes#Azimuth Direction (optional) Desired ingress direction from the target to the attacking aircraft. Group/aircraft will make its attacks from the direction. Of course if there is no way to attack from the direction due the terrain group/aircraft will choose another direction. --- @param #boolean GroupAttack (optional) Flag indicates that the target must be engaged by all aircrafts of the group. Has effect only if the task is assigned to a group, not to a single aircraft. --- @return DCSTask#Task The DCS task structure. -function GROUP:TaskBombingRunway( Airbase, WeaponType, WeaponExpend, AttackQty, Direction, GroupAttack ) - self:F2( { self.GroupName, Airbase, WeaponType, WeaponExpend, AttackQty, Direction, GroupAttack } ) - --- BombingRunway = { --- id = 'BombingRunway', --- params = { --- runwayId = AirdromeId, --- weaponType = number, --- expend = enum AI.Task.WeaponExpend, --- attackQty = number, --- direction = Azimuth, --- groupAttack = boolean, --- } --- } - - local DCSTask - DCSTask = { id = 'BombingRunway', - params = { - point = Airbase:GetID(), - weaponType = WeaponType, - expend = WeaponExpend, - attackQty = AttackQty, - direction = Direction, - groupAttack = GroupAttack, - }, - }, - - self:T3( { DCSTask } ) - return DCSTask -end - - ---- (AIR) Refueling from the nearest tanker. No parameters. --- @param #GROUP self --- @return DCSTask#Task The DCS task structure. -function GROUP:TaskRefueling() - self:F2( { self.GroupName } ) - --- Refueling = { --- id = 'Refueling', --- params = {} --- } - - local DCSTask - DCSTask = { id = 'Refueling', - params = { - }, - }, - - self:T3( { DCSTask } ) - return DCSTask -end - - ---- (AIR HELICOPTER) Landing at the ground. For helicopters only. --- @param #GROUP self --- @param DCSTypes#Vec2 Point The point where to land. --- @param #number Duration The duration in seconds to stay on the ground. --- @return #GROUP self -function GROUP:TaskLandAtVec2( Point, Duration ) - self:F2( { self.GroupName, Point, Duration } ) - --- Land = { --- id= 'Land', --- params = { --- point = Vec2, --- durationFlag = boolean, --- duration = Time --- } --- } - - local DCSTask - if Duration and Duration > 0 then - DCSTask = { id = 'Land', - params = { - point = Point, - durationFlag = true, - duration = Duration, - }, - } - else - DCSTask = { id = 'Land', - params = { - point = Point, - durationFlag = false, - }, - } - end - - self:T3( DCSTask ) - return DCSTask -end - ---- (AIR) Land the group at a @{Zone#ZONE). --- @param #GROUP self --- @param Zone#ZONE Zone The zone where to land. --- @param #number Duration The duration in seconds to stay on the ground. --- @return #GROUP self -function GROUP:TaskLandAtZone( Zone, Duration, RandomPoint ) - self:F2( { self.GroupName, Zone, Duration, RandomPoint } ) - - local Point - if RandomPoint then - Point = Zone:GetRandomPointVec2() - else - Point = Zone:GetPointVec2() - end - - local DCSTask = self:TaskLandAtVec2( Point, Duration ) - - self:T3( DCSTask ) - return DCSTask -end - ---- (AIR) Following another airborne group. --- The unit / group will follow lead unit of another group, wingmens of both groups will continue following their leaders. --- If another group is on land the unit / group will orbit around. --- @param #GROUP self --- @param Group#GROUP FollowGroup The group to be followed. --- @param DCSTypes#Vec3 PointVec3 Position of the unit / lead unit of the group relative lead unit of another group in frame reference oriented by course of lead unit of another group. If another group is on land the unit / group will orbit around. --- @param #number LastWaypointIndex Detach waypoint of another group. Once reached the unit / group Follow task is finished. --- @return DCSTask#Task The DCS task structure. -function GROUP:TaskFollow( FollowGroup, PointVec3, LastWaypointIndex ) - self:F2( { self.GroupName, FollowGroup, PointVec3, LastWaypointIndex } ) - --- Follow = { --- id = 'Follow', --- params = { --- groupId = Group.ID, --- pos = Vec3, --- lastWptIndexFlag = boolean, --- lastWptIndex = number --- } --- } - - local LastWaypointIndexFlag = nil - if LastWaypointIndex then - LastWaypointIndexFlag = true - end - - local DCSTask - DCSTask = { id = 'Follow', - params = { - groupId = FollowGroup:GetID(), - pos = PointVec3, - lastWptIndexFlag = LastWaypointIndexFlag, - lastWptIndex = LastWaypointIndex, - }, - }, - - self:T3( { DCSTask } ) - return DCSTask -end - - ---- (AIR) Escort another airborne group. --- The unit / group will follow lead unit of another group, wingmens of both groups will continue following their leaders. --- The unit / group will also protect that group from threats of specified types. --- @param #GROUP self --- @param Group#GROUP EscortGroup The group to be escorted. --- @param DCSTypes#Vec3 PointVec3 Position of the unit / lead unit of the group relative lead unit of another group in frame reference oriented by course of lead unit of another group. If another group is on land the unit / group will orbit around. --- @param #number LastWaypointIndex Detach waypoint of another group. Once reached the unit / group Follow task is finished. --- @param #number EngagementDistanceMax Maximal distance from escorted group to threat. If the threat is already engaged by escort escort will disengage if the distance becomes greater than 1.5 * engagementDistMax. --- @param DCSTypes#AttributeNameArray TargetTypes Array of AttributeName that is contains threat categories allowed to engage. --- @return DCSTask#Task The DCS task structure. -function GROUP:TaskEscort( FollowGroup, PointVec3, LastWaypointIndex, EngagementDistance, TargetTypes ) - self:F2( { self.GroupName, FollowGroup, PointVec3, LastWaypointIndex, EngagementDistance, TargetTypes } ) - --- Escort = { --- id = 'Escort', --- params = { --- groupId = Group.ID, --- pos = Vec3, --- lastWptIndexFlag = boolean, --- lastWptIndex = number, --- engagementDistMax = Distance, --- targetTypes = array of AttributeName, --- } --- } - - local LastWaypointIndexFlag = nil - if LastWaypointIndex then - LastWaypointIndexFlag = true - end - - local DCSTask - DCSTask = { id = 'Follow', - params = { - groupId = FollowGroup:GetID(), - pos = PointVec3, - lastWptIndexFlag = LastWaypointIndexFlag, - lastWptIndex = LastWaypointIndex, - engagementDistMax = EngagementDistance, - targetTypes = TargetTypes, - }, - }, - - self:T3( { DCSTask } ) - return DCSTask -end - - --- GROUND TASKS - ---- (GROUND) Fire at a VEC2 point until ammunition is finished. --- @param #GROUP self --- @param DCSTypes#Vec2 PointVec2 The point to fire at. --- @param DCSTypes#Distance Radius The radius of the zone to deploy the fire at. --- @return DCSTask#Task The DCS task structure. -function GROUP:TaskFireAtPoint( PointVec2, Radius ) - self:F2( { self.GroupName, PointVec2, Radius } ) - - -- FireAtPoint = { - -- id = 'FireAtPoint', - -- params = { - -- point = Vec2, - -- radius = Distance, - -- } - -- } - - local DCSTask - DCSTask = { id = 'FireAtPoint', - params = { - point = PointVec2, - radius = Radius, - } - } - - self:T3( { DCSTask } ) - return DCSTask -end - ---- (GROUND) Hold ground group from moving. --- @param #GROUP self --- @return DCSTask#Task The DCS task structure. -function GROUP:TaskHold() - self:F2( { self.GroupName } ) - --- Hold = { --- id = 'Hold', --- params = { --- } --- } - - local DCSTask - DCSTask = { id = 'Hold', - params = { - } - } - - self:T3( { DCSTask } ) - return DCSTask -end - --- TASKS FOR AIRBORNE AND GROUND UNITS/GROUPS - ---- (AIR + GROUND) The task makes the group/unit a FAC and orders the FAC to control the target (enemy ground group) destruction. --- The killer is player-controlled allied CAS-aircraft that is in contact with the FAC. --- If the task is assigned to the group lead unit will be a FAC. --- @param #GROUP self --- @param Group#GROUP AttackGroup Target GROUP. --- @param #number WeaponType Bitmask of weapon types those allowed to use. If parameter is not defined that means no limits on weapon usage. --- @param DCSTypes#AI.Task.Designation Designation (optional) Designation type. --- @param #boolean Datalink (optional) Allows to use datalink to send the target information to attack aircraft. Enabled by default. --- @return DCSTask#Task The DCS task structure. -function GROUP:TaskFAC_AttackGroup( AttackGroup, WeaponType, Designation, Datalink ) - self:F2( { self.GroupName, AttackGroup, WeaponType, Designation, Datalink } ) - --- FAC_AttackGroup = { --- id = 'FAC_AttackGroup', --- params = { --- groupId = Group.ID, --- weaponType = number, --- designation = enum AI.Task.Designation, --- datalink = boolean --- } --- } - - local DCSTask - DCSTask = { id = 'FAC_AttackGroup', - params = { - groupId = AttackGroup:GetID(), - weaponType = WeaponType, - designation = Designation, - datalink = Datalink, - } - } - - self:T3( { DCSTask } ) - return DCSTask -end - --- EN-ROUTE TASKS FOR AIRBORNE GROUPS - ---- (AIR) Engaging targets of defined types. --- @param #GROUP self --- @param DCSTypes#Distance Distance Maximal distance from the target to a route leg. If the target is on a greater distance it will be ignored. --- @param DCSTypes#AttributeNameArray TargetTypes Array of target categories allowed to engage. --- @param #number Priority All enroute tasks have the priority parameter. This is a number (less value - higher priority) that determines actions related to what task will be performed first. --- @return DCSTask#Task The DCS task structure. -function GROUP:EnRouteTaskEngageTargets( Distance, TargetTypes, Priority ) - self:F2( { self.GroupName, Distance, TargetTypes, Priority } ) - --- EngageTargets ={ --- id = 'EngageTargets', --- params = { --- maxDist = Distance, --- targetTypes = array of AttributeName, --- priority = number --- } --- } - - local DCSTask - DCSTask = { id = 'EngageTargets', - params = { - maxDist = Distance, - targetTypes = TargetTypes, - priority = Priority - } - } - - self:T3( { DCSTask } ) - return DCSTask -end - - ---- (AIR) Engaging a targets of defined types at circle-shaped zone. --- @param #GROUP self --- @param DCSTypes#Vec2 PointVec2 2D-coordinates of the zone. --- @param DCSTypes#Distance Radius Radius of the zone. --- @param DCSTypes#AttributeNameArray TargetTypes Array of target categories allowed to engage. --- @param #number Priority All en-route tasks have the priority parameter. This is a number (less value - higher priority) that determines actions related to what task will be performed first. --- @return DCSTask#Task The DCS task structure. -function GROUP:EnRouteTaskEngageTargets( PointVec2, Radius, TargetTypes, Priority ) - self:F2( { self.GroupName, PointVec2, Radius, TargetTypes, Priority } ) - --- EngageTargetsInZone = { --- id = 'EngageTargetsInZone', --- params = { --- point = Vec2, --- zoneRadius = Distance, --- targetTypes = array of AttributeName, --- priority = number --- } --- } - - local DCSTask - DCSTask = { id = 'EngageTargetsInZone', - params = { - point = PointVec2, - zoneRadius = Radius, - targetTypes = TargetTypes, - priority = Priority - } - } - - self:T3( { DCSTask } ) - return DCSTask -end - ---- (AIR) Engaging a group. The task does not assign the target group to the unit/group to attack now; it just allows the unit/group to engage the target group as well as other assigned targets. --- @param #GROUP self --- @param Group#GROUP AttackGroup The Group to be attacked. --- @param #number Priority All en-route tasks have the priority parameter. This is a number (less value - higher priority) that determines actions related to what task will be performed first. --- @param #number WeaponType (optional) Bitmask of weapon types those allowed to use. If parameter is not defined that means no limits on weapon usage. --- @param DCSTypes#AI.Task.WeaponExpend WeaponExpend (optional) Determines how much weapon will be released at each attack. If parameter is not defined the unit / group will choose expend on its own discretion. --- @param #number AttackQty (optional) This parameter limits maximal quantity of attack. The aicraft/group will not make more attack than allowed even if the target group not destroyed and the aicraft/group still have ammo. If not defined the aircraft/group will attack target until it will be destroyed or until the aircraft/group will run out of ammo. --- @param DCSTypes#Azimuth Direction (optional) Desired ingress direction from the target to the attacking aircraft. Group/aircraft will make its attacks from the direction. Of course if there is no way to attack from the direction due the terrain group/aircraft will choose another direction. --- @param DCSTypes#Distance Altitude (optional) Desired attack start altitude. Group/aircraft will make its attacks from the altitude. If the altitude is too low or too high to use weapon aircraft/group will choose closest altitude to the desired attack start altitude. If the desired altitude is defined group/aircraft will not attack from safe altitude. --- @param #boolean AttackQtyLimit (optional) The flag determines how to interpret attackQty parameter. If the flag is true then attackQty is a limit on maximal attack quantity for "AttackGroup" and "AttackUnit" tasks. If the flag is false then attackQty is a desired attack quantity for "Bombing" and "BombingRunway" tasks. --- @return DCSTask#Task The DCS task structure. -function GROUP:EnRouteTaskEngageGroup( AttackGroup, Priority, WeaponType, WeaponExpend, AttackQty, Direction, Altitude, AttackQtyLimit ) - self:F2( { self.GroupName, AttackGroup, Priority, WeaponType, WeaponExpend, AttackQty, Direction, Altitude, AttackQtyLimit } ) - - -- EngageGroup = { - -- id = 'EngageGroup ', - -- params = { - -- groupId = Group.ID, - -- weaponType = number, - -- expend = enum AI.Task.WeaponExpend, - -- attackQty = number, - -- directionEnabled = boolean, - -- direction = Azimuth, - -- altitudeEnabled = boolean, - -- altitude = Distance, - -- attackQtyLimit = boolean, - -- priority = number, - -- } - -- } - - local DirectionEnabled = nil - if Direction then - DirectionEnabled = true - end - - local AltitudeEnabled = nil - if Altitude then - AltitudeEnabled = true - end - - local DCSTask - DCSTask = { id = 'EngageGroup', - params = { - groupId = AttackGroup:GetID(), - weaponType = WeaponType, - expend = WeaponExpend, - attackQty = AttackQty, - directionEnabled = DirectionEnabled, - direction = Direction, - altitudeEnabled = AltitudeEnabled, - altitude = Altitude, - attackQtyLimit = AttackQtyLimit, - priority = Priority, - }, - }, - - self:T3( { DCSTask } ) - return DCSTask -end - - ---- (AIR) Attack the Unit. --- @param #GROUP self --- @param Unit#UNIT AttackUnit The UNIT. --- @param #number Priority All en-route tasks have the priority parameter. This is a number (less value - higher priority) that determines actions related to what task will be performed first. --- @param #number WeaponType (optional) Bitmask of weapon types those allowed to use. If parameter is not defined that means no limits on weapon usage. --- @param DCSTypes#AI.Task.WeaponExpend WeaponExpend (optional) Determines how much weapon will be released at each attack. If parameter is not defined the unit / group will choose expend on its own discretion. --- @param #number AttackQty (optional) This parameter limits maximal quantity of attack. The aicraft/group will not make more attack than allowed even if the target group not destroyed and the aicraft/group still have ammo. If not defined the aircraft/group will attack target until it will be destroyed or until the aircraft/group will run out of ammo. --- @param DCSTypes#Azimuth Direction (optional) Desired ingress direction from the target to the attacking aircraft. Group/aircraft will make its attacks from the direction. Of course if there is no way to attack from the direction due the terrain group/aircraft will choose another direction. --- @param #boolean AttackQtyLimit (optional) The flag determines how to interpret attackQty parameter. If the flag is true then attackQty is a limit on maximal attack quantity for "AttackGroup" and "AttackUnit" tasks. If the flag is false then attackQty is a desired attack quantity for "Bombing" and "BombingRunway" tasks. --- @param #boolean GroupAttack (optional) Flag indicates that the target must be engaged by all aircrafts of the group. Has effect only if the task is assigned to a group, not to a single aircraft. --- @return DCSTask#Task The DCS task structure. -function GROUP:EnRouteTaskEngageUnit( AttackUnit, Priority, WeaponType, WeaponExpend, AttackQty, Direction, AttackQtyLimit, GroupAttack ) - self:F2( { self.GroupName, AttackUnit, Priority, WeaponType, WeaponExpend, AttackQty, Direction, AttackQtyLimit, GroupAttack } ) - - -- EngageUnit = { - -- id = 'EngageUnit', - -- params = { - -- unitId = Unit.ID, - -- weaponType = number, - -- expend = enum AI.Task.WeaponExpend - -- attackQty = number, - -- direction = Azimuth, - -- attackQtyLimit = boolean, - -- groupAttack = boolean, - -- priority = number, - -- } - -- } - - local DCSTask - DCSTask = { id = 'EngageUnit', - params = { - unitId = AttackUnit:GetID(), - weaponType = WeaponType, - expend = WeaponExpend, - attackQty = AttackQty, - direction = Direction, - attackQtyLimit = AttackQtyLimit, - groupAttack = GroupAttack, - priority = Priority, - }, - }, - - self:T3( { DCSTask } ) - return DCSTask -end - - ---- (AIR) Aircraft will act as an AWACS for friendly units (will provide them with information about contacts). No parameters. --- @param #GROUP self --- @return DCSTask#Task The DCS task structure. -function GROUP:EnRouteTaskAWACS( ) - self:F2( { self.GroupName } ) - --- AWACS = { --- id = 'AWACS', --- params = { --- } --- } - - local DCSTask - DCSTask = { id = 'AWACS', - params = { - } - } - - self:T3( { DCSTask } ) - return DCSTask -end - - ---- (AIR) Aircraft will act as a tanker for friendly units. No parameters. --- @param #GROUP self --- @return DCSTask#Task The DCS task structure. -function GROUP:EnRouteTaskTanker( ) - self:F2( { self.GroupName } ) - --- Tanker = { --- id = 'Tanker', --- params = { --- } --- } - - local DCSTask - DCSTask = { id = 'Tanker', - params = { - } - } - - self:T3( { DCSTask } ) - return DCSTask -end - - --- En-route tasks for ground units/groups - ---- (GROUND) Ground unit (EW-radar) will act as an EWR for friendly units (will provide them with information about contacts). No parameters. --- @param #GROUP self --- @return DCSTask#Task The DCS task structure. -function GROUP:EnRouteTaskEWR( ) - self:F2( { self.GroupName } ) - --- EWR = { --- id = 'EWR', --- params = { --- } --- } - - local DCSTask - DCSTask = { id = 'EWR', - params = { - } - } - - self:T3( { DCSTask } ) - return DCSTask -end - - --- En-route tasks for airborne and ground units/groups - ---- (AIR + GROUND) The task makes the group/unit a FAC and lets the FAC to choose the target (enemy ground group) as well as other assigned targets. --- The killer is player-controlled allied CAS-aircraft that is in contact with the FAC. --- If the task is assigned to the group lead unit will be a FAC. --- @param #GROUP self --- @param Group#GROUP AttackGroup Target GROUP. --- @param #number Priority All en-route tasks have the priority parameter. This is a number (less value - higher priority) that determines actions related to what task will be performed first. --- @param #number WeaponType Bitmask of weapon types those allowed to use. If parameter is not defined that means no limits on weapon usage. --- @param DCSTypes#AI.Task.Designation Designation (optional) Designation type. --- @param #boolean Datalink (optional) Allows to use datalink to send the target information to attack aircraft. Enabled by default. --- @return DCSTask#Task The DCS task structure. -function GROUP:EnRouteTaskFAC_EngageGroup( AttackGroup, Priority, WeaponType, Designation, Datalink ) - self:F2( { self.GroupName, AttackGroup, WeaponType, Priority, Designation, Datalink } ) - --- FAC_EngageGroup = { --- id = 'FAC_EngageGroup', --- params = { --- groupId = Group.ID, --- weaponType = number, --- designation = enum AI.Task.Designation, --- datalink = boolean, --- priority = number, --- } --- } - - local DCSTask - DCSTask = { id = 'FAC_EngageGroup', - params = { - groupId = AttackGroup:GetID(), - weaponType = WeaponType, - designation = Designation, - datalink = Datalink, - priority = Priority, - } - } - - self:T3( { DCSTask } ) - return DCSTask -end - - ---- (AIR + GROUND) The task makes the group/unit a FAC and lets the FAC to choose a targets (enemy ground group) around as well as other assigned targets. --- The killer is player-controlled allied CAS-aircraft that is in contact with the FAC. --- If the task is assigned to the group lead unit will be a FAC. --- @param #GROUP self --- @param DCSTypes#Distance Radius The maximal distance from the FAC to a target. --- @param #number Priority All en-route tasks have the priority parameter. This is a number (less value - higher priority) that determines actions related to what task will be performed first. --- @return DCSTask#Task The DCS task structure. -function GROUP:EnRouteTaskFAC( Radius, Priority ) - self:F2( { self.GroupName, Radius, Priority } ) - --- FAC = { --- id = 'FAC', --- params = { --- radius = Distance, --- priority = number --- } --- } - - local DCSTask - DCSTask = { id = 'FAC', - params = { - radius = Radius, - priority = Priority - } - } - - self:T3( { DCSTask } ) - return DCSTask -end - - - - ---- Move the group to a Vec2 Point, wait for a defined duration and embark a group. --- @param #GROUP self --- @param DCSTypes#Vec2 Point The point where to wait. --- @param #number Duration The duration in seconds to wait. --- @param #GROUP EmbarkingGroup The group to be embarked. --- @return DCSTask#Task The DCS task structure -function GROUP:TaskEmbarkingAtVec2( Point, Duration, EmbarkingGroup ) - self:F2( { self.GroupName, Point, Duration, EmbarkingGroup.DCSGroup } ) - - local DCSTask - DCSTask = { id = 'Embarking', - params = { x = Point.x, - y = Point.y, - duration = Duration, - groupsForEmbarking = { EmbarkingGroup.GroupID }, - durationFlag = true, - distributionFlag = false, - distribution = {}, - } - } - - self:T3( { DCSTask } ) - return DCSTask -end - ---- Move to a defined Vec2 Point, and embark to a group when arrived within a defined Radius. --- @param #GROUP self --- @param DCSTypes#Vec2 Point The point where to wait. --- @param #number Radius The radius of the embarking zone around the Point. --- @return DCSTask#Task The DCS task structure. -function GROUP:TaskEmbarkToTransportAtVec2( Point, Radius ) - self:F2( { self.GroupName, Point, Radius } ) - - local DCSTask --DCSTask#Task - DCSTask = { id = 'EmbarkToTransport', - params = { x = Point.x, - y = Point.y, - zoneRadius = Radius, - } - } - - self:T3( { DCSTask } ) - return DCSTask -end - ---- Return a Misson task from a mission template. --- @param #GROUP self --- @param #table TaskMission A table containing the mission task. --- @return DCSTask#Task -function GROUP:TaskMission( TaskMission ) - self:F2( Points ) - - local DCSTask - DCSTask = { id = 'Mission', params = { TaskMission, }, } - - self:T3( { DCSTask } ) - return DCSTask -end - ---- Return a Misson task to follow a given route defined by Points. --- @param #GROUP self --- @param #table Points A table of route points. --- @return DCSTask#Task -function GROUP:TaskRoute( Points ) - self:F2( Points ) - - local DCSTask - DCSTask = { id = 'Mission', params = { route = { points = Points, }, }, } - - self:T3( { DCSTask } ) - return DCSTask -end - ---- Make the DCS Group to fly to a given point and hover. --- @param #GROUP self --- @param DCSTypes#Vec3 Point The destination point in Vec3 format. --- @param #number Speed The speed to travel. --- @return #GROUP self -function GROUP:TaskRouteToVec2( Point, Speed ) - self:F2( { Point, Speed } ) - - local GroupPoint = self:GetUnit( 1 ):GetPointVec2() - - local PointFrom = {} - PointFrom.x = GroupPoint.x - PointFrom.y = GroupPoint.y - PointFrom.type = "Turning Point" - PointFrom.action = "Turning Point" - PointFrom.speed = Speed - PointFrom.speed_locked = true - PointFrom.properties = { - ["vnav"] = 1, - ["scale"] = 0, - ["angle"] = 0, - ["vangle"] = 0, - ["steer"] = 2, - } - - - local PointTo = {} - PointTo.x = Point.x - PointTo.y = Point.y - PointTo.type = "Turning Point" - PointTo.action = "Fly Over Point" - PointTo.speed = Speed - PointTo.speed_locked = true - PointTo.properties = { - ["vnav"] = 1, - ["scale"] = 0, - ["angle"] = 0, - ["vangle"] = 0, - ["steer"] = 2, - } - - - local Points = { PointFrom, PointTo } - - self:T3( Points ) - - self:Route( Points ) - - return self -end - ---- Make the DCS Group to fly to a given point and hover. --- @param #GROUP self --- @param DCSTypes#Vec3 Point The destination point in Vec3 format. --- @param #number Speed The speed to travel. --- @return #GROUP self -function GROUP:TaskRouteToVec3( Point, Speed ) - self:F2( { Point, Speed } ) - - local GroupPoint = self:GetUnit( 1 ):GetPointVec3() - - local PointFrom = {} - PointFrom.x = GroupPoint.x - PointFrom.y = GroupPoint.z - PointFrom.alt = GroupPoint.y - PointFrom.alt_type = "BARO" - PointFrom.type = "Turning Point" - PointFrom.action = "Turning Point" - PointFrom.speed = Speed - PointFrom.speed_locked = true - PointFrom.properties = { - ["vnav"] = 1, - ["scale"] = 0, - ["angle"] = 0, - ["vangle"] = 0, - ["steer"] = 2, - } - - - local PointTo = {} - PointTo.x = Point.x - PointTo.y = Point.z - PointTo.alt = Point.y - PointTo.alt_type = "BARO" - PointTo.type = "Turning Point" - PointTo.action = "Fly Over Point" - PointTo.speed = Speed - PointTo.speed_locked = true - PointTo.properties = { - ["vnav"] = 1, - ["scale"] = 0, - ["angle"] = 0, - ["vangle"] = 0, - ["steer"] = 2, - } - - - local Points = { PointFrom, PointTo } - - self:T3( Points ) - - self:Route( Points ) - - return self -end - - - ---- Make the group to follow a given route. --- @param #GROUP self --- @param #table GoPoints A table of Route Points. --- @return #GROUP self -function GROUP:Route( GoPoints ) - self:F2( GoPoints ) - - local DCSGroup = self:GetDCSGroup() - - if DCSGroup then - local Points = routines.utils.deepCopy( GoPoints ) - local MissionTask = { id = 'Mission', params = { route = { points = Points, }, }, } - local Controller = self:_GetController() - --Controller.setTask( Controller, MissionTask ) - --routines.scheduleFunction( Controller.setTask, { Controller, MissionTask}, timer.getTime() + 1 ) - SCHEDULER:New( Controller, Controller.setTask, { MissionTask }, 1 ) - return self - end - - return nil -end - - - ---- Route the group to a given zone. --- The group final destination point can be randomized. --- A speed can be given in km/h. --- A given formation can be given. --- @param #GROUP self --- @param Zone#ZONE Zone The zone where to route to. --- @param #boolean Randomize Defines whether to target point gets randomized within the Zone. --- @param #number Speed The speed. --- @param Base#FORMATION Formation The formation string. -function GROUP:TaskRouteToZone( Zone, Randomize, Speed, Formation ) - self:F2( Zone ) - - local DCSGroup = self:GetDCSGroup() - - if DCSGroup then - - local GroupPoint = self:GetPointVec2() - - local PointFrom = {} - PointFrom.x = GroupPoint.x - PointFrom.y = GroupPoint.y - PointFrom.type = "Turning Point" - PointFrom.action = "Cone" - PointFrom.speed = 20 / 1.6 - - - local PointTo = {} - local ZonePoint - - if Randomize then - ZonePoint = Zone:GetRandomPointVec2() - else - ZonePoint = Zone:GetPointVec2() - end - - PointTo.x = ZonePoint.x - PointTo.y = ZonePoint.y - PointTo.type = "Turning Point" - - if Formation then - PointTo.action = Formation - else - PointTo.action = "Cone" - end - - if Speed then - PointTo.speed = Speed - else - PointTo.speed = 20 / 1.6 - end - - local Points = { PointFrom, PointTo } - - self:T3( Points ) - - self:Route( Points ) - - return self - end - - return nil -end - --- Commands - ---- Do Script command --- @param #GROUP self --- @param #string DoScript --- @return #DCSCommand -function GROUP:CommandDoScript( DoScript ) - - local DCSDoScript = { - id = "Script", - params = { - command = DoScript, - }, - } - - self:T3( DCSDoScript ) - return DCSDoScript -end - - ---- Return the mission template of the group. --- @param #GROUP self --- @return #table The MissionTemplate -function GROUP:GetTaskMission() - self:F2( self.GroupName ) - - return routines.utils.deepCopy( _DATABASE.Templates.Groups[self.GroupName].Template ) -end - ---- Return the mission route of the group. --- @param #GROUP self --- @return #table The mission route defined by points. -function GROUP:GetTaskRoute() - self:F2( self.GroupName ) - - return routines.utils.deepCopy( _DATABASE.Templates.Groups[self.GroupName].Template.route.points ) -end - ---- Return the route of a group by using the @{Database#DATABASE} class. --- @param #GROUP self --- @param #number Begin The route point from where the copy will start. The base route point is 0. --- @param #number End The route point where the copy will end. The End point is the last point - the End point. The last point has base 0. --- @param #boolean Randomize Randomization of the route, when true. --- @param #number Radius When randomization is on, the randomization is within the radius. -function GROUP:CopyRoute( Begin, End, Randomize, Radius ) - self:F2( { Begin, End } ) - - local Points = {} - - -- Could be a Spawned Group - local GroupName = string.match( self:GetName(), ".*#" ) - if GroupName then - GroupName = GroupName:sub( 1, -2 ) - else - GroupName = self:GetName() - end - - self:T3( { GroupName } ) - - local Template = _DATABASE.Templates.Groups[GroupName].Template - - if Template then - if not Begin then - Begin = 0 - end - if not End then - End = 0 - end - - for TPointID = Begin + 1, #Template.route.points - End do - if Template.route.points[TPointID] then - Points[#Points+1] = routines.utils.deepCopy( Template.route.points[TPointID] ) - if Randomize then - if not Radius then - Radius = 500 - end - Points[#Points].x = Points[#Points].x + math.random( Radius * -1, Radius ) - Points[#Points].y = Points[#Points].y + math.random( Radius * -1, Radius ) - end - end - end - return Points - end - - return nil -end - - -function GROUP:GetDetectedTargets() - self:F2( self.GroupName ) - - local DCSGroup = self:GetDCSGroup() - if DCSGroup then - return self:_GetController():getDetectedTargets() - end - - return nil -end - -function GROUP:IsTargetDetected( DCSObject ) - self:F2( self.GroupName ) - - local DCSGroup = self:GetDCSGroup() - if DCSGroup then - - local TargetIsDetected, TargetIsVisible, TargetLastTime, TargetKnowType, TargetKnowDistance, TargetLastPos, TargetLastVelocity - = self:_GetController().isTargetDetected( self:_GetController(), DCSObject, - Controller.Detection.VISUAL, - Controller.Detection.OPTIC, - Controller.Detection.RADAR, - Controller.Detection.IRST, - Controller.Detection.RWR, - Controller.Detection.DLINK - ) - return TargetIsDetected, TargetIsVisible, TargetLastTime, TargetKnowType, TargetKnowDistance, TargetLastPos, TargetLastVelocity - end - - return nil -end - --- Options - ---- Can the GROUP hold their weapons? --- @param #GROUP self --- @return #boolean -function GROUP:OptionROEHoldFirePossible() - self:F2( { self.GroupName } ) - - local DCSGroup = self:GetDCSGroup() - if DCSGroup then - if self:IsAir() or self:IsGround() or self:IsShip() then - return true - end - - return false - end - - return nil -end - ---- Holding weapons. --- @param Group#GROUP self --- @return Group#GROUP self -function GROUP:OptionROEHoldFire() - self:F2( { self.GroupName } ) - - local DCSGroup = self:GetDCSGroup() - if DCSGroup then - local Controller = self:_GetController() - - if self:IsAir() then - Controller:setOption( AI.Option.Air.id.ROE, AI.Option.Air.val.ROE.WEAPON_HOLD ) - elseif self:IsGround() then - Controller:setOption( AI.Option.Ground.id.ROE, AI.Option.Ground.val.ROE.WEAPON_HOLD ) - elseif self:IsShip() then - Controller:setOption( AI.Option.Naval.id.ROE, AI.Option.Naval.val.ROE.WEAPON_HOLD ) - end - - return self - end - - return nil -end - ---- Can the GROUP attack returning on enemy fire? --- @param #GROUP self --- @return #boolean -function GROUP:OptionROEReturnFirePossible() - self:F2( { self.GroupName } ) - - local DCSGroup = self:GetDCSGroup() - if DCSGroup then - if self:IsAir() or self:IsGround() or self:IsShip() then - return true - end - - return false - end - - return nil -end - ---- Return fire. --- @param #GROUP self --- @return #GROUP self -function GROUP:OptionROEReturnFire() - self:F2( { self.GroupName } ) - - local DCSGroup = self:GetDCSGroup() - if DCSGroup then - local Controller = self:_GetController() - - if self:IsAir() then - Controller:setOption( AI.Option.Air.id.ROE, AI.Option.Air.val.ROE.RETURN_FIRE ) - elseif self:IsGround() then - Controller:setOption( AI.Option.Ground.id.ROE, AI.Option.Ground.val.ROE.RETURN_FIRE ) - elseif self:IsShip() then - Controller:setOption( AI.Option.Naval.id.ROE, AI.Option.Naval.val.ROE.RETURN_FIRE ) - end - - return self - end - - return nil -end - ---- Can the GROUP attack designated targets? --- @param #GROUP self --- @return #boolean -function GROUP:OptionROEOpenFirePossible() - self:F2( { self.GroupName } ) - - local DCSGroup = self:GetDCSGroup() - if DCSGroup then - if self:IsAir() or self:IsGround() or self:IsShip() then - return true - end - - return false - end - - return nil -end - ---- Openfire. --- @param #GROUP self --- @return #GROUP self -function GROUP:OptionROEOpenFire() - self:F2( { self.GroupName } ) - - local DCSGroup = self:GetDCSGroup() - if DCSGroup then - local Controller = self:_GetController() - - if self:IsAir() then - Controller:setOption( AI.Option.Air.id.ROE, AI.Option.Air.val.ROE.OPEN_FIRE ) - elseif self:IsGround() then - Controller:setOption( AI.Option.Ground.id.ROE, AI.Option.Ground.val.ROE.OPEN_FIRE ) - elseif self:IsShip() then - Controller:setOption( AI.Option.Naval.id.ROE, AI.Option.Naval.val.ROE.OPEN_FIRE ) - end - - return self - end - - return nil -end - ---- Can the GROUP attack targets of opportunity? --- @param #GROUP self --- @return #boolean -function GROUP:OptionROEWeaponFreePossible() - self:F2( { self.GroupName } ) - - local DCSGroup = self:GetDCSGroup() - if DCSGroup then - if self:IsAir() then - return true - end - - return false - end - - return nil -end - ---- Weapon free. --- @param #GROUP self --- @return #GROUP self -function GROUP:OptionROEWeaponFree() - self:F2( { self.GroupName } ) - - local DCSGroup = self:GetDCSGroup() - if DCSGroup then - local Controller = self:_GetController() - - if self:IsAir() then - Controller:setOption( AI.Option.Air.id.ROE, AI.Option.Air.val.ROE.WEAPON_FREE ) - end - - return self - end - - return nil -end - ---- Can the GROUP ignore enemy fire? --- @param #GROUP self --- @return #boolean -function GROUP:OptionROTNoReactionPossible() - self:F2( { self.GroupName } ) - - local DCSGroup = self:GetDCSGroup() - if DCSGroup then - if self:IsAir() then - return true - end - - return false - end - - return nil -end - - ---- No evasion on enemy threats. --- @param #GROUP self --- @return #GROUP self -function GROUP:OptionROTNoReaction() - self:F2( { self.GroupName } ) - - local DCSGroup = self:GetDCSGroup() - if DCSGroup then - local Controller = self:_GetController() - - if self:IsAir() then - Controller:setOption( AI.Option.Air.id.REACTION_ON_THREAT, AI.Option.Air.val.REACTION_ON_THREAT.NO_REACTION ) - end - - return self - end - - return nil -end - ---- Can the GROUP evade using passive defenses? --- @param #GROUP self --- @return #boolean -function GROUP:OptionROTPassiveDefensePossible() - self:F2( { self.GroupName } ) - - local DCSGroup = self:GetDCSGroup() - if DCSGroup then - if self:IsAir() then - return true - end - - return false - end - - return nil -end - ---- Evasion passive defense. --- @param #GROUP self --- @return #GROUP self -function GROUP:OptionROTPassiveDefense() - self:F2( { self.GroupName } ) - - local DCSGroup = self:GetDCSGroup() - if DCSGroup then - local Controller = self:_GetController() - - if self:IsAir() then - Controller:setOption( AI.Option.Air.id.REACTION_ON_THREAT, AI.Option.Air.val.REACTION_ON_THREAT.PASSIVE_DEFENCE ) - end - - return self - end - - return nil -end - ---- Can the GROUP evade on enemy fire? --- @param #GROUP self --- @return #boolean -function GROUP:OptionROTEvadeFirePossible() - self:F2( { self.GroupName } ) - - local DCSGroup = self:GetDCSGroup() - if DCSGroup then - if self:IsAir() then - return true - end - - return false - end - - return nil -end - - ---- Evade on fire. --- @param #GROUP self --- @return #GROUP self -function GROUP:OptionROTEvadeFire() - self:F2( { self.GroupName } ) - - local DCSGroup = self:GetDCSGroup() - if DCSGroup then - local Controller = self:_GetController() - - if self:IsAir() then - Controller:setOption( AI.Option.Air.id.REACTION_ON_THREAT, AI.Option.Air.val.REACTION_ON_THREAT.EVADE_FIRE ) - end - - return self - end - - return nil -end - ---- Can the GROUP evade on fire using vertical manoeuvres? --- @param #GROUP self --- @return #boolean -function GROUP:OptionROTVerticalPossible() - self:F2( { self.GroupName } ) - - local DCSGroup = self:GetDCSGroup() - if DCSGroup then - if self:IsAir() then - return true - end - - return false - end - - return nil -end - - ---- Evade on fire using vertical manoeuvres. --- @param #GROUP self --- @return #GROUP self -function GROUP:OptionROTVertical() - self:F2( { self.GroupName } ) - - local DCSGroup = self:GetDCSGroup() - if DCSGroup then - local Controller = self:_GetController() - - if self:IsAir() then - Controller:setOption( AI.Option.Air.id.REACTION_ON_THREAT, AI.Option.Air.val.REACTION_ON_THREAT.BYPASS_AND_ESCAPE ) - end - - return self - end - - return nil -end - --- Message APIs - ---- Returns a message for a coalition or a client. --- @param #GROUP self --- @param #string Message The message text --- @param DCSTypes#Duration Duration The duration of the message. --- @return Message#MESSAGE -function GROUP:Message( Message, Duration ) - self:F2( { Message, Duration } ) - - local DCSGroup = self:GetDCSGroup() - if DCSGroup then - return MESSAGE:New( Message, self:GetCallsign() .. " (" .. self:GetTypeName() .. ")", Duration, self:GetClassNameAndID() ) - end - - return nil -end - ---- Send a message to all coalitions. --- The message will appear in the message area. The message will begin with the callsign of the group and the type of the first unit sending the message. --- @param #GROUP self --- @param #string Message The message text --- @param DCSTypes#Duration Duration The duration of the message. -function GROUP:MessageToAll( Message, Duration ) - self:F2( { Message, Duration } ) - - local DCSGroup = self:GetDCSGroup() - if DCSGroup then - self:Message( Message, Duration ):ToAll() - end - - return nil -end - ---- Send a message to the red coalition. --- The message will appear in the message area. The message will begin with the callsign of the group and the type of the first unit sending the message. --- @param #GROUP self --- @param #string Message The message text --- @param DCSTYpes#Duration Duration The duration of the message. -function GROUP:MessageToRed( Message, Duration ) - self:F2( { Message, Duration } ) - - local DCSGroup = self:GetDCSGroup() - if DCSGroup then - self:Message( Message, Duration ):ToRed() - end - - return nil -end - ---- Send a message to the blue coalition. --- The message will appear in the message area. The message will begin with the callsign of the group and the type of the first unit sending the message. --- @param #GROUP self --- @param #string Message The message text --- @param DCSTypes#Duration Duration The duration of the message. -function GROUP:MessageToBlue( Message, Duration ) - self:F2( { Message, Duration } ) - - local DCSGroup = self:GetDCSGroup() - if DCSGroup then - self:Message( Message, Duration ):ToBlue() - end - - return nil -end - ---- Send a message to a client. --- The message will appear in the message area. The message will begin with the callsign of the group and the type of the first unit sending the message. --- @param #GROUP self --- @param #string Message The message text --- @param DCSTypes#Duration Duration The duration of the message. --- @param Client#CLIENT Client The client object receiving the message. -function GROUP:MessageToClient( Message, Duration, Client ) - self:F2( { Message, Duration } ) - - local DCSGroup = self:GetDCSGroup() - if DCSGroup then - self:Message( Message, Duration ):ToClient( Client ) - end - - return nil -end ---- UNIT Class --- --- @{UNIT} class --- ============== --- The @{UNIT} class is a wrapper class to handle the DCS Unit objects: --- --- * Support all DCS Unit APIs. --- * Enhance with Unit specific APIs not in the DCS Unit API set. --- * Handle local Unit Controller. --- * Manage the "state" of the DCS Unit. --- --- --- UNIT reference methods --- ====================== --- For each DCS Unit object alive within a running mission, a UNIT wrapper object (instance) will be created within the _@{DATABASE} object. --- This is done at the beginning of the mission (when the mission starts), and dynamically when new DCS Unit objects are spawned (using the @{SPAWN} class). --- --- The UNIT class **does not contain a :New()** method, rather it provides **:Find()** methods to retrieve the object reference --- using the DCS Unit or the DCS UnitName. --- --- Another thing to know is that UNIT objects do not "contain" the DCS Unit object. --- The UNIT methods will reference the DCS Unit object by name when it is needed during API execution. --- If the DCS Unit object does not exist or is nil, the UNIT methods will return nil and log an exception in the DCS.log file. --- --- The UNIT class provides the following functions to retrieve quickly the relevant UNIT instance: --- --- * @{#UNIT.Find}(): Find a UNIT instance from the _DATABASE object using a DCS Unit object. --- * @{#UNIT.FindByName}(): Find a UNIT instance from the _DATABASE object using a DCS Unit name. --- --- IMPORTANT: ONE SHOULD NEVER SANATIZE these UNIT OBJECT REFERENCES! (make the UNIT object references nil). --- --- DCS UNIT APIs --- ============= --- The DCS Unit APIs are used extensively within MOOSE. The UNIT class has for each DCS Unit API a corresponding method. --- To be able to distinguish easily in your code the difference between a UNIT API call and a DCS Unit API call, --- the first letter of the method is also capitalized. So, by example, the DCS Unit method @{DCSUnit#Unit.getName}() --- is implemented in the UNIT class as @{#UNIT.GetName}(). --- --- Additional UNIT APIs --- ==================== --- The UNIT class comes with additional methods. Find below a summary. --- --- Smoke, Flare Units --- ------------------ --- The UNIT class provides methods to smoke or flare units easily. --- The @{#UNIT.SmokeBlue}(), @{#UNIT.SmokeGreen}(),@{#UNIT.SmokeOrange}(), @{#UNIT.SmokeRed}(), @{#UNIT.SmokeRed}() methods --- will smoke the unit in the corresponding color. Note that smoking a unit is done at the current position of the DCS Unit. --- When the DCS Unit moves for whatever reason, the smoking will still continue! --- The @{#UNIT.FlareGreen}(), @{#UNIT.FlareRed}(), @{#UNIT.FlareWhite}(), @{#UNIT.FlareYellow}() --- methods will fire off a flare in the air with the corresponding color. Note that a flare is a one-off shot and its effect is of very short duration. --- --- Position, Point --- --------------- --- The UNIT class provides methods to obtain the current point or position of the DCS Unit. --- The @{#UNIT.GetPointVec2}(), @{#UNIT.GetPointVec3}() will obtain the current location of the DCS Unit in a Vec2 (2D) or a Vec3 (3D) vector respectively. --- If you want to obtain the complete 3D position including oriëntation and direction vectors, consult the @{#UNIT.GetPositionVec3}() method respectively. --- --- Alive --- ----- --- The @{#UNIT.IsAlive}(), @{#UNIT.IsActive}() methods determines if the DCS Unit is alive, meaning, it is existing and active. --- --- Test for other units in radius --- ------------------------------ --- One can test if another DCS Unit is within a given radius of the current DCS Unit, by using the @{#UNIT.OtherUnitInRadius}() method. --- --- More functions will be added --- ---------------------------- --- During the MOOSE development, more functions will be added. A complete list of the current functions is below. --- --- --- --- --- @module Unit --- @author FlightControl - -Include.File( "Routines" ) -Include.File( "Base" ) -Include.File( "Message" ) - ---- The UNIT class --- @type UNIT --- @extends Base#BASE --- @field #UNIT.FlareColor FlareColor --- @field #UNIT.SmokeColor SmokeColor -UNIT = { - ClassName="UNIT", - CategoryName = { - [Unit.Category.AIRPLANE] = "Airplane", - [Unit.Category.HELICOPTER] = "Helicoper", - [Unit.Category.GROUND_UNIT] = "Ground Unit", - [Unit.Category.SHIP] = "Ship", - [Unit.Category.STRUCTURE] = "Structure", - }, - FlareColor = { - Green = trigger.flareColor.Green, - Red = trigger.flareColor.Red, - White = trigger.flareColor.White, - Yellow = trigger.flareColor.Yellow - }, - SmokeColor = { - Green = trigger.smokeColor.Green, - Red = trigger.smokeColor.Red, - White = trigger.smokeColor.White, - Orange = trigger.smokeColor.Orange, - Blue = trigger.smokeColor.Blue - }, - } - ---- FlareColor --- @type UNIT.FlareColor --- @field Green --- @field Red --- @field White --- @field Yellow - ---- SmokeColor --- @type UNIT.SmokeColor --- @field Green --- @field Red --- @field White --- @field Orange --- @field Blue - --- Registration. - ---- Create a new UNIT from DCSUnit. --- @param #UNIT self --- @param DCSUnit#Unit DCSUnit --- @param Database#DATABASE Database --- @return Unit#UNIT -function UNIT:Register( UnitName ) - - local self = BASE:Inherit( self, BASE:New() ) - self:F2( UnitName ) - self.UnitName = UnitName - return self -end - --- Reference methods. - ---- Finds a UNIT from the _DATABASE using a DCSUnit object. --- @param #UNIT self --- @param DCSUnit#Unit DCSUnit An existing DCS Unit object reference. --- @return Unit#UNIT self -function UNIT:Find( DCSUnit ) - - local UnitName = DCSUnit:getName() - local UnitFound = _DATABASE:FindUnit( UnitName ) - return UnitFound -end - ---- Find a UNIT in the _DATABASE using the name of an existing DCS Unit. --- @param #UNIT self --- @param #string UnitName The Unit Name. --- @return Unit#UNIT self -function UNIT:FindByName( UnitName ) - - local UnitFound = _DATABASE:FindUnit( UnitName ) - return UnitFound -end - -function UNIT:GetDCSUnit() - local DCSUnit = Unit.getByName( self.UnitName ) - - if DCSUnit then - return DCSUnit - end - - return nil -end - ---- Returns coalition of the Unit. --- @param Unit#UNIT self --- @return DCSCoalitionObject#coalition.side The side of the coalition. --- @return #nil The DCS Unit is not existing or alive. -function UNIT:GetCoalition() - self:F2( self.UnitName ) - - local DCSUnit = self:GetDCSUnit() - - if DCSUnit then - local UnitCoalition = DCSUnit:getCoalition() - self:T3( UnitCoalition ) - return UnitCoalition - end - - return nil -end - ---- Returns country of the Unit. --- @param Unit#UNIT self --- @return DCScountry#country.id The country identifier. --- @return #nil The DCS Unit is not existing or alive. -function UNIT:GetCountry() - self:F2( self.UnitName ) - - local DCSUnit = self:GetDCSUnit() - - if DCSUnit then - local UnitCountry = DCSUnit:getCountry() - self:T3( UnitCountry ) - return UnitCountry - end - - return nil -end - - ---- Returns DCS Unit object name. --- The function provides access to non-activated units too. --- @param Unit#UNIT self --- @return #string The name of the DCS Unit. --- @return #nil The DCS Unit is not existing or alive. -function UNIT:GetName() - self:F2( self.UnitName ) - - local DCSUnit = self:GetDCSUnit() - - if DCSUnit then - local UnitName = self.UnitName - return UnitName - end - - return nil -end - - ---- Returns if the unit is alive. --- @param Unit#UNIT self --- @return #boolean true if Unit is alive. --- @return #nil The DCS Unit is not existing or alive. -function UNIT:IsAlive() - self:F2( self.UnitName ) - - local DCSUnit = self:GetDCSUnit() - - if DCSUnit then - local UnitIsAlive = DCSUnit:isExist() - return UnitIsAlive - end - - return false -end - ---- Returns if the unit is activated. --- @param Unit#UNIT self --- @return #boolean true if Unit is activated. --- @return #nil The DCS Unit is not existing or alive. -function UNIT:IsActive() - self:F2( self.UnitName ) - - local DCSUnit = self:GetDCSUnit() - - if DCSUnit then - - local UnitIsActive = DCSUnit:isActive() - return UnitIsActive - end - - return nil -end - ---- Returns name of the player that control the unit or nil if the unit is controlled by A.I. --- @param Unit#UNIT self --- @return #string Player Name --- @return #nil The DCS Unit is not existing or alive. -function UNIT:GetPlayerName() - self:F2( self.UnitName ) - - local DCSUnit = self:GetDCSUnit() - - if DCSUnit then - - local PlayerName = DCSUnit:getPlayerName() - if PlayerName == nil then - PlayerName = "" - end - return PlayerName - end - - return nil -end - ---- Returns the unit's unique identifier. --- @param Unit#UNIT self --- @return DCSUnit#Unit.ID Unit ID --- @return #nil The DCS Unit is not existing or alive. -function UNIT:GetID() - self:F2( self.UnitName ) - - local DCSUnit = self:GetDCSUnit() - - if DCSUnit then - local UnitID = DCSUnit:getID() - return UnitID - end - - return nil -end - ---- Returns the unit's number in the group. --- The number is the same number the unit has in ME. --- It may not be changed during the mission. --- If any unit in the group is destroyed, the numbers of another units will not be changed. --- @param Unit#UNIT self --- @return #number The Unit number. --- @return #nil The DCS Unit is not existing or alive. -function UNIT:GetNumber() - self:F2( self.UnitName ) - - local DCSUnit = self:GetDCSUnit() - - if DCSUnit then - local UnitNumber = DCSUnit:getNumber() - return UnitNumber - end - - return nil -end - ---- Returns the unit's group if it exist and nil otherwise. --- @param Unit#UNIT self --- @return Group#GROUP The Group of the Unit. --- @return #nil The DCS Unit is not existing or alive. -function UNIT:GetGroup() - self:F2( self.UnitName ) - - local DCSUnit = self:GetDCSUnit() - - if DCSUnit then - local UnitGroup = DCSUnit:getGroup() - return UnitGroup - end - - return nil -end - - ---- Returns the unit's callsign - the localized string. --- @param Unit#UNIT self --- @return #string The Callsign of the Unit. --- @return #nil The DCS Unit is not existing or alive. -function UNIT:GetCallSign() - self:F2( self.UnitName ) - - local DCSUnit = self:GetDCSUnit() - - if DCSUnit then - local UnitCallSign = DCSUnit:getCallsign() - return UnitCallSign - end - - return nil -end - ---- Returns the unit's health. Dead units has health <= 1.0. --- @param Unit#UNIT self --- @return #number The Unit's health value. --- @return #nil The DCS Unit is not existing or alive. -function UNIT:GetLife() - self:F2( self.UnitName ) - - local DCSUnit = self:GetDCSUnit() - - if DCSUnit then - local UnitLife = DCSUnit:getLife() - return UnitLife - end - - return nil -end - ---- Returns the Unit's initial health. --- @param Unit#UNIT self --- @return #number The Unit's initial health value. --- @return #nil The DCS Unit is not existing or alive. -function UNIT:GetLife0() - self:F2( self.UnitName ) - - local DCSUnit = self:GetDCSUnit() - - if DCSUnit then - local UnitLife0 = DCSUnit:getLife0() - return UnitLife0 - end - - return nil -end - ---- Returns relative amount of fuel (from 0.0 to 1.0) the unit has in its internal tanks. If there are additional fuel tanks the value may be greater than 1.0. --- @param Unit#UNIT self --- @return #number The relative amount of fuel (from 0.0 to 1.0). --- @return #nil The DCS Unit is not existing or alive. -function UNIT:GetFuel() - self:F2( self.UnitName ) - - local DCSUnit = self:GetDCSUnit() - - if DCSUnit then - local UnitFuel = DCSUnit:getFuel() - return UnitFuel - end - - return nil -end - ---- Returns the Unit's ammunition. --- @param Unit#UNIT self --- @return DCSUnit#Unit.Ammo --- @return #nil The DCS Unit is not existing or alive. -function UNIT:GetAmmo() - self:F2( self.UnitName ) - - local DCSUnit = self:GetDCSUnit() - - if DCSUnit then - local UnitAmmo = DCSUnit:getAmmo() - return UnitAmmo - end - - return nil -end - ---- Returns the unit sensors. --- @param Unit#UNIT self --- @return DCSUnit#Unit.Sensors --- @return #nil The DCS Unit is not existing or alive. -function UNIT:GetSensors() - self:F2( self.UnitName ) - - local DCSUnit = self:GetDCSUnit() - - if DCSUnit then - local UnitSensors = DCSUnit:getSensors() - return UnitSensors - end - - return nil -end - --- Need to add here a function per sensortype --- unit:hasSensors(Unit.SensorType.RADAR, Unit.RadarType.AS) - ---- Returns two values: --- --- * First value indicates if at least one of the unit's radar(s) is on. --- * Second value is the object of the radar's interest. Not nil only if at least one radar of the unit is tracking a target. --- @param Unit#UNIT self --- @return #boolean Indicates if at least one of the unit's radar(s) is on. --- @return DCSObject#Object The object of the radar's interest. Not nil only if at least one radar of the unit is tracking a target. --- @return #nil The DCS Unit is not existing or alive. -function UNIT:GetRadar() - self:F2( self.UnitName ) - - local DCSUnit = self:GetDCSUnit() - - if DCSUnit then - local UnitRadarOn, UnitRadarObject = DCSUnit:getRadar() - return UnitRadarOn, UnitRadarObject - end - - return nil, nil -end - --- Need to add here functions to check if radar is on and which object etc. - ---- Returns unit descriptor. Descriptor type depends on unit category. --- @param Unit#UNIT self --- @return DCSUnit#Unit.Desc The Unit descriptor. --- @return #nil The DCS Unit is not existing or alive. -function UNIT:GetDesc() - self:F2( self.UnitName ) - - local DCSUnit = self:GetDCSUnit() - - if DCSUnit then - local UnitDesc = DCSUnit:getDesc() - return UnitDesc - end - - return nil -end - - ---- Returns the type name of the DCS Unit. --- @param Unit#UNIT self --- @return #string The type name of the DCS Unit. --- @return #nil The DCS Unit is not existing or alive. -function UNIT:GetTypeName() - self:F2( self.UnitName ) - - local DCSUnit = self:GetDCSUnit() - - if DCSUnit then - local UnitTypeName = DCSUnit:getTypeName() - self:T3( UnitTypeName ) - return UnitTypeName - end - - return nil -end - - - ---- Returns the prefix name of the DCS Unit. A prefix name is a part of the name before a '#'-sign. --- DCS Units spawned with the @{SPAWN} class contain a '#'-sign to indicate the end of the (base) DCS Unit name. --- The spawn sequence number and unit number are contained within the name after the '#' sign. --- @param Unit#UNIT self --- @return #string The name of the DCS Unit. --- @return #nil The DCS Unit is not existing or alive. -function UNIT:GetPrefix() - self:F2( self.UnitName ) - - local DCSUnit = self:GetDCSUnit() - - if DCSUnit then - local UnitPrefix = string.match( self.UnitName, ".*#" ):sub( 1, -2 ) - self:T3( UnitPrefix ) - return UnitPrefix - end - - return nil -end - - - ---- Returns the @{DCSTypes#Vec2} vector indicating the point in 2D of the DCS Unit within the mission. --- @param Unit#UNIT self --- @return DCSTypes#Vec2 The 2D point vector of the DCS Unit. --- @return #nil The DCS Unit is not existing or alive. -function UNIT:GetPointVec2() - self:F2( self.UnitName ) - - local DCSUnit = self:GetDCSUnit() - - if DCSUnit then - local UnitPointVec3 = DCSUnit:getPosition().p - - local UnitPointVec2 = {} - UnitPointVec2.x = UnitPointVec3.x - UnitPointVec2.y = UnitPointVec3.z - - self:T3( UnitPointVec2 ) - return UnitPointVec2 - end - - return nil -end - - ---- Returns the @{DCSTypes#Vec3} vector indicating the point in 3D of the DCS Unit within the mission. --- @param Unit#UNIT self --- @return DCSTypes#Vec3 The 3D point vector of the DCS Unit. --- @return #nil The DCS Unit is not existing or alive. -function UNIT:GetPointVec3() - self:F2( self.UnitName ) - - local DCSUnit = self:GetDCSUnit() - - if DCSUnit then - local UnitPointVec3 = DCSUnit:getPosition().p - self:T3( UnitPointVec3 ) - return UnitPointVec3 - end - - return nil -end - ---- Returns the @{DCSTypes#Position3} position vectors indicating the point and direction vectors in 3D of the DCS Unit within the mission. --- @param Unit#UNIT self --- @return DCSTypes#Position The 3D position vectors of the DCS Unit. --- @return #nil The DCS Unit is not existing or alive. -function UNIT:GetPositionVec3() - self:F2( self.UnitName ) - - local DCSUnit = self:GetDCSUnit() - - if DCSUnit then - local UnitPosition = DCSUnit:getPosition() - self:T3( UnitPosition ) - return UnitPosition - end - - return nil -end - ---- Returns the DCS Unit velocity vector. --- @param Unit#UNIT self --- @return DCSTypes#Vec3 The velocity vector --- @return #nil The DCS Unit is not existing or alive. -function UNIT:GetVelocity() - self:F2( self.UnitName ) - - local DCSUnit = self:GetDCSUnit() - - if DCSUnit then - local UnitVelocityVec3 = DCSUnit:getVelocity() - self:T3( UnitVelocityVec3 ) - return UnitVelocityVec3 - end - - return nil -end - ---- Returns true if the DCS Unit is in the air. --- @param Unit#UNIT self --- @return #boolean true if in the air. --- @return #nil The DCS Unit is not existing or alive. -function UNIT:InAir() - self:F2( self.UnitName ) - - local DCSUnit = self:GetDCSUnit() - - if DCSUnit then - local UnitInAir = DCSUnit:inAir() - self:T3( UnitInAir ) - return UnitInAir - end - - return nil -end - ---- Returns the altitude of the DCS Unit. --- @param Unit#UNIT self --- @return DCSTypes#Distance The altitude of the DCS Unit. --- @return #nil The DCS Unit is not existing or alive. -function UNIT:GetAltitude() - self:F2() - - local DCSUnit = self:GetDCSUnit() - - if DCSUnit then - local UnitPointVec3 = DCSUnit:getPoint() --DCSTypes#Vec3 - return UnitPointVec3.y - end - - return nil -end - ---- Returns true if there is an **other** DCS Unit within a radius of the current 2D point of the DCS Unit. --- @param Unit#UNIT self --- @param Unit#UNIT AwaitUnit The other UNIT wrapper object. --- @param Radius The radius in meters with the DCS Unit in the centre. --- @return true If the other DCS Unit is within the radius of the 2D point of the DCS Unit. --- @return #nil The DCS Unit is not existing or alive. -function UNIT:OtherUnitInRadius( AwaitUnit, Radius ) - self:F2( { self.UnitName, AwaitUnit.UnitName, Radius } ) - - local DCSUnit = self:GetDCSUnit() - - if DCSUnit then - local UnitPos = self:GetPointVec3() - local AwaitUnitPos = AwaitUnit:GetPointVec3() - - if (((UnitPos.x - AwaitUnitPos.x)^2 + (UnitPos.z - AwaitUnitPos.z)^2)^0.5 <= Radius) then - self:T3( "true" ) - return true - else - self:T3( "false" ) - return false - end - end - - return nil -end - ---- Returns the DCS Unit category name as defined within the DCS Unit Descriptor. --- @param Unit#UNIT self --- @return #string The DCS Unit Category Name -function UNIT:GetCategoryName() - local DCSUnit = self:GetDCSUnit() - - if DCSUnit then - local UnitCategoryName = self.CategoryName[ self:GetDesc().category ] - return UnitCategoryName - end - - return nil -end - ---- Signal a flare at the position of the UNIT. --- @param #UNIT self -function UNIT:Flare( FlareColor ) - self:F2() - trigger.action.signalFlare( self:GetPointVec3(), FlareColor , 0 ) -end - ---- Signal a white flare at the position of the UNIT. --- @param #UNIT self -function UNIT:FlareWhite() - self:F2() - trigger.action.signalFlare( self:GetPointVec3(), trigger.flareColor.White , 0 ) -end - ---- Signal a yellow flare at the position of the UNIT. --- @param #UNIT self -function UNIT:FlareYellow() - self:F2() - trigger.action.signalFlare( self:GetPointVec3(), trigger.flareColor.Yellow , 0 ) -end - ---- Signal a green flare at the position of the UNIT. --- @param #UNIT self -function UNIT:FlareGreen() - self:F2() - trigger.action.signalFlare( self:GetPointVec3(), trigger.flareColor.Green , 0 ) -end - ---- Signal a red flare at the position of the UNIT. --- @param #UNIT self -function UNIT:FlareRed() - self:F2() - trigger.action.signalFlare( self:GetPointVec3(), trigger.flareColor.Red, 0 ) -end - ---- Smoke the UNIT. --- @param #UNIT self -function UNIT:Smoke( SmokeColor ) - self:F2() - trigger.action.smoke( self:GetPointVec3(), SmokeColor ) -end - ---- Smoke the UNIT Green. --- @param #UNIT self -function UNIT:SmokeGreen() - self:F2() - trigger.action.smoke( self:GetPointVec3(), trigger.smokeColor.Green ) -end - ---- Smoke the UNIT Red. --- @param #UNIT self -function UNIT:SmokeRed() - self:F2() - trigger.action.smoke( self:GetPointVec3(), trigger.smokeColor.Red ) -end - ---- Smoke the UNIT White. --- @param #UNIT self -function UNIT:SmokeWhite() - self:F2() - trigger.action.smoke( self:GetPointVec3(), trigger.smokeColor.White ) -end - ---- Smoke the UNIT Orange. --- @param #UNIT self -function UNIT:SmokeOrange() - self:F2() - trigger.action.smoke( self:GetPointVec3(), trigger.smokeColor.Orange ) -end - ---- Smoke the UNIT Blue. --- @param #UNIT self -function UNIT:SmokeBlue() - self:F2() - trigger.action.smoke( self:GetPointVec3(), trigger.smokeColor.Blue ) -end - --- Is methods - ---- Returns if the unit is of an air category. --- If the unit is a helicopter or a plane, then this method will return true, otherwise false. --- @param #UNIT self --- @return #boolean Air category evaluation result. -function UNIT:IsAir() - self:F2() - - local UnitDescriptor = self.DCSUnit:getDesc() - self:T3( { UnitDescriptor.category, Unit.Category.AIRPLANE, Unit.Category.HELICOPTER } ) - - local IsAirResult = ( UnitDescriptor.category == Unit.Category.AIRPLANE ) or ( UnitDescriptor.category == Unit.Category.HELICOPTER ) - - self:T3( IsAirResult ) - return IsAirResult -end - ---- ZONE Classes --- ============= --- This module contains the ZONE classes, inherited from @{Zone#ZONE_BASE}. --- There are essentially two core functions that zones accomodate: --- --- * Test if an object is within the zone boundaries. --- * Provide the zone behaviour. Some zones are static, while others are moveable. --- --- The object classes are using the zone classes to test the zone boundaries, which can take various forms: --- --- * Test if completely within the zone. --- * Test if partly within the zone (for @{Group#GROUP} objects). --- * Test if not in the zone. --- * Distance to the nearest intersecting point of the zone. --- * Distance to the center of the zone. --- * ... --- --- Each of these ZONE classes have a zone name, and specific parameters defining the zone type: --- --- * @{Zone#ZONE_BASE}: The ZONE_BASE class defining the base for all other zone classes. --- * @{Zone#ZONE_RADIUS}: The ZONE_RADIUS class defined by a zone name, a location and a radius. --- * @{Zone#ZONE}: The ZONE class, defined by the zone name as defined within the Mission Editor. --- * @{Zone#ZONE_UNIT}: The ZONE_UNIT class defined by a zone around a @{Unit#UNIT} with a radius. --- * @{Zone#ZONE_POLYGON}: The ZONE_POLYGON class defined by a sequence of @{Group#GROUP} waypoints within the Mission Editor, forming a polygon. --- --- Polymorphic methods --- =================== --- Each zone implements two polymorphic functions defined in @{Zone#ZONE_BASE}: --- --- * @{#ZONE_BASE.IsPointVec2InZone}: Returns if a location is within the zone. --- * @{#ZONE_BASE.IsPointVec3InZone}: Returns if a point is within the zone. --- --- @module Zone --- @author FlightControl - - -Include.File( "Routines" ) -Include.File( "Base" ) -Include.File( "Message" ) - - - ---- The ZONE_BASE class --- @type ZONE_BASE --- @Extends Base#BASE -ZONE_BASE = { - ClassName = "ZONE_BASE", - } - -function ZONE_BASE:New( ZoneName ) - local self = BASE:Inherit( self, BASE:New() ) - self:F( ZoneName ) - - self.ZoneName = ZoneName - - return self -end - ---- Returns if a location is within the zone. --- @param #ZONE_RADIUS self --- @param DCSTypes#Vec2 PointVec2 The location to test. --- @return #boolean true if the location is within the zone. -function ZONE_BASE:IsPointVec2InZone( PointVec2 ) - self:F2( PointVec2 ) - - return false -end - ---- Returns if a point is within the zone. --- @param #ZONE_RADIUS self --- @param DCSTypes#Vec3 PointVec3 The point to test. --- @return #boolean true if the point is within the zone. -function ZONE_BASE:IsPointVec3InZone( PointVec3 ) - self:F2( PointVec3 ) - - local InZone = self:IsPointVec2InZone( { x = PointVec3.x, y = PointVec3.z } ) - - return InZone -end - - ---- The ZONE_RADIUS class, defined by a zone name, a location and a radius. --- @type ZONE_RADIUS --- @field DCSTypes#Vec2 PointVec2 The current location of the zone. --- @field DCSTypes#Distance Radius The radius of the zone. --- @Extends Zone#ZONE_BASE -ZONE_RADIUS = { - ClassName="ZONE_RADIUS", - } - ---- Constructor of ZONE_RADIUS, taking the zone name, the zone location and a radius. --- @param #ZONE_RADIUS self --- @param DCSTypes#Vec2 PointVec2 The location of the zone. --- @param DCSTypes#Distance Radius The radius of the zone. --- @return #ZONE_RADIUS -function ZONE_RADIUS:New( ZoneName, PointVec2, Radius ) - local self = BASE:Inherit( self, ZONE_BASE:New( ZoneName ) ) - self:F( { ZoneName, PointVec2, Radius } ) - - self.Radius = Radius - self.PointVec2 = PointVec2 - - return self -end - - ---- Returns the radius of the zone. --- @param #ZONE_RADIUS self --- @return DCSTypes#Distance The radius of the zone. -function ZONE_RADIUS:GetRadius() - self:F2( self.ZoneName ) - - self:T2( { self.Radius } ) - - return self.Radius -end - ---- Sets the radius of the zone. --- @param #ZONE_RADIUS self --- @param DCSTypes#Distance Radius The radius of the zone. --- @return DCSTypes#Distance The radius of the zone. -function ZONE_RADIUS:SetRadius( Radius ) - self:F2( self.ZoneName ) - - self.Radius = Radius - self:T2( { self.Radius } ) - - return self.Radius -end - ---- Returns the location of the zone. --- @param #ZONE_RADIUS self --- @return DCSTypes#Vec2 The location of the zone. -function ZONE_RADIUS:GetPointVec2() - self:F2( self.ZoneName ) - - self:T2( { self.PointVec2 } ) - - return self.PointVec2 -end - ---- Sets the location of the zone. --- @param #ZONE_RADIUS self --- @param DCSTypes#Vec2 PointVec2 The new location of the zone. --- @return DCSTypes#Vec2 The new location of the zone. -function ZONE_RADIUS:SetPointVec2( PointVec2 ) - self:F2( self.ZoneName ) - - self.PointVec2 = PointVec2 - - self:T2( { self.PointVec2 } ) - - return self.PointVec2 -end - ---- Returns the point of the zone. --- @param #ZONE_RADIUS self --- @param DCSTypes#Distance Height The height to add to the land height where the center of the zone is located. --- @return DCSTypes#Vec3 The point of the zone. -function ZONE_RADIUS:GetPointVec3( Height ) - self:F2( self.ZoneName ) - - local PointVec2 = self:GetPointVec2() - - local PointVec3 = { x = PointVec2.x, y = land.getHeight( self:GetPointVec2() ) + Height, z = PointVec2.y } - - self:T2( { PointVec3 } ) - - return PointVec3 -end - ---- Returns if a location is within the zone. --- @param #ZONE_RADIUS self --- @param DCSTypes#Vec2 PointVec2 The location to test. --- @return #boolean true if the location is within the zone. -function ZONE_RADIUS:IsPointVec2InZone( PointVec2 ) - self:F2( PointVec2 ) - - if (( PointVec2.x - self.PointVec2.x )^2 + ( PointVec2.y - self.PointVec2.y ) ^2 ) ^ 0.5 <= self.Radius then - return true - end - - return false -end - ---- Returns if a point is within the zone. --- @param #ZONE_RADIUS self --- @param DCSTypes#Vec3 PointVec3 The point to test. --- @return #boolean true if the point is within the zone. -function ZONE_RADIUS:IsPointVec3InZone( PointVec3 ) - self:F2( PointVec3 ) - - local InZone = self:IsPointVec3InZone( { x = PointVec3.x, y = PointVec3.z } ) - - return InZone -end - ---- Returns a random location within the zone. --- @param #ZONE_RADIUS self --- @return DCSTypes#Vec2 The random location within the zone. -function ZONE_RADIUS:GetRandomPointVec2() - self:F( self.ZoneName ) - - local Point = {} - - local angle = math.random() * math.pi*2; - Point.x = self.PointVec2.x + math.cos( angle ) * math.random() * self.Radius; - Point.y = self.PointVec2.y + math.sin( angle ) * math.random() * self.Radius; - - self:T( { Point } ) - - return Point -end - - - ---- The ZONE class, defined by the zone name as defined within the Mission Editor. The location and the radius are automatically collected from the mission settings. --- @type ZONE --- @Extends Zone#ZONE_RADIUS -ZONE = { - ClassName="ZONE", - } - - ---- Constructor of ZONE, taking the zone name. --- @param #ZONE self --- @param #string ZoneName The name of the zone as defined within the mission editor. --- @return #ZONE -function ZONE:New( ZoneName ) - - local Zone = trigger.misc.getZone( ZoneName ) - - if not Zone then - error( "Zone " .. ZoneName .. " does not exist." ) - return nil - end - - local self = BASE:Inherit( self, ZONE_RADIUS:New( ZoneName, { x = Zone.x, y = Zone.y }, Zone.radius ) ) - self:F( ZoneName ) - - self.Zone = Zone - - return self -end - - - ---- The ZONE_UNIT class defined by a zone around a @{Unit#UNIT} with a radius. --- @type ZONE_UNIT --- @field Unit#UNIT ZoneUNIT --- @Extends Zone#ZONE_RADIUS -ZONE_UNIT = { - ClassName="ZONE_UNIT", - } - ---- Constructor to create a ZONE_UNIT instance, taking the zone name, a zone unit and a radius. --- @param #ZONE_UNIT self --- @param #string ZoneName Name of the zone. --- @param Unit#UNIT ZoneUNIT The unit as the center of the zone. --- @param DCSTypes#Distance Radius The radius of the zone. --- @return #ZONE_UNIT self -function ZONE_UNIT:New( ZoneName, ZoneUNIT, Radius ) - local self = BASE:Inherit( self, ZONE_RADIUS:New( ZoneName, ZoneUNIT:GetPointVec2(), Radius ) ) - self:F( { ZoneName, ZoneUNIT:GetPointVec2(), Radius } ) - - self.ZoneUNIT = ZoneUNIT - - return self -end - - ---- Returns the current location of the @{Unit#UNIT}. --- @param #ZONE_UNIT self --- @return DCSTypes#Vec2 The location of the zone based on the @{Unit#UNIT}location. -function ZONE_UNIT:GetPointVec2() - self:F( self.ZoneName ) - - local ZonePointVec2 = self.ZoneUNIT:GetPointVec2() - - self:T( { ZonePointVec2 } ) - - return ZonePointVec2 -end - - ---- The ZONE_POLYGON class defined by a sequence of @{Group#GROUP} waypoints within the Mission Editor, forming a polygon. --- @type ZONE_POLYGON --- @Extends Zone#ZONE_BASE -ZONE_POLYGON = { - ClassName="ZONE_POLYGON", - } - ---- Constructor to create a ZONE_POLYGON instance, taking the zone name and the name of the @{Group#GROUP} defined within the Mission Editor. --- The @{Group#GROUP} waypoints define the polygon corners. The first and the last point are automatically connected by ZONE_POLYGON. --- @param #ZONE_POLYGON self --- @param #string ZoneName Name of the zone. --- @param Group#GROUP ZoneGroup The GROUP waypoints as defined within the Mission Editor define the polygon shape. --- @return #ZONE_POLYGON self -function ZONE_POLYGON:New( ZoneName, ZoneGroup ) - local self = BASE:Inherit( self, ZONE_BASE:New( ZoneName ) ) - self:F( { ZoneName, ZoneGroup } ) - - local GroupPoints = ZoneGroup:GetTaskRoute() - local i = 0 - - self.Polygon = {} - - for i = 1, #GroupPoints do - self.Polygon[i] = {} - self.Polygon[i].x = GroupPoints[i].x - self.Polygon[i].y = GroupPoints[i].y - end - - return self -end - - ---- Returns if a location is within the zone. --- @param #ZONE_POLYGON self --- @param DCSTypes#Vec2 PointVec2 The location to test. --- @return #boolean true if the location is within the zone. -function ZONE_POLYGON:IsPointVec2InZone( PointVec2 ) - self:F2( PointVec2 ) - - local i - local j - local c = false - - i = 1 - j = #self.Polygon - - while i < #self.Polygon do - j = i - i = i + 1 - self:T( { i, j, self.Polygon[i], self.Polygon[j] } ) - if ( ( ( self.Polygon[i].y > PointVec2.y ) ~= ( self.Polygon[j].y > PointVec2.y ) ) and - ( PointVec2.x < ( self.Polygon[j].x - self.Polygon[i].x ) * ( PointVec2.y - self.Polygon[i].y ) / ( self.Polygon[j].y - self.Polygon[i].y ) + self.Polygon[i].x ) - ) then - c = not c - end - self:T( { "c = ", c } ) - end - - return c -end - ---- The CLIENT models client units in multi player missions. --- --- @{#CLIENT} class --- ================ --- Clients are those **Units** defined within the Mission Editor that have the skillset defined as __Client__ or __Player__. --- Note that clients are NOT the same as Units, they are NOT necessarily alive. --- The @{CLIENT} class is a wrapper class to handle the DCS Unit objects that have the skillset defined as __Client__ or __Player__: --- --- * Wraps the DCS Unit objects with skill level set to Player or Client. --- * Support all DCS Unit APIs. --- * Enhance with Unit specific APIs not in the DCS Group API set. --- * When player joins Unit, execute alive init logic. --- * Handles messages to players. --- * Manage the "state" of the DCS Unit. --- --- Clients are being used by the @{MISSION} class to follow players and register their successes. --- --- CLIENT reference methods --- ======================= --- For each DCS Unit having skill level Player or Client, a CLIENT wrapper object (instance) will be created within the _@{DATABASE} object. --- This is done at the beginning of the mission (when the mission starts). --- --- The CLIENT class does not contain a :New() method, rather it provides :Find() methods to retrieve the object reference --- using the DCS Unit or the DCS UnitName. --- --- Another thing to know is that CLIENT objects do not "contain" the DCS Unit object. --- The CLIENT methods will reference the DCS Unit object by name when it is needed during API execution. --- If the DCS Unit object does not exist or is nil, the CLIENT methods will return nil and log an exception in the DCS.log file. --- --- The CLIENT class provides the following functions to retrieve quickly the relevant CLIENT instance: --- --- * @{#CLIENT.Find}(): Find a CLIENT instance from the _DATABASE object using a DCS Unit object. --- * @{#CLIENT.FindByName}(): Find a CLIENT instance from the _DATABASE object using a DCS Unit name. --- --- IMPORTANT: ONE SHOULD NEVER SANATIZE these CLIENT OBJECT REFERENCES! (make the CLIENT object references nil). --- --- @module Client --- @author FlightControl - -Include.File( "Routines" ) -Include.File( "Base" ) -Include.File( "Cargo" ) -Include.File( "Message" ) - - ---- The CLIENT class --- @type CLIENT --- @extends Unit#UNIT -CLIENT = { - ONBOARDSIDE = { - NONE = 0, - LEFT = 1, - RIGHT = 2, - BACK = 3, - FRONT = 4 - }, - ClassName = "CLIENT", - ClientName = nil, - ClientAlive = false, - ClientTransport = false, - ClientBriefingShown = false, - _Menus = {}, - _Tasks = {}, - Messages = { - } -} - - ---- Finds a CLIENT from the _DATABASE using the relevant DCS Unit. --- @param #CLIENT self --- @param #string ClientName Name of the DCS **Unit** as defined within the Mission Editor. --- @param #string ClientBriefing Text that describes the briefing of the mission when a Player logs into the Client. --- @return #CLIENT --- @usage --- -- Create new Clients. --- local Mission = MISSIONSCHEDULER.AddMission( 'Russia Transport Troops SA-6', 'Operational', 'Transport troops from the control center to one of the SA-6 SAM sites to activate their operation.', 'Russia' ) --- Mission:AddGoal( DeploySA6TroopsGoal ) --- --- Mission:AddClient( CLIENT:FindByName( 'RU MI-8MTV2*HOT-Deploy Troops 1' ):Transport() ) --- Mission:AddClient( CLIENT:FindByName( 'RU MI-8MTV2*RAMP-Deploy Troops 3' ):Transport() ) --- Mission:AddClient( CLIENT:FindByName( 'RU MI-8MTV2*HOT-Deploy Troops 2' ):Transport() ) --- Mission:AddClient( CLIENT:FindByName( 'RU MI-8MTV2*RAMP-Deploy Troops 4' ):Transport() ) -function CLIENT:Find( DCSUnit ) - local ClientName = DCSUnit:getName() - local ClientFound = _DATABASE:FindClient( ClientName ) - - if ClientFound then - ClientFound:F( ClientName ) - return ClientFound - end - - error( "CLIENT not found for: " .. ClientName ) -end - - ---- Finds a CLIENT from the _DATABASE using the relevant Client Unit Name. --- As an optional parameter, a briefing text can be given also. --- @param #CLIENT self --- @param #string ClientName Name of the DCS **Unit** as defined within the Mission Editor. --- @param #string ClientBriefing Text that describes the briefing of the mission when a Player logs into the Client. --- @return #CLIENT --- @usage --- -- Create new Clients. --- local Mission = MISSIONSCHEDULER.AddMission( 'Russia Transport Troops SA-6', 'Operational', 'Transport troops from the control center to one of the SA-6 SAM sites to activate their operation.', 'Russia' ) --- Mission:AddGoal( DeploySA6TroopsGoal ) --- --- Mission:AddClient( CLIENT:FindByName( 'RU MI-8MTV2*HOT-Deploy Troops 1' ):Transport() ) --- Mission:AddClient( CLIENT:FindByName( 'RU MI-8MTV2*RAMP-Deploy Troops 3' ):Transport() ) --- Mission:AddClient( CLIENT:FindByName( 'RU MI-8MTV2*HOT-Deploy Troops 2' ):Transport() ) --- Mission:AddClient( CLIENT:FindByName( 'RU MI-8MTV2*RAMP-Deploy Troops 4' ):Transport() ) -function CLIENT:FindByName( ClientName, ClientBriefing ) - local ClientFound = _DATABASE:FindClient( ClientName ) - - if ClientFound then - ClientFound:F( { ClientName, ClientBriefing } ) - ClientFound:AddBriefing( ClientBriefing ) - ClientFound.MessageSwitch = true - - return ClientFound - end - - error( "CLIENT not found for: " .. ClientName ) -end - -function CLIENT:Register( ClientName ) - local self = BASE:Inherit( self, UNIT:Register( ClientName ) ) - - self:F( ClientName ) - self.ClientName = ClientName - self.MessageSwitch = true - self.ClientAlive2 = false - - --self.AliveCheckScheduler = routines.scheduleFunction( self._AliveCheckScheduler, { self }, timer.getTime() + 1, 5 ) - self.AliveCheckScheduler = SCHEDULER:New( self, self._AliveCheckScheduler, {}, 1, 5 ) - - return self -end - - ---- Transport defines that the Client is a Transport. Transports show cargo. --- @param #CLIENT self --- @return #CLIENT -function CLIENT:Transport() - self:F() - - self.ClientTransport = true - return self -end - ---- AddBriefing adds a briefing to a CLIENT when a player joins a mission. --- @param #CLIENT self --- @param #string ClientBriefing is the text defining the Mission briefing. --- @return #CLIENT self -function CLIENT:AddBriefing( ClientBriefing ) - self:F( ClientBriefing ) - self.ClientBriefing = ClientBriefing - self.ClientBriefingShown = false - - return self -end - ---- Show the briefing of a CLIENT. --- @param #CLIENT self --- @return #CLIENT self -function CLIENT:ShowBriefing() - self:F( { self.ClientName, self.ClientBriefingShown } ) - - if not self.ClientBriefingShown then - self.ClientBriefingShown = true - local Briefing = "" - if self.ClientBriefing then - Briefing = Briefing .. self.ClientBriefing - end - Briefing = Briefing .. " Press [LEFT ALT]+[B] to view the complete mission briefing." - self:Message( Briefing, 60, self.ClientName .. '/ClientBriefing', "Briefing" ) - end - - return self -end - ---- Show the mission briefing of a MISSION to the CLIENT. --- @param #CLIENT self --- @param #string MissionBriefing --- @return #CLIENT self -function CLIENT:ShowMissionBriefing( MissionBriefing ) - self:F( { self.ClientName } ) - - if MissionBriefing then - self:Message( MissionBriefing, 60, self.ClientName .. '/MissionBriefing', "Mission Briefing" ) - end - - return self -end - - - ---- Resets a CLIENT. --- @param #CLIENT self --- @param #string ClientName Name of the Group as defined within the Mission Editor. The Group must have a Unit with the type Client. -function CLIENT:Reset( ClientName ) - self:F() - self._Menus = {} -end - --- Is Functions - ---- Checks if the CLIENT is a multi-seated UNIT. --- @param #CLIENT self --- @return #boolean true if multi-seated. -function CLIENT:IsMultiSeated() - self:F( self.ClientName ) - - local ClientMultiSeatedTypes = { - ["Mi-8MT"] = "Mi-8MT", - ["UH-1H"] = "UH-1H", - ["P-51B"] = "P-51B" - } - - if self:IsAlive() then - local ClientTypeName = self:GetClientGroupUnit():GetTypeName() - if ClientMultiSeatedTypes[ClientTypeName] then - return true - end - end - - return false -end - ---- Checks for a client alive event and calls a function on a continuous basis. --- @param #CLIENT self --- @param #function CallBack Function. --- @return #CLIENT -function CLIENT:Alive( CallBack, ... ) - self:F() - - self.ClientCallBack = CallBack - self.ClientParameters = arg - - return self -end - ---- @param #CLIENT self -function CLIENT:_AliveCheckScheduler() - self:F( { self.ClientName, self.ClientAlive2, self.ClientBriefingShown } ) - - if self:IsAlive() then -- Polymorphic call of UNIT - if self.ClientAlive2 == false then - self:ShowBriefing() - if self.ClientCallBack then - self:T("Calling Callback function") - self.ClientCallBack( self, unpack( self.ClientParameters ) ) - end - self.ClientAlive2 = true - end - else - if self.ClientAlive2 == true then - self.ClientAlive2 = false - end - end - - return true -end - ---- Return the DCSGroup of a Client. --- This function is modified to deal with a couple of bugs in DCS 1.5.3 --- @param #CLIENT self --- @return DCSGroup#Group -function CLIENT:GetDCSGroup() - self:F3() - --- local ClientData = Group.getByName( self.ClientName ) --- if ClientData and ClientData:isExist() then --- self:T( self.ClientName .. " : group found!" ) --- return ClientData --- else --- return nil --- end - - local ClientUnit = Unit.getByName( self.ClientName ) - - local CoalitionsData = { AlivePlayersRed = coalition.getPlayers( coalition.side.RED ), AlivePlayersBlue = coalition.getPlayers( coalition.side.BLUE ) } - for CoalitionId, CoalitionData in pairs( CoalitionsData ) do - self:T3( { "CoalitionData:", CoalitionData } ) - for UnitId, UnitData in pairs( CoalitionData ) do - self:T3( { "UnitData:", UnitData } ) - if UnitData and UnitData:isExist() then - - --self:E(self.ClientName) - if ClientUnit then - local ClientGroup = ClientUnit:getGroup() - if ClientGroup then - self:T3( "ClientGroup = " .. self.ClientName ) - if ClientGroup:isExist() and UnitData:getGroup():isExist() then - if ClientGroup:getID() == UnitData:getGroup():getID() then - self:T3( "Normal logic" ) - self:T3( self.ClientName .. " : group found!" ) - self.ClientGroupID = ClientGroup:getID() - self.ClientGroupName = ClientGroup:getName() - return ClientGroup - end - else - -- Now we need to resolve the bugs in DCS 1.5 ... - -- Consult the database for the units of the Client Group. (ClientGroup:getUnits() returns nil) - self:T3( "Bug 1.5 logic" ) - local ClientGroupTemplate = _DATABASE.Templates.Units[self.ClientName].GroupTemplate - self.ClientGroupID = ClientGroupTemplate.groupId - self.ClientGroupName = _DATABASE.Templates.Units[self.ClientName].GroupName - self:T3( self.ClientName .. " : group found in bug 1.5 resolvement logic!" ) - return ClientGroup - end - -- else - -- error( "Client " .. self.ClientName .. " not found!" ) - end - else - --self:E( { "Client not found!", self.ClientName } ) - end - end - end - end - - -- For non player clients - if ClientUnit then - local ClientGroup = ClientUnit:getGroup() - if ClientGroup then - self:T3( "ClientGroup = " .. self.ClientName ) - if ClientGroup:isExist() then - self:T3( "Normal logic" ) - self:T3( self.ClientName .. " : group found!" ) - return ClientGroup - end - end - end - - self.ClientGroupID = nil - self.ClientGroupUnit = nil - - return nil -end - - --- TODO: Check DCSTypes#Group.ID ---- Get the group ID of the client. --- @param #CLIENT self --- @return DCSTypes#Group.ID -function CLIENT:GetClientGroupID() - - local ClientGroup = self:GetDCSGroup() - - --self:E( self.ClientGroupID ) -- Determined in GetDCSGroup() - return self.ClientGroupID -end - - ---- Get the name of the group of the client. --- @param #CLIENT self --- @return #string -function CLIENT:GetClientGroupName() - - local ClientGroup = self:GetDCSGroup() - - self:T( self.ClientGroupName ) -- Determined in GetDCSGroup() - return self.ClientGroupName -end - ---- Returns the UNIT of the CLIENT. --- @param #CLIENT self --- @return Unit#UNIT -function CLIENT:GetClientGroupUnit() - self:F2() - - local ClientDCSUnit = Unit.getByName( self.ClientName ) - - self:T( self.ClientDCSUnit ) - if ClientDCSUnit and ClientDCSUnit:isExist() then - local ClientUnit = _DATABASE:FindUnit( self.ClientName ) - self:T2( ClientUnit ) - return ClientUnit - end -end - ---- Returns the DCSUnit of the CLIENT. --- @param #CLIENT self --- @return DCSTypes#Unit -function CLIENT:GetClientGroupDCSUnit() - self:F2() - - local ClientDCSUnit = Unit.getByName( self.ClientName ) - - if ClientDCSUnit and ClientDCSUnit:isExist() then - self:T2( ClientDCSUnit ) - return ClientDCSUnit - end -end - - ---- Evaluates if the CLIENT is a transport. --- @param #CLIENT self --- @return #boolean true is a transport. -function CLIENT:IsTransport() - self:F() - return self.ClientTransport -end - ---- Shows the @{Cargo#CARGO} contained within the CLIENT to the player as a message. --- The @{Cargo#CARGO} is shown using the @{Message#MESSAGE} distribution system. --- @param #CLIENT self -function CLIENT:ShowCargo() - self:F() - - local CargoMsg = "" - - for CargoName, Cargo in pairs( CARGOS ) do - if self == Cargo:IsLoadedInClient() then - CargoMsg = CargoMsg .. Cargo.CargoName .. " Type:" .. Cargo.CargoType .. " Weight: " .. Cargo.CargoWeight .. "\n" - end - end - - if CargoMsg == "" then - CargoMsg = "empty" - end - - self:Message( CargoMsg, 15, self.ClientName .. "/Cargo", "Co-Pilot: Cargo Status", 30 ) - -end - --- TODO (1) I urgently need to revise this. ---- A local function called by the DCS World Menu system to switch off messages. -function CLIENT.SwitchMessages( PrmTable ) - PrmTable[1].MessageSwitch = PrmTable[2] -end - ---- The main message driver for the CLIENT. --- This function displays various messages to the Player logged into the CLIENT through the DCS World Messaging system. --- @param #CLIENT self --- @param #string Message is the text describing the message. --- @param #number MessageDuration is the duration in seconds that the Message should be displayed. --- @param #string MessageId is a text identifying the Message in the MessageQueue. The Message system overwrites Messages with the same MessageId --- @param #string MessageCategory is the category of the message (the title). --- @param #number MessageInterval is the interval in seconds between the display of the @{Message#MESSAGE} when the CLIENT is in the air. -function CLIENT:Message( Message, MessageDuration, MessageId, MessageCategory, MessageInterval ) - self:F( { Message, MessageDuration, MessageId, MessageCategory, MessageInterval } ) - - if not self.MenuMessages then - if self:GetClientGroupID() then - self.MenuMessages = MENU_CLIENT:New( self, 'Messages' ) - self.MenuRouteMessageOn = MENU_CLIENT_COMMAND:New( self, 'Messages On', self.MenuMessages, CLIENT.SwitchMessages, { self, true } ) - self.MenuRouteMessageOff = MENU_CLIENT_COMMAND:New( self,'Messages Off', self.MenuMessages, CLIENT.SwitchMessages, { self, false } ) - end - end - - if self.MessageSwitch == true then - if MessageCategory == nil then - MessageCategory = "Messages" - end - if self.Messages[MessageId] == nil then - self.Messages[MessageId] = {} - self.Messages[MessageId].MessageId = MessageId - self.Messages[MessageId].MessageTime = timer.getTime() - self.Messages[MessageId].MessageDuration = MessageDuration - if MessageInterval == nil then - self.Messages[MessageId].MessageInterval = 600 - else - self.Messages[MessageId].MessageInterval = MessageInterval - end - MESSAGE:New( Message, MessageCategory, MessageDuration, MessageId ):ToClient( self ) - else - if self:GetClientGroupDCSUnit() and not self:GetClientGroupDCSUnit():inAir() then - if timer.getTime() - self.Messages[MessageId].MessageTime >= self.Messages[MessageId].MessageDuration + 10 then - MESSAGE:New( Message, MessageCategory, MessageDuration, MessageId ):ToClient( self ) - self.Messages[MessageId].MessageTime = timer.getTime() - end - else - if timer.getTime() - self.Messages[MessageId].MessageTime >= self.Messages[MessageId].MessageDuration + self.Messages[MessageId].MessageInterval then - MESSAGE:New( Message, MessageCategory, MessageDuration, MessageId ):ToClient( self ) - self.Messages[MessageId].MessageTime = timer.getTime() - end - end - end - end -end ---- Manage the mission database. --- --- @{#DATABASE} class --- ================== --- Mission designers can use the DATABASE class to refer to: --- --- * UNITS --- * GROUPS --- * players --- * alive players --- * CLIENTS --- * alive CLIENTS --- --- On top, for internal MOOSE administration purposes, the DATBASE administers the Unit and Gruop templates as defined within the Mission Editor. --- --- Moose will automatically create one instance of the DATABASE class into the **global** object _DATABASE. --- Moose refers to _DATABASE within the framework extensively, but you can also refer to the _DATABASE object within your missions if required. --- --- DATABASE iterators: --- =================== --- You can iterate the database with the available iterator methods. --- The iterator methods will walk the DATABASE set, and call for each element within the set a function that you provide. --- The following iterator methods are currently available within the DATABASE: --- --- * @{#DATABASE.ForEachUnit}: Calls a function for each @{UNIT} it finds within the DATABASE. --- * @{#DATABASE.ForEachGroup}: Calls a function for each @{GROUP} it finds within the DATABASE. --- * @{#DATABASE.ForEachPlayer}: Calls a function for each player it finds within the DATABASE. --- * @{#DATABASE.ForEachPlayerAlive}: Calls a function for each alive player it finds within the DATABASE. --- * @{#DATABASE.ForEachClient}: Calls a function for each @{CLIENT} it finds within the DATABASE. --- * @{#DATABASE.ForEachClientAlive}: Calls a function for each alive @{CLIENT} it finds within the DATABASE. --- --- @module Database --- @author FlightControl - -Include.File( "Routines" ) -Include.File( "Base" ) -Include.File( "Menu" ) -Include.File( "Group" ) -Include.File( "Unit" ) -Include.File( "Event" ) -Include.File( "Client" ) - - ---- DATABASE class --- @type DATABASE --- @extends Base#BASE -DATABASE = { - ClassName = "DATABASE", - Templates = { - Units = {}, - Groups = {}, - ClientsByName = {}, - ClientsByID = {}, - }, - DCSUnits = {}, - DCSGroups = {}, - UNITS = {}, - GROUPS = {}, - PLAYERS = {}, - PLAYERSALIVE = {}, - CLIENTS = {}, - CLIENTSALIVE = {}, - NavPoints = {}, -} - -local _DATABASECoalition = - { - [1] = "Red", - [2] = "Blue", - } - -local _DATABASECategory = - { - [Unit.Category.AIRPLANE] = "Plane", - [Unit.Category.HELICOPTER] = "Helicopter", - [Unit.Category.GROUND_UNIT] = "Vehicle", - [Unit.Category.SHIP] = "Ship", - [Unit.Category.STRUCTURE] = "Structure", - } - - ---- Creates a new DATABASE object, building a set of units belonging to a coalitions, categories, countries, types or with defined prefix names. --- @param #DATABASE self --- @return #DATABASE --- @usage --- -- Define a new DATABASE Object. This DBObject will contain a reference to all Group and Unit Templates defined within the ME and the DCSRTE. --- DBObject = DATABASE:New() -function DATABASE:New() - - -- Inherits from BASE - local self = BASE:Inherit( self, BASE:New() ) - - _EVENTDISPATCHER:OnBirth( self._EventOnBirth, self ) - _EVENTDISPATCHER:OnDead( self._EventOnDeadOrCrash, self ) - _EVENTDISPATCHER:OnCrash( self._EventOnDeadOrCrash, self ) - - - -- Follow alive players and clients - _EVENTDISPATCHER:OnPlayerEnterUnit( self._EventOnPlayerEnterUnit, self ) - _EVENTDISPATCHER:OnPlayerLeaveUnit( self._EventOnPlayerLeaveUnit, self ) - - self:_RegisterTemplates() - self:_RegisterDatabase() - self:_RegisterPlayers() - - return self -end - ---- Finds a Unit based on the Unit Name. --- @param #DATABASE self --- @param #string UnitName --- @return Unit#UNIT The found Unit. -function DATABASE:FindUnit( UnitName ) - - local UnitFound = self.UNITS[UnitName] - return UnitFound -end - - ---- Adds a Unit based on the Unit Name in the DATABASE. --- @param #DATABASE self -function DATABASE:AddUnit( DCSUnit, DCSUnitName ) - - self.DCSUnits[DCSUnitName] = DCSUnit - self.UNITS[DCSUnitName] = UNIT:Register( DCSUnitName ) -end - - ---- Deletes a Unit from the DATABASE based on the Unit Name. --- @param #DATABASE self -function DATABASE:DeleteUnit( DCSUnitName ) - - self.DCSUnits[DCSUnitName] = nil -end - - ---- Finds a CLIENT based on the ClientName. --- @param #DATABASE self --- @param #string ClientName --- @return Client#CLIENT The found CLIENT. -function DATABASE:FindClient( ClientName ) - - local ClientFound = self.CLIENTS[ClientName] - return ClientFound -end - - ---- Adds a CLIENT based on the ClientName in the DATABASE. --- @param #DATABASE self -function DATABASE:AddClient( ClientName ) - - self.CLIENTS[ClientName] = CLIENT:Register( ClientName ) - self:E( self.CLIENTS[ClientName]:GetClassNameAndID() ) -end - - ---- Finds a GROUP based on the GroupName. --- @param #DATABASE self --- @param #string GroupName --- @return Group#GROUP The found GROUP. -function DATABASE:FindGroup( GroupName ) - - local GroupFound = self.GROUPS[GroupName] - return GroupFound -end - - ---- Adds a GROUP based on the GroupName in the DATABASE. --- @param #DATABASE self -function DATABASE:AddGroup( DCSGroup, GroupName ) - - self.DCSGroups[GroupName] = DCSGroup - self.GROUPS[GroupName] = GROUP:Register( GroupName ) -end - ---- Adds a player based on the Player Name in the DATABASE. --- @param #DATABASE self -function DATABASE:AddPlayer( UnitName, PlayerName ) - - if PlayerName then - self:E( { "Add player for unit:", UnitName, PlayerName } ) - self.PLAYERS[PlayerName] = PlayerName - self.PLAYERSALIVE[PlayerName] = PlayerName - self.CLIENTSALIVE[PlayerName] = self:FindClient( UnitName ) - end -end - ---- Deletes a player from the DATABASE based on the Player Name. --- @param #DATABASE self -function DATABASE:DeletePlayer( PlayerName ) - - if PlayerName then - self:E( { "Clean player:", PlayerName } ) - self.PLAYERSALIVE[PlayerName] = nil - self.CLIENTSALIVE[PlayerName] = nil - end -end - - ---- Instantiate new Groups within the DCSRTE. --- This method expects EXACTLY the same structure as a structure within the ME, and needs 2 additional fields defined: --- SpawnCountryID, SpawnCategoryID --- This method is used by the SPAWN class. --- @param #DATABASE self --- @param #table SpawnTemplate --- @return #DATABASE self -function DATABASE:Spawn( SpawnTemplate ) - self:F2( SpawnTemplate.name ) - - self:T2( { SpawnTemplate.SpawnCountryID, SpawnTemplate.SpawnCategoryID } ) - - -- Copy the spawn variables of the template in temporary storage, nullify, and restore the spawn variables. - local SpawnCoalitionID = SpawnTemplate.SpawnCoalitionID - local SpawnCountryID = SpawnTemplate.SpawnCountryID - local SpawnCategoryID = SpawnTemplate.SpawnCategoryID - - -- Nullify - SpawnTemplate.SpawnCoalitionID = nil - SpawnTemplate.SpawnCountryID = nil - SpawnTemplate.SpawnCategoryID = nil - - self:_RegisterTemplate( SpawnTemplate ) - coalition.addGroup( SpawnCountryID, SpawnCategoryID, SpawnTemplate ) - - -- Restore - SpawnTemplate.SpawnCoalitionID = SpawnCoalitionID - SpawnTemplate.SpawnCountryID = SpawnCountryID - SpawnTemplate.SpawnCategoryID = SpawnCategoryID - - - local SpawnGroup = GROUP:Register( SpawnTemplate.name ) - return SpawnGroup -end - ---- Set a status to a Group within the Database, this to check crossing events for example. -function DATABASE:SetStatusGroup( GroupName, Status ) - self:F2( Status ) - - self.Templates.Groups[GroupName].Status = Status -end - ---- Get a status to a Group within the Database, this to check crossing events for example. -function DATABASE:GetStatusGroup( GroupName ) - self:F2( Status ) - - if self.Templates.Groups[GroupName] then - return self.Templates.Groups[GroupName].Status - else - return "" - end -end - - ---- Private method that registers new Group Templates within the DATABASE Object. --- @param #DATABASE self --- @param #table GroupTemplate --- @return #DATABASE self -function DATABASE:_RegisterTemplate( GroupTemplate ) - - local GroupTemplateName = env.getValueDictByKey(GroupTemplate.name) - - if not self.Templates.Groups[GroupTemplateName] then - self.Templates.Groups[GroupTemplateName] = {} - self.Templates.Groups[GroupTemplateName].Status = nil - end - - -- Delete the spans from the route, it is not needed and takes memory. - if GroupTemplate.route and GroupTemplate.route.spans then - GroupTemplate.route.spans = nil - end - - self.Templates.Groups[GroupTemplateName].GroupName = GroupTemplateName - self.Templates.Groups[GroupTemplateName].Template = GroupTemplate - self.Templates.Groups[GroupTemplateName].groupId = GroupTemplate.groupId - self.Templates.Groups[GroupTemplateName].UnitCount = #GroupTemplate.units - self.Templates.Groups[GroupTemplateName].Units = GroupTemplate.units - - self:T2( { "Group", self.Templates.Groups[GroupTemplateName].GroupName, self.Templates.Groups[GroupTemplateName].UnitCount } ) - - for unit_num, UnitTemplate in pairs( GroupTemplate.units ) do - - local UnitTemplateName = env.getValueDictByKey(UnitTemplate.name) - self.Templates.Units[UnitTemplateName] = {} - self.Templates.Units[UnitTemplateName].UnitName = UnitTemplateName - self.Templates.Units[UnitTemplateName].Template = UnitTemplate - self.Templates.Units[UnitTemplateName].GroupName = GroupTemplateName - self.Templates.Units[UnitTemplateName].GroupTemplate = GroupTemplate - self.Templates.Units[UnitTemplateName].GroupId = GroupTemplate.groupId - self:E( {"skill",UnitTemplate.skill}) - if UnitTemplate.skill and (UnitTemplate.skill == "Client" or UnitTemplate.skill == "Player") then - self.Templates.ClientsByName[UnitTemplateName] = UnitTemplate - self.Templates.ClientsByID[UnitTemplate.unitId] = UnitTemplate - end - self:E( { "Unit", self.Templates.Units[UnitTemplateName].UnitName } ) - end -end - - ---- Private method that registers all alive players in the mission. --- @param #DATABASE self --- @return #DATABASE self -function DATABASE:_RegisterPlayers() - - local CoalitionsData = { AlivePlayersRed = coalition.getPlayers( coalition.side.RED ), AlivePlayersBlue = coalition.getPlayers( coalition.side.BLUE ) } - for CoalitionId, CoalitionData in pairs( CoalitionsData ) do - for UnitId, UnitData in pairs( CoalitionData ) do - self:T3( { "UnitData:", UnitData } ) - if UnitData and UnitData:isExist() then - local UnitName = UnitData:getName() - local PlayerName = UnitData:getPlayerName() - if not self.PLAYERS[PlayerName] then - self:E( { "Add player for unit:", UnitName, PlayerName } ) - self:AddPlayer( UnitName, PlayerName ) - end - end - end - end - - return self -end - - ---- Private method that registers all datapoints within in the mission. --- @param #DATABASE self --- @return #DATABASE self -function DATABASE:_RegisterDatabase() - - local CoalitionsData = { GroupsRed = coalition.getGroups( coalition.side.RED ), GroupsBlue = coalition.getGroups( coalition.side.BLUE ) } - for CoalitionId, CoalitionData in pairs( CoalitionsData ) do - for DCSGroupId, DCSGroup in pairs( CoalitionData ) do - - if DCSGroup:isExist() then - local DCSGroupName = DCSGroup:getName() - - self:E( { "Register Group:", DCSGroup, DCSGroupName } ) - self:AddGroup( DCSGroup, DCSGroupName ) - - for DCSUnitId, DCSUnit in pairs( DCSGroup:getUnits() ) do - - local DCSUnitName = DCSUnit:getName() - self:E( { "Register Unit:", DCSUnit, DCSUnitName } ) - self:AddUnit( DCSUnit, DCSUnitName ) - end - else - self:E( { "Group does not exist: ", DCSGroup } ) - end - - end - end - - for ClientName, ClientTemplate in pairs( self.Templates.ClientsByName ) do - self:E( { "Adding Client:", ClientName } ) - self:AddClient( ClientName ) - end - - return self -end - ---- Events - ---- Handles the OnBirth event for the alive units set. --- @param #DATABASE self --- @param Event#EVENTDATA Event -function DATABASE:_EventOnBirth( Event ) - self:F2( { Event } ) - - if Event.IniDCSUnit then - self:AddUnit( Event.IniDCSUnit, Event.IniDCSUnitName ) - self:AddGroup( Event.IniDCSGroup, Event.IniDCSGroupName ) - self:_EventOnPlayerEnterUnit( Event ) - end -end - - ---- Handles the OnDead or OnCrash event for alive units set. --- @param #DATABASE self --- @param Event#EVENTDATA Event -function DATABASE:_EventOnDeadOrCrash( Event ) - self:F2( { Event } ) - - if Event.IniDCSUnit then - if self.DCSUnits[Event.IniDCSUnitName] then - self:DeleteUnit( Event.IniDCSUnitName ) - -- add logic to correctly remove a group once all units are destroyed... - end - end -end - - ---- Handles the OnPlayerEnterUnit event to fill the active players table (with the unit filter applied). --- @param #DATABASE self --- @param Event#EVENTDATA Event -function DATABASE:_EventOnPlayerEnterUnit( Event ) - self:F2( { Event } ) - - if Event.IniDCSUnit then - local PlayerName = Event.IniDCSUnit:getPlayerName() - if not self.PLAYERSALIVE[PlayerName] then - self:AddPlayer( Event.IniDCSUnitName, PlayerName ) - end - end -end - - ---- Handles the OnPlayerLeaveUnit event to clean the active players table. --- @param #DATABASE self --- @param Event#EVENTDATA Event -function DATABASE:_EventOnPlayerLeaveUnit( Event ) - self:F2( { Event } ) - - if Event.IniDCSUnit then - local PlayerName = Event.IniDCSUnit:getPlayerName() - if self.PLAYERSALIVE[PlayerName] then - self:DeletePlayer( PlayerName ) - end - end -end - ---- Iterators - ---- Iterate the DATABASE and call an iterator function for the given set, providing the Object for each element within the set and optional parameters. --- @param #DATABASE self --- @param #function IteratorFunction The function that will be called when there is an alive player in the database. --- @return #DATABASE self -function DATABASE:ForEach( IteratorFunction, arg, Set ) - self:F2( arg ) - - local function CoRoutine() - local Count = 0 - for ObjectID, Object in pairs( Set ) do - self:T2( Object ) - IteratorFunction( Object, unpack( arg ) ) - Count = Count + 1 - if Count % 10 == 0 then - coroutine.yield( false ) - end - end - return true - end - - local co = coroutine.create( CoRoutine ) - - local function Schedule() - - local status, res = coroutine.resume( co ) - self:T2( { status, res } ) - - if status == false then - error( res ) - end - if res == false then - return true -- resume next time the loop - end - - return false - end - - local Scheduler = SCHEDULER:New( self, Schedule, {}, 0.001, 0.001, 0 ) - - return self -end - - ---- Iterate the DATABASE and call an iterator function for each **alive** unit, providing the DCSUnit and optional parameters. --- @param #DATABASE self --- @param #function IteratorFunction The function that will be called when there is an alive unit in the database. The function needs to accept a DCSUnit parameter. --- @return #DATABASE self -function DATABASE:ForEachDCSUnit( IteratorFunction, ... ) - self:F2( arg ) - - self:ForEach( IteratorFunction, arg, self.DCSUnits ) - - return self -end - - ---- Iterate the DATABASE and call an iterator function for each **alive** UNIT, providing the UNIT and optional parameters. --- @param #DATABASE self --- @param #function IteratorFunction The function that will be called when there is an alive UNIT in the database. The function needs to accept a UNIT parameter. --- @return #DATABASE self -function DATABASE:ForEachUnit( IteratorFunction, ... ) - self:F2( arg ) - - self:ForEach( IteratorFunction, arg, self.UNITS ) - - return self -end - ---- Iterate the DATABASE and call an iterator function for each **alive** GROUP, providing the GROUP and optional parameters. --- @param #DATABASE self --- @param #function IteratorFunction The function that will be called when there is an alive GROUP in the database. The function needs to accept a GROUP parameter. --- @return #DATABASE self -function DATABASE:ForEachGroup( IteratorFunction, ... ) - self:F2( arg ) - - self:ForEach( IteratorFunction, arg, self.GROUPS ) - - return self -end - - ---- Iterate the DATABASE and call an iterator function for each player, providing the player name and optional parameters. --- @param #DATABASE self --- @param #function IteratorFunction The function that will be called when there is an player in the database. The function needs to accept the player name. --- @return #DATABASE self -function DATABASE:ForEachPlayer( IteratorFunction, ... ) - self:F2( arg ) - - self:ForEach( IteratorFunction, arg, self.PLAYERS ) - - return self -end - - ---- Iterate the DATABASE and call an iterator function for each **alive** player, providing the Unit of the player and optional parameters. --- @param #DATABASE self --- @param #function IteratorFunction The function that will be called when there is an alive player in the database. The function needs to accept a UNIT parameter. --- @return #DATABASE self -function DATABASE:ForEachPlayerAlive( IteratorFunction, ... ) - self:F2( arg ) - - self:ForEach( IteratorFunction, arg, self.PLAYERSALIVE ) - - return self -end - ---- Iterate the DATABASE and call an iterator function for each CLIENT, providing the CLIENT to the function and optional parameters. --- @param #DATABASE self --- @param #function IteratorFunction The function that will be called when there is an alive player in the database. The function needs to accept a CLIENT parameter. --- @return #DATABASE self -function DATABASE:ForEachClient( IteratorFunction, ... ) - self:F2( arg ) - - self:ForEach( IteratorFunction, arg, self.CLIENTS ) - - return self -end - ---- Iterate the DATABASE and call an iterator function for each **ALIVE** CLIENT, providing the CLIENT to the function and optional parameters. --- @param #DATABASE self --- @param #function IteratorFunction The function that will be called when there is an alive CLIENT in the database. The function needs to accept a CLIENT parameter. --- @return #DATABASE self -function DATABASE:ForEachClientAlive( IteratorFunction, ... ) - self:F2( arg ) - - self:ForEach( IteratorFunction, arg, self.CLIENTSALIVE ) - - return self -end - - -function DATABASE:_RegisterTemplates() - self:F2() - - self.Navpoints = {} - self.UNITS = {} - --Build routines.db.units and self.Navpoints - for coa_name, coa_data in pairs(env.mission.coalition) do - - if (coa_name == 'red' or coa_name == 'blue') and type(coa_data) == 'table' then - --self.Units[coa_name] = {} - - ---------------------------------------------- - -- build nav points DB - self.Navpoints[coa_name] = {} - if coa_data.nav_points then --navpoints - for nav_ind, nav_data in pairs(coa_data.nav_points) do - - if type(nav_data) == 'table' then - self.Navpoints[coa_name][nav_ind] = routines.utils.deepCopy(nav_data) - - self.Navpoints[coa_name][nav_ind]['name'] = nav_data.callsignStr -- name is a little bit more self-explanatory. - self.Navpoints[coa_name][nav_ind]['point'] = {} -- point is used by SSE, support it. - self.Navpoints[coa_name][nav_ind]['point']['x'] = nav_data.x - self.Navpoints[coa_name][nav_ind]['point']['y'] = 0 - self.Navpoints[coa_name][nav_ind]['point']['z'] = nav_data.y - end - end - end - ------------------------------------------------- - if coa_data.country then --there is a country table - for cntry_id, cntry_data in pairs(coa_data.country) do - - local countryName = string.lower(cntry_data.name) - --self.Units[coa_name][countryName] = {} - --self.Units[coa_name][countryName]["countryId"] = cntry_data.id - - if type(cntry_data) == 'table' then --just making sure - - for obj_type_name, obj_type_data in pairs(cntry_data) do - - if obj_type_name == "helicopter" or obj_type_name == "ship" or obj_type_name == "plane" or obj_type_name == "vehicle" or obj_type_name == "static" then --should be an unncessary check - - local category = obj_type_name - - if ((type(obj_type_data) == 'table') and obj_type_data.group and (type(obj_type_data.group) == 'table') and (#obj_type_data.group > 0)) then --there's a group! - - --self.Units[coa_name][countryName][category] = {} - - for group_num, GroupTemplate in pairs(obj_type_data.group) do - - if GroupTemplate and GroupTemplate.units and type(GroupTemplate.units) == 'table' then --making sure again- this is a valid group - self:_RegisterTemplate( GroupTemplate ) - end --if GroupTemplate and GroupTemplate.units then - end --for group_num, GroupTemplate in pairs(obj_type_data.group) do - end --if ((type(obj_type_data) == 'table') and obj_type_data.group and (type(obj_type_data.group) == 'table') and (#obj_type_data.group > 0)) then - end --if obj_type_name == "helicopter" or obj_type_name == "ship" or obj_type_name == "plane" or obj_type_name == "vehicle" or obj_type_name == "static" then - end --for obj_type_name, obj_type_data in pairs(cntry_data) do - end --if type(cntry_data) == 'table' then - end --for cntry_id, cntry_data in pairs(coa_data.country) do - end --if coa_data.country then --there is a country table - end --if coa_name == 'red' or coa_name == 'blue' and type(coa_data) == 'table' then - end --for coa_name, coa_data in pairs(mission.coalition) do - - return self -end - - - - ---- The main include file for the MOOSE system. - -Include.File( "Routines" ) -Include.File( "Base" ) -Include.File( "Database" ) -Include.File( "Event" ) - --- The order of the declarations is important here. Don't touch it. - ---- Declare the event dispatcher based on the EVENT class -_EVENTDISPATCHER = EVENT:New() -- #EVENT - ---- Declare the main database object, which is used internally by the MOOSE classes. -_DATABASE = DATABASE:New() -- Database#DATABASE - ---- Scoring system for MOOSE. --- This scoring class calculates the hits and kills that players make within a simulation session. --- Scoring is calculated using a defined algorithm. --- With a small change in MissionScripting.lua, the scoring can also be logged in a CSV file, that can then be uploaded --- to a database or a BI tool to publish the scoring results to the player community. --- @module Scoring --- @author FlightControl - - -Include.File( "Routines" ) -Include.File( "Base" ) -Include.File( "Menu" ) -Include.File( "Group" ) -Include.File( "Event" ) - - ---- The Scoring class --- @type SCORING --- @field Players A collection of the current players that have joined the game. --- @extends Base#BASE -SCORING = { - ClassName = "SCORING", - ClassID = 0, - Players = {}, -} - -local _SCORINGCoalition = - { - [1] = "Red", - [2] = "Blue", - } - -local _SCORINGCategory = - { - [Unit.Category.AIRPLANE] = "Plane", - [Unit.Category.HELICOPTER] = "Helicopter", - [Unit.Category.GROUND_UNIT] = "Vehicle", - [Unit.Category.SHIP] = "Ship", - [Unit.Category.STRUCTURE] = "Structure", - } - ---- Creates a new SCORING object to administer the scoring achieved by players. --- @param #SCORING self --- @param #string GameName The name of the game. This name is also logged in the CSV score file. --- @return #SCORING self --- @usage --- -- Define a new scoring object for the mission Gori Valley. --- ScoringObject = SCORING:New( "Gori Valley" ) -function SCORING:New( GameName ) - - -- Inherits from BASE - local self = BASE:Inherit( self, BASE:New() ) - - if GameName then - self.GameName = GameName - else - error( "A game name must be given to register the scoring results" ) - end - - - _EVENTDISPATCHER:OnDead( self._EventOnDeadOrCrash, self ) - _EVENTDISPATCHER:OnCrash( self._EventOnDeadOrCrash, self ) - _EVENTDISPATCHER:OnHit( self._EventOnHit, self ) - - --self.SchedulerId = routines.scheduleFunction( SCORING._FollowPlayersScheduled, { self }, 0, 5 ) - self.SchedulerId = SCHEDULER:New( self, self._FollowPlayersScheduled, {}, 0, 5 ) - - self:ScoreMenu() - - return self - -end - ---- Creates a score radio menu. Can be accessed using Radio -> F10. --- @param #SCORING self --- @return #SCORING self -function SCORING:ScoreMenu() - self.Menu = SUBMENU:New( 'Scoring' ) - self.AllScoresMenu = COMMANDMENU:New( 'Score All Active Players', self.Menu, SCORING.ReportScoreAll, self ) - --- = COMMANDMENU:New('Your Current Score', ReportScore, SCORING.ReportScorePlayer, self ) - return self -end - ---- Follows new players entering Clients within the DCSRTE. --- TODO: Need to see if i can catch this also with an event. It will eliminate the schedule ... -function SCORING:_FollowPlayersScheduled() - self:F3( "_FollowPlayersScheduled" ) - - local ClientUnit = 0 - local CoalitionsData = { AlivePlayersRed = coalition.getPlayers(coalition.side.RED), AlivePlayersBlue = coalition.getPlayers(coalition.side.BLUE) } - local unitId - local unitData - local AlivePlayerUnits = {} - - for CoalitionId, CoalitionData in pairs( CoalitionsData ) do - self:T3( { "_FollowPlayersScheduled", CoalitionData } ) - for UnitId, UnitData in pairs( CoalitionData ) do - self:_AddPlayerFromUnit( UnitData ) - end - end - - return true -end - - ---- Track DEAD or CRASH events for the scoring. --- @param #SCORING self --- @param Event#EVENTDATA Event -function SCORING:_EventOnDeadOrCrash( Event ) - self:F( { Event } ) - - local TargetUnit = nil - local TargetGroup = nil - local TargetUnitName = "" - local TargetGroupName = "" - local TargetPlayerName = "" - local TargetCoalition = nil - local TargetCategory = nil - local TargetType = nil - local TargetUnitCoalition = nil - local TargetUnitCategory = nil - local TargetUnitType = nil - - if Event.IniDCSUnit then - - TargetUnit = Event.IniDCSUnit - TargetUnitName = Event.IniDCSUnitName - TargetGroup = Event.IniDCSGroup - TargetGroupName = Event.IniDCSGroupName - TargetPlayerName = TargetUnit:getPlayerName() - - TargetCoalition = TargetUnit:getCoalition() - --TargetCategory = TargetUnit:getCategory() - TargetCategory = TargetUnit:getDesc().category -- Workaround - TargetType = TargetUnit:getTypeName() - - TargetUnitCoalition = _SCORINGCoalition[TargetCoalition] - TargetUnitCategory = _SCORINGCategory[TargetCategory] - TargetUnitType = TargetType - - self:T( { TargetUnitName, TargetGroupName, TargetPlayerName, TargetCoalition, TargetCategory, TargetType } ) - end - - for PlayerName, PlayerData in pairs( self.Players ) do - if PlayerData then -- This should normally not happen, but i'll test it anyway. - self:T( "Something got killed" ) - - -- Some variables - local InitUnitName = PlayerData.UnitName - local InitUnitType = PlayerData.UnitType - local InitCoalition = PlayerData.UnitCoalition - local InitCategory = PlayerData.UnitCategory - local InitUnitCoalition = _SCORINGCoalition[InitCoalition] - local InitUnitCategory = _SCORINGCategory[InitCategory] - - self:T( { InitUnitName, InitUnitType, InitUnitCoalition, InitCoalition, InitUnitCategory, InitCategory } ) - - -- What is he hitting? - if TargetCategory then - if PlayerData and PlayerData.Hit and PlayerData.Hit[TargetCategory] and PlayerData.Hit[TargetCategory][TargetUnitName] then -- Was there a hit for this unit for this player before registered??? - if not PlayerData.Kill[TargetCategory] then - PlayerData.Kill[TargetCategory] = {} - end - if not PlayerData.Kill[TargetCategory][TargetType] then - PlayerData.Kill[TargetCategory][TargetType] = {} - PlayerData.Kill[TargetCategory][TargetType].Score = 0 - PlayerData.Kill[TargetCategory][TargetType].ScoreKill = 0 - PlayerData.Kill[TargetCategory][TargetType].Penalty = 0 - PlayerData.Kill[TargetCategory][TargetType].PenaltyKill = 0 - end - - if InitCoalition == TargetCoalition then - PlayerData.Penalty = PlayerData.Penalty + 25 - PlayerData.Kill[TargetCategory][TargetType].Penalty = PlayerData.Kill[TargetCategory][TargetType].Penalty + 25 - PlayerData.Kill[TargetCategory][TargetType].PenaltyKill = PlayerData.Kill[TargetCategory][TargetType].PenaltyKill + 1 - MESSAGE:New( "Player '" .. PlayerName .. "' killed a friendly " .. TargetUnitCategory .. " ( " .. TargetType .. " ) " .. - PlayerData.Kill[TargetCategory][TargetType].PenaltyKill .. " times. Penalty: -" .. PlayerData.Kill[TargetCategory][TargetType].Penalty .. - ". Score Total:" .. PlayerData.Score - PlayerData.Penalty, - "", 5, "/PENALTY" .. PlayerName .. "/" .. InitUnitName ):ToAll() - self:ScoreCSV( PlayerName, "KILL_PENALTY", 1, -125, InitUnitName, InitUnitCoalition, InitUnitCategory, InitUnitType, TargetUnitName, TargetUnitCoalition, TargetUnitCategory, TargetUnitType ) - else - PlayerData.Score = PlayerData.Score + 10 - PlayerData.Kill[TargetCategory][TargetType].Score = PlayerData.Kill[TargetCategory][TargetType].Score + 10 - PlayerData.Kill[TargetCategory][TargetType].ScoreKill = PlayerData.Kill[TargetCategory][TargetType].ScoreKill + 1 - MESSAGE:New( "Player '" .. PlayerName .. "' killed an enemy " .. TargetUnitCategory .. " ( " .. TargetType .. " ) " .. - PlayerData.Kill[TargetCategory][TargetType].ScoreKill .. " times. Score: " .. PlayerData.Kill[TargetCategory][TargetType].Score .. - ". Score Total:" .. PlayerData.Score - PlayerData.Penalty, - "", 5, "/SCORE" .. PlayerName .. "/" .. InitUnitName ):ToAll() - self:ScoreCSV( PlayerName, "KILL_SCORE", 1, 10, InitUnitName, InitUnitCoalition, InitUnitCategory, InitUnitType, TargetUnitName, TargetUnitCoalition, TargetUnitCategory, TargetUnitType ) - end - end - end - end - end -end - - - ---- Add a new player entering a Unit. -function SCORING:_AddPlayerFromUnit( UnitData ) - self:F( UnitData ) - - if UnitData and UnitData:isExist() then - local UnitName = UnitData:getName() - local PlayerName = UnitData:getPlayerName() - local UnitDesc = UnitData:getDesc() - local UnitCategory = UnitDesc.category - local UnitCoalition = UnitData:getCoalition() - local UnitTypeName = UnitData:getTypeName() - - self:T( { PlayerName, UnitName, UnitCategory, UnitCoalition, UnitTypeName } ) - - if self.Players[PlayerName] == nil then -- I believe this is the place where a Player gets a life in a mission when he enters a unit ... - self.Players[PlayerName] = {} - self.Players[PlayerName].Hit = {} - self.Players[PlayerName].Kill = {} - self.Players[PlayerName].Mission = {} - - -- for CategoryID, CategoryName in pairs( SCORINGCategory ) do - -- self.Players[PlayerName].Hit[CategoryID] = {} - -- self.Players[PlayerName].Kill[CategoryID] = {} - -- end - self.Players[PlayerName].HitPlayers = {} - self.Players[PlayerName].HitUnits = {} - self.Players[PlayerName].Score = 0 - self.Players[PlayerName].Penalty = 0 - self.Players[PlayerName].PenaltyCoalition = 0 - self.Players[PlayerName].PenaltyWarning = 0 - end - - if not self.Players[PlayerName].UnitCoalition then - self.Players[PlayerName].UnitCoalition = UnitCoalition - else - if self.Players[PlayerName].UnitCoalition ~= UnitCoalition then - self.Players[PlayerName].Penalty = self.Players[PlayerName].Penalty + 50 - self.Players[PlayerName].PenaltyCoalition = self.Players[PlayerName].PenaltyCoalition + 1 - MESSAGE:New( "Player '" .. PlayerName .. "' changed coalition from " .. _SCORINGCoalition[self.Players[PlayerName].UnitCoalition] .. " to " .. _SCORINGCoalition[UnitCoalition] .. - "(changed " .. self.Players[PlayerName].PenaltyCoalition .. " times the coalition). 50 Penalty points added.", - "", - 2, - "/PENALTYCOALITION" .. PlayerName - ):ToAll() - self:ScoreCSV( PlayerName, "COALITION_PENALTY", 1, -50, self.Players[PlayerName].UnitName, _SCORINGCoalition[self.Players[PlayerName].UnitCoalition], _SCORINGCategory[self.Players[PlayerName].UnitCategory], self.Players[PlayerName].UnitType, - UnitName, _SCORINGCoalition[UnitCoalition], _SCORINGCategory[UnitCategory], UnitData:getTypeName() ) - end - end - self.Players[PlayerName].UnitName = UnitName - self.Players[PlayerName].UnitCoalition = UnitCoalition - self.Players[PlayerName].UnitCategory = UnitCategory - self.Players[PlayerName].UnitType = UnitTypeName - - if self.Players[PlayerName].Penalty > 100 then - if self.Players[PlayerName].PenaltyWarning < 1 then - MESSAGE:New( "Player '" .. PlayerName .. "': WARNING! If you continue to commit FRATRICIDE and have a PENALTY score higher than 150, you will be COURT MARTIALED and DISMISSED from this mission! \nYour total penalty is: " .. self.Players[PlayerName].Penalty, - "", - 30, - "/PENALTYCOALITION" .. PlayerName - ):ToAll() - self.Players[PlayerName].PenaltyWarning = self.Players[PlayerName].PenaltyWarning + 1 - end - end - - if self.Players[PlayerName].Penalty > 150 then - ClientGroup = GROUP:NewFromDCSUnit( UnitData ) - ClientGroup:Destroy() - MESSAGE:New( "Player '" .. PlayerName .. "' committed FRATRICIDE, he will be COURT MARTIALED and is DISMISSED from this mission!", - "", - 10, - "/PENALTYCOALITION" .. PlayerName - ):ToAll() - end - - end -end - - ---- Registers Scores the players completing a Mission Task. -function SCORING:_AddMissionTaskScore( PlayerUnit, MissionName, Score ) - self:F( { PlayerUnit, MissionName, Score } ) - - local PlayerName = PlayerUnit:getPlayerName() - - if not self.Players[PlayerName].Mission[MissionName] then - self.Players[PlayerName].Mission[MissionName] = {} - self.Players[PlayerName].Mission[MissionName].ScoreTask = 0 - self.Players[PlayerName].Mission[MissionName].ScoreMission = 0 - end - - self:T( PlayerName ) - self:T( self.Players[PlayerName].Mission[MissionName] ) - - self.Players[PlayerName].Score = self.Players[PlayerName].Score + Score - self.Players[PlayerName].Mission[MissionName].ScoreTask = self.Players[PlayerName].Mission[MissionName].ScoreTask + Score - - MESSAGE:New( "Player '" .. PlayerName .. "' has finished another Task in Mission '" .. MissionName .. "'. " .. - Score .. " Score points added.", - "", 20, "/SCORETASK" .. PlayerName ):ToAll() - - self:ScoreCSV( PlayerName, "TASK_" .. MissionName:gsub( ' ', '_' ), 1, Score, PlayerUnit:getName() ) -end - - ---- Registers Mission Scores for possible multiple players that contributed in the Mission. -function SCORING:_AddMissionScore( MissionName, Score ) - self:F( { MissionName, Score } ) - - for PlayerName, PlayerData in pairs( self.Players ) do - - if PlayerData.Mission[MissionName] then - PlayerData.Score = PlayerData.Score + Score - PlayerData.Mission[MissionName].ScoreMission = PlayerData.Mission[MissionName].ScoreMission + Score - MESSAGE:New( "Player '" .. PlayerName .. "' has finished Mission '" .. MissionName .. "'. " .. - Score .. " Score points added.", - "", 20, "/SCOREMISSION" .. PlayerName ):ToAll() - self:ScoreCSV( PlayerName, "MISSION_" .. MissionName:gsub( ' ', '_' ), 1, Score ) - end - end -end - ---- Handles the OnHit event for the scoring. --- @param #SCORING self --- @param Event#EVENTDATA Event -function SCORING:_EventOnHit( Event ) - self:F( { Event } ) - - local InitUnit = nil - local InitUnitName = "" - local InitGroup = nil - local InitGroupName = "" - local InitPlayerName = nil - - local InitCoalition = nil - local InitCategory = nil - local InitType = nil - local InitUnitCoalition = nil - local InitUnitCategory = nil - local InitUnitType = nil - - local TargetUnit = nil - local TargetUnitName = "" - local TargetGroup = nil - local TargetGroupName = "" - local TargetPlayerName = "" - - local TargetCoalition = nil - local TargetCategory = nil - local TargetType = nil - local TargetUnitCoalition = nil - local TargetUnitCategory = nil - local TargetUnitType = nil - - if Event.IniDCSUnit then - - InitUnit = Event.IniDCSUnit - InitUnitName = Event.IniDCSUnitName - InitGroup = Event.IniDCSGroup - InitGroupName = Event.IniDCSGroupName - InitPlayerName = InitUnit:getPlayerName() - - InitCoalition = InitUnit:getCoalition() - --TODO: Workaround Client DCS Bug - --InitCategory = InitUnit:getCategory() - InitCategory = InitUnit:getDesc().category - InitType = InitUnit:getTypeName() - - InitUnitCoalition = _SCORINGCoalition[InitCoalition] - InitUnitCategory = _SCORINGCategory[InitCategory] - InitUnitType = InitType - - self:T( { InitUnitName, InitGroupName, InitPlayerName, InitCoalition, InitCategory, InitType , InitUnitCoalition, InitUnitCategory, InitUnitType } ) - end - - - if Event.TgtDCSUnit then - - TargetUnit = Event.TgtDCSUnit - TargetUnitName = Event.TgtDCSUnitName - TargetGroup = Event.TgtDCSGroup - TargetGroupName = Event.TgtDCSGroupName - TargetPlayerName = TargetUnit:getPlayerName() - - TargetCoalition = TargetUnit:getCoalition() - --TODO: Workaround Client DCS Bug - --TargetCategory = TargetUnit:getCategory() - TargetCategory = TargetUnit:getDesc().category - TargetType = TargetUnit:getTypeName() - - TargetUnitCoalition = _SCORINGCoalition[TargetCoalition] - TargetUnitCategory = _SCORINGCategory[TargetCategory] - TargetUnitType = TargetType - - self:T( { TargetUnitName, TargetGroupName, TargetPlayerName, TargetCoalition, TargetCategory, TargetType, TargetUnitCoalition, TargetUnitCategory, TargetUnitType } ) - end - - if InitPlayerName ~= nil then -- It is a player that is hitting something - self:_AddPlayerFromUnit( InitUnit ) - if self.Players[InitPlayerName] then -- This should normally not happen, but i'll test it anyway. - if TargetPlayerName ~= nil then -- It is a player hitting another player ... - self:_AddPlayerFromUnit( TargetUnit ) - self.Players[InitPlayerName].HitPlayers = self.Players[InitPlayerName].HitPlayers + 1 - end - - self:T( "Hitting Something" ) - -- What is he hitting? - if TargetCategory then - if not self.Players[InitPlayerName].Hit[TargetCategory] then - self.Players[InitPlayerName].Hit[TargetCategory] = {} - end - if not self.Players[InitPlayerName].Hit[TargetCategory][TargetUnitName] then - self.Players[InitPlayerName].Hit[TargetCategory][TargetUnitName] = {} - self.Players[InitPlayerName].Hit[TargetCategory][TargetUnitName].Score = 0 - self.Players[InitPlayerName].Hit[TargetCategory][TargetUnitName].Penalty = 0 - self.Players[InitPlayerName].Hit[TargetCategory][TargetUnitName].ScoreHit = 0 - self.Players[InitPlayerName].Hit[TargetCategory][TargetUnitName].PenaltyHit = 0 - end - local Score = 0 - if InitCoalition == TargetCoalition then - self.Players[InitPlayerName].Penalty = self.Players[InitPlayerName].Penalty + 10 - self.Players[InitPlayerName].Hit[TargetCategory][TargetUnitName].Penalty = self.Players[InitPlayerName].Hit[TargetCategory][TargetUnitName].Penalty + 10 - self.Players[InitPlayerName].Hit[TargetCategory][TargetUnitName].PenaltyHit = self.Players[InitPlayerName].Hit[TargetCategory][TargetUnitName].PenaltyHit + 1 - MESSAGE:New( "Player '" .. InitPlayerName .. "' hit a friendly " .. TargetUnitCategory .. " ( " .. TargetType .. " ) " .. - self.Players[InitPlayerName].Hit[TargetCategory][TargetUnitName].PenaltyHit .. " times. Penalty: -" .. self.Players[InitPlayerName].Hit[TargetCategory][TargetUnitName].Penalty .. - ". Score Total:" .. self.Players[InitPlayerName].Score - self.Players[InitPlayerName].Penalty, - "", - 2, - "/PENALTY" .. InitPlayerName .. "/" .. InitUnitName - ):ToAll() - self:ScoreCSV( InitPlayerName, "HIT_PENALTY", 1, -25, InitUnitName, InitUnitCoalition, InitUnitCategory, InitUnitType, TargetUnitName, TargetUnitCoalition, TargetUnitCategory, TargetUnitType ) - else - self.Players[InitPlayerName].Score = self.Players[InitPlayerName].Score + 10 - self.Players[InitPlayerName].Hit[TargetCategory][TargetUnitName].Score = self.Players[InitPlayerName].Hit[TargetCategory][TargetUnitName].Score + 1 - self.Players[InitPlayerName].Hit[TargetCategory][TargetUnitName].ScoreHit = self.Players[InitPlayerName].Hit[TargetCategory][TargetUnitName].ScoreHit + 1 - MESSAGE:New( "Player '" .. InitPlayerName .. "' hit a target " .. TargetUnitCategory .. " ( " .. TargetType .. " ) " .. - self.Players[InitPlayerName].Hit[TargetCategory][TargetUnitName].ScoreHit .. " times. Score: " .. self.Players[InitPlayerName].Hit[TargetCategory][TargetUnitName].Score .. - ". Score Total:" .. self.Players[InitPlayerName].Score - self.Players[InitPlayerName].Penalty, - "", - 2, - "/SCORE" .. InitPlayerName .. "/" .. InitUnitName - ):ToAll() - self:ScoreCSV( InitPlayerName, "HIT_SCORE", 1, 1, InitUnitName, InitUnitCoalition, InitUnitCategory, InitUnitType, TargetUnitName, TargetUnitCoalition, TargetUnitCategory, TargetUnitType ) - end - end - end - elseif InitPlayerName == nil then -- It is an AI hitting a player??? - - end -end - - -function SCORING:ReportScoreAll() - - env.info( "Hello World " ) - - local ScoreMessage = "" - local PlayerMessage = "" - - self:T( "Score Report" ) - - for PlayerName, PlayerData in pairs( self.Players ) do - if PlayerData then -- This should normally not happen, but i'll test it anyway. - self:T( "Score Player: " .. PlayerName ) - - -- Some variables - local InitUnitCoalition = _SCORINGCoalition[PlayerData.UnitCoalition] - local InitUnitCategory = _SCORINGCategory[PlayerData.UnitCategory] - local InitUnitType = PlayerData.UnitType - local InitUnitName = PlayerData.UnitName - - local PlayerScore = 0 - local PlayerPenalty = 0 - - ScoreMessage = ":\n" - - local ScoreMessageHits = "" - - for CategoryID, CategoryName in pairs( _SCORINGCategory ) do - self:T( CategoryName ) - if PlayerData.Hit[CategoryID] then - local Score = 0 - local ScoreHit = 0 - local Penalty = 0 - local PenaltyHit = 0 - self:T( "Hit scores exist for player " .. PlayerName ) - for UnitName, UnitData in pairs( PlayerData.Hit[CategoryID] ) do - Score = Score + UnitData.Score - ScoreHit = ScoreHit + UnitData.ScoreHit - Penalty = Penalty + UnitData.Penalty - PenaltyHit = UnitData.PenaltyHit - end - local ScoreMessageHit = string.format( "%s:%d ", CategoryName, Score - Penalty ) - self:T( ScoreMessageHit ) - ScoreMessageHits = ScoreMessageHits .. ScoreMessageHit - PlayerScore = PlayerScore + Score - PlayerPenalty = PlayerPenalty + Penalty - else - --ScoreMessageHits = ScoreMessageHits .. string.format( "%s:%d ", string.format(CategoryName, 1, 1), 0 ) - end - end - if ScoreMessageHits ~= "" then - ScoreMessage = ScoreMessage .. " Hits: " .. ScoreMessageHits .. "\n" - end - - local ScoreMessageKills = "" - for CategoryID, CategoryName in pairs( _SCORINGCategory ) do - self:T( "Kill scores exist for player " .. PlayerName ) - if PlayerData.Kill[CategoryID] then - local Score = 0 - local ScoreKill = 0 - local Penalty = 0 - local PenaltyKill = 0 - - for UnitName, UnitData in pairs( PlayerData.Kill[CategoryID] ) do - Score = Score + UnitData.Score - ScoreKill = ScoreKill + UnitData.ScoreKill - Penalty = Penalty + UnitData.Penalty - PenaltyKill = PenaltyKill + UnitData.PenaltyKill - end - - local ScoreMessageKill = string.format( " %s:%d ", CategoryName, Score - Penalty ) - self:T( ScoreMessageKill ) - ScoreMessageKills = ScoreMessageKills .. ScoreMessageKill - - PlayerScore = PlayerScore + Score - PlayerPenalty = PlayerPenalty + Penalty - else - --ScoreMessageKills = ScoreMessageKills .. string.format( "%s:%d ", string.format(CategoryName, 1, 1), 0 ) - end - end - if ScoreMessageKills ~= "" then - ScoreMessage = ScoreMessage .. " Kills: " .. ScoreMessageKills .. "\n" - end - - local ScoreMessageCoalitionChangePenalties = "" - if PlayerData.PenaltyCoalition ~= 0 then - ScoreMessageCoalitionChangePenalties = ScoreMessageCoalitionChangePenalties .. string.format( " -%d (%d changed)", PlayerData.Penalty, PlayerData.PenaltyCoalition ) - PlayerPenalty = PlayerPenalty + PlayerData.Penalty - end - if ScoreMessageCoalitionChangePenalties ~= "" then - ScoreMessage = ScoreMessage .. " Coalition Penalties: " .. ScoreMessageCoalitionChangePenalties .. "\n" - end - - local ScoreMessageMission = "" - local ScoreMission = 0 - local ScoreTask = 0 - for MissionName, MissionData in pairs( PlayerData.Mission ) do - ScoreMission = ScoreMission + MissionData.ScoreMission - ScoreTask = ScoreTask + MissionData.ScoreTask - ScoreMessageMission = ScoreMessageMission .. "'" .. MissionName .. "'; " - end - PlayerScore = PlayerScore + ScoreMission + ScoreTask - - if ScoreMessageMission ~= "" then - ScoreMessage = ScoreMessage .. " Tasks: " .. ScoreTask .. " Mission: " .. ScoreMission .. " ( " .. ScoreMessageMission .. ")\n" - end - - PlayerMessage = PlayerMessage .. string.format( "Player '%s' Score:%d (%d Score -%d Penalties)%s", PlayerName, PlayerScore - PlayerPenalty, PlayerScore, PlayerPenalty, ScoreMessage ) - end - end - MESSAGE:New( PlayerMessage, "Player Scores", 30, "AllPlayerScores"):ToAll() -end - - -function SCORING:ReportScorePlayer() - - env.info( "Hello World " ) - - local ScoreMessage = "" - local PlayerMessage = "" - - self:T( "Score Report" ) - - for PlayerName, PlayerData in pairs( self.Players ) do - if PlayerData then -- This should normally not happen, but i'll test it anyway. - self:T( "Score Player: " .. PlayerName ) - - -- Some variables - local InitUnitCoalition = _SCORINGCoalition[PlayerData.UnitCoalition] - local InitUnitCategory = _SCORINGCategory[PlayerData.UnitCategory] - local InitUnitType = PlayerData.UnitType - local InitUnitName = PlayerData.UnitName - - local PlayerScore = 0 - local PlayerPenalty = 0 - - ScoreMessage = "" - - local ScoreMessageHits = "" - - for CategoryID, CategoryName in pairs( _SCORINGCategory ) do - self:T( CategoryName ) - if PlayerData.Hit[CategoryID] then - local Score = 0 - local ScoreHit = 0 - local Penalty = 0 - local PenaltyHit = 0 - self:T( "Hit scores exist for player " .. PlayerName ) - for UnitName, UnitData in pairs( PlayerData.Hit[CategoryID] ) do - Score = Score + UnitData.Score - ScoreHit = ScoreHit + UnitData.ScoreHit - Penalty = Penalty + UnitData.Penalty - PenaltyHit = UnitData.PenaltyHit - end - local ScoreMessageHit = string.format( "\n %s = %d score(%d;-%d) hits(#%d;#-%d)", CategoryName, Score - Penalty, Score, Penalty, ScoreHit, PenaltyHit ) - self:T( ScoreMessageHit ) - ScoreMessageHits = ScoreMessageHits .. ScoreMessageHit - PlayerScore = PlayerScore + Score - PlayerPenalty = PlayerPenalty + Penalty - else - --ScoreMessageHits = ScoreMessageHits .. string.format( "%s:%d ", string.format(CategoryName, 1, 1), 0 ) - end - end - if ScoreMessageHits ~= "" then - ScoreMessage = ScoreMessage .. "\n Hits: " .. ScoreMessageHits .. " " - end - - local ScoreMessageKills = "" - for CategoryID, CategoryName in pairs( _SCORINGCategory ) do - self:T( "Kill scores exist for player " .. PlayerName ) - if PlayerData.Kill[CategoryID] then - local Score = 0 - local ScoreKill = 0 - local Penalty = 0 - local PenaltyKill = 0 - - for UnitName, UnitData in pairs( PlayerData.Kill[CategoryID] ) do - Score = Score + UnitData.Score - ScoreKill = ScoreKill + UnitData.ScoreKill - Penalty = Penalty + UnitData.Penalty - PenaltyKill = PenaltyKill + UnitData.PenaltyKill - end - - local ScoreMessageKill = string.format( "\n %s = %d score(%d;-%d) hits(#%d;#-%d)", CategoryName, Score - Penalty, Score, Penalty, ScoreKill, PenaltyKill ) - self:T( ScoreMessageKill ) - ScoreMessageKills = ScoreMessageKills .. ScoreMessageKill - - PlayerScore = PlayerScore + Score - PlayerPenalty = PlayerPenalty + Penalty - else - --ScoreMessageKills = ScoreMessageKills .. string.format( "%s:%d ", string.format(CategoryName, 1, 1), 0 ) - end - end - if ScoreMessageKills ~= "" then - ScoreMessage = ScoreMessage .. "\n Kills: " .. ScoreMessageKills .. " " - end - - local ScoreMessageCoalitionChangePenalties = "" - if PlayerData.PenaltyCoalition ~= 0 then - ScoreMessageCoalitionChangePenalties = ScoreMessageCoalitionChangePenalties .. string.format( " -%d (%d changed)", PlayerData.Penalty, PlayerData.PenaltyCoalition ) - PlayerPenalty = PlayerPenalty + PlayerData.Penalty - end - if ScoreMessageCoalitionChangePenalties ~= "" then - ScoreMessage = ScoreMessage .. "\n Coalition: " .. ScoreMessageCoalitionChangePenalties .. " " - end - - local ScoreMessageMission = "" - local ScoreMission = 0 - local ScoreTask = 0 - for MissionName, MissionData in pairs( PlayerData.Mission ) do - ScoreMission = ScoreMission + MissionData.ScoreMission - ScoreTask = ScoreTask + MissionData.ScoreTask - ScoreMessageMission = ScoreMessageMission .. "'" .. MissionName .. "'; " - end - PlayerScore = PlayerScore + ScoreMission + ScoreTask - - if ScoreMessageMission ~= "" then - ScoreMessage = ScoreMessage .. "\n Tasks: " .. ScoreTask .. " Mission: " .. ScoreMission .. " ( " .. ScoreMessageMission .. ") " - end - - PlayerMessage = PlayerMessage .. string.format( "Player '%s' Score = %d ( %d Score, -%d Penalties ):%s", PlayerName, PlayerScore - PlayerPenalty, PlayerScore, PlayerPenalty, ScoreMessage ) - end - end - MESSAGE:New( PlayerMessage, "Player Scores", 30, "AllPlayerScores"):ToAll() - -end - - -function SCORING:SecondsToClock(sSeconds) - local nSeconds = sSeconds - if nSeconds == 0 then - --return nil; - return "00:00:00"; - else - nHours = string.format("%02.f", math.floor(nSeconds/3600)); - nMins = string.format("%02.f", math.floor(nSeconds/60 - (nHours*60))); - nSecs = string.format("%02.f", math.floor(nSeconds - nHours*3600 - nMins *60)); - return nHours..":"..nMins..":"..nSecs - end -end - ---- Opens a score CSV file to log the scores. --- @param #SCORING self --- @param #string ScoringCSV --- @return #SCORING self --- @usage --- -- Open a new CSV file to log the scores of the game Gori Valley. Let the name of the CSV file begin with "Player Scores". --- ScoringObject = SCORING:New( "Gori Valley" ) --- ScoringObject:OpenCSV( "Player Scores" ) -function SCORING:OpenCSV( ScoringCSV ) - self:F( ScoringCSV ) - - if lfs and io and os then - if ScoringCSV then - self.ScoringCSV = ScoringCSV - local fdir = lfs.writedir() .. [[Logs\]] .. self.ScoringCSV .. " " .. os.date( "%Y-%m-%d %H-%M-%S" ) .. ".csv" - - self.CSVFile, self.err = io.open( fdir, "w+" ) - if not self.CSVFile then - error( "Error: Cannot open CSV file in " .. lfs.writedir() ) - end - - self.CSVFile:write( '"GameName","RunTime","Time","PlayerName","ScoreType","PlayerUnitCoaltion","PlayerUnitCategory","PlayerUnitType","PlayerUnitName","TargetUnitCoalition","TargetUnitCategory","TargetUnitType","TargetUnitName","Times","Score"\n' ) - - self.RunTime = os.date("%y-%m-%d_%H-%M-%S") - else - error( "A string containing the CSV file name must be given." ) - end - else - self:E( "The MissionScripting.lua file has not been changed to allow lfs, io and os modules to be used..." ) - end - return self -end - - ---- Registers a score for a player. --- @param #SCORING self --- @param #string PlayerName The name of the player. --- @param #string ScoreType The type of the score. --- @param #string ScoreTimes The amount of scores achieved. --- @param #string ScoreAmount The score given. --- @param #string PlayerUnitName The unit name of the player. --- @param #string PlayerUnitCoalition The coalition of the player unit. --- @param #string PlayerUnitCategory The category of the player unit. --- @param #string PlayerUnitType The type of the player unit. --- @param #string TargetUnitName The name of the target unit. --- @param #string TargetUnitCoalition The coalition of the target unit. --- @param #string TargetUnitCategory The category of the target unit. --- @param #string TargetUnitType The type of the target unit. --- @return #SCORING self -function SCORING:ScoreCSV( PlayerName, ScoreType, ScoreTimes, ScoreAmount, PlayerUnitName, PlayerUnitCoalition, PlayerUnitCategory, PlayerUnitType, TargetUnitName, TargetUnitCoalition, TargetUnitCategory, TargetUnitType ) - --write statistic information to file - local ScoreTime = self:SecondsToClock( timer.getTime() ) - PlayerName = PlayerName:gsub( '"', '_' ) - - if PlayerUnitName and PlayerUnitName ~= '' then - local PlayerUnit = Unit.getByName( PlayerUnitName ) - - if PlayerUnit then - if not PlayerUnitCategory then - --PlayerUnitCategory = SCORINGCategory[PlayerUnit:getCategory()] - PlayerUnitCategory = _SCORINGCategory[PlayerUnit:getDesc().category] - end - - if not PlayerUnitCoalition then - PlayerUnitCoalition = _SCORINGCoalition[PlayerUnit:getCoalition()] - end - - if not PlayerUnitType then - PlayerUnitType = PlayerUnit:getTypeName() - end - else - PlayerUnitName = '' - PlayerUnitCategory = '' - PlayerUnitCoalition = '' - PlayerUnitType = '' - end - else - PlayerUnitName = '' - PlayerUnitCategory = '' - PlayerUnitCoalition = '' - PlayerUnitType = '' - end - - if not TargetUnitCoalition then - TargetUnitCoalition = '' - end - - if not TargetUnitCategory then - TargetUnitCategory = '' - end - - if not TargetUnitType then - TargetUnitType = '' - end - - if not TargetUnitName then - TargetUnitName = '' - end - - if lfs and io and os then - self.CSVFile:write( - '"' .. self.GameName .. '"' .. ',' .. - '"' .. self.RunTime .. '"' .. ',' .. - '' .. ScoreTime .. '' .. ',' .. - '"' .. PlayerName .. '"' .. ',' .. - '"' .. ScoreType .. '"' .. ',' .. - '"' .. PlayerUnitCoalition .. '"' .. ',' .. - '"' .. PlayerUnitCategory .. '"' .. ',' .. - '"' .. PlayerUnitType .. '"' .. ',' .. - '"' .. PlayerUnitName .. '"' .. ',' .. - '"' .. TargetUnitCoalition .. '"' .. ',' .. - '"' .. TargetUnitCategory .. '"' .. ',' .. - '"' .. TargetUnitType .. '"' .. ',' .. - '"' .. TargetUnitName .. '"' .. ',' .. - '' .. ScoreTimes .. '' .. ',' .. - '' .. ScoreAmount - ) - - self.CSVFile:write( "\n" ) - end -end - - -function SCORING:CloseCSV() - if lfs and io and os then - self.CSVFile:close() - end -end - ---- CARGO Classes --- @module CARGO - -Include.File( "Routines" ) -Include.File( "Base" ) -Include.File( "Message" ) -Include.File( "Scheduler" ) - - ---- Clients are those Groups defined within the Mission Editor that have the skillset defined as "Client" or "Player". --- These clients are defined within the Mission Orchestration Framework (MOF) - -CARGOS = {} - - -CARGO_ZONE = { - ClassName="CARGO_ZONE", - CargoZoneName = '', - CargoHostUnitName = '', - SIGNAL = { - TYPE = { - SMOKE = { ID = 1, TEXT = "smoke" }, - FLARE = { ID = 2, TEXT = "flare" } - }, - COLOR = { - GREEN = { ID = 1, TRIGGERCOLOR = trigger.smokeColor.Green, TEXT = "A green" }, - RED = { ID = 2, TRIGGERCOLOR = trigger.smokeColor.Red, TEXT = "A red" }, - WHITE = { ID = 3, TRIGGERCOLOR = trigger.smokeColor.White, TEXT = "A white" }, - ORANGE = { ID = 4, TRIGGERCOLOR = trigger.smokeColor.Orange, TEXT = "An orange" }, - BLUE = { ID = 5, TRIGGERCOLOR = trigger.smokeColor.Blue, TEXT = "A blue" }, - YELLOW = { ID = 6, TRIGGERCOLOR = trigger.flareColor.Yellow, TEXT = "A yellow" } - } - } -} - ---- Creates a new zone where cargo can be collected or deployed. --- The zone functionality is useful to smoke or indicate routes for cargo pickups or deployments. --- Provide the zone name as declared in the mission file into the CargoZoneName in the :New method. --- An optional parameter is the CargoHostName, which is a Group declared with Late Activation switched on in the mission file. --- The CargoHostName is the "host" of the cargo zone: --- --- * It will smoke the zone position when a client is approaching the zone. --- * Depending on the cargo type, it will assist in the delivery of the cargo by driving to and from the client. --- --- @param #CARGO_ZONE self --- @param #string CargoZoneName The name of the zone as declared within the mission editor. --- @param #string CargoHostName The name of the Group "hosting" the zone. The Group MUST NOT be a static, and must be a "mobile" unit. -function CARGO_ZONE:New( CargoZoneName, CargoHostName ) local self = BASE:Inherit( self, ZONE:New( CargoZoneName ) ) - self:F( { CargoZoneName, CargoHostName } ) - - self.CargoZoneName = CargoZoneName - self.SignalHeight = 2 - --self.CargoZone = trigger.misc.getZone( CargoZoneName ) - - - if CargoHostName then - self.CargoHostName = CargoHostName - end - - self:T( self.CargoZoneName ) - - return self -end - -function CARGO_ZONE:Spawn() - self:F( self.CargoHostName ) - - if self.CargoHostName then -- Only spawn a host in the zone when there is one given as a parameter in the New function. - if self.CargoHostSpawn then - local CargoHostGroup = self.CargoHostSpawn:GetGroupFromIndex() - if CargoHostGroup and CargoHostGroup:IsAlive() then - else - self.CargoHostSpawn:ReSpawn( 1 ) - end - else - self:T( "Initialize CargoHostSpawn" ) - self.CargoHostSpawn = SPAWN:New( self.CargoHostName ):Limit( 1, 1 ) - self.CargoHostSpawn:ReSpawn( 1 ) - end - end - - return self -end - -function CARGO_ZONE:GetHostUnit() - self:F( self ) - - if self.CargoHostName then - - -- A Host has been given, signal the host - local CargoHostGroup = self.CargoHostSpawn:GetGroupFromIndex() - local CargoHostUnit - if CargoHostGroup and CargoHostGroup:IsAlive() then - CargoHostUnit = CargoHostGroup:GetUnit(1) - else - CargoHostUnit = StaticObject.getByName( self.CargoHostName ) - end - - return CargoHostUnit - end - - return nil -end - -function CARGO_ZONE:ReportCargosToClient( Client, CargoType ) - self:F() - - local SignalUnit = self:GetHostUnit() - - if SignalUnit then - - local SignalUnitTypeName = SignalUnit:getTypeName() - - local HostMessage = "" - - local IsCargo = false - for CargoID, Cargo in pairs( CARGOS ) do - if Cargo.CargoType == Task.CargoType then - if Cargo:IsStatusNone() then - HostMessage = HostMessage .. " - " .. Cargo.CargoName .. " - " .. Cargo.CargoType .. " (" .. Cargo.Weight .. "kg)" .. "\n" - IsCargo = true - end - end - end - - if not IsCargo then - HostMessage = "No Cargo Available." - end - - Client:Message( HostMessage, 20, Mission.Name .. "/StageHosts." .. SignalUnitTypeName, SignalUnitTypeName .. ": Reporting Cargo", 10 ) - end -end - - -function CARGO_ZONE:Signal() - self:F() - - local Signalled = false - - if self.SignalType then - - if self.CargoHostName then - - -- A Host has been given, signal the host - - local SignalUnit = self:GetHostUnit() - - if SignalUnit then - - self:T( 'Signalling Unit' ) - local SignalVehiclePos = SignalUnit:GetPointVec3() - SignalVehiclePos.y = SignalVehiclePos.y + 2 - - if self.SignalType.ID == CARGO_ZONE.SIGNAL.TYPE.SMOKE.ID then - - trigger.action.smoke( SignalVehiclePos, self.SignalColor.TRIGGERCOLOR ) - Signalled = true - - elseif self.SignalType.ID == CARGO_ZONE.SIGNAL.TYPE.FLARE.ID then - - trigger.action.signalFlare( SignalVehiclePos, self.SignalColor.TRIGGERCOLOR , 0 ) - Signalled = false - - end - end - - else - - local ZonePointVec3 = self:GetPointVec3( self.SignalHeight ) -- Get the zone position + the landheight + 2 meters - - if self.SignalType.ID == CARGO_ZONE.SIGNAL.TYPE.SMOKE.ID then - - trigger.action.smoke( ZonePointVec3, self.SignalColor.TRIGGERCOLOR ) - Signalled = true - - elseif self.SignalType.ID == CARGO_ZONE.SIGNAL.TYPE.FLARE.ID then - trigger.action.signalFlare( ZonePointVec3, self.SignalColor.TRIGGERCOLOR, 0 ) - Signalled = false - - end - end - end - - return Signalled - -end - -function CARGO_ZONE:WhiteSmoke( SignalHeight ) - self:F() - - self.SignalType = CARGO_ZONE.SIGNAL.TYPE.SMOKE - self.SignalColor = CARGO_ZONE.SIGNAL.COLOR.WHITE - - if SignalHeight then - self.SignalHeight = SignalHeight - end - - return self -end - -function CARGO_ZONE:BlueSmoke( SignalHeight ) - self:F() - - self.SignalType = CARGO_ZONE.SIGNAL.TYPE.SMOKE - self.SignalColor = CARGO_ZONE.SIGNAL.COLOR.BLUE - - if SignalHeight then - self.SignalHeight = SignalHeight - end - - return self -end - -function CARGO_ZONE:RedSmoke( SignalHeight ) - self:F() - - self.SignalType = CARGO_ZONE.SIGNAL.TYPE.SMOKE - self.SignalColor = CARGO_ZONE.SIGNAL.COLOR.RED - - if SignalHeight then - self.SignalHeight = SignalHeight - end - - return self -end - -function CARGO_ZONE:OrangeSmoke( SignalHeight ) - self:F() - - self.SignalType = CARGO_ZONE.SIGNAL.TYPE.SMOKE - self.SignalColor = CARGO_ZONE.SIGNAL.COLOR.ORANGE - - if SignalHeight then - self.SignalHeight = SignalHeight - end - - return self -end - -function CARGO_ZONE:GreenSmoke( SignalHeight ) - self:F() - - self.SignalType = CARGO_ZONE.SIGNAL.TYPE.SMOKE - self.SignalColor = CARGO_ZONE.SIGNAL.COLOR.GREEN - - if SignalHeight then - self.SignalHeight = SignalHeight - end - - return self -end - - -function CARGO_ZONE:WhiteFlare( SignalHeight ) - self:F() - - self.SignalType = CARGO_ZONE.SIGNAL.TYPE.FLARE - self.SignalColor = CARGO_ZONE.SIGNAL.COLOR.WHITE - - if SignalHeight then - self.SignalHeight = SignalHeight - end - - return self -end - -function CARGO_ZONE:RedFlare( SignalHeight ) - self:F() - - self.SignalType = CARGO_ZONE.SIGNAL.TYPE.FLARE - self.SignalColor = CARGO_ZONE.SIGNAL.COLOR.RED - - if SignalHeight then - self.SignalHeight = SignalHeight - end - - return self -end - -function CARGO_ZONE:GreenFlare( SignalHeight ) - self:F() - - self.SignalType = CARGO_ZONE.SIGNAL.TYPE.FLARE - self.SignalColor = CARGO_ZONE.SIGNAL.COLOR.GREEN - - if SignalHeight then - self.SignalHeight = SignalHeight - end - - return self -end - -function CARGO_ZONE:YellowFlare( SignalHeight ) - self:F() - - self.SignalType = CARGO_ZONE.SIGNAL.TYPE.FLARE - self.SignalColor = CARGO_ZONE.SIGNAL.COLOR.YELLOW - - if SignalHeight then - self.SignalHeight = SignalHeight - end - - return self -end - - -function CARGO_ZONE:GetCargoHostUnit() - self:F( self ) - - if self.CargoHostSpawn then - local CargoHostGroup = self.CargoHostSpawn:GetGroupFromIndex(1) - if CargoHostGroup and CargoHostGroup:IsAlive() then - local CargoHostUnit = CargoHostGroup:GetUnit(1) - if CargoHostUnit and CargoHostUnit:IsAlive() then - return CargoHostUnit - end - end - end - - return nil -end - -function CARGO_ZONE:GetCargoZoneName() - self:F() - - return self.CargoZoneName -end - -CARGO = { - ClassName = "CARGO", - STATUS = { - NONE = 0, - LOADED = 1, - UNLOADED = 2, - LOADING = 3 - }, - CargoClient = nil -} - ---- Add Cargo to the mission... Cargo functionality needs to be reworked a bit, so this is still under construction. I need to make a CARGO Class... -function CARGO:New( CargoType, CargoName, CargoWeight ) local self = BASE:Inherit( self, BASE:New() ) - self:F( { CargoType, CargoName, CargoWeight } ) - - - self.CargoType = CargoType - self.CargoName = CargoName - self.CargoWeight = CargoWeight - - self:StatusNone() - - return self -end - -function CARGO:Spawn( Client ) - self:F() - - return self - -end - -function CARGO:IsNear( Client, LandingZone ) - self:F() - - local Near = true - - return Near - -end - - -function CARGO:IsLoadingToClient() - self:F() - - if self:IsStatusLoading() then - return self.CargoClient - end - - return nil - -end - - -function CARGO:IsLoadedInClient() - self:F() - - if self:IsStatusLoaded() then - return self.CargoClient - end - - return nil - -end - - -function CARGO:UnLoad( Client, TargetZoneName ) - self:F() - - self:StatusUnLoaded() - - return self -end - -function CARGO:OnBoard( Client, LandingZone ) - self:F() - - local Valid = true - - self.CargoClient = Client - local ClientUnit = Client:GetClientGroupDCSUnit() - - return Valid -end - -function CARGO:OnBoarded( Client, LandingZone ) - self:F() - - local OnBoarded = true - - return OnBoarded -end - -function CARGO:Load( Client ) - self:F() - - self:StatusLoaded( Client ) - - return self -end - -function CARGO:IsLandingRequired() - self:F() - return true -end - -function CARGO:IsSlingLoad() - self:F() - return false -end - - -function CARGO:StatusNone() - self:F() - - self.CargoClient = nil - self.CargoStatus = CARGO.STATUS.NONE - - return self -end - -function CARGO:StatusLoading( Client ) - self:F() - - self.CargoClient = Client - self.CargoStatus = CARGO.STATUS.LOADING - self:T( "Cargo " .. self.CargoName .. " loading to Client: " .. self.CargoClient:GetClientGroupName() ) - - return self -end - -function CARGO:StatusLoaded( Client ) - self:F() - - self.CargoClient = Client - self.CargoStatus = CARGO.STATUS.LOADED - self:T( "Cargo " .. self.CargoName .. " loaded in Client: " .. self.CargoClient:GetClientGroupName() ) - - return self -end - -function CARGO:StatusUnLoaded() - self:F() - - self.CargoClient = nil - self.CargoStatus = CARGO.STATUS.UNLOADED - - return self -end - - -function CARGO:IsStatusNone() - self:F() - - return self.CargoStatus == CARGO.STATUS.NONE -end - -function CARGO:IsStatusLoading() - self:F() - - return self.CargoStatus == CARGO.STATUS.LOADING -end - -function CARGO:IsStatusLoaded() - self:F() - - return self.CargoStatus == CARGO.STATUS.LOADED -end - -function CARGO:IsStatusUnLoaded() - self:F() - - return self.CargoStatus == CARGO.STATUS.UNLOADED -end - - -CARGO_GROUP = { - ClassName = "CARGO_GROUP" -} - - -function CARGO_GROUP:New( CargoType, CargoName, CargoWeight, CargoGroupTemplate, CargoZone ) local self = BASE:Inherit( self, CARGO:New( CargoType, CargoName, CargoWeight ) ) - self:F( { CargoType, CargoName, CargoWeight, CargoGroupTemplate, CargoZone } ) - - self.CargoSpawn = SPAWN:NewWithAlias( CargoGroupTemplate, CargoName ) - self.CargoZone = CargoZone - - CARGOS[self.CargoName] = self - - return self - -end - -function CARGO_GROUP:Spawn( Client ) - self:F( { Client } ) - - local SpawnCargo = true - - if self:IsStatusNone() then - local CargoGroup = Group.getByName( self.CargoName ) - if CargoGroup and CargoGroup:isExist() then - SpawnCargo = false - end - - elseif self:IsStatusLoading() then - - local Client = self:IsLoadingToClient() - if Client and Client:GetDCSGroup() then - SpawnCargo = false - else - local CargoGroup = Group.getByName( self.CargoName ) - if CargoGroup and CargoGroup:isExist() then - SpawnCargo = false - end - end - - elseif self:IsStatusLoaded() then - - local ClientLoaded = self:IsLoadedInClient() - -- Now test if another Client is alive (not this one), and it has the CARGO, then this cargo does not need to be initialized and spawned. - if ClientLoaded and ClientLoaded ~= Client then - local ClientGroup = Client:GetDCSGroup() - if ClientLoaded:GetClientGroupDCSUnit() and ClientLoaded:GetClientGroupDCSUnit():isExist() then - SpawnCargo = false - else - self:StatusNone() - end - else - -- Same Client, but now in initialize, so set back the status to None. - self:StatusNone() - end - - elseif self:IsStatusUnLoaded() then - - SpawnCargo = false - - end - - if SpawnCargo then - if self.CargoZone:GetCargoHostUnit() then - --- ReSpawn the Cargo from the CargoHost - self.CargoGroupName = self.CargoSpawn:SpawnFromUnit( self.CargoZone:GetCargoHostUnit(), 60, 30, 1 ):GetName() - else - --- ReSpawn the Cargo in the CargoZone without a host ... - self:T( self.CargoZone ) - self.CargoGroupName = self.CargoSpawn:SpawnInZone( self.CargoZone, true, 1 ):GetName() - end - self:StatusNone() - end - - self:T( { self.CargoGroupName, CARGOS[self.CargoName].CargoGroupName } ) - - return self -end - -function CARGO_GROUP:IsNear( Client, LandingZone ) - self:F() - - local Near = false - - if self.CargoGroupName then - local CargoGroup = Group.getByName( self.CargoGroupName ) - if routines.IsPartOfGroupInRadius( CargoGroup, Client:GetPositionVec3(), 250 ) then - Near = true - end - end - - return Near - -end - - -function CARGO_GROUP:OnBoard( Client, LandingZone, OnBoardSide ) - self:F() - - local Valid = true - - local ClientUnit = Client:GetClientGroupDCSUnit() - - local CarrierPos = ClientUnit:getPoint() - local CarrierPosMove = ClientUnit:getPoint() - local CarrierPosOnBoard = ClientUnit:getPoint() - - local CargoGroup = Group.getByName( self.CargoGroupName ) - - local CargoUnit = CargoGroup:getUnit(1) - local CargoPos = CargoUnit:getPoint() - - self.CargoInAir = CargoUnit:inAir() - - self:T( self.CargoInAir ) - - -- Only move the group to the carrier when the cargo is not in the air - -- (eg. cargo can be on a oil derrick, moving the cargo on the oil derrick will drop the cargo on the sea). - if not self.CargoInAir then - - local Points = {} - - self:T( 'CargoPos x = ' .. CargoPos.x .. " z = " .. CargoPos.z ) - self:T( 'CarrierPosMove x = ' .. CarrierPosMove.x .. " z = " .. CarrierPosMove.z ) - - Points[#Points+1] = routines.ground.buildWP( CargoPos, "Cone", 10 ) - - self:T( 'Points[1] x = ' .. Points[1].x .. " y = " .. Points[1].y ) - - if OnBoardSide == nil then - OnBoardSide = CLIENT.ONBOARDSIDE.NONE - end - - if OnBoardSide == CLIENT.ONBOARDSIDE.LEFT then - - self:T( "TransportCargoOnBoard: Onboarding LEFT" ) - CarrierPosMove.z = CarrierPosMove.z - 25 - CarrierPosOnBoard.z = CarrierPosOnBoard.z - 5 - Points[#Points+1] = routines.ground.buildWP( CarrierPosMove, "Cone", 10 ) - Points[#Points+1] = routines.ground.buildWP( CarrierPosOnBoard, "Cone", 10 ) - - elseif OnBoardSide == CLIENT.ONBOARDSIDE.RIGHT then - - self:T( "TransportCargoOnBoard: Onboarding RIGHT" ) - CarrierPosMove.z = CarrierPosMove.z + 25 - CarrierPosOnBoard.z = CarrierPosOnBoard.z + 5 - Points[#Points+1] = routines.ground.buildWP( CarrierPosMove, "Cone", 10 ) - Points[#Points+1] = routines.ground.buildWP( CarrierPosOnBoard, "Cone", 10 ) - - elseif OnBoardSide == CLIENT.ONBOARDSIDE.BACK then - - self:T( "TransportCargoOnBoard: Onboarding BACK" ) - CarrierPosMove.x = CarrierPosMove.x - 25 - CarrierPosOnBoard.x = CarrierPosOnBoard.x - 5 - Points[#Points+1] = routines.ground.buildWP( CarrierPosMove, "Cone", 10 ) - Points[#Points+1] = routines.ground.buildWP( CarrierPosOnBoard, "Cone", 10 ) - - elseif OnBoardSide == CLIENT.ONBOARDSIDE.FRONT then - - self:T( "TransportCargoOnBoard: Onboarding FRONT" ) - CarrierPosMove.x = CarrierPosMove.x + 25 - CarrierPosOnBoard.x = CarrierPosOnBoard.x + 5 - Points[#Points+1] = routines.ground.buildWP( CarrierPosMove, "Cone", 10 ) - Points[#Points+1] = routines.ground.buildWP( CarrierPosOnBoard, "Cone", 10 ) - - elseif OnBoardSide == CLIENT.ONBOARDSIDE.NONE then - - self:T( "TransportCargoOnBoard: Onboarding CENTRAL" ) - Points[#Points+1] = routines.ground.buildWP( CarrierPos, "Cone", 10 ) - - end - self:T( "TransportCargoOnBoard: Routing " .. self.CargoGroupName ) - - --routines.scheduleFunction( routines.goRoute, { self.CargoGroupName, Points}, timer.getTime() + 4 ) - SCHEDULER:New( self, routines.goRoute, { self.CargoGroupName, Points}, 4 ) - end - - self:StatusLoading( Client ) - - return Valid - -end - - -function CARGO_GROUP:OnBoarded( Client, LandingZone ) - self:F() - - local OnBoarded = false - - local CargoGroup = Group.getByName( self.CargoGroupName ) - - if not self.CargoInAir then - if routines.IsPartOfGroupInRadius( CargoGroup, Client:GetPositionVec3(), 25 ) then - CargoGroup:destroy() - self:StatusLoaded( Client ) - OnBoarded = true - end - else - CargoGroup:destroy() - self:StatusLoaded( Client ) - OnBoarded = true - end - - return OnBoarded -end - - -function CARGO_GROUP:UnLoad( Client, TargetZoneName ) - self:F() - - self:T( 'self.CargoName = ' .. self.CargoName ) - - local CargoGroup = self.CargoSpawn:SpawnFromUnit( Client:GetClientGroupUnit(), 60, 30 ) - - self.CargoGroupName = CargoGroup:GetName() - self:T( 'self.CargoGroupName = ' .. self.CargoGroupName ) - - CargoGroup:TaskRouteToZone( ZONE:New( TargetZoneName ), true ) - - self:StatusUnLoaded() - - return self -end - - -CARGO_PACKAGE = { - ClassName = "CARGO_PACKAGE" -} - - -function CARGO_PACKAGE:New( CargoType, CargoName, CargoWeight, CargoClient ) local self = BASE:Inherit( self, CARGO:New( CargoType, CargoName, CargoWeight ) ) - self:F( { CargoType, CargoName, CargoWeight, CargoClient } ) - - self.CargoClient = CargoClient - - CARGOS[self.CargoName] = self - - return self - -end - - -function CARGO_PACKAGE:Spawn( Client ) - self:F( { self, Client } ) - - -- this needs to be checked thoroughly - - local CargoClientGroup = self.CargoClient:GetDCSGroup() - if not CargoClientGroup then - if not self.CargoClientSpawn then - self.CargoClientSpawn = SPAWN:New( self.CargoClient:GetClientGroupName() ):Limit( 1, 1 ) - end - self.CargoClientSpawn:ReSpawn( 1 ) - end - - local SpawnCargo = true - - if self:IsStatusNone() then - - elseif self:IsStatusLoading() or self:IsStatusLoaded() then - - local CargoClientLoaded = self:IsLoadedInClient() - if CargoClientLoaded and CargoClientLoaded:GetDCSGroup() then - SpawnCargo = false - end - - elseif self:IsStatusUnLoaded() then - - SpawnCargo = false - - else - - end - - if SpawnCargo then - self:StatusLoaded( self.CargoClient ) - end - - return self -end - - -function CARGO_PACKAGE:IsNear( Client, LandingZone ) - self:F() - - local Near = false - - if self.CargoClient and self.CargoClient:GetDCSGroup() then - self:T( self.CargoClient.ClientName ) - self:T( 'Client Exists.' ) - - if routines.IsUnitInRadius( self.CargoClient:GetClientGroupDCSUnit(), Client:GetPositionVec3(), 150 ) then - Near = true - end - end - - return Near - -end - - -function CARGO_PACKAGE:OnBoard( Client, LandingZone, OnBoardSide ) - self:F() - - local Valid = true - - local ClientUnit = Client:GetClientGroupDCSUnit() - - local CarrierPos = ClientUnit:getPoint() - local CarrierPosMove = ClientUnit:getPoint() - local CarrierPosOnBoard = ClientUnit:getPoint() - local CarrierPosMoveAway = ClientUnit:getPoint() - - local CargoHostGroup = self.CargoClient:GetDCSGroup() - local CargoHostName = self.CargoClient:GetDCSGroup():getName() - - local CargoHostUnits = CargoHostGroup:getUnits() - local CargoPos = CargoHostUnits[1]:getPoint() - - local Points = {} - - self:T( 'CargoPos x = ' .. CargoPos.x .. " z = " .. CargoPos.z ) - self:T( 'CarrierPosMove x = ' .. CarrierPosMove.x .. " z = " .. CarrierPosMove.z ) - - Points[#Points+1] = routines.ground.buildWP( CargoPos, "Cone", 10 ) - - self:T( 'Points[1] x = ' .. Points[1].x .. " y = " .. Points[1].y ) - - if OnBoardSide == nil then - OnBoardSide = CLIENT.ONBOARDSIDE.NONE - end - - if OnBoardSide == CLIENT.ONBOARDSIDE.LEFT then - - self:T( "TransportCargoOnBoard: Onboarding LEFT" ) - CarrierPosMove.z = CarrierPosMove.z - 25 - CarrierPosOnBoard.z = CarrierPosOnBoard.z - 5 - CarrierPosMoveAway.z = CarrierPosMoveAway.z - 20 - Points[#Points+1] = routines.ground.buildWP( CarrierPosMove, "Cone", 10 ) - Points[#Points+1] = routines.ground.buildWP( CarrierPosOnBoard, "Cone", 10 ) - Points[#Points+1] = routines.ground.buildWP( CarrierPosMoveAway, "Cone", 10 ) - - elseif OnBoardSide == CLIENT.ONBOARDSIDE.RIGHT then - - self:T( "TransportCargoOnBoard: Onboarding RIGHT" ) - CarrierPosMove.z = CarrierPosMove.z + 25 - CarrierPosOnBoard.z = CarrierPosOnBoard.z + 5 - CarrierPosMoveAway.z = CarrierPosMoveAway.z + 20 - Points[#Points+1] = routines.ground.buildWP( CarrierPosMove, "Cone", 10 ) - Points[#Points+1] = routines.ground.buildWP( CarrierPosOnBoard, "Cone", 10 ) - Points[#Points+1] = routines.ground.buildWP( CarrierPosMoveAway, "Cone", 10 ) - - elseif OnBoardSide == CLIENT.ONBOARDSIDE.BACK then - - self:T( "TransportCargoOnBoard: Onboarding BACK" ) - CarrierPosMove.x = CarrierPosMove.x - 25 - CarrierPosOnBoard.x = CarrierPosOnBoard.x - 5 - CarrierPosMoveAway.x = CarrierPosMoveAway.x - 20 - Points[#Points+1] = routines.ground.buildWP( CarrierPosMove, "Cone", 10 ) - Points[#Points+1] = routines.ground.buildWP( CarrierPosOnBoard, "Cone", 10 ) - Points[#Points+1] = routines.ground.buildWP( CarrierPosMoveAway, "Cone", 10 ) - - elseif OnBoardSide == CLIENT.ONBOARDSIDE.FRONT then - - self:T( "TransportCargoOnBoard: Onboarding FRONT" ) - CarrierPosMove.x = CarrierPosMove.x + 25 - CarrierPosOnBoard.x = CarrierPosOnBoard.x + 5 - CarrierPosMoveAway.x = CarrierPosMoveAway.x + 20 - Points[#Points+1] = routines.ground.buildWP( CarrierPosMove, "Cone", 10 ) - Points[#Points+1] = routines.ground.buildWP( CarrierPosOnBoard, "Cone", 10 ) - Points[#Points+1] = routines.ground.buildWP( CarrierPosMoveAway, "Cone", 10 ) - - elseif OnBoardSide == CLIENT.ONBOARDSIDE.NONE then - - self:T( "TransportCargoOnBoard: Onboarding FRONT" ) - CarrierPosMove.x = CarrierPosMove.x + 25 - CarrierPosOnBoard.x = CarrierPosOnBoard.x + 5 - CarrierPosMoveAway.x = CarrierPosMoveAway.x + 20 - Points[#Points+1] = routines.ground.buildWP( CarrierPosMove, "Cone", 10 ) - Points[#Points+1] = routines.ground.buildWP( CarrierPosOnBoard, "Cone", 10 ) - Points[#Points+1] = routines.ground.buildWP( CarrierPosMoveAway, "Cone", 10 ) - - end - self:T( "Routing " .. CargoHostName ) - - --routines.scheduleFunction( routines.goRoute, { CargoHostName, Points}, timer.getTime() + 4 ) - SCHEDULER:New( self, routines.goRoute, { CargoHostName, Points }, 4 ) - - return Valid - -end - - -function CARGO_PACKAGE:OnBoarded( Client, LandingZone ) - self:F() - - local OnBoarded = false - - if self.CargoClient and self.CargoClient:GetDCSGroup() then - if routines.IsUnitInRadius( self.CargoClient:GetClientGroupDCSUnit(), self.CargoClient:GetPositionVec3(), 10 ) then - - -- Switch Cargo from self.CargoClient to Client ... Each cargo can have only one client. So assigning the new client for the cargo is enough. - self:StatusLoaded( Client ) - - -- All done, onboarded the Cargo to the new Client. - OnBoarded = true - end - end - - return OnBoarded -end - - -function CARGO_PACKAGE:UnLoad( Client, TargetZoneName ) - self:F() - - self:T( 'self.CargoName = ' .. self.CargoName ) - --self:T( 'self.CargoHostName = ' .. self.CargoHostName ) - - --self.CargoSpawn:FromCarrier( Client:GetDCSGroup(), TargetZoneName, self.CargoHostName ) - self:StatusUnLoaded() - - return Cargo -end - - -CARGO_SLINGLOAD = { - ClassName = "CARGO_SLINGLOAD" -} - - -function CARGO_SLINGLOAD:New( CargoType, CargoName, CargoWeight, CargoZone, CargoHostName, CargoCountryID ) - local self = BASE:Inherit( self, CARGO:New( CargoType, CargoName, CargoWeight ) ) - self:F( { CargoType, CargoName, CargoWeight, CargoZone, CargoHostName, CargoCountryID } ) - - self.CargoHostName = CargoHostName - - -- Cargo will be initialized around the CargoZone position. - self.CargoZone = CargoZone - - self.CargoCount = 0 - self.CargoStaticName = string.format( "%s#%03d", self.CargoName, self.CargoCount ) - - -- The country ID needs to be correctly set. - self.CargoCountryID = CargoCountryID - - CARGOS[self.CargoName] = self - - return self - -end - - -function CARGO_SLINGLOAD:IsLandingRequired() - self:F() - return false -end - - -function CARGO_SLINGLOAD:IsSlingLoad() - self:F() - return true -end - - -function CARGO_SLINGLOAD:Spawn( Client ) - self:F( { self, Client } ) - - local Zone = trigger.misc.getZone( self.CargoZone ) - - local ZonePos = {} - ZonePos.x = Zone.point.x + math.random( Zone.radius / 2 * -1, Zone.radius / 2 ) - ZonePos.y = Zone.point.z + math.random( Zone.radius / 2 * -1, Zone.radius / 2 ) - - self:T( "Cargo Location = " .. ZonePos.x .. ", " .. ZonePos.y ) - - --[[ - -- This does not work in 1.5.2. - CargoStatic = StaticObject.getByName( self.CargoName ) - if CargoStatic then - CargoStatic:destroy() - end - --]] - - CargoStatic = StaticObject.getByName( self.CargoStaticName ) - - if CargoStatic and CargoStatic:isExist() then - CargoStatic:destroy() - end - - -- I need to make every time a new cargo due to bugs in 1.5.2. - - self.CargoCount = self.CargoCount + 1 - self.CargoStaticName = string.format( "%s#%03d", self.CargoName, self.CargoCount ) - - local CargoTemplate = { - ["category"] = "Cargo", - ["shape_name"] = "ab-212_cargo", - ["type"] = "Cargo1", - ["x"] = ZonePos.x, - ["y"] = ZonePos.y, - ["mass"] = self.CargoWeight, - ["name"] = self.CargoStaticName, - ["canCargo"] = true, - ["heading"] = 0, - } - - coalition.addStaticObject( self.CargoCountryID, CargoTemplate ) - --- end - - return self -end - - -function CARGO_SLINGLOAD:IsNear( Client, LandingZone ) - self:F() - - local Near = false - - return Near -end - - -function CARGO_SLINGLOAD:IsInLandingZone( Client, LandingZone ) - self:F() - - local Near = false - - local CargoStaticUnit = StaticObject.getByName( self.CargoName ) - if CargoStaticUnit then - if routines.IsStaticInZones( CargoStaticUnit, LandingZone ) then - Near = true - end - end - - return Near -end - - -function CARGO_SLINGLOAD:OnBoard( Client, LandingZone, OnBoardSide ) - self:F() - - local Valid = true - - - return Valid -end - - -function CARGO_SLINGLOAD:OnBoarded( Client, LandingZone ) - self:F() - - local OnBoarded = false - - local CargoStaticUnit = StaticObject.getByName( self.CargoName ) - if CargoStaticUnit then - if not routines.IsStaticInZones( CargoStaticUnit, LandingZone ) then - OnBoarded = true - end - end - - return OnBoarded -end - - -function CARGO_SLINGLOAD:UnLoad( Client, TargetZoneName ) - self:F() - - self:T( 'self.CargoName = ' .. self.CargoName ) - self:T( 'self.CargoGroupName = ' .. self.CargoGroupName ) - - self:StatusUnLoaded() - - return Cargo -end ---- Message System to display Messages for Clients and Coalitions or All. --- Messages are grouped on the display panel per Category to improve readability for the players. --- Messages are shown on the display panel for an amount of seconds, and will then disappear. --- Messages are identified by an ID. The messages with the same ID belonging to the same category will be overwritten if they were still being displayed on the display panel. --- Messages are created with MESSAGE:@{New}(). --- Messages are sent to Clients with MESSAGE:@{ToClient}(). --- Messages are sent to Coalitions with MESSAGE:@{ToCoalition}(). --- Messages are sent to All Players with MESSAGE:@{ToAll}(). --- @module Message - -Include.File( "Base" ) - ---- The MESSAGE class --- @type MESSAGE -MESSAGE = { - ClassName = "MESSAGE", - MessageCategory = 0, - MessageID = 0, -} - - ---- Creates a new MESSAGE object. Note that these MESSAGE objects are not yet displayed on the display panel. You must use the functions @{ToClient} or @{ToCoalition} or @{ToAll} to send these Messages to the respective recipients. --- @param self --- @param #string MessageText is the text of the Message. --- @param #string MessageCategory is a string expressing the Category of the Message. Messages are grouped on the display panel per Category to improve readability. --- @param #number MessageDuration is a number in seconds of how long the MESSAGE should be shown on the display panel. --- @param #string MessageID is a string expressing the ID of the Message. --- @return #MESSAGE --- @usage --- -- Create a series of new Messages. --- -- MessageAll is meant to be sent to all players, for 25 seconds, and is classified as "Score". --- -- MessageRED is meant to be sent to the RED players only, for 10 seconds, and is classified as "End of Mission", with ID "Win". --- -- MessageClient1 is meant to be sent to a Client, for 25 seconds, and is classified as "Score", with ID "Score". --- -- MessageClient1 is meant to be sent to a Client, for 25 seconds, and is classified as "Score", with ID "Score". --- MessageAll = MESSAGE:New( "To all Players: BLUE has won! Each player of BLUE wins 50 points!", "End of Mission", 25, "Win" ) --- MessageRED = MESSAGE:New( "To the RED Players: You receive a penalty because you've killed one of your own units", "Penalty", 25, "Score" ) --- MessageClient1 = MESSAGE:New( "Congratulations, you've just hit a target", "Score", 25, "Score" ) --- MessageClient2 = MESSAGE:New( "Congratulations, you've just killed a target", "Score", 25, "Score" ) -function MESSAGE:New( MessageText, MessageCategory, MessageDuration, MessageID ) - local self = BASE:Inherit( self, BASE:New() ) - self:F( { MessageText, MessageCategory, MessageDuration, MessageID } ) - - -- When no messagecategory is given, we don't show it as a title... - if MessageCategory and MessageCategory ~= "" then - self.MessageCategory = MessageCategory .. ": " - else - self.MessageCategory = "" - end - - self.MessageDuration = MessageDuration - self.MessageID = MessageID - self.MessageTime = timer.getTime() - self.MessageText = MessageText - - self.MessageSent = false - self.MessageGroup = false - self.MessageCoalition = false - - return self -end - ---- Sends a MESSAGE to a Client Group. Note that the Group needs to be defined within the ME with the skillset "Client" or "Player". --- @param #MESSAGE self --- @param Client#CLIENT Client is the Group of the Client. --- @return #MESSAGE --- @usage --- -- Send the 2 messages created with the @{New} method to the Client Group. --- -- Note that the Message of MessageClient2 is overwriting the Message of MessageClient1. --- ClientGroup = Group.getByName( "ClientGroup" ) --- --- MessageClient1 = MESSAGE:New( "Congratulations, you've just hit a target", "Score", 25, "Score" ):ToClient( ClientGroup ) --- MessageClient2 = MESSAGE:New( "Congratulations, you've just killed a target", "Score", 25, "Score" ):ToClient( ClientGroup ) --- or --- MESSAGE:New( "Congratulations, you've just hit a target", "Score", 25, "Score" ):ToClient( ClientGroup ) --- MESSAGE:New( "Congratulations, you've just killed a target", "Score", 25, "Score" ):ToClient( ClientGroup ) --- or --- MessageClient1 = MESSAGE:New( "Congratulations, you've just hit a target", "Score", 25, "Score" ) --- MessageClient2 = MESSAGE:New( "Congratulations, you've just killed a target", "Score", 25, "Score" ) --- MessageClient1:ToClient( ClientGroup ) --- MessageClient2:ToClient( ClientGroup ) -function MESSAGE:ToClient( Client ) - self:F( Client ) - - if Client and Client:GetClientGroupID() then - - local ClientGroupID = Client:GetClientGroupID() - self:T( self.MessageCategory .. self.MessageText:gsub("\n$",""):gsub("\n$","") .. " / " .. self.MessageDuration ) - trigger.action.outTextForGroup( ClientGroupID, self.MessageCategory .. self.MessageText:gsub("\n$",""):gsub("\n$",""), self.MessageDuration ) - end - - return self -end - ---- Sends a MESSAGE to the Blue coalition. --- @param #MESSAGE self --- @return #MESSAGE --- @usage --- -- Send a message created with the @{New} method to the BLUE coalition. --- MessageBLUE = MESSAGE:New( "To the BLUE Players: You receive a penalty because you've killed one of your own units", "Penalty", 25, "Score" ):ToBlue() --- or --- MESSAGE:New( "To the BLUE Players: You receive a penalty because you've killed one of your own units", "Penalty", 25, "Score" ):ToBlue() --- or --- MessageBLUE = MESSAGE:New( "To the BLUE Players: You receive a penalty because you've killed one of your own units", "Penalty", 25, "Score" ) --- MessageBLUE:ToBlue() -function MESSAGE:ToBlue() - self:F() - - self:ToCoalition( coalition.side.BLUE ) - - return self -end - ---- Sends a MESSAGE to the Red Coalition. --- @param #MESSAGE self --- @return #MESSAGE --- @usage --- -- Send a message created with the @{New} method to the RED coalition. --- MessageRED = MESSAGE:New( "To the RED Players: You receive a penalty because you've killed one of your own units", "Penalty", 25, "Score" ):ToRed() --- or --- MESSAGE:New( "To the RED Players: You receive a penalty because you've killed one of your own units", "Penalty", 25, "Score" ):ToRed() --- or --- MessageRED = MESSAGE:New( "To the RED Players: You receive a penalty because you've killed one of your own units", "Penalty", 25, "Score" ) --- MessageRED:ToRed() -function MESSAGE:ToRed( ) - self:F() - - self:ToCoalition( coalition.side.RED ) - - return self -end - ---- Sends a MESSAGE to a Coalition. --- @param #MESSAGE self --- @param CoalitionSide needs to be filled out by the defined structure of the standard scripting engine @{coalition.side}. --- @return #MESSAGE --- @usage --- -- Send a message created with the @{New} method to the RED coalition. --- MessageRED = MESSAGE:New( "To the RED Players: You receive a penalty because you've killed one of your own units", "Penalty", 25, "Score" ):ToCoalition( coalition.side.RED ) --- or --- MESSAGE:New( "To the RED Players: You receive a penalty because you've killed one of your own units", "Penalty", 25, "Score" ):ToCoalition( coalition.side.RED ) --- or --- MessageRED = MESSAGE:New( "To the RED Players: You receive a penalty because you've killed one of your own units", "Penalty", 25, "Score" ) --- MessageRED:ToCoalition( coalition.side.RED ) -function MESSAGE:ToCoalition( CoalitionSide ) - self:F( CoalitionSide ) - - if CoalitionSide then - self:T( self.MessageCategory .. self.MessageText:gsub("\n$",""):gsub("\n$","") .. " / " .. self.MessageDuration ) - trigger.action.outTextForCoalition( CoalitionSide, self.MessageCategory .. self.MessageText:gsub("\n$",""):gsub("\n$",""), self.MessageDuration ) - end - - return self -end - ---- Sends a MESSAGE to all players. --- @param #MESSAGE self --- @return #MESSAGE --- @usage --- -- Send a message created to all players. --- MessageAll = MESSAGE:New( "To all Players: BLUE has won! Each player of BLUE wins 50 points!", "End of Mission", 25, "Win" ):ToAll() --- or --- MESSAGE:New( "To all Players: BLUE has won! Each player of BLUE wins 50 points!", "End of Mission", 25, "Win" ):ToAll() --- or --- MessageAll = MESSAGE:New( "To all Players: BLUE has won! Each player of BLUE wins 50 points!", "End of Mission", 25, "Win" ) --- MessageAll:ToAll() -function MESSAGE:ToAll() - self:F() - - self:ToCoalition( coalition.side.RED ) - self:ToCoalition( coalition.side.BLUE ) - - return self -end - - - ---- The MESSAGEQUEUE class --- @type MESSAGEQUEUE -MESSAGEQUEUE = { - ClientGroups = {}, - CoalitionSides = {} -} - -function MESSAGEQUEUE:New( RefreshInterval ) - local self = BASE:Inherit( self, BASE:New() ) - self:F( { RefreshInterval } ) - - self.RefreshInterval = RefreshInterval - - --self.DisplayFunction = routines.scheduleFunction( self._DisplayMessages, { self }, 0, RefreshInterval ) - self.DisplayFunction = SCHEDULER:New( self, self._DisplayMessages, {}, 0, RefreshInterval ) - - return self -end - ---- This function is called automatically by the MESSAGEQUEUE scheduler. -function MESSAGEQUEUE:_DisplayMessages() - - -- First we display all messages that a coalition needs to receive... Also those who are not in a client (CA module clients...). - for CoalitionSideID, CoalitionSideData in pairs( self.CoalitionSides ) do - for MessageID, MessageData in pairs( CoalitionSideData.Messages ) do - if MessageData.MessageSent == false then - --trigger.action.outTextForCoalition( CoalitionSideID, MessageData.MessageCategory .. '\n' .. MessageData.MessageText:gsub("\n$",""):gsub("\n$",""), MessageData.MessageDuration ) - MessageData.MessageSent = true - end - local MessageTimeLeft = ( MessageData.MessageTime + MessageData.MessageDuration ) - timer.getTime() - if MessageTimeLeft <= 0 then - MessageData = nil - end - end - end - - -- Then we send the messages for each individual client, but also to be included are those Coalition messages for the Clients who belong to a coalition. - -- Because the Client messages will overwrite the Coalition messages (for that Client). - for ClientGroupName, ClientGroupData in pairs( self.ClientGroups ) do - for MessageID, MessageData in pairs( ClientGroupData.Messages ) do - if MessageData.MessageGroup == false then - trigger.action.outTextForGroup( Group.getByName(ClientGroupName):getID(), MessageData.MessageCategory .. '\n' .. MessageData.MessageText:gsub("\n$",""):gsub("\n$",""), MessageData.MessageDuration ) - MessageData.MessageGroup = true - end - local MessageTimeLeft = ( MessageData.MessageTime + MessageData.MessageDuration ) - timer.getTime() - if MessageTimeLeft <= 0 then - MessageData = nil - end - end - - -- Now check if the Client also has messages that belong to the Coalition of the Client... - for CoalitionSideID, CoalitionSideData in pairs( self.CoalitionSides ) do - for MessageID, MessageData in pairs( CoalitionSideData.Messages ) do - local CoalitionGroup = Group.getByName( ClientGroupName ) - if CoalitionGroup and CoalitionGroup:getCoalition() == CoalitionSideID then - if MessageData.MessageCoalition == false then - trigger.action.outTextForGroup( Group.getByName(ClientGroupName):getID(), MessageData.MessageCategory .. '\n' .. MessageData.MessageText:gsub("\n$",""):gsub("\n$",""), MessageData.MessageDuration ) - MessageData.MessageCoalition = true - end - end - local MessageTimeLeft = ( MessageData.MessageTime + MessageData.MessageDuration ) - timer.getTime() - if MessageTimeLeft <= 0 then - MessageData = nil - end - end - end - end - - return true -end - ---- The _MessageQueue object is created when the MESSAGE class module is loaded. ---_MessageQueue = MESSAGEQUEUE:New( 0.5 ) - ---- Stages within a @{TASK} within a @{MISSION}. All of the STAGE functionality is considered internally administered and not to be used by any Mission designer. --- @module STAGE --- @author Flightcontrol - -Include.File( "Routines" ) -Include.File( "Base" ) -Include.File( "Mission" ) -Include.File( "Client" ) -Include.File( "Task" ) - ---- The STAGE class --- @type -STAGE = { - ClassName = "STAGE", - MSG = { ID = "None", TIME = 10 }, - FREQUENCY = { NONE = 0, ONCE = 1, REPEAT = -1 }, - - Name = "NoStage", - StageType = '', - WaitTime = 1, - Frequency = 1, - MessageCount = 0, - MessageInterval = 15, - MessageShown = {}, - MessageShow = false, - MessageFlash = false -} - - -function STAGE:New() - local self = BASE:Inherit( self, BASE:New() ) - self:F() - return self -end - -function STAGE:Execute( Mission, Client, Task ) - - local Valid = true - - return Valid -end - -function STAGE:Executing( Mission, Client, Task ) - -end - -function STAGE:Validate( Mission, Client, Task ) - local Valid = true - - return Valid -end - - -STAGEBRIEF = { - ClassName = "BRIEF", - MSG = { ID = "Brief", TIME = 1 }, - Name = "Brief", - StageBriefingTime = 0, - StageBriefingDuration = 1 -} - -function STAGEBRIEF:New() - local self = BASE:Inherit( self, STAGE:New() ) - self:F() - self.StageType = 'CLIENT' - return self -end - ---- Execute --- @param #STAGEBRIEF self --- @param Mission#MISSION Mission --- @param Client#CLIENT Client --- @param Task#TASK Task --- @return #boolean -function STAGEBRIEF:Execute( Mission, Client, Task ) - local Valid = BASE:Inherited(self):Execute( Mission, Client, Task ) - self:F() - Client:ShowMissionBriefing( Mission.MissionBriefing ) - self.StageBriefingTime = timer.getTime() - return Valid -end - -function STAGEBRIEF:Validate( Mission, Client, Task ) - local Valid = STAGE:Validate( Mission, Client, Task ) - self:T() - - if timer.getTime() - self.StageBriefingTime <= self.StageBriefingDuration then - return 0 - else - self.StageBriefingTime = timer.getTime() - return 1 - end - -end - - -STAGESTART = { - ClassName = "START", - MSG = { ID = "Start", TIME = 1 }, - Name = "Start", - StageStartTime = 0, - StageStartDuration = 1 -} - -function STAGESTART:New() - local self = BASE:Inherit( self, STAGE:New() ) - self:F() - self.StageType = 'CLIENT' - return self -end - -function STAGESTART:Execute( Mission, Client, Task ) - self:F() - local Valid = BASE:Inherited(self):Execute( Mission, Client, Task ) - if Task.TaskBriefing then - Client:Message( Task.TaskBriefing, 30, Mission.Name .. "/Stage", "Command" ) - else - Client:Message( 'Task ' .. Task.TaskNumber .. '.', 30, Mission.Name .. "/Stage", "Command" ) - end - self.StageStartTime = timer.getTime() - return Valid -end - -function STAGESTART:Validate( Mission, Client, Task ) - self:F() - local Valid = STAGE:Validate( Mission, Client, Task ) - - if timer.getTime() - self.StageStartTime <= self.StageStartDuration then - return 0 - else - self.StageStartTime = timer.getTime() - return 1 - end - - return 1 - -end - -STAGE_CARGO_LOAD = { - ClassName = "STAGE_CARGO_LOAD" -} - -function STAGE_CARGO_LOAD:New() - local self = BASE:Inherit( self, STAGE:New() ) - self:F() - self.StageType = 'CLIENT' - return self -end - -function STAGE_CARGO_LOAD:Execute( Mission, Client, Task ) - self:F() - local Valid = BASE:Inherited(self):Execute( Mission, Client, Task ) - - for LoadCargoID, LoadCargo in pairs( Task.Cargos.LoadCargos ) do - LoadCargo:Load( Client ) - end - - if Mission.MissionReportFlash and Client:IsTransport() then - Client:ShowCargo() - end - - return Valid -end - -function STAGE_CARGO_LOAD:Validate( Mission, Client, Task ) - self:F() - local Valid = STAGE:Validate( Mission, Client, Task ) - - return 1 -end - - -STAGE_CARGO_INIT = { - ClassName = "STAGE_CARGO_INIT" -} - -function STAGE_CARGO_INIT:New() - local self = BASE:Inherit( self, STAGE:New() ) - self:F() - self.StageType = 'CLIENT' - return self -end - -function STAGE_CARGO_INIT:Execute( Mission, Client, Task ) - self:F() - local Valid = BASE:Inherited(self):Execute( Mission, Client, Task ) - - for InitLandingZoneID, InitLandingZone in pairs( Task.LandingZones.LandingZones ) do - self:T( InitLandingZone ) - InitLandingZone:Spawn() - end - - - self:T( Task.Cargos.InitCargos ) - for InitCargoID, InitCargoData in pairs( Task.Cargos.InitCargos ) do - self:T( { InitCargoData } ) - InitCargoData:Spawn( Client ) - end - - return Valid -end - - -function STAGE_CARGO_INIT:Validate( Mission, Client, Task ) - self:F() - local Valid = STAGE:Validate( Mission, Client, Task ) - - return 1 -end - - - -STAGEROUTE = { - ClassName = "STAGEROUTE", - MSG = { ID = "Route", TIME = 5 }, - Frequency = STAGE.FREQUENCY.REPEAT, - Name = "Route" -} - -function STAGEROUTE:New() - local self = BASE:Inherit( self, STAGE:New() ) - self:F() - self.StageType = 'CLIENT' - self.MessageSwitch = true - return self -end - - ---- Execute the routing. --- @param #STAGEROUTE self --- @param Mission#MISSION Mission --- @param Client#CLIENT Client --- @param Task#TASK Task -function STAGEROUTE:Execute( Mission, Client, Task ) - self:F() - local Valid = BASE:Inherited(self):Execute( Mission, Client, Task ) - - local RouteMessage = "Fly to: " - self:T( Task.LandingZones ) - for LandingZoneID, LandingZoneName in pairs( Task.LandingZones.LandingZoneNames ) do - RouteMessage = RouteMessage .. "\n " .. LandingZoneName .. ' at ' .. routines.getBRStringZone( { zone = LandingZoneName, ref = Client:GetClientGroupDCSUnit():getPoint(), true, true } ) .. ' km.' - end - - if Client:IsMultiSeated() then - Client:Message( RouteMessage, self.MSG.TIME, Mission.Name .. "/StageRoute", "Co-Pilot", 20 ) - else - Client:Message( RouteMessage, self.MSG.TIME, Mission.Name .. "/StageRoute", "Command", 20 ) - end - - - if Mission.MissionReportFlash and Client:IsTransport() then - Client:ShowCargo() - end - - return Valid -end - -function STAGEROUTE:Validate( Mission, Client, Task ) - self:F() - local Valid = STAGE:Validate( Mission, Client, Task ) - - -- check if the Client is in the landing zone - self:T( Task.LandingZones.LandingZoneNames ) - Task.CurrentLandingZoneName = routines.IsUnitNearZonesRadius( Client:GetClientGroupDCSUnit(), Task.LandingZones.LandingZoneNames, 500 ) - - if Task.CurrentLandingZoneName then - - Task.CurrentLandingZone = Task.LandingZones.LandingZones[Task.CurrentLandingZoneName].CargoZone - Task.CurrentCargoZone = Task.LandingZones.LandingZones[Task.CurrentLandingZoneName] - - if Task.CurrentCargoZone then - if not Task.Signalled then - Task.Signalled = Task.CurrentCargoZone:Signal() - end - end - - self:T( 1 ) - return 1 - end - - self:T( 0 ) - return 0 -end - - - -STAGELANDING = { - ClassName = "STAGELANDING", - MSG = { ID = "Landing", TIME = 10 }, - Name = "Landing", - Signalled = false -} - -function STAGELANDING:New() - local self = BASE:Inherit( self, STAGE:New() ) - self:F() - self.StageType = 'CLIENT' - return self -end - ---- Execute the landing coordination. --- @param #STAGELANDING self --- @param Mission#MISSION Mission --- @param Client#CLIENT Client --- @param Task#TASK Task -function STAGELANDING:Execute( Mission, Client, Task ) - self:F() - - if Client:IsMultiSeated() then - Client:Message( "We have arrived at the landing zone.", self.MSG.TIME, Mission.Name .. "/StageArrived", "Co-Pilot", 10 ) - else - Client:Message( "You have arrived at the landing zone.", self.MSG.TIME, Mission.Name .. "/StageArrived", "Command", 10 ) - end - - Task.HostUnit = Task.CurrentCargoZone:GetHostUnit() - - self:T( { Task.HostUnit } ) - - if Task.HostUnit then - - Task.HostUnitName = Task.HostUnit:GetPrefix() - Task.HostUnitTypeName = Task.HostUnit:GetTypeName() - - local HostMessage = "" - Task.CargoNames = "" - - local IsFirst = true - - for CargoID, Cargo in pairs( CARGOS ) do - if Cargo.CargoType == Task.CargoType then - - if Cargo:IsLandingRequired() then - self:T( "Task for cargo " .. Cargo.CargoType .. " requires landing.") - Task.IsLandingRequired = true - end - - if Cargo:IsSlingLoad() then - self:T( "Task for cargo " .. Cargo.CargoType .. " is a slingload.") - Task.IsSlingLoad = true - end - - if IsFirst then - IsFirst = false - Task.CargoNames = Task.CargoNames .. Cargo.CargoName .. "( " .. Cargo.CargoWeight .. " )" - else - Task.CargoNames = Task.CargoNames .. "; " .. Cargo.CargoName .. "( " .. Cargo.CargoWeight .. " )" - end - end - end - - if Task.IsLandingRequired then - HostMessage = "Land the helicopter to " .. Task.TEXT[1] .. " " .. Task.CargoNames .. "." - else - HostMessage = "Use the Radio menu and F6 to find the cargo, then fly or land near the cargo and " .. Task.TEXT[1] .. " " .. Task.CargoNames .. "." - end - - local Host = "Command" - if Task.HostUnitName then - Host = Task.HostUnitName .. " (" .. Task.HostUnitTypeName .. ")" - else - if Client:IsMultiSeated() then - Host = "Co-Pilot" - end - end - - Client:Message( HostMessage, self.MSG.TIME, Mission.Name .. "/STAGELANDING.EXEC." .. Host, Host, 10 ) - - end -end - -function STAGELANDING:Validate( Mission, Client, Task ) - self:F() - - Task.CurrentLandingZoneName = routines.IsUnitNearZonesRadius( Client:GetClientGroupDCSUnit(), Task.LandingZones.LandingZoneNames, 500 ) - if Task.CurrentLandingZoneName then - - -- Client is in de landing zone. - self:T( Task.CurrentLandingZoneName ) - - Task.CurrentLandingZone = Task.LandingZones.LandingZones[Task.CurrentLandingZoneName].CargoZone - Task.CurrentCargoZone = Task.LandingZones.LandingZones[Task.CurrentLandingZoneName] - - if Task.CurrentCargoZone then - if not Task.Signalled then - Task.Signalled = Task.CurrentCargoZone:Signal() - end - end - else - if Task.CurrentLandingZone then - Task.CurrentLandingZone = nil - end - if Task.CurrentCargoZone then - Task.CurrentCargoZone = nil - end - Task.Signalled = false - Task:RemoveCargoMenus( Client ) - self:T( -1 ) - return -1 - end - - - local DCSUnitVelocityVec3 = Client:GetClientGroupDCSUnit():getVelocity() - local DCSUnitVelocity = ( DCSUnitVelocityVec3.x ^2 + DCSUnitVelocityVec3.y ^2 + DCSUnitVelocityVec3.z ^2 ) ^ 0.5 - - local DCSUnitPointVec3 = Client:GetClientGroupDCSUnit():getPoint() - local LandHeight = land.getHeight( { x = DCSUnitPointVec3.x, y = DCSUnitPointVec3.z } ) - local DCSUnitHeight = DCSUnitPointVec3.y - LandHeight - - self:T( { Task.IsLandingRequired, Client:GetClientGroupDCSUnit():inAir() } ) - if Task.IsLandingRequired and not Client:GetClientGroupDCSUnit():inAir() then - self:T( 1 ) - Task.IsInAirTestRequired = true - return 1 - end - - self:T( { DCSUnitVelocity, DCSUnitHeight, LandHeight, Task.CurrentCargoZone.SignalHeight } ) - if Task.IsLandingRequired and DCSUnitVelocity <= 0.05 and DCSUnitHeight <= Task.CurrentCargoZone.SignalHeight then - self:T( 1 ) - Task.IsInAirTestRequired = false - return 1 - end - - self:T( 0 ) - return 0 -end - -STAGELANDED = { - ClassName = "STAGELANDED", - MSG = { ID = "Land", TIME = 10 }, - Name = "Landed", - MenusAdded = false -} - -function STAGELANDED:New() - local self = BASE:Inherit( self, STAGE:New() ) - self:F() - self.StageType = 'CLIENT' - return self -end - -function STAGELANDED:Execute( Mission, Client, Task ) - self:F() - - if Task.IsLandingRequired then - - local Host = "Command" - if Task.HostUnitName then - Host = Task.HostUnitName .. " (" .. Task.HostUnitTypeName .. ")" - else - if Client:IsMultiSeated() then - Host = "Co-Pilot" - end - end - - Client:Message( 'You have landed within the landing zone. Use the radio menu (F10) to ' .. Task.TEXT[1] .. ' the ' .. Task.CargoType .. '.', - self.MSG.TIME, Mission.Name .. "/STAGELANDED.EXEC" .. Host, Host ) - - if not self.MenusAdded then - Task.Cargo = nil - Task:RemoveCargoMenus( Client ) - Task:AddCargoMenus( Client, CARGOS, 250 ) - end - end -end - - - -function STAGELANDED:Validate( Mission, Client, Task ) - self:F() - - if not routines.IsUnitNearZonesRadius( Client:GetClientGroupDCSUnit(), Task.CurrentLandingZoneName, 500 ) then - self:T( "Client is not anymore in the landing zone, go back to stage Route, and remove cargo menus." ) - Task.Signalled = false - Task:RemoveCargoMenus( Client ) - self:T( -2 ) - return -2 - end - - local DCSUnitVelocityVec3 = Client:GetClientGroupDCSUnit():getVelocity() - local DCSUnitVelocity = ( DCSUnitVelocityVec3.x ^2 + DCSUnitVelocityVec3.y ^2 + DCSUnitVelocityVec3.z ^2 ) ^ 0.5 - - local DCSUnitPointVec3 = Client:GetClientGroupDCSUnit():getPoint() - local LandHeight = land.getHeight( { x = DCSUnitPointVec3.x, y = DCSUnitPointVec3.z } ) - local DCSUnitHeight = DCSUnitPointVec3.y - LandHeight - - self:T( { Task.IsLandingRequired, Client:GetClientGroupDCSUnit():inAir() } ) - if Task.IsLandingRequired and Task.IsInAirTestRequired == true and Client:GetClientGroupDCSUnit():inAir() then - self:T( "Client went back in the air. Go back to stage Landing." ) - self:T( -1 ) - return -1 - end - - self:T( { DCSUnitVelocity, DCSUnitHeight, LandHeight, Task.CurrentCargoZone.SignalHeight } ) - if Task.IsLandingRequired and Task.IsInAirTestRequired == false and DCSUnitVelocity >= 2 and DCSUnitHeight >= Task.CurrentCargoZone.SignalHeight then - self:T( "It seems the Client went back in the air and over the boundary limits. Go back to stage Landing." ) - self:T( -1 ) - return -1 - end - - -- Wait until cargo is selected from the menu. - if Task.IsLandingRequired then - if not Task.Cargo then - self:T( 0 ) - return 0 - end - end - - self:T( 1 ) - return 1 -end - -STAGEUNLOAD = { - ClassName = "STAGEUNLOAD", - MSG = { ID = "Unload", TIME = 10 }, - Name = "Unload" -} - -function STAGEUNLOAD:New() - local self = BASE:Inherit( self, STAGE:New() ) - self:F() - self.StageType = 'CLIENT' - return self -end - ---- Coordinate UnLoading --- @param #STAGEUNLOAD self --- @param Mission#MISSION Mission --- @param Client#CLIENT Client --- @param Task#TASK Task -function STAGEUNLOAD:Execute( Mission, Client, Task ) - self:F() - - if Client:IsMultiSeated() then - Client:Message( 'The ' .. Task.CargoType .. ' are being ' .. Task.TEXT[2] .. ' within the landing zone. Wait until the helicopter is ' .. Task.TEXT[3] .. '.', - self.MSG.TIME, Mission.Name .. "/StageUnLoad", "Co-Pilot" ) - else - Client:Message( 'You are unloading the ' .. Task.CargoType .. ' ' .. Task.TEXT[2] .. ' within the landing zone. Wait until the helicopter is ' .. Task.TEXT[3] .. '.', - self.MSG.TIME, Mission.Name .. "/StageUnLoad", "Command" ) - end - Task:RemoveCargoMenus( Client ) -end - -function STAGEUNLOAD:Executing( Mission, Client, Task ) - self:F() - env.info( 'STAGEUNLOAD:Executing() Task.Cargo.CargoName = ' .. Task.Cargo.CargoName ) - - local TargetZoneName - - if Task.TargetZoneName then - TargetZoneName = Task.TargetZoneName - else - TargetZoneName = Task.CurrentLandingZoneName - end - - if Task.Cargo:UnLoad( Client, TargetZoneName ) then - Task.ExecuteStage = _TransportExecuteStage.SUCCESS - if Mission.MissionReportFlash then - Client:ShowCargo() - end - end -end - ---- Validate UnLoading --- @param #STAGEUNLOAD self --- @param Mission#MISSION Mission --- @param Client#CLIENT Client --- @param Task#TASK Task -function STAGEUNLOAD:Validate( Mission, Client, Task ) - self:F() - env.info( 'STAGEUNLOAD:Validate()' ) - - if routines.IsUnitNearZonesRadius( Client:GetClientGroupDCSUnit(), Task.CurrentLandingZoneName, 500 ) then - else - Task.ExecuteStage = _TransportExecuteStage.FAILED - Task:RemoveCargoMenus( Client ) - if Client:IsMultiSeated() then - Client:Message( 'The ' .. Task.CargoType .. " haven't been successfully " .. Task.TEXT[3] .. ' within the landing zone. Task and mission has failed.', - _TransportStageMsgTime.DONE, Mission.Name .. "/StageFailure", "Co-Pilot" ) - else - Client:Message( 'The ' .. Task.CargoType .. " haven't been successfully " .. Task.TEXT[3] .. ' within the landing zone. Task and mission has failed.', - _TransportStageMsgTime.DONE, Mission.Name .. "/StageFailure", "Command" ) - end - return 1 - end - - if not Client:GetClientGroupDCSUnit():inAir() then - else - Task.ExecuteStage = _TransportExecuteStage.FAILED - Task:RemoveCargoMenus( Client ) - if Client:IsMultiSeated() then - Client:Message( 'The ' .. Task.CargoType .. " haven't been successfully " .. Task.TEXT[3] .. ' within the landing zone. Task and mission has failed.', - _TransportStageMsgTime.DONE, Mission.Name .. "/StageFailure", "Co-Pilot" ) - else - Client:Message( 'The ' .. Task.CargoType .. " haven't been successfully " .. Task.TEXT[3] .. ' within the landing zone. Task and mission has failed.', - _TransportStageMsgTime.DONE, Mission.Name .. "/StageFailure", "Command" ) - end - return 1 - end - - if Task.ExecuteStage == _TransportExecuteStage.SUCCESS then - if Client:IsMultiSeated() then - Client:Message( 'The ' .. Task.CargoType .. ' have been sucessfully ' .. Task.TEXT[3] .. ' within the landing zone.', _TransportStageMsgTime.DONE, Mission.Name .. "/Stage", "Co-Pilot" ) - else - Client:Message( 'The ' .. Task.CargoType .. ' have been sucessfully ' .. Task.TEXT[3] .. ' within the landing zone.', _TransportStageMsgTime.DONE, Mission.Name .. "/Stage", "Command" ) - end - Task:RemoveCargoMenus( Client ) - Task.MissionTask:AddGoalCompletion( Task.MissionTask.GoalVerb, Task.CargoName, 1 ) -- We set the cargo as one more goal completed in the mission. - return 1 - end - - return 1 -end - -STAGELOAD = { - ClassName = "STAGELOAD", - MSG = { ID = "Load", TIME = 10 }, - Name = "Load" -} - -function STAGELOAD:New() - local self = BASE:Inherit( self, STAGE:New() ) - self:F() - self.StageType = 'CLIENT' - return self -end - -function STAGELOAD:Execute( Mission, Client, Task ) - self:F() - - if not Task.IsSlingLoad then - - local Host = "Command" - if Task.HostUnitName then - Host = Task.HostUnitName .. " (" .. Task.HostUnitTypeName .. ")" - else - if Client:IsMultiSeated() then - Host = "Co-Pilot" - end - end - - Client:Message( 'The ' .. Task.CargoType .. ' are being ' .. Task.TEXT[2] .. ' within the landing zone. Wait until the helicopter is ' .. Task.TEXT[3] .. '.', - _TransportStageMsgTime.EXECUTING, Mission.Name .. "/STAGELOAD.EXEC." .. Host, Host ) - - -- Route the cargo to the Carrier - - Task.Cargo:OnBoard( Client, Task.CurrentCargoZone, Task.OnBoardSide ) - Task.ExecuteStage = _TransportExecuteStage.EXECUTING - else - Task.ExecuteStage = _TransportExecuteStage.EXECUTING - end -end - -function STAGELOAD:Executing( Mission, Client, Task ) - self:F() - - -- If the Cargo is ready to be loaded, load it into the Client. - - local Host = "Command" - if Task.HostUnitName then - Host = Task.HostUnitName .. " (" .. Task.HostUnitTypeName .. ")" - else - if Client:IsMultiSeated() then - Host = "Co-Pilot" - end - end - - if not Task.IsSlingLoad then - self:T( Task.Cargo.CargoName) - - if Task.Cargo:OnBoarded( Client, Task.CurrentCargoZone ) then - - -- Load the Cargo onto the Client - Task.Cargo:Load( Client ) - - -- Message to the pilot that cargo has been loaded. - Client:Message( "The cargo " .. Task.Cargo.CargoName .. " has been loaded in our helicopter.", - 20, Mission.Name .. "/STAGELANDING.LOADING1." .. Host, Host ) - Task.ExecuteStage = _TransportExecuteStage.SUCCESS - - Client:ShowCargo() - end - else - Client:Message( "Hook the " .. Task.CargoNames .. " onto the helicopter " .. Task.TEXT[3] .. " within the landing zone.", - _TransportStageMsgTime.EXECUTING, Mission.Name .. "/STAGELOAD.LOADING.1." .. Host, Host , 10 ) - for CargoID, Cargo in pairs( CARGOS ) do - self:T( "Cargo.CargoName = " .. Cargo.CargoName ) - - if Cargo:IsSlingLoad() then - local CargoStatic = StaticObject.getByName( Cargo.CargoStaticName ) - if CargoStatic then - self:T( "Cargo is found in the DCS simulator.") - local CargoStaticPosition = CargoStatic:getPosition().p - self:T( "Cargo Position x = " .. CargoStaticPosition.x .. ", y = " .. CargoStaticPosition.y .. ", z = " .. CargoStaticPosition.z ) - local CargoStaticHeight = routines.GetUnitHeight( CargoStatic ) - if CargoStaticHeight > 5 then - self:T( "Cargo is airborne.") - Cargo:StatusLoaded() - Task.Cargo = Cargo - Client:Message( 'The Cargo has been successfully hooked onto the helicopter and is now being sling loaded. Fly outside the landing zone.', - self.MSG.TIME, Mission.Name .. "/STAGELANDING.LOADING.2." .. Host, Host ) - Task.ExecuteStage = _TransportExecuteStage.SUCCESS - break - end - else - self:T( "Cargo not found in the DCS simulator." ) - end - end - end - end - -end - -function STAGELOAD:Validate( Mission, Client, Task ) - self:F() - - self:T( "Task.CurrentLandingZoneName = " .. Task.CurrentLandingZoneName ) - - local Host = "Command" - if Task.HostUnitName then - Host = Task.HostUnitName .. " (" .. Task.HostUnitTypeName .. ")" - else - if Client:IsMultiSeated() then - Host = "Co-Pilot" - end - end - - if not Task.IsSlingLoad then - if not routines.IsUnitNearZonesRadius( Client:GetClientGroupDCSUnit(), Task.CurrentLandingZoneName, 500 ) then - Task:RemoveCargoMenus( Client ) - Task.ExecuteStage = _TransportExecuteStage.FAILED - Task.CargoName = nil - Client:Message( "The " .. Task.CargoType .. " loading has been aborted. You flew outside the pick-up zone while loading. ", - self.MSG.TIME, Mission.Name .. "/STAGELANDING.VALIDATE.1." .. Host, Host ) - self:T( -1 ) - return -1 - end - - local DCSUnitVelocityVec3 = Client:GetClientGroupDCSUnit():getVelocity() - local DCSUnitVelocity = ( DCSUnitVelocityVec3.x ^2 + DCSUnitVelocityVec3.y ^2 + DCSUnitVelocityVec3.z ^2 ) ^ 0.5 - - local DCSUnitPointVec3 = Client:GetClientGroupDCSUnit():getPoint() - local LandHeight = land.getHeight( { x = DCSUnitPointVec3.x, y = DCSUnitPointVec3.z } ) - local DCSUnitHeight = DCSUnitPointVec3.y - LandHeight - - self:T( { Task.IsLandingRequired, Client:GetClientGroupDCSUnit():inAir() } ) - if Task.IsLandingRequired and Task.IsInAirTestRequired == true and Client:GetClientGroupDCSUnit():inAir() then - Task:RemoveCargoMenus( Client ) - Task.ExecuteStage = _TransportExecuteStage.FAILED - Task.CargoName = nil - Client:Message( "The " .. Task.CargoType .. " loading has been aborted. Re-start the " .. Task.TEXT[3] .. " process. Don't fly outside the pick-up zone.", - self.MSG.TIME, Mission.Name .. "/STAGELANDING.VALIDATE.1." .. Host, Host ) - self:T( -1 ) - return -1 - end - - self:T( { DCSUnitVelocity, DCSUnitHeight, LandHeight, Task.CurrentCargoZone.SignalHeight } ) - if Task.IsLandingRequired and Task.IsInAirTestRequired == false and DCSUnitVelocity >= 2 and DCSUnitHeight >= Task.CurrentCargoZone.SignalHeight then - Task:RemoveCargoMenus( Client ) - Task.ExecuteStage = _TransportExecuteStage.FAILED - Task.CargoName = nil - Client:Message( "The " .. Task.CargoType .. " loading has been aborted. Re-start the " .. Task.TEXT[3] .. " process. Don't fly outside the pick-up zone.", - self.MSG.TIME, Mission.Name .. "/STAGELANDING.VALIDATE.1." .. Host, Host ) - self:T( -1 ) - return -1 - end - - if Task.ExecuteStage == _TransportExecuteStage.SUCCESS then - Task:RemoveCargoMenus( Client ) - Client:Message( "Good Job. The " .. Task.CargoType .. " has been sucessfully " .. Task.TEXT[3] .. " within the landing zone.", - self.MSG.TIME, Mission.Name .. "/STAGELANDING.VALIDATE.3." .. Host, Host ) - Task.MissionTask:AddGoalCompletion( Task.MissionTask.GoalVerb, Task.CargoName, 1 ) - self:T( 1 ) - return 1 - end - - else - if Task.ExecuteStage == _TransportExecuteStage.SUCCESS then - CargoStatic = StaticObject.getByName( Task.Cargo.CargoStaticName ) - if CargoStatic and not routines.IsStaticInZones( CargoStatic, Task.CurrentLandingZoneName ) then - Client:Message( "Good Job. The " .. Task.CargoType .. " has been sucessfully " .. Task.TEXT[3] .. " and flown outside of the landing zone.", - self.MSG.TIME, Mission.Name .. "/STAGELANDING.VALIDATE.4." .. Host, Host ) - Task.MissionTask:AddGoalCompletion( Task.MissionTask.GoalVerb, Task.Cargo.CargoName, 1 ) - self:T( 1 ) - return 1 - end - end - - end - - - self:T( 0 ) - return 0 -end - - -STAGEDONE = { - ClassName = "STAGEDONE", - MSG = { ID = "Done", TIME = 10 }, - Name = "Done" -} - -function STAGEDONE:New() - local self = BASE:Inherit( self, STAGE:New() ) - self:F() - self.StageType = 'AI' - return self -end - -function STAGEDONE:Execute( Mission, Client, Task ) - self:F() - -end - -function STAGEDONE:Validate( Mission, Client, Task ) - self:F() - - Task:Done() - - return 0 -end - -STAGEARRIVE = { - ClassName = "STAGEARRIVE", - MSG = { ID = "Arrive", TIME = 10 }, - Name = "Arrive" -} - -function STAGEARRIVE:New() - local self = BASE:Inherit( self, STAGE:New() ) - self:F() - self.StageType = 'CLIENT' - return self -end - - ---- Execute Arrival --- @param #STAGEARRIVE self --- @param Mission#MISSION Mission --- @param Client#CLIENT Client --- @param Task#TASK Task -function STAGEARRIVE:Execute( Mission, Client, Task ) - self:F() - - if Client:IsMultiSeated() then - Client:Message( 'We have arrived at ' .. Task.CurrentLandingZoneName .. ".", self.MSG.TIME, Mission.Name .. "/Stage", "Co-Pilot" ) - else - Client:Message( 'We have arrived at ' .. Task.CurrentLandingZoneName .. ".", self.MSG.TIME, Mission.Name .. "/Stage", "Command" ) - end - -end - -function STAGEARRIVE:Validate( Mission, Client, Task ) - self:F() - - Task.CurrentLandingZoneID = routines.IsUnitInZones( Client:GetClientGroupDCSUnit(), Task.LandingZones ) - if ( Task.CurrentLandingZoneID ) then - else - return -1 - end - - return 1 -end - -STAGEGROUPSDESTROYED = { - ClassName = "STAGEGROUPSDESTROYED", - DestroyGroupSize = -1, - Frequency = STAGE.FREQUENCY.REPEAT, - MSG = { ID = "DestroyGroup", TIME = 10 }, - Name = "GroupsDestroyed" -} - -function STAGEGROUPSDESTROYED:New() - local self = BASE:Inherit( self, STAGE:New() ) - self:F() - self.StageType = 'AI' - return self -end - ---function STAGEGROUPSDESTROYED:Execute( Mission, Client, Task ) --- --- Client:Message( 'Task: Still ' .. DestroyGroupSize .. " of " .. Task.DestroyGroupCount .. " " .. Task.DestroyGroupType .. " to be destroyed!", self.MSG.TIME, Mission.Name .. "/Stage" ) --- ---end - -function STAGEGROUPSDESTROYED:Validate( Mission, Client, Task ) - self:F() - - if Task.MissionTask:IsGoalReached() then - return 1 - else - return 0 - end -end - -function STAGEGROUPSDESTROYED:Execute( Mission, Client, Task ) - self:F() - self:T( { Task.ClassName, Task.Destroyed } ) - --env.info( 'Event Table Task = ' .. tostring(Task) ) - -end - - - - - - - - - - - - - ---[[ - _TransportStage: Defines the different stages of which of transport missions can be in. This table is internal and is used to control the sequence of messages, actions and flow. - - - _TransportStage.START - - _TransportStage.ROUTE - - _TransportStage.LAND - - _TransportStage.EXECUTE - - _TransportStage.DONE - - _TransportStage.REMOVE ---]] -_TransportStage = { - HOLD = "HOLD", - START = "START", - ROUTE = "ROUTE", - LANDING = "LANDING", - LANDED = "LANDED", - EXECUTING = "EXECUTING", - LOAD = "LOAD", - UNLOAD = "UNLOAD", - DONE = "DONE", - NEXT = "NEXT" -} - -_TransportStageMsgTime = { - HOLD = 10, - START = 60, - ROUTE = 5, - LANDING = 10, - LANDED = 30, - EXECUTING = 30, - LOAD = 30, - UNLOAD = 30, - DONE = 30, - NEXT = 0 -} - -_TransportStageTime = { - HOLD = 10, - START = 5, - ROUTE = 5, - LANDING = 1, - LANDED = 1, - EXECUTING = 5, - LOAD = 5, - UNLOAD = 5, - DONE = 1, - NEXT = 0 -} - -_TransportStageAction = { - REPEAT = -1, - NONE = 0, - ONCE = 1 -} ---- The TASK Classes define major end-to-end activities within a MISSION. The TASK Class is the Master Class to orchestrate these activities. From this class, many concrete TASK classes are inherited. --- @module TASK - -Include.File( "Routines" ) -Include.File( "Base" ) -Include.File( "Mission" ) -Include.File( "Client" ) -Include.File( "Stage" ) - ---- The TASK class --- @type TASK --- @extends Base#BASE -TASK = { - - -- Defines the different signal types with a Task. - SIGNAL = { - COLOR = { - RED = { ID = 1, COLOR = trigger.smokeColor.Red, TEXT = "A red" }, - GREEN = { ID = 2, COLOR = trigger.smokeColor.Green, TEXT = "A green" }, - BLUE = { ID = 3, COLOR = trigger.smokeColor.Blue, TEXT = "A blue" }, - WHITE = { ID = 4, COLOR = trigger.smokeColor.White, TEXT = "A white" }, - ORANGE = { ID = 5, COLOR = trigger.smokeColor.Orange, TEXT = "An orange" } - }, - TYPE = { - SMOKE = { ID = 1, TEXT = "smoke" }, - FLARE = { ID = 2, TEXT = "flare" } - } - }, - ClassName = "TASK", - Mission = {}, -- Owning mission of the Task - Name = '', - Stages = {}, - Stage = {}, - Cargos = { - InitCargos = {}, - LoadCargos = {} - }, - LandingZones = { - LandingZoneNames = {}, - LandingZones = {} - }, - ActiveStage = 0, - TaskDone = false, - TaskFailed = false, - GoalTasks = {} -} - ---- Instantiates a new TASK Base. Should never be used. Interface Class. --- @return TASK -function TASK:New() - local self = BASE:Inherit( self, BASE:New() ) - self:F() - - -- assign Task default values during construction - self.TaskBriefing = "Task: No Task." - self.Time = timer.getTime() - self.ExecuteStage = _TransportExecuteStage.NONE - - return self -end - -function TASK:SetStage( StageSequenceIncrement ) - self:F( { StageSequenceIncrement } ) - - local Valid = false - if StageSequenceIncrement ~= 0 then - self.ActiveStage = self.ActiveStage + StageSequenceIncrement - if 1 <= self.ActiveStage and self.ActiveStage <= #self.Stages then - self.Stage = self.Stages[self.ActiveStage] - self:T( { self.Stage.Name } ) - self.Frequency = self.Stage.Frequency - Valid = true - else - Valid = false - env.info( "TASK:SetStage() self.ActiveStage is smaller or larger than self.Stages array. self.ActiveStage = " .. self.ActiveStage ) - end - end - self.Time = timer.getTime() - return Valid -end - -function TASK:Init() - self:F() - self.ActiveStage = 0 - self:SetStage(1) - self.TaskDone = false - self.TaskFailed = false -end - - ---- Get progress of a TASK. --- @return string GoalsText -function TASK:GetGoalProgress() - self:F2() - - local GoalsText = "" - for GoalVerb, GoalVerbData in pairs( self.GoalTasks ) do - local Goals = self:GetGoalCompletion( GoalVerb ) - if Goals and Goals ~= "" then - Goals = '(' .. Goals .. ')' - else - Goals = '( - )' - end - GoalsText = GoalsText .. GoalVerb .. ': ' .. self:GetGoalCount(GoalVerb) .. ' goals ' .. Goals .. ' of ' .. self:GetGoalTotal(GoalVerb) .. ' goals completed (' .. self:GetGoalPercentage(GoalVerb) .. '%); ' - end - - if GoalsText == "" then - GoalsText = "( - )" - end - - return GoalsText -end - ---- Show progress of a TASK. --- @param MISSION Mission Group structure describing the Mission. --- @param CLIENT Client Group structure describing the Client. -function TASK:ShowGoalProgress( Mission, Client ) - self:F2() - - local GoalsText = "" - for GoalVerb, GoalVerbData in pairs( self.GoalTasks ) do - if Mission:IsCompleted() then - else - local Goals = self:GetGoalCompletion( GoalVerb ) - if Goals and Goals ~= "" then - else - Goals = "-" - end - GoalsText = GoalsText .. self:GetGoalProgress() - end - end - - if Mission.MissionReportFlash or Mission.MissionReportShow then - Client:Message( GoalsText, 10, "/TASKPROGRESS" .. self.ClassName, "Mission Command: Task Status", 30 ) - end -end - ---- Sets a TASK to status Done. -function TASK:Done() - self:F2() - self.TaskDone = true -end - ---- Returns if a TASK is done. --- @return bool -function TASK:IsDone() - self:F2( self.TaskDone ) - return self.TaskDone -end - ---- Sets a TASK to status failed. -function TASK:Failed() - self:F() - self.TaskFailed = true -end - ---- Returns if a TASk has failed. --- @return bool -function TASK:IsFailed() - self:F2( self.TaskFailed ) - return self.TaskFailed -end - -function TASK:Reset( Mission, Client ) - self:F2() - self.ExecuteStage = _TransportExecuteStage.NONE -end - ---- Returns the Goals of a TASK --- @return @table Goals -function TASK:GetGoals() - return self.GoalTasks -end - ---- Returns if a TASK has Goal(s). --- @param #TASK self --- @param #string GoalVerb is the name of the Goal of the TASK. --- @return bool -function TASK:Goal( GoalVerb ) - self:F2( { GoalVerb } ) - if not GoalVerb then - GoalVerb = self.GoalVerb - end - self:T2( {self.GoalTasks[GoalVerb] } ) - if self.GoalTasks[GoalVerb] and self.GoalTasks[GoalVerb].GoalTotal > 0 then - return true - else - return false - end -end - ---- Sets the total Goals to be achieved of the Goal Name --- @param number GoalTotal is the number of times the GoalVerb needs to be achieved. --- @param ?string GoalVerb is the name of the Goal of the TASK. If the GoalVerb is not given, then the default TASK Goals will be used. -function TASK:SetGoalTotal( GoalTotal, GoalVerb ) - self:F2( { GoalTotal, GoalVerb } ) - - if not GoalVerb then - GoalVerb = self.GoalVerb - end - self.GoalTasks[GoalVerb] = {} - self.GoalTasks[GoalVerb].Goals = {} - self.GoalTasks[GoalVerb].GoalTotal = GoalTotal - self.GoalTasks[GoalVerb].GoalCount = 0 - return self -end - ---- Gets the total of Goals to be achieved within the TASK of the GoalVerb. --- @param ?string GoalVerb is the name of the Goal of the TASK. If the GoalVerb is not given, then the default TASK Goals will be used. -function TASK:GetGoalTotal( GoalVerb ) - self:F2( { GoalVerb } ) - if not GoalVerb then - GoalVerb = self.GoalVerb - end - if self:Goal( GoalVerb ) then - return self.GoalTasks[GoalVerb].GoalTotal - else - return 0 - end -end - ---- Sets the total of Goals currently achieved within the TASK of the GoalVerb. --- @param number GoalCount is the total number of Goals achieved within the TASK. --- @param ?string GoalVerb is the name of the Goal of the TASK. If the GoalVerb is not given, then the default TASK Goals will be used. --- @return TASK -function TASK:SetGoalCount( GoalCount, GoalVerb ) - self:F2() - if not GoalVerb then - GoalVerb = self.GoalVerb - end - if self:Goal( GoalVerb) then - self.GoalTasks[GoalVerb].GoalCount = GoalCount - end - return self -end - ---- Increments the total of Goals currently achieved within the TASK of the GoalVerb, with the given GoalCountIncrease. --- @param number GoalCountIncrease is the number of new Goals achieved within the TASK. --- @param ?string GoalVerb is the name of the Goal of the TASK. If the GoalVerb is not given, then the default TASK Goals will be used. --- @return TASK -function TASK:IncreaseGoalCount( GoalCountIncrease, GoalVerb ) - self:F2( { GoalCountIncrease, GoalVerb } ) - if not GoalVerb then - GoalVerb = self.GoalVerb - end - if self:Goal( GoalVerb) then - self.GoalTasks[GoalVerb].GoalCount = self.GoalTasks[GoalVerb].GoalCount + GoalCountIncrease - end - return self -end - ---- Gets the total of Goals currently achieved within the TASK of the GoalVerb. --- @param ?string GoalVerb is the name of the Goal of the TASK. If the GoalVerb is not given, then the default TASK Goals will be used. --- @return TASK -function TASK:GetGoalCount( GoalVerb ) - self:F2() - if not GoalVerb then - GoalVerb = self.GoalVerb - end - if self:Goal( GoalVerb ) then - return self.GoalTasks[GoalVerb].GoalCount - else - return 0 - end -end - ---- Gets the percentage of Goals currently achieved within the TASK of the GoalVerb. --- @param ?string GoalVerb is the name of the Goal of the TASK. If the GoalVerb is not given, then the default TASK Goals will be used. --- @return TASK -function TASK:GetGoalPercentage( GoalVerb ) - self:F2() - if not GoalVerb then - GoalVerb = self.GoalVerb - end - if self:Goal( GoalVerb ) then - return math.floor( self:GetGoalCount( GoalVerb ) / self:GetGoalTotal( GoalVerb ) * 100 + .5 ) - else - return 100 - end -end - ---- Returns if all the Goals of the TASK were achieved. --- @return bool -function TASK:IsGoalReached() - self:F2() - - local GoalReached = true - - for GoalVerb, Goals in pairs( self.GoalTasks ) do - self:T2( { "GoalVerb", GoalVerb } ) - if self:Goal( GoalVerb ) then - local GoalToDo = self:GetGoalTotal( GoalVerb ) - self:GetGoalCount( GoalVerb ) - self:T2( "GoalToDo = " .. GoalToDo ) - if GoalToDo <= 0 then - else - GoalReached = false - break - end - else - break - end - end - - self:T( { GoalReached, self.GoalTasks } ) - return GoalReached -end - ---- Adds an Additional Goal for the TASK to be achieved. --- @param string GoalVerb is the name of the Goal of the TASK. --- @param string GoalTask is a text describing the Goal of the TASK to be achieved. --- @param number GoalIncrease is a number by which the Goal achievement is increasing. -function TASK:AddGoalCompletion( GoalVerb, GoalTask, GoalIncrease ) - self:F2( { GoalVerb, GoalTask, GoalIncrease } ) - - if self:Goal( GoalVerb ) then - self.GoalTasks[GoalVerb].Goals[#self.GoalTasks[GoalVerb].Goals+1] = GoalTask - self.GoalTasks[GoalVerb].GoalCount = self.GoalTasks[GoalVerb].GoalCount + GoalIncrease - end - return self -end - ---- Returns if the additional Goal for the TASK was completed. --- @param ?string GoalVerb is the name of the Goal of the TASK. If the GoalVerb is not given, then the default TASK Goals will be used. --- @return string Goals -function TASK:GetGoalCompletion( GoalVerb ) - self:F2( { GoalVerb } ) - - if self:Goal( GoalVerb ) then - local Goals = "" - for GoalID, GoalName in pairs( self.GoalTasks[GoalVerb].Goals ) do Goals = Goals .. GoalName .. " + " end - return Goals:gsub(" + $", ""), self.GoalTasks[GoalVerb].GoalCount - end -end - -function TASK.MenuAction( Parameter ) - Parameter.ReferenceTask.ExecuteStage = _TransportExecuteStage.EXECUTING - Parameter.ReferenceTask.Cargo = Parameter.CargoTask -end - -function TASK:StageExecute() - self:F() - - local Execute = false - - if self.Frequency == STAGE.FREQUENCY.REPEAT then - Execute = true - elseif self.Frequency == STAGE.FREQUENCY.NONE then - Execute = false - elseif self.Frequency >= 0 then - Execute = true - self.Frequency = self.Frequency - 1 - end - - return Execute - -end - ---- Work function to set signal events within a TASK. -function TASK:AddSignal( SignalUnitNames, SignalType, SignalColor, SignalHeight ) - self:F() - - local Valid = true - - if Valid then - if type( SignalUnitNames ) == "table" then - self.LandingZoneSignalUnitNames = SignalUnitNames - else - self.LandingZoneSignalUnitNames = { SignalUnitNames } - end - self.LandingZoneSignalType = SignalType - self.LandingZoneSignalColor = SignalColor - self.Signalled = false - if SignalHeight ~= nil then - self.LandingZoneSignalHeight = SignalHeight - else - self.LandingZoneSignalHeight = 0 - end - - if self.TaskBriefing then - self.TaskBriefing = self.TaskBriefing .. " " .. SignalColor.TEXT .. " " .. SignalType.TEXT .. " will be fired when entering the landing zone." - end - end - - return Valid -end - ---- When the CLIENT is approaching the landing zone, a RED SMOKE will be fired by an optional SignalUnitNames. --- @param table|string SignalUnitNames Name of the Group that will fire the signal. If this parameter is NIL, the signal will be fired from the center of the landing zone. --- @param number SignalHeight Altitude that the Signal should be fired... -function TASK:AddSmokeRed( SignalUnitNames, SignalHeight ) - self:F() - self:AddSignal( SignalUnitNames, TASK.SIGNAL.TYPE.SMOKE, TASK.SIGNAL.COLOR.RED, SignalHeight ) -end - ---- When the CLIENT is approaching the landing zone, a GREEN SMOKE will be fired by an optional SignalUnitNames. --- @param table|string SignalUnitNames Name of the Group that will fire the signal. If this parameter is NIL, the signal will be fired from the center of the landing zone. --- @param number SignalHeight Altitude that the Signal should be fired... -function TASK:AddSmokeGreen( SignalUnitNames, SignalHeight ) - self:F() - self:AddSignal( SignalUnitNames, TASK.SIGNAL.TYPE.SMOKE, TASK.SIGNAL.COLOR.GREEN, SignalHeight ) -end - ---- When the CLIENT is approaching the landing zone, a BLUE SMOKE will be fired by an optional SignalUnitNames. --- @param table|string SignalUnitNames Name of the Group that will fire the signal. If this parameter is NIL, the signal will be fired from the center of the landing zone. --- @param number SignalHeight Altitude that the Signal should be fired... -function TASK:AddSmokeBlue( SignalUnitNames, SignalHeight ) - self:F() - self:AddSignal( SignalUnitNames, TASK.SIGNAL.TYPE.SMOKE, TASK.SIGNAL.COLOR.BLUE, SignalHeight ) -end - ---- When the CLIENT is approaching the landing zone, a WHITE SMOKE will be fired by an optional SignalUnitNames. --- @param table|string SignalUnitNames Name of the Group that will fire the signal. If this parameter is NIL, the signal will be fired from the center of the landing zone. --- @param number SignalHeight Altitude that the Signal should be fired... -function TASK:AddSmokeWhite( SignalUnitNames, SignalHeight ) - self:F() - self:AddSignal( SignalUnitNames, TASK.SIGNAL.TYPE.SMOKE, TASK.SIGNAL.COLOR.WHITE, SignalHeight ) -end - ---- When the CLIENT is approaching the landing zone, an ORANGE SMOKE will be fired by an optional SignalUnitNames. --- @param table|string SignalUnitNames Name of the Group that will fire the signal. If this parameter is NIL, the signal will be fired from the center of the landing zone. --- @param number SignalHeight Altitude that the Signal should be fired... -function TASK:AddSmokeOrange( SignalUnitNames, SignalHeight ) - self:F() - self:AddSignal( SignalUnitNames, TASK.SIGNAL.TYPE.SMOKE, TASK.SIGNAL.COLOR.ORANGE, SignalHeight ) -end - ---- When the CLIENT is approaching the landing zone, a RED FLARE will be fired by an optional SignalUnitNames. --- @param table|string SignalUnitNames Name of the Group that will fire the signal. If this parameter is NIL, the signal will be fired from the center of the landing zone. --- @param number SignalHeight Altitude that the Signal should be fired... -function TASK:AddFlareRed( SignalUnitNames, SignalHeight ) - self:F() - self:AddSignal( SignalUnitNames, TASK.SIGNAL.TYPE.FLARE, TASK.SIGNAL.COLOR.RED, SignalHeight ) -end - ---- When the CLIENT is approaching the landing zone, a GREEN FLARE will be fired by an optional SignalUnitNames. --- @param table|string SignalUnitNames Name of the Group that will fire the signal. If this parameter is NIL, the signal will be fired from the center of the landing zone. --- @param number SignalHeight Altitude that the Signal should be fired... -function TASK:AddFlareGreen( SignalUnitNames, SignalHeight ) - self:F() - self:AddSignal( SignalUnitNames, TASK.SIGNAL.TYPE.FLARE, TASK.SIGNAL.COLOR.GREEN, SignalHeight ) -end - ---- When the CLIENT is approaching the landing zone, a BLUE FLARE will be fired by an optional SignalUnitNames. --- @param table|string SignalUnitNames Name of the Group that will fire the signal. If this parameter is NIL, the signal will be fired from the center of the landing zone. --- @param number SignalHeight Altitude that the Signal should be fired... -function TASK:AddFlareBlue( SignalUnitNames, SignalHeight ) - self:F() - self:AddSignal( SignalUnitNames, TASK.SIGNAL.TYPE.FLARE, TASK.SIGNAL.COLOR.BLUE, SignalHeight ) -end - ---- When the CLIENT is approaching the landing zone, a WHITE FLARE will be fired by an optional SignalUnitNames. --- @param table|string SignalUnitNames Name of the Group that will fire the signal. If this parameter is NIL, the signal will be fired from the center of the landing zone. --- @param number SignalHeight Altitude that the Signal should be fired... -function TASK:AddFlareWhite( SignalUnitNames, SignalHeight ) - self:F() - self:AddSignal( SignalUnitNames, TASK.SIGNAL.TYPE.FLARE, TASK.SIGNAL.COLOR.WHITE, SignalHeight ) -end - ---- When the CLIENT is approaching the landing zone, an ORANGE FLARE will be fired by an optional SignalUnitNames. --- @param table|string SignalUnitNames Name of the Group that will fire the signal. If this parameter is NIL, the signal will be fired from the center of the landing zone. --- @param number SignalHeight Altitude that the Signal should be fired... -function TASK:AddFlareOrange( SignalUnitNames, SignalHeight ) - self:F() - self:AddSignal( SignalUnitNames, TASK.SIGNAL.TYPE.FLARE, TASK.SIGNAL.COLOR.ORANGE, SignalHeight ) -end ---- A GOHOMETASK orchestrates the travel back to the home base, which is a specific zone defined within the ME. --- @module GOHOMETASK - -Include.File("Task") - ---- The GOHOMETASK class --- @type -GOHOMETASK = { - ClassName = "GOHOMETASK", -} - ---- Creates a new GOHOMETASK. --- @param table{string,...}|string LandingZones Table of Landing Zone names where Home(s) are located. --- @return GOHOMETASK -function GOHOMETASK:New( LandingZones ) - local self = BASE:Inherit( self, TASK:New() ) - self:F( { LandingZones } ) - local Valid = true - - Valid = routines.ValidateZone( LandingZones, "LandingZones", Valid ) - - if Valid then - self.Name = 'Fly Home' - self.TaskBriefing = "Task: Fly back to your home base. Your co-pilot will provide you with the directions (required flight angle in degrees) and the distance (in km) to your home base." - if type( LandingZones ) == "table" then - self.LandingZones = LandingZones - else - self.LandingZones = { LandingZones } - end - self.Stages = { STAGEBRIEF:New(), STAGESTART:New(), STAGEROUTE:New(), STAGEARRIVE:New(), STAGEDONE:New() } - self.SetStage( self, 1 ) - end - - return self -end ---- A DESTROYBASETASK will monitor the destruction of Groups and Units. This is a BASE class, other classes are derived from this class. --- @module DESTROYBASETASK --- @see DESTROYGROUPSTASK --- @see DESTROYUNITTYPESTASK --- @see DESTROY_RADARS_TASK - -Include.File("Task") - ---- The DESTROYBASETASK class --- @type DESTROYBASETASK -DESTROYBASETASK = { - ClassName = "DESTROYBASETASK", - Destroyed = 0, - GoalVerb = "Destroy", - DestroyPercentage = 100, -} - ---- Creates a new DESTROYBASETASK. --- @param #DESTROYBASETASK self --- @param #string DestroyGroupType Text describing the group to be destroyed. f.e. "Radar Installations", "Ships", "Vehicles", "Command Centers". --- @param #string DestroyUnitType Text describing the unit types to be destroyed. f.e. "SA-6", "Row Boats", "Tanks", "Tents". --- @param #list<#string> DestroyGroupPrefixes Table of Prefixes of the Groups to be destroyed before task is completed. --- @param #number DestroyPercentage defines the %-tage that needs to be destroyed to achieve mission success. eg. If in the Group there are 10 units, then a value of 75 would require 8 units to be destroyed from the Group to complete the @{TASK}. --- @return DESTROYBASETASK -function DESTROYBASETASK:New( DestroyGroupType, DestroyUnitType, DestroyGroupPrefixes, DestroyPercentage ) - local self = BASE:Inherit( self, TASK:New() ) - self:F() - - self.Name = 'Destroy' - self.Destroyed = 0 - self.DestroyGroupPrefixes = DestroyGroupPrefixes - self.DestroyGroupType = DestroyGroupType - self.DestroyUnitType = DestroyUnitType - if DestroyPercentage then - self.DestroyPercentage = DestroyPercentage - end - self.TaskBriefing = "Task: Destroy " .. DestroyGroupType .. "." - self.Stages = { STAGEBRIEF:New(), STAGESTART:New(), STAGEGROUPSDESTROYED:New(), STAGEDONE:New() } - self.SetStage( self, 1 ) - - return self -end - ---- Handle the S_EVENT_DEAD events to validate the destruction of units for the task monitoring. --- @param #DESTROYBASETASK self --- @param Event#EVENTDATA Event structure of MOOSE. -function DESTROYBASETASK:EventDead( Event ) - self:F( { Event } ) - - if Event.IniDCSUnit then - local DestroyUnit = Event.IniDCSUnit - local DestroyUnitName = Event.IniDCSUnitName - local DestroyGroup = Event.IniDCSGroup - local DestroyGroupName = Event.IniDCSGroupName - - --TODO: I need to fix here if 2 groups in the mission have a similar name with GroupPrefix equal, then i should differentiate for which group the goal was reached! - --I may need to test if for the goalverb that group goal was reached or something. Need to think about it a bit more ... - local UnitsDestroyed = 0 - for DestroyGroupPrefixID, DestroyGroupPrefix in pairs( self.DestroyGroupPrefixes ) do - self:T( DestroyGroupPrefix ) - if string.find( DestroyGroupName, DestroyGroupPrefix, 1, true ) then - self:T( BASE:Inherited(self).ClassName ) - UnitsDestroyed = self:ReportGoalProgress( DestroyGroup, DestroyUnit ) - self:T( UnitsDestroyed ) - end - end - - self:T( { UnitsDestroyed } ) - self:IncreaseGoalCount( UnitsDestroyed, self.GoalVerb ) - end - -end - ---- Validate task completeness of DESTROYBASETASK. --- @param DestroyGroup Group structure describing the group to be evaluated. --- @param DestroyUnit Unit structure describing the Unit to be evaluated. -function DESTROYBASETASK:ReportGoalProgress( DestroyGroup, DestroyUnit ) - self:F() - - return 0 -end ---- DESTROYGROUPSTASK --- @module DESTROYGROUPSTASK - -Include.File("DestroyBaseTask") - ---- The DESTROYGROUPSTASK class --- @type -DESTROYGROUPSTASK = { - ClassName = "DESTROYGROUPSTASK", - GoalVerb = "Destroy Groups", -} - ---- Creates a new DESTROYGROUPSTASK. --- @param #DESTROYGROUPSTASK self --- @param #string DestroyGroupType String describing the group to be destroyed. --- @param #string DestroyUnitType String describing the unit to be destroyed. --- @param #list<#string> DestroyGroupNames Table of string containing the name of the groups to be destroyed before task is completed. --- @param #number DestroyPercentage defines the %-tage that needs to be destroyed to achieve mission success. eg. If in the Group there are 10 units, then a value of 75 would require 8 units to be destroyed from the Group to complete the @{TASK}. ----@return DESTROYGROUPSTASK -function DESTROYGROUPSTASK:New( DestroyGroupType, DestroyUnitType, DestroyGroupNames, DestroyPercentage ) - local self = BASE:Inherit( self, DESTROYBASETASK:New( DestroyGroupType, DestroyUnitType, DestroyGroupNames, DestroyPercentage ) ) - self:F() - - self.Name = 'Destroy Groups' - self.GoalVerb = "Destroy " .. DestroyGroupType - - _EVENTDISPATCHER:OnDead( self.EventDead , self ) - _EVENTDISPATCHER:OnCrash( self.EventDead , self ) - - return self -end - ---- Report Goal Progress. --- @param #DESTROYGROUPSTASK self --- @param DCSGroup#Group DestroyGroup Group structure describing the group to be evaluated. --- @param DCSUnit#Unit DestroyUnit Unit structure describing the Unit to be evaluated. --- @return #number The DestroyCount reflecting the amount of units destroyed within the group. -function DESTROYGROUPSTASK:ReportGoalProgress( DestroyGroup, DestroyUnit ) - self:F( { DestroyGroup, DestroyUnit, self.DestroyPercentage } ) - - local DestroyGroupSize = DestroyGroup:getSize() - 1 -- When a DEAD event occurs, the getSize is still one larger than the destroyed unit. - local DestroyGroupInitialSize = DestroyGroup:getInitialSize() - self:T( { DestroyGroupSize, DestroyGroupInitialSize - ( DestroyGroupInitialSize * self.DestroyPercentage / 100 ) } ) - - local DestroyCount = 0 - if DestroyGroup then - if DestroyGroupSize <= DestroyGroupInitialSize - ( DestroyGroupInitialSize * self.DestroyPercentage / 100 ) then - DestroyCount = 1 - end - else - DestroyCount = 1 - end - - self:T( DestroyCount ) - - return DestroyCount -end ---- Task class to destroy radar installations. --- @module DESTROYRADARSTASK - -Include.File("DestroyBaseTask") - ---- The DESTROYRADARS class --- @type -DESTROYRADARSTASK = { - ClassName = "DESTROYRADARSTASK", - GoalVerb = "Destroy Radars" -} - ---- Creates a new DESTROYRADARSTASK. --- @param table{string,...} DestroyGroupNames Table of string containing the group names of which the radars are be destroyed. --- @return DESTROYRADARSTASK -function DESTROYRADARSTASK:New( DestroyGroupNames ) - local self = BASE:Inherit( self, DESTROYGROUPSTASK:New( 'radar installations', 'radars', DestroyGroupNames ) ) - self:F() - - self.Name = 'Destroy Radars' - - _EVENTDISPATCHER:OnDead( self.EventDead , self ) - - return self -end - ---- Report Goal Progress. --- @param Group DestroyGroup Group structure describing the group to be evaluated. --- @param Unit DestroyUnit Unit structure describing the Unit to be evaluated. -function DESTROYRADARSTASK:ReportGoalProgress( DestroyGroup, DestroyUnit ) - self:F( { DestroyGroup, DestroyUnit } ) - - local DestroyCount = 0 - if DestroyUnit and DestroyUnit:hasSensors( Unit.SensorType.RADAR, Unit.RadarType.AS ) then - if DestroyUnit and DestroyUnit:getLife() <= 1.0 then - self:T( 'Destroyed a radar' ) - DestroyCount = 1 - end - end - return DestroyCount -end ---- Set TASK to destroy certain unit types. --- @module DESTROYUNITTYPESTASK - -Include.File("DestroyBaseTask") - ---- The DESTROYUNITTYPESTASK class --- @type -DESTROYUNITTYPESTASK = { - ClassName = "DESTROYUNITTYPESTASK", - GoalVerb = "Destroy", -} - ---- Creates a new DESTROYUNITTYPESTASK. --- @param string DestroyGroupType String describing the group to be destroyed. f.e. "Radar Installations", "Fleet", "Batallion", "Command Centers". --- @param string DestroyUnitType String describing the unit to be destroyed. f.e. "radars", "ships", "tanks", "centers". --- @param table{string,...} DestroyGroupNames Table of string containing the group names of which the radars are be destroyed. --- @param string DestroyUnitTypes Table of string containing the type names of the units to achieve mission success. --- @return DESTROYUNITTYPESTASK -function DESTROYUNITTYPESTASK:New( DestroyGroupType, DestroyUnitType, DestroyGroupNames, DestroyUnitTypes ) - local self = BASE:Inherit( self, DESTROYBASETASK:New( DestroyGroupType, DestroyUnitType, DestroyGroupNames ) ) - self:F( { DestroyGroupType, DestroyUnitType, DestroyGroupNames, DestroyUnitTypes } ) - - if type(DestroyUnitTypes) == 'table' then - self.DestroyUnitTypes = DestroyUnitTypes - else - self.DestroyUnitTypes = { DestroyUnitTypes } - end - - self.Name = 'Destroy Unit Types' - self.GoalVerb = "Destroy " .. DestroyGroupType - - _EVENTDISPATCHER:OnDead( self.EventDead , self ) - - return self -end - ---- Report Goal Progress. --- @param Group DestroyGroup Group structure describing the group to be evaluated. --- @param Unit DestroyUnit Unit structure describing the Unit to be evaluated. -function DESTROYUNITTYPESTASK:ReportGoalProgress( DestroyGroup, DestroyUnit ) - self:F( { DestroyGroup, DestroyUnit } ) - - local DestroyCount = 0 - for UnitTypeID, UnitType in pairs( self.DestroyUnitTypes ) do - if DestroyUnit and DestroyUnit:getTypeName() == UnitType then - if DestroyUnit and DestroyUnit:getLife() <= 1.0 then - DestroyCount = DestroyCount + 1 - end - end - end - return DestroyCount -end ---- A PICKUPTASK orchestrates the loading of CARGO at a specific landing zone. --- @module PICKUPTASK --- @parent TASK - -Include.File("Task") -Include.File("Cargo") - ---- The PICKUPTASK class --- @type -PICKUPTASK = { - ClassName = "PICKUPTASK", - TEXT = { "Pick-Up", "picked-up", "loaded" }, - GoalVerb = "Pick-Up" -} - ---- Creates a new PICKUPTASK. --- @param table{string,...}|string LandingZones Table of Zone names where Cargo is to be loaded. --- @param CARGO_TYPE CargoType Type of the Cargo. The type must be of the following Enumeration:.. --- @param number OnBoardSide Reflects from which side the cargo Group will be on-boarded on the Carrier. -function PICKUPTASK:New( CargoType, OnBoardSide ) - local self = BASE:Inherit( self, TASK:New() ) - self:F() - - -- self holds the inherited instance of the PICKUPTASK Class to the BASE class. - - local Valid = true - - if Valid then - self.Name = 'Pickup Cargo' - self.TaskBriefing = "Task: Fly to the indicated landing zones and pickup " .. CargoType .. ". Your co-pilot will provide you with the directions (required flight angle in degrees) and the distance (in km) to the pickup zone." - self.CargoType = CargoType - self.GoalVerb = CargoType .. " " .. self.GoalVerb - self.OnBoardSide = OnBoardSide - self.IsLandingRequired = true -- required to decide whether the client needs to land or not - self.IsSlingLoad = false -- Indicates whether the cargo is a sling load cargo - self.Stages = { STAGE_CARGO_INIT:New(), STAGE_CARGO_LOAD:New(), STAGEBRIEF:New(), STAGESTART:New(), STAGEROUTE:New(), STAGELANDING:New(), STAGELANDED:New(), STAGELOAD:New(), STAGEDONE:New() } - self.SetStage( self, 1 ) - end - - return self -end - -function PICKUPTASK:FromZone( LandingZone ) - self:F() - - self.LandingZones.LandingZoneNames[LandingZone.CargoZoneName] = LandingZone.CargoZoneName - self.LandingZones.LandingZones[LandingZone.CargoZoneName] = LandingZone - - return self -end - -function PICKUPTASK:InitCargo( InitCargos ) - self:F( { InitCargos } ) - - if type( InitCargos ) == "table" then - self.Cargos.InitCargos = InitCargos - else - self.Cargos.InitCargos = { InitCargos } - end - - return self -end - -function PICKUPTASK:LoadCargo( LoadCargos ) - self:F( { LoadCargos } ) - - if type( LoadCargos ) == "table" then - self.Cargos.LoadCargos = LoadCargos - else - self.Cargos.LoadCargos = { LoadCargos } - end - - return self -end - -function PICKUPTASK:AddCargoMenus( Client, Cargos, TransportRadius ) - self:F() - - for CargoID, Cargo in pairs( Cargos ) do - - self:T( { Cargo.ClassName, Cargo.CargoName, Cargo.CargoType, Cargo:IsStatusNone(), Cargo:IsStatusLoaded(), Cargo:IsStatusLoading(), Cargo:IsStatusUnLoaded() } ) - - -- If the Cargo has no status, allow the menu option. - if Cargo:IsStatusNone() or ( Cargo:IsStatusLoading() and Client == Cargo:IsLoadingToClient() ) then - - local MenuAdd = false - if Cargo:IsNear( Client, self.CurrentCargoZone ) then - MenuAdd = true - end - - if MenuAdd then - if Client._Menus[Cargo.CargoType] == nil then - Client._Menus[Cargo.CargoType] = {} - end - - if not Client._Menus[Cargo.CargoType].PickupMenu then - Client._Menus[Cargo.CargoType].PickupMenu = missionCommands.addSubMenuForGroup( - Client:GetClientGroupID(), - self.TEXT[1] .. " " .. Cargo.CargoType, - nil - ) - self:T( 'Added PickupMenu: ' .. self.TEXT[1] .. " " .. Cargo.CargoType ) - end - - if Client._Menus[Cargo.CargoType].PickupSubMenus == nil then - Client._Menus[Cargo.CargoType].PickupSubMenus = {} - end - - Client._Menus[Cargo.CargoType].PickupSubMenus[ #Client._Menus[Cargo.CargoType].PickupSubMenus + 1 ] = missionCommands.addCommandForGroup( - Client:GetClientGroupID(), - Cargo.CargoName .. " ( " .. Cargo.CargoWeight .. "kg )", - Client._Menus[Cargo.CargoType].PickupMenu, - self.MenuAction, - { ReferenceTask = self, CargoTask = Cargo } - ) - self:T( 'Added PickupSubMenu' .. Cargo.CargoType .. ":" .. Cargo.CargoName .. " ( " .. Cargo.CargoWeight .. "kg )" ) - end - end - end - -end - -function PICKUPTASK:RemoveCargoMenus( Client ) - self:F() - - for MenuID, MenuData in pairs( Client._Menus ) do - for SubMenuID, SubMenuData in pairs( MenuData.PickupSubMenus ) do - missionCommands.removeItemForGroup( Client:GetClientGroupID(), SubMenuData ) - self:T( "Removed PickupSubMenu " ) - SubMenuData = nil - end - if MenuData.PickupMenu then - missionCommands.removeItemForGroup( Client:GetClientGroupID(), MenuData.PickupMenu ) - self:T( "Removed PickupMenu " ) - MenuData.PickupMenu = nil - end - end - - for CargoID, Cargo in pairs( CARGOS ) do - self:T( { Cargo.ClassName, Cargo.CargoName, Cargo.CargoType, Cargo:IsStatusNone(), Cargo:IsStatusLoaded(), Cargo:IsStatusLoading(), Cargo:IsStatusUnLoaded() } ) - if Cargo:IsStatusLoading() and Client == Cargo:IsLoadingToClient() then - Cargo:StatusNone() - end - end - -end - - - -function PICKUPTASK:HasFailed( ClientDead ) - self:F() - - local TaskHasFailed = self.TaskFailed - return TaskHasFailed -end - ---- A DEPLOYTASK orchestrates the deployment of CARGO within a specific landing zone. --- @module DEPLOYTASK - -Include.File( "Task" ) - ---- A DeployTask --- @type DEPLOYTASK -DEPLOYTASK = { - ClassName = "DEPLOYTASK", - TEXT = { "Deploy", "deployed", "unloaded" }, - GoalVerb = "Deployment" -} - - ---- Creates a new DEPLOYTASK object, which models the sequence of STAGEs to unload a cargo. --- @function [parent=#DEPLOYTASK] New --- @param #string CargoType Type of the Cargo. --- @return #DEPLOYTASK The created DeployTask -function DEPLOYTASK:New( CargoType ) - local self = BASE:Inherit( self, TASK:New() ) - self:F() - - local Valid = true - - if Valid then - self.Name = 'Deploy Cargo' - self.TaskBriefing = "Fly to one of the indicated landing zones and deploy " .. CargoType .. ". Your co-pilot will provide you with the directions (required flight angle in degrees) and the distance (in km) to the deployment zone." - self.CargoType = CargoType - self.GoalVerb = CargoType .. " " .. self.GoalVerb - self.Stages = { STAGE_CARGO_INIT:New(), STAGE_CARGO_LOAD:New(), STAGEBRIEF:New(), STAGESTART:New(), STAGEROUTE:New(), STAGELANDING:New(), STAGELANDED:New(), STAGEUNLOAD:New(), STAGEDONE:New() } - self.SetStage( self, 1 ) - end - - return self -end - -function DEPLOYTASK:ToZone( LandingZone ) - self:F() - - self.LandingZones.LandingZoneNames[LandingZone.CargoZoneName] = LandingZone.CargoZoneName - self.LandingZones.LandingZones[LandingZone.CargoZoneName] = LandingZone - - return self -end - - -function DEPLOYTASK:InitCargo( InitCargos ) - self:F( { InitCargos } ) - - if type( InitCargos ) == "table" then - self.Cargos.InitCargos = InitCargos - else - self.Cargos.InitCargos = { InitCargos } - end - - return self -end - - -function DEPLOYTASK:LoadCargo( LoadCargos ) - self:F( { LoadCargos } ) - - if type( LoadCargos ) == "table" then - self.Cargos.LoadCargos = LoadCargos - else - self.Cargos.LoadCargos = { LoadCargos } - end - - return self -end - - ---- When the cargo is unloaded, it will move to the target zone name. --- @param string TargetZoneName Name of the Zone to where the Cargo should move after unloading. -function DEPLOYTASK:SetCargoTargetZoneName( TargetZoneName ) - self:F() - - local Valid = true - - Valid = routines.ValidateString( TargetZoneName, "TargetZoneName", Valid ) - - if Valid then - self.TargetZoneName = TargetZoneName - end - - return Valid - -end - -function DEPLOYTASK:AddCargoMenus( Client, Cargos, TransportRadius ) - self:F() - - local ClientGroupID = Client:GetClientGroupID() - - self:T( ClientGroupID ) - - for CargoID, Cargo in pairs( Cargos ) do - - self:T( { Cargo.ClassName, Cargo.CargoName, Cargo.CargoType, Cargo.CargoWeight } ) - - if Cargo:IsStatusLoaded() and Client == Cargo:IsLoadedInClient() then - - if Client._Menus[Cargo.CargoType] == nil then - Client._Menus[Cargo.CargoType] = {} - end - - if not Client._Menus[Cargo.CargoType].DeployMenu then - Client._Menus[Cargo.CargoType].DeployMenu = missionCommands.addSubMenuForGroup( - ClientGroupID, - self.TEXT[1] .. " " .. Cargo.CargoType, - nil - ) - self:T( 'Added DeployMenu ' .. self.TEXT[1] ) - end - - if Client._Menus[Cargo.CargoType].DeploySubMenus == nil then - Client._Menus[Cargo.CargoType].DeploySubMenus = {} - end - - if Client._Menus[Cargo.CargoType].DeployMenu == nil then - self:T( 'deploymenu is nil' ) - end - - Client._Menus[Cargo.CargoType].DeploySubMenus[ #Client._Menus[Cargo.CargoType].DeploySubMenus + 1 ] = missionCommands.addCommandForGroup( - ClientGroupID, - Cargo.CargoName .. " ( " .. Cargo.CargoWeight .. "kg )", - Client._Menus[Cargo.CargoType].DeployMenu, - self.MenuAction, - { ReferenceTask = self, CargoTask = Cargo } - ) - self:T( 'Added DeploySubMenu ' .. Cargo.CargoType .. ":" .. Cargo.CargoName .. " ( " .. Cargo.CargoWeight .. "kg )" ) - end - end - -end - -function DEPLOYTASK:RemoveCargoMenus( Client ) - self:F() - - local ClientGroupID = Client:GetClientGroupID() - self:T( ClientGroupID ) - - for MenuID, MenuData in pairs( Client._Menus ) do - if MenuData.DeploySubMenus ~= nil then - for SubMenuID, SubMenuData in pairs( MenuData.DeploySubMenus ) do - missionCommands.removeItemForGroup( ClientGroupID, SubMenuData ) - self:T( "Removed DeploySubMenu " ) - SubMenuData = nil - end - end - if MenuData.DeployMenu then - missionCommands.removeItemForGroup( ClientGroupID, MenuData.DeployMenu ) - self:T( "Removed DeployMenu " ) - MenuData.DeployMenu = nil - end - end - -end ---- A NOTASK is a dummy activity... But it will show a Mission Briefing... --- @module NOTASK - -Include.File("Task") - ---- The NOTASK class --- @type -NOTASK = { - ClassName = "NOTASK", -} - ---- Creates a new NOTASK. -function NOTASK:New() - local self = BASE:Inherit( self, TASK:New() ) - self:F() - - local Valid = true - - if Valid then - self.Name = 'Nothing' - self.TaskBriefing = "Task: Execute your mission." - self.Stages = { STAGEBRIEF:New(), STAGESTART:New(), STAGEDONE:New() } - self.SetStage( self, 1 ) - end - - return self -end ---- A ROUTETASK orchestrates the travel to a specific zone defined within the ME. --- @module ROUTETASK - ---- The ROUTETASK class --- @type -ROUTETASK = { - ClassName = "ROUTETASK", - GoalVerb = "Route", -} - ---- Creates a new ROUTETASK. --- @param table{sring,...}|string LandingZones Table of Zone Names where the target is located. --- @param string TaskBriefing (optional) Defines a text describing the briefing of the task. --- @return ROUTETASK -function ROUTETASK:New( LandingZones, TaskBriefing ) - local self = BASE:Inherit( self, TASK:New() ) - self:F( { LandingZones, TaskBriefing } ) - - local Valid = true - - Valid = routines.ValidateZone( LandingZones, "LandingZones", Valid ) - - if Valid then - self.Name = 'Route To Zone' - if TaskBriefing then - self.TaskBriefing = TaskBriefing .. " Your co-pilot will provide you with the directions (required flight angle in degrees) and the distance (in km) to the target objective." - else - self.TaskBriefing = "Task: Fly to specified zone(s). Your co-pilot will provide you with the directions (required flight angle in degrees) and the distance (in km) to the target objective." - end - if type( LandingZones ) == "table" then - self.LandingZones = LandingZones - else - self.LandingZones = { LandingZones } - end - self.Stages = { STAGEBRIEF:New(), STAGESTART:New(), STAGEROUTE:New(), STAGEARRIVE:New(), STAGEDONE:New() } - self.SetStage( self, 1 ) - end - - return self -end - ---- A MISSION is the main owner of a Mission orchestration within MOOSE . The Mission framework orchestrates @{CLIENT}s, @{TASK}s, @{STAGE}s etc. --- A @{CLIENT} needs to be registered within the @{MISSION} through the function @{AddClient}. A @{TASK} needs to be registered within the @{MISSION} through the function @{AddTask}. --- @module Mission - -Include.File( "Routines" ) -Include.File( "Base" ) -Include.File( "Client" ) -Include.File( "Task" ) - ---- The MISSION class --- @type MISSION --- @extends Base#BASE --- @field #MISSION.Clients _Clients --- @field #string MissionBriefing -MISSION = { - ClassName = "MISSION", - Name = "", - MissionStatus = "PENDING", - _Clients = {}, - _Tasks = {}, - _ActiveTasks = {}, - GoalFunction = nil, - MissionReportTrigger = 0, - MissionProgressTrigger = 0, - MissionReportShow = false, - MissionReportFlash = false, - MissionTimeInterval = 0, - MissionCoalition = "", - SUCCESS = 1, - FAILED = 2, - REPEAT = 3, - _GoalTasks = {} -} - ---- @type MISSION.Clients --- @list - -function MISSION:Meta() - - local self = BASE:Inherit( self, BASE:New() ) - self:F() - - return self -end - ---- This is the main MISSION declaration method. Each Mission is like the master or a Mission orchestration between, Clients, Tasks, Stages etc. --- @param string MissionName is the name of the mission. This name will be used to reference the status of each mission by the players. --- @param string MissionPriority is a string indicating the "priority" of the Mission. f.e. "Primary", "Secondary" or "First", "Second". It is free format and up to the Mission designer to choose. There are no rules behind this field. --- @param string MissionBriefing is a string indicating the mission briefing to be shown when a player joins a @{CLIENT}. --- @param string MissionCoalition is a string indicating the coalition or party to which this mission belongs to. It is free format and can be chosen freely by the mission designer. Note that this field is not to be confused with the coalition concept of the ME. Examples of a Mission Coalition could be "NATO", "CCCP", "Intruders", "Terrorists"... --- @return MISSION --- @usage --- -- Declare a few missions. --- local Mission = MISSIONSCHEDULER.AddMission( 'Russia Transport Troops SA-6', 'Operational', 'Transport troops from the control center to one of the SA-6 SAM sites to activate their operation.', 'Russia' ) --- local Mission = MISSIONSCHEDULER.AddMission( 'Patriots', 'Primary', 'Our intelligence reports that 3 Patriot SAM defense batteries are located near Ruisi, Kvarhiti and Gori.', 'Russia' ) --- local Mission = MISSIONSCHEDULER.AddMission( 'Package Delivery', 'Operational', 'In order to be in full control of the situation, we need you to deliver a very important package at a secret location. Fly undetected through the NATO defenses and deliver the secret package. The secret agent is located at waypoint 4.', 'Russia' ) --- local Mission = MISSIONSCHEDULER.AddMission( 'Rescue General', 'Tactical', 'Our intelligence has received a remote signal behind Gori. We believe it is a very important Russian General that was captured by Georgia. Go out there and rescue him! Ensure you stay out of the battle zone, keep south. Waypoint 4 is the location of our Russian General.', 'Russia' ) --- local Mission = MISSIONSCHEDULER.AddMission( 'NATO Transport Troops', 'Operational', 'Transport 3 groups of air defense engineers from our barracks "Gold" and "Titan" to each patriot battery control center to activate our air defenses.', 'NATO' ) --- local Mission = MISSIONSCHEDULER.AddMission( 'SA-6 SAMs', 'Primary', 'Our intelligence reports that 3 SA-6 SAM defense batteries are located near Didmukha, Khetagurov and Berula. Eliminate the Russian SAMs.', 'NATO' ) --- local Mission = MISSIONSCHEDULER.AddMission( 'NATO Sling Load', 'Operational', 'Fly to the cargo pickup zone at Dzegvi or Kaspi, and sling the cargo to Soganlug airbase.', 'NATO' ) --- local Mission = MISSIONSCHEDULER.AddMission( 'Rescue secret agent', 'Tactical', 'In order to be in full control of the situation, we need you to rescue a secret agent from the woods behind enemy lines. Avoid the Russian defenses and rescue the agent. Keep south until Khasuri, and keep your eyes open for any SAM presence. The agent is located at waypoint 4 on your kneeboard.', 'NATO' ) -function MISSION:New( MissionName, MissionPriority, MissionBriefing, MissionCoalition ) - - self = MISSION:Meta() - self:T({ MissionName, MissionPriority, MissionBriefing, MissionCoalition }) - - local Valid = true - - Valid = routines.ValidateString( MissionName, "MissionName", Valid ) - Valid = routines.ValidateString( MissionPriority, "MissionPriority", Valid ) - Valid = routines.ValidateString( MissionBriefing, "MissionBriefing", Valid ) - Valid = routines.ValidateString( MissionCoalition, "MissionCoalition", Valid ) - - if Valid then - self.Name = MissionName - self.MissionPriority = MissionPriority - self.MissionBriefing = MissionBriefing - self.MissionCoalition = MissionCoalition - end - - return self -end - ---- Returns if a Mission has completed. --- @return bool -function MISSION:IsCompleted() - self:F() - return self.MissionStatus == "ACCOMPLISHED" -end - ---- Set a Mission to completed. -function MISSION:Completed() - self:F() - self.MissionStatus = "ACCOMPLISHED" - self:StatusToClients() -end - ---- Returns if a Mission is ongoing. --- treturn bool -function MISSION:IsOngoing() - self:F() - return self.MissionStatus == "ONGOING" -end - ---- Set a Mission to ongoing. -function MISSION:Ongoing() - self:F() - self.MissionStatus = "ONGOING" - --self:StatusToClients() -end - ---- Returns if a Mission is pending. --- treturn bool -function MISSION:IsPending() - self:F() - return self.MissionStatus == "PENDING" -end - ---- Set a Mission to pending. -function MISSION:Pending() - self:F() - self.MissionStatus = "PENDING" - self:StatusToClients() -end - ---- Returns if a Mission has failed. --- treturn bool -function MISSION:IsFailed() - self:F() - return self.MissionStatus == "FAILED" -end - ---- Set a Mission to failed. -function MISSION:Failed() - self:F() - self.MissionStatus = "FAILED" - self:StatusToClients() -end - ---- Send the status of the MISSION to all Clients. -function MISSION:StatusToClients() - self:F() - if self.MissionReportFlash then - for ClientID, Client in pairs( self._Clients ) do - Client:Message( self.MissionCoalition .. ' "' .. self.Name .. '": ' .. self.MissionStatus .. '! ( ' .. self.MissionPriority .. ' mission ) ', 10, self.Name .. '/Status', "Mission Command: Mission Status") - end - end -end - ---- Handles the reporting. After certain time intervals, a MISSION report MESSAGE will be shown to All Players. -function MISSION:ReportTrigger() - self:F() - - if self.MissionReportShow == true then - self.MissionReportShow = false - return true - else - if self.MissionReportFlash == true then - if timer.getTime() >= self.MissionReportTrigger then - self.MissionReportTrigger = timer.getTime() + self.MissionTimeInterval - return true - else - return false - end - else - return false - end - end -end - ---- Report the status of all MISSIONs to all active Clients. -function MISSION:ReportToAll() - self:F() - - local AlivePlayers = '' - for ClientID, Client in pairs( self._Clients ) do - if Client:GetDCSGroup() then - if Client:GetClientGroupDCSUnit() then - if Client:GetClientGroupDCSUnit():getLife() > 0.0 then - if AlivePlayers == '' then - AlivePlayers = ' Players: ' .. Client:GetClientGroupDCSUnit():getPlayerName() - else - AlivePlayers = AlivePlayers .. ' / ' .. Client:GetClientGroupDCSUnit():getPlayerName() - end - end - end - end - end - local Tasks = self:GetTasks() - local TaskText = "" - for TaskID, TaskData in pairs( Tasks ) do - TaskText = TaskText .. " - Task " .. TaskID .. ": " .. TaskData.Name .. ": " .. TaskData:GetGoalProgress() .. "\n" - end - MESSAGE:New( self.MissionCoalition .. ' "' .. self.Name .. '": ' .. self.MissionStatus .. ' ( ' .. self.MissionPriority .. ' mission )' .. AlivePlayers .. "\n" .. TaskText:gsub("\n$",""), "Mission Command: Mission Report", 10, self.Name .. '/Status'):ToAll() -end - - ---- Add a goal function to a MISSION. Goal functions are called when a @{TASK} within a mission has been completed. --- @param function GoalFunction is the function defined by the mission designer to evaluate whether a certain goal has been reached after a @{TASK} finishes within the @{MISSION}. A GoalFunction must accept 2 parameters: Mission, Client, which contains the current MISSION object and the current CLIENT object respectively. --- @usage --- PatriotActivation = { --- { "US SAM Patriot Zerti", false }, --- { "US SAM Patriot Zegduleti", false }, --- { "US SAM Patriot Gvleti", false } --- } --- --- function DeployPatriotTroopsGoal( Mission, Client ) --- --- --- -- Check if the cargo is all deployed for mission success. --- for CargoID, CargoData in pairs( Mission._Cargos ) do --- if Group.getByName( CargoData.CargoGroupName ) then --- CargoGroup = Group.getByName( CargoData.CargoGroupName ) --- if CargoGroup then --- -- Check if the cargo is ready to activate --- CurrentLandingZoneID = routines.IsUnitInZones( CargoGroup:getUnits()[1], Mission:GetTask( 2 ).LandingZones ) -- The second task is the Deploytask to measure mission success upon --- if CurrentLandingZoneID then --- if PatriotActivation[CurrentLandingZoneID][2] == false then --- -- Now check if this is a new Mission Task to be completed... --- trigger.action.setGroupAIOn( Group.getByName( PatriotActivation[CurrentLandingZoneID][1] ) ) --- PatriotActivation[CurrentLandingZoneID][2] = true --- MessageToBlue( "Mission Command: Message to all airborne units! The " .. PatriotActivation[CurrentLandingZoneID][1] .. " is armed. Our air defenses are now stronger.", 60, "BLUE/PatriotDefense" ) --- MessageToRed( "Mission Command: Our satellite systems are detecting additional NATO air defenses. To all airborne units: Take care!!!", 60, "RED/PatriotDefense" ) --- Mission:GetTask( 2 ):AddGoalCompletion( "Patriots activated", PatriotActivation[CurrentLandingZoneID][1], 1 ) -- Register Patriot activation as part of mission goal. --- end --- end --- end --- end --- end --- end --- --- local Mission = MISSIONSCHEDULER.AddMission( 'NATO Transport Troops', 'Operational', 'Transport 3 groups of air defense engineers from our barracks "Gold" and "Titan" to each patriot battery control center to activate our air defenses.', 'NATO' ) --- Mission:AddGoalFunction( DeployPatriotTroopsGoal ) -function MISSION:AddGoalFunction( GoalFunction ) - self:F() - self.GoalFunction = GoalFunction -end - ---- Register a new @{CLIENT} to participate within the mission. --- @param CLIENT Client is the @{CLIENT} object. The object must have been instantiated with @{CLIENT:New}. --- @return CLIENT --- @usage --- Add a number of Client objects to the Mission. --- Mission:AddClient( CLIENT:FindByName( 'US UH-1H*HOT-Deploy Troops 1', 'Transport 3 groups of air defense engineers from our barracks "Gold" and "Titan" to each patriot battery control center to activate our air defenses.' ):Transport() ) --- Mission:AddClient( CLIENT:FindByName( 'US UH-1H*RAMP-Deploy Troops 3', 'Transport 3 groups of air defense engineers from our barracks "Gold" and "Titan" to each patriot battery control center to activate our air defenses.' ):Transport() ) --- Mission:AddClient( CLIENT:FindByName( 'US UH-1H*HOT-Deploy Troops 2', 'Transport 3 groups of air defense engineers from our barracks "Gold" and "Titan" to each patriot battery control center to activate our air defenses.' ):Transport() ) --- Mission:AddClient( CLIENT:FindByName( 'US UH-1H*RAMP-Deploy Troops 4', 'Transport 3 groups of air defense engineers from our barracks "Gold" and "Titan" to each patriot battery control center to activate our air defenses.' ):Transport() ) -function MISSION:AddClient( Client ) - self:F( { Client } ) - - local Valid = true - - if Valid then - self._Clients[Client.ClientName] = Client - end - - return Client -end - ---- Find a @{CLIENT} object within the @{MISSION} by its ClientName. --- @param CLIENT ClientName is a string defining the Client Group as defined within the ME. --- @return CLIENT --- @usage --- -- Seach for Client "Bomber" within the Mission. --- local BomberClient = Mission:FindClient( "Bomber" ) -function MISSION:FindClient( ClientName ) - self:F( { self._Clients[ClientName] } ) - return self._Clients[ClientName] -end - - ---- Register a @{TASK} to be completed within the @{MISSION}. Note that there can be multiple @{TASK}s registered to be completed. Each TASK can be set a certain Goal. The MISSION will not be completed until all Goals are reached. --- @param TASK Task is the @{TASK} object. The object must have been instantiated with @{TASK:New} or any of its inherited @{TASK}s. --- @param number TaskNumber is the sequence number of the TASK within the MISSION. This number does have to be chronological. --- @return TASK --- @usage --- -- Define a few tasks for the Mission. --- PickupZones = { "NATO Gold Pickup Zone", "NATO Titan Pickup Zone" } --- PickupSignalUnits = { "NATO Gold Coordination Center", "NATO Titan Coordination Center" } --- --- -- Assign the Pickup Task --- local PickupTask = PICKUPTASK:New( PickupZones, CARGO_TYPE.ENGINEERS, CLIENT.ONBOARDSIDE.LEFT ) --- PickupTask:AddSmokeBlue( PickupSignalUnits ) --- PickupTask:SetGoalTotal( 3 ) --- Mission:AddTask( PickupTask, 1 ) --- --- -- Assign the Deploy Task --- local PatriotActivationZones = { "US Patriot Battery 1 Activation", "US Patriot Battery 2 Activation", "US Patriot Battery 3 Activation" } --- local PatriotActivationZonesSmokeUnits = { "US SAM Patriot - Battery 1 Control", "US SAM Patriot - Battery 2 Control", "US SAM Patriot - Battery 3 Control" } --- local DeployTask = DEPLOYTASK:New( PatriotActivationZones, CARGO_TYPE.ENGINEERS ) --- --DeployTask:SetCargoTargetZoneName( 'US Troops Attack ' .. math.random(2) ) --- DeployTask:AddSmokeBlue( PatriotActivationZonesSmokeUnits ) --- DeployTask:SetGoalTotal( 3 ) --- DeployTask:SetGoalTotal( 3, "Patriots activated" ) --- Mission:AddTask( DeployTask, 2 ) - -function MISSION:AddTask( Task, TaskNumber ) - self:F() - - self._Tasks[TaskNumber] = Task - self._Tasks[TaskNumber]:EnableEvents() - self._Tasks[TaskNumber].ID = TaskNumber - - return Task - end - ---- Get the TASK idenified by the TaskNumber from the Mission. This function is useful in GoalFunctions. --- @param number TaskNumber is the number of the @{TASK} within the @{MISSION}. --- @return TASK --- @usage --- -- Get Task 2 from the Mission. --- Task2 = Mission:GetTask( 2 ) - -function MISSION:GetTask( TaskNumber ) - self:F() - - local Valid = true - - local Task = nil - - if type(TaskNumber) ~= "number" then - Valid = false - end - - if Valid then - Task = self._Tasks[TaskNumber] - end - - return Task -end - ---- Get all the TASKs from the Mission. This function is useful in GoalFunctions. --- @return {TASK,...} Structure of TASKS with the @{TASK} number as the key. --- @usage --- -- Get Tasks from the Mission. --- Tasks = Mission:GetTasks() --- env.info( "Task 2 Completion = " .. Tasks[2]:GetGoalPercentage() .. "%" ) -function MISSION:GetTasks() - self:F() - - return self._Tasks -end - - ---[[ - _TransportExecuteStage: Defines the different stages of Transport unload/load execution. This table is internal and is used to control the validity of Transport load/unload timing. - - - _TransportExecuteStage.EXECUTING - - _TransportExecuteStage.SUCCESS - - _TransportExecuteStage.FAILED - ---]] -_TransportExecuteStage = { - NONE = 0, - EXECUTING = 1, - SUCCESS = 2, - FAILED = 3 -} - - ---- The MISSIONSCHEDULER is an OBJECT and is the main scheduler of ALL active MISSIONs registered within this scheduler. It's workings are considered internal and is automatically created when the Mission.lua file is included. --- @type MISSIONSCHEDULER --- @field #MISSIONSCHEDULER.MISSIONS Missions -MISSIONSCHEDULER = { - Missions = {}, - MissionCount = 0, - TimeIntervalCount = 0, - TimeIntervalShow = 150, - TimeSeconds = 14400, - TimeShow = 5 -} - ---- @type MISSIONSCHEDULER.MISSIONS --- @list <#MISSION> Mission - ---- This is the main MISSIONSCHEDULER Scheduler function. It is considered internal and is automatically created when the Mission.lua file is included. -function MISSIONSCHEDULER.Scheduler() - - - -- loop through the missions in the TransportTasks - for MissionName, MissionData in pairs( MISSIONSCHEDULER.Missions ) do - - local Mission = MissionData -- #MISSION - - if not Mission:IsCompleted() then - - -- This flag will monitor if for this mission, there are clients alive. If this flag is still false at the end of the loop, the mission status will be set to Pending (if not Failed or Completed). - local ClientsAlive = false - - for ClientID, ClientData in pairs( Mission._Clients ) do - - local Client = ClientData -- Client#CLIENT - - if Client:IsAlive() then - - -- There is at least one Client that is alive... So the Mission status is set to Ongoing. - ClientsAlive = true - - -- If this Client was not registered as Alive before: - -- 1. We register the Client as Alive. - -- 2. We initialize the Client Tasks and make a link to the original Mission Task. - -- 3. We initialize the Cargos. - -- 4. We flag the Mission as Ongoing. - if not Client.ClientAlive then - Client.ClientAlive = true - Client.ClientBriefingShown = false - for TaskNumber, Task in pairs( Mission._Tasks ) do - -- Note that this a deepCopy. Each client must have their own Tasks with own Stages!!! - Client._Tasks[TaskNumber] = routines.utils.deepCopy( Mission._Tasks[TaskNumber] ) - -- Each MissionTask must point to the original Mission. - Client._Tasks[TaskNumber].MissionTask = Mission._Tasks[TaskNumber] - Client._Tasks[TaskNumber].Cargos = Mission._Tasks[TaskNumber].Cargos - Client._Tasks[TaskNumber].LandingZones = Mission._Tasks[TaskNumber].LandingZones - end - - Mission:Ongoing() - end - - - -- For each Client, check for each Task the state and evolve the mission. - -- This flag will indicate if the Task of the Client is Complete. - local TaskComplete = false - - for TaskNumber, Task in pairs( Client._Tasks ) do - - if not Task.Stage then - Task:SetStage( 1 ) - end - - - local TransportTime = timer.getTime() - - if not Task:IsDone() then - - if Task:Goal() then - Task:ShowGoalProgress( Mission, Client ) - end - - --env.info( 'Scheduler: Mission = ' .. Mission.Name .. ' / Client = ' .. Client.ClientName .. ' / Task = ' .. Task.Name .. ' / Stage = ' .. Task.ActiveStage .. ' - ' .. Task.Stage.Name .. ' - ' .. Task.Stage.StageType ) - - -- Action - if Task:StageExecute() then - Task.Stage:Execute( Mission, Client, Task ) - end - - -- Wait until execution is finished - if Task.ExecuteStage == _TransportExecuteStage.EXECUTING then - Task.Stage:Executing( Mission, Client, Task ) - end - - -- Validate completion or reverse to earlier stage - if Task.Time + Task.Stage.WaitTime <= TransportTime then - Task:SetStage( Task.Stage:Validate( Mission, Client, Task ) ) - end - - if Task:IsDone() then - --env.info( 'Scheduler: Mission '.. Mission.Name .. ' Task ' .. Task.Name .. ' Stage ' .. Task.Stage.Name .. ' done. TaskComplete = ' .. string.format ( "%s", TaskComplete and "true" or "false" ) ) - TaskComplete = true -- when a task is not yet completed, a mission cannot be completed - - else - -- break only if this task is not yet done, so that future task are not yet activated. - TaskComplete = false -- when a task is not yet completed, a mission cannot be completed - --env.info( 'Scheduler: Mission "'.. Mission.Name .. '" Task "' .. Task.Name .. '" Stage "' .. Task.Stage.Name .. '" break. TaskComplete = ' .. string.format ( "%s", TaskComplete and "true" or "false" ) ) - break - end - - if TaskComplete then - - if Mission.GoalFunction ~= nil then - Mission.GoalFunction( Mission, Client ) - end - if MISSIONSCHEDULER.Scoring then - MISSIONSCHEDULER.Scoring:_AddMissionTaskScore( Client:GetClientGroupDCSUnit(), Mission.Name, 25 ) - end - --- if not Mission:IsCompleted() then --- end - end - end - end - - local MissionComplete = true - for TaskNumber, Task in pairs( Mission._Tasks ) do - if Task:Goal() then --- Task:ShowGoalProgress( Mission, Client ) - if Task:IsGoalReached() then - else - MissionComplete = false - end - else - MissionComplete = false -- If there is no goal, the mission should never be ended. The goal status will be set somewhere else. - end - end - - if MissionComplete then - Mission:Completed() - if MISSIONSCHEDULER.Scoring then - MISSIONSCHEDULER.Scoring:_AddMissionScore( Mission.Name, 100 ) - end - else - if TaskComplete then - -- Reset for new tasking of active client - Client.ClientAlive = false -- Reset the client tasks. - end - end - - - else - if Client.ClientAlive then - env.info( 'Scheduler: Client "' .. Client.ClientName .. '" is inactive.' ) - Client.ClientAlive = false - - -- This is tricky. If we sanitize Client._Tasks before sanitizing Client._Tasks[TaskNumber].MissionTask, then the original MissionTask will be sanitized, and will be lost within the garbage collector. - -- So first sanitize Client._Tasks[TaskNumber].MissionTask, after that, sanitize only the whole _Tasks structure... - --Client._Tasks[TaskNumber].MissionTask = nil - --Client._Tasks = nil - end - end - end - - -- If all Clients of this Mission are not activated, then the Mission status needs to be put back into Pending status. - -- But only if the Mission was Ongoing. In case the Mission is Completed or Failed, the Mission status may not be changed. In these cases, this will be the last run of this Mission in the Scheduler. - if ClientsAlive == false then - if Mission:IsOngoing() then - -- Mission status back to pending... - Mission:Pending() - end - end - end - - Mission:StatusToClients() - - if Mission:ReportTrigger() then - Mission:ReportToAll() - end - end - - return true -end - ---- Start the MISSIONSCHEDULER. -function MISSIONSCHEDULER.Start() - if MISSIONSCHEDULER ~= nil then - --MISSIONSCHEDULER.SchedulerId = routines.scheduleFunction( MISSIONSCHEDULER.Scheduler, { }, 0, 2 ) - MISSIONSCHEDULER.SchedulerId = SCHEDULER:New( nil, MISSIONSCHEDULER.Scheduler, { }, 0, 2 ) - end -end - ---- Stop the MISSIONSCHEDULER. -function MISSIONSCHEDULER.Stop() - if MISSIONSCHEDULER.SchedulerId then - routines.removeFunction(MISSIONSCHEDULER.SchedulerId) - MISSIONSCHEDULER.SchedulerId = nil - end -end - ---- This is the main MISSION declaration method. Each Mission is like the master or a Mission orchestration between, Clients, Tasks, Stages etc. --- @param Mission is the MISSION object instantiated by @{MISSION:New}. --- @return MISSION --- @usage --- -- Declare a mission. --- Mission = MISSION:New( 'Russia Transport Troops SA-6', --- 'Operational', --- 'Transport troops from the control center to one of the SA-6 SAM sites to activate their operation.', --- 'Russia' ) --- MISSIONSCHEDULER:AddMission( Mission ) -function MISSIONSCHEDULER.AddMission( Mission ) - MISSIONSCHEDULER.Missions[Mission.Name] = Mission - MISSIONSCHEDULER.MissionCount = MISSIONSCHEDULER.MissionCount + 1 - -- Add an overall AI Client for the AI tasks... This AI Client will facilitate the Events in the background for each Task. - --MissionAdd:AddClient( CLIENT:Register( 'AI' ) ) - - return Mission -end - ---- Remove a MISSION from the MISSIONSCHEDULER. --- @param MissionName is the name of the MISSION given at declaration using @{AddMission}. --- @usage --- -- Declare a mission. --- Mission = MISSION:New( 'Russia Transport Troops SA-6', --- 'Operational', --- 'Transport troops from the control center to one of the SA-6 SAM sites to activate their operation.', --- 'Russia' ) --- MISSIONSCHEDULER:AddMission( Mission ) --- --- -- Now remove the Mission. --- MISSIONSCHEDULER:RemoveMission( 'Russia Transport Troops SA-6' ) -function MISSIONSCHEDULER.RemoveMission( MissionName ) - MISSIONSCHEDULER.Missions[MissionName] = nil - MISSIONSCHEDULER.MissionCount = MISSIONSCHEDULER.MissionCount - 1 -end - ---- Find a MISSION within the MISSIONSCHEDULER. --- @param MissionName is the name of the MISSION given at declaration using @{AddMission}. --- @return MISSION --- @usage --- -- Declare a mission. --- Mission = MISSION:New( 'Russia Transport Troops SA-6', --- 'Operational', --- 'Transport troops from the control center to one of the SA-6 SAM sites to activate their operation.', --- 'Russia' ) --- MISSIONSCHEDULER:AddMission( Mission ) --- --- -- Now find the Mission. --- MissionFind = MISSIONSCHEDULER:FindMission( 'Russia Transport Troops SA-6' ) -function MISSIONSCHEDULER.FindMission( MissionName ) - return MISSIONSCHEDULER.Missions[MissionName] -end - --- Internal function used by the MISSIONSCHEDULER menu. -function MISSIONSCHEDULER.ReportMissionsShow( ) - for MissionName, Mission in pairs( MISSIONSCHEDULER.Missions ) do - Mission.MissionReportShow = true - Mission.MissionReportFlash = false - end -end - --- Internal function used by the MISSIONSCHEDULER menu. -function MISSIONSCHEDULER.ReportMissionsFlash( TimeInterval ) - local Count = 0 - for MissionName, Mission in pairs( MISSIONSCHEDULER.Missions ) do - Mission.MissionReportShow = false - Mission.MissionReportFlash = true - Mission.MissionReportTrigger = timer.getTime() + Count * TimeInterval - Mission.MissionTimeInterval = MISSIONSCHEDULER.MissionCount * TimeInterval - env.info( "TimeInterval = " .. Mission.MissionTimeInterval ) - Count = Count + 1 - end -end - --- Internal function used by the MISSIONSCHEDULER menu. -function MISSIONSCHEDULER.ReportMissionsHide( Prm ) - for MissionName, Mission in pairs( MISSIONSCHEDULER.Missions ) do - Mission.MissionReportShow = false - Mission.MissionReportFlash = false - end -end - ---- Enables a MENU option in the communications menu under F10 to control the status of the active missions. --- This function should be called only once when starting the MISSIONSCHEDULER. -function MISSIONSCHEDULER.ReportMenu() - local ReportMenu = SUBMENU:New( 'Status' ) - local ReportMenuShow = COMMANDMENU:New( 'Show Report Missions', ReportMenu, MISSIONSCHEDULER.ReportMissionsShow, 0 ) - local ReportMenuFlash = COMMANDMENU:New('Flash Report Missions', ReportMenu, MISSIONSCHEDULER.ReportMissionsFlash, 120 ) - local ReportMenuHide = COMMANDMENU:New( 'Hide Report Missions', ReportMenu, MISSIONSCHEDULER.ReportMissionsHide, 0 ) -end - ---- Show the remaining mission time. -function MISSIONSCHEDULER:TimeShow() - self.TimeIntervalCount = self.TimeIntervalCount + 1 - if self.TimeIntervalCount >= self.TimeTriggerShow then - local TimeMsg = string.format("%00d", ( self.TimeSeconds / 60 ) - ( timer.getTime() / 60 )) .. ' minutes left until mission reload.' - MESSAGE:New( TimeMsg, "Mission time", self.TimeShow, '/TimeMsg' ):ToAll() - self.TimeIntervalCount = 0 - end -end - -function MISSIONSCHEDULER:Time( TimeSeconds, TimeIntervalShow, TimeShow ) - - self.TimeIntervalCount = 0 - self.TimeSeconds = TimeSeconds - self.TimeIntervalShow = TimeIntervalShow - self.TimeShow = TimeShow -end - ---- Adds a mission scoring to the game. -function MISSIONSCHEDULER:Scoring( Scoring ) - - self.Scoring = Scoring -end - ---- The CLEANUP class keeps an area clean of crashing or colliding airplanes. It also prevents airplanes from firing within this area. --- @module CleanUp --- @author Flightcontrol - -Include.File( "Routines" ) -Include.File( "Base" ) -Include.File( "Mission" ) -Include.File( "Client" ) -Include.File( "Task" ) - ---- The CLEANUP class. --- @type CLEANUP --- @extends Base#BASE -CLEANUP = { - ClassName = "CLEANUP", - ZoneNames = {}, - TimeInterval = 300, - CleanUpList = {}, -} - ---- Creates the main object which is handling the cleaning of the debris within the given Zone Names. --- @param #CLEANUP self --- @param #table ZoneNames Is a table of zone names where the debris should be cleaned. Also a single string can be passed with one zone name. --- @param #number TimeInterval The interval in seconds when the clean activity takes place. The default is 300 seconds, thus every 5 minutes. --- @return #CLEANUP --- @usage --- -- Clean these Zones. --- CleanUpAirports = CLEANUP:New( { 'CLEAN Tbilisi', 'CLEAN Kutaisi' }, 150 ) --- or --- CleanUpTbilisi = CLEANUP:New( 'CLEAN Tbilisi', 150 ) --- CleanUpKutaisi = CLEANUP:New( 'CLEAN Kutaisi', 600 ) -function CLEANUP:New( ZoneNames, TimeInterval ) local self = BASE:Inherit( self, BASE:New() ) - self:F( { ZoneNames, TimeInterval } ) - - if type( ZoneNames ) == 'table' then - self.ZoneNames = ZoneNames - else - self.ZoneNames = { ZoneNames } - end - if TimeInterval then - self.TimeInterval = TimeInterval - end - - _EVENTDISPATCHER:OnBirth( self._OnEventBirth, self ) - - --self.CleanUpScheduler = routines.scheduleFunction( self._CleanUpScheduler, { self }, timer.getTime() + 1, TimeInterval ) - self.CleanUpScheduler = SCHEDULER:New( self, self._CleanUpScheduler, {}, 1, TimeInterval ) - - return self -end - - ---- Destroys a group from the simulator, but checks first if it is still existing! --- @param #CLEANUP self --- @param DCSGroup#Group GroupObject The object to be destroyed. --- @param #string CleanUpGroupName The groupname... -function CLEANUP:_DestroyGroup( GroupObject, CleanUpGroupName ) - self:F( { GroupObject, CleanUpGroupName } ) - - if GroupObject then -- and GroupObject:isExist() then - --MESSAGE:New( "Destroy Group " .. CleanUpGroupName, CleanUpGroupName, 1, CleanUpGroupName ):ToAll() - trigger.action.deactivateGroup(GroupObject) - self:T( { "GroupObject Destroyed", GroupObject } ) - end -end - ---- Destroys a @{DCSUnit#Unit} from the simulator, but checks first if it is still existing! --- @param #CLEANUP self --- @param DCSUnit#Unit CleanUpUnit The object to be destroyed. --- @param #string CleanUpUnitName The Unit name ... -function CLEANUP:_DestroyUnit( CleanUpUnit, CleanUpUnitName ) - self:F( { CleanUpUnit, CleanUpUnitName } ) - - if CleanUpUnit then - --MESSAGE:New( "Destroy " .. CleanUpUnitName, CleanUpUnitName, 1, CleanUpUnitName ):ToAll() - local CleanUpGroup = Unit.getGroup(CleanUpUnit) - -- TODO Client bug in 1.5.3 - if CleanUpGroup and CleanUpGroup:isExist() then - local CleanUpGroupUnits = CleanUpGroup:getUnits() - if #CleanUpGroupUnits == 1 then - local CleanUpGroupName = CleanUpGroup:getName() - --self:CreateEventCrash( timer.getTime(), CleanUpUnit ) - CleanUpGroup:destroy() - self:T( { "Destroyed Group:", CleanUpGroupName } ) - else - CleanUpUnit:destroy() - self:T( { "Destroyed Unit:", CleanUpUnitName } ) - end - self.CleanUpList[CleanUpUnitName] = nil -- Cleaning from the list - CleanUpUnit = nil - end - end -end - --- TODO check DCSTypes#Weapon ---- Destroys a missile from the simulator, but checks first if it is still existing! --- @param #CLEANUP self --- @param DCSTypes#Weapon MissileObject -function CLEANUP:_DestroyMissile( MissileObject ) - self:F( { MissileObject } ) - - if MissileObject and MissileObject:isExist() then - MissileObject:destroy() - self:T( "MissileObject Destroyed") - end -end - -function CLEANUP:_OnEventBirth( Event ) - self:F( { Event } ) - - self.CleanUpList[Event.IniDCSUnitName] = {} - self.CleanUpList[Event.IniDCSUnitName].CleanUpUnit = Event.IniDCSUnit - self.CleanUpList[Event.IniDCSUnitName].CleanUpGroup = Event.IniDCSGroup - self.CleanUpList[Event.IniDCSUnitName].CleanUpGroupName = Event.IniDCSGroupName - self.CleanUpList[Event.IniDCSUnitName].CleanUpUnitName = Event.IniDCSUnitName - - _EVENTDISPATCHER:OnEngineShutDownForUnit( Event.IniDCSUnitName, self._EventAddForCleanUp, self ) - _EVENTDISPATCHER:OnEngineStartUpForUnit( Event.IniDCSUnitName, self._EventAddForCleanUp, self ) - _EVENTDISPATCHER:OnHitForUnit( Event.IniDCSUnitName, self._EventAddForCleanUp, self ) - _EVENTDISPATCHER:OnPilotDeadForUnit( Event.IniDCSUnitName, self._EventCrash, self ) - _EVENTDISPATCHER:OnDeadForUnit( Event.IniDCSUnitName, self._EventCrash, self ) - _EVENTDISPATCHER:OnCrashForUnit( Event.IniDCSUnitName, self._EventCrash, self ) - _EVENTDISPATCHER:OnShotForUnit( Event.IniDCSUnitName, self._EventShot, self ) - - --self:AddEvent( world.event.S_EVENT_ENGINE_SHUTDOWN, self._EventAddForCleanUp ) - --self:AddEvent( world.event.S_EVENT_ENGINE_STARTUP, self._EventAddForCleanUp ) --- self:AddEvent( world.event.S_EVENT_HIT, self._EventAddForCleanUp ) -- , self._EventHitCleanUp ) --- self:AddEvent( world.event.S_EVENT_CRASH, self._EventCrash ) -- , self._EventHitCleanUp ) --- --self:AddEvent( world.event.S_EVENT_DEAD, self._EventCrash ) --- self:AddEvent( world.event.S_EVENT_SHOT, self._EventShot ) --- --- self:EnableEvents() - - -end - ---- Detects if a crash event occurs. --- Crashed units go into a CleanUpList for removal. --- @param #CLEANUP self --- @param DCSTypes#Event event -function CLEANUP:_EventCrash( Event ) - self:F( { Event } ) - - --TODO: This stuff is not working due to a DCS bug. Burning units cannot be destroyed. - --MESSAGE:New( "Crash ", "Crash", 10, "Crash" ):ToAll() - -- self:T("before getGroup") - -- local _grp = Unit.getGroup(event.initiator)-- Identify the group that fired - -- self:T("after getGroup") - -- _grp:destroy() - -- self:T("after deactivateGroup") - -- event.initiator:destroy() - - self.CleanUpList[Event.IniDCSUnitName] = {} - self.CleanUpList[Event.IniDCSUnitName].CleanUpUnit = Event.IniDCSUnit - self.CleanUpList[Event.IniDCSUnitName].CleanUpGroup = Event.IniDCSGroup - self.CleanUpList[Event.IniDCSUnitName].CleanUpGroupName = Event.IniDCSGroupName - self.CleanUpList[Event.IniDCSUnitName].CleanUpUnitName = Event.IniDCSUnitName - -end - ---- Detects if a unit shoots a missile. --- If this occurs within one of the zones, then the weapon used must be destroyed. --- @param #CLEANUP self --- @param DCSTypes#Event event -function CLEANUP:_EventShot( Event ) - self:F( { Event } ) - - -- Test if the missile was fired within one of the CLEANUP.ZoneNames. - local CurrentLandingZoneID = 0 - CurrentLandingZoneID = routines.IsUnitInZones( Event.IniDCSUnit, self.ZoneNames ) - if ( CurrentLandingZoneID ) then - -- Okay, the missile was fired within the CLEANUP.ZoneNames, destroy the fired weapon. - --_SEADmissile:destroy() - --routines.scheduleFunction( CLEANUP._DestroyMissile, { self, Event.Weapon }, timer.getTime() + 0.1) - SCHEDULER:New( self, CLEANUP._DestroyMissile, { Event.Weapon }, 0.1 ) - end -end - - ---- Detects if the Unit has an S_EVENT_HIT within the given ZoneNames. If this is the case, destroy the unit. --- @param #CLEANUP self --- @param DCSTypes#Event event -function CLEANUP:_EventHitCleanUp( Event ) - self:F( { Event } ) - - if Event.IniDCSUnit then - if routines.IsUnitInZones( Event.IniDCSUnit, self.ZoneNames ) ~= nil then - self:T( { "Life: ", Event.IniDCSUnitName, ' = ', Event.IniDCSUnit:getLife(), "/", Event.IniDCSUnit:getLife0() } ) - if Event.IniDCSUnit:getLife() < Event.IniDCSUnit:getLife0() then - self:T( "CleanUp: Destroy: " .. Event.IniDCSUnitName ) - --routines.scheduleFunction( CLEANUP._DestroyUnit, { self, Event.IniDCSUnit }, timer.getTime() + 0.1) - SCHEDULER:New( self, CLEANUP._DestroyUnit, { Event.IniDCSUnit }, 0.1 ) - end - end - end - - if Event.TgtDCSUnit then - if routines.IsUnitInZones( Event.TgtDCSUnit, self.ZoneNames ) ~= nil then - self:T( { "Life: ", Event.TgtDCSUnitName, ' = ', Event.TgtDCSUnit:getLife(), "/", Event.TgtDCSUnit:getLife0() } ) - if Event.TgtDCSUnit:getLife() < Event.TgtDCSUnit:getLife0() then - self:T( "CleanUp: Destroy: " .. Event.TgtDCSUnitName ) - --routines.scheduleFunction( CLEANUP._DestroyUnit, { self, Event.TgtDCSUnit }, timer.getTime() + 0.1 ) - SCHEDULER:New( self, CLEANUP._DestroyUnit, { Event.TgtDCSUnit }, 0.1 ) - end - end - end -end - ---- Add the @{DCSUnit#Unit} to the CleanUpList for CleanUp. -function CLEANUP:_AddForCleanUp( CleanUpUnit, CleanUpUnitName ) - self:F( { CleanUpUnit, CleanUpUnitName } ) - - self.CleanUpList[CleanUpUnitName] = {} - self.CleanUpList[CleanUpUnitName].CleanUpUnit = CleanUpUnit - self.CleanUpList[CleanUpUnitName].CleanUpUnitName = CleanUpUnitName - self.CleanUpList[CleanUpUnitName].CleanUpGroup = Unit.getGroup(CleanUpUnit) - self.CleanUpList[CleanUpUnitName].CleanUpGroupName = Unit.getGroup(CleanUpUnit):getName() - self.CleanUpList[CleanUpUnitName].CleanUpTime = timer.getTime() - self.CleanUpList[CleanUpUnitName].CleanUpMoved = false - - self:T( { "CleanUp: Add to CleanUpList: ", Unit.getGroup(CleanUpUnit):getName(), CleanUpUnitName } ) - -end - ---- Detects if the Unit has an S_EVENT_ENGINE_SHUTDOWN or an S_EVENT_HIT within the given ZoneNames. If this is the case, add the Group to the CLEANUP List. --- @param #CLEANUP self --- @param DCSTypes#Event event -function CLEANUP:_EventAddForCleanUp( Event ) - - if Event.IniDCSUnit then - if self.CleanUpList[Event.IniDCSUnitName] == nil then - if routines.IsUnitInZones( Event.IniDCSUnit, self.ZoneNames ) ~= nil then - self:_AddForCleanUp( Event.IniDCSUnit, Event.IniDCSUnitName ) - end - end - end - - if Event.TgtDCSUnit then - if self.CleanUpList[Event.TgtDCSUnitName] == nil then - if routines.IsUnitInZones( Event.TgtDCSUnit, self.ZoneNames ) ~= nil then - self:_AddForCleanUp( Event.TgtDCSUnit, Event.TgtDCSUnitName ) - end - end - end - -end - -local CleanUpSurfaceTypeText = { - "LAND", - "SHALLOW_WATER", - "WATER", - "ROAD", - "RUNWAY" - } - ---- At the defined time interval, CleanUp the Groups within the CleanUpList. --- @param #CLEANUP self -function CLEANUP:_CleanUpScheduler() - self:F( { "CleanUp Scheduler" } ) - - local CleanUpCount = 0 - for CleanUpUnitName, UnitData in pairs( self.CleanUpList ) do - CleanUpCount = CleanUpCount + 1 - - self:T( { CleanUpUnitName, UnitData } ) - local CleanUpUnit = Unit.getByName(UnitData.CleanUpUnitName) - local CleanUpGroupName = UnitData.CleanUpGroupName - local CleanUpUnitName = UnitData.CleanUpUnitName - if CleanUpUnit then - self:T( { "CleanUp Scheduler", "Checking:", CleanUpUnitName } ) - if _DATABASE:GetStatusGroup( CleanUpGroupName ) ~= "ReSpawn" then - local CleanUpUnitVec3 = CleanUpUnit:getPoint() - --self:T( CleanUpUnitVec3 ) - local CleanUpUnitVec2 = {} - CleanUpUnitVec2.x = CleanUpUnitVec3.x - CleanUpUnitVec2.y = CleanUpUnitVec3.z - --self:T( CleanUpUnitVec2 ) - local CleanUpSurfaceType = land.getSurfaceType(CleanUpUnitVec2) - --self:T( CleanUpSurfaceType ) - --MESSAGE:New( "Surface " .. CleanUpUnitName .. " = " .. CleanUpSurfaceTypeText[CleanUpSurfaceType], CleanUpUnitName, 10, CleanUpUnitName ):ToAll() - - if CleanUpUnit and CleanUpUnit:getLife() <= CleanUpUnit:getLife0() * 0.95 then - if CleanUpSurfaceType == land.SurfaceType.RUNWAY then - if CleanUpUnit:inAir() then - local CleanUpLandHeight = land.getHeight(CleanUpUnitVec2) - local CleanUpUnitHeight = CleanUpUnitVec3.y - CleanUpLandHeight - self:T( { "CleanUp Scheduler", "Height = " .. CleanUpUnitHeight } ) - if CleanUpUnitHeight < 30 then - self:T( { "CleanUp Scheduler", "Destroy " .. CleanUpUnitName .. " because below safe height and damaged." } ) - self:_DestroyUnit(CleanUpUnit, CleanUpUnitName) - end - else - self:T( { "CleanUp Scheduler", "Destroy " .. CleanUpUnitName .. " because on runway and damaged." } ) - self:_DestroyUnit(CleanUpUnit, CleanUpUnitName) - end - end - end - -- Clean Units which are waiting for a very long time in the CleanUpZone. - if CleanUpUnit then - local CleanUpUnitVelocity = CleanUpUnit:getVelocity() - local CleanUpUnitVelocityTotal = math.abs(CleanUpUnitVelocity.x) + math.abs(CleanUpUnitVelocity.y) + math.abs(CleanUpUnitVelocity.z) - if CleanUpUnitVelocityTotal < 1 then - if UnitData.CleanUpMoved then - if UnitData.CleanUpTime + 180 <= timer.getTime() then - self:T( { "CleanUp Scheduler", "Destroy due to not moving anymore " .. CleanUpUnitName } ) - self:_DestroyUnit(CleanUpUnit, CleanUpUnitName) - end - end - else - UnitData.CleanUpTime = timer.getTime() - UnitData.CleanUpMoved = true - --MESSAGE:New( "Moved " .. CleanUpUnitName, CleanUpUnitName, 10, CleanUpUnitName ):ToAll() - end - end - - else - -- Do nothing ... - self.CleanUpList[CleanUpUnitName] = nil -- Not anymore in the DCSRTE - end - else - self:T( "CleanUp: Group " .. CleanUpUnitName .. " cannot be found in DCS RTE, removing ..." ) - self.CleanUpList[CleanUpUnitName] = nil -- Not anymore in the DCSRTE - end - end - self:T(CleanUpCount) - - return true -end - ---- Dynamic spawning of groups (and units). --- --- @{#SPAWN} class --- =============== --- The @{#SPAWN} class allows to spawn dynamically new groups, based on pre-defined initialization settings, modifying the behaviour when groups are spawned. --- For each group to be spawned, within the mission editor, a group has to be created with the "late activation flag" set. We call this group the *"Spawn Template"* of the SPAWN object. --- A reference to this Spawn Template needs to be provided when constructing the SPAWN object, by indicating the name of the group within the mission editor in the constructor methods. --- --- Within the SPAWN object, there is an internal index that keeps track of which group from the internal group list was spawned. --- When new groups get spawned by using the SPAWN functions (see below), it will be validated whether the Limits (@{#SPAWN.Limit}) of the SPAWN object are not reached. --- When all is valid, a new group will be created by the spawning methods, and the internal index will be increased with 1. --- --- Regarding the name of new spawned groups, a _SpawnPrefix_ will be assigned for each new group created. --- If you want to have the Spawn Template name to be used as the _SpawnPrefix_ name, use the @{#SPAWN.New} constructor. --- However, when the @{#SPAWN.NewWithAlias} constructor was used, the Alias name will define the _SpawnPrefix_ name. --- Groups will follow the following naming structure when spawned at run-time: --- --- 1. Spawned groups will have the name _SpawnPrefix_#ggg, where ggg is a counter from 0 to 999. --- 2. Spawned units will have the name _SpawnPrefix_#ggg-uu, where uu is a counter from 0 to 99 for each new spawned unit belonging to the group. --- --- Some additional notes that need to be remembered: --- --- * Templates are actually groups defined within the mission editor, with the flag "Late Activation" set. As such, these groups are never used within the mission, but are used by the @{#SPAWN} module. --- * It is important to defined BEFORE you spawn new groups, a proper initialization of the SPAWN instance is done with the options you want to use. --- * When designing a mission, NEVER name groups using a "#" within the name of the group Spawn Template(s), or the SPAWN module logic won't work anymore. --- --- SPAWN construction methods: --- =========================== --- Create a new SPAWN object with the @{#SPAWN.New} or the @{#SPAWN.NewWithAlias} methods: --- --- * @{#SPAWN.New}: Creates a new SPAWN object taking the name of the group that functions as the Template. --- --- It is important to understand how the SPAWN class works internally. The SPAWN object created will contain internally a list of groups that will be spawned and that are already spawned. --- The initialization functions will modify this list of groups so that when a group gets spawned, ALL information is already prepared when spawning. This is done for performance reasons. --- So in principle, the group list will contain all parameters and configurations after initialization, and when groups get actually spawned, this spawning can be done quickly and efficient. --- --- SPAWN initialization methods: --- ============================= --- A spawn object will behave differently based on the usage of initialization methods: --- --- * @{#SPAWN.Limit}: Limits the amount of groups that can be alive at the same time and that can be dynamically spawned. --- * @{#SPAWN.RandomizeRoute}: Randomize the routes of spawned groups. --- * @{#SPAWN.RandomizeTemplate}: Randomize the group templates so that when a new group is spawned, a random group template is selected from one of the templates defined. --- * @{#SPAWN.Uncontrolled}: Spawn plane groups uncontrolled. --- * @{#SPAWN.Array}: Make groups visible before they are actually activated, and order these groups like a batallion in an array. --- * @{#SPAWN.InitRepeat}: Re-spawn groups when they land at the home base. Similar functions are @{#SPAWN.InitRepeatOnLanding} and @{#SPAWN.InitRepeatOnEngineShutDown}. --- --- SPAWN spawning methods: --- ======================= --- Groups can be spawned at different times and methods: --- --- * @{#SPAWN.Spawn}: Spawn one new group based on the last spawned index. --- * @{#SPAWN.ReSpawn}: Re-spawn a group based on a given index. --- * @{#SPAWN.SpawnScheduled}: Spawn groups at scheduled but randomized intervals. You can use @{#SPAWN.SpawnScheduleStart} and @{#SPAWN.SpawnScheduleStop} to start and stop the schedule respectively. --- * @{#SPAWN.SpawnFromUnit}: Spawn a new group taking the position of a @{UNIT}. --- * @{#SPAWN.SpawnInZone}: Spawn a new group in a @{ZONE}. --- --- Note that @{#SPAWN.Spawn} and @{#SPAWN.ReSpawn} return a @{GROUP#GROUP.New} object, that contains a reference to the DCSGroup object. --- You can use the @{GROUP} object to do further actions with the DCSGroup. --- --- SPAWN object cleaning: --- ========================= --- Sometimes, it will occur during a mission run-time, that ground or especially air objects get damaged, and will while being damged stop their activities, while remaining alive. --- In such cases, the SPAWN object will just sit there and wait until that group gets destroyed, but most of the time it won't, --- and it may occur that no new groups are or can be spawned as limits are reached. --- To prevent this, a @{#SPAWN.CleanUp} initialization method has been defined that will silently monitor the status of each spawned group. --- Once a group has a velocity = 0, and has been waiting for a defined interval, that group will be cleaned or removed from run-time. --- There is a catch however :-) If a damaged group has returned to an airbase within the coalition, that group will not be considered as "lost"... --- In such a case, when the inactive group is cleaned, a new group will Re-spawned automatically. --- This models AI that has succesfully returned to their airbase, to restart their combat activities. --- Check the @{#SPAWN.CleanUp} for further info. --- --- ==== --- @module Spawn --- @author FlightControl - -Include.File( "Routines" ) -Include.File( "Base" ) -Include.File( "Database" ) -Include.File( "Group" ) -Include.File( "Zone" ) -Include.File( "Event" ) -Include.File( "Scheduler" ) - ---- SPAWN Class --- @type SPAWN --- @extends Base#BASE --- @field ClassName --- @field #string SpawnTemplatePrefix --- @field #string SpawnAliasPrefix -SPAWN = { - ClassName = "SPAWN", - SpawnTemplatePrefix = nil, - SpawnAliasPrefix = nil, -} - - - ---- Creates the main object to spawn a GROUP defined in the DCS ME. --- @param #SPAWN self --- @param #string SpawnTemplatePrefix is the name of the Group in the ME that defines the Template. Each new group will have the name starting with SpawnTemplatePrefix. --- @return #SPAWN --- @usage --- -- NATO helicopters engaging in the battle field. --- Spawn_BE_KA50 = SPAWN:New( 'BE KA-50@RAMP-Ground Defense' ) --- @usage local Plane = SPAWN:New( "Plane" ) -- Creates a new local variable that can initiate new planes with the name "Plane#ddd" using the template "Plane" as defined within the ME. -function SPAWN:New( SpawnTemplatePrefix ) - local self = BASE:Inherit( self, BASE:New() ) - self:F( { SpawnTemplatePrefix } ) - - local TemplateGroup = Group.getByName( SpawnTemplatePrefix ) - if TemplateGroup then - self.SpawnTemplatePrefix = SpawnTemplatePrefix - self.SpawnIndex = 0 - self.SpawnCount = 0 -- The internal counter of the amount of spawning the has happened since SpawnStart. - self.AliveUnits = 0 -- Contains the counter how many units are currently alive - self.SpawnIsScheduled = false -- Reflects if the spawning for this SpawnTemplatePrefix is going to be scheduled or not. - self.SpawnTemplate = self._GetTemplate( self, SpawnTemplatePrefix ) -- Contains the template structure for a Group Spawn from the Mission Editor. Note that this group must have lateActivation always on!!! - self.Repeat = false -- Don't repeat the group from Take-Off till Landing and back Take-Off by ReSpawning. - self.UnControlled = false -- When working in UnControlled mode, all planes are Spawned in UnControlled mode before the scheduler starts. - self.SpawnMaxUnitsAlive = 0 -- The maximum amount of groups that can be alive of SpawnTemplatePrefix at the same time. - self.SpawnMaxGroups = 0 -- The maximum amount of groups that can be spawned. - self.SpawnRandomize = false -- Sets the randomization flag of new Spawned units to false. - self.SpawnVisible = false -- Flag that indicates if all the Groups of the SpawnGroup need to be visible when Spawned. - - self.SpawnGroups = {} -- Array containing the descriptions of each Group to be Spawned. - else - error( "SPAWN:New: There is no group declared in the mission editor with SpawnTemplatePrefix = '" .. SpawnTemplatePrefix .. "'" ) - end - - return self -end - ---- Creates a new SPAWN instance to create new groups based on the defined template and using a new alias for each new group. --- @param #SPAWN self --- @param #string SpawnTemplatePrefix is the name of the Group in the ME that defines the Template. --- @param #string SpawnAliasPrefix is the name that will be given to the Group at runtime. --- @return #SPAWN --- @usage --- -- NATO helicopters engaging in the battle field. --- Spawn_BE_KA50 = SPAWN:NewWithAlias( 'BE KA-50@RAMP-Ground Defense', 'Helicopter Attacking a City' ) --- @usage local PlaneWithAlias = SPAWN:NewWithAlias( "Plane", "Bomber" ) -- Creates a new local variable that can instantiate new planes with the name "Bomber#ddd" using the template "Plane" as defined within the ME. -function SPAWN:NewWithAlias( SpawnTemplatePrefix, SpawnAliasPrefix ) - local self = BASE:Inherit( self, BASE:New() ) - self:F( { SpawnTemplatePrefix, SpawnAliasPrefix } ) - - local TemplateGroup = Group.getByName( SpawnTemplatePrefix ) - if TemplateGroup then - self.SpawnTemplatePrefix = SpawnTemplatePrefix - self.SpawnAliasPrefix = SpawnAliasPrefix - self.SpawnIndex = 0 - self.SpawnCount = 0 -- The internal counter of the amount of spawning the has happened since SpawnStart. - self.AliveUnits = 0 -- Contains the counter how many units are currently alive - self.SpawnIsScheduled = false -- Reflects if the spawning for this SpawnTemplatePrefix is going to be scheduled or not. - self.SpawnTemplate = self._GetTemplate( self, SpawnTemplatePrefix ) -- Contains the template structure for a Group Spawn from the Mission Editor. Note that this group must have lateActivation always on!!! - self.Repeat = false -- Don't repeat the group from Take-Off till Landing and back Take-Off by ReSpawning. - self.UnControlled = false -- When working in UnControlled mode, all planes are Spawned in UnControlled mode before the scheduler starts. - self.SpawnMaxUnitsAlive = 0 -- The maximum amount of groups that can be alive of SpawnTemplatePrefix at the same time. - self.SpawnMaxGroups = 0 -- The maximum amount of groups that can be spawned. - self.SpawnRandomize = false -- Sets the randomization flag of new Spawned units to false. - self.SpawnVisible = false -- Flag that indicates if all the Groups of the SpawnGroup need to be visible when Spawned. - - self.SpawnGroups = {} -- Array containing the descriptions of each Group to be Spawned. - else - error( "SPAWN:New: There is no group declared in the mission editor with SpawnTemplatePrefix = '" .. SpawnTemplatePrefix .. "'" ) - end - - return self -end - - ---- Limits the Maximum amount of Units that can be alive at the same time, and the maximum amount of groups that can be spawned. --- Note that this method is exceptionally important to balance the performance of the mission. Depending on the machine etc, a mission can only process a maximum amount of units. --- If the time interval must be short, but there should not be more Units or Groups alive than a maximum amount of units, then this function should be used... --- When a @{#SPAWN.New} is executed and the limit of the amount of units alive is reached, then no new spawn will happen of the group, until some of these units of the spawn object will be destroyed. --- @param #SPAWN self --- @param #number SpawnMaxUnitsAlive The maximum amount of units that can be alive at runtime. --- @param #number SpawnMaxGroups The maximum amount of groups that can be spawned. When the limit is reached, then no more actual spawns will happen of the group. --- This parameter is useful to define a maximum amount of airplanes, ground troops, helicopters, ships etc within a supply area. --- This parameter accepts the value 0, which defines that there are no maximum group limits, but there are limits on the maximum of units that can be alive at the same time. --- @return #SPAWN self --- @usage --- -- NATO helicopters engaging in the battle field. --- -- This helicopter group consists of one Unit. So, this group will SPAWN maximum 2 groups simultaneously within the DCSRTE. --- -- There will be maximum 24 groups spawned during the whole mission lifetime. --- Spawn_BE_KA50 = SPAWN:New( 'BE KA-50@RAMP-Ground Defense' ):Limit( 2, 24 ) -function SPAWN:Limit( SpawnMaxUnitsAlive, SpawnMaxGroups ) - self:F( { self.SpawnTemplatePrefix, SpawnMaxUnitsAlive, SpawnMaxGroups } ) - - self.SpawnMaxUnitsAlive = SpawnMaxUnitsAlive -- The maximum amount of groups that can be alive of SpawnTemplatePrefix at the same time. - self.SpawnMaxGroups = SpawnMaxGroups -- The maximum amount of groups that can be spawned. - - for SpawnGroupID = 1, self.SpawnMaxGroups do - self:_InitializeSpawnGroups( SpawnGroupID ) - end - - return self -end - - ---- Randomizes the defined route of the SpawnTemplatePrefix group in the ME. This is very useful to define extra variation of the behaviour of groups. --- @param #SPAWN self --- @param #number SpawnStartPoint is the waypoint where the randomization begins. --- Note that the StartPoint = 0 equaling the point where the group is spawned. --- @param #number SpawnEndPoint is the waypoint where the randomization ends counting backwards. --- This parameter is useful to avoid randomization to end at a waypoint earlier than the last waypoint on the route. --- @param #number SpawnRadius is the radius in meters in which the randomization of the new waypoints, with the original waypoint of the original template located in the middle ... --- @return #SPAWN --- @usage --- -- NATO helicopters engaging in the battle field. --- -- The KA-50 has waypoints Start point ( =0 or SP ), 1, 2, 3, 4, End point (= 5 or DP). --- -- Waypoints 2 and 3 will only be randomized. The others will remain on their original position with each new spawn of the helicopter. --- -- The randomization of waypoint 2 and 3 will take place within a radius of 2000 meters. --- Spawn_BE_KA50 = SPAWN:New( 'BE KA-50@RAMP-Ground Defense' ):RandomizeRoute( 2, 2, 2000 ) -function SPAWN:RandomizeRoute( SpawnStartPoint, SpawnEndPoint, SpawnRadius ) - self:F( { self.SpawnTemplatePrefix, SpawnStartPoint, SpawnEndPoint, SpawnRadius } ) - - self.SpawnRandomizeRoute = true - self.SpawnRandomizeRouteStartPoint = SpawnStartPoint - self.SpawnRandomizeRouteEndPoint = SpawnEndPoint - self.SpawnRandomizeRouteRadius = SpawnRadius - - for GroupID = 1, self.SpawnMaxGroups do - self:_RandomizeRoute( GroupID ) - end - - return self -end - - ---- This function is rather complicated to understand. But I'll try to explain. --- This function becomes useful when you need to spawn groups with random templates of groups defined within the mission editor, --- but they will all follow the same Template route and have the same prefix name. --- In other words, this method randomizes between a defined set of groups the template to be used for each new spawn of a group. --- @param #SPAWN self --- @param #string SpawnTemplatePrefixTable A table with the names of the groups defined within the mission editor, from which one will be choosen when a new group will be spawned. --- @return #SPAWN --- @usage --- -- NATO Tank Platoons invading Gori. --- -- Choose between 13 different 'US Tank Platoon' configurations for each new SPAWN the Group to be spawned for the --- -- 'US Tank Platoon Left', 'US Tank Platoon Middle' and 'US Tank Platoon Right' SpawnTemplatePrefixes. --- -- Each new SPAWN will randomize the route, with a defined time interval of 200 seconds with 40% time variation (randomization) and --- -- with a limit set of maximum 12 Units alive simulteneously and 150 Groups to be spawned during the whole mission. --- Spawn_US_Platoon = { 'US Tank Platoon 1', 'US Tank Platoon 2', 'US Tank Platoon 3', 'US Tank Platoon 4', 'US Tank Platoon 5', --- 'US Tank Platoon 6', 'US Tank Platoon 7', 'US Tank Platoon 8', 'US Tank Platoon 9', 'US Tank Platoon 10', --- 'US Tank Platoon 11', 'US Tank Platoon 12', 'US Tank Platoon 13' } --- Spawn_US_Platoon_Left = SPAWN:New( 'US Tank Platoon Left' ):Limit( 12, 150 ):Schedule( 200, 0.4 ):RandomizeTemplate( Spawn_US_Platoon ):RandomizeRoute( 3, 3, 2000 ) --- Spawn_US_Platoon_Middle = SPAWN:New( 'US Tank Platoon Middle' ):Limit( 12, 150 ):Schedule( 200, 0.4 ):RandomizeTemplate( Spawn_US_Platoon ):RandomizeRoute( 3, 3, 2000 ) --- Spawn_US_Platoon_Right = SPAWN:New( 'US Tank Platoon Right' ):Limit( 12, 150 ):Schedule( 200, 0.4 ):RandomizeTemplate( Spawn_US_Platoon ):RandomizeRoute( 3, 3, 2000 ) -function SPAWN:RandomizeTemplate( SpawnTemplatePrefixTable ) - self:F( { self.SpawnTemplatePrefix, SpawnTemplatePrefixTable } ) - - self.SpawnTemplatePrefixTable = SpawnTemplatePrefixTable - self.SpawnRandomizeTemplate = true - - for SpawnGroupID = 1, self.SpawnMaxGroups do - self:_RandomizeTemplate( SpawnGroupID ) - end - - return self -end - - - - - ---- For planes and helicopters, when these groups go home and land on their home airbases and farps, they normally would taxi to the parking spot, shut-down their engines and wait forever until the Group is removed by the runtime environment. --- This function is used to re-spawn automatically (so no extra call is needed anymore) the same group after it has landed. --- This will enable a spawned group to be re-spawned after it lands, until it is destroyed... --- Note: When the group is respawned, it will re-spawn from the original airbase where it took off. --- So ensure that the routes for groups that respawn, always return to the original airbase, or players may get confused ... --- @param #SPAWN self --- @return #SPAWN self --- @usage --- -- RU Su-34 - AI Ship Attack --- -- Re-SPAWN the Group(s) after each landing and Engine Shut-Down automatically. --- SpawnRU_SU34 = SPAWN:New( 'TF1 RU Su-34 Krymsk@AI - Attack Ships' ):Schedule( 2, 3, 1800, 0.4 ):SpawnUncontrolled():RandomizeRoute( 1, 1, 3000 ):RepeatOnEngineShutDown() -function SPAWN:InitRepeat() - self:F( { self.SpawnTemplatePrefix, self.SpawnIndex } ) - - self.Repeat = true - self.RepeatOnEngineShutDown = false - self.RepeatOnLanding = true - - return self -end - ---- Respawn group after landing. --- @param #SPAWN self --- @return #SPAWN self -function SPAWN:InitRepeatOnLanding() - self:F( { self.SpawnTemplatePrefix } ) - - self:InitRepeat() - self.RepeatOnEngineShutDown = false - self.RepeatOnLanding = true - - return self -end - - ---- Respawn after landing when its engines have shut down. --- @param #SPAWN self --- @return #SPAWN self -function SPAWN:InitRepeatOnEngineShutDown() - self:F( { self.SpawnTemplatePrefix } ) - - self:InitRepeat() - self.RepeatOnEngineShutDown = true - self.RepeatOnLanding = false - - return self -end - - ---- CleanUp groups when they are still alive, but inactive. --- When groups are still alive and have become inactive due to damage and are unable to contribute anything, then this group will be removed at defined intervals in seconds. --- @param #SPAWN self --- @param #string SpawnCleanUpInterval The interval to check for inactive groups within seconds. --- @return #SPAWN self --- @usage Spawn_Helicopter:CleanUp( 20 ) -- CleanUp the spawning of the helicopters every 20 seconds when they become inactive. -function SPAWN:CleanUp( SpawnCleanUpInterval ) - self:F( { self.SpawnTemplatePrefix, SpawnCleanUpInterval } ) - - self.SpawnCleanUpInterval = SpawnCleanUpInterval - self.SpawnCleanUpTimeStamps = {} - --self.CleanUpFunction = routines.scheduleFunction( self._SpawnCleanUpScheduler, { self }, timer.getTime() + 1, SpawnCleanUpInterval ) - self.CleanUpScheduler = SCHEDULER:New( self, self._SpawnCleanUpScheduler, {}, 1, SpawnCleanUpInterval, 0.2 ) - return self -end - - - ---- Makes the groups visible before start (like a batallion). --- The method will take the position of the group as the first position in the array. --- @param #SPAWN self --- @param #number SpawnAngle The angle in degrees how the groups and each unit of the group will be positioned. --- @param #number SpawnWidth The amount of Groups that will be positioned on the X axis. --- @param #number SpawnDeltaX The space between each Group on the X-axis. --- @param #number SpawnDeltaY The space between each Group on the Y-axis. --- @return #SPAWN self --- @usage --- -- Define an array of Groups. --- Spawn_BE_Ground = SPAWN:New( 'BE Ground' ):Limit( 2, 24 ):Visible( 90, "Diamond", 10, 100, 50 ) -function SPAWN:Array( SpawnAngle, SpawnWidth, SpawnDeltaX, SpawnDeltaY ) - self:F( { self.SpawnTemplatePrefix, SpawnAngle, SpawnWidth, SpawnDeltaX, SpawnDeltaY } ) - - self.SpawnVisible = true -- When the first Spawn executes, all the Groups need to be made visible before start. - - local SpawnX = 0 - local SpawnY = 0 - local SpawnXIndex = 0 - local SpawnYIndex = 0 - - for SpawnGroupID = 1, self.SpawnMaxGroups do - self:T( { SpawnX, SpawnY, SpawnXIndex, SpawnYIndex } ) - - self.SpawnGroups[SpawnGroupID].Visible = true - self.SpawnGroups[SpawnGroupID].Spawned = false - - SpawnXIndex = SpawnXIndex + 1 - if SpawnWidth and SpawnWidth ~= 0 then - if SpawnXIndex >= SpawnWidth then - SpawnXIndex = 0 - SpawnYIndex = SpawnYIndex + 1 - end - end - - local SpawnRootX = self.SpawnGroups[SpawnGroupID].SpawnTemplate.x - local SpawnRootY = self.SpawnGroups[SpawnGroupID].SpawnTemplate.y - - self:_TranslateRotate( SpawnGroupID, SpawnRootX, SpawnRootY, SpawnX, SpawnY, SpawnAngle ) - - self.SpawnGroups[SpawnGroupID].SpawnTemplate.lateActivation = true - self.SpawnGroups[SpawnGroupID].SpawnTemplate.visible = true - - self.SpawnGroups[SpawnGroupID].Visible = true - - _EVENTDISPATCHER:OnBirthForTemplate( self.SpawnGroups[SpawnGroupID].SpawnTemplate, self._OnBirth, self ) - _EVENTDISPATCHER:OnCrashForTemplate( self.SpawnGroups[SpawnGroupID].SpawnTemplate, self._OnDeadOrCrash, self ) - _EVENTDISPATCHER:OnDeadForTemplate( self.SpawnGroups[SpawnGroupID].SpawnTemplate, self._OnDeadOrCrash, self ) - - if self.Repeat then - _EVENTDISPATCHER:OnTakeOffForTemplate( self.SpawnGroups[SpawnGroupID].SpawnTemplate, self._OnTakeOff, self ) - _EVENTDISPATCHER:OnLandForTemplate( self.SpawnGroups[SpawnGroupID].SpawnTemplate, self._OnLand, self ) - end - if self.RepeatOnEngineShutDown then - _EVENTDISPATCHER:OnEngineShutDownForTemplate( self.SpawnGroups[SpawnGroupID].SpawnTemplate, self._OnEngineShutDown, self ) - end - - self.SpawnGroups[SpawnGroupID].Group = _DATABASE:Spawn( self.SpawnGroups[SpawnGroupID].SpawnTemplate ) - - SpawnX = SpawnXIndex * SpawnDeltaX - SpawnY = SpawnYIndex * SpawnDeltaY - end - - return self -end - - - ---- Will spawn a group based on the internal index. --- Note: Uses @{DATABASE} module defined in MOOSE. --- @param #SPAWN self --- @return Group#GROUP The group that was spawned. You can use this group for further actions. -function SPAWN:Spawn() - self:F( { self.SpawnTemplatePrefix, self.SpawnIndex } ) - - return self:SpawnWithIndex( self.SpawnIndex + 1 ) -end - ---- Will re-spawn a group based on a given index. --- Note: Uses @{DATABASE} module defined in MOOSE. --- @param #SPAWN self --- @param #string SpawnIndex The index of the group to be spawned. --- @return Group#GROUP The group that was spawned. You can use this group for further actions. -function SPAWN:ReSpawn( SpawnIndex ) - self:F( { self.SpawnTemplatePrefix, SpawnIndex } ) - - if not SpawnIndex then - SpawnIndex = 1 - end - --- TODO: This logic makes DCS crash and i don't know why (yet). - local SpawnGroup = self:GetGroupFromIndex( SpawnIndex ) - if SpawnGroup then - local SpawnDCSGroup = SpawnGroup:GetDCSGroup() - if SpawnDCSGroup then - SpawnGroup:Destroy() - end - end - - return self:SpawnWithIndex( SpawnIndex ) -end - ---- Will spawn a group with a specified index number. --- Uses @{DATABASE} global object defined in MOOSE. --- @param #SPAWN self --- @return Group#GROUP The group that was spawned. You can use this group for further actions. -function SPAWN:SpawnWithIndex( SpawnIndex ) - self:F( { self.SpawnTemplatePrefix, SpawnIndex, self.SpawnMaxGroups } ) - - if self:_GetSpawnIndex( SpawnIndex ) then - - if self.SpawnGroups[self.SpawnIndex].Visible then - self.SpawnGroups[self.SpawnIndex].Group:Activate() - else - self:T( self.SpawnGroups[self.SpawnIndex].SpawnTemplate ) - _EVENTDISPATCHER:OnBirthForTemplate( self.SpawnGroups[self.SpawnIndex].SpawnTemplate, self._OnBirth, self ) - _EVENTDISPATCHER:OnCrashForTemplate( self.SpawnGroups[self.SpawnIndex].SpawnTemplate, self._OnDeadOrCrash, self ) - _EVENTDISPATCHER:OnDeadForTemplate( self.SpawnGroups[self.SpawnIndex].SpawnTemplate, self._OnDeadOrCrash, self ) - - if self.Repeat then - _EVENTDISPATCHER:OnTakeOffForTemplate( self.SpawnGroups[self.SpawnIndex].SpawnTemplate, self._OnTakeOff, self ) - _EVENTDISPATCHER:OnLandForTemplate( self.SpawnGroups[self.SpawnIndex].SpawnTemplate, self._OnLand, self ) - end - if self.RepeatOnEngineShutDown then - _EVENTDISPATCHER:OnEngineShutDownForTemplate( self.SpawnGroups[self.SpawnIndex].SpawnTemplate, self._OnEngineShutDown, self ) - end - - self:T( self.SpawnGroups[self.SpawnIndex].SpawnTemplate ) - - self.SpawnGroups[self.SpawnIndex].Group = _DATABASE:Spawn( self.SpawnGroups[self.SpawnIndex].SpawnTemplate ) - - -- If there is a SpawnFunction hook defined, call it. - if self.SpawnFunctionHook then - self.SpawnFunctionHook( self.SpawnGroups[self.SpawnIndex].Group, unpack( self.SpawnFunctionArguments ) ) - end - -- TODO: Need to fix this by putting an "R" in the name of the group when the group repeats. - --if self.Repeat then - -- _DATABASE:SetStatusGroup( SpawnTemplate.name, "ReSpawn" ) - --end - end - - self.SpawnGroups[self.SpawnIndex].Spawned = true - return self.SpawnGroups[self.SpawnIndex].Group - else - --self:E( { self.SpawnTemplatePrefix, "No more Groups to Spawn:", SpawnIndex, self.SpawnMaxGroups } ) - end - - return nil -end - ---- Spawns new groups at varying time intervals. --- This is useful if you want to have continuity within your missions of certain (AI) groups to be present (alive) within your missions. --- @param #SPAWN self --- @param #number SpawnTime The time interval defined in seconds between each new spawn of new groups. --- @param #number SpawnTimeVariation The variation to be applied on the defined time interval between each new spawn. --- The variation is a number between 0 and 1, representing the %-tage of variation to be applied on the time interval. --- @return #SPAWN self --- @usage --- -- NATO helicopters engaging in the battle field. --- -- The time interval is set to SPAWN new helicopters between each 600 seconds, with a time variation of 50%. --- -- The time variation in this case will be between 450 seconds and 750 seconds. --- -- This is calculated as follows: --- -- Low limit: 600 * ( 1 - 0.5 / 2 ) = 450 --- -- High limit: 600 * ( 1 + 0.5 / 2 ) = 750 --- -- Between these two values, a random amount of seconds will be choosen for each new spawn of the helicopters. --- Spawn_BE_KA50 = SPAWN:New( 'BE KA-50@RAMP-Ground Defense' ):Schedule( 600, 0.5 ) -function SPAWN:SpawnScheduled( SpawnTime, SpawnTimeVariation ) - self:F( { SpawnTime, SpawnTimeVariation } ) - - if SpawnTime ~= nil and SpawnTimeVariation ~= nil then - self.SpawnScheduler = SCHEDULER:New( self, self._Scheduler, {}, 1, SpawnTime, SpawnTimeVariation ) - end - - return self -end - ---- Will re-start the spawning scheduler. --- Note: This function is only required to be called when the schedule was stopped. -function SPAWN:SpawnScheduleStart() - self:F( { self.SpawnTemplatePrefix } ) - - self.SpawnScheduler:Start() -end - ---- Will stop the scheduled spawning scheduler. -function SPAWN:SpawnScheduleStop() - self:F( { self.SpawnTemplatePrefix } ) - - self.SpawnScheduler:Stop() -end - - ---- Allows to place a CallFunction hook when a new group spawns. --- The provided function will be called when a new group is spawned, including its given parameters. --- The first parameter of the SpawnFunction is the @{Group#GROUP} that was spawned. --- @param #SPAWN self --- @param #function SpawnFunctionHook The function to be called when a group spawns. --- @param SpawnFunctionArguments A random amount of arguments to be provided to the function when the group spawns. --- @return #SPAWN -function SPAWN:SpawnFunction( SpawnFunctionHook, ... ) - self:F( SpawnFunction ) - - self.SpawnFunctionHook = SpawnFunctionHook - self.SpawnFunctionArguments = {} - if arg then - self.SpawnFunctionArguments = arg - end - - return self -end - - - - ---- Will spawn a group from a hosting unit. This function is mostly advisable to be used if you want to simulate spawning from air units, like helicopters, which are dropping infantry into a defined Landing Zone. --- Note that each point in the route assigned to the spawning group is reset to the point of the spawn. --- You can use the returned group to further define the route to be followed. --- @param #SPAWN self --- @param Unit#UNIT HostUnit The air or ground unit dropping or unloading the group. --- @param #number OuterRadius The outer radius in meters where the new group will be spawned. --- @param #number InnerRadius The inner radius in meters where the new group will NOT be spawned. --- @param #number SpawnIndex (Optional) The index which group to spawn within the given zone. --- @return Group#GROUP that was spawned. --- @return #nil Nothing was spawned. -function SPAWN:SpawnFromUnit( HostUnit, OuterRadius, InnerRadius, SpawnIndex ) - self:F( { self.SpawnTemplatePrefix, HostUnit, OuterRadius, InnerRadius, SpawnIndex } ) - - if HostUnit and HostUnit:IsAlive() then -- and HostUnit:getUnit(1):inAir() == false then - - if SpawnIndex then - else - SpawnIndex = self.SpawnIndex + 1 - end - - if self:_GetSpawnIndex( SpawnIndex ) then - - local SpawnTemplate = self.SpawnGroups[self.SpawnIndex].SpawnTemplate - - if SpawnTemplate then - - local UnitPoint = HostUnit:GetPointVec2() - - self:T( { "Current point of ", self.SpawnTemplatePrefix, UnitPoint } ) - - --for PointID, Point in pairs( SpawnTemplate.route.points ) do - --Point.x = UnitPoint.x - --Point.y = UnitPoint.y - --Point.alt = nil - --Point.alt_type = nil - --end - - SpawnTemplate.route.points[1].x = UnitPoint.x - SpawnTemplate.route.points[1].y = UnitPoint.y - - if not InnerRadius then - InnerRadius = 10 - end - - if not OuterRadius then - OuterRadius = 50 - end - - -- Apply SpawnFormation - for UnitID = 1, #SpawnTemplate.units do - if InnerRadius == 0 then - SpawnTemplate.units[UnitID].x = UnitPoint.x - SpawnTemplate.units[UnitID].y = UnitPoint.y - else - local CirclePos = routines.getRandPointInCircle( UnitPoint, OuterRadius, InnerRadius ) - SpawnTemplate.units[UnitID].x = CirclePos.x - SpawnTemplate.units[UnitID].y = CirclePos.y - end - self:T( 'SpawnTemplate.units['..UnitID..'].x = ' .. SpawnTemplate.units[UnitID].x .. ', SpawnTemplate.units['..UnitID..'].y = ' .. SpawnTemplate.units[UnitID].y ) - end - - local SpawnPos = routines.getRandPointInCircle( UnitPoint, OuterRadius, InnerRadius ) - local Point = {} - Point.type = "Turning Point" - Point.x = SpawnPos.x - Point.y = SpawnPos.y - Point.action = "Cone" - Point.speed = 5 - - table.insert( SpawnTemplate.route.points, 2, Point ) - - return self:SpawnWithIndex( self.SpawnIndex ) - end - end - end - - return nil -end - ---- Will spawn a Group within a given @{Zone#ZONE}. --- Once the group is spawned within the zone, it will continue on its route. --- The first waypoint (where the group is spawned) is replaced with the zone coordinates. --- @param #SPAWN self --- @param Zone#ZONE Zone The zone where the group is to be spawned. --- @param #number ZoneRandomize (Optional) Set to true if you want to randomize the starting point in the zone. --- @param #number SpawnIndex (Optional) The index which group to spawn within the given zone. --- @return Group#GROUP that was spawned. --- @return #nil when nothing was spawned. -function SPAWN:SpawnInZone( Zone, ZoneRandomize, SpawnIndex ) - self:F( { self.SpawnTemplatePrefix, Zone, ZoneRandomize, SpawnIndex } ) - - if Zone then - - if SpawnIndex then - else - SpawnIndex = self.SpawnIndex + 1 - end - - if self:_GetSpawnIndex( SpawnIndex ) then - - local SpawnTemplate = self.SpawnGroups[self.SpawnIndex].SpawnTemplate - - if SpawnTemplate then - - local ZonePoint - - if ZoneRandomize == true then - ZonePoint = Zone:GetRandomPointVec2() - else - ZonePoint = Zone:GetPointVec2() - end - - SpawnTemplate.route.points[1].x = ZonePoint.x - SpawnTemplate.route.points[1].y = ZonePoint.y - - -- Apply SpawnFormation - for UnitID = 1, #SpawnTemplate.units do - local ZonePointUnit = Zone:GetRandomPointVec2() - SpawnTemplate.units[UnitID].x = ZonePointUnit.x - SpawnTemplate.units[UnitID].y = ZonePointUnit.y - self:T( 'SpawnTemplate.units['..UnitID..'].x = ' .. SpawnTemplate.units[UnitID].x .. ', SpawnTemplate.units['..UnitID..'].y = ' .. SpawnTemplate.units[UnitID].y ) - end - - return self:SpawnWithIndex( self.SpawnIndex ) - end - end - end - - return nil -end - - - - ---- Will spawn a plane group in uncontrolled mode... --- This will be similar to the uncontrolled flag setting in the ME. --- @return #SPAWN self -function SPAWN:UnControlled() - self:F( { self.SpawnTemplatePrefix } ) - - self.SpawnUnControlled = true - - for SpawnGroupID = 1, self.SpawnMaxGroups do - self.SpawnGroups[SpawnGroupID].UnControlled = true - end - - return self -end - - - ---- Will return the SpawnGroupName either with with a specific count number or without any count. --- @param #SPAWN self --- @param #number SpawnIndex Is the number of the Group that is to be spawned. --- @return #string SpawnGroupName -function SPAWN:SpawnGroupName( SpawnIndex ) - self:F( { self.SpawnTemplatePrefix, SpawnIndex } ) - - local SpawnPrefix = self.SpawnTemplatePrefix - if self.SpawnAliasPrefix then - SpawnPrefix = self.SpawnAliasPrefix - end - - if SpawnIndex then - local SpawnName = string.format( '%s#%03d', SpawnPrefix, SpawnIndex ) - self:T( SpawnName ) - return SpawnName - else - self:T( SpawnPrefix ) - return SpawnPrefix - end - -end - ---- Find the first alive group. --- @param #SPAWN self --- @param #number SpawnCursor A number holding the index from where to find the first group from. --- @return Group#GROUP, #number The group found, the new index where the group was found. --- @return #nil, #nil When no group is found, #nil is returned. -function SPAWN:GetFirstAliveGroup( SpawnCursor ) - self:F( { self.SpawnTemplatePrefix, self.SpawnAliasPrefix, SpawnCursor } ) - - for SpawnIndex = 1, self.SpawnCount do - local SpawnGroup = self:GetGroupFromIndex( SpawnIndex ) - if SpawnGroup and SpawnGroup:IsAlive() then - SpawnCursor = SpawnIndex - return SpawnGroup, SpawnCursor - end - end - - return nil, nil -end - - ---- Find the next alive group. --- @param #SPAWN self --- @param #number SpawnCursor A number holding the last found previous index. --- @return Group#GROUP, #number The group found, the new index where the group was found. --- @return #nil, #nil When no group is found, #nil is returned. -function SPAWN:GetNextAliveGroup( SpawnCursor ) - self:F( { self.SpawnTemplatePrefix, self.SpawnAliasPrefix, SpawnCursor } ) - - SpawnCursor = SpawnCursor + 1 - for SpawnIndex = SpawnCursor, self.SpawnCount do - local SpawnGroup = self:GetGroupFromIndex( SpawnIndex ) - if SpawnGroup and SpawnGroup:IsAlive() then - SpawnCursor = SpawnIndex - return SpawnGroup, SpawnCursor - end - end - - return nil, nil -end - ---- Find the last alive group during runtime. -function SPAWN:GetLastAliveGroup() - self:F( { self.SpawnTemplatePrefixself.SpawnAliasPrefix } ) - - self.SpawnIndex = self:_GetLastIndex() - for SpawnIndex = self.SpawnIndex, 1, -1 do - local SpawnGroup = self:GetGroupFromIndex( SpawnIndex ) - if SpawnGroup and SpawnGroup:IsAlive() then - self.SpawnIndex = SpawnIndex - return SpawnGroup - end - end - - self.SpawnIndex = nil - return nil -end - - - ---- Get the group from an index. --- Returns the group from the SpawnGroups list. --- If no index is given, it will return the first group in the list. --- @param #SPAWN self --- @param #number SpawnIndex The index of the group to return. --- @return Group#GROUP -function SPAWN:GetGroupFromIndex( SpawnIndex ) - self:F( { self.SpawnTemplatePrefix, self.SpawnAliasPrefix, SpawnIndex } ) - - if not SpawnIndex then - SpawnIndex = 1 - end - - if self.SpawnGroups and self.SpawnGroups[SpawnIndex] then - local SpawnGroup = self.SpawnGroups[SpawnIndex].Group - return SpawnGroup - else - return nil - end -end - ---- Get the group index from a DCSUnit. --- The method will search for a #-mark, and will return the index behind the #-mark of the DCSUnit. --- It will return nil of no prefix was found. --- @param #SPAWN self --- @param DCSUnit The DCS unit to be searched. --- @return #string The prefix --- @return #nil Nothing found -function SPAWN:_GetGroupIndexFromDCSUnit( DCSUnit ) - self:F( { self.SpawnTemplatePrefix, self.SpawnAliasPrefix, DCSUnit } ) - - if DCSUnit and DCSUnit:getName() then - local IndexString = string.match( DCSUnit:getName(), "#.*-" ):sub( 2, -2 ) - self:T( IndexString ) - - if IndexString then - local Index = tonumber( IndexString ) - self:T( { "Index:", IndexString, Index } ) - return Index - end - end - - return nil -end - ---- Return the prefix of a DCSUnit. --- The method will search for a #-mark, and will return the text before the #-mark. --- It will return nil of no prefix was found. --- @param #SPAWN self --- @param DCSUnit The DCS unit to be searched. --- @return #string The prefix --- @return #nil Nothing found -function SPAWN:_GetPrefixFromDCSUnit( DCSUnit ) - self:F( { self.SpawnTemplatePrefix, self.SpawnAliasPrefix, DCSUnit } ) - - if DCSUnit and DCSUnit:getName() then - local SpawnPrefix = string.match( DCSUnit:getName(), ".*#" ) - if SpawnPrefix then - SpawnPrefix = SpawnPrefix:sub( 1, -2 ) - end - self:T( SpawnPrefix ) - return SpawnPrefix - end - - return nil -end - ---- Return the group within the SpawnGroups collection with input a DCSUnit. -function SPAWN:_GetGroupFromDCSUnit( DCSUnit ) - self:F( { self.SpawnTemplatePrefix, self.SpawnAliasPrefix, DCSUnit } ) - - if DCSUnit then - local SpawnPrefix = self:_GetPrefixFromDCSUnit( DCSUnit ) - - if self.SpawnTemplatePrefix == SpawnPrefix or ( self.SpawnAliasPrefix and self.SpawnAliasPrefix == SpawnPrefix ) then - local SpawnGroupIndex = self:_GetGroupIndexFromDCSUnit( DCSUnit ) - local SpawnGroup = self.SpawnGroups[SpawnGroupIndex].Group - self:T( SpawnGroup ) - return SpawnGroup - end - end - - return nil -end - - ---- Get the index from a given group. --- The function will search the name of the group for a #, and will return the number behind the #-mark. -function SPAWN:GetSpawnIndexFromGroup( SpawnGroup ) - self:F( { self.SpawnTemplatePrefix, self.SpawnAliasPrefix, SpawnGroup } ) - - local IndexString = string.match( SpawnGroup:GetName(), "#.*$" ):sub( 2 ) - local Index = tonumber( IndexString ) - - self:T( IndexString, Index ) - return Index - -end - ---- Return the last maximum index that can be used. -function SPAWN:_GetLastIndex() - self:F( { self.SpawnTemplatePrefix, self.SpawnAliasPrefix } ) - - return self.SpawnMaxGroups -end - ---- Initalize the SpawnGroups collection. -function SPAWN:_InitializeSpawnGroups( SpawnIndex ) - self:F( { self.SpawnTemplatePrefix, self.SpawnAliasPrefix, SpawnIndex } ) - - if not self.SpawnGroups[SpawnIndex] then - self.SpawnGroups[SpawnIndex] = {} - self.SpawnGroups[SpawnIndex].Visible = false - self.SpawnGroups[SpawnIndex].Spawned = false - self.SpawnGroups[SpawnIndex].UnControlled = false - self.SpawnGroups[SpawnIndex].SpawnTime = 0 - - self.SpawnGroups[SpawnIndex].SpawnTemplatePrefix = self.SpawnTemplatePrefix - self.SpawnGroups[SpawnIndex].SpawnTemplate = self:_Prepare( self.SpawnGroups[SpawnIndex].SpawnTemplatePrefix, SpawnIndex ) - end - - self:_RandomizeTemplate( SpawnIndex ) - self:_RandomizeRoute( SpawnIndex ) - --self:_TranslateRotate( SpawnIndex ) - - return self.SpawnGroups[SpawnIndex] -end - - - ---- Gets the CategoryID of the Group with the given SpawnPrefix -function SPAWN:_GetGroupCategoryID( SpawnPrefix ) - local TemplateGroup = Group.getByName( SpawnPrefix ) - - if TemplateGroup then - return TemplateGroup:getCategory() - else - return nil - end -end - ---- Gets the CoalitionID of the Group with the given SpawnPrefix -function SPAWN:_GetGroupCoalitionID( SpawnPrefix ) - local TemplateGroup = Group.getByName( SpawnPrefix ) - - if TemplateGroup then - return TemplateGroup:getCoalition() - else - return nil - end -end - ---- Gets the CountryID of the Group with the given SpawnPrefix -function SPAWN:_GetGroupCountryID( SpawnPrefix ) - self:F( { self.SpawnTemplatePrefix, self.SpawnAliasPrefix, SpawnPrefix } ) - - local TemplateGroup = Group.getByName( SpawnPrefix ) - - if TemplateGroup then - local TemplateUnits = TemplateGroup:getUnits() - return TemplateUnits[1]:getCountry() - else - return nil - end -end - ---- Gets the Group Template from the ME environment definition. --- This method used the @{DATABASE} object, which contains ALL initial and new spawned object in MOOSE. --- @param #SPAWN self --- @param #string SpawnTemplatePrefix --- @return @SPAWN self -function SPAWN:_GetTemplate( SpawnTemplatePrefix ) - self:F( { self.SpawnTemplatePrefix, self.SpawnAliasPrefix, SpawnTemplatePrefix } ) - - local SpawnTemplate = nil - - SpawnTemplate = routines.utils.deepCopy( _DATABASE.Templates.Groups[SpawnTemplatePrefix].Template ) - - if SpawnTemplate == nil then - error( 'No Template returned for SpawnTemplatePrefix = ' .. SpawnTemplatePrefix ) - end - - SpawnTemplate.SpawnCoalitionID = self:_GetGroupCoalitionID( SpawnTemplatePrefix ) - SpawnTemplate.SpawnCategoryID = self:_GetGroupCategoryID( SpawnTemplatePrefix ) - SpawnTemplate.SpawnCountryID = self:_GetGroupCountryID( SpawnTemplatePrefix ) - - self:T( { SpawnTemplate } ) - return SpawnTemplate -end - ---- Prepares the new Group Template. --- @param #SPAWN self --- @param #string SpawnTemplatePrefix --- @param #number SpawnIndex --- @return #SPAWN self -function SPAWN:_Prepare( SpawnTemplatePrefix, SpawnIndex ) - self:F( { self.SpawnTemplatePrefix, self.SpawnAliasPrefix } ) - - local SpawnTemplate = self:_GetTemplate( SpawnTemplatePrefix ) - SpawnTemplate.name = self:SpawnGroupName( SpawnIndex ) - - SpawnTemplate.groupId = nil - SpawnTemplate.lateActivation = false - - if SpawnTemplate.SpawnCategoryID == Group.Category.GROUND then - self:T( "For ground units, visible needs to be false..." ) - SpawnTemplate.visible = false - end - - if SpawnTemplate.SpawnCategoryID == Group.Category.HELICOPTER or SpawnTemplate.SpawnCategoryID == Group.Category.AIRPLANE then - SpawnTemplate.uncontrolled = false - end - - for UnitID = 1, #SpawnTemplate.units do - SpawnTemplate.units[UnitID].name = string.format( SpawnTemplate.name .. '-%02d', UnitID ) - SpawnTemplate.units[UnitID].unitId = nil - SpawnTemplate.units[UnitID].x = SpawnTemplate.route.points[1].x - SpawnTemplate.units[UnitID].y = SpawnTemplate.route.points[1].y - end - - self:T( { "Template:", SpawnTemplate } ) - return SpawnTemplate - -end - ---- Private method randomizing the routes. --- @param #SPAWN self --- @param #number SpawnIndex The index of the group to be spawned. --- @return #SPAWN -function SPAWN:_RandomizeRoute( SpawnIndex ) - self:F( { self.SpawnTemplatePrefix, SpawnIndex, self.SpawnRandomizeRoute, self.SpawnRandomizeRouteStartPoint, self.SpawnRandomizeRouteEndPoint, self.SpawnRandomizeRouteRadius } ) - - if self.SpawnRandomizeRoute then - local SpawnTemplate = self.SpawnGroups[SpawnIndex].SpawnTemplate - local RouteCount = #SpawnTemplate.route.points - - for t = self.SpawnRandomizeRouteStartPoint + 1, ( RouteCount - self.SpawnRandomizeRouteEndPoint ) do - SpawnTemplate.route.points[t].x = SpawnTemplate.route.points[t].x + math.random( self.SpawnRandomizeRouteRadius * -1, self.SpawnRandomizeRouteRadius ) - SpawnTemplate.route.points[t].y = SpawnTemplate.route.points[t].y + math.random( self.SpawnRandomizeRouteRadius * -1, self.SpawnRandomizeRouteRadius ) - -- TODO: manage altitude for airborne units ... - SpawnTemplate.route.points[t].alt = nil - --SpawnGroup.route.points[t].alt_type = nil - self:T( 'SpawnTemplate.route.points[' .. t .. '].x = ' .. SpawnTemplate.route.points[t].x .. ', SpawnTemplate.route.points[' .. t .. '].y = ' .. SpawnTemplate.route.points[t].y ) - end - end - - return self -end - ---- Private method that randomizes the template of the group. --- @param #SPAWN self --- @param #number SpawnIndex --- @return #SPAWN self -function SPAWN:_RandomizeTemplate( SpawnIndex ) - self:F( { self.SpawnTemplatePrefix, SpawnIndex } ) - - if self.SpawnRandomizeTemplate then - self.SpawnGroups[SpawnIndex].SpawnTemplatePrefix = self.SpawnTemplatePrefixTable[ math.random( 1, #self.SpawnTemplatePrefixTable ) ] - self.SpawnGroups[SpawnIndex].SpawnTemplate = self:_Prepare( self.SpawnGroups[SpawnIndex].SpawnTemplatePrefix, SpawnIndex ) - self.SpawnGroups[SpawnIndex].SpawnTemplate.route = routines.utils.deepCopy( self.SpawnTemplate.route ) - self.SpawnGroups[SpawnIndex].SpawnTemplate.x = self.SpawnTemplate.x - self.SpawnGroups[SpawnIndex].SpawnTemplate.y = self.SpawnTemplate.y - self.SpawnGroups[SpawnIndex].SpawnTemplate.start_time = self.SpawnTemplate.start_time - for UnitID = 1, #self.SpawnGroups[SpawnIndex].SpawnTemplate.units do - self.SpawnGroups[SpawnIndex].SpawnTemplate.units[UnitID].heading = self.SpawnTemplate.units[1].heading - end - end - - self:_RandomizeRoute( SpawnIndex ) - - return self -end - -function SPAWN:_TranslateRotate( SpawnIndex, SpawnRootX, SpawnRootY, SpawnX, SpawnY, SpawnAngle ) - self:F( { self.SpawnTemplatePrefix, SpawnIndex, SpawnRootX, SpawnRootY, SpawnX, SpawnY, SpawnAngle } ) - - -- Translate - local TranslatedX = SpawnX - local TranslatedY = SpawnY - - -- Rotate - -- From Wikipedia: https://en.wikipedia.org/wiki/Rotation_matrix#Common_rotations - -- x' = x \cos \theta - y \sin \theta\ - -- y' = x \sin \theta + y \cos \theta\ - local RotatedX = - TranslatedX * math.cos( math.rad( SpawnAngle ) ) - + TranslatedY * math.sin( math.rad( SpawnAngle ) ) - local RotatedY = TranslatedX * math.sin( math.rad( SpawnAngle ) ) - + TranslatedY * math.cos( math.rad( SpawnAngle ) ) - - -- Assign - self.SpawnGroups[SpawnIndex].SpawnTemplate.x = SpawnRootX - RotatedX - self.SpawnGroups[SpawnIndex].SpawnTemplate.y = SpawnRootY + RotatedY - - - local SpawnUnitCount = table.getn( self.SpawnGroups[SpawnIndex].SpawnTemplate.units ) - for u = 1, SpawnUnitCount do - - -- Translate - local TranslatedX = SpawnX - local TranslatedY = SpawnY - 10 * ( u - 1 ) - - -- Rotate - local RotatedX = - TranslatedX * math.cos( math.rad( SpawnAngle ) ) - + TranslatedY * math.sin( math.rad( SpawnAngle ) ) - local RotatedY = TranslatedX * math.sin( math.rad( SpawnAngle ) ) - + TranslatedY * math.cos( math.rad( SpawnAngle ) ) - - -- Assign - self.SpawnGroups[SpawnIndex].SpawnTemplate.units[u].x = SpawnRootX - RotatedX - self.SpawnGroups[SpawnIndex].SpawnTemplate.units[u].y = SpawnRootY + RotatedY - self.SpawnGroups[SpawnIndex].SpawnTemplate.units[u].heading = self.SpawnGroups[SpawnIndex].SpawnTemplate.units[u].heading + math.rad( SpawnAngle ) - end - - return self -end - ---- Get the next index of the groups to be spawned. This function is complicated, as it is used at several spaces. -function SPAWN:_GetSpawnIndex( SpawnIndex ) - self:F( { self.SpawnTemplatePrefix, SpawnIndex, self.SpawnMaxGroups, self.SpawnMaxUnitsAlive, self.AliveUnits, #self.SpawnTemplate.units } ) - - - if ( self.SpawnMaxGroups == 0 ) or ( SpawnIndex <= self.SpawnMaxGroups ) then - if ( self.SpawnMaxUnitsAlive == 0 ) or ( self.AliveUnits < self.SpawnMaxUnitsAlive * #self.SpawnTemplate.units ) or self.UnControlled then - if SpawnIndex and SpawnIndex >= self.SpawnCount + 1 then - self.SpawnCount = self.SpawnCount + 1 - SpawnIndex = self.SpawnCount - end - self.SpawnIndex = SpawnIndex - if not self.SpawnGroups[self.SpawnIndex] then - self:_InitializeSpawnGroups( self.SpawnIndex ) - end - else - return nil - end - else - return nil - end - - return self.SpawnIndex -end - - --- TODO Need to delete this... _DATABASE does this now ... -function SPAWN:_OnBirth( event ) - - if timer.getTime0() < timer.getAbsTime() then -- dont need to add units spawned in at the start of the mission if mist is loaded in init line - if event.initiator and event.initiator:getName() then - local EventPrefix = self:_GetPrefixFromDCSUnit( event.initiator ) - if EventPrefix == self.SpawnTemplatePrefix or ( self.SpawnAliasPrefix and EventPrefix == self.SpawnAliasPrefix ) then - self:T( { "Birth event: " .. event.initiator:getName(), event } ) - --MessageToAll( "Mission command: unit " .. SpawnTemplatePrefix .. " spawned." , 5, EventPrefix .. '/Event') - self.AliveUnits = self.AliveUnits + 1 - self:T( "Alive Units: " .. self.AliveUnits ) - end - end - end - -end - ---- Obscolete --- @todo Need to delete this... _DATABASE does this now ... -function SPAWN:_OnDeadOrCrash( event ) - self:F( self.SpawnTemplatePrefix, event ) - - if event.initiator and event.initiator:getName() then - local EventPrefix = self:_GetPrefixFromDCSUnit( event.initiator ) - if EventPrefix == self.SpawnTemplatePrefix or ( self.SpawnAliasPrefix and EventPrefix == self.SpawnAliasPrefix ) then - self:T( { "Dead event: " .. event.initiator:getName(), event } ) --- local DestroyedUnit = Unit.getByName( EventPrefix ) --- if DestroyedUnit and DestroyedUnit.getLife() <= 1.0 then - --MessageToAll( "Mission command: unit " .. SpawnTemplatePrefix .. " crashed." , 5, EventPrefix .. '/Event') - self.AliveUnits = self.AliveUnits - 1 - self:T( "Alive Units: " .. self.AliveUnits ) --- end - end - end -end - ---- Will detect AIR Units taking off... When the event takes place, the spawned Group is registered as airborne... --- This is needed to ensure that Re-SPAWNing only is done for landed AIR Groups. --- @todo Need to test for AIR Groups only... -function SPAWN:_OnTakeOff( event ) - self:F( self.SpawnTemplatePrefix, event ) - - if event.initiator and event.initiator:getName() then - local SpawnGroup = self:_GetGroupFromDCSUnit( event.initiator ) - if SpawnGroup then - self:T( { "TakeOff event: " .. event.initiator:getName(), event } ) - self:T( "self.Landed = false" ) - self.Landed = false - end - end -end - ---- Will detect AIR Units landing... When the event takes place, the spawned Group is registered as landed. --- This is needed to ensure that Re-SPAWNing is only done for landed AIR Groups. --- @todo Need to test for AIR Groups only... -function SPAWN:_OnLand( event ) - self:F( self.SpawnTemplatePrefix, event ) - - local SpawnUnit = event.initiator - if SpawnUnit and SpawnUnit:isExist() and Object.getCategory(SpawnUnit) == Object.Category.UNIT then - local SpawnGroup = self:_GetGroupFromDCSUnit( SpawnUnit ) - if SpawnGroup then - self:T( { "Landed event:" .. SpawnUnit:getName(), event } ) - self.Landed = true - self:T( "self.Landed = true" ) - if self.Landed and self.RepeatOnLanding then - local SpawnGroupIndex = self:GetSpawnIndexFromGroup( SpawnGroup ) - self:T( { "Landed:", "ReSpawn:", SpawnGroup:GetName(), SpawnGroupIndex } ) - self:ReSpawn( SpawnGroupIndex ) - end - end - end -end - ---- Will detect AIR Units shutting down their engines ... --- When the event takes place, and the method @{RepeatOnEngineShutDown} was called, the spawned Group will Re-SPAWN. --- But only when the Unit was registered to have landed. --- @param #SPAWN self --- @see _OnTakeOff --- @see _OnLand --- @todo Need to test for AIR Groups only... -function SPAWN:_OnEngineShutDown( event ) - self:F( self.SpawnTemplatePrefix, event ) - - local SpawnUnit = event.initiator - if SpawnUnit and SpawnUnit:isExist() and Object.getCategory(SpawnUnit) == Object.Category.UNIT then - local SpawnGroup = self:_GetGroupFromDCSUnit( SpawnUnit ) - if SpawnGroup then - self:T( { "EngineShutDown event: " .. SpawnUnit:getName(), event } ) - if self.Landed and self.RepeatOnEngineShutDown then - local SpawnGroupIndex = self:GetSpawnIndexFromGroup( SpawnGroup ) - self:T( { "EngineShutDown: ", "ReSpawn:", SpawnGroup:GetName(), SpawnGroupIndex } ) - self:ReSpawn( SpawnGroupIndex ) - end - end - end -end - ---- This function is called automatically by the Spawning scheduler. --- It is the internal worker method SPAWNing new Groups on the defined time intervals. -function SPAWN:_Scheduler() - self:F( { "_Scheduler", self.SpawnTemplatePrefix, self.SpawnAliasPrefix, self.SpawnIndex, self.SpawnMaxGroups, self.SpawnMaxUnitsAlive } ) - - -- Validate if there are still groups left in the batch... - self:Spawn() - - return true -end - -function SPAWN:_SpawnCleanUpScheduler() - self:F( { "CleanUp Scheduler:", self.SpawnTemplatePrefix } ) - - local SpawnCursor - local SpawnGroup, SpawnCursor = self:GetFirstAliveGroup( SpawnCursor ) - - self:T( { "CleanUp Scheduler:", SpawnGroup } ) - - while SpawnGroup do - - if SpawnGroup:AllOnGround() and SpawnGroup:GetMaxVelocity() < 1 then - if not self.SpawnCleanUpTimeStamps[SpawnGroup:GetName()] then - self.SpawnCleanUpTimeStamps[SpawnGroup:GetName()] = timer.getTime() - else - if self.SpawnCleanUpTimeStamps[SpawnGroup:GetName()] + self.SpawnCleanUpInterval < timer.getTime() then - self:T( { "CleanUp Scheduler:", "Cleaning:", SpawnGroup } ) - SpawnGroup:Destroy() - end - end - else - self.SpawnCleanUpTimeStamps[SpawnGroup:GetName()] = nil - end - - SpawnGroup, SpawnCursor = self:GetNextAliveGroup( SpawnCursor ) - - self:T( { "CleanUp Scheduler:", SpawnGroup } ) - - end - - return true -- Repeat - -end ---- Limit the simultaneous movement of Groups within a running Mission. --- This module is defined to improve the performance in missions, and to bring additional realism for GROUND vehicles. --- Performance: If in a DCSRTE there are a lot of moving GROUND units, then in a multi player mission, this WILL create lag if --- the main DCS execution core of your CPU is fully utilized. So, this class will limit the amount of simultaneous moving GROUND units --- on defined intervals (currently every minute). --- @module MOVEMENT - -Include.File( "Routines" ) - ---- the MOVEMENT class --- @type -MOVEMENT = { - ClassName = "MOVEMENT", -} - ---- Creates the main object which is handling the GROUND forces movement. --- @param table{string,...}|string MovePrefixes is a table of the Prefixes (names) of the GROUND Groups that need to be controlled by the MOVEMENT Object. --- @param number MoveMaximum is a number that defines the maximum amount of GROUND Units to be moving during one minute. --- @return MOVEMENT --- @usage --- -- Limit the amount of simultaneous moving units on the ground to prevent lag. --- Movement_US_Platoons = MOVEMENT:New( { 'US Tank Platoon Left', 'US Tank Platoon Middle', 'US Tank Platoon Right', 'US CH-47D Troops' }, 15 ) - -function MOVEMENT:New( MovePrefixes, MoveMaximum ) - local self = BASE:Inherit( self, BASE:New() ) - self:F( { MovePrefixes, MoveMaximum } ) - - if type( MovePrefixes ) == 'table' then - self.MovePrefixes = MovePrefixes - else - self.MovePrefixes = { MovePrefixes } - end - self.MoveCount = 0 -- The internal counter of the amount of Moveing the has happened since MoveStart. - self.MoveMaximum = MoveMaximum -- Contains the Maximum amount of units that are allowed to move... - self.AliveUnits = 0 -- Contains the counter how many units are currently alive - self.MoveUnits = {} -- Reflects if the Moving for this MovePrefixes is going to be scheduled or not. - - _EVENTDISPATCHER:OnBirth( self.OnBirth, self ) - --- self:AddEvent( world.event.S_EVENT_BIRTH, self.OnBirth ) --- --- self:EnableEvents() - - self:ScheduleStart() - - return self -end - ---- Call this function to start the MOVEMENT scheduling. -function MOVEMENT:ScheduleStart() - self:F() - --self.MoveFunction = routines.scheduleFunction( self._Scheduler, { self }, timer.getTime() + 1, 120 ) - self.MoveFunction = SCHEDULER:New( self, self._Scheduler, {}, 1, 120 ) -end - ---- Call this function to stop the MOVEMENT scheduling. --- @todo need to implement it ... Forgot. -function MOVEMENT:ScheduleStop() - self:F() - -end - ---- Captures the birth events when new Units were spawned. --- @todo This method should become obsolete. The new @{DATABASE} class will handle the collection administration. -function MOVEMENT:OnBirth( Event ) - self:F( { Event } ) - - if timer.getTime0() < timer.getAbsTime() then -- dont need to add units spawned in at the start of the mission if mist is loaded in init line - if Event.IniDCSUnit then - self:T( "Birth object : " .. Event.IniDCSUnitName ) - if Event.IniDCSGroup and Event.IniDCSGroup:isExist() then - for MovePrefixID, MovePrefix in pairs( self.MovePrefixes ) do - if string.find( Event.IniDCSUnitName, MovePrefix, 1, true ) then - self.AliveUnits = self.AliveUnits + 1 - self.MoveUnits[Event.IniDCSUnitName] = Event.IniDCSGroupName - self:T( self.AliveUnits ) - end - end - end - end - _EVENTDISPATCHER:OnCrashForUnit( Event.IniDCSUnitName, self.OnDeadOrCrash, self ) - _EVENTDISPATCHER:OnDeadForUnit( Event.IniDCSUnitName, self.OnDeadOrCrash, self ) - end - -end - ---- Captures the Dead or Crash events when Units crash or are destroyed. --- @todo This method should become obsolete. The new @{DATABASE} class will handle the collection administration. -function MOVEMENT:OnDeadOrCrash( Event ) - self:F( { Event } ) - - if Event.IniDCSUnit then - self:T( "Dead object : " .. Event.IniDCSUnitName ) - for MovePrefixID, MovePrefix in pairs( self.MovePrefixes ) do - if string.find( Event.IniDCSUnitName, MovePrefix, 1, true ) then - self.AliveUnits = self.AliveUnits - 1 - self.MoveUnits[Event.IniDCSUnitName] = nil - self:T( self.AliveUnits ) - end - end - end -end - ---- This function is called automatically by the MOVEMENT scheduler. A new function is scheduled when MoveScheduled is true. -function MOVEMENT:_Scheduler() - self:F( { self.MovePrefixes, self.MoveMaximum, self.AliveUnits, self.MovementGroups } ) - - if self.AliveUnits > 0 then - local MoveProbability = ( self.MoveMaximum * 100 ) / self.AliveUnits - self:T( 'Move Probability = ' .. MoveProbability ) - - for MovementUnitName, MovementGroupName in pairs( self.MoveUnits ) do - local MovementGroup = Group.getByName( MovementGroupName ) - if MovementGroup and MovementGroup:isExist() then - local MoveOrStop = math.random( 1, 100 ) - self:T( 'MoveOrStop = ' .. MoveOrStop ) - if MoveOrStop <= MoveProbability then - self:T( 'Group continues moving = ' .. MovementGroupName ) - trigger.action.groupContinueMoving( MovementGroup ) - else - self:T( 'Group stops moving = ' .. MovementGroupName ) - trigger.action.groupStopMoving( MovementGroup ) - end - else - self.MoveUnits[MovementUnitName] = nil - end - end - end - return true -end ---- Provides defensive behaviour to a set of SAM sites within a running Mission. --- @module Sead --- @author to be searched on the forum --- @author (co) Flightcontrol (Modified and enriched with functionality) - -Include.File( "Routines" ) -Include.File( "Event" ) -Include.File( "Base" ) -Include.File( "Mission" ) -Include.File( "Client" ) -Include.File( "Task" ) - ---- The SEAD class --- @type SEAD --- @extends Base#BASE -SEAD = { - ClassName = "SEAD", - TargetSkill = { - Average = { Evade = 50, DelayOff = { 10, 25 }, DelayOn = { 10, 30 } } , - Good = { Evade = 30, DelayOff = { 8, 20 }, DelayOn = { 20, 40 } } , - High = { Evade = 15, DelayOff = { 5, 17 }, DelayOn = { 30, 50 } } , - Excellent = { Evade = 10, DelayOff = { 3, 10 }, DelayOn = { 30, 60 } } - }, - SEADGroupPrefixes = {} -} - ---- Creates the main object which is handling defensive actions for SA sites or moving SA vehicles. --- When an anti radiation missile is fired (KH-58, KH-31P, KH-31A, KH-25MPU, HARM missiles), the SA will shut down their radars and will take evasive actions... --- Chances are big that the missile will miss. --- @param table{string,...}|string SEADGroupPrefixes which is a table of Prefixes of the SA Groups in the DCSRTE on which evasive actions need to be taken. --- @return SEAD --- @usage --- -- CCCP SEAD Defenses --- -- Defends the Russian SA installations from SEAD attacks. --- SEAD_RU_SAM_Defenses = SEAD:New( { 'RU SA-6 Kub', 'RU SA-6 Defenses', 'RU MI-26 Troops', 'RU Attack Gori' } ) -function SEAD:New( SEADGroupPrefixes ) - local self = BASE:Inherit( self, BASE:New() ) - self:F( SEADGroupPrefixes ) - if type( SEADGroupPrefixes ) == 'table' then - for SEADGroupPrefixID, SEADGroupPrefix in pairs( SEADGroupPrefixes ) do - self.SEADGroupPrefixes[SEADGroupPrefix] = SEADGroupPrefix - end - else - self.SEADGroupNames[SEADGroupPrefixes] = SEADGroupPrefixes - end - _EVENTDISPATCHER:OnShot( self.EventShot, self ) - - return self -end - ---- Detects if an SA site was shot with an anti radiation missile. In this case, take evasive actions based on the skill level set within the ME. --- @see SEAD -function SEAD:EventShot( Event ) - self:F( { Event } ) - - local SEADUnit = Event.IniDCSUnit - local SEADUnitName = Event.IniDCSUnitName - local SEADWeapon = Event.Weapon -- Identify the weapon fired - local SEADWeaponName = Event.WeaponName -- return weapon type - --trigger.action.outText( string.format("Alerte, depart missile " ..string.format(SEADWeaponName)), 20) --debug message - -- Start of the 2nd loop - self:T( "Missile Launched = " .. SEADWeaponName ) - if SEADWeaponName == "KH-58" or SEADWeaponName == "KH-25MPU" or SEADWeaponName == "AGM-88" or SEADWeaponName == "KH-31A" or SEADWeaponName == "KH-31P" then -- Check if the missile is a SEAD - local _evade = math.random (1,100) -- random number for chance of evading action - local _targetMim = Event.Weapon:getTarget() -- Identify target - local _targetMimname = Unit.getName(_targetMim) - local _targetMimgroup = Unit.getGroup(Weapon.getTarget(SEADWeapon)) - local _targetMimgroupName = _targetMimgroup:getName() - local _targetMimcont= _targetMimgroup:getController() - local _targetskill = _DATABASE.Templates.Units[_targetMimname].Template.skill - self:T( self.SEADGroupPrefixes ) - self:T( _targetMimgroupName ) - local SEADGroupFound = false - for SEADGroupPrefixID, SEADGroupPrefix in pairs( self.SEADGroupPrefixes ) do - if string.find( _targetMimgroupName, SEADGroupPrefix, 1, true ) then - SEADGroupFound = true - self:T( 'Group Found' ) - break - end - end - if SEADGroupFound == true then - if _targetskill == "Random" then -- when skill is random, choose a skill - local Skills = { "Average", "Good", "High", "Excellent" } - _targetskill = Skills[ math.random(1,4) ] - end - self:T( _targetskill ) -- debug message for skill check - if self.TargetSkill[_targetskill] then - if (_evade > self.TargetSkill[_targetskill].Evade) then - self:T( string.format("Evading, target skill " ..string.format(_targetskill)) ) --debug message - local _targetMim = Weapon.getTarget(SEADWeapon) - local _targetMimname = Unit.getName(_targetMim) - local _targetMimgroup = Unit.getGroup(Weapon.getTarget(SEADWeapon)) - local _targetMimcont= _targetMimgroup:getController() - routines.groupRandomDistSelf(_targetMimgroup,300,'Diamond',250,20) -- move randomly - local SuppressedGroups1 = {} -- unit suppressed radar off for a random time - local function SuppressionEnd1(id) - id.ctrl:setOption(AI.Option.Ground.id.ALARM_STATE,AI.Option.Ground.val.ALARM_STATE.GREEN) - SuppressedGroups1[id.groupName] = nil - end - local id = { - groupName = _targetMimgroup, - ctrl = _targetMimcont - } - local delay1 = math.random(self.TargetSkill[_targetskill].DelayOff[1], self.TargetSkill[_targetskill].DelayOff[2]) - if SuppressedGroups1[id.groupName] == nil then - SuppressedGroups1[id.groupName] = { - SuppressionEndTime1 = timer.getTime() + delay1, - SuppressionEndN1 = SuppressionEndCounter1 --Store instance of SuppressionEnd() scheduled function - } - Controller.setOption(_targetMimcont, AI.Option.Ground.id.ALARM_STATE,AI.Option.Ground.val.ALARM_STATE.GREEN) - timer.scheduleFunction(SuppressionEnd1, id, SuppressedGroups1[id.groupName].SuppressionEndTime1) --Schedule the SuppressionEnd() function - --trigger.action.outText( string.format("Radar Off " ..string.format(delay1)), 20) - end - - local SuppressedGroups = {} - local function SuppressionEnd(id) - id.ctrl:setOption(AI.Option.Ground.id.ALARM_STATE,AI.Option.Ground.val.ALARM_STATE.RED) - SuppressedGroups[id.groupName] = nil - end - local id = { - groupName = _targetMimgroup, - ctrl = _targetMimcont - } - local delay = math.random(self.TargetSkill[_targetskill].DelayOn[1], self.TargetSkill[_targetskill].DelayOn[2]) - if SuppressedGroups[id.groupName] == nil then - SuppressedGroups[id.groupName] = { - SuppressionEndTime = timer.getTime() + delay, - SuppressionEndN = SuppressionEndCounter --Store instance of SuppressionEnd() scheduled function - } - timer.scheduleFunction(SuppressionEnd, id, SuppressedGroups[id.groupName].SuppressionEndTime) --Schedule the SuppressionEnd() function - --trigger.action.outText( string.format("Radar On " ..string.format(delay)), 20) - end - end - end - end - end -end ---- Taking the lead of AI escorting your flight. --- --- @{#ESCORT} class --- ================ --- The @{#ESCORT} class allows you to interact with escorting AI on your flight and take the lead. --- Each escorting group can be commanded with a whole set of radio commands (radio menu in your flight, and then F10). --- --- The radio commands will vary according the category of the group. The richest set of commands are with Helicopters and AirPlanes. --- Ships and Ground troops will have a more limited set, but they can provide support through the bombing of targets designated by the other escorts. --- --- RADIO MENUs that can be created: --- ================================ --- Find a summary below of the current available commands: --- --- Navigation ...: --- --------------- --- Escort group navigation functions: --- --- * **"Join-Up and Follow at x meters":** The escort group fill follow you at about x meters, and they will follow you. --- * **"Flare":** Provides menu commands to let the escort group shoot a flare in the air in a color. --- * **"Smoke":** Provides menu commands to let the escort group smoke the air in a color. Note that smoking is only available for ground and naval troops. --- --- Hold position ...: --- ------------------ --- Escort group navigation functions: --- --- * **"At current location":** Stops the escort group and they will hover 30 meters above the ground at the position they stopped. --- * **"At client location":** Stops the escort group and they will hover 30 meters above the ground at the position they stopped. --- --- Report targets ...: --- ------------------- --- Report targets will make the escort group to report any target that it identifies within a 8km range. Any detected target can be attacked using the 4. Attack nearby targets function. (see below). --- --- * **"Report now":** Will report the current detected targets. --- * **"Report targets on":** Will make the escort group to report detected targets and will fill the "Attack nearby targets" menu list. --- * **"Report targets off":** Will stop detecting targets. --- --- Scan targets ...: --- ----------------- --- Menu items to pop-up the escort group for target scanning. After scanning, the escort group will resume with the mission or defined task. --- --- * **"Scan targets 30 seconds":** Scan 30 seconds for targets. --- * **"Scan targets 60 seconds":** Scan 60 seconds for targets. --- --- Attack targets ...: --- ------------------- --- This menu item will list all detected targets within a 15km range. Depending on the level of detection (known/unknown) and visuality, the targets type will also be listed. --- --- Request assistance from ...: --- ---------------------------- --- This menu item will list all detected targets within a 15km range, as with the menu item **Attack Targets**. --- This menu item allows to request attack support from other escorts supporting the current client group. --- eg. the function allows a player to request support from the Ship escort to attack a target identified by the Plane escort with its Tomahawk missiles. --- eg. the function allows a player to request support from other Planes escorting to bomb the unit with illumination missiles or bombs, so that the main plane escort can attack the area. --- --- ROE ...: --- -------- --- Sets the Rules of Engagement (ROE) of the escort group when in flight. --- --- * **"Hold Fire":** The escort group will hold fire. --- * **"Return Fire":** The escort group will return fire. --- * **"Open Fire":** The escort group will open fire on designated targets. --- * **"Weapon Free":** The escort group will engage with any target. --- --- Evasion ...: --- ------------ --- Will define the evasion techniques that the escort group will perform during flight or combat. --- --- * **"Fight until death":** The escort group will have no reaction to threats. --- * **"Use flares, chaff and jammers":** The escort group will use passive defense using flares and jammers. No evasive manoeuvres are executed. --- * **"Evade enemy fire":** The rescort group will evade enemy fire before firing. --- * **"Go below radar and evade fire":** The escort group will perform evasive vertical manoeuvres. --- --- Resume Mission ...: --- ------------------- --- Escort groups can have their own mission. This menu item will allow the escort group to resume their Mission from a given waypoint. --- Note that this is really fantastic, as you now have the dynamic of taking control of the escort groups, and allowing them to resume their path or mission. --- --- ESCORT construction methods. --- ============================ --- Create a new SPAWN object with the @{#ESCORT.New} method: --- --- * @{#ESCORT.New}: Creates a new ESCORT object from a @{Group#GROUP} for a @{Client#CLIENT}, with an optional briefing text. --- --- ESCORT initialization methods. --- ============================== --- The following menus are created within the RADIO MENU of an active unit hosted by a player: --- --- * @{#ESCORT.MenuFollowAt}: Creates a menu to make the escort follow the client. --- * @{#ESCORT.MenuHoldAtEscortPosition}: Creates a menu to hold the escort at its current position. --- * @{#ESCORT.MenuHoldAtLeaderPosition}: Creates a menu to hold the escort at the client position. --- * @{#ESCORT.MenuScanForTargets}: Creates a menu so that the escort scans targets. --- * @{#ESCORT.MenuFlare}: Creates a menu to disperse flares. --- * @{#ESCORT.MenuSmoke}: Creates a menu to disparse smoke. --- * @{#ESCORT.MenuReportTargets}: Creates a menu so that the escort reports targets. --- * @{#ESCORT.MenuReportPosition}: Creates a menu so that the escort reports its current position from bullseye. --- * @{#ESCORT.MenuAssistedAttack: Creates a menu so that the escort supportes assisted attack from other escorts with the client. --- * @{#ESCORT.MenuROE: Creates a menu structure to set the rules of engagement of the escort. --- * @{#ESCORT.MenuEvasion: Creates a menu structure to set the evasion techniques when the escort is under threat. --- * @{#ESCORT.MenuResumeMission}: Creates a menu structure so that the escort can resume from a waypoint. --- --- @module Escort --- @author FlightControl - -Include.File( "Routines" ) -Include.File( "Base" ) -Include.File( "Database" ) -Include.File( "Group" ) -Include.File( "Zone" ) - ---- --- @type ESCORT --- @extends Base#BASE --- @field Client#CLIENT EscortClient --- @field Group#GROUP EscortGroup --- @field #string EscortName --- @field #ESCORT.MODE EscortMode The mode the escort is in. --- @field #number FollowScheduler The id of the _FollowScheduler function. --- @field #boolean ReportTargets If true, nearby targets are reported. --- @Field DCSTypes#AI.Option.Air.val.ROE OptionROE Which ROE is set to the EscortGroup. --- @field DCSTypes#AI.Option.Air.val.REACTION_ON_THREAT OptionReactionOnThreat Which REACTION_ON_THREAT is set to the EscortGroup. --- @field Menu#MENU_CLIENT EscortMenuResumeMission -ESCORT = { - ClassName = "ESCORT", - EscortName = nil, -- The Escort Name - EscortClient = nil, - EscortGroup = nil, - EscortMode = nil, - MODE = { - FOLLOW = 1, - MISSION = 2, - }, - Targets = {}, -- The identified targets - FollowScheduler = nil, - ReportTargets = true, - OptionROE = AI.Option.Air.val.ROE.OPEN_FIRE, - OptionReactionOnThreat = AI.Option.Air.val.REACTION_ON_THREAT.ALLOW_ABORT_MISSION, - TaskPoints = {} -} - ---- ESCORT.Mode class --- @type ESCORT.MODE --- @field #number FOLLOW --- @field #number MISSION - ---- MENUPARAM type --- @type MENUPARAM --- @field #ESCORT ParamSelf --- @field #Distance ParamDistance --- @field #function ParamFunction --- @field #string ParamMessage - ---- ESCORT class constructor for an AI group --- @param #ESCORT self --- @param Client#CLIENT EscortClient The client escorted by the EscortGroup. --- @param Group#GROUP EscortGroup The group AI escorting the EscortClient. --- @param #string EscortName Name of the escort. --- @return #ESCORT self -function ESCORT:New( EscortClient, EscortGroup, EscortName, EscortBriefing ) - local self = BASE:Inherit( self, BASE:New() ) - self:F( { EscortClient, EscortGroup, EscortName } ) - - self.EscortClient = EscortClient -- Client#CLIENT - self.EscortGroup = EscortGroup -- Group#GROUP - self.EscortName = EscortName - self.EscortBriefing = EscortBriefing - - self:T( EscortGroup:GetClassNameAndID() ) - - -- Set EscortGroup known at EscortClient. - if not self.EscortClient._EscortGroups then - self.EscortClient._EscortGroups = {} - end - - if not self.EscortClient._EscortGroups[EscortGroup:GetName()] then - self.EscortClient._EscortGroups[EscortGroup:GetName()] = {} - self.EscortClient._EscortGroups[EscortGroup:GetName()].EscortGroup = self.EscortGroup - self.EscortClient._EscortGroups[EscortGroup:GetName()].EscortName = self.EscortName - self.EscortClient._EscortGroups[EscortGroup:GetName()].Targets = {} - self.EscortMode = ESCORT.MODE.FOLLOW - end - - - self.EscortMenu = MENU_CLIENT:New( self.EscortClient, self.EscortName ) - - self.EscortGroup:WayPointInitialize(1) - - self.EscortGroup:OptionROTVertical() - self.EscortGroup:OptionROEOpenFire() - - EscortGroup:MessageToClient( EscortGroup:GetCategoryName() .. " '" .. EscortName .. "' (" .. EscortGroup:GetCallsign() .. ") reporting! " .. - "We're escorting your flight. " .. - "Use the Radio Menu and F10 and use the options under + " .. EscortName .. "\n", - 60, EscortClient - ) - - return self -end - - ---- Defines the default menus --- @param #ESCORT self --- @return #ESCORT -function ESCORT:Menus() - self:F() - - self:MenuFollowAt( 100 ) - self:MenuFollowAt( 200 ) - self:MenuFollowAt( 300 ) - self:MenuFollowAt( 400 ) - - self:MenuScanForTargets( 100, 60 ) - - self:MenuHoldAtEscortPosition( 30 ) - self:MenuHoldAtLeaderPosition( 30 ) - - self:MenuFlare() - self:MenuSmoke() - - self:MenuReportTargets( 60 ) - self:MenuAssistedAttack() - self:MenuROE() - self:MenuEvasion() - self:MenuResumeMission() - - return self -end - - - ---- Defines a menu slot to let the escort Join and Follow you at a certain distance. --- This menu will appear under **Navigation**. --- @param #ESCORT self --- @param DCSTypes#Distance Distance The distance in meters that the escort needs to follow the client. --- @return #ESCORT -function ESCORT:MenuFollowAt( Distance ) - self:F(Distance) - - if self.EscortGroup:IsAir() then - if not self.EscortMenuReportNavigation then - self.EscortMenuReportNavigation = MENU_CLIENT:New( self.EscortClient, "Navigation", self.EscortMenu ) - end - - if not self.EscortMenuJoinUpAndFollow then - self.EscortMenuJoinUpAndFollow = {} - end - - self.EscortMenuJoinUpAndFollow[#self.EscortMenuJoinUpAndFollow+1] = MENU_CLIENT_COMMAND:New( self.EscortClient, "Join-Up and Follow at " .. Distance, self.EscortMenuReportNavigation, ESCORT._JoinUpAndFollow, { ParamSelf = self, ParamDistance = Distance } ) - - self.EscortMode = ESCORT.MODE.FOLLOW - end - - return self -end - ---- Defines a menu slot to let the escort hold at their current position and stay low with a specified height during a specified time in seconds. --- This menu will appear under **Hold position**. --- @param #ESCORT self --- @param DCSTypes#Distance Height Optional parameter that sets the height in meters to let the escort orbit at the current location. The default value is 30 meters. --- @param DCSTypes#Time Seconds Optional parameter that lets the escort orbit at the current position for a specified time. (not implemented yet). The default value is 0 seconds, meaning, that the escort will orbit forever until a sequent command is given. --- @param #string MenuTextFormat Optional parameter that shows the menu option text. The text string is formatted, and should contain two %d tokens in the string. The first for the Height, the second for the Time (if given). If no text is given, the default text will be displayed. --- @return #ESCORT --- TODO: Implement Seconds parameter. Challenge is to first develop the "continue from last activity" function. -function ESCORT:MenuHoldAtEscortPosition( Height, Seconds, MenuTextFormat ) - self:F( { Height, Seconds, MenuTextFormat } ) - - if self.EscortGroup:IsAir() then - - if not self.EscortMenuHold then - self.EscortMenuHold = MENU_CLIENT:New( self.EscortClient, "Hold position", self.EscortMenu ) - end - - if not Height then - Height = 30 - end - - if not Seconds then - Seconds = 0 - end - - local MenuText = "" - if not MenuTextFormat then - if Seconds == 0 then - MenuText = string.format( "Hold at %d meter", Height ) - else - MenuText = string.format( "Hold at %d meter for %d seconds", Height, Seconds ) - end - else - if Seconds == 0 then - MenuText = string.format( MenuTextFormat, Height ) - else - MenuText = string.format( MenuTextFormat, Height, Seconds ) - end - end - - if not self.EscortMenuHoldPosition then - self.EscortMenuHoldPosition = {} - end - - self.EscortMenuHoldPosition[#self.EscortMenuHoldPosition+1] = MENU_CLIENT_COMMAND - :New( - self.EscortClient, - MenuText, - self.EscortMenuHold, - ESCORT._HoldPosition, - { ParamSelf = self, - ParamOrbitGroup = self.EscortGroup, - ParamHeight = Height, - ParamSeconds = Seconds - } - ) - end - - return self -end - - ---- Defines a menu slot to let the escort hold at the client position and stay low with a specified height during a specified time in seconds. --- This menu will appear under **Navigation**. --- @param #ESCORT self --- @param DCSTypes#Distance Height Optional parameter that sets the height in meters to let the escort orbit at the current location. The default value is 30 meters. --- @param DCSTypes#Time Seconds Optional parameter that lets the escort orbit at the current position for a specified time. (not implemented yet). The default value is 0 seconds, meaning, that the escort will orbit forever until a sequent command is given. --- @param #string MenuTextFormat Optional parameter that shows the menu option text. The text string is formatted, and should contain one or two %d tokens in the string. The first for the Height, the second for the Time (if given). If no text is given, the default text will be displayed. --- @return #ESCORT --- TODO: Implement Seconds parameter. Challenge is to first develop the "continue from last activity" function. -function ESCORT:MenuHoldAtLeaderPosition( Height, Seconds, MenuTextFormat ) - self:F( { Height, Seconds, MenuTextFormat } ) - - if self.EscortGroup:IsAir() then - - if not self.EscortMenuHold then - self.EscortMenuHold = MENU_CLIENT:New( self.EscortClient, "Hold position", self.EscortMenu ) - end - - if not Height then - Height = 30 - end - - if not Seconds then - Seconds = 0 - end - - local MenuText = "" - if not MenuTextFormat then - if Seconds == 0 then - MenuText = string.format( "Rejoin and hold at %d meter", Height ) - else - MenuText = string.format( "Rejoin and hold at %d meter for %d seconds", Height, Seconds ) - end - else - if Seconds == 0 then - MenuText = string.format( MenuTextFormat, Height ) - else - MenuText = string.format( MenuTextFormat, Height, Seconds ) - end - end - - if not self.EscortMenuHoldAtLeaderPosition then - self.EscortMenuHoldAtLeaderPosition = {} - end - - self.EscortMenuHoldAtLeaderPosition[#self.EscortMenuHoldAtLeaderPosition+1] = MENU_CLIENT_COMMAND - :New( - self.EscortClient, - MenuText, - self.EscortMenuHold, - ESCORT._HoldPosition, - { ParamSelf = self, - ParamOrbitGroup = self.EscortClient, - ParamHeight = Height, - ParamSeconds = Seconds - } - ) - end - - return self -end - ---- Defines a menu slot to let the escort scan for targets at a certain height for a certain time in seconds. --- This menu will appear under **Scan targets**. --- @param #ESCORT self --- @param DCSTypes#Distance Height Optional parameter that sets the height in meters to let the escort orbit at the current location. The default value is 30 meters. --- @param DCSTypes#Time Seconds Optional parameter that lets the escort orbit at the current position for a specified time. (not implemented yet). The default value is 0 seconds, meaning, that the escort will orbit forever until a sequent command is given. --- @param #string MenuTextFormat Optional parameter that shows the menu option text. The text string is formatted, and should contain one or two %d tokens in the string. The first for the Height, the second for the Time (if given). If no text is given, the default text will be displayed. --- @return #ESCORT -function ESCORT:MenuScanForTargets( Height, Seconds, MenuTextFormat ) - self:F( { Height, Seconds, MenuTextFormat } ) - - if self.EscortGroup:IsAir() then - if not self.EscortMenuScan then - self.EscortMenuScan = MENU_CLIENT:New( self.EscortClient, "Scan for targets", self.EscortMenu ) - end - - if not Height then - Height = 100 - end - - if not Seconds then - Seconds = 30 - end - - local MenuText = "" - if not MenuTextFormat then - if Seconds == 0 then - MenuText = string.format( "At %d meter", Height ) - else - MenuText = string.format( "At %d meter for %d seconds", Height, Seconds ) - end - else - if Seconds == 0 then - MenuText = string.format( MenuTextFormat, Height ) - else - MenuText = string.format( MenuTextFormat, Height, Seconds ) - end - end - - if not self.EscortMenuScanForTargets then - self.EscortMenuScanForTargets = {} - end - - self.EscortMenuScanForTargets[#self.EscortMenuScanForTargets+1] = MENU_CLIENT_COMMAND - :New( - self.EscortClient, - MenuText, - self.EscortMenuScan, - ESCORT._ScanTargets, - { ParamSelf = self, - ParamScanDuration = 30 - } - ) - end - - return self -end - - - ---- Defines a menu slot to let the escort disperse a flare in a certain color. --- This menu will appear under **Navigation**. --- The flare will be fired from the first unit in the group. --- @param #ESCORT self --- @param #string MenuTextFormat Optional parameter that shows the menu option text. If no text is given, the default text will be displayed. --- @return #ESCORT -function ESCORT:MenuFlare( MenuTextFormat ) - self:F() - - if not self.EscortMenuReportNavigation then - self.EscortMenuReportNavigation = MENU_CLIENT:New( self.EscortClient, "Navigation", self.EscortMenu ) - end - - local MenuText = "" - if not MenuTextFormat then - MenuText = "Flare" - else - MenuText = MenuTextFormat - end - - if not self.EscortMenuFlare then - self.EscortMenuFlare = MENU_CLIENT:New( self.EscortClient, MenuText, self.EscortMenuReportNavigation, ESCORT._Flare, { ParamSelf = self } ) - self.EscortMenuFlareGreen = MENU_CLIENT_COMMAND:New( self.EscortClient, "Release green flare", self.EscortMenuFlare, ESCORT._Flare, { ParamSelf = self, ParamColor = UNIT.FlareColor.Green, ParamMessage = "Released a green flare!" } ) - self.EscortMenuFlareRed = MENU_CLIENT_COMMAND:New( self.EscortClient, "Release red flare", self.EscortMenuFlare, ESCORT._Flare, { ParamSelf = self, ParamColor = UNIT.FlareColor.Red, ParamMessage = "Released a red flare!" } ) - self.EscortMenuFlareWhite = MENU_CLIENT_COMMAND:New( self.EscortClient, "Release white flare", self.EscortMenuFlare, ESCORT._Flare, { ParamSelf = self, ParamColor = UNIT.FlareColor.White, ParamMessage = "Released a white flare!" } ) - self.EscortMenuFlareYellow = MENU_CLIENT_COMMAND:New( self.EscortClient, "Release yellow flare", self.EscortMenuFlare, ESCORT._Flare, { ParamSelf = self, ParamColor = UNIT.FlareColor.Yellow, ParamMessage = "Released a yellow flare!" } ) - end - - return self -end - ---- Defines a menu slot to let the escort disperse a smoke in a certain color. --- This menu will appear under **Navigation**. --- Note that smoke menu options will only be displayed for ships and ground units. Not for air units. --- The smoke will be fired from the first unit in the group. --- @param #ESCORT self --- @param #string MenuTextFormat Optional parameter that shows the menu option text. If no text is given, the default text will be displayed. --- @return #ESCORT -function ESCORT:MenuSmoke( MenuTextFormat ) - self:F() - - if not self.EscortGroup:IsAir() then - if not self.EscortMenuReportNavigation then - self.EscortMenuReportNavigation = MENU_CLIENT:New( self.EscortClient, "Navigation", self.EscortMenu ) - end - - local MenuText = "" - if not MenuTextFormat then - MenuText = "Smoke" - else - MenuText = MenuTextFormat - end - - if not self.EscortMenuSmoke then - self.EscortMenuSmoke = MENU_CLIENT:New( self.EscortClient, "Smoke", self.EscortMenuReportNavigation, ESCORT._Smoke, { ParamSelf = self } ) - self.EscortMenuSmokeGreen = MENU_CLIENT_COMMAND:New( self.EscortClient, "Release green smoke", self.EscortMenuSmoke, ESCORT._Smoke, { ParamSelf = self, ParamColor = UNIT.SmokeColor.Green, ParamMessage = "Releasing green smoke!" } ) - self.EscortMenuSmokeRed = MENU_CLIENT_COMMAND:New( self.EscortClient, "Release red smoke", self.EscortMenuSmoke, ESCORT._Smoke, { ParamSelf = self, ParamColor = UNIT.SmokeColor.Red, ParamMessage = "Releasing red smoke!" } ) - self.EscortMenuSmokeWhite = MENU_CLIENT_COMMAND:New( self.EscortClient, "Release white smoke", self.EscortMenuSmoke, ESCORT._Smoke, { ParamSelf = self, ParamColor = UNIT.SmokeColor.White, ParamMessage = "Releasing white smoke!" } ) - self.EscortMenuSmokeOrange = MENU_CLIENT_COMMAND:New( self.EscortClient, "Release orange smoke", self.EscortMenuSmoke, ESCORT._Smoke, { ParamSelf = self, ParamColor = UNIT.SmokeColor.Orange, ParamMessage = "Releasing orange smoke!" } ) - self.EscortMenuSmokeBlue = MENU_CLIENT_COMMAND:New( self.EscortClient, "Release blue smoke", self.EscortMenuSmoke, ESCORT._Smoke, { ParamSelf = self, ParamColor = UNIT.SmokeColor.Blue, ParamMessage = "Releasing blue smoke!" } ) - end - end - - return self -end - ---- Defines a menu slot to let the escort report their current detected targets with a specified time interval in seconds. --- This menu will appear under **Report targets**. --- Note that if a report targets menu is not specified, no targets will be detected by the escort, and the attack and assisted attack menus will not be displayed. --- @param #ESCORT self --- @param DCSTypes#Time Seconds Optional parameter that lets the escort report their current detected targets after specified time interval in seconds. The default time is 30 seconds. --- @return #ESCORT -function ESCORT:MenuReportTargets( Seconds ) - self:F( { Seconds } ) - - if not self.EscortMenuReportNearbyTargets then - self.EscortMenuReportNearbyTargets = MENU_CLIENT:New( self.EscortClient, "Report targets", self.EscortMenu ) - end - - if not Seconds then - Seconds = 30 - end - - -- Report Targets - self.EscortMenuReportNearbyTargetsNow = MENU_CLIENT_COMMAND:New( self.EscortClient, "Report targets now!", self.EscortMenuReportNearbyTargets, ESCORT._ReportNearbyTargetsNow, { ParamSelf = self } ) - self.EscortMenuReportNearbyTargetsOn = MENU_CLIENT_COMMAND:New( self.EscortClient, "Report targets on", self.EscortMenuReportNearbyTargets, ESCORT._SwitchReportNearbyTargets, { ParamSelf = self, ParamReportTargets = true } ) - self.EscortMenuReportNearbyTargetsOff = MENU_CLIENT_COMMAND:New( self.EscortClient, "Report targets off", self.EscortMenuReportNearbyTargets, ESCORT._SwitchReportNearbyTargets, { ParamSelf = self, ParamReportTargets = false, } ) - - -- Attack Targets - self.EscortMenuAttackNearbyTargets = MENU_CLIENT:New( self.EscortClient, "Attack targets", self.EscortMenu ) - - - --self.ReportTargetsScheduler = routines.scheduleFunction( self._ReportTargetsScheduler, { self }, timer.getTime() + 1, Seconds ) - self.ReportTargetsScheduler = SCHEDULER:New( self, self._ReportTargetsScheduler, {}, 1, Seconds ) - - return self -end - ---- Defines a menu slot to let the escort attack its detected targets using assisted attack from another escort joined also with the client. --- This menu will appear under **Request assistance from**. --- Note that this method needs to be preceded with the method MenuReportTargets. --- @param #ESCORT self --- @return #ESCORT -function ESCORT:MenuAssistedAttack() - self:F() - - -- Request assistance from other escorts. - -- This is very useful to let f.e. an escorting ship attack a target detected by an escorting plane... - self.EscortMenuTargetAssistance = MENU_CLIENT:New( self.EscortClient, "Request assistance from", self.EscortMenu ) - - return self -end - ---- Defines a menu to let the escort set its rules of engagement. --- All rules of engagement will appear under the menu **ROE**. --- @param #ESCORT self --- @return #ESCORT -function ESCORT:MenuROE( MenuTextFormat ) - self:F( MenuTextFormat ) - - if not self.EscortMenuROE then - -- Rules of Engagement - self.EscortMenuROE = MENU_CLIENT:New( self.EscortClient, "ROE", self.EscortMenu ) - if self.EscortGroup:OptionROEHoldFirePossible() then - self.EscortMenuROEHoldFire = MENU_CLIENT_COMMAND:New( self.EscortClient, "Hold Fire", self.EscortMenuROE, ESCORT._ROE, { ParamSelf = self, ParamFunction = self.EscortGroup:OptionROEHoldFire(), ParamMessage = "Holding weapons!" } ) - end - if self.EscortGroup:OptionROEReturnFirePossible() then - self.EscortMenuROEReturnFire = MENU_CLIENT_COMMAND:New( self.EscortClient, "Return Fire", self.EscortMenuROE, ESCORT._ROE, { ParamSelf = self, ParamFunction = self.EscortGroup:OptionROEReturnFire(), ParamMessage = "Returning fire!" } ) - end - if self.EscortGroup:OptionROEOpenFirePossible() then - self.EscortMenuROEOpenFire = MENU_CLIENT_COMMAND:New( self.EscortClient, "Open Fire", self.EscortMenuROE, ESCORT._ROE, { ParamSelf = self, ParamFunction = self.EscortGroup:OptionROEOpenFire(), ParamMessage = "Opening fire on designated targets!!" } ) - end - if self.EscortGroup:OptionROEWeaponFreePossible() then - self.EscortMenuROEWeaponFree = MENU_CLIENT_COMMAND:New( self.EscortClient, "Weapon Free", self.EscortMenuROE, ESCORT._ROE, { ParamSelf = self, ParamFunction = self.EscortGroup:OptionROEWeaponFree(), ParamMessage = "Opening fire on targets of opportunity!" } ) - end - end - - return self -end - - ---- Defines a menu to let the escort set its evasion when under threat. --- All rules of engagement will appear under the menu **Evasion**. --- @param #ESCORT self --- @return #ESCORT -function ESCORT:MenuEvasion( MenuTextFormat ) - self:F( MenuTextFormat ) - - if self.EscortGroup:IsAir() then - if not self.EscortMenuEvasion then - -- Reaction to Threats - self.EscortMenuEvasion = MENU_CLIENT:New( self.EscortClient, "Evasion", self.EscortMenu ) - if self.EscortGroup:OptionROTNoReactionPossible() then - self.EscortMenuEvasionNoReaction = MENU_CLIENT_COMMAND:New( self.EscortClient, "Fight until death", self.EscortMenuEvasion, ESCORT._ROT, { ParamSelf = self, ParamFunction = self.EscortGroup:OptionROTNoReaction(), ParamMessage = "Fighting until death!" } ) - end - if self.EscortGroup:OptionROTPassiveDefensePossible() then - self.EscortMenuEvasionPassiveDefense = MENU_CLIENT_COMMAND:New( self.EscortClient, "Use flares, chaff and jammers", self.EscortMenuEvasion, ESCORT._ROT, { ParamSelf = self, ParamFunction = self.EscortGroup:OptionROTPassiveDefense(), ParamMessage = "Defending using jammers, chaff and flares!" } ) - end - if self.EscortGroup:OptionROTEvadeFirePossible() then - self.EscortMenuEvasionEvadeFire = MENU_CLIENT_COMMAND:New( self.EscortClient, "Evade enemy fire", self.EscortMenuEvasion, ESCORT._ROT, { ParamSelf = self, ParamFunction = self.EscortGroup:OptionROTEvadeFire(), ParamMessage = "Evading on enemy fire!" } ) - end - if self.EscortGroup:OptionROTVerticalPossible() then - self.EscortMenuOptionEvasionVertical = MENU_CLIENT_COMMAND:New( self.EscortClient, "Go below radar and evade fire", self.EscortMenuEvasion, ESCORT._ROT, { ParamSelf = self, ParamFunction = self.EscortGroup:OptionROTVertical(), ParamMessage = "Evading on enemy fire with vertical manoeuvres!" } ) - end - end - end - - return self -end - ---- Defines a menu to let the escort resume its mission from a waypoint on its route. --- All rules of engagement will appear under the menu **Resume mission from**. --- @param #ESCORT self --- @return #ESCORT -function ESCORT:MenuResumeMission() - self:F() - - if not self.EscortMenuResumeMission then - -- Mission Resume Menu Root - self.EscortMenuResumeMission = MENU_CLIENT:New( self.EscortClient, "Resume mission from", self.EscortMenu ) - end - - return self -end - - ---- @param #MENUPARAM MenuParam -function ESCORT._HoldPosition( MenuParam ) - - local self = MenuParam.ParamSelf - local EscortGroup = self.EscortGroup - local EscortClient = self.EscortClient - - local OrbitGroup = MenuParam.ParamOrbitGroup -- Group#GROUP - local OrbitUnit = OrbitGroup:GetUnit(1) -- Unit#UNIT - local OrbitHeight = MenuParam.ParamHeight - local OrbitSeconds = MenuParam.ParamSeconds -- Not implemented yet - - routines.removeFunction( self.FollowScheduler ) - - local PointFrom = {} - local GroupPoint = EscortGroup:GetUnit(1):GetPointVec3() - PointFrom = {} - PointFrom.x = GroupPoint.x - PointFrom.y = GroupPoint.z - PointFrom.speed = 250 - PointFrom.type = AI.Task.WaypointType.TURNING_POINT - PointFrom.alt = GroupPoint.y - PointFrom.alt_type = AI.Task.AltitudeType.BARO - - local OrbitPoint = OrbitUnit:GetPointVec2() - local PointTo = {} - PointTo.x = OrbitPoint.x - PointTo.y = OrbitPoint.y - PointTo.speed = 250 - PointTo.type = AI.Task.WaypointType.TURNING_POINT - PointTo.alt = OrbitHeight - PointTo.alt_type = AI.Task.AltitudeType.BARO - PointTo.task = EscortGroup:TaskOrbitCircleAtVec2( OrbitPoint, OrbitHeight, 0 ) - - local Points = { PointFrom, PointTo } - - EscortGroup:OptionROEHoldFire() - EscortGroup:OptionROTPassiveDefense() - - EscortGroup:SetTask( EscortGroup:TaskRoute( Points ) ) - EscortGroup:MessageToClient( "Orbiting at location.", 10, EscortClient ) -end - ---- @param #MENUPARAM MenuParam -function ESCORT._JoinUpAndFollow( MenuParam ) - - local self = MenuParam.ParamSelf - local EscortGroup = self.EscortGroup - local EscortClient = self.EscortClient - - self.Distance = MenuParam.ParamDistance - - self:JoinUpAndFollow( EscortGroup, EscortClient, self.Distance ) -end - ---- JoinsUp and Follows a CLIENT. --- @param Escort#ESCORT self --- @param Group#GROUP EscortGroup --- @param Client#CLIENT EscortClient --- @param DCSTypes#Distance Distance -function ESCORT:JoinUpAndFollow( EscortGroup, EscortClient, Distance ) - self:F( { EscortGroup, EscortClient, Distance } ) - - if self.FollowScheduler then - routines.removeFunction( self.FollowScheduler ) - end - - EscortGroup:OptionROEHoldFire() - EscortGroup:OptionROTPassiveDefense() - - self.EscortMode = ESCORT.MODE.FOLLOW - - self.CT1 = 0 - self.GT1 = 0 - --self.FollowScheduler = routines.scheduleFunction( self._FollowScheduler, { self, Distance }, timer.getTime() + 1, .5 ) - self.FollowScheduler = SCHEDULER:New( self, self._FollowScheduler, { Distance }, 1, .5, .1 ) - EscortGroup:MessageToClient( "Rejoining and Following at " .. Distance .. "!", 30, EscortClient ) -end - ---- @param #MENUPARAM MenuParam -function ESCORT._Flare( MenuParam ) - - local self = MenuParam.ParamSelf - local EscortGroup = self.EscortGroup - local EscortClient = self.EscortClient - - local Color = MenuParam.ParamColor - local Message = MenuParam.ParamMessage - - EscortGroup:GetUnit(1):Flare( Color ) - EscortGroup:MessageToClient( Message, 10, EscortClient ) -end - ---- @param #MENUPARAM MenuParam -function ESCORT._Smoke( MenuParam ) - - local self = MenuParam.ParamSelf - local EscortGroup = self.EscortGroup - local EscortClient = self.EscortClient - - local Color = MenuParam.ParamColor - local Message = MenuParam.ParamMessage - - EscortGroup:GetUnit(1):Smoke( Color ) - EscortGroup:MessageToClient( Message, 10, EscortClient ) -end - - ---- @param #MENUPARAM MenuParam -function ESCORT._ReportNearbyTargetsNow( MenuParam ) - - local self = MenuParam.ParamSelf - local EscortGroup = self.EscortGroup - local EscortClient = self.EscortClient - - self:_ReportTargetsScheduler() - -end - -function ESCORT._SwitchReportNearbyTargets( MenuParam ) - - local self = MenuParam.ParamSelf - local EscortGroup = self.EscortGroup - local EscortClient = self.EscortClient - - self.ReportTargets = MenuParam.ParamReportTargets - - if self.ReportTargets then - if not self.ReportTargetsScheduler then - --self.ReportTargetsScheduler = routines.scheduleFunction( self._ReportTargetsScheduler, { self }, timer.getTime() + 1, 30 ) - self.ReportTargetsScheduler = SCHEDULER:New( self, self._ReportTargetsScheduler, {}, 1, 30 ) - end - else - routines.removeFunction( self.ReportTargetsScheduler ) - self.ReportTargetsScheduler = nil - end -end - ---- @param #MENUPARAM MenuParam -function ESCORT._ScanTargets( MenuParam ) - - local self = MenuParam.ParamSelf - local EscortGroup = self.EscortGroup - local EscortClient = self.EscortClient - - local ScanDuration = MenuParam.ParamScanDuration - - if self.FollowScheduler then - routines.removeFunction( self.FollowScheduler ) - end - - self:T( { "FollowScheduler after removefunction: ", self.FollowScheduler } ) - - if EscortGroup:IsHelicopter() then - SCHEDULER:New( EscortGroup, EscortGroup.PushTask, - { EscortGroup:TaskControlled( - EscortGroup:TaskOrbitCircle( 200, 20 ), - EscortGroup:TaskCondition( nil, nil, nil, nil, ScanDuration, nil ) - ) - }, - 1 - ) - elseif EscortGroup:IsAirPlane() then - SCHEDULER:New( EscortGroup, EscortGroup.PushTask, - { EscortGroup:TaskControlled( - EscortGroup:TaskOrbitCircle( 1000, 500 ), - EscortGroup:TaskCondition( nil, nil, nil, nil, ScanDuration, nil ) - ) - }, - 1 - ) - end - - EscortGroup:MessageToClient( "Scanning targets for " .. ScanDuration .. " seconds.", ScanDuration, EscortClient ) - - if self.EscortMode == ESCORT.MODE.FOLLOW then - --self.FollowScheduler = routines.scheduleFunction( self._FollowScheduler, { self, Distance }, timer.getTime() + ScanDuration, 1 ) - self.FollowScheduler:Start() - end - -end - -function _Resume( EscortGroup ) - env.info( '_Resume' ) - - local Escort = EscortGroup.Escort -- #ESCORT - env.info( "EscortMode = " .. Escort.EscortMode ) - if Escort.EscortMode == ESCORT.MODE.FOLLOW then - Escort:JoinUpAndFollow( EscortGroup, Escort.EscortClient, Escort.Distance ) - end - -end - ---- @param #MENUPARAM MenuParam -function ESCORT._AttackTarget( MenuParam ) - - local self = MenuParam.ParamSelf - local EscortGroup = self.EscortGroup - local EscortClient = self.EscortClient - local AttackUnit = MenuParam.ParamUnit -- Unit#UNIT - - if self.FollowScheduler then - routines.removeFunction( self.FollowScheduler ) - end - - self:T( AttackUnit ) - - if EscortGroup:IsAir() then - EscortGroup:OptionROEOpenFire() - EscortGroup:OptionROTPassiveDefense() - EscortGroup.Escort = self -- Need to do this trick to get the reference for the escort in the _Resume function. --- routines.scheduleFunction( --- EscortGroup.PushTask, --- { EscortGroup, --- EscortGroup:TaskCombo( --- { EscortGroup:TaskAttackUnit( AttackUnit ), --- EscortGroup:TaskFunction( 1, 2, "_Resume", {"''"} ) --- } --- ) --- }, timer.getTime() + 10 --- ) - SCHEDULER:New( EscortGroup, - EscortGroup.PushTask, - { EscortGroup:TaskCombo( - { EscortGroup:TaskAttackUnit( AttackUnit ), - EscortGroup:TaskFunction( 1, 2, "_Resume", {"''"} ) - } - ) - }, 10 - ) - else --- routines.scheduleFunction( --- EscortGroup.PushTask, --- { EscortGroup, --- EscortGroup:TaskCombo( --- { EscortGroup:TaskFireAtPoint( AttackUnit:GetPointVec2(), 50 ) --- } --- ) --- }, timer.getTime() + 10 --- ) - SCHEDULER:New( EscortGroup, - EscortGroup.PushTask, - { EscortGroup:TaskCombo( - { EscortGroup:TaskFireAtPoint( AttackUnit:GetPointVec2(), 50 ) - } - ) - }, 10 - ) - end - EscortGroup:MessageToClient( "Engaging Designated Unit!", 10, EscortClient ) - - -end - ---- @param #MENUPARAM MenuParam -function ESCORT._AssistTarget( MenuParam ) - - local self = MenuParam.ParamSelf - local EscortGroup = self.EscortGroup - local EscortClient = self.EscortClient - local EscortGroupAttack = MenuParam.ParamEscortGroup - local AttackUnit = MenuParam.ParamUnit -- Unit#UNIT - - if self.FollowScheduler then - routines.removeFunction( self.FollowScheduler ) - end - - - self:T( AttackUnit ) - - if EscortGroupAttack:IsAir() then - EscortGroupAttack:OptionROEOpenFire() - EscortGroupAttack:OptionROTVertical() --- routines.scheduleFunction( --- EscortGroupAttack.PushTask, --- { EscortGroupAttack, --- EscortGroupAttack:TaskCombo( --- { EscortGroupAttack:TaskAttackUnit( AttackUnit ), --- EscortGroupAttack:TaskOrbitCircle( 500, 350 ) --- } --- ) --- }, timer.getTime() + 10 --- ) - SCHDULER:New( EscortGroupAttack, - EscortGroupAttack.PushTask, - { EscortGroupAttack:TaskCombo( - { EscortGroupAttack:TaskAttackUnit( AttackUnit ), - EscortGroupAttack:TaskOrbitCircle( 500, 350 ) - } - ) - }, 10 - ) - else --- routines.scheduleFunction( --- EscortGroupAttack.PushTask, --- { EscortGroupAttack, --- EscortGroupAttack:TaskCombo( --- { EscortGroupAttack:TaskFireAtPoint( AttackUnit:GetPointVec2(), 50 ) --- } --- ) --- }, timer.getTime() + 10 --- ) - SCHEDULER:New( EscortGroupAttack, - EscortGroupAttack.PushTask, - { EscortGroupAttack:TaskCombo( - { EscortGroupAttack:TaskFireAtPoint( AttackUnit:GetPointVec2(), 50 ) - } - ) - }, 10 - ) - end - EscortGroupAttack:MessageToClient( "Assisting with the destroying the enemy unit!", 10, EscortClient ) - -end - ---- @param #MENUPARAM MenuParam -function ESCORT._ROE( MenuParam ) - - local self = MenuParam.ParamSelf - local EscortGroup = self.EscortGroup - local EscortClient = self.EscortClient - - local EscortROEFunction = MenuParam.ParamFunction - local EscortROEMessage = MenuParam.ParamMessage - - pcall( function() EscortROEFunction() end ) - EscortGroup:MessageToClient( EscortROEMessage, 10, EscortClient ) -end - ---- @param #MENUPARAM MenuParam -function ESCORT._ROT( MenuParam ) - - local self = MenuParam.ParamSelf - local EscortGroup = self.EscortGroup - local EscortClient = self.EscortClient - - local EscortROTFunction = MenuParam.ParamFunction - local EscortROTMessage = MenuParam.ParamMessage - - pcall( function() EscortROTFunction() end ) - EscortGroup:MessageToClient( EscortROTMessage, 10, EscortClient ) -end - ---- @param #MENUPARAM MenuParam -function ESCORT._ResumeMission( MenuParam ) - - local self = MenuParam.ParamSelf - local EscortGroup = self.EscortGroup - local EscortClient = self.EscortClient - - local WayPoint = MenuParam.ParamWayPoint - - routines.removeFunction( self.FollowScheduler ) - self.FollowScheduler = nil - - local WayPoints = EscortGroup:GetTaskRoute() - self:T( WayPoint, WayPoints ) - - for WayPointIgnore = 1, WayPoint do - table.remove( WayPoints, 1 ) - end - - --routines.scheduleFunction( EscortGroup.SetTask, {EscortGroup, EscortGroup:TaskRoute( WayPoints ) }, timer.getTime() + 1 ) - SCHEDULER:New( EscortGroup, EscortGroup.SetTask, { EscortGroup:TaskRoute( WayPoints ) }, 1 ) - - EscortGroup:MessageToClient( "Resuming mission from waypoint " .. WayPoint .. ".", 10, EscortClient ) -end - ---- Registers the waypoints --- @param #ESCORT self --- @return #table -function ESCORT:RegisterRoute() - self:F() - - local EscortGroup = self.EscortGroup -- Group#GROUP - - local TaskPoints = EscortGroup:GetTaskRoute() - - self:T( TaskPoints ) - - return TaskPoints -end - ---- @param Escort#ESCORT self -function ESCORT:_FollowScheduler( FollowDistance ) - self:F( { FollowDistance }) - - if self.EscortGroup:IsAlive() and self.EscortClient:IsAlive() then - - local ClientUnit = self.EscortClient:GetClientGroupUnit() - local GroupUnit = self.EscortGroup:GetUnit( 1 ) - - if self.CT1 == 0 and self.GT1 == 0 then - self.CV1 = ClientUnit:GetPointVec3() - self.CT1 = timer.getTime() - self.GV1 = GroupUnit:GetPointVec3() - self.GT1 = timer.getTime() - else - local CT1 = self.CT1 - local CT2 = timer.getTime() - local CV1 = self.CV1 - local CV2 = ClientUnit:GetPointVec3() - self.CT1 = CT2 - self.CV1 = CV2 - - local CD = ( ( CV2.x - CV1.x )^2 + ( CV2.y - CV1.y )^2 + ( CV2.z - CV1.z )^2 ) ^ 0.5 - local CT = CT2 - CT1 - - local CS = ( 3600 / CT ) * ( CD / 1000 ) - - self:T2( { "Client:", CS, CD, CT, CV2, CV1, CT2, CT1 } ) - - local GT1 = self.GT1 - local GT2 = timer.getTime() - local GV1 = self.GV1 - local GV2 = GroupUnit:GetPointVec3() - self.GT1 = GT2 - self.GV1 = GV2 - - local GD = ( ( GV2.x - GV1.x )^2 + ( GV2.y - GV1.y )^2 + ( GV2.z - GV1.z )^2 ) ^ 0.5 - local GT = GT2 - GT1 - - local GS = ( 3600 / GT ) * ( GD / 1000 ) - - self:T2( { "Group:", GS, GD, GT, GV2, GV1, GT2, GT1 } ) - - -- Calculate the group direction vector - local GV = { x = GV2.x - CV2.x, y = GV2.y - CV2.y, z = GV2.z - CV2.z } - - -- Calculate GH2, GH2 with the same height as CV2. - local GH2 = { x = GV2.x, y = CV2.y, z = GV2.z } - - -- Calculate the angle of GV to the orthonormal plane - local alpha = math.atan2( GV.z, GV.x ) - - -- Now we calculate the intersecting vector between the circle around CV2 with radius FollowDistance and GH2. - -- From the GeoGebra model: CVI = (x(CV2) + FollowDistance cos(alpha), y(GH2) + FollowDistance sin(alpha), z(CV2)) - local CVI = { x = CV2.x + FollowDistance * math.cos(alpha), - y = GH2.y, - z = CV2.z + FollowDistance * math.sin(alpha), - } - - -- Calculate the direction vector DV of the escort group. We use CVI as the base and CV2 as the direction. - local DV = { x = CV2.x - CVI.x, y = CV2.y - CVI.y, z = CV2.z - CVI.z } - - -- We now calculate the unary direction vector DVu, so that we can multiply DVu with the speed, which is expressed in meters / s. - -- We need to calculate this vector to predict the point the escort group needs to fly to according its speed. - -- The distance of the destination point should be far enough not to have the aircraft starting to swipe left to right... - local DVu = { x = DV.x / FollowDistance, y = DV.y / FollowDistance, z = DV.z / FollowDistance } - - -- Now we can calculate the group destination vector GDV. - local GDV = { x = DVu.x * CS * 8 + CVI.x, y = CVI.y, z = DVu.z * CS * 8 + CVI.z } - - --trigger.action.smoke( GDV, trigger.smokeColor.Red ) - self:T2( { "CV2:", CV2 } ) - self:T2( { "CVI:", CVI } ) - self:T2( { "GDV:", GDV } ) - - -- Measure distance between client and group - local CatchUpDistance = ( ( GDV.x - GV2.x )^2 + ( GDV.y - GV2.y )^2 + ( GDV.z - GV2.z )^2 ) ^ 0.5 - - -- The calculation of the Speed would simulate that the group would take 30 seconds to overcome - -- the requested Distance). - local Time = 10 - local CatchUpSpeed = ( CatchUpDistance - ( CS * 8.4 ) ) / Time - - local Speed = CS + CatchUpSpeed - if Speed < 0 then - Speed = 0 - end - - self:T( { "Client Speed, Escort Speed, Speed, FlyDistance, Time:", CS, GS, Speed, Distance, Time } ) - - -- Now route the escort to the desired point with the desired speed. - self.EscortGroup:TaskRouteToVec3( GDV, Speed / 3.6 ) -- DCS models speed in Mps (Miles per second) - end - return true - end - - return false -end - - ---- Report Targets Scheduler. --- @param #ESCORT self -function ESCORT:_ReportTargetsScheduler() - self:F( self.EscortGroup:GetName() ) - - if self.EscortGroup:IsAlive() and self.EscortClient:IsAlive() then - local EscortGroupName = self.EscortGroup:GetName() - local EscortTargets = self.EscortGroup:GetDetectedTargets() - - local ClientEscortTargets = self.EscortClient._EscortGroups[EscortGroupName].Targets - - local EscortTargetMessages = "" - for EscortTargetID, EscortTarget in pairs( EscortTargets ) do - local EscortObject = EscortTarget.object - self:T( EscortObject ) - if EscortObject and EscortObject:isExist() and EscortObject.id_ < 50000000 then - - local EscortTargetUnit = UNIT:Find( EscortObject ) - local EscortTargetUnitName = EscortTargetUnit:GetName() - - - - -- local EscortTargetIsDetected, - -- EscortTargetIsVisible, - -- EscortTargetLastTime, - -- EscortTargetKnowType, - -- EscortTargetKnowDistance, - -- EscortTargetLastPos, - -- EscortTargetLastVelocity - -- = self.EscortGroup:IsTargetDetected( EscortObject ) - -- - -- self:T( { EscortTargetIsDetected, - -- EscortTargetIsVisible, - -- EscortTargetLastTime, - -- EscortTargetKnowType, - -- EscortTargetKnowDistance, - -- EscortTargetLastPos, - -- EscortTargetLastVelocity } ) - - - local EscortTargetUnitPositionVec3 = EscortTargetUnit:GetPointVec3() - local EscortPositionVec3 = self.EscortGroup:GetPointVec3() - local Distance = ( ( EscortTargetUnitPositionVec3.x - EscortPositionVec3.x )^2 + - ( EscortTargetUnitPositionVec3.y - EscortPositionVec3.y )^2 + - ( EscortTargetUnitPositionVec3.z - EscortPositionVec3.z )^2 - ) ^ 0.5 / 1000 - - self:T( { self.EscortGroup:GetName(), EscortTargetUnit:GetName(), Distance, EscortTarget } ) - - if Distance <= 15 then - - if not ClientEscortTargets[EscortTargetUnitName] then - ClientEscortTargets[EscortTargetUnitName] = {} - end - ClientEscortTargets[EscortTargetUnitName].AttackUnit = EscortTargetUnit - ClientEscortTargets[EscortTargetUnitName].visible = EscortTarget.visible - ClientEscortTargets[EscortTargetUnitName].type = EscortTarget.type - ClientEscortTargets[EscortTargetUnitName].distance = EscortTarget.distance - else - if ClientEscortTargets[EscortTargetUnitName] then - ClientEscortTargets[EscortTargetUnitName] = nil - end - end - end - end - - self:T( { "Sorting Targets Table:", ClientEscortTargets } ) - table.sort( ClientEscortTargets, function( a, b ) return a.Distance < b.Distance end ) - self:T( { "Sorted Targets Table:", ClientEscortTargets } ) - - -- Remove the sub menus of the Attack menu of the Escort for the EscortGroup. - self.EscortMenuAttackNearbyTargets:RemoveSubMenus() - - if self.EscortMenuTargetAssistance then - self.EscortMenuTargetAssistance:RemoveSubMenus() - end - - --for MenuIndex = 1, #self.EscortMenuAttackTargets do - -- self:T( { "Remove Menu:", self.EscortMenuAttackTargets[MenuIndex] } ) - -- self.EscortMenuAttackTargets[MenuIndex] = self.EscortMenuAttackTargets[MenuIndex]:Remove() - --end - - - if ClientEscortTargets then - for ClientEscortTargetUnitName, ClientEscortTargetData in pairs( ClientEscortTargets ) do - - for ClientEscortGroupName, EscortGroupData in pairs( self.EscortClient._EscortGroups ) do - - if ClientEscortTargetData and ClientEscortTargetData.AttackUnit:IsAlive() then - - local EscortTargetMessage = "" - local EscortTargetCategoryName = ClientEscortTargetData.AttackUnit:GetCategoryName() - local EscortTargetCategoryType = ClientEscortTargetData.AttackUnit:GetTypeName() - if ClientEscortTargetData.type then - EscortTargetMessage = EscortTargetMessage .. EscortTargetCategoryName .. " (" .. EscortTargetCategoryType .. ") at " - else - EscortTargetMessage = EscortTargetMessage .. "Unknown target at " - end - - local EscortTargetUnitPositionVec3 = ClientEscortTargetData.AttackUnit:GetPointVec3() - local EscortPositionVec3 = self.EscortGroup:GetPointVec3() - local Distance = ( ( EscortTargetUnitPositionVec3.x - EscortPositionVec3.x )^2 + - ( EscortTargetUnitPositionVec3.y - EscortPositionVec3.y )^2 + - ( EscortTargetUnitPositionVec3.z - EscortPositionVec3.z )^2 - ) ^ 0.5 / 1000 - - self:T( { self.EscortGroup:GetName(), ClientEscortTargetData.AttackUnit:GetName(), Distance, ClientEscortTargetData.AttackUnit } ) - if ClientEscortTargetData.visible == false then - EscortTargetMessage = EscortTargetMessage .. string.format( "%.2f", Distance ) .. " estimated km" - else - EscortTargetMessage = EscortTargetMessage .. string.format( "%.2f", Distance ) .. " km" - end - - if ClientEscortTargetData.visible then - EscortTargetMessage = EscortTargetMessage .. ", visual" - end - - if ClientEscortGroupName == EscortGroupName then - - MENU_CLIENT_COMMAND:New( self.EscortClient, - EscortTargetMessage, - self.EscortMenuAttackNearbyTargets, - ESCORT._AttackTarget, - { ParamSelf = self, - ParamUnit = ClientEscortTargetData.AttackUnit - } - ) - EscortTargetMessages = EscortTargetMessages .. "\n - " .. EscortTargetMessage - else - if self.EscortMenuTargetAssistance then - local MenuTargetAssistance = MENU_CLIENT:New( self.EscortClient, EscortGroupData.EscortName, self.EscortMenuTargetAssistance ) - MENU_CLIENT_COMMAND:New( self.EscortClient, - EscortTargetMessage, - MenuTargetAssistance, - ESCORT._AssistTarget, - { ParamSelf = self, - ParamEscortGroup = EscortGroupData.EscortGroup, - ParamUnit = ClientEscortTargetData.AttackUnit - } - ) - end - end - else - ClientEscortTargetData = nil - end - end - end - - if EscortTargetMessages ~= "" and self.ReportTargets == true then - self.EscortGroup:MessageToClient( "Detected targets within 15 km range:" .. EscortTargetMessages:gsub("\n$",""), 20, self.EscortClient ) - else - self.EscortGroup:MessageToClient( "No targets detected!", 20, self.EscortClient ) - end - end - - if self.EscortMenuResumeMission then - self.EscortMenuResumeMission:RemoveSubMenus() - - -- if self.EscortMenuResumeWayPoints then - -- for MenuIndex = 1, #self.EscortMenuResumeWayPoints do - -- self:T( { "Remove Menu:", self.EscortMenuResumeWayPoints[MenuIndex] } ) - -- self.EscortMenuResumeWayPoints[MenuIndex] = self.EscortMenuResumeWayPoints[MenuIndex]:Remove() - -- end - -- end - - local TaskPoints = self:RegisterRoute() - for WayPointID, WayPoint in pairs( TaskPoints ) do - local EscortPositionVec3 = self.EscortGroup:GetPointVec3() - local Distance = ( ( WayPoint.x - EscortPositionVec3.x )^2 + - ( WayPoint.y - EscortPositionVec3.z )^2 - ) ^ 0.5 / 1000 - MENU_CLIENT_COMMAND:New( self.EscortClient, "Waypoint " .. WayPointID .. " at " .. string.format( "%.2f", Distance ).. "km", self.EscortMenuResumeMission, ESCORT._ResumeMission, { ParamSelf = self, ParamWayPoint = WayPointID } ) - end - end - return true - end - - return false -end ---- Provides missile training functions. --- --- @{#MISSILETRAINER} class --- ======================== --- The @{#MISSILETRAINER} class uses the DCS world messaging system to be alerted of any missiles fired, and when a missile would hit your aircraft, --- the class will destroy the missile within a certain range, to avoid damage to your aircraft. --- It suports the following functionality: --- --- * Track the missiles fired at you and other players, providing bearing and range information of the missiles towards the airplanes. --- * Provide alerts of missile launches, including detailed information of the units launching, including bearing, range … --- * Provide alerts when a missile would have killed your aircraft. --- * Provide alerts when the missile self destructs. --- * Enable / Disable and Configure the Missile Trainer using the various menu options. --- --- When running a mission where MISSILETRAINER is used, the following radio menu structure ( 'Radio Menu' -> 'Other (F10)' -> 'MissileTrainer' ) options are available for the players: --- --- * **Messages**: Menu to configure all messages. --- * **Messages On**: Show all messages. --- * **Messages Off**: Disable all messages. --- * **Tracking**: Menu to configure missile tracking messages. --- * **To All**: Shows missile tracking messages to all players. --- * **To Target**: Shows missile tracking messages only to the player where the missile is targetted at. --- * **Tracking On**: Show missile tracking messages. --- * **Tracking Off**: Disable missile tracking messages. --- * **Frequency Increase**: Increases the missile tracking message frequency with one second. --- * **Frequency Decrease**: Decreases the missile tracking message frequency with one second. --- * **Alerts**: Menu to configure alert messages. --- * **To All**: Shows alert messages to all players. --- * **To Target**: Shows alert messages only to the player where the missile is (was) targetted at. --- * **Hits On**: Show missile hit alert messages. --- * **Hits Off**: Disable missile hit alert messages. --- * **Launches On**: Show missile launch messages. --- * **Launches Off**: Disable missile launch messages. --- * **Details**: Menu to configure message details. --- * **Range On**: Shows range information when a missile is fired to a target. --- * **Range Off**: Disable range information when a missile is fired to a target. --- * **Bearing On**: Shows bearing information when a missile is fired to a target. --- * **Bearing Off**: Disable bearing information when a missile is fired to a target. --- * **Distance**: Menu to configure the distance when a missile needs to be destroyed when near to a player, during tracking. This will improve/influence hit calculation accuracy, but has the risk of damaging the aircraft when the missile reaches the aircraft before the distance is measured. --- * **50 meter**: Destroys the missile when the distance to the aircraft is below or equal to 50 meter. --- * **100 meter**: Destroys the missile when the distance to the aircraft is below or equal to 100 meter. --- * **150 meter**: Destroys the missile when the distance to the aircraft is below or equal to 150 meter. --- * **200 meter**: Destroys the missile when the distance to the aircraft is below or equal to 200 meter. --- --- --- MISSILETRAINER construction methods: --- ==================================== --- Create a new MISSILETRAINER object with the @{#MISSILETRAINER.New} method: --- --- * @{#MISSILETRAINER.New}: Creates a new MISSILETRAINER object taking the maximum distance to your aircraft to evaluate when a missile needs to be destroyed. --- --- MISSILETRAINER will collect each unit declared in the mission with a skill level "Client" and "Player", and will monitor the missiles shot at those. --- --- MISSILETRAINER initialization methods: --- ====================================== --- A MISSILETRAINER object will behave differently based on the usage of initialization methods: --- --- * @{#MISSILETRAINER.InitMessagesOnOff}: Sets by default the display of any message to be ON or OFF. --- * @{#MISSILETRAINER.InitTrackingToAll}: Sets by default the missile tracking report for all players or only for those missiles targetted to you. --- * @{#MISSILETRAINER.InitTrackingOnOff}: Sets by default the display of missile tracking report to be ON or OFF. --- * @{#MISSILETRAINER.InitTrackingFrequency}: Increases, decreases the missile tracking message display frequency with the provided time interval in seconds. --- * @{#MISSILETRAINER.InitAlertsToAll}: Sets by default the display of alerts to be shown to all players or only to you. --- * @{#MISSILETRAINER.InitAlertsHitsOnOff}: Sets by default the display of hit alerts ON or OFF. --- * @{#MISSILETRAINER.InitAlertsLaunchesOnOff}: Sets by default the display of launch alerts ON or OFF. --- * @{#MISSILETRAINER.InitRangeOnOff}: Sets by default the display of range information of missiles ON of OFF. --- * @{#MISSILETRAINER.InitBearingOnOff}: Sets by default the display of bearing information of missiles ON of OFF. --- * @{#MISSILETRAINER.InitMenusOnOff}: Allows to configure the options through the radio menu. --- --- @module MissileTrainer --- @author FlightControl - - -Include.File( "Client" ) -Include.File( "Scheduler" ) - ---- The MISSILETRAINER class --- @type MISSILETRAINER --- @extends Base#BASE -MISSILETRAINER = { - ClassName = "MISSILETRAINER", -} - ---- Creates the main object which is handling missile tracking. --- When a missile is fired a SCHEDULER is set off that follows the missile. When near a certain a client player, the missile will be destroyed. --- @param #MISSILETRAINER self --- @param #number Distance The distance in meters when a tracked missile needs to be destroyed when close to a player. --- @param #string Briefing (Optional) Will show a text to the players when starting their mission. Can be used for briefing purposes. --- @return #MISSILETRAINER -function MISSILETRAINER:New( Distance, Briefing ) - local self = BASE:Inherit( self, BASE:New() ) - self:F( Distance ) - - if Briefing then - self.Briefing = Briefing - end - - self.Schedulers = {} - self.SchedulerID = 0 - - self.MessageInterval = 2 - self.MessageLastTime = timer.getTime() - - self.Distance = Distance / 1000 - - _EVENTDISPATCHER:OnShot( self._EventShot, self ) - - self.DB = DATABASE:New():FilterStart() - self.DBClients = self.DB.Clients - self.DBUnits = self.DB.Units - - for ClientID, Client in pairs( self.DBClients ) do - - local function _Alive( Client ) - - if self.Briefing then - Client:Message( self.Briefing, 15, "HELLO WORLD", "Trainer" ) - end - - if self.MenusOnOff == true then - Client:Message( "Use the 'Radio Menu' -> 'Other (F10)' -> 'Missile Trainer' menu options to change the Missile Trainer settings (for all players).", 15, "MENU", "Trainer" ) - - Client.MainMenu = MENU_CLIENT:New( Client, "Missile Trainer", nil ) -- Menu#MENU_CLIENT - - Client.MenuMessages = MENU_CLIENT:New( Client, "Messages", Client.MainMenu ) - Client.MenuOn = MENU_CLIENT_COMMAND:New( Client, "Messages On", Client.MenuMessages, self._MenuMessages, { MenuSelf = self, MessagesOnOff = true } ) - Client.MenuOff = MENU_CLIENT_COMMAND:New( Client, "Messages Off", Client.MenuMessages, self._MenuMessages, { MenuSelf = self, MessagesOnOff = false } ) - - Client.MenuTracking = MENU_CLIENT:New( Client, "Tracking", Client.MainMenu ) - Client.MenuTrackingToAll = MENU_CLIENT_COMMAND:New( Client, "To All", Client.MenuTracking, self._MenuMessages, { MenuSelf = self, TrackingToAll = true } ) - Client.MenuTrackingToTarget = MENU_CLIENT_COMMAND:New( Client, "To Target", Client.MenuTracking, self._MenuMessages, { MenuSelf = self, TrackingToAll = false } ) - Client.MenuTrackOn = MENU_CLIENT_COMMAND:New( Client, "Tracking On", Client.MenuTracking, self._MenuMessages, { MenuSelf = self, TrackingOnOff = true } ) - Client.MenuTrackOff = MENU_CLIENT_COMMAND:New( Client, "Tracking Off", Client.MenuTracking, self._MenuMessages, { MenuSelf = self, TrackingOnOff = false } ) - Client.MenuTrackIncrease = MENU_CLIENT_COMMAND:New( Client, "Frequency Increase", Client.MenuTracking, self._MenuMessages, { MenuSelf = self, TrackingFrequency = -1 } ) - Client.MenuTrackDecrease = MENU_CLIENT_COMMAND:New( Client, "Frequency Decrease", Client.MenuTracking, self._MenuMessages, { MenuSelf = self, TrackingFrequency = 1 } ) - - Client.MenuAlerts = MENU_CLIENT:New( Client, "Alerts", Client.MainMenu ) - Client.MenuAlertsToAll = MENU_CLIENT_COMMAND:New( Client, "To All", Client.MenuAlerts, self._MenuMessages, { MenuSelf = self, AlertsToAll = true } ) - Client.MenuAlertsToTarget = MENU_CLIENT_COMMAND:New( Client, "To Target", Client.MenuAlerts, self._MenuMessages, { MenuSelf = self, AlertsToAll = false } ) - Client.MenuHitsOn = MENU_CLIENT_COMMAND:New( Client, "Hits On", Client.MenuAlerts, self._MenuMessages, { MenuSelf = self, AlertsHitsOnOff = true } ) - Client.MenuHitsOff = MENU_CLIENT_COMMAND:New( Client, "Hits Off", Client.MenuAlerts, self._MenuMessages, { MenuSelf = self, AlertsHitsOnOff = false } ) - Client.MenuLaunchesOn = MENU_CLIENT_COMMAND:New( Client, "Launches On", Client.MenuAlerts, self._MenuMessages, { MenuSelf = self, AlertsLaunchesOnOff = true } ) - Client.MenuLaunchesOff = MENU_CLIENT_COMMAND:New( Client, "Launches Off", Client.MenuAlerts, self._MenuMessages, { MenuSelf = self, AlertsLaunchesOnOff = false } ) - - Client.MenuDetails = MENU_CLIENT:New( Client, "Details", Client.MainMenu ) - Client.MenuDetailsDistanceOn = MENU_CLIENT_COMMAND:New( Client, "Range On", Client.MenuDetails, self._MenuMessages, { MenuSelf = self, DetailsRangeOnOff = true } ) - Client.MenuDetailsDistanceOff = MENU_CLIENT_COMMAND:New( Client, "Range Off", Client.MenuDetails, self._MenuMessages, { MenuSelf = self, DetailsRangeOnOff = false } ) - Client.MenuDetailsBearingOn = MENU_CLIENT_COMMAND:New( Client, "Bearing On", Client.MenuDetails, self._MenuMessages, { MenuSelf = self, DetailsBearingOnOff = true } ) - Client.MenuDetailsBearingOff = MENU_CLIENT_COMMAND:New( Client, "Bearing Off", Client.MenuDetails, self._MenuMessages, { MenuSelf = self, DetailsBearingOnOff = false } ) - - Client.MenuDistance = MENU_CLIENT:New( Client, "Set distance to plane", Client.MainMenu ) - Client.MenuDistance50 = MENU_CLIENT_COMMAND:New( Client, "50 meter", Client.MenuDistance, self._MenuMessages, { MenuSelf = self, Distance = 50 / 1000 } ) - Client.MenuDistance100 = MENU_CLIENT_COMMAND:New( Client, "100 meter", Client.MenuDistance, self._MenuMessages, { MenuSelf = self, Distance = 100 / 1000 } ) - Client.MenuDistance150 = MENU_CLIENT_COMMAND:New( Client, "150 meter", Client.MenuDistance, self._MenuMessages, { MenuSelf = self, Distance = 150 / 1000 } ) - Client.MenuDistance200 = MENU_CLIENT_COMMAND:New( Client, "200 meter", Client.MenuDistance, self._MenuMessages, { MenuSelf = self, Distance = 200 / 1000 } ) - else - if Client.MainMenu then - Client.MainMenu:Remove() - end - end - - - local ClientID = Client:GetID() - self:T( ClientID ) - if not self.TrackingMissiles[ClientID] then - self.TrackingMissiles[ClientID] = {} - end - self.TrackingMissiles[ClientID].Client = Client - if not self.TrackingMissiles[ClientID].MissileData then - self.TrackingMissiles[ClientID].MissileData = {} - end - end - - Client:Alive( _Alive ) - - end - --- self.DB:ForEachClient( --- --- @param Client#CLIENT Client --- function( Client ) --- --- ... actions ... --- --- end --- ) - - self.MessagesOnOff = true - - self.TrackingToAll = false - self.TrackingOnOff = true - self.TrackingFrequency = 3 - - self.AlertsToAll = true - self.AlertsHitsOnOff = true - self.AlertsLaunchesOnOff = true - - self.DetailsRangeOnOff = true - self.DetailsBearingOnOff = true - - self.MenusOnOff = true - - self.TrackingMissiles = {} - - self.TrackingScheduler = SCHEDULER:New( self, self._TrackMissiles, {}, 0.5, 0.05, 0 ) - - return self -end - --- Initialization methods. - - ---- Sets by default the display of any message to be ON or OFF. --- @param #MISSILETRAINER self --- @param #boolean MessagesOnOff true or false --- @return #MISSILETRAINER self -function MISSILETRAINER:InitMessagesOnOff( MessagesOnOff ) - self:F( MessagesOnOff ) - - self.MessagesOnOff = MessagesOnOff - if self.MessagesOnOff == true then - MESSAGE:New( "Messages ON", "Menu", 15, "ID" ):ToAll() - else - MESSAGE:New( "Messages OFF", "Menu", 15, "ID" ):ToAll() - end - - return self -end - ---- Sets by default the missile tracking report for all players or only for those missiles targetted to you. --- @param #MISSILETRAINER self --- @param #boolean TrackingToAll true or false --- @return #MISSILETRAINER self -function MISSILETRAINER:InitTrackingToAll( TrackingToAll ) - self:F( TrackingToAll ) - - self.TrackingToAll = TrackingToAll - if self.TrackingToAll == true then - MESSAGE:New( "Missile tracking to all players ON", "Menu", 15, "ID" ):ToAll() - else - MESSAGE:New( "Missile tracking to all players OFF", "Menu", 15, "ID" ):ToAll() - end - - return self -end - ---- Sets by default the display of missile tracking report to be ON or OFF. --- @param #MISSILETRAINER self --- @param #boolean TrackingOnOff true or false --- @return #MISSILETRAINER self -function MISSILETRAINER:InitTrackingOnOff( TrackingOnOff ) - self:F( TrackingOnOff ) - - self.TrackingOnOff = TrackingOnOff - if self.TrackingOnOff == true then - MESSAGE:New( "Missile tracking ON", "Menu", 15, "ID" ):ToAll() - else - MESSAGE:New( "Missile tracking OFF", "Menu", 15, "ID" ):ToAll() - end - - return self -end - ---- Increases, decreases the missile tracking message display frequency with the provided time interval in seconds. --- The default frequency is a 3 second interval, so the Tracking Frequency parameter specifies the increase or decrease from the default 3 seconds or the last frequency update. --- @param #MISSILETRAINER self --- @param #number TrackingFrequency Provide a negative or positive value in seconds to incraese or decrease the display frequency. --- @return #MISSILETRAINER self -function MISSILETRAINER:InitTrackingFrequency( TrackingFrequency ) - self:F( TrackingFrequency ) - - self.TrackingFrequency = self.TrackingFrequency + TrackingFrequency - if self.TrackingFrequency < 0.5 then - self.TrackingFrequency = 0.5 - end - if self.TrackingFrequency then - MESSAGE:New( "Missile tracking frequency is " .. self.TrackingFrequency .. " seconds.", "Menu", 15, "ID" ):ToAll() - end - - return self -end - ---- Sets by default the display of alerts to be shown to all players or only to you. --- @param #MISSILETRAINER self --- @param #boolean AlertsToAll true or false --- @return #MISSILETRAINER self -function MISSILETRAINER:InitAlertsToAll( AlertsToAll ) - self:F( AlertsToAll ) - - self.AlertsToAll = AlertsToAll - if self.AlertsToAll == true then - MESSAGE:New( "Alerts to all players ON", "Menu", 15, "ID" ):ToAll() - else - MESSAGE:New( "Alerts to all players OFF", "Menu", 15, "ID" ):ToAll() - end - - return self -end - ---- Sets by default the display of hit alerts ON or OFF. --- @param #MISSILETRAINER self --- @param #boolean AlertsHitsOnOff true or false --- @return #MISSILETRAINER self -function MISSILETRAINER:InitAlertsHitsOnOff( AlertsHitsOnOff ) - self:F( AlertsHitsOnOff ) - - self.AlertsHitsOnOff = AlertsHitsOnOff - if self.AlertsHitsOnOff == true then - MESSAGE:New( "Alerts Hits ON", "Menu", 15, "ID" ):ToAll() - else - MESSAGE:New( "Alerts Hits OFF", "Menu", 15, "ID" ):ToAll() - end - - return self -end - ---- Sets by default the display of launch alerts ON or OFF. --- @param #MISSILETRAINER self --- @param #boolean AlertsLaunchesOnOff true or false --- @return #MISSILETRAINER self -function MISSILETRAINER:InitAlertsLaunchesOnOff( AlertsLaunchesOnOff ) - self:F( AlertsLaunchesOnOff ) - - self.AlertsLaunchesOnOff = AlertsLaunchesOnOff - if self.AlertsLaunchesOnOff == true then - MESSAGE:New( "Alerts Launches ON", "Menu", 15, "ID" ):ToAll() - else - MESSAGE:New( "Alerts Launches OFF", "Menu", 15, "ID" ):ToAll() - end - - return self -end - ---- Sets by default the display of range information of missiles ON of OFF. --- @param #MISSILETRAINER self --- @param #boolean DetailsRangeOnOff true or false --- @return #MISSILETRAINER self -function MISSILETRAINER:InitRangeOnOff( DetailsRangeOnOff ) - self:F( DetailsRangeOnOff ) - - self.DetailsRangeOnOff = DetailsRangeOnOff - if self.DetailsRangeOnOff == true then - MESSAGE:New( "Range display ON", "Menu", 15, "ID" ):ToAll() - else - MESSAGE:New( "Range display OFF", "Menu", 15, "ID" ):ToAll() - end - - return self -end - ---- Sets by default the display of bearing information of missiles ON of OFF. --- @param #MISSILETRAINER self --- @param #boolean DetailsBearingOnOff true or false --- @return #MISSILETRAINER self -function MISSILETRAINER:InitBearingOnOff( DetailsBearingOnOff ) - self:F( DetailsBearingOnOff ) - - self.DetailsBearingOnOff = DetailsBearingOnOff - if self.DetailsBearingOnOff == true then - MESSAGE:New( "Bearing display OFF", "Menu", 15, "ID" ):ToAll() - else - MESSAGE:New( "Bearing display OFF", "Menu", 15, "ID" ):ToAll() - end - - return self -end - ---- Enables / Disables the menus. --- @param #MISSILETRAINER self --- @param #boolean MenusOnOff true or false --- @return #MISSILETRAINER self -function MISSILETRAINER:InitMenusOnOff( MenusOnOff ) - self:F( MenusOnOff ) - - self.MenusOnOff = MenusOnOff - if self.MenusOnOff == true then - MESSAGE:New( "Menus are ENABLED (only when a player rejoins a slot)", "Menu", 15, "ID" ):ToAll() - else - MESSAGE:New( "Menus are DISABLED", "Menu", 15, "ID" ):ToAll() - end - - return self -end - - --- Menu functions - -function MISSILETRAINER._MenuMessages( MenuParameters ) - - local self = MenuParameters.MenuSelf - - if MenuParameters.MessagesOnOff ~= nil then - self:InitMessagesOnOff( MenuParameters.MessagesOnOff ) - end - - if MenuParameters.TrackingToAll ~= nil then - self:InitTrackingToAll( MenuParameters.TrackingToAll ) - end - - if MenuParameters.TrackingOnOff ~= nil then - self:InitTrackingOnOff( MenuParameters.TrackingOnOff ) - end - - if MenuParameters.TrackingFrequency ~= nil then - self:InitTrackingFrequency( MenuParameters.TrackingFrequency ) - end - - if MenuParameters.AlertsToAll ~= nil then - self:InitAlertsToAll( MenuParameters.AlertsToAll ) - end - - if MenuParameters.AlertsHitsOnOff ~= nil then - self:InitAlertsHitsOnOff( MenuParameters.AlertsHitsOnOff ) - end - - if MenuParameters.AlertsLaunchesOnOff ~= nil then - self:InitAlertsLaunchesOnOff( MenuParameters.AlertsLaunchesOnOff ) - end - - if MenuParameters.DetailsRangeOnOff ~= nil then - self:InitRangeOnOff( MenuParameters.DetailsRangeOnOff ) - end - - if MenuParameters.DetailsBearingOnOff ~= nil then - self:InitBearingOnOff( MenuParameters.DetailsBearingOnOff ) - end - - if MenuParameters.Distance ~= nil then - self.Distance = MenuParameters.Distance - MESSAGE:New( "Hit detection distance set to " .. self.Distance .. " meters", "Menu", 15, "ID" ):ToAll() - end - -end - ---- Detects if an SA site was shot with an anti radiation missile. In this case, take evasive actions based on the skill level set within the ME. --- @param #MISSILETRAINER self --- @param Event#EVENTDATA Event -function MISSILETRAINER:_EventShot( Event ) - self:F( { Event } ) - - local TrainerSourceDCSUnit = Event.IniDCSUnit - local TrainerSourceDCSUnitName = Event.IniDCSUnitName - local TrainerWeapon = Event.Weapon -- Identify the weapon fired - local TrainerWeaponName = Event.WeaponName -- return weapon type - - self:T( "Missile Launched = " .. TrainerWeaponName ) - - local TrainerTargetDCSUnit = TrainerWeapon:getTarget() -- Identify target - local TrainerTargetDCSUnitName = Unit.getName( TrainerTargetDCSUnit ) - local TrainerTargetSkill = _DATABASE.Templates.Units[TrainerTargetDCSUnitName].Template.skill - - self:T(TrainerTargetDCSUnitName ) - - local Client = self.DBClients[TrainerTargetDCSUnitName] - if Client then - - local TrainerSourceUnit = UNIT:Find( TrainerSourceDCSUnit ) - local TrainerTargetUnit = UNIT:Find( TrainerTargetDCSUnit ) - - if self.MessagesOnOff == true and self.AlertsLaunchesOnOff == true then - - local Message = MESSAGE:New( - string.format( "%s launched a %s", - TrainerSourceUnit:GetTypeName(), - TrainerWeaponName - ) .. self:_AddRange( Client, TrainerWeapon ) .. self:_AddBearing( Client, TrainerWeapon ),"Launch Alert", 5, "ID" ) - - if self.AlertsToAll then - Message:ToAll() - else - Message:ToClient( Client ) - end - end - - local ClientID = Client:GetID() - local MissileData = {} - MissileData.TrainerSourceUnit = TrainerSourceUnit - MissileData.TrainerWeapon = TrainerWeapon - MissileData.TrainerTargetUnit = TrainerTargetUnit - MissileData.TrainerWeaponTypeName = TrainerWeapon:getTypeName() - MissileData.TrainerWeaponLaunched = true - table.insert( self.TrackingMissiles[ClientID].MissileData, MissileData ) - --self:T( self.TrackingMissiles ) - end -end - -function MISSILETRAINER:_AddRange( Client, TrainerWeapon ) - - local RangeText = "" - - if self.DetailsRangeOnOff then - - local PositionMissile = TrainerWeapon:getPoint() - local PositionTarget = Client:GetPointVec3() - - local Range = ( ( PositionMissile.x - PositionTarget.x )^2 + - ( PositionMissile.y - PositionTarget.y )^2 + - ( PositionMissile.z - PositionTarget.z )^2 - ) ^ 0.5 / 1000 - - RangeText = string.format( ", at %4.2fkm", Range ) - end - - return RangeText -end - -function MISSILETRAINER:_AddBearing( Client, TrainerWeapon ) - - local BearingText = "" - - if self.DetailsBearingOnOff then - - local PositionMissile = TrainerWeapon:getPoint() - local PositionTarget = Client:GetPointVec3() - - self:T2( { PositionTarget, PositionMissile }) - - local DirectionVector = { x = PositionMissile.x - PositionTarget.x, y = PositionMissile.y - PositionTarget.y, z = PositionMissile.z - PositionTarget.z } - local DirectionRadians = math.atan2( DirectionVector.z, DirectionVector.x ) - --DirectionRadians = DirectionRadians + routines.getNorthCorrection( PositionTarget ) - if DirectionRadians < 0 then - DirectionRadians = DirectionRadians + 2 * math.pi - end - local DirectionDegrees = DirectionRadians * 180 / math.pi - - BearingText = string.format( ", %d degrees", DirectionDegrees ) - end - - return BearingText -end - - -function MISSILETRAINER:_TrackMissiles() - self:F2() - - - local ShowMessages = false - if self.MessagesOnOff and self.MessageLastTime + self.TrackingFrequency <= timer.getTime() then - self.MessageLastTime = timer.getTime() - ShowMessages = true - end - - -- ALERTS PART - - -- Loop for all Player Clients to check the alerts and deletion of missiles. - for ClientDataID, ClientData in pairs( self.TrackingMissiles ) do - - local Client = ClientData.Client - self:T2( { Client:GetName() } ) - - for MissileDataID, MissileData in pairs( ClientData.MissileData ) do - self:T3( MissileDataID ) - - local TrainerSourceUnit = MissileData.TrainerSourceUnit - local TrainerWeapon = MissileData.TrainerWeapon - local TrainerTargetUnit = MissileData.TrainerTargetUnit - local TrainerWeaponTypeName = MissileData.TrainerWeaponTypeName - local TrainerWeaponLaunched = MissileData.TrainerWeaponLaunched - - if Client and Client:IsAlive() and TrainerSourceUnit and TrainerSourceUnit:IsAlive() and TrainerWeapon and TrainerWeapon:isExist() and TrainerTargetUnit and TrainerTargetUnit:IsAlive() then - local PositionMissile = TrainerWeapon:getPosition().p - local PositionTarget = Client:GetPointVec3() - - local Distance = ( ( PositionMissile.x - PositionTarget.x )^2 + - ( PositionMissile.y - PositionTarget.y )^2 + - ( PositionMissile.z - PositionTarget.z )^2 - ) ^ 0.5 / 1000 - - if Distance <= self.Distance then - -- Hit alert - TrainerWeapon:destroy() - if self.MessagesOnOff == true and self.AlertsHitsOnOff == true then - - self:T( "killed" ) - - local Message = MESSAGE:New( - string.format( "%s launched by %s killed %s", - TrainerWeapon:getTypeName(), - TrainerSourceUnit:GetTypeName(), - TrainerTargetUnit:GetPlayerName() - ),"Hit Alert", 15, "ID" ) - - if self.AlertsToAll == true then - Message:ToAll() - else - Message:ToClient( Client ) - end - - MissileData = nil - table.remove( ClientData.MissileData, MissileDataID ) - self:T(ClientData.MissileData) - end - end - else - if not ( TrainerWeapon and TrainerWeapon:isExist() ) then - if self.MessagesOnOff == true and self.AlertsLaunchesOnOff == true then - -- Weapon does not exist anymore. Delete from Table - local Message = MESSAGE:New( - string.format( "%s launched by %s self destructed!", - TrainerWeaponTypeName, - TrainerSourceUnit:GetTypeName() - ),"Tracking", 5, "ID" ) - - if self.AlertsToAll == true then - Message:ToAll() - else - Message:ToClient( Client ) - end - end - MissileData = nil - table.remove( ClientData.MissileData, MissileDataID ) - self:T( ClientData.MissileData ) - end - end - end - end - - if ShowMessages == true and self.MessagesOnOff == true and self.TrackingOnOff == true then -- Only do this when tracking information needs to be displayed. - - -- TRACKING PART - - -- For the current client, the missile range and bearing details are displayed To the Player Client. - -- For the other clients, the missile range and bearing details are displayed To the other Player Clients. - -- To achieve this, a cross loop is done for each Player Client <-> Other Player Client missile information. - - -- Main Player Client loop - for ClientDataID, ClientData in pairs( self.TrackingMissiles ) do - - local Client = ClientData.Client - self:T2( { Client:GetName() } ) - - - ClientData.MessageToClient = "" - ClientData.MessageToAll = "" - - -- Other Players Client loop - for TrackingDataID, TrackingData in pairs( self.TrackingMissiles ) do - - for MissileDataID, MissileData in pairs( TrackingData.MissileData ) do - self:T3( MissileDataID ) - - local TrainerSourceUnit = MissileData.TrainerSourceUnit - local TrainerWeapon = MissileData.TrainerWeapon - local TrainerTargetUnit = MissileData.TrainerTargetUnit - local TrainerWeaponTypeName = MissileData.TrainerWeaponTypeName - local TrainerWeaponLaunched = MissileData.TrainerWeaponLaunched - - if Client and Client:IsAlive() and TrainerSourceUnit and TrainerSourceUnit:IsAlive() and TrainerWeapon and TrainerWeapon:isExist() and TrainerTargetUnit and TrainerTargetUnit:IsAlive() then - - if ShowMessages == true then - local TrackingTo - TrackingTo = string.format( " -> %s", - TrainerWeaponTypeName - ) - - if ClientDataID == TrackingDataID then - if ClientData.MessageToClient == "" then - ClientData.MessageToClient = "Missiles to You:\n" - end - ClientData.MessageToClient = ClientData.MessageToClient .. TrackingTo .. self:_AddRange( ClientData.Client, TrainerWeapon ) .. self:_AddBearing( ClientData.Client, TrainerWeapon ) .. "\n" - else - if self.TrackingToAll == true then - if ClientData.MessageToAll == "" then - ClientData.MessageToAll = "Missiles to other Players:\n" - end - ClientData.MessageToAll = ClientData.MessageToAll .. TrackingTo .. self:_AddRange( ClientData.Client, TrainerWeapon ) .. self:_AddBearing( ClientData.Client, TrainerWeapon ) .. " ( " .. TrainerTargetUnit:GetPlayerName() .. " )\n" - end - end - end - end - end - end - - -- Once the Player Client and the Other Player Client tracking messages are prepared, show them. - if ClientData.MessageToClient ~= "" or ClientData.MessageToAll ~= "" then - local Message = MESSAGE:New( ClientData.MessageToClient .. ClientData.MessageToAll, "Tracking", 1, "ID" ):ToClient( Client ) - end - end - end - - return true -end -env.info( '*** MOOSE INCLUDE END *** ' ) +env.info("Loaded MOOSE Include Engine")env.info( '*** MOOSE INCLUDE END *** ' ) diff --git a/Moose Mission Setup/Moose.lua b/Moose Mission Setup/Moose.lua index 7db8a5175..114a0f7fe 100644 --- a/Moose Mission Setup/Moose.lua +++ b/Moose Mission Setup/Moose.lua @@ -1,5 +1,6 @@ -env.info( '*** MOOSE STATIC INCLUDE START *** ' ) -env.info( 'Moose Generation Timestamp: 20160605_0003' ) +env.info( '*** MOOSE DYNAMIC INCLUDE START *** ' ) +env.info( 'Moose Generation Timestamp: 20160605_2147' ) + local base = _G env.info("Loading MOOSE " .. base.timer.getAbsTime() ) @@ -11,9 +12,27 @@ Include.Path = function() end Include.File = function( IncludeFile ) + if not Include.Files[ IncludeFile ] then + Include.Files[IncludeFile] = IncludeFile + env.info( "Include:" .. IncludeFile .. " from " .. Include.ProgramPath ) + local f = assert( base.loadfile( Include.ProgramPath .. IncludeFile .. ".lua" ) ) + if f == nil then + env.info( "Include:" .. IncludeFile .. " from " .. Include.MissionPath ) + local f = assert( base.loadfile( Include.MissionPath .. IncludeFile .. ".lua" ) ) + if f == nil then + error ("Could not load MOOSE file " .. IncludeFile .. ".lua" ) + else + env.info( "Include:" .. IncludeFile .. " loaded from " .. Include.MissionPath ) + return f() + end + else + env.info( "Include:" .. IncludeFile .. " loaded from " .. Include.ProgramPath ) + return f() + end + end end -Include.ProgramPath = "Scripts/Moose/Moose/" +Include.ProgramPath = "Scripts/Moose/" Include.MissionPath = Include.Path() env.info( "Include.ProgramPath = " .. Include.ProgramPath) @@ -23,17596 +42,4 @@ Include.Files = {} Include.File( "Moose" ) -env.info("Loaded MOOSE Include Engine") ---- Various routines --- @module routines --- @author Flightcontrol - ---Include.File( "Trace" ) ---Include.File( "Message" ) - - -env.setErrorMessageBoxEnabled(false) - ---- Extract of MIST functions. --- @author Grimes - -routines = {} - - --- don't change these -routines.majorVersion = 3 -routines.minorVersion = 3 -routines.build = 22 - ------------------------------------------------------------------------------------------------------------------ - ----------------------------------------------------------------------------------------------- --- Utils- conversion, Lua utils, etc. -routines.utils = {} - ---from http://lua-users.org/wiki/CopyTable -routines.utils.deepCopy = function(object) - local lookup_table = {} - local function _copy(object) - if type(object) ~= "table" then - return object - elseif lookup_table[object] then - return lookup_table[object] - end - local new_table = {} - lookup_table[object] = new_table - for index, value in pairs(object) do - new_table[_copy(index)] = _copy(value) - end - return setmetatable(new_table, getmetatable(object)) - end - local objectreturn = _copy(object) - return objectreturn -end - - --- porting in Slmod's serialize_slmod2 -routines.utils.oneLineSerialize = function(tbl) -- serialization of a table all on a single line, no comments, made to replace old get_table_string function - - lookup_table = {} - - local function _Serialize( tbl ) - - if type(tbl) == 'table' then --function only works for tables! - - if lookup_table[tbl] then - return lookup_table[object] - end - - local tbl_str = {} - - lookup_table[tbl] = tbl_str - - tbl_str[#tbl_str + 1] = '{' - - for ind,val in pairs(tbl) do -- serialize its fields - local ind_str = {} - if type(ind) == "number" then - ind_str[#ind_str + 1] = '[' - ind_str[#ind_str + 1] = tostring(ind) - ind_str[#ind_str + 1] = ']=' - else --must be a string - ind_str[#ind_str + 1] = '[' - ind_str[#ind_str + 1] = routines.utils.basicSerialize(ind) - ind_str[#ind_str + 1] = ']=' - end - - local val_str = {} - if ((type(val) == 'number') or (type(val) == 'boolean')) then - val_str[#val_str + 1] = tostring(val) - val_str[#val_str + 1] = ',' - tbl_str[#tbl_str + 1] = table.concat(ind_str) - tbl_str[#tbl_str + 1] = table.concat(val_str) - elseif type(val) == 'string' then - val_str[#val_str + 1] = routines.utils.basicSerialize(val) - val_str[#val_str + 1] = ',' - tbl_str[#tbl_str + 1] = table.concat(ind_str) - tbl_str[#tbl_str + 1] = table.concat(val_str) - elseif type(val) == 'nil' then -- won't ever happen, right? - val_str[#val_str + 1] = 'nil,' - tbl_str[#tbl_str + 1] = table.concat(ind_str) - tbl_str[#tbl_str + 1] = table.concat(val_str) - elseif type(val) == 'table' then - if ind == "__index" then - -- tbl_str[#tbl_str + 1] = "__index" - -- tbl_str[#tbl_str + 1] = ',' --I think this is right, I just added it - else - - val_str[#val_str + 1] = _Serialize(val) - val_str[#val_str + 1] = ',' --I think this is right, I just added it - tbl_str[#tbl_str + 1] = table.concat(ind_str) - tbl_str[#tbl_str + 1] = table.concat(val_str) - end - elseif type(val) == 'function' then - -- tbl_str[#tbl_str + 1] = "function " .. tostring(ind) - -- tbl_str[#tbl_str + 1] = ',' --I think this is right, I just added it - else --- env.info('unable to serialize value type ' .. routines.utils.basicSerialize(type(val)) .. ' at index ' .. tostring(ind)) --- env.info( debug.traceback() ) - end - - end - tbl_str[#tbl_str + 1] = '}' - return table.concat(tbl_str) - else - return tostring(tbl) - end - end - - local objectreturn = _Serialize(tbl) - return objectreturn -end - ---porting in Slmod's "safestring" basic serialize -routines.utils.basicSerialize = function(s) - if s == nil then - return "\"\"" - else - if ((type(s) == 'number') or (type(s) == 'boolean') or (type(s) == 'function') or (type(s) == 'table') or (type(s) == 'userdata') ) then - return tostring(s) - elseif type(s) == 'string' then - s = string.format('%q', s) - return s - end - end -end - - -routines.utils.toDegree = function(angle) - return angle*180/math.pi -end - -routines.utils.toRadian = function(angle) - return angle*math.pi/180 -end - -routines.utils.metersToNM = function(meters) - return meters/1852 -end - -routines.utils.metersToFeet = function(meters) - return meters/0.3048 -end - -routines.utils.NMToMeters = function(NM) - return NM*1852 -end - -routines.utils.feetToMeters = function(feet) - return feet*0.3048 -end - -routines.utils.mpsToKnots = function(mps) - return mps*3600/1852 -end - -routines.utils.mpsToKmph = function(mps) - return mps*3.6 -end - -routines.utils.knotsToMps = function(knots) - return knots*1852/3600 -end - -routines.utils.kmphToMps = function(kmph) - return kmph/3.6 -end - -function routines.utils.makeVec2(Vec3) - if Vec3.z then - return {x = Vec3.x, y = Vec3.z} - else - return {x = Vec3.x, y = Vec3.y} -- it was actually already vec2. - end -end - -function routines.utils.makeVec3(Vec2, y) - if not Vec2.z then - if not y then - y = 0 - end - return {x = Vec2.x, y = y, z = Vec2.y} - else - return {x = Vec2.x, y = Vec2.y, z = Vec2.z} -- it was already Vec3, actually. - end -end - -function routines.utils.makeVec3GL(Vec2, offset) - local adj = offset or 0 - - if not Vec2.z then - return {x = Vec2.x, y = (land.getHeight(Vec2) + adj), z = Vec2.y} - else - return {x = Vec2.x, y = (land.getHeight({x = Vec2.x, y = Vec2.z}) + adj), z = Vec2.z} - end -end - -routines.utils.zoneToVec3 = function(zone) - local new = {} - if type(zone) == 'table' and zone.point then - new.x = zone.point.x - new.y = zone.point.y - new.z = zone.point.z - return new - elseif type(zone) == 'string' then - zone = trigger.misc.getZone(zone) - if zone then - new.x = zone.point.x - new.y = zone.point.y - new.z = zone.point.z - return new - end - end -end - --- gets heading-error corrected direction from point along vector vec. -function routines.utils.getDir(vec, point) - local dir = math.atan2(vec.z, vec.x) - dir = dir + routines.getNorthCorrection(point) - if dir < 0 then - dir = dir + 2*math.pi -- put dir in range of 0 to 2*pi - end - return dir -end - --- gets distance in meters between two points (2 dimensional) -function routines.utils.get2DDist(point1, point2) - point1 = routines.utils.makeVec3(point1) - point2 = routines.utils.makeVec3(point2) - return routines.vec.mag({x = point1.x - point2.x, y = 0, z = point1.z - point2.z}) -end - --- gets distance in meters between two points (3 dimensional) -function routines.utils.get3DDist(point1, point2) - return routines.vec.mag({x = point1.x - point2.x, y = point1.y - point2.y, z = point1.z - point2.z}) -end - - - --- From http://lua-users.org/wiki/SimpleRound --- use negative idp for rounding ahead of decimal place, positive for rounding after decimal place -routines.utils.round = function(num, idp) - local mult = 10^(idp or 0) - return math.floor(num * mult + 0.5) / mult -end - --- porting in Slmod's dostring -routines.utils.dostring = function(s) - local f, err = loadstring(s) - if f then - return true, f() - else - return false, err - end -end - - ---3D Vector manipulation -routines.vec = {} - -routines.vec.add = function(vec1, vec2) - return {x = vec1.x + vec2.x, y = vec1.y + vec2.y, z = vec1.z + vec2.z} -end - -routines.vec.sub = function(vec1, vec2) - return {x = vec1.x - vec2.x, y = vec1.y - vec2.y, z = vec1.z - vec2.z} -end - -routines.vec.scalarMult = function(vec, mult) - return {x = vec.x*mult, y = vec.y*mult, z = vec.z*mult} -end - -routines.vec.scalar_mult = routines.vec.scalarMult - -routines.vec.dp = function(vec1, vec2) - return vec1.x*vec2.x + vec1.y*vec2.y + vec1.z*vec2.z -end - -routines.vec.cp = function(vec1, vec2) - return { x = vec1.y*vec2.z - vec1.z*vec2.y, y = vec1.z*vec2.x - vec1.x*vec2.z, z = vec1.x*vec2.y - vec1.y*vec2.x} -end - -routines.vec.mag = function(vec) - return (vec.x^2 + vec.y^2 + vec.z^2)^0.5 -end - -routines.vec.getUnitVec = function(vec) - local mag = routines.vec.mag(vec) - return { x = vec.x/mag, y = vec.y/mag, z = vec.z/mag } -end - -routines.vec.rotateVec2 = function(vec2, theta) - return { x = vec2.x*math.cos(theta) - vec2.y*math.sin(theta), y = vec2.x*math.sin(theta) + vec2.y*math.cos(theta)} -end ---------------------------------------------------------------------------------------------------------------------------- - - - - --- acc- the accuracy of each easting/northing. 0, 1, 2, 3, 4, or 5. -routines.tostringMGRS = function(MGRS, acc) - if acc == 0 then - return MGRS.UTMZone .. ' ' .. MGRS.MGRSDigraph - else - return MGRS.UTMZone .. ' ' .. MGRS.MGRSDigraph .. ' ' .. string.format('%0' .. acc .. 'd', routines.utils.round(MGRS.Easting/(10^(5-acc)), 0)) - .. ' ' .. string.format('%0' .. acc .. 'd', routines.utils.round(MGRS.Northing/(10^(5-acc)), 0)) - end -end - ---[[acc: -in DM: decimal point of minutes. -In DMS: decimal point of seconds. -position after the decimal of the least significant digit: -So: -42.32 - acc of 2. -]] -routines.tostringLL = function(lat, lon, acc, DMS) - - local latHemi, lonHemi - if lat > 0 then - latHemi = 'N' - else - latHemi = 'S' - end - - if lon > 0 then - lonHemi = 'E' - else - lonHemi = 'W' - end - - lat = math.abs(lat) - lon = math.abs(lon) - - local latDeg = math.floor(lat) - local latMin = (lat - latDeg)*60 - - local lonDeg = math.floor(lon) - local lonMin = (lon - lonDeg)*60 - - if DMS then -- degrees, minutes, and seconds. - local oldLatMin = latMin - latMin = math.floor(latMin) - local latSec = routines.utils.round((oldLatMin - latMin)*60, acc) - - local oldLonMin = lonMin - lonMin = math.floor(lonMin) - local lonSec = routines.utils.round((oldLonMin - lonMin)*60, acc) - - if latSec == 60 then - latSec = 0 - latMin = latMin + 1 - end - - if lonSec == 60 then - lonSec = 0 - lonMin = lonMin + 1 - end - - local secFrmtStr -- create the formatting string for the seconds place - if acc <= 0 then -- no decimal place. - secFrmtStr = '%02d' - else - local width = 3 + acc -- 01.310 - that's a width of 6, for example. - secFrmtStr = '%0' .. width .. '.' .. acc .. 'f' - end - - return string.format('%02d', latDeg) .. ' ' .. string.format('%02d', latMin) .. '\' ' .. string.format(secFrmtStr, latSec) .. '"' .. latHemi .. ' ' - .. string.format('%02d', lonDeg) .. ' ' .. string.format('%02d', lonMin) .. '\' ' .. string.format(secFrmtStr, lonSec) .. '"' .. lonHemi - - else -- degrees, decimal minutes. - latMin = routines.utils.round(latMin, acc) - lonMin = routines.utils.round(lonMin, acc) - - if latMin == 60 then - latMin = 0 - latDeg = latDeg + 1 - end - - if lonMin == 60 then - lonMin = 0 - lonDeg = lonDeg + 1 - end - - local minFrmtStr -- create the formatting string for the minutes place - if acc <= 0 then -- no decimal place. - minFrmtStr = '%02d' - else - local width = 3 + acc -- 01.310 - that's a width of 6, for example. - minFrmtStr = '%0' .. width .. '.' .. acc .. 'f' - end - - return string.format('%02d', latDeg) .. ' ' .. string.format(minFrmtStr, latMin) .. '\'' .. latHemi .. ' ' - .. string.format('%02d', lonDeg) .. ' ' .. string.format(minFrmtStr, lonMin) .. '\'' .. lonHemi - - end -end - ---[[ required: az - radian - required: dist - meters - optional: alt - meters (set to false or nil if you don't want to use it). - optional: metric - set true to get dist and alt in km and m. - precision will always be nearest degree and NM or km.]] -routines.tostringBR = function(az, dist, alt, metric) - az = routines.utils.round(routines.utils.toDegree(az), 0) - - if metric then - dist = routines.utils.round(dist/1000, 2) - else - dist = routines.utils.round(routines.utils.metersToNM(dist), 2) - end - - local s = string.format('%03d', az) .. ' for ' .. dist - - if alt then - if metric then - s = s .. ' at ' .. routines.utils.round(alt, 0) - else - s = s .. ' at ' .. routines.utils.round(routines.utils.metersToFeet(alt), 0) - end - end - return s -end - -routines.getNorthCorrection = function(point) --gets the correction needed for true north - if not point.z then --Vec2; convert to Vec3 - point.z = point.y - point.y = 0 - end - local lat, lon = coord.LOtoLL(point) - local north_posit = coord.LLtoLO(lat + 1, lon) - return math.atan2(north_posit.z - point.z, north_posit.x - point.x) -end - - --- the main area -do - -- THE MAIN FUNCTION -- Accessed 100 times/sec. - routines.main = function() - timer.scheduleFunction(routines.main, {}, timer.getTime() + 2) --reschedule first in case of Lua error - ---------------------------------------------------------------------------------------------------------- - --area to add new stuff in - - routines.do_scheduled_functions() - end -- end of routines.main - - timer.scheduleFunction(routines.main, {}, timer.getTime() + 2) - -end - - -do - local idNum = 0 - - --Simplified event handler - routines.addEventHandler = function(f) --id is optional! - local handler = {} - idNum = idNum + 1 - handler.id = idNum - handler.f = f - handler.onEvent = function(self, event) - self.f(event) - end - world.addEventHandler(handler) - end - - routines.removeEventHandler = function(id) - for key, handler in pairs(world.eventHandlers) do - if handler.id and handler.id == id then - world.eventHandlers[key] = nil - return true - end - end - return false - end -end - --- need to return a Vec3 or Vec2? -function routines.getRandPointInCircle(point, radius, innerRadius) - local theta = 2*math.pi*math.random() - local rad = math.random() + math.random() - if rad > 1 then - rad = 2 - rad - end - - local radMult - if innerRadius and innerRadius <= radius then - radMult = (radius - innerRadius)*rad + innerRadius - else - radMult = radius*rad - end - - if not point.z then --might as well work with vec2/3 - point.z = point.y - end - - local rndCoord - if radius > 0 then - rndCoord = {x = math.cos(theta)*radMult + point.x, y = math.sin(theta)*radMult + point.z} - else - rndCoord = {x = point.x, y = point.z} - end - return rndCoord -end - -routines.goRoute = function(group, path) - local misTask = { - id = 'Mission', - params = { - route = { - points = routines.utils.deepCopy(path), - }, - }, - } - if type(group) == 'string' then - group = Group.getByName(group) - end - local groupCon = group:getController() - if groupCon then - groupCon:setTask(misTask) - return true - end - - Controller.setTask(groupCon, misTask) - return false -end - - --- Useful atomic functions from mist, ported. - -routines.ground = {} -routines.fixedWing = {} -routines.heli = {} - -routines.ground.buildWP = function(point, overRideForm, overRideSpeed) - - local wp = {} - wp.x = point.x - - if point.z then - wp.y = point.z - else - wp.y = point.y - end - local form, speed - - if point.speed and not overRideSpeed then - wp.speed = point.speed - elseif type(overRideSpeed) == 'number' then - wp.speed = overRideSpeed - else - wp.speed = routines.utils.kmphToMps(20) - end - - if point.form and not overRideForm then - form = point.form - else - form = overRideForm - end - - if not form then - wp.action = 'Cone' - else - form = string.lower(form) - if form == 'off_road' or form == 'off road' then - wp.action = 'Off Road' - elseif form == 'on_road' or form == 'on road' then - wp.action = 'On Road' - elseif form == 'rank' or form == 'line_abrest' or form == 'line abrest' or form == 'lineabrest'then - wp.action = 'Rank' - elseif form == 'cone' then - wp.action = 'Cone' - elseif form == 'diamond' then - wp.action = 'Diamond' - elseif form == 'vee' then - wp.action = 'Vee' - elseif form == 'echelon_left' or form == 'echelon left' or form == 'echelonl' then - wp.action = 'EchelonL' - elseif form == 'echelon_right' or form == 'echelon right' or form == 'echelonr' then - wp.action = 'EchelonR' - else - wp.action = 'Cone' -- if nothing matched - end - end - - wp.type = 'Turning Point' - - return wp - -end - -routines.fixedWing.buildWP = function(point, WPtype, speed, alt, altType) - - local wp = {} - wp.x = point.x - - if point.z then - wp.y = point.z - else - wp.y = point.y - end - - if alt and type(alt) == 'number' then - wp.alt = alt - else - wp.alt = 2000 - end - - if altType then - altType = string.lower(altType) - if altType == 'radio' or 'agl' then - wp.alt_type = 'RADIO' - elseif altType == 'baro' or 'asl' then - wp.alt_type = 'BARO' - end - else - wp.alt_type = 'RADIO' - end - - if point.speed then - speed = point.speed - end - - if point.type then - WPtype = point.type - end - - if not speed then - wp.speed = routines.utils.kmphToMps(500) - else - wp.speed = speed - end - - if not WPtype then - wp.action = 'Turning Point' - else - WPtype = string.lower(WPtype) - if WPtype == 'flyover' or WPtype == 'fly over' or WPtype == 'fly_over' then - wp.action = 'Fly Over Point' - elseif WPtype == 'turningpoint' or WPtype == 'turning point' or WPtype == 'turning_point' then - wp.action = 'Turning Point' - else - wp.action = 'Turning Point' - end - end - - wp.type = 'Turning Point' - return wp -end - -routines.heli.buildWP = function(point, WPtype, speed, alt, altType) - - local wp = {} - wp.x = point.x - - if point.z then - wp.y = point.z - else - wp.y = point.y - end - - if alt and type(alt) == 'number' then - wp.alt = alt - else - wp.alt = 500 - end - - if altType then - altType = string.lower(altType) - if altType == 'radio' or 'agl' then - wp.alt_type = 'RADIO' - elseif altType == 'baro' or 'asl' then - wp.alt_type = 'BARO' - end - else - wp.alt_type = 'RADIO' - end - - if point.speed then - speed = point.speed - end - - if point.type then - WPtype = point.type - end - - if not speed then - wp.speed = routines.utils.kmphToMps(200) - else - wp.speed = speed - end - - if not WPtype then - wp.action = 'Turning Point' - else - WPtype = string.lower(WPtype) - if WPtype == 'flyover' or WPtype == 'fly over' or WPtype == 'fly_over' then - wp.action = 'Fly Over Point' - elseif WPtype == 'turningpoint' or WPtype == 'turning point' or WPtype == 'turning_point' then - wp.action = 'Turning Point' - else - wp.action = 'Turning Point' - end - end - - wp.type = 'Turning Point' - return wp -end - -routines.groupToRandomPoint = function(vars) - local group = vars.group --Required - local point = vars.point --required - local radius = vars.radius or 0 - local innerRadius = vars.innerRadius - local form = vars.form or 'Cone' - local heading = vars.heading or math.random()*2*math.pi - local headingDegrees = vars.headingDegrees - local speed = vars.speed or routines.utils.kmphToMps(20) - - - local useRoads - if not vars.disableRoads then - useRoads = true - else - useRoads = false - end - - local path = {} - - if headingDegrees then - heading = headingDegrees*math.pi/180 - end - - if heading >= 2*math.pi then - heading = heading - 2*math.pi - end - - local rndCoord = routines.getRandPointInCircle(point, radius, innerRadius) - - local offset = {} - local posStart = routines.getLeadPos(group) - - offset.x = routines.utils.round(math.sin(heading - (math.pi/2)) * 50 + rndCoord.x, 3) - offset.z = routines.utils.round(math.cos(heading + (math.pi/2)) * 50 + rndCoord.y, 3) - path[#path + 1] = routines.ground.buildWP(posStart, form, speed) - - - if useRoads == true and ((point.x - posStart.x)^2 + (point.z - posStart.z)^2)^0.5 > radius * 1.3 then - path[#path + 1] = routines.ground.buildWP({['x'] = posStart.x + 11, ['z'] = posStart.z + 11}, 'off_road', speed) - path[#path + 1] = routines.ground.buildWP(posStart, 'on_road', speed) - path[#path + 1] = routines.ground.buildWP(offset, 'on_road', speed) - else - path[#path + 1] = routines.ground.buildWP({['x'] = posStart.x + 25, ['z'] = posStart.z + 25}, form, speed) - end - - path[#path + 1] = routines.ground.buildWP(offset, form, speed) - path[#path + 1] = routines.ground.buildWP(rndCoord, form, speed) - - routines.goRoute(group, path) - - return -end - -routines.groupRandomDistSelf = function(gpData, dist, form, heading, speed) - local pos = routines.getLeadPos(gpData) - local fakeZone = {} - fakeZone.radius = dist or math.random(300, 1000) - fakeZone.point = {x = pos.x, y, pos.y, z = pos.z} - routines.groupToRandomZone(gpData, fakeZone, form, heading, speed) - - return -end - -routines.groupToRandomZone = function(gpData, zone, form, heading, speed) - if type(gpData) == 'string' then - gpData = Group.getByName(gpData) - end - - if type(zone) == 'string' then - zone = trigger.misc.getZone(zone) - elseif type(zone) == 'table' and not zone.radius then - zone = trigger.misc.getZone(zone[math.random(1, #zone)]) - end - - if speed then - speed = routines.utils.kmphToMps(speed) - end - - local vars = {} - vars.group = gpData - vars.radius = zone.radius - vars.form = form - vars.headingDegrees = heading - vars.speed = speed - vars.point = routines.utils.zoneToVec3(zone) - - routines.groupToRandomPoint(vars) - - return -end - -routines.isTerrainValid = function(coord, terrainTypes) -- vec2/3 and enum or table of acceptable terrain types - if coord.z then - coord.y = coord.z - end - local typeConverted = {} - - if type(terrainTypes) == 'string' then -- if its a string it does this check - for constId, constData in pairs(land.SurfaceType) do - if string.lower(constId) == string.lower(terrainTypes) or string.lower(constData) == string.lower(terrainTypes) then - table.insert(typeConverted, constId) - end - end - elseif type(terrainTypes) == 'table' then -- if its a table it does this check - for typeId, typeData in pairs(terrainTypes) do - for constId, constData in pairs(land.SurfaceType) do - if string.lower(constId) == string.lower(typeData) or string.lower(constData) == string.lower(typeId) then - table.insert(typeConverted, constId) - end - end - end - end - for validIndex, validData in pairs(typeConverted) do - if land.getSurfaceType(coord) == land.SurfaceType[validData] then - return true - end - end - return false -end - -routines.groupToPoint = function(gpData, point, form, heading, speed, useRoads) - if type(point) == 'string' then - point = trigger.misc.getZone(point) - end - if speed then - speed = routines.utils.kmphToMps(speed) - end - - local vars = {} - vars.group = gpData - vars.form = form - vars.headingDegrees = heading - vars.speed = speed - vars.disableRoads = useRoads - vars.point = routines.utils.zoneToVec3(point) - routines.groupToRandomPoint(vars) - - return -end - - -routines.getLeadPos = function(group) - if type(group) == 'string' then -- group name - group = Group.getByName(group) - end - - local units = group:getUnits() - - local leader = units[1] - if not leader then -- SHOULD be good, but if there is a bug, this code future-proofs it then. - local lowestInd = math.huge - for ind, unit in pairs(units) do - if ind < lowestInd then - lowestInd = ind - leader = unit - end - end - end - if leader and Unit.isExist(leader) then -- maybe a little too paranoid now... - return leader:getPosition().p - end -end - ---[[ vars for routines.getMGRSString: -vars.units - table of unit names (NOT unitNameTable- maybe this should change). -vars.acc - integer between 0 and 5, inclusive -]] -routines.getMGRSString = function(vars) - local units = vars.units - local acc = vars.acc or 5 - local avgPos = routines.getAvgPos(units) - if avgPos then - return routines.tostringMGRS(coord.LLtoMGRS(coord.LOtoLL(avgPos)), acc) - end -end - ---[[ vars for routines.getLLString -vars.units - table of unit names (NOT unitNameTable- maybe this should change). -vars.acc - integer, number of numbers after decimal place -vars.DMS - if true, output in degrees, minutes, seconds. Otherwise, output in degrees, minutes. - - -]] -routines.getLLString = function(vars) - local units = vars.units - local acc = vars.acc or 3 - local DMS = vars.DMS - local avgPos = routines.getAvgPos(units) - if avgPos then - local lat, lon = coord.LOtoLL(avgPos) - return routines.tostringLL(lat, lon, acc, DMS) - end -end - ---[[ -vars.zone - table of a zone name. -vars.ref - vec3 ref point, maybe overload for vec2 as well? -vars.alt - boolean, if used, includes altitude in string -vars.metric - boolean, gives distance in km instead of NM. -]] -routines.getBRStringZone = function(vars) - local zone = trigger.misc.getZone( vars.zone ) - local ref = routines.utils.makeVec3(vars.ref, 0) -- turn it into Vec3 if it is not already. - local alt = vars.alt - local metric = vars.metric - if zone then - local vec = {x = zone.point.x - ref.x, y = zone.point.y - ref.y, z = zone.point.z - ref.z} - local dir = routines.utils.getDir(vec, ref) - local dist = routines.utils.get2DDist(zone.point, ref) - if alt then - alt = zone.y - end - return routines.tostringBR(dir, dist, alt, metric) - else - env.info( 'routines.getBRStringZone: error: zone is nil' ) - end -end - ---[[ -vars.units- table of unit names (NOT unitNameTable- maybe this should change). -vars.ref - vec3 ref point, maybe overload for vec2 as well? -vars.alt - boolean, if used, includes altitude in string -vars.metric - boolean, gives distance in km instead of NM. -]] -routines.getBRString = function(vars) - local units = vars.units - local ref = routines.utils.makeVec3(vars.ref, 0) -- turn it into Vec3 if it is not already. - local alt = vars.alt - local metric = vars.metric - local avgPos = routines.getAvgPos(units) - if avgPos then - local vec = {x = avgPos.x - ref.x, y = avgPos.y - ref.y, z = avgPos.z - ref.z} - local dir = routines.utils.getDir(vec, ref) - local dist = routines.utils.get2DDist(avgPos, ref) - if alt then - alt = avgPos.y - end - return routines.tostringBR(dir, dist, alt, metric) - end -end - - --- Returns the Vec3 coordinates of the average position of the concentration of units most in the heading direction. ---[[ vars for routines.getLeadingPos: -vars.units - table of unit names -vars.heading - direction -vars.radius - number -vars.headingDegrees - boolean, switches heading to degrees -]] -routines.getLeadingPos = function(vars) - local units = vars.units - local heading = vars.heading - local radius = vars.radius - if vars.headingDegrees then - heading = routines.utils.toRadian(vars.headingDegrees) - end - - local unitPosTbl = {} - for i = 1, #units do - local unit = Unit.getByName(units[i]) - if unit and unit:isExist() then - unitPosTbl[#unitPosTbl + 1] = unit:getPosition().p - end - end - if #unitPosTbl > 0 then -- one more more units found. - -- first, find the unit most in the heading direction - local maxPos = -math.huge - - local maxPosInd -- maxPos - the furthest in direction defined by heading; maxPosInd = - for i = 1, #unitPosTbl do - local rotatedVec2 = routines.vec.rotateVec2(routines.utils.makeVec2(unitPosTbl[i]), heading) - if (not maxPos) or maxPos < rotatedVec2.x then - maxPos = rotatedVec2.x - maxPosInd = i - end - end - - --now, get all the units around this unit... - local avgPos - if radius then - local maxUnitPos = unitPosTbl[maxPosInd] - local avgx, avgy, avgz, totNum = 0, 0, 0, 0 - for i = 1, #unitPosTbl do - if routines.utils.get2DDist(maxUnitPos, unitPosTbl[i]) <= radius then - avgx = avgx + unitPosTbl[i].x - avgy = avgy + unitPosTbl[i].y - avgz = avgz + unitPosTbl[i].z - totNum = totNum + 1 - end - end - avgPos = { x = avgx/totNum, y = avgy/totNum, z = avgz/totNum} - else - avgPos = unitPosTbl[maxPosInd] - end - - return avgPos - end -end - - ---[[ vars for routines.getLeadingMGRSString: -vars.units - table of unit names -vars.heading - direction -vars.radius - number -vars.headingDegrees - boolean, switches heading to degrees -vars.acc - number, 0 to 5. -]] -routines.getLeadingMGRSString = function(vars) - local pos = routines.getLeadingPos(vars) - if pos then - local acc = vars.acc or 5 - return routines.tostringMGRS(coord.LLtoMGRS(coord.LOtoLL(pos)), acc) - end -end - ---[[ vars for routines.getLeadingLLString: -vars.units - table of unit names -vars.heading - direction, number -vars.radius - number -vars.headingDegrees - boolean, switches heading to degrees -vars.acc - number of digits after decimal point (can be negative) -vars.DMS - boolean, true if you want DMS. -]] -routines.getLeadingLLString = function(vars) - local pos = routines.getLeadingPos(vars) - if pos then - local acc = vars.acc or 3 - local DMS = vars.DMS - local lat, lon = coord.LOtoLL(pos) - return routines.tostringLL(lat, lon, acc, DMS) - end -end - - - ---[[ vars for routines.getLeadingBRString: -vars.units - table of unit names -vars.heading - direction, number -vars.radius - number -vars.headingDegrees - boolean, switches heading to degrees -vars.metric - boolean, if true, use km instead of NM. -vars.alt - boolean, if true, include altitude. -vars.ref - vec3/vec2 reference point. -]] -routines.getLeadingBRString = function(vars) - local pos = routines.getLeadingPos(vars) - if pos then - local ref = vars.ref - local alt = vars.alt - local metric = vars.metric - - local vec = {x = pos.x - ref.x, y = pos.y - ref.y, z = pos.z - ref.z} - local dir = routines.utils.getDir(vec, ref) - local dist = routines.utils.get2DDist(pos, ref) - if alt then - alt = pos.y - end - return routines.tostringBR(dir, dist, alt, metric) - end -end - ---[[ vars for routines.message.add - vars.text = 'Hello World' - vars.displayTime = 20 - vars.msgFor = {coa = {'red'}, countries = {'Ukraine', 'Georgia'}, unitTypes = {'A-10C'}} - -]] - ---[[ vars for routines.msgMGRS -vars.units - table of unit names (NOT unitNameTable- maybe this should change). -vars.acc - integer between 0 and 5, inclusive -vars.text - text in the message -vars.displayTime - self explanatory -vars.msgFor - scope -]] -routines.msgMGRS = function(vars) - local units = vars.units - local acc = vars.acc - local text = vars.text - local displayTime = vars.displayTime - local msgFor = vars.msgFor - - local s = routines.getMGRSString{units = units, acc = acc} - local newText - if string.find(text, '%%s') then -- look for %s - newText = string.format(text, s) -- insert the coordinates into the message - else -- else, just append to the end. - newText = text .. s - end - - routines.message.add{ - text = newText, - displayTime = displayTime, - msgFor = msgFor - } -end - ---[[ vars for routines.msgLL -vars.units - table of unit names (NOT unitNameTable- maybe this should change) (Yes). -vars.acc - integer, number of numbers after decimal place -vars.DMS - if true, output in degrees, minutes, seconds. Otherwise, output in degrees, minutes. -vars.text - text in the message -vars.displayTime - self explanatory -vars.msgFor - scope -]] -routines.msgLL = function(vars) - local units = vars.units -- technically, I don't really need to do this, but it helps readability. - local acc = vars.acc - local DMS = vars.DMS - local text = vars.text - local displayTime = vars.displayTime - local msgFor = vars.msgFor - - local s = routines.getLLString{units = units, acc = acc, DMS = DMS} - local newText - if string.find(text, '%%s') then -- look for %s - newText = string.format(text, s) -- insert the coordinates into the message - else -- else, just append to the end. - newText = text .. s - end - - routines.message.add{ - text = newText, - displayTime = displayTime, - msgFor = msgFor - } - -end - - ---[[ -vars.units- table of unit names (NOT unitNameTable- maybe this should change). -vars.ref - vec3 ref point, maybe overload for vec2 as well? -vars.alt - boolean, if used, includes altitude in string -vars.metric - boolean, gives distance in km instead of NM. -vars.text - text of the message -vars.displayTime -vars.msgFor - scope -]] -routines.msgBR = function(vars) - local units = vars.units -- technically, I don't really need to do this, but it helps readability. - local ref = vars.ref -- vec2/vec3 will be handled in routines.getBRString - local alt = vars.alt - local metric = vars.metric - local text = vars.text - local displayTime = vars.displayTime - local msgFor = vars.msgFor - - local s = routines.getBRString{units = units, ref = ref, alt = alt, metric = metric} - local newText - if string.find(text, '%%s') then -- look for %s - newText = string.format(text, s) -- insert the coordinates into the message - else -- else, just append to the end. - newText = text .. s - end - - routines.message.add{ - text = newText, - displayTime = displayTime, - msgFor = msgFor - } - -end - - --------------------------------------------------------------------------------------------- --- basically, just sub-types of routines.msgBR... saves folks the work of getting the ref point. ---[[ -vars.units- table of unit names (NOT unitNameTable- maybe this should change). -vars.ref - string red, blue -vars.alt - boolean, if used, includes altitude in string -vars.metric - boolean, gives distance in km instead of NM. -vars.text - text of the message -vars.displayTime -vars.msgFor - scope -]] -routines.msgBullseye = function(vars) - if string.lower(vars.ref) == 'red' then - vars.ref = routines.DBs.missionData.bullseye.red - routines.msgBR(vars) - elseif string.lower(vars.ref) == 'blue' then - vars.ref = routines.DBs.missionData.bullseye.blue - routines.msgBR(vars) - end -end - ---[[ -vars.units- table of unit names (NOT unitNameTable- maybe this should change). -vars.ref - unit name of reference point -vars.alt - boolean, if used, includes altitude in string -vars.metric - boolean, gives distance in km instead of NM. -vars.text - text of the message -vars.displayTime -vars.msgFor - scope -]] - -routines.msgBRA = function(vars) - if Unit.getByName(vars.ref) then - vars.ref = Unit.getByName(vars.ref):getPosition().p - if not vars.alt then - vars.alt = true - end - routines.msgBR(vars) - end -end --------------------------------------------------------------------------------------------- - ---[[ vars for routines.msgLeadingMGRS: -vars.units - table of unit names -vars.heading - direction -vars.radius - number -vars.headingDegrees - boolean, switches heading to degrees (optional) -vars.acc - number, 0 to 5. -vars.text - text of the message -vars.displayTime -vars.msgFor - scope -]] -routines.msgLeadingMGRS = function(vars) - local units = vars.units -- technically, I don't really need to do this, but it helps readability. - local heading = vars.heading - local radius = vars.radius - local headingDegrees = vars.headingDegrees - local acc = vars.acc - local text = vars.text - local displayTime = vars.displayTime - local msgFor = vars.msgFor - - local s = routines.getLeadingMGRSString{units = units, heading = heading, radius = radius, headingDegrees = headingDegrees, acc = acc} - local newText - if string.find(text, '%%s') then -- look for %s - newText = string.format(text, s) -- insert the coordinates into the message - else -- else, just append to the end. - newText = text .. s - end - - routines.message.add{ - text = newText, - displayTime = displayTime, - msgFor = msgFor - } - - -end ---[[ vars for routines.msgLeadingLL: -vars.units - table of unit names -vars.heading - direction, number -vars.radius - number -vars.headingDegrees - boolean, switches heading to degrees (optional) -vars.acc - number of digits after decimal point (can be negative) -vars.DMS - boolean, true if you want DMS. (optional) -vars.text - text of the message -vars.displayTime -vars.msgFor - scope -]] -routines.msgLeadingLL = function(vars) - local units = vars.units -- technically, I don't really need to do this, but it helps readability. - local heading = vars.heading - local radius = vars.radius - local headingDegrees = vars.headingDegrees - local acc = vars.acc - local DMS = vars.DMS - local text = vars.text - local displayTime = vars.displayTime - local msgFor = vars.msgFor - - local s = routines.getLeadingLLString{units = units, heading = heading, radius = radius, headingDegrees = headingDegrees, acc = acc, DMS = DMS} - local newText - if string.find(text, '%%s') then -- look for %s - newText = string.format(text, s) -- insert the coordinates into the message - else -- else, just append to the end. - newText = text .. s - end - - routines.message.add{ - text = newText, - displayTime = displayTime, - msgFor = msgFor - } - -end - ---[[ -vars.units - table of unit names -vars.heading - direction, number -vars.radius - number -vars.headingDegrees - boolean, switches heading to degrees (optional) -vars.metric - boolean, if true, use km instead of NM. (optional) -vars.alt - boolean, if true, include altitude. (optional) -vars.ref - vec3/vec2 reference point. -vars.text - text of the message -vars.displayTime -vars.msgFor - scope -]] -routines.msgLeadingBR = function(vars) - local units = vars.units -- technically, I don't really need to do this, but it helps readability. - local heading = vars.heading - local radius = vars.radius - local headingDegrees = vars.headingDegrees - local metric = vars.metric - local alt = vars.alt - local ref = vars.ref -- vec2/vec3 will be handled in routines.getBRString - local text = vars.text - local displayTime = vars.displayTime - local msgFor = vars.msgFor - - local s = routines.getLeadingBRString{units = units, heading = heading, radius = radius, headingDegrees = headingDegrees, metric = metric, alt = alt, ref = ref} - local newText - if string.find(text, '%%s') then -- look for %s - newText = string.format(text, s) -- insert the coordinates into the message - else -- else, just append to the end. - newText = text .. s - end - - routines.message.add{ - text = newText, - displayTime = displayTime, - msgFor = msgFor - } -end - - -function spairs(t, order) - -- collect the keys - local keys = {} - for k in pairs(t) do keys[#keys+1] = k end - - -- if order function given, sort by it by passing the table and keys a, b, - -- otherwise just sort the keys - if order then - table.sort(keys, function(a,b) return order(t, a, b) end) - else - table.sort(keys) - end - - -- return the iterator function - local i = 0 - return function() - i = i + 1 - if keys[i] then - return keys[i], t[keys[i]] - end - end -end - - -function routines.IsPartOfGroupInZones( CargoGroup, LandingZones ) ---trace.f() - - local CurrentZoneID = nil - - if CargoGroup then - local CargoUnits = CargoGroup:getUnits() - for CargoUnitID, CargoUnit in pairs( CargoUnits ) do - if CargoUnit and CargoUnit:getLife() >= 1.0 then - CurrentZoneID = routines.IsUnitInZones( CargoUnit, LandingZones ) - if CurrentZoneID then - break - end - end - end - end - ---trace.r( "", "", { CurrentZoneID } ) - return CurrentZoneID -end - - - -function routines.IsUnitInZones( TransportUnit, LandingZones ) ---trace.f("", "routines.IsUnitInZones" ) - - local TransportZoneResult = nil - local TransportZonePos = nil - local TransportZone = nil - - -- fill-up some local variables to support further calculations to determine location of units within the zone. - if TransportUnit then - local TransportUnitPos = TransportUnit:getPosition().p - if type( LandingZones ) == "table" then - for LandingZoneID, LandingZoneName in pairs( LandingZones ) do - TransportZone = trigger.misc.getZone( LandingZoneName ) - if TransportZone then - TransportZonePos = {radius = TransportZone.radius, x = TransportZone.point.x, y = TransportZone.point.y, z = TransportZone.point.z} - if ((( TransportUnitPos.x - TransportZonePos.x)^2 + (TransportUnitPos.z - TransportZonePos.z)^2)^0.5 <= TransportZonePos.radius) then - TransportZoneResult = LandingZoneID - break - end - end - end - else - TransportZone = trigger.misc.getZone( LandingZones ) - TransportZonePos = {radius = TransportZone.radius, x = TransportZone.point.x, y = TransportZone.point.y, z = TransportZone.point.z} - if ((( TransportUnitPos.x - TransportZonePos.x)^2 + (TransportUnitPos.z - TransportZonePos.z)^2)^0.5 <= TransportZonePos.radius) then - TransportZoneResult = 1 - end - end - if TransportZoneResult then - --trace.i( "routines", "TransportZone:" .. TransportZoneResult ) - else - --trace.i( "routines", "TransportZone:nil logic" ) - end - return TransportZoneResult - else - --trace.i( "routines", "TransportZone:nil hard" ) - return nil - end -end - -function routines.IsUnitNearZonesRadius( TransportUnit, LandingZones, ZoneRadius ) ---trace.f("", "routines.IsUnitInZones" ) - - local TransportZoneResult = nil - local TransportZonePos = nil - local TransportZone = nil - - -- fill-up some local variables to support further calculations to determine location of units within the zone. - if TransportUnit then - local TransportUnitPos = TransportUnit:getPosition().p - if type( LandingZones ) == "table" then - for LandingZoneID, LandingZoneName in pairs( LandingZones ) do - TransportZone = trigger.misc.getZone( LandingZoneName ) - if TransportZone then - TransportZonePos = {radius = TransportZone.radius, x = TransportZone.point.x, y = TransportZone.point.y, z = TransportZone.point.z} - if ((( TransportUnitPos.x - TransportZonePos.x)^2 + (TransportUnitPos.z - TransportZonePos.z)^2)^0.5 <= ZoneRadius ) then - TransportZoneResult = LandingZoneID - break - end - end - end - else - TransportZone = trigger.misc.getZone( LandingZones ) - TransportZonePos = {radius = TransportZone.radius, x = TransportZone.point.x, y = TransportZone.point.y, z = TransportZone.point.z} - if ((( TransportUnitPos.x - TransportZonePos.x)^2 + (TransportUnitPos.z - TransportZonePos.z)^2)^0.5 <= ZoneRadius ) then - TransportZoneResult = 1 - end - end - if TransportZoneResult then - --trace.i( "routines", "TransportZone:" .. TransportZoneResult ) - else - --trace.i( "routines", "TransportZone:nil logic" ) - end - return TransportZoneResult - else - --trace.i( "routines", "TransportZone:nil hard" ) - return nil - end -end - - -function routines.IsStaticInZones( TransportStatic, LandingZones ) ---trace.f() - - local TransportZoneResult = nil - local TransportZonePos = nil - local TransportZone = nil - - -- fill-up some local variables to support further calculations to determine location of units within the zone. - local TransportStaticPos = TransportStatic:getPosition().p - if type( LandingZones ) == "table" then - for LandingZoneID, LandingZoneName in pairs( LandingZones ) do - TransportZone = trigger.misc.getZone( LandingZoneName ) - if TransportZone then - TransportZonePos = {radius = TransportZone.radius, x = TransportZone.point.x, y = TransportZone.point.y, z = TransportZone.point.z} - if ((( TransportStaticPos.x - TransportZonePos.x)^2 + (TransportStaticPos.z - TransportZonePos.z)^2)^0.5 <= TransportZonePos.radius) then - TransportZoneResult = LandingZoneID - break - end - end - end - else - TransportZone = trigger.misc.getZone( LandingZones ) - TransportZonePos = {radius = TransportZone.radius, x = TransportZone.point.x, y = TransportZone.point.y, z = TransportZone.point.z} - if ((( TransportStaticPos.x - TransportZonePos.x)^2 + (TransportStaticPos.z - TransportZonePos.z)^2)^0.5 <= TransportZonePos.radius) then - TransportZoneResult = 1 - end - end - ---trace.r( "", "", { TransportZoneResult } ) - return TransportZoneResult -end - - -function routines.IsUnitInRadius( CargoUnit, ReferencePosition, Radius ) ---trace.f() - - local Valid = true - - -- fill-up some local variables to support further calculations to determine location of units within the zone. - local CargoPos = CargoUnit:getPosition().p - local ReferenceP = ReferencePosition.p - - if (((CargoPos.x - ReferenceP.x)^2 + (CargoPos.z - ReferenceP.z)^2)^0.5 <= Radius) then - else - Valid = false - end - - return Valid -end - -function routines.IsPartOfGroupInRadius( CargoGroup, ReferencePosition, Radius ) ---trace.f() - - local Valid = true - - Valid = routines.ValidateGroup( CargoGroup, "CargoGroup", Valid ) - - -- fill-up some local variables to support further calculations to determine location of units within the zone - local CargoUnits = CargoGroup:getUnits() - for CargoUnitId, CargoUnit in pairs( CargoUnits ) do - local CargoUnitPos = CargoUnit:getPosition().p --- env.info( 'routines.IsPartOfGroupInRadius: CargoUnitPos.x = ' .. CargoUnitPos.x .. ' CargoUnitPos.z = ' .. CargoUnitPos.z ) - local ReferenceP = ReferencePosition.p --- env.info( 'routines.IsPartOfGroupInRadius: ReferenceGroupPos.x = ' .. ReferenceGroupPos.x .. ' ReferenceGroupPos.z = ' .. ReferenceGroupPos.z ) - - if ((( CargoUnitPos.x - ReferenceP.x)^2 + (CargoUnitPos.z - ReferenceP.z)^2)^0.5 <= Radius) then - else - Valid = false - break - end - end - - return Valid -end - - -function routines.ValidateString( Variable, VariableName, Valid ) ---trace.f() - - if type( Variable ) == "string" then - if Variable == "" then - error( "routines.ValidateString: error: " .. VariableName .. " must be filled out!" ) - Valid = false - end - else - error( "routines.ValidateString: error: " .. VariableName .. " is not a string." ) - Valid = false - end - ---trace.r( "", "", { Valid } ) - return Valid -end - -function routines.ValidateNumber( Variable, VariableName, Valid ) ---trace.f() - - if type( Variable ) == "number" then - else - error( "routines.ValidateNumber: error: " .. VariableName .. " is not a number." ) - Valid = false - end - ---trace.r( "", "", { Valid } ) - return Valid - -end - -function routines.ValidateGroup( Variable, VariableName, Valid ) ---trace.f() - - if Variable == nil then - error( "routines.ValidateGroup: error: " .. VariableName .. " is a nil value!" ) - Valid = false - end - ---trace.r( "", "", { Valid } ) - return Valid -end - -function routines.ValidateZone( LandingZones, VariableName, Valid ) ---trace.f() - - if LandingZones == nil then - error( "routines.ValidateGroup: error: " .. VariableName .. " is a nil value!" ) - Valid = false - end - - if type( LandingZones ) == "table" then - for LandingZoneID, LandingZoneName in pairs( LandingZones ) do - if trigger.misc.getZone( LandingZoneName ) == nil then - error( "routines.ValidateGroup: error: Zone " .. LandingZoneName .. " does not exist!" ) - Valid = false - break - end - end - else - if trigger.misc.getZone( LandingZones ) == nil then - error( "routines.ValidateGroup: error: Zone " .. LandingZones .. " does not exist!" ) - Valid = false - end - end - ---trace.r( "", "", { Valid } ) - return Valid -end - -function routines.ValidateEnumeration( Variable, VariableName, Enum, Valid ) ---trace.f() - - local ValidVariable = false - - for EnumId, EnumData in pairs( Enum ) do - if Variable == EnumData then - ValidVariable = true - break - end - end - - if ValidVariable then - else - error( 'TransportValidateEnum: " .. VariableName .. " is not a valid type.' .. Variable ) - Valid = false - end - ---trace.r( "", "", { Valid } ) - return Valid -end - -function routines.getGroupRoute(groupIdent, task) -- same as getGroupPoints but returns speed and formation type along with vec2 of point} - -- refactor to search by groupId and allow groupId and groupName as inputs - local gpId = groupIdent - if type(groupIdent) == 'string' and not tonumber(groupIdent) then - gpId = _DATABASE.Templates.Groups[groupIdent].groupId - end - - for coa_name, coa_data in pairs(env.mission.coalition) do - if (coa_name == 'red' or coa_name == 'blue') and type(coa_data) == 'table' then - if coa_data.country then --there is a country table - for cntry_id, cntry_data in pairs(coa_data.country) do - for obj_type_name, obj_type_data in pairs(cntry_data) do - if obj_type_name == "helicopter" or obj_type_name == "ship" or obj_type_name == "plane" or obj_type_name == "vehicle" then -- only these types have points - if ((type(obj_type_data) == 'table') and obj_type_data.group and (type(obj_type_data.group) == 'table') and (#obj_type_data.group > 0)) then --there's a group! - for group_num, group_data in pairs(obj_type_data.group) do - if group_data and group_data.groupId == gpId then -- this is the group we are looking for - if group_data.route and group_data.route.points and #group_data.route.points > 0 then - local points = {} - - for point_num, point in pairs(group_data.route.points) do - local routeData = {} - if not point.point then - routeData.x = point.x - routeData.y = point.y - else - routeData.point = point.point --it's possible that the ME could move to the point = Vec2 notation. - end - routeData.form = point.action - routeData.speed = point.speed - routeData.alt = point.alt - routeData.alt_type = point.alt_type - routeData.airdromeId = point.airdromeId - routeData.helipadId = point.helipadId - routeData.type = point.type - routeData.action = point.action - if task then - routeData.task = point.task - end - points[point_num] = routeData - end - - return points - end - return - end --if group_data and group_data.name and group_data.name == 'groupname' - end --for group_num, group_data in pairs(obj_type_data.group) do - end --if ((type(obj_type_data) == 'table') and obj_type_data.group and (type(obj_type_data.group) == 'table') and (#obj_type_data.group > 0)) then - end --if obj_type_name == "helicopter" or obj_type_name == "ship" or obj_type_name == "plane" or obj_type_name == "vehicle" or obj_type_name == "static" then - end --for obj_type_name, obj_type_data in pairs(cntry_data) do - end --for cntry_id, cntry_data in pairs(coa_data.country) do - end --if coa_data.country then --there is a country table - end --if coa_name == 'red' or coa_name == 'blue' and type(coa_data) == 'table' then - end --for coa_name, coa_data in pairs(mission.coalition) do -end - -routines.ground.patrolRoute = function(vars) - - - local tempRoute = {} - local useRoute = {} - local gpData = vars.gpData - if type(gpData) == 'string' then - gpData = Group.getByName(gpData) - end - - local useGroupRoute - if not vars.useGroupRoute then - useGroupRoute = vars.gpData - else - useGroupRoute = vars.useGroupRoute - end - local routeProvided = false - if not vars.route then - if useGroupRoute then - tempRoute = routines.getGroupRoute(useGroupRoute) - end - else - useRoute = vars.route - local posStart = routines.getLeadPos(gpData) - useRoute[1] = routines.ground.buildWP(posStart, useRoute[1].action, useRoute[1].speed) - routeProvided = true - end - - - local overRideSpeed = vars.speed or 'default' - local pType = vars.pType - local offRoadForm = vars.offRoadForm or 'default' - local onRoadForm = vars.onRoadForm or 'default' - - if routeProvided == false and #tempRoute > 0 then - local posStart = routines.getLeadPos(gpData) - - - useRoute[#useRoute + 1] = routines.ground.buildWP(posStart, offRoadForm, overRideSpeed) - for i = 1, #tempRoute do - local tempForm = tempRoute[i].action - local tempSpeed = tempRoute[i].speed - - if offRoadForm == 'default' then - tempForm = tempRoute[i].action - end - if onRoadForm == 'default' then - onRoadForm = 'On Road' - end - if (string.lower(tempRoute[i].action) == 'on road' or string.lower(tempRoute[i].action) == 'onroad' or string.lower(tempRoute[i].action) == 'on_road') then - tempForm = onRoadForm - else - tempForm = offRoadForm - end - - if type(overRideSpeed) == 'number' then - tempSpeed = overRideSpeed - end - - - useRoute[#useRoute + 1] = routines.ground.buildWP(tempRoute[i], tempForm, tempSpeed) - end - - if pType and string.lower(pType) == 'doubleback' then - local curRoute = routines.utils.deepCopy(useRoute) - for i = #curRoute, 2, -1 do - useRoute[#useRoute + 1] = routines.ground.buildWP(curRoute[i], curRoute[i].action, curRoute[i].speed) - end - end - - useRoute[1].action = useRoute[#useRoute].action -- make it so the first WP matches the last WP - end - - local cTask3 = {} - local newPatrol = {} - newPatrol.route = useRoute - newPatrol.gpData = gpData:getName() - cTask3[#cTask3 + 1] = 'routines.ground.patrolRoute(' - cTask3[#cTask3 + 1] = routines.utils.oneLineSerialize(newPatrol) - cTask3[#cTask3 + 1] = ')' - cTask3 = table.concat(cTask3) - local tempTask = { - id = 'WrappedAction', - params = { - action = { - id = 'Script', - params = { - command = cTask3, - - }, - }, - }, - } - - - useRoute[#useRoute].task = tempTask - routines.goRoute(gpData, useRoute) - - return -end - -routines.ground.patrol = function(gpData, pType, form, speed) - local vars = {} - - if type(gpData) == 'table' and gpData:getName() then - gpData = gpData:getName() - end - - vars.useGroupRoute = gpData - vars.gpData = gpData - vars.pType = pType - vars.offRoadForm = form - vars.speed = speed - - routines.ground.patrolRoute(vars) - - return -end - -function routines.GetUnitHeight( CheckUnit ) ---trace.f( "routines" ) - - local UnitPoint = CheckUnit:getPoint() - local UnitPosition = { x = UnitPoint.x, y = UnitPoint.z } - local UnitHeight = UnitPoint.y - - local LandHeight = land.getHeight( UnitPosition ) - - --env.info(( 'CarrierHeight: LandHeight = ' .. LandHeight .. ' CarrierHeight = ' .. CarrierHeight )) - - --trace.f( "routines", "Unit Height = " .. UnitHeight - LandHeight ) - - return UnitHeight - LandHeight - -end - - - -Su34Status = { status = {} } -boardMsgRed = { statusMsg = "" } -boardMsgAll = { timeMsg = "" } -SpawnSettings = {} -Su34MenuPath = {} -Su34Menus = 0 - - -function Su34AttackCarlVinson(groupName) ---trace.menu("", "Su34AttackCarlVinson") - local groupSu34 = Group.getByName( groupName ) - local controllerSu34 = groupSu34.getController(groupSu34) - local groupCarlVinson = Group.getByName("US Carl Vinson #001") - controllerSu34.setOption( controllerSu34, AI.Option.Air.id.ROE, AI.Option.Air.val.ROE.OPEN_FIRE ) - controllerSu34.setOption( controllerSu34, AI.Option.Air.id.REACTION_ON_THREAT, AI.Option.Air.val.REACTION_ON_THREAT.EVADE_FIRE ) - if groupCarlVinson ~= nil then - controllerSu34.pushTask(controllerSu34,{id = 'AttackGroup', params = { groupId = groupCarlVinson:getID(), expend = AI.Task.WeaponExpend.ALL, attackQtyLimit = true}}) - end - Su34Status.status[groupName] = 1 - MessageToRed( string.format('%s: ',groupName) .. 'Attacking carrier Carl Vinson. ', 10, 'RedStatus' .. groupName ) -end - -function Su34AttackWest(groupName) ---trace.f("","Su34AttackWest") - local groupSu34 = Group.getByName( groupName ) - local controllerSu34 = groupSu34.getController(groupSu34) - local groupShipWest1 = Group.getByName("US Ship West #001") - local groupShipWest2 = Group.getByName("US Ship West #002") - controllerSu34.setOption( controllerSu34, AI.Option.Air.id.ROE, AI.Option.Air.val.ROE.OPEN_FIRE ) - controllerSu34.setOption( controllerSu34, AI.Option.Air.id.REACTION_ON_THREAT, AI.Option.Air.val.REACTION_ON_THREAT.EVADE_FIRE ) - if groupShipWest1 ~= nil then - controllerSu34.pushTask(controllerSu34,{id = 'AttackGroup', params = { groupId = groupShipWest1:getID(), expend = AI.Task.WeaponExpend.ALL, attackQtyLimit = true}}) - end - if groupShipWest2 ~= nil then - controllerSu34.pushTask(controllerSu34,{id = 'AttackGroup', params = { groupId = groupShipWest2:getID(), expend = AI.Task.WeaponExpend.ALL, attackQtyLimit = true}}) - end - Su34Status.status[groupName] = 2 - MessageToRed( string.format('%s: ',groupName) .. 'Attacking invading ships in the west. ', 10, 'RedStatus' .. groupName ) -end - -function Su34AttackNorth(groupName) ---trace.menu("","Su34AttackNorth") - local groupSu34 = Group.getByName( groupName ) - local controllerSu34 = groupSu34.getController(groupSu34) - local groupShipNorth1 = Group.getByName("US Ship North #001") - local groupShipNorth2 = Group.getByName("US Ship North #002") - local groupShipNorth3 = Group.getByName("US Ship North #003") - controllerSu34.setOption( controllerSu34, AI.Option.Air.id.ROE, AI.Option.Air.val.ROE.OPEN_FIRE ) - controllerSu34.setOption( controllerSu34, AI.Option.Air.id.REACTION_ON_THREAT, AI.Option.Air.val.REACTION_ON_THREAT.EVADE_FIRE ) - if groupShipNorth1 ~= nil then - controllerSu34.pushTask(controllerSu34,{id = 'AttackGroup', params = { groupId = groupShipNorth1:getID(), expend = AI.Task.WeaponExpend.ALL, attackQtyLimit = false}}) - end - if groupShipNorth2 ~= nil then - controllerSu34.pushTask(controllerSu34,{id = 'AttackGroup', params = { groupId = groupShipNorth2:getID(), expend = AI.Task.WeaponExpend.ALL, attackQtyLimit = false}}) - end - if groupShipNorth3 ~= nil then - controllerSu34.pushTask(controllerSu34,{id = 'AttackGroup', params = { groupId = groupShipNorth3:getID(), expend = AI.Task.WeaponExpend.ALL, attackQtyLimit = false}}) - end - Su34Status.status[groupName] = 3 - MessageToRed( string.format('%s: ',groupName) .. 'Attacking invading ships in the north. ', 10, 'RedStatus' .. groupName ) -end - -function Su34Orbit(groupName) ---trace.menu("","Su34Orbit") - local groupSu34 = Group.getByName( groupName ) - local controllerSu34 = groupSu34:getController() - controllerSu34.setOption( controllerSu34, AI.Option.Air.id.ROE, AI.Option.Air.val.ROE.WEAPON_HOLD ) - controllerSu34.setOption( controllerSu34, AI.Option.Air.id.REACTION_ON_THREAT, AI.Option.Air.val.REACTION_ON_THREAT.EVADE_FIRE ) - controllerSu34:pushTask( {id = 'ControlledTask', params = { task = { id = 'Orbit', params = { pattern = AI.Task.OrbitPattern.RACE_TRACK } }, stopCondition = { duration = 600 } } } ) - Su34Status.status[groupName] = 4 - MessageToRed( string.format('%s: ',groupName) .. 'In orbit and awaiting further instructions. ', 10, 'RedStatus' .. groupName ) -end - -function Su34TakeOff(groupName) ---trace.menu("","Su34TakeOff") - local groupSu34 = Group.getByName( groupName ) - local controllerSu34 = groupSu34:getController() - controllerSu34.setOption( controllerSu34, AI.Option.Air.id.ROE, AI.Option.Air.val.ROE.WEAPON_HOLD ) - controllerSu34.setOption( controllerSu34, AI.Option.Air.id.REACTION_ON_THREAT, AI.Option.Air.val.REACTION_ON_THREAT.BYPASS_AND_ESCAPE ) - Su34Status.status[groupName] = 8 - MessageToRed( string.format('%s: ',groupName) .. 'Take-Off. ', 10, 'RedStatus' .. groupName ) -end - -function Su34Hold(groupName) ---trace.menu("","Su34Hold") - local groupSu34 = Group.getByName( groupName ) - local controllerSu34 = groupSu34:getController() - controllerSu34.setOption( controllerSu34, AI.Option.Air.id.ROE, AI.Option.Air.val.ROE.WEAPON_HOLD ) - controllerSu34.setOption( controllerSu34, AI.Option.Air.id.REACTION_ON_THREAT, AI.Option.Air.val.REACTION_ON_THREAT.BYPASS_AND_ESCAPE ) - Su34Status.status[groupName] = 5 - MessageToRed( string.format('%s: ',groupName) .. 'Holding Weapons. ', 10, 'RedStatus' .. groupName ) -end - -function Su34RTB(groupName) ---trace.menu("","Su34RTB") - Su34Status.status[groupName] = 6 - MessageToRed( string.format('%s: ',groupName) .. 'Return to Krasnodar. ', 10, 'RedStatus' .. groupName ) -end - -function Su34Destroyed(groupName) ---trace.menu("","Su34Destroyed") - Su34Status.status[groupName] = 7 - MessageToRed( string.format('%s: ',groupName) .. 'Destroyed. ', 30, 'RedStatus' .. groupName ) -end - -function GroupAlive( groupName ) ---trace.menu("","GroupAlive") - local groupTest = Group.getByName( groupName ) - - local groupExists = false - - if groupTest then - groupExists = groupTest:isExist() - end - - --trace.r( "", "", { groupExists } ) - return groupExists -end - -function Su34IsDead() ---trace.f() - -end - -function Su34OverviewStatus() ---trace.menu("","Su34OverviewStatus") - local msg = "" - local currentStatus = 0 - local Exists = false - - for groupName, currentStatus in pairs(Su34Status.status) do - - env.info(('Su34 Overview Status: GroupName = ' .. groupName )) - Alive = GroupAlive( groupName ) - - if Alive then - if currentStatus == 1 then - msg = msg .. string.format("%s: ",groupName) - msg = msg .. "Attacking carrier Carl Vinson. " - elseif currentStatus == 2 then - msg = msg .. string.format("%s: ",groupName) - msg = msg .. "Attacking supporting ships in the west. " - elseif currentStatus == 3 then - msg = msg .. string.format("%s: ",groupName) - msg = msg .. "Attacking invading ships in the north. " - elseif currentStatus == 4 then - msg = msg .. string.format("%s: ",groupName) - msg = msg .. "In orbit and awaiting further instructions. " - elseif currentStatus == 5 then - msg = msg .. string.format("%s: ",groupName) - msg = msg .. "Holding Weapons. " - elseif currentStatus == 6 then - msg = msg .. string.format("%s: ",groupName) - msg = msg .. "Return to Krasnodar. " - elseif currentStatus == 7 then - msg = msg .. string.format("%s: ",groupName) - msg = msg .. "Destroyed. " - elseif currentStatus == 8 then - msg = msg .. string.format("%s: ",groupName) - msg = msg .. "Take-Off. " - end - else - if currentStatus == 7 then - msg = msg .. string.format("%s: ",groupName) - msg = msg .. "Destroyed. " - else - Su34Destroyed(groupName) - end - end - end - - boardMsgRed.statusMsg = msg -end - - -function UpdateBoardMsg() ---trace.f() - Su34OverviewStatus() - MessageToRed( boardMsgRed.statusMsg, 15, 'RedStatus' ) -end - -function MusicReset( flg ) ---trace.f() - trigger.action.setUserFlag(95,flg) -end - -function PlaneActivate(groupNameFormat, flg) ---trace.f() - local groupName = groupNameFormat .. string.format("#%03d", trigger.misc.getUserFlag(flg)) - --trigger.action.outText(groupName,10) - trigger.action.activateGroup(Group.getByName(groupName)) -end - -function Su34Menu(groupName) ---trace.f() - - --env.info(( 'Su34Menu(' .. groupName .. ')' )) - local groupSu34 = Group.getByName( groupName ) - - if Su34Status.status[groupName] == 1 or - Su34Status.status[groupName] == 2 or - Su34Status.status[groupName] == 3 or - Su34Status.status[groupName] == 4 or - Su34Status.status[groupName] == 5 then - if Su34MenuPath[groupName] == nil then - if planeMenuPath == nil then - planeMenuPath = missionCommands.addSubMenuForCoalition( - coalition.side.RED, - "SU-34 anti-ship flights", - nil - ) - end - Su34MenuPath[groupName] = missionCommands.addSubMenuForCoalition( - coalition.side.RED, - "Flight " .. groupName, - planeMenuPath - ) - - missionCommands.addCommandForCoalition( - coalition.side.RED, - "Attack carrier Carl Vinson", - Su34MenuPath[groupName], - Su34AttackCarlVinson, - groupName - ) - - missionCommands.addCommandForCoalition( - coalition.side.RED, - "Attack ships in the west", - Su34MenuPath[groupName], - Su34AttackWest, - groupName - ) - - missionCommands.addCommandForCoalition( - coalition.side.RED, - "Attack ships in the north", - Su34MenuPath[groupName], - Su34AttackNorth, - groupName - ) - - missionCommands.addCommandForCoalition( - coalition.side.RED, - "Hold position and await instructions", - Su34MenuPath[groupName], - Su34Orbit, - groupName - ) - - missionCommands.addCommandForCoalition( - coalition.side.RED, - "Report status", - Su34MenuPath[groupName], - Su34OverviewStatus - ) - end - else - if Su34MenuPath[groupName] then - missionCommands.removeItemForCoalition(coalition.side.RED, Su34MenuPath[groupName]) - end - end -end - ---- Obsolete function, but kept to rework in framework. - -function ChooseInfantry ( TeleportPrefixTable, TeleportMax ) ---trace.f("Spawn") - --env.info(( 'ChooseInfantry: ' )) - - TeleportPrefixTableCount = #TeleportPrefixTable - TeleportPrefixTableIndex = math.random( 1, TeleportPrefixTableCount ) - - --env.info(( 'ChooseInfantry: TeleportPrefixTableIndex = ' .. TeleportPrefixTableIndex .. ' TeleportPrefixTableCount = ' .. TeleportPrefixTableCount .. ' TeleportMax = ' .. TeleportMax )) - - local TeleportFound = false - local TeleportLoop = true - local Index = TeleportPrefixTableIndex - local TeleportPrefix = '' - - while TeleportLoop do - TeleportPrefix = TeleportPrefixTable[Index] - if SpawnSettings[TeleportPrefix] then - if SpawnSettings[TeleportPrefix]['SpawnCount'] - 1 < TeleportMax then - SpawnSettings[TeleportPrefix]['SpawnCount'] = SpawnSettings[TeleportPrefix]['SpawnCount'] + 1 - TeleportFound = true - else - TeleportFound = false - end - else - SpawnSettings[TeleportPrefix] = {} - SpawnSettings[TeleportPrefix]['SpawnCount'] = 0 - TeleportFound = true - end - if TeleportFound then - TeleportLoop = false - else - if Index < TeleportPrefixTableCount then - Index = Index + 1 - else - TeleportLoop = false - end - end - --env.info(( 'ChooseInfantry: Loop 1 - TeleportPrefix = ' .. TeleportPrefix .. ' Index = ' .. Index )) - end - - if TeleportFound == false then - TeleportLoop = true - Index = 1 - while TeleportLoop do - TeleportPrefix = TeleportPrefixTable[Index] - if SpawnSettings[TeleportPrefix] then - if SpawnSettings[TeleportPrefix]['SpawnCount'] - 1 < TeleportMax then - SpawnSettings[TeleportPrefix]['SpawnCount'] = SpawnSettings[TeleportPrefix]['SpawnCount'] + 1 - TeleportFound = true - else - TeleportFound = false - end - else - SpawnSettings[TeleportPrefix] = {} - SpawnSettings[TeleportPrefix]['SpawnCount'] = 0 - TeleportFound = true - end - if TeleportFound then - TeleportLoop = false - else - if Index < TeleportPrefixTableIndex then - Index = Index + 1 - else - TeleportLoop = false - end - end - --env.info(( 'ChooseInfantry: Loop 2 - TeleportPrefix = ' .. TeleportPrefix .. ' Index = ' .. Index )) - end - end - - local TeleportGroupName = '' - if TeleportFound == true then - TeleportGroupName = TeleportPrefix .. string.format("#%03d", SpawnSettings[TeleportPrefix]['SpawnCount'] ) - else - TeleportGroupName = '' - end - - --env.info(('ChooseInfantry: TeleportGroupName = ' .. TeleportGroupName )) - --env.info(('ChooseInfantry: return')) - - return TeleportGroupName -end - -SpawnedInfantry = 0 - -function LandCarrier ( CarrierGroup, LandingZonePrefix ) ---trace.f() - --env.info(( 'LandCarrier: ' )) - --env.info(( 'LandCarrier: CarrierGroup = ' .. CarrierGroup:getName() )) - --env.info(( 'LandCarrier: LandingZone = ' .. LandingZonePrefix )) - - local controllerGroup = CarrierGroup:getController() - - local LandingZone = trigger.misc.getZone(LandingZonePrefix) - local LandingZonePos = {} - LandingZonePos.x = LandingZone.point.x + math.random(LandingZone.radius * -1, LandingZone.radius) - LandingZonePos.y = LandingZone.point.z + math.random(LandingZone.radius * -1, LandingZone.radius) - - controllerGroup:pushTask( { id = 'Land', params = { point = LandingZonePos, durationFlag = true, duration = 10 } } ) - - --env.info(( 'LandCarrier: end' )) -end - -EscortCount = 0 -function EscortCarrier ( CarrierGroup, EscortPrefix, EscortLastWayPoint, EscortEngagementDistanceMax, EscortTargetTypes ) ---trace.f() - --env.info(( 'EscortCarrier: ' )) - --env.info(( 'EscortCarrier: CarrierGroup = ' .. CarrierGroup:getName() )) - --env.info(( 'EscortCarrier: EscortPrefix = ' .. EscortPrefix )) - - local CarrierName = CarrierGroup:getName() - - local EscortMission = {} - local CarrierMission = {} - - local EscortMission = SpawnMissionGroup( EscortPrefix ) - local CarrierMission = SpawnMissionGroup( CarrierGroup:getName() ) - - if EscortMission ~= nil and CarrierMission ~= nil then - - EscortCount = EscortCount + 1 - EscortMissionName = string.format( EscortPrefix .. '#Escort %s', CarrierName ) - EscortMission.name = EscortMissionName - EscortMission.groupId = nil - EscortMission.lateActivation = false - EscortMission.taskSelected = false - - local EscortUnits = #EscortMission.units - for u = 1, EscortUnits do - EscortMission.units[u].name = string.format( EscortPrefix .. '#Escort %s %02d', CarrierName, u ) - EscortMission.units[u].unitId = nil - end - - - EscortMission.route.points[1].task = { id = "ComboTask", - params = - { - tasks = - { - [1] = - { - enabled = true, - auto = false, - id = "Escort", - number = 1, - params = - { - lastWptIndexFlagChangedManually = false, - groupId = CarrierGroup:getID(), - lastWptIndex = nil, - lastWptIndexFlag = false, - engagementDistMax = EscortEngagementDistanceMax, - targetTypes = EscortTargetTypes, - pos = - { - y = 20, - x = 20, - z = 0, - } -- end of ["pos"] - } -- end of ["params"] - } -- end of [1] - } -- end of ["tasks"] - } -- end of ["params"] - } -- end of ["task"] - - SpawnGroupAdd( EscortPrefix, EscortMission ) - - end -end - -function SendMessageToCarrier( CarrierGroup, CarrierMessage ) ---trace.f() - - if CarrierGroup ~= nil then - MessageToGroup( CarrierGroup, CarrierMessage, 30, 'Carrier/' .. CarrierGroup:getName() ) - end - -end - -function MessageToGroup( MsgGroup, MsgText, MsgTime, MsgName ) ---trace.f() - - if type(MsgGroup) == 'string' then - --env.info( 'MessageToGroup: Converted MsgGroup string "' .. MsgGroup .. '" into a Group structure.' ) - MsgGroup = Group.getByName( MsgGroup ) - end - - if MsgGroup ~= nil then - local MsgTable = {} - MsgTable.text = MsgText - MsgTable.displayTime = MsgTime - MsgTable.msgFor = { units = { MsgGroup:getUnits()[1]:getName() } } - MsgTable.name = MsgName - --routines.message.add( MsgTable ) - --env.info(('MessageToGroup: Message sent to ' .. MsgGroup:getUnits()[1]:getName() .. ' -> ' .. MsgText )) - end -end - -function MessageToUnit( UnitName, MsgText, MsgTime, MsgName ) ---trace.f() - - if UnitName ~= nil then - local MsgTable = {} - MsgTable.text = MsgText - MsgTable.displayTime = MsgTime - MsgTable.msgFor = { units = { UnitName } } - MsgTable.name = MsgName - --routines.message.add( MsgTable ) - end -end - -function MessageToAll( MsgText, MsgTime, MsgName ) ---trace.f() - - MESSAGE:New( MsgText, "Message", MsgTime, MsgName ):ToCoalition( coalition.side.RED ):ToCoalition( coalition.side.BLUE ) -end - -function MessageToRed( MsgText, MsgTime, MsgName ) ---trace.f() - - MESSAGE:New( MsgText, "To Red Coalition", MsgTime, MsgName ):ToCoalition( coalition.side.RED ) -end - -function MessageToBlue( MsgText, MsgTime, MsgName ) ---trace.f() - - MESSAGE:New( MsgText, "To Blue Coalition", MsgTime, MsgName ):ToCoalition( coalition.side.RED ) -end - -function getCarrierHeight( CarrierGroup ) ---trace.f() - - if CarrierGroup ~= nil then - if table.getn(CarrierGroup:getUnits()) == 1 then - local CarrierUnit = CarrierGroup:getUnits()[1] - local CurrentPoint = CarrierUnit:getPoint() - - local CurrentPosition = { x = CurrentPoint.x, y = CurrentPoint.z } - local CarrierHeight = CurrentPoint.y - - local LandHeight = land.getHeight( CurrentPosition ) - - --env.info(( 'CarrierHeight: LandHeight = ' .. LandHeight .. ' CarrierHeight = ' .. CarrierHeight )) - - return CarrierHeight - LandHeight - else - return 999999 - end - else - return 999999 - end - -end - -function GetUnitHeight( CheckUnit ) ---trace.f() - - local UnitPoint = CheckUnit:getPoint() - local UnitPosition = { x = CurrentPoint.x, y = CurrentPoint.z } - local UnitHeight = CurrentPoint.y - - local LandHeight = land.getHeight( CurrentPosition ) - - --env.info(( 'CarrierHeight: LandHeight = ' .. LandHeight .. ' CarrierHeight = ' .. CarrierHeight )) - - return UnitHeight - LandHeight - -end - - -_MusicTable = {} -_MusicTable.Files = {} -_MusicTable.Queue = {} -_MusicTable.FileCnt = 0 - - -function MusicRegister( SndRef, SndFile, SndTime ) ---trace.f() - - env.info(( 'MusicRegister: SndRef = ' .. SndRef )) - env.info(( 'MusicRegister: SndFile = ' .. SndFile )) - env.info(( 'MusicRegister: SndTime = ' .. SndTime )) - - - _MusicTable.FileCnt = _MusicTable.FileCnt + 1 - - _MusicTable.Files[_MusicTable.FileCnt] = {} - _MusicTable.Files[_MusicTable.FileCnt].Ref = SndRef - _MusicTable.Files[_MusicTable.FileCnt].File = SndFile - _MusicTable.Files[_MusicTable.FileCnt].Time = SndTime - - if not _MusicTable.Function then - _MusicTable.Function = routines.scheduleFunction( MusicScheduler, { }, timer.getTime() + 10, 10) - end - -end - -function MusicToPlayer( SndRef, PlayerName, SndContinue ) ---trace.f() - - --env.info(( 'MusicToPlayer: SndRef = ' .. SndRef )) - - local PlayerUnits = AlivePlayerUnits() - for PlayerUnitIdx, PlayerUnit in pairs(PlayerUnits) do - local PlayerUnitName = PlayerUnit:getPlayerName() - --env.info(( 'MusicToPlayer: PlayerUnitName = ' .. PlayerUnitName )) - if PlayerName == PlayerUnitName then - PlayerGroup = PlayerUnit:getGroup() - if PlayerGroup then - --env.info(( 'MusicToPlayer: PlayerGroup = ' .. PlayerGroup:getName() )) - MusicToGroup( SndRef, PlayerGroup, SndContinue ) - end - break - end - end - - --env.info(( 'MusicToPlayer: end' )) - -end - -function MusicToGroup( SndRef, SndGroup, SndContinue ) ---trace.f() - - --env.info(( 'MusicToGroup: SndRef = ' .. SndRef )) - - if SndGroup ~= nil then - if _MusicTable and _MusicTable.FileCnt > 0 then - if SndGroup:isExist() then - if MusicCanStart(SndGroup:getUnit(1):getPlayerName()) then - --env.info(( 'MusicToGroup: OK for Sound.' )) - local SndIdx = 0 - if SndRef == '' then - --env.info(( 'MusicToGroup: SndRef as empty. Queueing at random.' )) - SndIdx = math.random( 1, _MusicTable.FileCnt ) - else - for SndIdx = 1, _MusicTable.FileCnt do - if _MusicTable.Files[SndIdx].Ref == SndRef then - break - end - end - end - --env.info(( 'MusicToGroup: SndIdx = ' .. SndIdx )) - --env.info(( 'MusicToGroup: Queueing Music ' .. _MusicTable.Files[SndIdx].File .. ' for Group ' .. SndGroup:getID() )) - trigger.action.outSoundForGroup( SndGroup:getID(), _MusicTable.Files[SndIdx].File ) - MessageToGroup( SndGroup, 'Playing ' .. _MusicTable.Files[SndIdx].File, 15, 'Music-' .. SndGroup:getUnit(1):getPlayerName() ) - - local SndQueueRef = SndGroup:getUnit(1):getPlayerName() - if _MusicTable.Queue[SndQueueRef] == nil then - _MusicTable.Queue[SndQueueRef] = {} - end - _MusicTable.Queue[SndQueueRef].Start = timer.getTime() - _MusicTable.Queue[SndQueueRef].PlayerName = SndGroup:getUnit(1):getPlayerName() - _MusicTable.Queue[SndQueueRef].Group = SndGroup - _MusicTable.Queue[SndQueueRef].ID = SndGroup:getID() - _MusicTable.Queue[SndQueueRef].Ref = SndIdx - _MusicTable.Queue[SndQueueRef].Continue = SndContinue - _MusicTable.Queue[SndQueueRef].Type = Group - end - end - end - end -end - -function MusicCanStart(PlayerName) ---trace.f() - - --env.info(( 'MusicCanStart:' )) - - local MusicOut = false - - if _MusicTable['Queue'] ~= nil and _MusicTable.FileCnt > 0 then - --env.info(( 'MusicCanStart: PlayerName = ' .. PlayerName )) - local PlayerFound = false - local MusicStart = 0 - local MusicTime = 0 - for SndQueueIdx, SndQueue in pairs( _MusicTable.Queue ) do - if SndQueue.PlayerName == PlayerName then - PlayerFound = true - MusicStart = SndQueue.Start - MusicTime = _MusicTable.Files[SndQueue.Ref].Time - break - end - end - if PlayerFound then - --env.info(( 'MusicCanStart: MusicStart = ' .. MusicStart )) - --env.info(( 'MusicCanStart: MusicTime = ' .. MusicTime )) - --env.info(( 'MusicCanStart: timer.getTime() = ' .. timer.getTime() )) - - if MusicStart + MusicTime <= timer.getTime() then - MusicOut = true - end - else - MusicOut = true - end - end - - if MusicOut then - --env.info(( 'MusicCanStart: true' )) - else - --env.info(( 'MusicCanStart: false' )) - end - - return MusicOut -end - -function MusicScheduler() ---trace.scheduled("", "MusicScheduler") - - --env.info(( 'MusicScheduler:' )) - if _MusicTable['Queue'] ~= nil and _MusicTable.FileCnt > 0 then - --env.info(( 'MusicScheduler: Walking Sound Queue.')) - for SndQueueIdx, SndQueue in pairs( _MusicTable.Queue ) do - if SndQueue.Continue then - if MusicCanStart(SndQueue.PlayerName) then - --env.info(('MusicScheduler: MusicToGroup')) - MusicToPlayer( '', SndQueue.PlayerName, true ) - end - end - end - end - -end - - -env.info(( 'Init: Scripts Loaded v1.1' )) - ---- BASE classes. --- --- @{#BASE} class --- ============== --- The @{#BASE} class is the super class for most of the classes defined within MOOSE. --- --- It handles: --- --- * The construction and inheritance of child classes. --- * The tracing of objects during mission execution within the DCS.log file (under saved games folder). --- --- Note: Normally you would not use the BASE class unless you are extending the MOOSE framework with new classes. --- --- BASE Trace functionality --- ======================== --- The BASE class contains trace methods to trace progress within a mission execution of a certain object. --- Note that these trace methods are inherited by each MOOSE class interiting BASE. --- As such, each object created from derived class from BASE can use the tracing functions to trace its execution. --- --- Trace a function call --- --------------------- --- There are basically 3 types of tracing methods available within BASE: --- --- * @{#BASE.F}: Trace the beginning of a function and its given parameters. --- * @{#BASE.T}: Trace further logic within a function giving optional variables or parameters. --- * @{#BASE.E}: Trace an execption within a function giving optional variables or parameters. An exception will always be traced. --- --- Tracing levels --- -------------- --- There are 3 tracing levels within MOOSE. --- These tracing levels were defined to avoid bulks of tracing to be generated by lots of objects. --- --- As such, the F and T methods have additional variants to trace level 2 and 3 respectively: --- --- * @{#BASE.F2}: Trace the beginning of a function and its given parameters with tracing level 2. --- * @{#BASE.F3}: Trace the beginning of a function and its given parameters with tracing level 3. --- * @{#BASE.T2}: Trace further logic within a function giving optional variables or parameters with tracing level 2. --- * @{#BASE.T3}: Trace further logic within a function giving optional variables or parameters with tracing level 3. --- --- BASE Inheritance support --- ======================== --- The following methods are available to support inheritance: --- --- * @{#BASE.Inherit}: Inherits from a class. --- * @{#BASE.Inherited}: Returns the parent class from the class. --- --- Future --- ====== --- Further methods may be added to BASE whenever there is a need to make "overall" functions available within MOOSE. --- --- ==== --- --- @module Base --- @author FlightControl - -Include.File( "Routines" ) - -local _TraceOn = true -local _TraceLevel = 1 -local _TraceClass = { - --DATABASE = true, - --SEAD = true, - --DESTROYBASETASK = true, - --MOVEMENT = true, - --SPAWN = true, - --STAGE = true, - --ZONE = true, - --GROUP = true, - --UNIT = true, - --CLIENT = true, - --CARGO = true, - --CARGO_GROUP = true, - --CARGO_PACKAGE = true, - --CARGO_SLINGLOAD = true, - --CARGO_ZONE = true, - --CLEANUP = true, - --MENU_CLIENT = true, - --MENU_CLIENT_COMMAND = true, - --ESCORT = true, - } -local _TraceClassMethod = {} - ---- The BASE Class --- @type BASE --- @field ClassName The name of the class. --- @field ClassID The ID number of the class. -BASE = { - ClassName = "BASE", - ClassID = 0, - Events = {} -} - ---- The Formation Class --- @type FORMATION --- @field Cone A cone formation. -FORMATION = { - Cone = "Cone" -} - - - ---- The base constructor. This is the top top class of all classed defined within the MOOSE. --- Any new class needs to be derived from this class for proper inheritance. --- @param #BASE self --- @return #BASE The new instance of the BASE class. --- @usage --- function TASK:New() --- --- local self = BASE:Inherit( self, BASE:New() ) --- --- -- assign Task default values during construction --- self.TaskBriefing = "Task: No Task." --- self.Time = timer.getTime() --- self.ExecuteStage = _TransportExecuteStage.NONE --- --- return self --- end --- @todo need to investigate if the deepCopy is really needed... Don't think so. -function BASE:New() - local Child = routines.utils.deepCopy( self ) - local Parent = {} - setmetatable( Child, Parent ) - Child.__index = Child - self.ClassID = self.ClassID + 1 - Child.ClassID = self.ClassID - --Child.AddEvent( Child, S_EVENT_BIRTH, Child.EventBirth ) - return Child -end - ---- This is the worker method to inherit from a parent class. --- @param #BASE self --- @param Child is the Child class that inherits. --- @param #BASE Parent is the Parent class that the Child inherits from. --- @return #BASE Child -function BASE:Inherit( Child, Parent ) - local Child = routines.utils.deepCopy( Child ) - local Parent = routines.utils.deepCopy( Parent ) - if Child ~= nil then - setmetatable( Child, Parent ) - Child.__index = Child - end - --Child.ClassName = Child.ClassName .. '.' .. Child.ClassID - self:T( 'Inherited from ' .. Parent.ClassName ) - return Child -end - ---- This is the worker method to retrieve the Parent class. --- @param #BASE self --- @param #BASE Child is the Child class from which the Parent class needs to be retrieved. --- @return #BASE -function BASE:Inherited( Child ) - local Parent = getmetatable( Child ) --- env.info('Inherited class of ' .. Child.ClassName .. ' is ' .. Parent.ClassName ) - return Parent -end - ---- Get the ClassName + ClassID of the class instance. --- The ClassName + ClassID is formatted as '%s#%09d'. --- @param #BASE self --- @return #string The ClassName + ClassID of the class instance. -function BASE:GetClassNameAndID() - return string.format( '%s#%09d', self:GetClassName(), self:GetClassID() ) -end - ---- Get the ClassName of the class instance. --- @param #BASE self --- @return #string The ClassName of the class instance. -function BASE:GetClassName() - return self.ClassName -end - ---- Get the ClassID of the class instance. --- @param #BASE self --- @return #string The ClassID of the class instance. -function BASE:GetClassID() - return self.ClassID -end - ---- Set a new listener for the class. --- @param self --- @param DCSTypes#Event Event --- @param #function EventFunction --- @return #BASE -function BASE:AddEvent( Event, EventFunction ) - self:F( Event ) - - self.Events[#self.Events+1] = {} - self.Events[#self.Events].Event = Event - self.Events[#self.Events].EventFunction = EventFunction - self.Events[#self.Events].EventEnabled = false - - return self -end - ---- Returns the event dispatcher --- @param #BASE self --- @return Event#EVENT -function BASE:Event() - - return _EVENTDISPATCHER -end - - - - - ---- Enable the event listeners for the class. --- @param #BASE self --- @return #BASE -function BASE:EnableEvents() - self:F( #self.Events ) - - for EventID, Event in pairs( self.Events ) do - Event.Self = self - Event.EventEnabled = true - end - self.Events.Handler = world.addEventHandler( self ) - - return self -end - - ---- Disable the event listeners for the class. --- @param #BASE self --- @return #BASE -function BASE:DisableEvents() - self:F() - - world.removeEventHandler( self ) - for EventID, Event in pairs( self.Events ) do - Event.Self = nil - Event.EventEnabled = false - end - - return self -end - - -local BaseEventCodes = { - "S_EVENT_SHOT", - "S_EVENT_HIT", - "S_EVENT_TAKEOFF", - "S_EVENT_LAND", - "S_EVENT_CRASH", - "S_EVENT_EJECTION", - "S_EVENT_REFUELING", - "S_EVENT_DEAD", - "S_EVENT_PILOT_DEAD", - "S_EVENT_BASE_CAPTURED", - "S_EVENT_MISSION_START", - "S_EVENT_MISSION_END", - "S_EVENT_TOOK_CONTROL", - "S_EVENT_REFUELING_STOP", - "S_EVENT_BIRTH", - "S_EVENT_HUMAN_FAILURE", - "S_EVENT_ENGINE_STARTUP", - "S_EVENT_ENGINE_SHUTDOWN", - "S_EVENT_PLAYER_ENTER_UNIT", - "S_EVENT_PLAYER_LEAVE_UNIT", - "S_EVENT_PLAYER_COMMENT", - "S_EVENT_SHOOTING_START", - "S_EVENT_SHOOTING_END", - "S_EVENT_MAX", -} - ---onEvent( {[1]="S_EVENT_BIRTH",[2]={["subPlace"]=5,["time"]=0,["initiator"]={["id_"]=16884480,},["place"]={["id_"]=5000040,},["id"]=15,["IniUnitName"]="US F-15C@RAMP-Air Support Mountains#001-01",},} --- Event = { --- id = enum world.event, --- time = Time, --- initiator = Unit, --- target = Unit, --- place = Unit, --- subPlace = enum world.BirthPlace, --- weapon = Weapon --- } - ---- Creation of a Birth Event. --- @param #BASE self --- @param DCSTypes#Time EventTime The time stamp of the event. --- @param DCSObject#Object Initiator The initiating object of the event. --- @param #string IniUnitName The initiating unit name. --- @param place --- @param subplace -function BASE:CreateEventBirth( EventTime, Initiator, IniUnitName, place, subplace ) - self:F( { EventTime, Initiator, IniUnitName, place, subplace } ) - - local Event = { - id = world.event.S_EVENT_BIRTH, - time = EventTime, - initiator = Initiator, - IniUnitName = IniUnitName, - place = place, - subplace = subplace - } - - world.onEvent( Event ) -end - ---- Creation of a Crash Event. --- @param #BASE self --- @param DCSTypes#Time EventTime The time stamp of the event. --- @param DCSObject#Object Initiator The initiating object of the event. -function BASE:CreateEventCrash( EventTime, Initiator ) - self:F( { EventTime, Initiator } ) - - local Event = { - id = world.event.S_EVENT_CRASH, - time = EventTime, - initiator = Initiator, - } - - world.onEvent( Event ) -end - --- TODO: Complete DCSTypes#Event structure. ---- The main event handling function... This function captures all events generated for the class. --- @param #BASE self --- @param DCSTypes#Event event -function BASE:onEvent(event) - --self:F( { BaseEventCodes[event.id], event } ) - - if self then - for EventID, EventObject in pairs( self.Events ) do - if EventObject.EventEnabled then - --env.info( 'onEvent Table EventObject.Self = ' .. tostring(EventObject.Self) ) - --env.info( 'onEvent event.id = ' .. tostring(event.id) ) - --env.info( 'onEvent EventObject.Event = ' .. tostring(EventObject.Event) ) - if event.id == EventObject.Event then - if self == EventObject.Self then - if event.initiator and event.initiator:isExist() then - event.IniUnitName = event.initiator:getName() - end - if event.target and event.target:isExist() then - event.TgtUnitName = event.target:getName() - end - --self:T( { BaseEventCodes[event.id], event } ) - --EventObject.EventFunction( self, event ) - end - end - end - end - end -end - --- Trace section - --- Log a trace (only shown when trace is on) --- TODO: Make trace function using variable parameters. - ---- Set trace level --- @param #BASE self --- @param #number Level -function BASE:TraceLevel( Level ) - _TraceLevel = Level - self:E( "Tracing level " .. Level ) -end - ---- Set tracing for a class --- @param #BASE self --- @param #string Class -function BASE:TraceClass( Class ) - _TraceClass[Class] = true - _TraceClassMethod[Class] = {} - self:E( "Tracing class " .. Class ) -end - ---- Set tracing for a specific method of class --- @param #BASE self --- @param #string Class --- @param #string Method -function BASE:TraceClassMethod( Class, Method ) - if not _TraceClassMethod[Class] then - _TraceClassMethod[Class] = {} - _TraceClassMethod[Class].Method = {} - end - _TraceClassMethod[Class].Method[Method] = true - self:E( "Tracing method " .. Method .. " of class " .. Class ) -end - ---- Trace a function call. Must be at the beginning of the function logic. --- @param #BASE self --- @param Arguments A #table or any field. -function BASE:F( Arguments ) - - if _TraceOn and ( _TraceClass[self.ClassName] or _TraceClassMethod[self.ClassName] ) then - - local DebugInfoCurrent = debug.getinfo( 2, "nl" ) - local DebugInfoFrom = debug.getinfo( 3, "l" ) - - local Function = "function" - if DebugInfoCurrent.name then - Function = DebugInfoCurrent.name - end - - if _TraceClass[self.ClassName] or _TraceClassMethod[self.ClassName].Method[Function] then - local LineCurrent = DebugInfoCurrent.currentline - local LineFrom = 0 - if DebugInfoFrom then - LineFrom = DebugInfoFrom.currentline - end - env.info( string.format( "%6d(%6d)/%1s:%20s%05d.%s(%s)" , LineCurrent, LineFrom, "F", self.ClassName, self.ClassID, Function, routines.utils.oneLineSerialize( Arguments ) ) ) - end - end -end - ---- Trace a function call level 2. Must be at the beginning of the function logic. --- @param #BASE self --- @param Arguments A #table or any field. -function BASE:F2( Arguments ) - - if _TraceLevel >= 2 then - self:F( Arguments ) - end - -end - ---- Trace a function call level 3. Must be at the beginning of the function logic. --- @param #BASE self --- @param Arguments A #table or any field. -function BASE:F3( Arguments ) - - if _TraceLevel >= 3 then - self:F( Arguments ) - end - -end - ---- Trace a function logic. Can be anywhere within the function logic. --- @param #BASE self --- @param Arguments A #table or any field. -function BASE:T( Arguments ) - - if _TraceOn and ( _TraceClass[self.ClassName] or _TraceClassMethod[self.ClassName] ) then - - local DebugInfoCurrent = debug.getinfo( 2, "nl" ) - local DebugInfoFrom = debug.getinfo( 3, "l" ) - - local Function = "function" - if DebugInfoCurrent.name then - Function = DebugInfoCurrent.name - end - - if _TraceClass[self.ClassName] or _TraceClassMethod[self.ClassName].Method[Function] then - local LineCurrent = DebugInfoCurrent.currentline - local LineFrom = 0 - if DebugInfoFrom then - LineFrom = DebugInfoFrom.currentline - end - env.info( string.format( "%6d(%6d)/%1s:%20s%05d.%s" , LineCurrent, LineFrom, "T", self.ClassName, self.ClassID, routines.utils.oneLineSerialize( Arguments ) ) ) - end - end -end - ---- Trace a function logic level 2. Can be anywhere within the function logic. --- @param #BASE self --- @param Arguments A #table or any field. -function BASE:T2( Arguments ) - - if _TraceLevel >= 2 then - self:T( Arguments ) - end - -end - ---- Trace a function logic level 3. Can be anywhere within the function logic. --- @param #BASE self --- @param Arguments A #table or any field. -function BASE:T3( Arguments ) - - if _TraceLevel >= 3 then - self:T( Arguments ) - end - -end - ---- Log an exception which will be traced always. Can be anywhere within the function logic. --- @param #BASE self --- @param Arguments A #table or any field. -function BASE:E( Arguments ) - - local DebugInfoCurrent = debug.getinfo( 2, "nl" ) - local DebugInfoFrom = debug.getinfo( 3, "l" ) - - local Function = "function" - if DebugInfoCurrent.name then - Function = DebugInfoCurrent.name - end - - local LineCurrent = DebugInfoCurrent.currentline - local LineFrom = -1 - if DebugInfoFrom then - LineFrom = DebugInfoFrom.currentline - end - - env.info( string.format( "%6d(%6d)/%1s:%20s%05d.%s(%s)" , LineCurrent, LineFrom, "E", self.ClassName, self.ClassID, Function, routines.utils.oneLineSerialize( Arguments ) ) ) -end - - - ---- Models time events calling event handing functions. --- --- @{SCHEDULER} class --- =================== --- The @{SCHEDULER} class models time events calling given event handling functions. --- --- SCHEDULER constructor --- ===================== --- The SCHEDULER class is quite easy to use: --- --- * @{#SCHEDULER.New}: Setup a new scheduler and start it with the specified parameters. --- --- SCHEDULER timer methods --- ======================= --- The SCHEDULER can be stopped and restarted with the following methods: --- --- * @{#SCHEDULER.Start}: (Re-)Start the scheduler. --- * @{#SCHEDULER.Start}: Stop the scheduler. --- --- @module Scheduler --- @author FlightControl - -Include.File( "Routines" ) -Include.File( "Base" ) - - ---- The SCHEDULER class --- @type SCHEDULER --- @extends Base#BASE -SCHEDULER = { - ClassName = "SCHEDULER", -} - - ---- Constructor. --- @param #SCHEDULER self --- @param #table TimeEventObject Specified for which Moose object the timer is setup. If a value of nil is provided, a scheduler will be setup without an object reference. --- @param #function TimeEventFunction The event function to be called when a timer event occurs. The event function needs to accept the parameters specified in TimeEventFunctionArguments. --- @param #table TimeEventFunctionArguments Optional arguments that can be given as part of scheduler. The arguments need to be given as a table { param1, param 2, ... }. --- @param #number StartSeconds Specifies the amount of seconds that will be waited before the scheduling is started, and the event function is called. --- @param #number RepeatSecondsInterval Specifies the interval in seconds when the scheduler will call the event function. --- @param #number RandomizationFactor Specifies a randomization factor between 0 and 1 to randomize the RepeatSecondsInterval. --- @param #number StopSeconds Specifies the amount of seconds when the scheduler will be stopped. --- @return #SCHEDULER self -function SCHEDULER:New( TimeEventObject, TimeEventFunction, TimeEventFunctionArguments, StartSeconds, RepeatSecondsInterval, RandomizationFactor, StopSeconds ) - local self = BASE:Inherit( self, BASE:New() ) - self:F2( { TimeEventObject, TimeEventFunction, TimeEventFunctionArguments, StartSeconds, RepeatSecondsInterval, RandomizationFactor, StopSeconds } ) - - self.TimeEventObject = TimeEventObject - self.TimeEventFunction = TimeEventFunction - self.TimeEventFunctionArguments = TimeEventFunctionArguments - self.StartSeconds = StartSeconds - - if RepeatSecondsInterval then - self.RepeatSecondsInterval = RepeatSecondsInterval - else - self.RepeatSecondsInterval = 0 - end - - if RandomizationFactor then - self.RandomizationFactor = RandomizationFactor - else - self.RandomizationFactor = 0 - end - - if StopSeconds then - self.StopSeconds = StopSeconds - end - - self.Repeat = false - - self.StartTime = timer.getTime() - - self:Start() - - return self -end - ---- (Re-)Starts the scheduler. --- @param #SCHEDULER self --- @return #SCHEDULER self -function SCHEDULER:Start() - self:F2( self.TimeEventObject ) - - self.Repeat = true - timer.scheduleFunction( self._Scheduler, self, timer.getTime() + self.StartSeconds + .01 ) - - return self -end - ---- Stops the scheduler. --- @param #SCHEDULER self --- @return #SCHEDULER self -function SCHEDULER:Stop() - self:F2( self.TimeEventObject ) - - self.Repeat = false - - return self -end - --- Private Functions - -function SCHEDULER:_Scheduler() - self:F2( self.TimeEventFunctionArguments ) - - local ErrorHandler = function( errmsg ) - - env.info( "Error in SCHEDULER function:" .. errmsg ) - env.info( debug.traceback() ) - - return errmsg - end - - local Status, Result - if self.TimeEventObject then - Status, Result = xpcall( function() return self.TimeEventFunction( self.TimeEventObject, unpack( self.TimeEventFunctionArguments ) ) end, ErrorHandler ) - else - Status, Result = xpcall( function() return self.TimeEventFunction( unpack( self.TimeEventFunctionArguments ) ) end, ErrorHandler ) - end - - self:T( { Status, Result } ) - - if Status and ( ( not Result ) or ( Result and Result ~= false ) ) then - if self.Repeat and ( not self.StopSeconds or ( self.StopSeconds and timer.getTime() <= self.StartTime + self.StopSeconds ) ) then - timer.scheduleFunction( - self._Scheduler, - self, - timer.getTime() + self.RepeatSecondsInterval + math.random( - ( self.RandomizationFactor * self.RepeatSecondsInterval / 2 ), ( self.RandomizationFactor * self.RepeatSecondsInterval / 2 ) ) + 0.01 - ) - end - end - -end - - - - - - - - ---- The EVENT class models an efficient event handling process between other classes and its units, weapons. --- @module Event --- @author FlightControl - -Include.File( "Routines" ) -Include.File( "Base" ) - ---- The EVENT structure --- @type EVENT --- @field #EVENT.Events Events -EVENT = { - ClassName = "EVENT", - ClassID = 0, -} - -local _EVENTCODES = { - "S_EVENT_SHOT", - "S_EVENT_HIT", - "S_EVENT_TAKEOFF", - "S_EVENT_LAND", - "S_EVENT_CRASH", - "S_EVENT_EJECTION", - "S_EVENT_REFUELING", - "S_EVENT_DEAD", - "S_EVENT_PILOT_DEAD", - "S_EVENT_BASE_CAPTURED", - "S_EVENT_MISSION_START", - "S_EVENT_MISSION_END", - "S_EVENT_TOOK_CONTROL", - "S_EVENT_REFUELING_STOP", - "S_EVENT_BIRTH", - "S_EVENT_HUMAN_FAILURE", - "S_EVENT_ENGINE_STARTUP", - "S_EVENT_ENGINE_SHUTDOWN", - "S_EVENT_PLAYER_ENTER_UNIT", - "S_EVENT_PLAYER_LEAVE_UNIT", - "S_EVENT_PLAYER_COMMENT", - "S_EVENT_SHOOTING_START", - "S_EVENT_SHOOTING_END", - "S_EVENT_MAX", -} - ---- The Event structure --- @type EVENTDATA --- @field id --- @field initiator --- @field target --- @field weapon --- @field IniDCSUnit --- @field IniDCSUnitName --- @field IniDCSGroup --- @field IniDCSGroupName --- @field TgtDCSUnit --- @field TgtDCSUnitName --- @field TgtDCSGroup --- @field TgtDCSGroupName --- @field Weapon --- @field WeaponName --- @field WeaponTgtDCSUnit - ---- The Events structure --- @type EVENT.Events --- @field #number IniUnit - -function EVENT:New() - local self = BASE:Inherit( self, BASE:New() ) - self:F2() - self.EventHandler = world.addEventHandler( self ) - return self -end - -function EVENT:EventText( EventID ) - - local EventText = _EVENTCODES[EventID] - - return EventText -end - - ---- Initializes the Events structure for the event --- @param #EVENT self --- @param DCSWorld#world.event EventID --- @param #string EventClass --- @return #EVENT.Events -function EVENT:Init( EventID, EventClass ) - self:F3( { _EVENTCODES[EventID], EventClass } ) - if not self.Events[EventID] then - self.Events[EventID] = {} - end - if not self.Events[EventID][EventClass] then - self.Events[EventID][EventClass] = {} - end - return self.Events[EventID][EventClass] -end - - ---- Create an OnDead event handler for a group --- @param #EVENT self --- @param #table EventTemplate --- @param #function EventFunction The function to be called when the event occurs for the unit. --- @param EventSelf The self instance of the class for which the event is. --- @param #function OnEventFunction --- @return #EVENT -function EVENT:OnEventForTemplate( EventTemplate, EventFunction, EventSelf, OnEventFunction ) - self:F2( EventTemplate.name ) - - for EventUnitID, EventUnit in pairs( EventTemplate.units ) do - OnEventFunction( self, EventUnit.name, EventFunction, EventSelf ) - end - return self -end - ---- Set a new listener for an S_EVENT_X event independent from a unit or a weapon. --- @param #EVENT self --- @param #function EventFunction The function to be called when the event occurs for the unit. --- @param Base#BASE EventSelf The self instance of the class for which the event is. --- @param EventID --- @return #EVENT -function EVENT:OnEventGeneric( EventFunction, EventSelf, EventID ) - self:F2( { EventID } ) - - local Event = self:Init( EventID, EventSelf:GetClassNameAndID() ) - Event.EventFunction = EventFunction - Event.EventSelf = EventSelf - return self -end - - ---- Set a new listener for an S_EVENT_X event --- @param #EVENT self --- @param #string EventDCSUnitName --- @param #function EventFunction The function to be called when the event occurs for the unit. --- @param Base#BASE EventSelf The self instance of the class for which the event is. --- @param EventID --- @return #EVENT -function EVENT:OnEventForUnit( EventDCSUnitName, EventFunction, EventSelf, EventID ) - self:F2( EventDCSUnitName ) - - local Event = self:Init( EventID, EventSelf:GetClassNameAndID() ) - if not Event.IniUnit then - Event.IniUnit = {} - end - Event.IniUnit[EventDCSUnitName] = {} - Event.IniUnit[EventDCSUnitName].EventFunction = EventFunction - Event.IniUnit[EventDCSUnitName].EventSelf = EventSelf - return self -end - - ---- Create an OnBirth event handler for a group --- @param #EVENT self --- @param Group#GROUP EventGroup --- @param #function EventFunction The function to be called when the event occurs for the unit. --- @param EventSelf The self instance of the class for which the event is. --- @return #EVENT -function EVENT:OnBirthForTemplate( EventTemplate, EventFunction, EventSelf ) - self:F2( EventTemplate.name ) - - self:OnEventForTemplate( EventTemplate, EventFunction, EventSelf, self.OnBirthForUnit ) - - return self -end - ---- Set a new listener for an S_EVENT_BIRTH event, and registers the unit born. --- @param #EVENT self --- @param #function EventFunction The function to be called when the event occurs for the unit. --- @param Base#BASE EventSelf --- @return #EVENT -function EVENT:OnBirth( EventFunction, EventSelf ) - self:F2() - - self:OnEventGeneric( EventFunction, EventSelf, world.event.S_EVENT_BIRTH ) - - return self -end - ---- Set a new listener for an S_EVENT_BIRTH event. --- @param #EVENT self --- @param #string EventDCSUnitName The id of the unit for the event to be handled. --- @param #function EventFunction The function to be called when the event occurs for the unit. --- @param Base#BASE EventSelf --- @return #EVENT -function EVENT:OnBirthForUnit( EventDCSUnitName, EventFunction, EventSelf ) - self:F2( EventDCSUnitName ) - - self:OnEventForUnit( EventDCSUnitName, EventFunction, EventSelf, world.event.S_EVENT_BIRTH ) - - return self -end - ---- Create an OnCrash event handler for a group --- @param #EVENT self --- @param Group#GROUP EventGroup --- @param #function EventFunction The function to be called when the event occurs for the unit. --- @param EventSelf The self instance of the class for which the event is. --- @return #EVENT -function EVENT:OnCrashForTemplate( EventTemplate, EventFunction, EventSelf ) - self:F2( EventTemplate.name ) - - self:OnEventForTemplate( EventTemplate, EventFunction, EventSelf, self.OnCrashForUnit ) - - return self -end - ---- Set a new listener for an S_EVENT_CRASH event. --- @param #EVENT self --- @param #function EventFunction The function to be called when the event occurs for the unit. --- @param Base#BASE EventSelf --- @return #EVENT -function EVENT:OnCrash( EventFunction, EventSelf ) - self:F2() - - self:OnEventGeneric( EventFunction, EventSelf, world.event.S_EVENT_CRASH ) - - return self -end - ---- Set a new listener for an S_EVENT_CRASH event. --- @param #EVENT self --- @param #string EventDCSUnitName --- @param #function EventFunction The function to be called when the event occurs for the unit. --- @param Base#BASE EventSelf The self instance of the class for which the event is. --- @return #EVENT -function EVENT:OnCrashForUnit( EventDCSUnitName, EventFunction, EventSelf ) - self:F2( EventDCSUnitName ) - - self:OnEventForUnit( EventDCSUnitName, EventFunction, EventSelf, world.event.S_EVENT_CRASH ) - - return self -end - ---- Create an OnDead event handler for a group --- @param #EVENT self --- @param Group#GROUP EventGroup --- @param #function EventFunction The function to be called when the event occurs for the unit. --- @param EventSelf The self instance of the class for which the event is. --- @return #EVENT -function EVENT:OnDeadForTemplate( EventTemplate, EventFunction, EventSelf ) - self:F2( EventTemplate.name ) - - self:OnEventForTemplate( EventTemplate, EventFunction, EventSelf, self.OnDeadForUnit ) - - return self -end - ---- Set a new listener for an S_EVENT_DEAD event. --- @param #EVENT self --- @param #function EventFunction The function to be called when the event occurs for the unit. --- @param Base#BASE EventSelf --- @return #EVENT -function EVENT:OnDead( EventFunction, EventSelf ) - self:F2() - - self:OnEventGeneric( EventFunction, EventSelf, world.event.S_EVENT_DEAD ) - - return self -end - - ---- Set a new listener for an S_EVENT_DEAD event. --- @param #EVENT self --- @param #string EventDCSUnitName --- @param #function EventFunction The function to be called when the event occurs for the unit. --- @param Base#BASE EventSelf The self instance of the class for which the event is. --- @return #EVENT -function EVENT:OnDeadForUnit( EventDCSUnitName, EventFunction, EventSelf ) - self:F2( EventDCSUnitName ) - - self:OnEventForUnit( EventDCSUnitName, EventFunction, EventSelf, world.event.S_EVENT_DEAD ) - - return self -end - ---- Set a new listener for an S_EVENT_PILOT_DEAD event. --- @param #EVENT self --- @param #string EventDCSUnitName --- @param #function EventFunction The function to be called when the event occurs for the unit. --- @param Base#BASE EventSelf The self instance of the class for which the event is. --- @return #EVENT -function EVENT:OnPilotDeadForUnit( EventDCSUnitName, EventFunction, EventSelf ) - self:F2( EventDCSUnitName ) - - self:OnEventForUnit( EventDCSUnitName, EventFunction, EventSelf, world.event.S_EVENT_PILOT_DEAD ) - - return self -end - ---- Create an OnDead event handler for a group --- @param #EVENT self --- @param #table EventTemplate --- @param #function EventFunction The function to be called when the event occurs for the unit. --- @param EventSelf The self instance of the class for which the event is. --- @return #EVENT -function EVENT:OnLandForTemplate( EventTemplate, EventFunction, EventSelf ) - self:F2( EventTemplate.name ) - - self:OnEventForTemplate( EventTemplate, EventFunction, EventSelf, self.OnLandForUnit ) - - return self -end - ---- Set a new listener for an S_EVENT_LAND event. --- @param #EVENT self --- @param #string EventDCSUnitName --- @param #function EventFunction The function to be called when the event occurs for the unit. --- @param Base#BASE EventSelf The self instance of the class for which the event is. --- @return #EVENT -function EVENT:OnLandForUnit( EventDCSUnitName, EventFunction, EventSelf ) - self:F2( EventDCSUnitName ) - - self:OnEventForUnit( EventDCSUnitName, EventFunction, EventSelf, world.event.S_EVENT_LAND ) - - return self -end - ---- Create an OnDead event handler for a group --- @param #EVENT self --- @param #table EventTemplate --- @param #function EventFunction The function to be called when the event occurs for the unit. --- @param EventSelf The self instance of the class for which the event is. --- @return #EVENT -function EVENT:OnTakeOffForTemplate( EventTemplate, EventFunction, EventSelf ) - self:F2( EventTemplate.name ) - - self:OnEventForTemplate( EventTemplate, EventFunction, EventSelf, self.OnTakeOffForUnit ) - - return self -end - ---- Set a new listener for an S_EVENT_TAKEOFF event. --- @param #EVENT self --- @param #string EventDCSUnitName --- @param #function EventFunction The function to be called when the event occurs for the unit. --- @param Base#BASE EventSelf The self instance of the class for which the event is. --- @return #EVENT -function EVENT:OnTakeOffForUnit( EventDCSUnitName, EventFunction, EventSelf ) - self:F2( EventDCSUnitName ) - - self:OnEventForUnit( EventDCSUnitName, EventFunction, EventSelf, world.event.S_EVENT_TAKEOFF ) - - return self -end - ---- Create an OnDead event handler for a group --- @param #EVENT self --- @param #table EventTemplate --- @param #function EventFunction The function to be called when the event occurs for the unit. --- @param EventSelf The self instance of the class for which the event is. --- @return #EVENT -function EVENT:OnEngineShutDownForTemplate( EventTemplate, EventFunction, EventSelf ) - self:F2( EventTemplate.name ) - - self:OnEventForTemplate( EventTemplate, EventFunction, EventSelf, self.OnEngineShutDownForUnit ) - - return self -end - ---- Set a new listener for an S_EVENT_ENGINE_SHUTDOWN event. --- @param #EVENT self --- @param #string EventDCSUnitName --- @param #function EventFunction The function to be called when the event occurs for the unit. --- @param Base#BASE EventSelf The self instance of the class for which the event is. --- @return #EVENT -function EVENT:OnEngineShutDownForUnit( EventDCSUnitName, EventFunction, EventSelf ) - self:F2( EventDCSUnitName ) - - self:OnEventForUnit( EventDCSUnitName, EventFunction, EventSelf, world.event.S_EVENT_ENGINE_SHUTDOWN ) - - return self -end - ---- Set a new listener for an S_EVENT_ENGINE_STARTUP event. --- @param #EVENT self --- @param #string EventDCSUnitName --- @param #function EventFunction The function to be called when the event occurs for the unit. --- @param Base#BASE EventSelf The self instance of the class for which the event is. --- @return #EVENT -function EVENT:OnEngineStartUpForUnit( EventDCSUnitName, EventFunction, EventSelf ) - self:F2( EventDCSUnitName ) - - self:OnEventForUnit( EventDCSUnitName, EventFunction, EventSelf, world.event.S_EVENT_ENGINE_STARTUP ) - - return self -end - ---- Set a new listener for an S_EVENT_SHOT event. --- @param #EVENT self --- @param #function EventFunction The function to be called when the event occurs for the unit. --- @param Base#BASE EventSelf The self instance of the class for which the event is. --- @return #EVENT -function EVENT:OnShot( EventFunction, EventSelf ) - self:F2() - - self:OnEventGeneric( EventFunction, EventSelf, world.event.S_EVENT_SHOT ) - - return self -end - ---- Set a new listener for an S_EVENT_SHOT event for a unit. --- @param #EVENT self --- @param #string EventDCSUnitName --- @param #function EventFunction The function to be called when the event occurs for the unit. --- @param Base#BASE EventSelf The self instance of the class for which the event is. --- @return #EVENT -function EVENT:OnShotForUnit( EventDCSUnitName, EventFunction, EventSelf ) - self:F2( EventDCSUnitName ) - - self:OnEventForUnit( EventDCSUnitName, EventFunction, EventSelf, world.event.S_EVENT_SHOT ) - - return self -end - ---- Set a new listener for an S_EVENT_HIT event. --- @param #EVENT self --- @param #function EventFunction The function to be called when the event occurs for the unit. --- @param Base#BASE EventSelf The self instance of the class for which the event is. --- @return #EVENT -function EVENT:OnHit( EventFunction, EventSelf ) - self:F2() - - self:OnEventGeneric( EventFunction, EventSelf, world.event.S_EVENT_HIT ) - - return self -end - ---- Set a new listener for an S_EVENT_HIT event. --- @param #EVENT self --- @param #string EventDCSUnitName --- @param #function EventFunction The function to be called when the event occurs for the unit. --- @param Base#BASE EventSelf The self instance of the class for which the event is. --- @return #EVENT -function EVENT:OnHitForUnit( EventDCSUnitName, EventFunction, EventSelf ) - self:F2( EventDCSUnitName ) - - self:OnEventForUnit( EventDCSUnitName, EventFunction, EventSelf, world.event.S_EVENT_HIT ) - - return self -end - ---- Set a new listener for an S_EVENT_PLAYER_ENTER_UNIT event. --- @param #EVENT self --- @param #function EventFunction The function to be called when the event occurs for the unit. --- @param Base#BASE EventSelf The self instance of the class for which the event is. --- @return #EVENT -function EVENT:OnPlayerEnterUnit( EventFunction, EventSelf ) - self:F2() - - self:OnEventGeneric( EventFunction, EventSelf, world.event.S_EVENT_PLAYER_ENTER_UNIT ) - - return self -end - ---- Set a new listener for an S_EVENT_PLAYER_LEAVE_UNIT event. --- @param #EVENT self --- @param #function EventFunction The function to be called when the event occurs for the unit. --- @param Base#BASE EventSelf The self instance of the class for which the event is. --- @return #EVENT -function EVENT:OnPlayerLeaveUnit( EventFunction, EventSelf ) - self:F2() - - self:OnEventGeneric( EventFunction, EventSelf, world.event.S_EVENT_PLAYER_LEAVE_UNIT ) - - return self -end - - - -function EVENT:onEvent( Event ) - self:F2( { _EVENTCODES[Event.id], Event } ) - - if self and self.Events and self.Events[Event.id] then - if Event.initiator and Event.initiator:getCategory() == Object.Category.UNIT then - Event.IniDCSUnit = Event.initiator - Event.IniDCSGroup = Event.IniDCSUnit:getGroup() - Event.IniDCSUnitName = Event.IniDCSUnit:getName() - Event.IniDCSGroupName = "" - if Event.IniDCSGroup and Event.IniDCSGroup:isExist() then - Event.IniDCSGroupName = Event.IniDCSGroup:getName() - end - end - if Event.target then - if Event.target and Event.target:getCategory() == Object.Category.UNIT then - Event.TgtDCSUnit = Event.target - Event.TgtDCSGroup = Event.TgtDCSUnit:getGroup() - Event.TgtDCSUnitName = Event.TgtDCSUnit:getName() - Event.TgtDCSGroupName = "" - if Event.TgtDCSGroup and Event.TgtDCSGroup:isExist() then - Event.TgtDCSGroupName = Event.TgtDCSGroup:getName() - end - end - end - if Event.weapon then - Event.Weapon = Event.weapon - Event.WeaponName = Event.Weapon:getTypeName() - --Event.WeaponTgtDCSUnit = Event.Weapon:getTarget() - end - self:E( { _EVENTCODES[Event.id], Event } ) - for ClassName, EventData in pairs( self.Events[Event.id] ) do - if Event.IniDCSUnitName and EventData.IniUnit and EventData.IniUnit[Event.IniDCSUnitName] then - self:T2( { "Calling event function for class ", ClassName, " unit ", Event.IniDCSUnitName } ) - EventData.IniUnit[Event.IniDCSUnitName].EventFunction( EventData.IniUnit[Event.IniDCSUnitName].EventSelf, Event ) - else - if Event.IniDCSUnit and not EventData.IniUnit then - self:T2( { "Calling event function for class ", ClassName } ) - EventData.EventFunction( EventData.EventSelf, Event ) - end - end - end - end -end - ---- Encapsulation of DCS World Menu system in a set of MENU classes. --- @module Menu - -Include.File( "Routines" ) -Include.File( "Base" ) - ---- The MENU class --- @type MENU --- @extends Base#BASE -MENU = { - ClassName = "MENU", - MenuPath = nil, - MenuText = "", - MenuParentPath = nil -} - ---- -function MENU:New( MenuText, MenuParentPath ) - - -- Arrange meta tables - local Child = BASE:Inherit( self, BASE:New() ) - - Child.MenuPath = nil - Child.MenuText = MenuText - Child.MenuParentPath = MenuParentPath - return Child -end - ---- The COMMANDMENU class --- @type COMMANDMENU --- @extends Menu#MENU -COMMANDMENU = { - ClassName = "COMMANDMENU", - CommandMenuFunction = nil, - CommandMenuArgument = nil -} - -function COMMANDMENU:New( MenuText, ParentMenu, CommandMenuFunction, CommandMenuArgument ) - - -- Arrange meta tables - - local MenuParentPath = nil - if ParentMenu ~= nil then - MenuParentPath = ParentMenu.MenuPath - end - - local Child = BASE:Inherit( self, MENU:New( MenuText, MenuParentPath ) ) - - Child.MenuPath = missionCommands.addCommand( MenuText, MenuParentPath, CommandMenuFunction, CommandMenuArgument ) - Child.CommandMenuFunction = CommandMenuFunction - Child.CommandMenuArgument = CommandMenuArgument - return Child -end - ---- The SUBMENU class --- @type SUBMENU --- @extends Menu#MENU -SUBMENU = { - ClassName = "SUBMENU" -} - -function SUBMENU:New( MenuText, ParentMenu ) - - -- Arrange meta tables - local MenuParentPath = nil - if ParentMenu ~= nil then - MenuParentPath = ParentMenu.MenuPath - end - - local Child = BASE:Inherit( self, MENU:New( MenuText, MenuParentPath ) ) - - Child.MenuPath = missionCommands.addSubMenu( MenuText, MenuParentPath ) - return Child -end - --- This local variable is used to cache the menus registered under clients. --- Menus don't dissapear when clients are destroyed and restarted. --- So every menu for a client created must be tracked so that program logic accidentally does not create --- the same menus twice during initialization logic. --- These menu classes are handling this logic with this variable. -local _MENUCLIENTS = {} - ---- The MENU_CLIENT class --- @type MENU_CLIENT --- @extends Menu#MENU -MENU_CLIENT = { - ClassName = "MENU_CLIENT" -} - ---- Creates a new menu item for a group --- @param self --- @param Client#CLIENT MenuClient The Client owning the menu. --- @param #string MenuText The text for the menu. --- @param #table ParentMenu The parent menu. --- @return #MENU_CLIENT self -function MENU_CLIENT:New( MenuClient, MenuText, ParentMenu ) - - -- Arrange meta tables - local MenuParentPath = {} - if ParentMenu ~= nil then - MenuParentPath = ParentMenu.MenuPath - end - - local self = BASE:Inherit( self, MENU:New( MenuText, MenuParentPath ) ) - self:F( { MenuClient, MenuText, ParentMenu } ) - - self.MenuClient = MenuClient - self.MenuClientGroupID = MenuClient:GetClientGroupID() - self.MenuParentPath = MenuParentPath - self.MenuText = MenuText - self.ParentMenu = ParentMenu - - self.Menus = {} - - if not _MENUCLIENTS[self.MenuClientGroupID] then - _MENUCLIENTS[self.MenuClientGroupID] = {} - end - - local MenuPath = _MENUCLIENTS[self.MenuClientGroupID] - - self:T( { MenuClient:GetClientGroupName(), MenuPath[table.concat(MenuParentPath)], MenuParentPath, MenuText } ) - - local MenuPathID = table.concat(MenuParentPath) .. "/" .. MenuText - if MenuPath[MenuPathID] then - missionCommands.removeItemForGroup( self.MenuClient:GetClientGroupID(), MenuPath[MenuPathID] ) - end - - self.MenuPath = missionCommands.addSubMenuForGroup( self.MenuClient:GetClientGroupID(), MenuText, MenuParentPath ) - MenuPath[MenuPathID] = self.MenuPath - - self:T( { MenuClient:GetClientGroupName(), self.MenuPath } ) - - if ParentMenu and ParentMenu.Menus then - ParentMenu.Menus[self.MenuPath] = self - end - return self -end - ---- Removes the sub menus recursively of this MENU_CLIENT. --- @param #MENU_CLIENT self --- @return #MENU_CLIENT self -function MENU_CLIENT:RemoveSubMenus() - self:F( self.MenuPath ) - - for MenuID, Menu in pairs( self.Menus ) do - Menu:Remove() - end - -end - ---- Removes the sub menus recursively of this MENU_CLIENT. --- @param #MENU_CLIENT self --- @return #MENU_CLIENT self -function MENU_CLIENT:Remove() - self:F( self.MenuPath ) - - self:RemoveSubMenus() - - if not _MENUCLIENTS[self.MenuClientGroupID] then - _MENUCLIENTS[self.MenuClientGroupID] = {} - end - - local MenuPath = _MENUCLIENTS[self.MenuClientGroupID] - - if MenuPath[table.concat(self.MenuParentPath) .. "/" .. self.MenuText] then - MenuPath[table.concat(self.MenuParentPath) .. "/" .. self.MenuText] = nil - end - - missionCommands.removeItemForGroup( self.MenuClient:GetClientGroupID(), self.MenuPath ) - self.ParentMenu.Menus[self.MenuPath] = nil - return nil -end - - ---- The MENU_CLIENT_COMMAND class --- @type MENU_CLIENT_COMMAND --- @extends Menu#MENU -MENU_CLIENT_COMMAND = { - ClassName = "MENU_CLIENT_COMMAND" -} - ---- Creates a new radio command item for a group --- @param self --- @param Client#CLIENT MenuClient The Client owning the menu. --- @param MenuText The text for the menu. --- @param ParentMenu The parent menu. --- @param CommandMenuFunction A function that is called when the menu key is pressed. --- @param CommandMenuArgument An argument for the function. --- @return Menu#MENU_CLIENT_COMMAND self -function MENU_CLIENT_COMMAND:New( MenuClient, MenuText, ParentMenu, CommandMenuFunction, CommandMenuArgument ) - - -- Arrange meta tables - - local MenuParentPath = {} - if ParentMenu ~= nil then - MenuParentPath = ParentMenu.MenuPath - end - - local self = BASE:Inherit( self, MENU:New( MenuText, MenuParentPath ) ) - - self.MenuClient = MenuClient - self.MenuClientGroupID = MenuClient:GetClientGroupID() - self.MenuParentPath = MenuParentPath - self.MenuText = MenuText - self.ParentMenu = ParentMenu - - if not _MENUCLIENTS[self.MenuClientGroupID] then - _MENUCLIENTS[self.MenuClientGroupID] = {} - end - - local MenuPath = _MENUCLIENTS[self.MenuClientGroupID] - - self:T( { MenuClient:GetClientGroupName(), MenuPath[table.concat(MenuParentPath)], MenuParentPath, MenuText, CommandMenuFunction, CommandMenuArgument } ) - - local MenuPathID = table.concat(MenuParentPath) .. "/" .. MenuText - if MenuPath[MenuPathID] then - missionCommands.removeItemForGroup( self.MenuClient:GetClientGroupID(), MenuPath[MenuPathID] ) - end - - self.MenuPath = missionCommands.addCommandForGroup( self.MenuClient:GetClientGroupID(), MenuText, MenuParentPath, CommandMenuFunction, CommandMenuArgument ) - MenuPath[MenuPathID] = self.MenuPath - - self.CommandMenuFunction = CommandMenuFunction - self.CommandMenuArgument = CommandMenuArgument - - ParentMenu.Menus[self.MenuPath] = self - - return self -end - -function MENU_CLIENT_COMMAND:Remove() - self:F( self.MenuPath ) - - if not _MENUCLIENTS[self.MenuClientGroupID] then - _MENUCLIENTS[self.MenuClientGroupID] = {} - end - - local MenuPath = _MENUCLIENTS[self.MenuClientGroupID] - - if MenuPath[table.concat(self.MenuParentPath) .. "/" .. self.MenuText] then - MenuPath[table.concat(self.MenuParentPath) .. "/" .. self.MenuText] = nil - end - - missionCommands.removeItemForGroup( self.MenuClient:GetClientGroupID(), self.MenuPath ) - self.ParentMenu.Menus[self.MenuPath] = nil - return nil -end - - ---- The MENU_COALITION class --- @type MENU_COALITION --- @extends Menu#MENU -MENU_COALITION = { - ClassName = "MENU_COALITION" -} - ---- Creates a new coalition menu item --- @param #MENU_COALITION self --- @param DCSCoalition#coalition.side MenuCoalition The coalition owning the menu. --- @param #string MenuText The text for the menu. --- @param #table ParentMenu The parent menu. --- @return #MENU_COALITION self -function MENU_COALITION:New( MenuCoalition, MenuText, ParentMenu ) - - -- Arrange meta tables - local MenuParentPath = {} - if ParentMenu ~= nil then - MenuParentPath = ParentMenu.MenuPath - end - - local self = BASE:Inherit( self, MENU:New( MenuText, MenuParentPath ) ) - self:F( { MenuCoalition, MenuText, ParentMenu } ) - - self.MenuCoalition = MenuCoalition - self.MenuParentPath = MenuParentPath - self.MenuText = MenuText - self.ParentMenu = ParentMenu - - self.Menus = {} - - self:T( { MenuParentPath, MenuText } ) - - self.MenuPath = missionCommands.addSubMenuForCoalition( self.MenuCoalition, MenuText, MenuParentPath ) - - self:T( { self.MenuPath } ) - - if ParentMenu and ParentMenu.Menus then - ParentMenu.Menus[self.MenuPath] = self - end - return self -end - ---- Removes the sub menus recursively of this MENU_COALITION. --- @param #MENU_COALITION self --- @return #MENU_COALITION self -function MENU_COALITION:RemoveSubMenus() - self:F( self.MenuPath ) - - for MenuID, Menu in pairs( self.Menus ) do - Menu:Remove() - end - -end - ---- Removes the sub menus recursively of this MENU_COALITION. --- @param #MENU_COALITION self --- @return #MENU_COALITION self -function MENU_COALITION:Remove() - self:F( self.MenuPath ) - - self:RemoveSubMenus() - missionCommands.removeItemForCoalition( self.MenuCoalition, self.MenuPath ) - self.ParentMenu.Menus[self.MenuPath] = nil - - return nil -end - - ---- The MENU_COALITION_COMMAND class --- @type MENU_COALITION_COMMAND --- @extends Menu#MENU -MENU_COALITION_COMMAND = { - ClassName = "MENU_COALITION_COMMAND" -} - ---- Creates a new radio command item for a group --- @param #MENU_COALITION_COMMAND self --- @param DCSCoalition#coalition.side MenuCoalition The coalition owning the menu. --- @param MenuText The text for the menu. --- @param ParentMenu The parent menu. --- @param CommandMenuFunction A function that is called when the menu key is pressed. --- @param CommandMenuArgument An argument for the function. --- @return #MENU_COALITION_COMMAND self -function MENU_COALITION_COMMAND:New( MenuCoalition, MenuText, ParentMenu, CommandMenuFunction, CommandMenuArgument ) - - -- Arrange meta tables - - local MenuParentPath = {} - if ParentMenu ~= nil then - MenuParentPath = ParentMenu.MenuPath - end - - local self = BASE:Inherit( self, MENU:New( MenuText, MenuParentPath ) ) - - self.MenuCoalition = MenuCoalition - self.MenuParentPath = MenuParentPath - self.MenuText = MenuText - self.ParentMenu = ParentMenu - - self:T( { MenuParentPath, MenuText, CommandMenuFunction, CommandMenuArgument } ) - - self.MenuPath = missionCommands.addCommandForCoalition( self.MenuCoalition, MenuText, MenuParentPath, CommandMenuFunction, CommandMenuArgument ) - - self.CommandMenuFunction = CommandMenuFunction - self.CommandMenuArgument = CommandMenuArgument - - ParentMenu.Menus[self.MenuPath] = self - - return self -end - ---- Removes a radio command item for a coalition --- @param #MENU_COALITION_COMMAND self --- @return #MENU_COALITION_COMMAND self -function MENU_COALITION_COMMAND:Remove() - self:F( self.MenuPath ) - - missionCommands.removeItemForCoalition( self.MenuCoalition, self.MenuPath ) - self.ParentMenu.Menus[self.MenuPath] = nil - return nil -end ---- GROUP class. --- --- @{GROUP} class --- ============== --- The @{GROUP} class is a wrapper class to handle the DCS Group objects: --- --- * Support all DCS Group APIs. --- * Enhance with Group specific APIs not in the DCS Group API set. --- * Handle local Group Controller. --- * Manage the "state" of the DCS Group. --- --- --- GROUP reference methods --- ======================= --- For each DCS Group object alive within a running mission, a GROUP wrapper object (instance) will be created within the _@{DATABASE} object. --- This is done at the beginning of the mission (when the mission starts), and dynamically when new DCS Group objects are spawned (using the @{SPAWN} class). --- --- The GROUP class does not contain a :New() method, rather it provides :Find() methods to retrieve the object reference --- using the DCS Group or the DCS GroupName. --- --- Another thing to know is that GROUP objects do not "contain" the DCS Group object. --- The GROUP methods will reference the DCS Group object by name when it is needed during API execution. --- If the DCS Group object does not exist or is nil, the GROUP methods will return nil and log an exception in the DCS.log file. --- --- The GROUP class provides the following functions to retrieve quickly the relevant GROUP instance: --- --- * @{#GROUP.Find}(): Find a GROUP instance from the _DATABASE object using a DCS Group object. --- * @{#GROUP.FindByName}(): Find a GROUP instance from the _DATABASE object using a DCS Group name. --- --- IMPORTANT: ONE SHOULD NEVER SANATIZE these GROUP OBJECT REFERENCES! (make the GROUP object references nil). --- @module Group --- @author FlightControl - -Include.File( "Routines" ) -Include.File( "Base" ) -Include.File( "Message" ) -Include.File( "Unit" ) - ---- The GROUP class --- @type GROUP --- @extends Base#BASE --- @field DCSGroup#Group DCSGroup The DCS group class. --- @field #string GroupName The name of the group. -GROUP = { - ClassName = "GROUP", - GroupName = "", - GroupID = 0, - Controller = nil, - DCSGroup = nil, - WayPointFunctions = {}, -} - ---- A DCSGroup --- @type DCSGroup --- @field id_ The ID of the group in DCS - ---- Create a new GROUP from a DCSGroup --- @param #GROUP self --- @param DCSGroup#Group GroupName The DCS Group name --- @return #GROUP self -function GROUP:Register( GroupName ) - local self = BASE:Inherit( self, BASE:New() ) - self:F2( GroupName ) - self.GroupName = GroupName - return self -end - --- Reference methods. - ---- Find the GROUP wrapper class instance using the DCS Group. --- @param #GROUP self --- @param DCSGroup#Group DCSGroup The DCS Group. --- @return #GROUP The GROUP. -function GROUP:Find( DCSGroup ) - - local GroupName = DCSGroup:getName() -- Group#GROUP - local GroupFound = _DATABASE:FindGroup( GroupName ) - return GroupFound -end - ---- Find the created GROUP using the DCS Group Name. --- @param #GROUP self --- @param #string GroupName The DCS Group Name. --- @return #GROUP The GROUP. -function GROUP:FindByName( GroupName ) - - local GroupFound = _DATABASE:FindGroup( GroupName ) - return GroupFound -end - --- DCS Group methods support. - ---- Returns the DCS Group. --- @param #GROUP self --- @return DCSGroup#Group The DCS Group. -function GROUP:GetDCSGroup() - local DCSGroup = Group.getByName( self.GroupName ) - - if DCSGroup then - return DCSGroup - end - - return nil -end - - ---- Returns if the DCS Group is alive. --- When the group exists at run-time, this method will return true, otherwise false. --- @param #GROUP self --- @return #boolean true if the DCS Group is alive. -function GROUP:IsAlive() - self:F2( self.GroupName ) - - local DCSGroup = self:GetDCSGroup() - - if DCSGroup then - local GroupIsAlive = DCSGroup:isExist() - self:T3( GroupIsAlive ) - return GroupIsAlive - end - - return nil -end - ---- Destroys the DCS Group and all of its DCS Units. --- Note that this destroy method also raises a destroy event at run-time. --- So all event listeners will catch the destroy event of this DCS Group. --- @param #GROUP self -function GROUP:Destroy() - self:F2( self.GroupName ) - - local DCSGroup = self:GetDCSGroup() - - if DCSGroup then - for Index, UnitData in pairs( DCSGroup:getUnits() ) do - self:CreateEventCrash( timer.getTime(), UnitData ) - end - DCSGroup:destroy() - DCSGroup = nil - end - - return nil -end - ---- Returns category of the DCS Group. --- @param #GROUP self --- @return DCSGroup#Group.Category The category ID -function GROUP:GetCategory() - self:F2( self.GroupName ) - - local DCSGroup = self:GetDCSGroup() - if DCSGroup then - local GroupCategory = DCSGroup:getCategory() - self:T3( GroupCategory ) - return GroupCategory - end - - return nil -end - ---- Returns the category name of the DCS Group. --- @param #GROUP self --- @return #string Category name = Helicopter, Airplane, Ground Unit, Ship -function GROUP:GetCategoryName() - self:F2( self.GroupName ) - - local DCSGroup = self:GetDCSGroup() - if DCSGroup then - local CategoryNames = { - [Group.Category.AIRPLANE] = "Airplane", - [Group.Category.HELICOPTER] = "Helicopter", - [Group.Category.GROUND] = "Ground Unit", - [Group.Category.SHIP] = "Ship", - } - local GroupCategory = DCSGroup:getCategory() - self:T3( GroupCategory ) - - return CategoryNames[GroupCategory] - end - - return nil -end - - ---- Returns the coalition of the DCS Group. --- @param #GROUP self --- @return DCSCoalitionObject#coalition.side The coalition side of the DCS Group. -function GROUP:GetCoalition() - self:F2( self.GroupName ) - - local DCSGroup = self:GetDCSGroup() - if DCSGroup then - local GroupCoalition = DCSGroup:getCoalition() - self:T3( GroupCoalition ) - return GroupCoalition - end - - return nil -end - ---- Returns the country of the DCS Group. --- @param #GROUP self --- @return DCScountry#country.id The country identifier. --- @return #nil The DCS Group is not existing or alive. -function GROUP:GetCountry() - self:F2( self.GroupName ) - - local DCSGroup = self:GetDCSGroup() - if DCSGroup then - local GroupCountry = DCSGroup:getUnit(1):getCountry() - self:T3( GroupCountry ) - return GroupCountry - end - - return nil -end - ---- Returns the name of the DCS Group. --- @param #GROUP self --- @return #string The DCS Group name. -function GROUP:GetName() - self:F2( self.GroupName ) - - local DCSGroup = self:GetDCSGroup() - - if DCSGroup then - local GroupName = DCSGroup:getName() - self:T3( GroupName ) - return GroupName - end - - return nil -end - ---- Returns the DCS Group identifier. --- @param #GROUP self --- @return #number The identifier of the DCS Group. -function GROUP:GetID() - self:F2( self.GroupName ) - - local DCSGroup = self:GetDCSGroup() - - if DCSGroup then - local GroupID = DCSGroup:getID() - self:T3( GroupID ) - return GroupID - end - - return nil -end - ---- Returns the UNIT wrapper class with number UnitNumber. --- If the underlying DCS Unit does not exist, the method will return nil. . --- @param #GROUP self --- @param #number UnitNumber The number of the UNIT wrapper class to be returned. --- @return Unit#UNIT The UNIT wrapper class. -function GROUP:GetUnit( UnitNumber ) - self:F2( { self.GroupName, UnitNumber } ) - - local DCSGroup = self:GetDCSGroup() - - if DCSGroup then - local UnitFound = UNIT:Find( DCSGroup:getUnit( UnitNumber ) ) - self:T3( UnitFound.UnitName ) - self:T2( UnitFound ) - return UnitFound - end - - return nil -end - ---- Returns the DCS Unit with number UnitNumber. --- If the underlying DCS Unit does not exist, the method will return nil. . --- @param #GROUP self --- @param #number UnitNumber The number of the DCS Unit to be returned. --- @return DCSUnit#Unit The DCS Unit. -function GROUP:GetDCSUnit( UnitNumber ) - self:F2( { self.GroupName, UnitNumber } ) - - local DCSGroup = self:GetDCSGroup() - - if DCSGroup then - local DCSUnitFound = DCSGroup:getUnit( UnitNumber ) - self:T3( DCSUnitFound ) - return DCSUnitFound - end - - return nil -end - ---- Returns current size of the DCS Group. --- If some of the DCS Units of the DCS Group are destroyed the size of the DCS Group is changed. --- @param #GROUP self --- @return #number The DCS Group size. -function GROUP:GetSize() - self:F2( { self.GroupName } ) - local DCSGroup = self:GetDCSGroup() - - if DCSGroup then - local GroupSize = DCSGroup:getSize() - self:T3( GroupSize ) - return GroupSize - end - - return nil -end - ---- ---- Returns the initial size of the DCS Group. --- If some of the DCS Units of the DCS Group are destroyed, the initial size of the DCS Group is unchanged. --- @param #GROUP self --- @return #number The DCS Group initial size. -function GROUP:GetInitialSize() - self:F2( { self.GroupName } ) - local DCSGroup = self:GetDCSGroup() - - if DCSGroup then - local GroupInitialSize = DCSGroup:getInitialSize() - self:T3( GroupInitialSize ) - return GroupInitialSize - end - - return nil -end - ---- Returns the UNITs wrappers of the DCS Units of the DCS Group. --- @param #GROUP self --- @return #table The UNITs wrappers. -function GROUP:GetUnits() - self:F2( { self.GroupName } ) - local DCSGroup = self:GetDCSGroup() - - if DCSGroup then - local DCSUnits = DCSGroup:getUnits() - local Units = {} - for Index, UnitData in pairs( DCSUnits ) do - Units[#Units+1] = UNIT:Find( UnitData ) - end - self:T3( Units ) - return Units - end - - return nil -end - - ---- Returns the DCS Units of the DCS Group. --- @param #GROUP self --- @return #table The DCS Units. -function GROUP:GetDCSUnits() - self:F2( { self.GroupName } ) - local DCSGroup = self:GetDCSGroup() - - if DCSGroup then - local DCSUnits = DCSGroup:getUnits() - self:T3( DCSUnits ) - return DCSUnits - end - - return nil -end - ---- Get the controller for the GROUP. --- @param #GROUP self --- @return DCSController#Controller -function GROUP:_GetController() - self:F2( { self.GroupName } ) - local DCSGroup = self:GetDCSGroup() - - if DCSGroup then - local GroupController = DCSGroup:getController() - self:T3( GroupController ) - return GroupController - end - - return nil -end - - ---- Retrieve the group mission and allow to place function hooks within the mission waypoint plan. --- Use the method @{Group#GROUP:WayPointFunction} to define the hook functions for specific waypoints. --- Use the method @{Group@GROUP:WayPointExecute) to start the execution of the new mission plan. --- Note that when WayPointInitialize is called, the Mission of the group is RESTARTED! --- @param #GROUP self --- @return #GROUP -function GROUP:WayPointInitialize() - - self.WayPoints = self:GetTaskRoute() - - return self -end - - ---- Registers a waypoint function that will be executed when the group moves over the WayPoint. --- @param #GROUP self --- @param #number WayPoint The waypoint number. Note that the start waypoint on the route is WayPoint 1! --- @param #number WayPointIndex When defining multiple WayPoint functions for one WayPoint, use WayPointIndex to set the sequence of actions. --- @param #function WayPointFunction The waypoint function to be called when the group moves over the waypoint. The waypoint function takes variable parameters. --- @return #GROUP -function GROUP:WayPointFunction( WayPoint, WayPointIndex, WayPointFunction, ... ) - self:F2( { WayPoint, WayPointIndex, WayPointFunction } ) - - table.insert( self.WayPoints[WayPoint].task.params.tasks, WayPointIndex ) - self.WayPoints[WayPoint].task.params.tasks[WayPointIndex] = self:TaskFunction( WayPoint, WayPointIndex, WayPointFunction, arg ) - return self -end - - -function GROUP:TaskFunction( WayPoint, WayPointIndex, FunctionString, FunctionArguments ) - - local DCSTask - - local DCSScript = {} - DCSScript[#DCSScript+1] = "local MissionGroup = GROUP:Find( ... ) " - - if FunctionArguments.n > 0 then - DCSScript[#DCSScript+1] = FunctionString .. "( MissionGroup, " .. table.concat( FunctionArguments, "," ) .. ")" - else - DCSScript[#DCSScript+1] = FunctionString .. "( MissionGroup )" - end - - DCSTask = self:TaskWrappedAction( - self:CommandDoScript( - table.concat( DCSScript ) - ), WayPointIndex - ) - - self:T3( DCSTask ) - - return DCSTask - -end - - - ---- Executes the WayPoint plan. --- The function gets a WayPoint parameter, that you can use to restart the mission at a specific WayPoint. --- Note that when the WayPoint parameter is used, the new start mission waypoint of the group will be 1! --- @param #GROUP self --- @param #number WayPoint The WayPoint from where to execute the mission. --- @param #number WaitTime The amount seconds to wait before initiating the mission. --- @return #GROUP -function GROUP:WayPointExecute( WayPoint, WaitTime ) - - if not WayPoint then - WayPoint = 1 - end - - -- When starting the mission from a certain point, the TaskPoints need to be deleted before the given WayPoint. - for TaskPointID = 1, WayPoint - 1 do - table.remove( self.WayPoints, 1 ) - end - - self:T3( self.WayPoints ) - - self:SetTask( self:TaskRoute( self.WayPoints ), WaitTime ) - - return self -end - - ---- Activates a GROUP. --- @param #GROUP self -function GROUP:Activate() - self:F2( { self.GroupName } ) - trigger.action.activateGroup( self:GetDCSGroup() ) - return self:GetDCSGroup() -end - - ---- Gets the type name of the group. --- @param #GROUP self --- @return #string The type name of the group. -function GROUP:GetTypeName() - self:F2( self.GroupName ) - - local DCSGroup = self:GetDCSGroup() - - if DCSGroup then - local GroupTypeName = DCSGroup:getUnit(1):getTypeName() - self:T3( GroupTypeName ) - return( GroupTypeName ) - end - - return nil -end - ---- Gets the CallSign of the first DCS Unit of the DCS Group. --- @param #GROUP self --- @return #string The CallSign of the first DCS Unit of the DCS Group. -function GROUP:GetCallsign() - self:F2( self.GroupName ) - - local DCSGroup = self:GetDCSGroup() - - if DCSGroup then - local GroupCallSign = DCSGroup:getUnit(1):getCallsign() - self:T3( GroupCallSign ) - return GroupCallSign - end - - return nil -end - ---- Returns the current point (Vec2 vector) of the first DCS Unit in the DCS Group. --- @return DCSTypes#Vec2 Current Vec2 point of the first DCS Unit of the DCS Group. -function GROUP:GetPointVec2() - self:F2( self.GroupName ) - - local GroupPointVec2 = self:GetUnit(1):GetPointVec2() - self:T3( GroupPointVec2 ) - return GroupPointVec2 -end - ---- Returns the current point (Vec3 vector) of the first DCS Unit in the DCS Group. --- @return DCSTypes#Vec3 Current Vec3 point of the first DCS Unit of the DCS Group. -function GROUP:GetPointVec3() - self:F2( self.GroupName ) - - local GroupPointVec3 = self:GetUnit(1):GetPointVec3() - self:T3( GroupPointVec3 ) - return GroupPointVec3 -end - - - --- Is Functions - ---- Returns if all units of the group are within a @{Zone#ZONE}. --- @param #GROUP self --- @param Zone#ZONE_BASE Zone The zone to test. --- @return #boolean Returns true if the Group is completely within the @{Zone#ZONE} -function GROUP:IsCompletelyInZone( Zone ) - self:F2( { self.GroupName, Zone } ) - - for UnitID, UnitData in pairs( self:GetUnits() ) do - local Unit = UnitData -- Unit#UNIT - if Zone:IsPointVec3InZone( Unit:GetPointVec3() ) then - else - return false - end - end - - return true -end - ---- Returns if the group is of an air category. --- If the group is a helicopter or a plane, then this method will return true, otherwise false. --- @param #GROUP self --- @return #boolean Air category evaluation result. -function GROUP:IsAir() - self:F2( self.GroupName ) - - local DCSGroup = self:GetDCSGroup() - - if DCSGroup then - local IsAirResult = DCSGroup:getCategory() == Group.Category.AIRPLANE or DCSGroup:getCategory() == Group.Category.HELICOPTER - self:T3( IsAirResult ) - return IsAirResult - end - - return nil -end - ---- Returns if the DCS Group contains Helicopters. --- @param #GROUP self --- @return #boolean true if DCS Group contains Helicopters. -function GROUP:IsHelicopter() - self:F2( self.GroupName ) - - local DCSGroup = self:GetDCSGroup() - - if DCSGroup then - local GroupCategory = DCSGroup:getCategory() - self:T2( GroupCategory ) - return GroupCategory == Group.Category.HELICOPTER - end - - return nil -end - ---- Returns if the DCS Group contains AirPlanes. --- @param #GROUP self --- @return #boolean true if DCS Group contains AirPlanes. -function GROUP:IsAirPlane() - self:F2() - - local DCSGroup = self:GetDCSGroup() - - if DCSGroup then - local GroupCategory = DCSGroup:getCategory() - self:T2( GroupCategory ) - return GroupCategory == Group.Category.AIRPLANE - end - - return nil -end - ---- Returns if the DCS Group contains Ground troops. --- @param #GROUP self --- @return #boolean true if DCS Group contains Ground troops. -function GROUP:IsGround() - self:F2() - - local DCSGroup = self:GetDCSGroup() - - if DCSGroup then - local GroupCategory = DCSGroup:getCategory() - self:T2( GroupCategory ) - return GroupCategory == Group.Category.GROUND - end - - return nil -end - ---- Returns if the DCS Group contains Ships. --- @param #GROUP self --- @return #boolean true if DCS Group contains Ships. -function GROUP:IsShip() - self:F2() - - local DCSGroup = self:GetDCSGroup() - - if DCSGroup then - local GroupCategory = DCSGroup:getCategory() - self:T2( GroupCategory ) - return GroupCategory == Group.Category.SHIP - end - - return nil -end - ---- Returns if all units of the group are on the ground or landed. --- If all units of this group are on the ground, this function will return true, otherwise false. --- @param #GROUP self --- @return #boolean All units on the ground result. -function GROUP:AllOnGround() - self:F2() - - local DCSGroup = self:GetDCSGroup() - - if DCSGroup then - local AllOnGroundResult = true - - for Index, UnitData in pairs( DCSGroup:getUnits() ) do - if UnitData:inAir() then - AllOnGroundResult = false - end - end - - self:T3( AllOnGroundResult ) - return AllOnGroundResult - end - - return nil -end - ---- Returns the current maximum velocity of the group. --- Each unit within the group gets evaluated, and the maximum velocity (= the unit which is going the fastest) is returned. --- @param #GROUP self --- @return #number Maximum velocity found. -function GROUP:GetMaxVelocity() - self:F2() - - local DCSGroup = self:GetDCSGroup() - - if DCSGroup then - local MaxVelocity = 0 - - for Index, UnitData in pairs( DCSGroup:getUnits() ) do - - local Velocity = UnitData:getVelocity() - local VelocityTotal = math.abs( Velocity.x ) + math.abs( Velocity.y ) + math.abs( Velocity.z ) - - if VelocityTotal < MaxVelocity then - MaxVelocity = VelocityTotal - end - end - - return MaxVelocity - end - - return nil -end - ---- Returns the current minimum height of the group. --- Each unit within the group gets evaluated, and the minimum height (= the unit which is the lowest elevated) is returned. --- @param #GROUP self --- @return #number Minimum height found. -function GROUP:GetMinHeight() - self:F2() - -end - ---- Returns the current maximum height of the group. --- Each unit within the group gets evaluated, and the maximum height (= the unit which is the highest elevated) is returned. --- @param #GROUP self --- @return #number Maximum height found. -function GROUP:GetMaxHeight() - self:F2() - -end - --- Tasks - ---- Popping current Task from the group. --- @param #GROUP self --- @return Group#GROUP self -function GROUP:PopCurrentTask() - self:F2() - - local DCSGroup = self:GetDCSGroup() - - if DCSGroup then - local Controller = self:_GetController() - Controller:popTask() - return self - end - - return nil -end - ---- Pushing Task on the queue from the group. --- @param #GROUP self --- @return Group#GROUP self -function GROUP:PushTask( DCSTask, WaitTime ) - self:F2() - - local DCSGroup = self:GetDCSGroup() - - if DCSGroup then - local Controller = self:_GetController() - - -- When a group SPAWNs, it takes about a second to get the group in the simulator. Setting tasks to unspawned groups provides unexpected results. - -- Therefore we schedule the functions to set the mission and options for the Group. - -- Controller:pushTask( DCSTask ) - - if WaitTime then - --routines.scheduleFunction( Controller.pushTask, { Controller, DCSTask }, timer.getTime() + WaitTime ) - SCHEDULER:New( Controller, Controller.pushTask, { DCSTask }, WaitTime ) - else - Controller:pushTask( DCSTask ) - end - - return self - end - - return nil -end - ---- Clearing the Task Queue and Setting the Task on the queue from the group. --- @param #GROUP self --- @return Group#GROUP self -function GROUP:SetTask( DCSTask, WaitTime ) - self:F2( { DCSTask } ) - - local DCSGroup = self:GetDCSGroup() - - if DCSGroup then - - local Controller = self:_GetController() - - -- When a group SPAWNs, it takes about a second to get the group in the simulator. Setting tasks to unspawned groups provides unexpected results. - -- Therefore we schedule the functions to set the mission and options for the Group. - -- Controller.setTask( Controller, DCSTask ) - - if not WaitTime then - WaitTime = 1 - end - --routines.scheduleFunction( Controller.setTask, { Controller, DCSTask }, timer.getTime() + WaitTime ) - SCHEDULER:New( Controller, Controller.setTask, { DCSTask }, WaitTime ) - - return self - end - - return nil -end - - ---- Return a condition section for a controlled task --- @param #GROUP self --- @param DCSTime#Time time --- @param #string userFlag --- @param #boolean userFlagValue --- @param #string condition --- @param DCSTime#Time duration --- @param #number lastWayPoint --- return DCSTask#Task -function GROUP:TaskCondition( time, userFlag, userFlagValue, condition, duration, lastWayPoint ) - self:F2( { time, userFlag, userFlagValue, condition, duration, lastWayPoint } ) - - local DCSStopCondition = {} - DCSStopCondition.time = time - DCSStopCondition.userFlag = userFlag - DCSStopCondition.userFlagValue = userFlagValue - DCSStopCondition.condition = condition - DCSStopCondition.duration = duration - DCSStopCondition.lastWayPoint = lastWayPoint - - self:T3( { DCSStopCondition } ) - return DCSStopCondition -end - ---- Return a Controlled Task taking a Task and a TaskCondition --- @param #GROUP self --- @param DCSTask#Task DCSTask --- @param #DCSStopCondition DCSStopCondition --- @return DCSTask#Task -function GROUP:TaskControlled( DCSTask, DCSStopCondition ) - self:F2( { DCSTask, DCSStopCondition } ) - - local DCSTaskControlled - - DCSTaskControlled = { - id = 'ControlledTask', - params = { - task = DCSTask, - stopCondition = DCSStopCondition - } - } - - self:T3( { DCSTaskControlled } ) - return DCSTaskControlled -end - ---- Return a Combo Task taking an array of Tasks --- @param #GROUP self --- @param DCSTask#TaskArray DCSTasks Array of @{DCSTask#Task} --- @return DCSTask#Task -function GROUP:TaskCombo( DCSTasks ) - self:F2( { DCSTasks } ) - - local DCSTaskCombo - - DCSTaskCombo = { - id = 'ComboTask', - params = { - tasks = DCSTasks - } - } - - self:T3( { DCSTaskCombo } ) - return DCSTaskCombo -end - ---- Return a WrappedAction Task taking a Command --- @param #GROUP self --- @param DCSCommand#Command DCSCommand --- @return DCSTask#Task -function GROUP:TaskWrappedAction( DCSCommand, Index ) - self:F2( { DCSCommand } ) - - local DCSTaskWrappedAction - - DCSTaskWrappedAction = { - id = "WrappedAction", - enabled = true, - number = Index, - auto = false, - params = { - action = DCSCommand, - }, - } - - self:T3( { DCSTaskWrappedAction } ) - return DCSTaskWrappedAction -end - ---- Executes a command action --- @param #GROUP self --- @param DCSCommand#Command DCSCommand --- @return #GROUP self -function GROUP:SetCommand( DCSCommand ) - self:F2( DCSCommand ) - - local DCSGroup = self:GetDCSGroup() - - if DCSGroup then - local Controller = self:_GetController() - Controller:setCommand( DCSCommand ) - return self - end - - return nil -end - ---- Perform a switch waypoint command --- @param #GROUP self --- @param #number FromWayPoint --- @param #number ToWayPoint --- @return DCSTask#Task -function GROUP:CommandSwitchWayPoint( FromWayPoint, ToWayPoint, Index ) - self:F2( { FromWayPoint, ToWayPoint, Index } ) - - local CommandSwitchWayPoint = { - id = 'SwitchWaypoint', - params = { - fromWaypointIndex = FromWayPoint, - goToWaypointIndex = ToWayPoint, - }, - } - - self:T3( { CommandSwitchWayPoint } ) - return CommandSwitchWayPoint -end - - --- TASKS FOR AIR GROUPS - - ---- (AIR) Attack a Group. --- @param #GROUP self --- @param Group#GROUP AttackGroup The Group to be attacked. --- @param #number WeaponType (optional) Bitmask of weapon types those allowed to use. If parameter is not defined that means no limits on weapon usage. --- @param DCSTypes#AI.Task.WeaponExpend WeaponExpend (optional) Determines how much weapon will be released at each attack. If parameter is not defined the unit / group will choose expend on its own discretion. --- @param #number AttackQty (optional) This parameter limits maximal quantity of attack. The aicraft/group will not make more attack than allowed even if the target group not destroyed and the aicraft/group still have ammo. If not defined the aircraft/group will attack target until it will be destroyed or until the aircraft/group will run out of ammo. --- @param DCSTypes#Azimuth Direction (optional) Desired ingress direction from the target to the attacking aircraft. Group/aircraft will make its attacks from the direction. Of course if there is no way to attack from the direction due the terrain group/aircraft will choose another direction. --- @param DCSTypes#Distance Altitude (optional) Desired attack start altitude. Group/aircraft will make its attacks from the altitude. If the altitude is too low or too high to use weapon aircraft/group will choose closest altitude to the desired attack start altitude. If the desired altitude is defined group/aircraft will not attack from safe altitude. --- @param #boolean AttackQtyLimit (optional) The flag determines how to interpret attackQty parameter. If the flag is true then attackQty is a limit on maximal attack quantity for "AttackGroup" and "AttackUnit" tasks. If the flag is false then attackQty is a desired attack quantity for "Bombing" and "BombingRunway" tasks. --- @return DCSTask#Task The DCS task structure. -function GROUP:TaskAttackGroup( AttackGroup, WeaponType, WeaponExpend, AttackQty, Direction, Altitude, AttackQtyLimit ) - self:F2( { self.GroupName, AttackGroup, WeaponType, WeaponExpend, AttackQty, Direction, Altitude, AttackQtyLimit } ) - - -- AttackGroup = { - -- id = 'AttackGroup', - -- params = { - -- groupId = Group.ID, - -- weaponType = number, - -- expend = enum AI.Task.WeaponExpend, - -- attackQty = number, - -- directionEnabled = boolean, - -- direction = Azimuth, - -- altitudeEnabled = boolean, - -- altitude = Distance, - -- attackQtyLimit = boolean, - -- } - -- } - - local DirectionEnabled = nil - if Direction then - DirectionEnabled = true - end - - local AltitudeEnabled = nil - if Altitude then - AltitudeEnabled = true - end - - local DCSTask - DCSTask = { id = 'AttackGroup', - params = { - groupId = AttackGroup:GetID(), - weaponType = WeaponType, - expend = WeaponExpend, - attackQty = AttackQty, - directionEnabled = DirectionEnabled, - direction = Direction, - altitudeEnabled = AltitudeEnabled, - altitude = Altitude, - attackQtyLimit = AttackQtyLimit, - }, - }, - - self:T3( { DCSTask } ) - return DCSTask -end - - ---- (AIR) Attack the Unit. --- @param #GROUP self --- @param Unit#UNIT AttackUnit The unit. --- @param #number WeaponType (optional) Bitmask of weapon types those allowed to use. If parameter is not defined that means no limits on weapon usage. --- @param DCSTypes#AI.Task.WeaponExpend WeaponExpend (optional) Determines how much weapon will be released at each attack. If parameter is not defined the unit / group will choose expend on its own discretion. --- @param #number AttackQty (optional) This parameter limits maximal quantity of attack. The aicraft/group will not make more attack than allowed even if the target group not destroyed and the aicraft/group still have ammo. If not defined the aircraft/group will attack target until it will be destroyed or until the aircraft/group will run out of ammo. --- @param DCSTypes#Azimuth Direction (optional) Desired ingress direction from the target to the attacking aircraft. Group/aircraft will make its attacks from the direction. Of course if there is no way to attack from the direction due the terrain group/aircraft will choose another direction. --- @param #boolean AttackQtyLimit (optional) The flag determines how to interpret attackQty parameter. If the flag is true then attackQty is a limit on maximal attack quantity for "AttackGroup" and "AttackUnit" tasks. If the flag is false then attackQty is a desired attack quantity for "Bombing" and "BombingRunway" tasks. --- @param #boolean GroupAttack (optional) Flag indicates that the target must be engaged by all aircrafts of the group. Has effect only if the task is assigned to a group, not to a single aircraft. --- @return DCSTask#Task The DCS task structure. -function GROUP:TaskAttackUnit( AttackUnit, WeaponType, WeaponExpend, AttackQty, Direction, AttackQtyLimit, GroupAttack ) - self:F2( { self.GroupName, AttackUnit, WeaponType, WeaponExpend, AttackQty, Direction, AttackQtyLimit, GroupAttack } ) - - -- AttackUnit = { - -- id = 'AttackUnit', - -- params = { - -- unitId = Unit.ID, - -- weaponType = number, - -- expend = enum AI.Task.WeaponExpend - -- attackQty = number, - -- direction = Azimuth, - -- attackQtyLimit = boolean, - -- groupAttack = boolean, - -- } - -- } - - local DCSTask - DCSTask = { id = 'AttackUnit', - params = { - unitId = AttackUnit:GetID(), - weaponType = WeaponType, - expend = WeaponExpend, - attackQty = AttackQty, - direction = Direction, - attackQtyLimit = AttackQtyLimit, - groupAttack = GroupAttack, - }, - }, - - self:T3( { DCSTask } ) - return DCSTask -end - - ---- (AIR) Delivering weapon at the point on the ground. --- @param #GROUP self --- @param DCSTypes#Vec2 PointVec2 2D-coordinates of the point to deliver weapon at. --- @param #number WeaponType (optional) Bitmask of weapon types those allowed to use. If parameter is not defined that means no limits on weapon usage. --- @param DCSTypes#AI.Task.WeaponExpend WeaponExpend (optional) Determines how much weapon will be released at each attack. If parameter is not defined the unit / group will choose expend on its own discretion. --- @param #number AttackQty (optional) Desired quantity of passes. The parameter is not the same in AttackGroup and AttackUnit tasks. --- @param DCSTypes#Azimuth Direction (optional) Desired ingress direction from the target to the attacking aircraft. Group/aircraft will make its attacks from the direction. Of course if there is no way to attack from the direction due the terrain group/aircraft will choose another direction. --- @param #boolean GroupAttack (optional) Flag indicates that the target must be engaged by all aircrafts of the group. Has effect only if the task is assigned to a group, not to a single aircraft. --- @return DCSTask#Task The DCS task structure. -function GROUP:TaskBombing( PointVec2, WeaponType, WeaponExpend, AttackQty, Direction, GroupAttack ) - self:F2( { self.GroupName, PointVec2, WeaponType, WeaponExpend, AttackQty, Direction, GroupAttack } ) - --- Bombing = { --- id = 'Bombing', --- params = { --- point = Vec2, --- weaponType = number, --- expend = enum AI.Task.WeaponExpend, --- attackQty = number, --- direction = Azimuth, --- groupAttack = boolean, --- } --- } - - local DCSTask - DCSTask = { id = 'Bombing', - params = { - point = PointVec2, - weaponType = WeaponType, - expend = WeaponExpend, - attackQty = AttackQty, - direction = Direction, - groupAttack = GroupAttack, - }, - }, - - self:T3( { DCSTask } ) - return DCSTask -end - ---- (AIR) Orbit at a specified position at a specified alititude during a specified duration with a specified speed. --- @param #GROUP self --- @param DCSTypes#Vec2 Point The point to hold the position. --- @param #number Altitude The altitude to hold the position. --- @param #number Speed The speed flying when holding the position. --- @return #GROUP self -function GROUP:TaskOrbitCircleAtVec2( Point, Altitude, Speed ) - self:F2( { self.GroupName, Point, Altitude, Speed } ) - - -- pattern = enum AI.Task.OribtPattern, - -- point = Vec2, - -- point2 = Vec2, - -- speed = Distance, - -- altitude = Distance - - local LandHeight = land.getHeight( Point ) - - self:T3( { LandHeight } ) - - local DCSTask = { id = 'Orbit', - params = { pattern = AI.Task.OrbitPattern.CIRCLE, - point = Point, - speed = Speed, - altitude = Altitude + LandHeight - } - } - - - -- local AITask = { id = 'ControlledTask', - -- params = { task = { id = 'Orbit', - -- params = { pattern = AI.Task.OrbitPattern.CIRCLE, - -- point = Point, - -- speed = Speed, - -- altitude = Altitude + LandHeight - -- } - -- }, - -- stopCondition = { duration = Duration - -- } - -- } - -- } - -- ) - - return DCSTask -end - ---- (AIR) Orbit at the current position of the first unit of the group at a specified alititude --- @param #GROUP self --- @param #number Altitude The altitude to hold the position. --- @param #number Speed The speed flying when holding the position. --- @return #GROUP self -function GROUP:TaskOrbitCircle( Altitude, Speed ) - self:F2( { self.GroupName, Altitude, Speed } ) - - local DCSGroup = self:GetDCSGroup() - - if DCSGroup then - local GroupPoint = self:GetPointVec2() - return self:TaskOrbitCircleAtVec2( GroupPoint, Altitude, Speed ) - end - - return nil -end - - - ---- (AIR) Hold position at the current position of the first unit of the group. --- @param #GROUP self --- @param #number Duration The maximum duration in seconds to hold the position. --- @return #GROUP self -function GROUP:TaskHoldPosition() - self:F2( { self.GroupName } ) - - return self:TaskOrbitCircle( 30, 10 ) -end - - - - ---- (AIR) Attacking the map object (building, structure, e.t.c). --- @param #GROUP self --- @param DCSTypes#Vec2 PointVec2 2D-coordinates of the point the map object is closest to. The distance between the point and the map object must not be greater than 2000 meters. Object id is not used here because Mission Editor doesn't support map object identificators. --- @param #number WeaponType (optional) Bitmask of weapon types those allowed to use. If parameter is not defined that means no limits on weapon usage. --- @param DCSTypes#AI.Task.WeaponExpend WeaponExpend (optional) Determines how much weapon will be released at each attack. If parameter is not defined the unit / group will choose expend on its own discretion. --- @param #number AttackQty (optional) This parameter limits maximal quantity of attack. The aicraft/group will not make more attack than allowed even if the target group not destroyed and the aicraft/group still have ammo. If not defined the aircraft/group will attack target until it will be destroyed or until the aircraft/group will run out of ammo. --- @param DCSTypes#Azimuth Direction (optional) Desired ingress direction from the target to the attacking aircraft. Group/aircraft will make its attacks from the direction. Of course if there is no way to attack from the direction due the terrain group/aircraft will choose another direction. --- @param #boolean GroupAttack (optional) Flag indicates that the target must be engaged by all aircrafts of the group. Has effect only if the task is assigned to a group, not to a single aircraft. --- @return DCSTask#Task The DCS task structure. -function GROUP:TaskAttackMapObject( PointVec2, WeaponType, WeaponExpend, AttackQty, Direction, GroupAttack ) - self:F2( { self.GroupName, PointVec2, WeaponType, WeaponExpend, AttackQty, Direction, GroupAttack } ) - --- AttackMapObject = { --- id = 'AttackMapObject', --- params = { --- point = Vec2, --- weaponType = number, --- expend = enum AI.Task.WeaponExpend, --- attackQty = number, --- direction = Azimuth, --- groupAttack = boolean, --- } --- } - - local DCSTask - DCSTask = { id = 'AttackMapObject', - params = { - point = PointVec2, - weaponType = WeaponType, - expend = WeaponExpend, - attackQty = AttackQty, - direction = Direction, - groupAttack = GroupAttack, - }, - }, - - self:T3( { DCSTask } ) - return DCSTask -end - - ---- (AIR) Delivering weapon on the runway. --- @param #GROUP self --- @param Airbase#AIRBASE Airbase Airbase to attack. --- @param #number WeaponType (optional) Bitmask of weapon types those allowed to use. If parameter is not defined that means no limits on weapon usage. --- @param DCSTypes#AI.Task.WeaponExpend WeaponExpend (optional) Determines how much weapon will be released at each attack. If parameter is not defined the unit / group will choose expend on its own discretion. --- @param #number AttackQty (optional) This parameter limits maximal quantity of attack. The aicraft/group will not make more attack than allowed even if the target group not destroyed and the aicraft/group still have ammo. If not defined the aircraft/group will attack target until it will be destroyed or until the aircraft/group will run out of ammo. --- @param DCSTypes#Azimuth Direction (optional) Desired ingress direction from the target to the attacking aircraft. Group/aircraft will make its attacks from the direction. Of course if there is no way to attack from the direction due the terrain group/aircraft will choose another direction. --- @param #boolean GroupAttack (optional) Flag indicates that the target must be engaged by all aircrafts of the group. Has effect only if the task is assigned to a group, not to a single aircraft. --- @return DCSTask#Task The DCS task structure. -function GROUP:TaskBombingRunway( Airbase, WeaponType, WeaponExpend, AttackQty, Direction, GroupAttack ) - self:F2( { self.GroupName, Airbase, WeaponType, WeaponExpend, AttackQty, Direction, GroupAttack } ) - --- BombingRunway = { --- id = 'BombingRunway', --- params = { --- runwayId = AirdromeId, --- weaponType = number, --- expend = enum AI.Task.WeaponExpend, --- attackQty = number, --- direction = Azimuth, --- groupAttack = boolean, --- } --- } - - local DCSTask - DCSTask = { id = 'BombingRunway', - params = { - point = Airbase:GetID(), - weaponType = WeaponType, - expend = WeaponExpend, - attackQty = AttackQty, - direction = Direction, - groupAttack = GroupAttack, - }, - }, - - self:T3( { DCSTask } ) - return DCSTask -end - - ---- (AIR) Refueling from the nearest tanker. No parameters. --- @param #GROUP self --- @return DCSTask#Task The DCS task structure. -function GROUP:TaskRefueling() - self:F2( { self.GroupName } ) - --- Refueling = { --- id = 'Refueling', --- params = {} --- } - - local DCSTask - DCSTask = { id = 'Refueling', - params = { - }, - }, - - self:T3( { DCSTask } ) - return DCSTask -end - - ---- (AIR HELICOPTER) Landing at the ground. For helicopters only. --- @param #GROUP self --- @param DCSTypes#Vec2 Point The point where to land. --- @param #number Duration The duration in seconds to stay on the ground. --- @return #GROUP self -function GROUP:TaskLandAtVec2( Point, Duration ) - self:F2( { self.GroupName, Point, Duration } ) - --- Land = { --- id= 'Land', --- params = { --- point = Vec2, --- durationFlag = boolean, --- duration = Time --- } --- } - - local DCSTask - if Duration and Duration > 0 then - DCSTask = { id = 'Land', - params = { - point = Point, - durationFlag = true, - duration = Duration, - }, - } - else - DCSTask = { id = 'Land', - params = { - point = Point, - durationFlag = false, - }, - } - end - - self:T3( DCSTask ) - return DCSTask -end - ---- (AIR) Land the group at a @{Zone#ZONE). --- @param #GROUP self --- @param Zone#ZONE Zone The zone where to land. --- @param #number Duration The duration in seconds to stay on the ground. --- @return #GROUP self -function GROUP:TaskLandAtZone( Zone, Duration, RandomPoint ) - self:F2( { self.GroupName, Zone, Duration, RandomPoint } ) - - local Point - if RandomPoint then - Point = Zone:GetRandomPointVec2() - else - Point = Zone:GetPointVec2() - end - - local DCSTask = self:TaskLandAtVec2( Point, Duration ) - - self:T3( DCSTask ) - return DCSTask -end - ---- (AIR) Following another airborne group. --- The unit / group will follow lead unit of another group, wingmens of both groups will continue following their leaders. --- If another group is on land the unit / group will orbit around. --- @param #GROUP self --- @param Group#GROUP FollowGroup The group to be followed. --- @param DCSTypes#Vec3 PointVec3 Position of the unit / lead unit of the group relative lead unit of another group in frame reference oriented by course of lead unit of another group. If another group is on land the unit / group will orbit around. --- @param #number LastWaypointIndex Detach waypoint of another group. Once reached the unit / group Follow task is finished. --- @return DCSTask#Task The DCS task structure. -function GROUP:TaskFollow( FollowGroup, PointVec3, LastWaypointIndex ) - self:F2( { self.GroupName, FollowGroup, PointVec3, LastWaypointIndex } ) - --- Follow = { --- id = 'Follow', --- params = { --- groupId = Group.ID, --- pos = Vec3, --- lastWptIndexFlag = boolean, --- lastWptIndex = number --- } --- } - - local LastWaypointIndexFlag = nil - if LastWaypointIndex then - LastWaypointIndexFlag = true - end - - local DCSTask - DCSTask = { id = 'Follow', - params = { - groupId = FollowGroup:GetID(), - pos = PointVec3, - lastWptIndexFlag = LastWaypointIndexFlag, - lastWptIndex = LastWaypointIndex, - }, - }, - - self:T3( { DCSTask } ) - return DCSTask -end - - ---- (AIR) Escort another airborne group. --- The unit / group will follow lead unit of another group, wingmens of both groups will continue following their leaders. --- The unit / group will also protect that group from threats of specified types. --- @param #GROUP self --- @param Group#GROUP EscortGroup The group to be escorted. --- @param DCSTypes#Vec3 PointVec3 Position of the unit / lead unit of the group relative lead unit of another group in frame reference oriented by course of lead unit of another group. If another group is on land the unit / group will orbit around. --- @param #number LastWaypointIndex Detach waypoint of another group. Once reached the unit / group Follow task is finished. --- @param #number EngagementDistanceMax Maximal distance from escorted group to threat. If the threat is already engaged by escort escort will disengage if the distance becomes greater than 1.5 * engagementDistMax. --- @param DCSTypes#AttributeNameArray TargetTypes Array of AttributeName that is contains threat categories allowed to engage. --- @return DCSTask#Task The DCS task structure. -function GROUP:TaskEscort( FollowGroup, PointVec3, LastWaypointIndex, EngagementDistance, TargetTypes ) - self:F2( { self.GroupName, FollowGroup, PointVec3, LastWaypointIndex, EngagementDistance, TargetTypes } ) - --- Escort = { --- id = 'Escort', --- params = { --- groupId = Group.ID, --- pos = Vec3, --- lastWptIndexFlag = boolean, --- lastWptIndex = number, --- engagementDistMax = Distance, --- targetTypes = array of AttributeName, --- } --- } - - local LastWaypointIndexFlag = nil - if LastWaypointIndex then - LastWaypointIndexFlag = true - end - - local DCSTask - DCSTask = { id = 'Follow', - params = { - groupId = FollowGroup:GetID(), - pos = PointVec3, - lastWptIndexFlag = LastWaypointIndexFlag, - lastWptIndex = LastWaypointIndex, - engagementDistMax = EngagementDistance, - targetTypes = TargetTypes, - }, - }, - - self:T3( { DCSTask } ) - return DCSTask -end - - --- GROUND TASKS - ---- (GROUND) Fire at a VEC2 point until ammunition is finished. --- @param #GROUP self --- @param DCSTypes#Vec2 PointVec2 The point to fire at. --- @param DCSTypes#Distance Radius The radius of the zone to deploy the fire at. --- @return DCSTask#Task The DCS task structure. -function GROUP:TaskFireAtPoint( PointVec2, Radius ) - self:F2( { self.GroupName, PointVec2, Radius } ) - - -- FireAtPoint = { - -- id = 'FireAtPoint', - -- params = { - -- point = Vec2, - -- radius = Distance, - -- } - -- } - - local DCSTask - DCSTask = { id = 'FireAtPoint', - params = { - point = PointVec2, - radius = Radius, - } - } - - self:T3( { DCSTask } ) - return DCSTask -end - ---- (GROUND) Hold ground group from moving. --- @param #GROUP self --- @return DCSTask#Task The DCS task structure. -function GROUP:TaskHold() - self:F2( { self.GroupName } ) - --- Hold = { --- id = 'Hold', --- params = { --- } --- } - - local DCSTask - DCSTask = { id = 'Hold', - params = { - } - } - - self:T3( { DCSTask } ) - return DCSTask -end - --- TASKS FOR AIRBORNE AND GROUND UNITS/GROUPS - ---- (AIR + GROUND) The task makes the group/unit a FAC and orders the FAC to control the target (enemy ground group) destruction. --- The killer is player-controlled allied CAS-aircraft that is in contact with the FAC. --- If the task is assigned to the group lead unit will be a FAC. --- @param #GROUP self --- @param Group#GROUP AttackGroup Target GROUP. --- @param #number WeaponType Bitmask of weapon types those allowed to use. If parameter is not defined that means no limits on weapon usage. --- @param DCSTypes#AI.Task.Designation Designation (optional) Designation type. --- @param #boolean Datalink (optional) Allows to use datalink to send the target information to attack aircraft. Enabled by default. --- @return DCSTask#Task The DCS task structure. -function GROUP:TaskFAC_AttackGroup( AttackGroup, WeaponType, Designation, Datalink ) - self:F2( { self.GroupName, AttackGroup, WeaponType, Designation, Datalink } ) - --- FAC_AttackGroup = { --- id = 'FAC_AttackGroup', --- params = { --- groupId = Group.ID, --- weaponType = number, --- designation = enum AI.Task.Designation, --- datalink = boolean --- } --- } - - local DCSTask - DCSTask = { id = 'FAC_AttackGroup', - params = { - groupId = AttackGroup:GetID(), - weaponType = WeaponType, - designation = Designation, - datalink = Datalink, - } - } - - self:T3( { DCSTask } ) - return DCSTask -end - --- EN-ROUTE TASKS FOR AIRBORNE GROUPS - ---- (AIR) Engaging targets of defined types. --- @param #GROUP self --- @param DCSTypes#Distance Distance Maximal distance from the target to a route leg. If the target is on a greater distance it will be ignored. --- @param DCSTypes#AttributeNameArray TargetTypes Array of target categories allowed to engage. --- @param #number Priority All enroute tasks have the priority parameter. This is a number (less value - higher priority) that determines actions related to what task will be performed first. --- @return DCSTask#Task The DCS task structure. -function GROUP:EnRouteTaskEngageTargets( Distance, TargetTypes, Priority ) - self:F2( { self.GroupName, Distance, TargetTypes, Priority } ) - --- EngageTargets ={ --- id = 'EngageTargets', --- params = { --- maxDist = Distance, --- targetTypes = array of AttributeName, --- priority = number --- } --- } - - local DCSTask - DCSTask = { id = 'EngageTargets', - params = { - maxDist = Distance, - targetTypes = TargetTypes, - priority = Priority - } - } - - self:T3( { DCSTask } ) - return DCSTask -end - - ---- (AIR) Engaging a targets of defined types at circle-shaped zone. --- @param #GROUP self --- @param DCSTypes#Vec2 PointVec2 2D-coordinates of the zone. --- @param DCSTypes#Distance Radius Radius of the zone. --- @param DCSTypes#AttributeNameArray TargetTypes Array of target categories allowed to engage. --- @param #number Priority All en-route tasks have the priority parameter. This is a number (less value - higher priority) that determines actions related to what task will be performed first. --- @return DCSTask#Task The DCS task structure. -function GROUP:EnRouteTaskEngageTargets( PointVec2, Radius, TargetTypes, Priority ) - self:F2( { self.GroupName, PointVec2, Radius, TargetTypes, Priority } ) - --- EngageTargetsInZone = { --- id = 'EngageTargetsInZone', --- params = { --- point = Vec2, --- zoneRadius = Distance, --- targetTypes = array of AttributeName, --- priority = number --- } --- } - - local DCSTask - DCSTask = { id = 'EngageTargetsInZone', - params = { - point = PointVec2, - zoneRadius = Radius, - targetTypes = TargetTypes, - priority = Priority - } - } - - self:T3( { DCSTask } ) - return DCSTask -end - ---- (AIR) Engaging a group. The task does not assign the target group to the unit/group to attack now; it just allows the unit/group to engage the target group as well as other assigned targets. --- @param #GROUP self --- @param Group#GROUP AttackGroup The Group to be attacked. --- @param #number Priority All en-route tasks have the priority parameter. This is a number (less value - higher priority) that determines actions related to what task will be performed first. --- @param #number WeaponType (optional) Bitmask of weapon types those allowed to use. If parameter is not defined that means no limits on weapon usage. --- @param DCSTypes#AI.Task.WeaponExpend WeaponExpend (optional) Determines how much weapon will be released at each attack. If parameter is not defined the unit / group will choose expend on its own discretion. --- @param #number AttackQty (optional) This parameter limits maximal quantity of attack. The aicraft/group will not make more attack than allowed even if the target group not destroyed and the aicraft/group still have ammo. If not defined the aircraft/group will attack target until it will be destroyed or until the aircraft/group will run out of ammo. --- @param DCSTypes#Azimuth Direction (optional) Desired ingress direction from the target to the attacking aircraft. Group/aircraft will make its attacks from the direction. Of course if there is no way to attack from the direction due the terrain group/aircraft will choose another direction. --- @param DCSTypes#Distance Altitude (optional) Desired attack start altitude. Group/aircraft will make its attacks from the altitude. If the altitude is too low or too high to use weapon aircraft/group will choose closest altitude to the desired attack start altitude. If the desired altitude is defined group/aircraft will not attack from safe altitude. --- @param #boolean AttackQtyLimit (optional) The flag determines how to interpret attackQty parameter. If the flag is true then attackQty is a limit on maximal attack quantity for "AttackGroup" and "AttackUnit" tasks. If the flag is false then attackQty is a desired attack quantity for "Bombing" and "BombingRunway" tasks. --- @return DCSTask#Task The DCS task structure. -function GROUP:EnRouteTaskEngageGroup( AttackGroup, Priority, WeaponType, WeaponExpend, AttackQty, Direction, Altitude, AttackQtyLimit ) - self:F2( { self.GroupName, AttackGroup, Priority, WeaponType, WeaponExpend, AttackQty, Direction, Altitude, AttackQtyLimit } ) - - -- EngageGroup = { - -- id = 'EngageGroup ', - -- params = { - -- groupId = Group.ID, - -- weaponType = number, - -- expend = enum AI.Task.WeaponExpend, - -- attackQty = number, - -- directionEnabled = boolean, - -- direction = Azimuth, - -- altitudeEnabled = boolean, - -- altitude = Distance, - -- attackQtyLimit = boolean, - -- priority = number, - -- } - -- } - - local DirectionEnabled = nil - if Direction then - DirectionEnabled = true - end - - local AltitudeEnabled = nil - if Altitude then - AltitudeEnabled = true - end - - local DCSTask - DCSTask = { id = 'EngageGroup', - params = { - groupId = AttackGroup:GetID(), - weaponType = WeaponType, - expend = WeaponExpend, - attackQty = AttackQty, - directionEnabled = DirectionEnabled, - direction = Direction, - altitudeEnabled = AltitudeEnabled, - altitude = Altitude, - attackQtyLimit = AttackQtyLimit, - priority = Priority, - }, - }, - - self:T3( { DCSTask } ) - return DCSTask -end - - ---- (AIR) Attack the Unit. --- @param #GROUP self --- @param Unit#UNIT AttackUnit The UNIT. --- @param #number Priority All en-route tasks have the priority parameter. This is a number (less value - higher priority) that determines actions related to what task will be performed first. --- @param #number WeaponType (optional) Bitmask of weapon types those allowed to use. If parameter is not defined that means no limits on weapon usage. --- @param DCSTypes#AI.Task.WeaponExpend WeaponExpend (optional) Determines how much weapon will be released at each attack. If parameter is not defined the unit / group will choose expend on its own discretion. --- @param #number AttackQty (optional) This parameter limits maximal quantity of attack. The aicraft/group will not make more attack than allowed even if the target group not destroyed and the aicraft/group still have ammo. If not defined the aircraft/group will attack target until it will be destroyed or until the aircraft/group will run out of ammo. --- @param DCSTypes#Azimuth Direction (optional) Desired ingress direction from the target to the attacking aircraft. Group/aircraft will make its attacks from the direction. Of course if there is no way to attack from the direction due the terrain group/aircraft will choose another direction. --- @param #boolean AttackQtyLimit (optional) The flag determines how to interpret attackQty parameter. If the flag is true then attackQty is a limit on maximal attack quantity for "AttackGroup" and "AttackUnit" tasks. If the flag is false then attackQty is a desired attack quantity for "Bombing" and "BombingRunway" tasks. --- @param #boolean GroupAttack (optional) Flag indicates that the target must be engaged by all aircrafts of the group. Has effect only if the task is assigned to a group, not to a single aircraft. --- @return DCSTask#Task The DCS task structure. -function GROUP:EnRouteTaskEngageUnit( AttackUnit, Priority, WeaponType, WeaponExpend, AttackQty, Direction, AttackQtyLimit, GroupAttack ) - self:F2( { self.GroupName, AttackUnit, Priority, WeaponType, WeaponExpend, AttackQty, Direction, AttackQtyLimit, GroupAttack } ) - - -- EngageUnit = { - -- id = 'EngageUnit', - -- params = { - -- unitId = Unit.ID, - -- weaponType = number, - -- expend = enum AI.Task.WeaponExpend - -- attackQty = number, - -- direction = Azimuth, - -- attackQtyLimit = boolean, - -- groupAttack = boolean, - -- priority = number, - -- } - -- } - - local DCSTask - DCSTask = { id = 'EngageUnit', - params = { - unitId = AttackUnit:GetID(), - weaponType = WeaponType, - expend = WeaponExpend, - attackQty = AttackQty, - direction = Direction, - attackQtyLimit = AttackQtyLimit, - groupAttack = GroupAttack, - priority = Priority, - }, - }, - - self:T3( { DCSTask } ) - return DCSTask -end - - ---- (AIR) Aircraft will act as an AWACS for friendly units (will provide them with information about contacts). No parameters. --- @param #GROUP self --- @return DCSTask#Task The DCS task structure. -function GROUP:EnRouteTaskAWACS( ) - self:F2( { self.GroupName } ) - --- AWACS = { --- id = 'AWACS', --- params = { --- } --- } - - local DCSTask - DCSTask = { id = 'AWACS', - params = { - } - } - - self:T3( { DCSTask } ) - return DCSTask -end - - ---- (AIR) Aircraft will act as a tanker for friendly units. No parameters. --- @param #GROUP self --- @return DCSTask#Task The DCS task structure. -function GROUP:EnRouteTaskTanker( ) - self:F2( { self.GroupName } ) - --- Tanker = { --- id = 'Tanker', --- params = { --- } --- } - - local DCSTask - DCSTask = { id = 'Tanker', - params = { - } - } - - self:T3( { DCSTask } ) - return DCSTask -end - - --- En-route tasks for ground units/groups - ---- (GROUND) Ground unit (EW-radar) will act as an EWR for friendly units (will provide them with information about contacts). No parameters. --- @param #GROUP self --- @return DCSTask#Task The DCS task structure. -function GROUP:EnRouteTaskEWR( ) - self:F2( { self.GroupName } ) - --- EWR = { --- id = 'EWR', --- params = { --- } --- } - - local DCSTask - DCSTask = { id = 'EWR', - params = { - } - } - - self:T3( { DCSTask } ) - return DCSTask -end - - --- En-route tasks for airborne and ground units/groups - ---- (AIR + GROUND) The task makes the group/unit a FAC and lets the FAC to choose the target (enemy ground group) as well as other assigned targets. --- The killer is player-controlled allied CAS-aircraft that is in contact with the FAC. --- If the task is assigned to the group lead unit will be a FAC. --- @param #GROUP self --- @param Group#GROUP AttackGroup Target GROUP. --- @param #number Priority All en-route tasks have the priority parameter. This is a number (less value - higher priority) that determines actions related to what task will be performed first. --- @param #number WeaponType Bitmask of weapon types those allowed to use. If parameter is not defined that means no limits on weapon usage. --- @param DCSTypes#AI.Task.Designation Designation (optional) Designation type. --- @param #boolean Datalink (optional) Allows to use datalink to send the target information to attack aircraft. Enabled by default. --- @return DCSTask#Task The DCS task structure. -function GROUP:EnRouteTaskFAC_EngageGroup( AttackGroup, Priority, WeaponType, Designation, Datalink ) - self:F2( { self.GroupName, AttackGroup, WeaponType, Priority, Designation, Datalink } ) - --- FAC_EngageGroup = { --- id = 'FAC_EngageGroup', --- params = { --- groupId = Group.ID, --- weaponType = number, --- designation = enum AI.Task.Designation, --- datalink = boolean, --- priority = number, --- } --- } - - local DCSTask - DCSTask = { id = 'FAC_EngageGroup', - params = { - groupId = AttackGroup:GetID(), - weaponType = WeaponType, - designation = Designation, - datalink = Datalink, - priority = Priority, - } - } - - self:T3( { DCSTask } ) - return DCSTask -end - - ---- (AIR + GROUND) The task makes the group/unit a FAC and lets the FAC to choose a targets (enemy ground group) around as well as other assigned targets. --- The killer is player-controlled allied CAS-aircraft that is in contact with the FAC. --- If the task is assigned to the group lead unit will be a FAC. --- @param #GROUP self --- @param DCSTypes#Distance Radius The maximal distance from the FAC to a target. --- @param #number Priority All en-route tasks have the priority parameter. This is a number (less value - higher priority) that determines actions related to what task will be performed first. --- @return DCSTask#Task The DCS task structure. -function GROUP:EnRouteTaskFAC( Radius, Priority ) - self:F2( { self.GroupName, Radius, Priority } ) - --- FAC = { --- id = 'FAC', --- params = { --- radius = Distance, --- priority = number --- } --- } - - local DCSTask - DCSTask = { id = 'FAC', - params = { - radius = Radius, - priority = Priority - } - } - - self:T3( { DCSTask } ) - return DCSTask -end - - - - ---- Move the group to a Vec2 Point, wait for a defined duration and embark a group. --- @param #GROUP self --- @param DCSTypes#Vec2 Point The point where to wait. --- @param #number Duration The duration in seconds to wait. --- @param #GROUP EmbarkingGroup The group to be embarked. --- @return DCSTask#Task The DCS task structure -function GROUP:TaskEmbarkingAtVec2( Point, Duration, EmbarkingGroup ) - self:F2( { self.GroupName, Point, Duration, EmbarkingGroup.DCSGroup } ) - - local DCSTask - DCSTask = { id = 'Embarking', - params = { x = Point.x, - y = Point.y, - duration = Duration, - groupsForEmbarking = { EmbarkingGroup.GroupID }, - durationFlag = true, - distributionFlag = false, - distribution = {}, - } - } - - self:T3( { DCSTask } ) - return DCSTask -end - ---- Move to a defined Vec2 Point, and embark to a group when arrived within a defined Radius. --- @param #GROUP self --- @param DCSTypes#Vec2 Point The point where to wait. --- @param #number Radius The radius of the embarking zone around the Point. --- @return DCSTask#Task The DCS task structure. -function GROUP:TaskEmbarkToTransportAtVec2( Point, Radius ) - self:F2( { self.GroupName, Point, Radius } ) - - local DCSTask --DCSTask#Task - DCSTask = { id = 'EmbarkToTransport', - params = { x = Point.x, - y = Point.y, - zoneRadius = Radius, - } - } - - self:T3( { DCSTask } ) - return DCSTask -end - ---- Return a Misson task from a mission template. --- @param #GROUP self --- @param #table TaskMission A table containing the mission task. --- @return DCSTask#Task -function GROUP:TaskMission( TaskMission ) - self:F2( Points ) - - local DCSTask - DCSTask = { id = 'Mission', params = { TaskMission, }, } - - self:T3( { DCSTask } ) - return DCSTask -end - ---- Return a Misson task to follow a given route defined by Points. --- @param #GROUP self --- @param #table Points A table of route points. --- @return DCSTask#Task -function GROUP:TaskRoute( Points ) - self:F2( Points ) - - local DCSTask - DCSTask = { id = 'Mission', params = { route = { points = Points, }, }, } - - self:T3( { DCSTask } ) - return DCSTask -end - ---- Make the DCS Group to fly to a given point and hover. --- @param #GROUP self --- @param DCSTypes#Vec3 Point The destination point in Vec3 format. --- @param #number Speed The speed to travel. --- @return #GROUP self -function GROUP:TaskRouteToVec2( Point, Speed ) - self:F2( { Point, Speed } ) - - local GroupPoint = self:GetUnit( 1 ):GetPointVec2() - - local PointFrom = {} - PointFrom.x = GroupPoint.x - PointFrom.y = GroupPoint.y - PointFrom.type = "Turning Point" - PointFrom.action = "Turning Point" - PointFrom.speed = Speed - PointFrom.speed_locked = true - PointFrom.properties = { - ["vnav"] = 1, - ["scale"] = 0, - ["angle"] = 0, - ["vangle"] = 0, - ["steer"] = 2, - } - - - local PointTo = {} - PointTo.x = Point.x - PointTo.y = Point.y - PointTo.type = "Turning Point" - PointTo.action = "Fly Over Point" - PointTo.speed = Speed - PointTo.speed_locked = true - PointTo.properties = { - ["vnav"] = 1, - ["scale"] = 0, - ["angle"] = 0, - ["vangle"] = 0, - ["steer"] = 2, - } - - - local Points = { PointFrom, PointTo } - - self:T3( Points ) - - self:Route( Points ) - - return self -end - ---- Make the DCS Group to fly to a given point and hover. --- @param #GROUP self --- @param DCSTypes#Vec3 Point The destination point in Vec3 format. --- @param #number Speed The speed to travel. --- @return #GROUP self -function GROUP:TaskRouteToVec3( Point, Speed ) - self:F2( { Point, Speed } ) - - local GroupPoint = self:GetUnit( 1 ):GetPointVec3() - - local PointFrom = {} - PointFrom.x = GroupPoint.x - PointFrom.y = GroupPoint.z - PointFrom.alt = GroupPoint.y - PointFrom.alt_type = "BARO" - PointFrom.type = "Turning Point" - PointFrom.action = "Turning Point" - PointFrom.speed = Speed - PointFrom.speed_locked = true - PointFrom.properties = { - ["vnav"] = 1, - ["scale"] = 0, - ["angle"] = 0, - ["vangle"] = 0, - ["steer"] = 2, - } - - - local PointTo = {} - PointTo.x = Point.x - PointTo.y = Point.z - PointTo.alt = Point.y - PointTo.alt_type = "BARO" - PointTo.type = "Turning Point" - PointTo.action = "Fly Over Point" - PointTo.speed = Speed - PointTo.speed_locked = true - PointTo.properties = { - ["vnav"] = 1, - ["scale"] = 0, - ["angle"] = 0, - ["vangle"] = 0, - ["steer"] = 2, - } - - - local Points = { PointFrom, PointTo } - - self:T3( Points ) - - self:Route( Points ) - - return self -end - - - ---- Make the group to follow a given route. --- @param #GROUP self --- @param #table GoPoints A table of Route Points. --- @return #GROUP self -function GROUP:Route( GoPoints ) - self:F2( GoPoints ) - - local DCSGroup = self:GetDCSGroup() - - if DCSGroup then - local Points = routines.utils.deepCopy( GoPoints ) - local MissionTask = { id = 'Mission', params = { route = { points = Points, }, }, } - local Controller = self:_GetController() - --Controller.setTask( Controller, MissionTask ) - --routines.scheduleFunction( Controller.setTask, { Controller, MissionTask}, timer.getTime() + 1 ) - SCHEDULER:New( Controller, Controller.setTask, { MissionTask }, 1 ) - return self - end - - return nil -end - - - ---- Route the group to a given zone. --- The group final destination point can be randomized. --- A speed can be given in km/h. --- A given formation can be given. --- @param #GROUP self --- @param Zone#ZONE Zone The zone where to route to. --- @param #boolean Randomize Defines whether to target point gets randomized within the Zone. --- @param #number Speed The speed. --- @param Base#FORMATION Formation The formation string. -function GROUP:TaskRouteToZone( Zone, Randomize, Speed, Formation ) - self:F2( Zone ) - - local DCSGroup = self:GetDCSGroup() - - if DCSGroup then - - local GroupPoint = self:GetPointVec2() - - local PointFrom = {} - PointFrom.x = GroupPoint.x - PointFrom.y = GroupPoint.y - PointFrom.type = "Turning Point" - PointFrom.action = "Cone" - PointFrom.speed = 20 / 1.6 - - - local PointTo = {} - local ZonePoint - - if Randomize then - ZonePoint = Zone:GetRandomPointVec2() - else - ZonePoint = Zone:GetPointVec2() - end - - PointTo.x = ZonePoint.x - PointTo.y = ZonePoint.y - PointTo.type = "Turning Point" - - if Formation then - PointTo.action = Formation - else - PointTo.action = "Cone" - end - - if Speed then - PointTo.speed = Speed - else - PointTo.speed = 20 / 1.6 - end - - local Points = { PointFrom, PointTo } - - self:T3( Points ) - - self:Route( Points ) - - return self - end - - return nil -end - --- Commands - ---- Do Script command --- @param #GROUP self --- @param #string DoScript --- @return #DCSCommand -function GROUP:CommandDoScript( DoScript ) - - local DCSDoScript = { - id = "Script", - params = { - command = DoScript, - }, - } - - self:T3( DCSDoScript ) - return DCSDoScript -end - - ---- Return the mission template of the group. --- @param #GROUP self --- @return #table The MissionTemplate -function GROUP:GetTaskMission() - self:F2( self.GroupName ) - - return routines.utils.deepCopy( _DATABASE.Templates.Groups[self.GroupName].Template ) -end - ---- Return the mission route of the group. --- @param #GROUP self --- @return #table The mission route defined by points. -function GROUP:GetTaskRoute() - self:F2( self.GroupName ) - - return routines.utils.deepCopy( _DATABASE.Templates.Groups[self.GroupName].Template.route.points ) -end - ---- Return the route of a group by using the @{Database#DATABASE} class. --- @param #GROUP self --- @param #number Begin The route point from where the copy will start. The base route point is 0. --- @param #number End The route point where the copy will end. The End point is the last point - the End point. The last point has base 0. --- @param #boolean Randomize Randomization of the route, when true. --- @param #number Radius When randomization is on, the randomization is within the radius. -function GROUP:CopyRoute( Begin, End, Randomize, Radius ) - self:F2( { Begin, End } ) - - local Points = {} - - -- Could be a Spawned Group - local GroupName = string.match( self:GetName(), ".*#" ) - if GroupName then - GroupName = GroupName:sub( 1, -2 ) - else - GroupName = self:GetName() - end - - self:T3( { GroupName } ) - - local Template = _DATABASE.Templates.Groups[GroupName].Template - - if Template then - if not Begin then - Begin = 0 - end - if not End then - End = 0 - end - - for TPointID = Begin + 1, #Template.route.points - End do - if Template.route.points[TPointID] then - Points[#Points+1] = routines.utils.deepCopy( Template.route.points[TPointID] ) - if Randomize then - if not Radius then - Radius = 500 - end - Points[#Points].x = Points[#Points].x + math.random( Radius * -1, Radius ) - Points[#Points].y = Points[#Points].y + math.random( Radius * -1, Radius ) - end - end - end - return Points - end - - return nil -end - - -function GROUP:GetDetectedTargets() - self:F2( self.GroupName ) - - local DCSGroup = self:GetDCSGroup() - if DCSGroup then - return self:_GetController():getDetectedTargets() - end - - return nil -end - -function GROUP:IsTargetDetected( DCSObject ) - self:F2( self.GroupName ) - - local DCSGroup = self:GetDCSGroup() - if DCSGroup then - - local TargetIsDetected, TargetIsVisible, TargetLastTime, TargetKnowType, TargetKnowDistance, TargetLastPos, TargetLastVelocity - = self:_GetController().isTargetDetected( self:_GetController(), DCSObject, - Controller.Detection.VISUAL, - Controller.Detection.OPTIC, - Controller.Detection.RADAR, - Controller.Detection.IRST, - Controller.Detection.RWR, - Controller.Detection.DLINK - ) - return TargetIsDetected, TargetIsVisible, TargetLastTime, TargetKnowType, TargetKnowDistance, TargetLastPos, TargetLastVelocity - end - - return nil -end - --- Options - ---- Can the GROUP hold their weapons? --- @param #GROUP self --- @return #boolean -function GROUP:OptionROEHoldFirePossible() - self:F2( { self.GroupName } ) - - local DCSGroup = self:GetDCSGroup() - if DCSGroup then - if self:IsAir() or self:IsGround() or self:IsShip() then - return true - end - - return false - end - - return nil -end - ---- Holding weapons. --- @param Group#GROUP self --- @return Group#GROUP self -function GROUP:OptionROEHoldFire() - self:F2( { self.GroupName } ) - - local DCSGroup = self:GetDCSGroup() - if DCSGroup then - local Controller = self:_GetController() - - if self:IsAir() then - Controller:setOption( AI.Option.Air.id.ROE, AI.Option.Air.val.ROE.WEAPON_HOLD ) - elseif self:IsGround() then - Controller:setOption( AI.Option.Ground.id.ROE, AI.Option.Ground.val.ROE.WEAPON_HOLD ) - elseif self:IsShip() then - Controller:setOption( AI.Option.Naval.id.ROE, AI.Option.Naval.val.ROE.WEAPON_HOLD ) - end - - return self - end - - return nil -end - ---- Can the GROUP attack returning on enemy fire? --- @param #GROUP self --- @return #boolean -function GROUP:OptionROEReturnFirePossible() - self:F2( { self.GroupName } ) - - local DCSGroup = self:GetDCSGroup() - if DCSGroup then - if self:IsAir() or self:IsGround() or self:IsShip() then - return true - end - - return false - end - - return nil -end - ---- Return fire. --- @param #GROUP self --- @return #GROUP self -function GROUP:OptionROEReturnFire() - self:F2( { self.GroupName } ) - - local DCSGroup = self:GetDCSGroup() - if DCSGroup then - local Controller = self:_GetController() - - if self:IsAir() then - Controller:setOption( AI.Option.Air.id.ROE, AI.Option.Air.val.ROE.RETURN_FIRE ) - elseif self:IsGround() then - Controller:setOption( AI.Option.Ground.id.ROE, AI.Option.Ground.val.ROE.RETURN_FIRE ) - elseif self:IsShip() then - Controller:setOption( AI.Option.Naval.id.ROE, AI.Option.Naval.val.ROE.RETURN_FIRE ) - end - - return self - end - - return nil -end - ---- Can the GROUP attack designated targets? --- @param #GROUP self --- @return #boolean -function GROUP:OptionROEOpenFirePossible() - self:F2( { self.GroupName } ) - - local DCSGroup = self:GetDCSGroup() - if DCSGroup then - if self:IsAir() or self:IsGround() or self:IsShip() then - return true - end - - return false - end - - return nil -end - ---- Openfire. --- @param #GROUP self --- @return #GROUP self -function GROUP:OptionROEOpenFire() - self:F2( { self.GroupName } ) - - local DCSGroup = self:GetDCSGroup() - if DCSGroup then - local Controller = self:_GetController() - - if self:IsAir() then - Controller:setOption( AI.Option.Air.id.ROE, AI.Option.Air.val.ROE.OPEN_FIRE ) - elseif self:IsGround() then - Controller:setOption( AI.Option.Ground.id.ROE, AI.Option.Ground.val.ROE.OPEN_FIRE ) - elseif self:IsShip() then - Controller:setOption( AI.Option.Naval.id.ROE, AI.Option.Naval.val.ROE.OPEN_FIRE ) - end - - return self - end - - return nil -end - ---- Can the GROUP attack targets of opportunity? --- @param #GROUP self --- @return #boolean -function GROUP:OptionROEWeaponFreePossible() - self:F2( { self.GroupName } ) - - local DCSGroup = self:GetDCSGroup() - if DCSGroup then - if self:IsAir() then - return true - end - - return false - end - - return nil -end - ---- Weapon free. --- @param #GROUP self --- @return #GROUP self -function GROUP:OptionROEWeaponFree() - self:F2( { self.GroupName } ) - - local DCSGroup = self:GetDCSGroup() - if DCSGroup then - local Controller = self:_GetController() - - if self:IsAir() then - Controller:setOption( AI.Option.Air.id.ROE, AI.Option.Air.val.ROE.WEAPON_FREE ) - end - - return self - end - - return nil -end - ---- Can the GROUP ignore enemy fire? --- @param #GROUP self --- @return #boolean -function GROUP:OptionROTNoReactionPossible() - self:F2( { self.GroupName } ) - - local DCSGroup = self:GetDCSGroup() - if DCSGroup then - if self:IsAir() then - return true - end - - return false - end - - return nil -end - - ---- No evasion on enemy threats. --- @param #GROUP self --- @return #GROUP self -function GROUP:OptionROTNoReaction() - self:F2( { self.GroupName } ) - - local DCSGroup = self:GetDCSGroup() - if DCSGroup then - local Controller = self:_GetController() - - if self:IsAir() then - Controller:setOption( AI.Option.Air.id.REACTION_ON_THREAT, AI.Option.Air.val.REACTION_ON_THREAT.NO_REACTION ) - end - - return self - end - - return nil -end - ---- Can the GROUP evade using passive defenses? --- @param #GROUP self --- @return #boolean -function GROUP:OptionROTPassiveDefensePossible() - self:F2( { self.GroupName } ) - - local DCSGroup = self:GetDCSGroup() - if DCSGroup then - if self:IsAir() then - return true - end - - return false - end - - return nil -end - ---- Evasion passive defense. --- @param #GROUP self --- @return #GROUP self -function GROUP:OptionROTPassiveDefense() - self:F2( { self.GroupName } ) - - local DCSGroup = self:GetDCSGroup() - if DCSGroup then - local Controller = self:_GetController() - - if self:IsAir() then - Controller:setOption( AI.Option.Air.id.REACTION_ON_THREAT, AI.Option.Air.val.REACTION_ON_THREAT.PASSIVE_DEFENCE ) - end - - return self - end - - return nil -end - ---- Can the GROUP evade on enemy fire? --- @param #GROUP self --- @return #boolean -function GROUP:OptionROTEvadeFirePossible() - self:F2( { self.GroupName } ) - - local DCSGroup = self:GetDCSGroup() - if DCSGroup then - if self:IsAir() then - return true - end - - return false - end - - return nil -end - - ---- Evade on fire. --- @param #GROUP self --- @return #GROUP self -function GROUP:OptionROTEvadeFire() - self:F2( { self.GroupName } ) - - local DCSGroup = self:GetDCSGroup() - if DCSGroup then - local Controller = self:_GetController() - - if self:IsAir() then - Controller:setOption( AI.Option.Air.id.REACTION_ON_THREAT, AI.Option.Air.val.REACTION_ON_THREAT.EVADE_FIRE ) - end - - return self - end - - return nil -end - ---- Can the GROUP evade on fire using vertical manoeuvres? --- @param #GROUP self --- @return #boolean -function GROUP:OptionROTVerticalPossible() - self:F2( { self.GroupName } ) - - local DCSGroup = self:GetDCSGroup() - if DCSGroup then - if self:IsAir() then - return true - end - - return false - end - - return nil -end - - ---- Evade on fire using vertical manoeuvres. --- @param #GROUP self --- @return #GROUP self -function GROUP:OptionROTVertical() - self:F2( { self.GroupName } ) - - local DCSGroup = self:GetDCSGroup() - if DCSGroup then - local Controller = self:_GetController() - - if self:IsAir() then - Controller:setOption( AI.Option.Air.id.REACTION_ON_THREAT, AI.Option.Air.val.REACTION_ON_THREAT.BYPASS_AND_ESCAPE ) - end - - return self - end - - return nil -end - --- Message APIs - ---- Returns a message for a coalition or a client. --- @param #GROUP self --- @param #string Message The message text --- @param DCSTypes#Duration Duration The duration of the message. --- @return Message#MESSAGE -function GROUP:Message( Message, Duration ) - self:F2( { Message, Duration } ) - - local DCSGroup = self:GetDCSGroup() - if DCSGroup then - return MESSAGE:New( Message, self:GetCallsign() .. " (" .. self:GetTypeName() .. ")", Duration, self:GetClassNameAndID() ) - end - - return nil -end - ---- Send a message to all coalitions. --- The message will appear in the message area. The message will begin with the callsign of the group and the type of the first unit sending the message. --- @param #GROUP self --- @param #string Message The message text --- @param DCSTypes#Duration Duration The duration of the message. -function GROUP:MessageToAll( Message, Duration ) - self:F2( { Message, Duration } ) - - local DCSGroup = self:GetDCSGroup() - if DCSGroup then - self:Message( Message, Duration ):ToAll() - end - - return nil -end - ---- Send a message to the red coalition. --- The message will appear in the message area. The message will begin with the callsign of the group and the type of the first unit sending the message. --- @param #GROUP self --- @param #string Message The message text --- @param DCSTYpes#Duration Duration The duration of the message. -function GROUP:MessageToRed( Message, Duration ) - self:F2( { Message, Duration } ) - - local DCSGroup = self:GetDCSGroup() - if DCSGroup then - self:Message( Message, Duration ):ToRed() - end - - return nil -end - ---- Send a message to the blue coalition. --- The message will appear in the message area. The message will begin with the callsign of the group and the type of the first unit sending the message. --- @param #GROUP self --- @param #string Message The message text --- @param DCSTypes#Duration Duration The duration of the message. -function GROUP:MessageToBlue( Message, Duration ) - self:F2( { Message, Duration } ) - - local DCSGroup = self:GetDCSGroup() - if DCSGroup then - self:Message( Message, Duration ):ToBlue() - end - - return nil -end - ---- Send a message to a client. --- The message will appear in the message area. The message will begin with the callsign of the group and the type of the first unit sending the message. --- @param #GROUP self --- @param #string Message The message text --- @param DCSTypes#Duration Duration The duration of the message. --- @param Client#CLIENT Client The client object receiving the message. -function GROUP:MessageToClient( Message, Duration, Client ) - self:F2( { Message, Duration } ) - - local DCSGroup = self:GetDCSGroup() - if DCSGroup then - self:Message( Message, Duration ):ToClient( Client ) - end - - return nil -end ---- UNIT Class --- --- @{UNIT} class --- ============== --- The @{UNIT} class is a wrapper class to handle the DCS Unit objects: --- --- * Support all DCS Unit APIs. --- * Enhance with Unit specific APIs not in the DCS Unit API set. --- * Handle local Unit Controller. --- * Manage the "state" of the DCS Unit. --- --- --- UNIT reference methods --- ====================== --- For each DCS Unit object alive within a running mission, a UNIT wrapper object (instance) will be created within the _@{DATABASE} object. --- This is done at the beginning of the mission (when the mission starts), and dynamically when new DCS Unit objects are spawned (using the @{SPAWN} class). --- --- The UNIT class **does not contain a :New()** method, rather it provides **:Find()** methods to retrieve the object reference --- using the DCS Unit or the DCS UnitName. --- --- Another thing to know is that UNIT objects do not "contain" the DCS Unit object. --- The UNIT methods will reference the DCS Unit object by name when it is needed during API execution. --- If the DCS Unit object does not exist or is nil, the UNIT methods will return nil and log an exception in the DCS.log file. --- --- The UNIT class provides the following functions to retrieve quickly the relevant UNIT instance: --- --- * @{#UNIT.Find}(): Find a UNIT instance from the _DATABASE object using a DCS Unit object. --- * @{#UNIT.FindByName}(): Find a UNIT instance from the _DATABASE object using a DCS Unit name. --- --- IMPORTANT: ONE SHOULD NEVER SANATIZE these UNIT OBJECT REFERENCES! (make the UNIT object references nil). --- --- DCS UNIT APIs --- ============= --- The DCS Unit APIs are used extensively within MOOSE. The UNIT class has for each DCS Unit API a corresponding method. --- To be able to distinguish easily in your code the difference between a UNIT API call and a DCS Unit API call, --- the first letter of the method is also capitalized. So, by example, the DCS Unit method @{DCSUnit#Unit.getName}() --- is implemented in the UNIT class as @{#UNIT.GetName}(). --- --- Additional UNIT APIs --- ==================== --- The UNIT class comes with additional methods. Find below a summary. --- --- Smoke, Flare Units --- ------------------ --- The UNIT class provides methods to smoke or flare units easily. --- The @{#UNIT.SmokeBlue}(), @{#UNIT.SmokeGreen}(),@{#UNIT.SmokeOrange}(), @{#UNIT.SmokeRed}(), @{#UNIT.SmokeRed}() methods --- will smoke the unit in the corresponding color. Note that smoking a unit is done at the current position of the DCS Unit. --- When the DCS Unit moves for whatever reason, the smoking will still continue! --- The @{#UNIT.FlareGreen}(), @{#UNIT.FlareRed}(), @{#UNIT.FlareWhite}(), @{#UNIT.FlareYellow}() --- methods will fire off a flare in the air with the corresponding color. Note that a flare is a one-off shot and its effect is of very short duration. --- --- Position, Point --- --------------- --- The UNIT class provides methods to obtain the current point or position of the DCS Unit. --- The @{#UNIT.GetPointVec2}(), @{#UNIT.GetPointVec3}() will obtain the current location of the DCS Unit in a Vec2 (2D) or a Vec3 (3D) vector respectively. --- If you want to obtain the complete 3D position including oriëntation and direction vectors, consult the @{#UNIT.GetPositionVec3}() method respectively. --- --- Alive --- ----- --- The @{#UNIT.IsAlive}(), @{#UNIT.IsActive}() methods determines if the DCS Unit is alive, meaning, it is existing and active. --- --- Test for other units in radius --- ------------------------------ --- One can test if another DCS Unit is within a given radius of the current DCS Unit, by using the @{#UNIT.OtherUnitInRadius}() method. --- --- More functions will be added --- ---------------------------- --- During the MOOSE development, more functions will be added. A complete list of the current functions is below. --- --- --- --- --- @module Unit --- @author FlightControl - -Include.File( "Routines" ) -Include.File( "Base" ) -Include.File( "Message" ) - ---- The UNIT class --- @type UNIT --- @extends Base#BASE --- @field #UNIT.FlareColor FlareColor --- @field #UNIT.SmokeColor SmokeColor -UNIT = { - ClassName="UNIT", - CategoryName = { - [Unit.Category.AIRPLANE] = "Airplane", - [Unit.Category.HELICOPTER] = "Helicoper", - [Unit.Category.GROUND_UNIT] = "Ground Unit", - [Unit.Category.SHIP] = "Ship", - [Unit.Category.STRUCTURE] = "Structure", - }, - FlareColor = { - Green = trigger.flareColor.Green, - Red = trigger.flareColor.Red, - White = trigger.flareColor.White, - Yellow = trigger.flareColor.Yellow - }, - SmokeColor = { - Green = trigger.smokeColor.Green, - Red = trigger.smokeColor.Red, - White = trigger.smokeColor.White, - Orange = trigger.smokeColor.Orange, - Blue = trigger.smokeColor.Blue - }, - } - ---- FlareColor --- @type UNIT.FlareColor --- @field Green --- @field Red --- @field White --- @field Yellow - ---- SmokeColor --- @type UNIT.SmokeColor --- @field Green --- @field Red --- @field White --- @field Orange --- @field Blue - --- Registration. - ---- Create a new UNIT from DCSUnit. --- @param #UNIT self --- @param DCSUnit#Unit DCSUnit --- @param Database#DATABASE Database --- @return Unit#UNIT -function UNIT:Register( UnitName ) - - local self = BASE:Inherit( self, BASE:New() ) - self:F2( UnitName ) - self.UnitName = UnitName - return self -end - --- Reference methods. - ---- Finds a UNIT from the _DATABASE using a DCSUnit object. --- @param #UNIT self --- @param DCSUnit#Unit DCSUnit An existing DCS Unit object reference. --- @return Unit#UNIT self -function UNIT:Find( DCSUnit ) - - local UnitName = DCSUnit:getName() - local UnitFound = _DATABASE:FindUnit( UnitName ) - return UnitFound -end - ---- Find a UNIT in the _DATABASE using the name of an existing DCS Unit. --- @param #UNIT self --- @param #string UnitName The Unit Name. --- @return Unit#UNIT self -function UNIT:FindByName( UnitName ) - - local UnitFound = _DATABASE:FindUnit( UnitName ) - return UnitFound -end - -function UNIT:GetDCSUnit() - local DCSUnit = Unit.getByName( self.UnitName ) - - if DCSUnit then - return DCSUnit - end - - return nil -end - ---- Returns coalition of the Unit. --- @param Unit#UNIT self --- @return DCSCoalitionObject#coalition.side The side of the coalition. --- @return #nil The DCS Unit is not existing or alive. -function UNIT:GetCoalition() - self:F2( self.UnitName ) - - local DCSUnit = self:GetDCSUnit() - - if DCSUnit then - local UnitCoalition = DCSUnit:getCoalition() - self:T3( UnitCoalition ) - return UnitCoalition - end - - return nil -end - ---- Returns country of the Unit. --- @param Unit#UNIT self --- @return DCScountry#country.id The country identifier. --- @return #nil The DCS Unit is not existing or alive. -function UNIT:GetCountry() - self:F2( self.UnitName ) - - local DCSUnit = self:GetDCSUnit() - - if DCSUnit then - local UnitCountry = DCSUnit:getCountry() - self:T3( UnitCountry ) - return UnitCountry - end - - return nil -end - - ---- Returns DCS Unit object name. --- The function provides access to non-activated units too. --- @param Unit#UNIT self --- @return #string The name of the DCS Unit. --- @return #nil The DCS Unit is not existing or alive. -function UNIT:GetName() - self:F2( self.UnitName ) - - local DCSUnit = self:GetDCSUnit() - - if DCSUnit then - local UnitName = self.UnitName - return UnitName - end - - return nil -end - - ---- Returns if the unit is alive. --- @param Unit#UNIT self --- @return #boolean true if Unit is alive. --- @return #nil The DCS Unit is not existing or alive. -function UNIT:IsAlive() - self:F2( self.UnitName ) - - local DCSUnit = self:GetDCSUnit() - - if DCSUnit then - local UnitIsAlive = DCSUnit:isExist() - return UnitIsAlive - end - - return false -end - ---- Returns if the unit is activated. --- @param Unit#UNIT self --- @return #boolean true if Unit is activated. --- @return #nil The DCS Unit is not existing or alive. -function UNIT:IsActive() - self:F2( self.UnitName ) - - local DCSUnit = self:GetDCSUnit() - - if DCSUnit then - - local UnitIsActive = DCSUnit:isActive() - return UnitIsActive - end - - return nil -end - ---- Returns name of the player that control the unit or nil if the unit is controlled by A.I. --- @param Unit#UNIT self --- @return #string Player Name --- @return #nil The DCS Unit is not existing or alive. -function UNIT:GetPlayerName() - self:F2( self.UnitName ) - - local DCSUnit = self:GetDCSUnit() - - if DCSUnit then - - local PlayerName = DCSUnit:getPlayerName() - if PlayerName == nil then - PlayerName = "" - end - return PlayerName - end - - return nil -end - ---- Returns the unit's unique identifier. --- @param Unit#UNIT self --- @return DCSUnit#Unit.ID Unit ID --- @return #nil The DCS Unit is not existing or alive. -function UNIT:GetID() - self:F2( self.UnitName ) - - local DCSUnit = self:GetDCSUnit() - - if DCSUnit then - local UnitID = DCSUnit:getID() - return UnitID - end - - return nil -end - ---- Returns the unit's number in the group. --- The number is the same number the unit has in ME. --- It may not be changed during the mission. --- If any unit in the group is destroyed, the numbers of another units will not be changed. --- @param Unit#UNIT self --- @return #number The Unit number. --- @return #nil The DCS Unit is not existing or alive. -function UNIT:GetNumber() - self:F2( self.UnitName ) - - local DCSUnit = self:GetDCSUnit() - - if DCSUnit then - local UnitNumber = DCSUnit:getNumber() - return UnitNumber - end - - return nil -end - ---- Returns the unit's group if it exist and nil otherwise. --- @param Unit#UNIT self --- @return Group#GROUP The Group of the Unit. --- @return #nil The DCS Unit is not existing or alive. -function UNIT:GetGroup() - self:F2( self.UnitName ) - - local DCSUnit = self:GetDCSUnit() - - if DCSUnit then - local UnitGroup = DCSUnit:getGroup() - return UnitGroup - end - - return nil -end - - ---- Returns the unit's callsign - the localized string. --- @param Unit#UNIT self --- @return #string The Callsign of the Unit. --- @return #nil The DCS Unit is not existing or alive. -function UNIT:GetCallSign() - self:F2( self.UnitName ) - - local DCSUnit = self:GetDCSUnit() - - if DCSUnit then - local UnitCallSign = DCSUnit:getCallsign() - return UnitCallSign - end - - return nil -end - ---- Returns the unit's health. Dead units has health <= 1.0. --- @param Unit#UNIT self --- @return #number The Unit's health value. --- @return #nil The DCS Unit is not existing or alive. -function UNIT:GetLife() - self:F2( self.UnitName ) - - local DCSUnit = self:GetDCSUnit() - - if DCSUnit then - local UnitLife = DCSUnit:getLife() - return UnitLife - end - - return nil -end - ---- Returns the Unit's initial health. --- @param Unit#UNIT self --- @return #number The Unit's initial health value. --- @return #nil The DCS Unit is not existing or alive. -function UNIT:GetLife0() - self:F2( self.UnitName ) - - local DCSUnit = self:GetDCSUnit() - - if DCSUnit then - local UnitLife0 = DCSUnit:getLife0() - return UnitLife0 - end - - return nil -end - ---- Returns relative amount of fuel (from 0.0 to 1.0) the unit has in its internal tanks. If there are additional fuel tanks the value may be greater than 1.0. --- @param Unit#UNIT self --- @return #number The relative amount of fuel (from 0.0 to 1.0). --- @return #nil The DCS Unit is not existing or alive. -function UNIT:GetFuel() - self:F2( self.UnitName ) - - local DCSUnit = self:GetDCSUnit() - - if DCSUnit then - local UnitFuel = DCSUnit:getFuel() - return UnitFuel - end - - return nil -end - ---- Returns the Unit's ammunition. --- @param Unit#UNIT self --- @return DCSUnit#Unit.Ammo --- @return #nil The DCS Unit is not existing or alive. -function UNIT:GetAmmo() - self:F2( self.UnitName ) - - local DCSUnit = self:GetDCSUnit() - - if DCSUnit then - local UnitAmmo = DCSUnit:getAmmo() - return UnitAmmo - end - - return nil -end - ---- Returns the unit sensors. --- @param Unit#UNIT self --- @return DCSUnit#Unit.Sensors --- @return #nil The DCS Unit is not existing or alive. -function UNIT:GetSensors() - self:F2( self.UnitName ) - - local DCSUnit = self:GetDCSUnit() - - if DCSUnit then - local UnitSensors = DCSUnit:getSensors() - return UnitSensors - end - - return nil -end - --- Need to add here a function per sensortype --- unit:hasSensors(Unit.SensorType.RADAR, Unit.RadarType.AS) - ---- Returns two values: --- --- * First value indicates if at least one of the unit's radar(s) is on. --- * Second value is the object of the radar's interest. Not nil only if at least one radar of the unit is tracking a target. --- @param Unit#UNIT self --- @return #boolean Indicates if at least one of the unit's radar(s) is on. --- @return DCSObject#Object The object of the radar's interest. Not nil only if at least one radar of the unit is tracking a target. --- @return #nil The DCS Unit is not existing or alive. -function UNIT:GetRadar() - self:F2( self.UnitName ) - - local DCSUnit = self:GetDCSUnit() - - if DCSUnit then - local UnitRadarOn, UnitRadarObject = DCSUnit:getRadar() - return UnitRadarOn, UnitRadarObject - end - - return nil, nil -end - --- Need to add here functions to check if radar is on and which object etc. - ---- Returns unit descriptor. Descriptor type depends on unit category. --- @param Unit#UNIT self --- @return DCSUnit#Unit.Desc The Unit descriptor. --- @return #nil The DCS Unit is not existing or alive. -function UNIT:GetDesc() - self:F2( self.UnitName ) - - local DCSUnit = self:GetDCSUnit() - - if DCSUnit then - local UnitDesc = DCSUnit:getDesc() - return UnitDesc - end - - return nil -end - - ---- Returns the type name of the DCS Unit. --- @param Unit#UNIT self --- @return #string The type name of the DCS Unit. --- @return #nil The DCS Unit is not existing or alive. -function UNIT:GetTypeName() - self:F2( self.UnitName ) - - local DCSUnit = self:GetDCSUnit() - - if DCSUnit then - local UnitTypeName = DCSUnit:getTypeName() - self:T3( UnitTypeName ) - return UnitTypeName - end - - return nil -end - - - ---- Returns the prefix name of the DCS Unit. A prefix name is a part of the name before a '#'-sign. --- DCS Units spawned with the @{SPAWN} class contain a '#'-sign to indicate the end of the (base) DCS Unit name. --- The spawn sequence number and unit number are contained within the name after the '#' sign. --- @param Unit#UNIT self --- @return #string The name of the DCS Unit. --- @return #nil The DCS Unit is not existing or alive. -function UNIT:GetPrefix() - self:F2( self.UnitName ) - - local DCSUnit = self:GetDCSUnit() - - if DCSUnit then - local UnitPrefix = string.match( self.UnitName, ".*#" ):sub( 1, -2 ) - self:T3( UnitPrefix ) - return UnitPrefix - end - - return nil -end - - - ---- Returns the @{DCSTypes#Vec2} vector indicating the point in 2D of the DCS Unit within the mission. --- @param Unit#UNIT self --- @return DCSTypes#Vec2 The 2D point vector of the DCS Unit. --- @return #nil The DCS Unit is not existing or alive. -function UNIT:GetPointVec2() - self:F2( self.UnitName ) - - local DCSUnit = self:GetDCSUnit() - - if DCSUnit then - local UnitPointVec3 = DCSUnit:getPosition().p - - local UnitPointVec2 = {} - UnitPointVec2.x = UnitPointVec3.x - UnitPointVec2.y = UnitPointVec3.z - - self:T3( UnitPointVec2 ) - return UnitPointVec2 - end - - return nil -end - - ---- Returns the @{DCSTypes#Vec3} vector indicating the point in 3D of the DCS Unit within the mission. --- @param Unit#UNIT self --- @return DCSTypes#Vec3 The 3D point vector of the DCS Unit. --- @return #nil The DCS Unit is not existing or alive. -function UNIT:GetPointVec3() - self:F2( self.UnitName ) - - local DCSUnit = self:GetDCSUnit() - - if DCSUnit then - local UnitPointVec3 = DCSUnit:getPosition().p - self:T3( UnitPointVec3 ) - return UnitPointVec3 - end - - return nil -end - ---- Returns the @{DCSTypes#Position3} position vectors indicating the point and direction vectors in 3D of the DCS Unit within the mission. --- @param Unit#UNIT self --- @return DCSTypes#Position The 3D position vectors of the DCS Unit. --- @return #nil The DCS Unit is not existing or alive. -function UNIT:GetPositionVec3() - self:F2( self.UnitName ) - - local DCSUnit = self:GetDCSUnit() - - if DCSUnit then - local UnitPosition = DCSUnit:getPosition() - self:T3( UnitPosition ) - return UnitPosition - end - - return nil -end - ---- Returns the DCS Unit velocity vector. --- @param Unit#UNIT self --- @return DCSTypes#Vec3 The velocity vector --- @return #nil The DCS Unit is not existing or alive. -function UNIT:GetVelocity() - self:F2( self.UnitName ) - - local DCSUnit = self:GetDCSUnit() - - if DCSUnit then - local UnitVelocityVec3 = DCSUnit:getVelocity() - self:T3( UnitVelocityVec3 ) - return UnitVelocityVec3 - end - - return nil -end - ---- Returns true if the DCS Unit is in the air. --- @param Unit#UNIT self --- @return #boolean true if in the air. --- @return #nil The DCS Unit is not existing or alive. -function UNIT:InAir() - self:F2( self.UnitName ) - - local DCSUnit = self:GetDCSUnit() - - if DCSUnit then - local UnitInAir = DCSUnit:inAir() - self:T3( UnitInAir ) - return UnitInAir - end - - return nil -end - ---- Returns the altitude of the DCS Unit. --- @param Unit#UNIT self --- @return DCSTypes#Distance The altitude of the DCS Unit. --- @return #nil The DCS Unit is not existing or alive. -function UNIT:GetAltitude() - self:F2() - - local DCSUnit = self:GetDCSUnit() - - if DCSUnit then - local UnitPointVec3 = DCSUnit:getPoint() --DCSTypes#Vec3 - return UnitPointVec3.y - end - - return nil -end - ---- Returns true if there is an **other** DCS Unit within a radius of the current 2D point of the DCS Unit. --- @param Unit#UNIT self --- @param Unit#UNIT AwaitUnit The other UNIT wrapper object. --- @param Radius The radius in meters with the DCS Unit in the centre. --- @return true If the other DCS Unit is within the radius of the 2D point of the DCS Unit. --- @return #nil The DCS Unit is not existing or alive. -function UNIT:OtherUnitInRadius( AwaitUnit, Radius ) - self:F2( { self.UnitName, AwaitUnit.UnitName, Radius } ) - - local DCSUnit = self:GetDCSUnit() - - if DCSUnit then - local UnitPos = self:GetPointVec3() - local AwaitUnitPos = AwaitUnit:GetPointVec3() - - if (((UnitPos.x - AwaitUnitPos.x)^2 + (UnitPos.z - AwaitUnitPos.z)^2)^0.5 <= Radius) then - self:T3( "true" ) - return true - else - self:T3( "false" ) - return false - end - end - - return nil -end - ---- Returns the DCS Unit category name as defined within the DCS Unit Descriptor. --- @param Unit#UNIT self --- @return #string The DCS Unit Category Name -function UNIT:GetCategoryName() - local DCSUnit = self:GetDCSUnit() - - if DCSUnit then - local UnitCategoryName = self.CategoryName[ self:GetDesc().category ] - return UnitCategoryName - end - - return nil -end - ---- Signal a flare at the position of the UNIT. --- @param #UNIT self -function UNIT:Flare( FlareColor ) - self:F2() - trigger.action.signalFlare( self:GetPointVec3(), FlareColor , 0 ) -end - ---- Signal a white flare at the position of the UNIT. --- @param #UNIT self -function UNIT:FlareWhite() - self:F2() - trigger.action.signalFlare( self:GetPointVec3(), trigger.flareColor.White , 0 ) -end - ---- Signal a yellow flare at the position of the UNIT. --- @param #UNIT self -function UNIT:FlareYellow() - self:F2() - trigger.action.signalFlare( self:GetPointVec3(), trigger.flareColor.Yellow , 0 ) -end - ---- Signal a green flare at the position of the UNIT. --- @param #UNIT self -function UNIT:FlareGreen() - self:F2() - trigger.action.signalFlare( self:GetPointVec3(), trigger.flareColor.Green , 0 ) -end - ---- Signal a red flare at the position of the UNIT. --- @param #UNIT self -function UNIT:FlareRed() - self:F2() - trigger.action.signalFlare( self:GetPointVec3(), trigger.flareColor.Red, 0 ) -end - ---- Smoke the UNIT. --- @param #UNIT self -function UNIT:Smoke( SmokeColor ) - self:F2() - trigger.action.smoke( self:GetPointVec3(), SmokeColor ) -end - ---- Smoke the UNIT Green. --- @param #UNIT self -function UNIT:SmokeGreen() - self:F2() - trigger.action.smoke( self:GetPointVec3(), trigger.smokeColor.Green ) -end - ---- Smoke the UNIT Red. --- @param #UNIT self -function UNIT:SmokeRed() - self:F2() - trigger.action.smoke( self:GetPointVec3(), trigger.smokeColor.Red ) -end - ---- Smoke the UNIT White. --- @param #UNIT self -function UNIT:SmokeWhite() - self:F2() - trigger.action.smoke( self:GetPointVec3(), trigger.smokeColor.White ) -end - ---- Smoke the UNIT Orange. --- @param #UNIT self -function UNIT:SmokeOrange() - self:F2() - trigger.action.smoke( self:GetPointVec3(), trigger.smokeColor.Orange ) -end - ---- Smoke the UNIT Blue. --- @param #UNIT self -function UNIT:SmokeBlue() - self:F2() - trigger.action.smoke( self:GetPointVec3(), trigger.smokeColor.Blue ) -end - --- Is methods - ---- Returns if the unit is of an air category. --- If the unit is a helicopter or a plane, then this method will return true, otherwise false. --- @param #UNIT self --- @return #boolean Air category evaluation result. -function UNIT:IsAir() - self:F2() - - local UnitDescriptor = self.DCSUnit:getDesc() - self:T3( { UnitDescriptor.category, Unit.Category.AIRPLANE, Unit.Category.HELICOPTER } ) - - local IsAirResult = ( UnitDescriptor.category == Unit.Category.AIRPLANE ) or ( UnitDescriptor.category == Unit.Category.HELICOPTER ) - - self:T3( IsAirResult ) - return IsAirResult -end - ---- ZONE Classes --- ============= --- This module contains the ZONE classes, inherited from @{Zone#ZONE_BASE}. --- There are essentially two core functions that zones accomodate: --- --- * Test if an object is within the zone boundaries. --- * Provide the zone behaviour. Some zones are static, while others are moveable. --- --- The object classes are using the zone classes to test the zone boundaries, which can take various forms: --- --- * Test if completely within the zone. --- * Test if partly within the zone (for @{Group#GROUP} objects). --- * Test if not in the zone. --- * Distance to the nearest intersecting point of the zone. --- * Distance to the center of the zone. --- * ... --- --- Each of these ZONE classes have a zone name, and specific parameters defining the zone type: --- --- * @{Zone#ZONE_BASE}: The ZONE_BASE class defining the base for all other zone classes. --- * @{Zone#ZONE_RADIUS}: The ZONE_RADIUS class defined by a zone name, a location and a radius. --- * @{Zone#ZONE}: The ZONE class, defined by the zone name as defined within the Mission Editor. --- * @{Zone#ZONE_UNIT}: The ZONE_UNIT class defined by a zone around a @{Unit#UNIT} with a radius. --- * @{Zone#ZONE_POLYGON}: The ZONE_POLYGON class defined by a sequence of @{Group#GROUP} waypoints within the Mission Editor, forming a polygon. --- --- Polymorphic methods --- =================== --- Each zone implements two polymorphic functions defined in @{Zone#ZONE_BASE}: --- --- * @{#ZONE_BASE.IsPointVec2InZone}: Returns if a location is within the zone. --- * @{#ZONE_BASE.IsPointVec3InZone}: Returns if a point is within the zone. --- --- @module Zone --- @author FlightControl - - -Include.File( "Routines" ) -Include.File( "Base" ) -Include.File( "Message" ) - - - ---- The ZONE_BASE class --- @type ZONE_BASE --- @Extends Base#BASE -ZONE_BASE = { - ClassName = "ZONE_BASE", - } - -function ZONE_BASE:New( ZoneName ) - local self = BASE:Inherit( self, BASE:New() ) - self:F( ZoneName ) - - self.ZoneName = ZoneName - - return self -end - ---- Returns if a location is within the zone. --- @param #ZONE_RADIUS self --- @param DCSTypes#Vec2 PointVec2 The location to test. --- @return #boolean true if the location is within the zone. -function ZONE_BASE:IsPointVec2InZone( PointVec2 ) - self:F2( PointVec2 ) - - return false -end - ---- Returns if a point is within the zone. --- @param #ZONE_RADIUS self --- @param DCSTypes#Vec3 PointVec3 The point to test. --- @return #boolean true if the point is within the zone. -function ZONE_BASE:IsPointVec3InZone( PointVec3 ) - self:F2( PointVec3 ) - - local InZone = self:IsPointVec2InZone( { x = PointVec3.x, y = PointVec3.z } ) - - return InZone -end - - ---- The ZONE_RADIUS class, defined by a zone name, a location and a radius. --- @type ZONE_RADIUS --- @field DCSTypes#Vec2 PointVec2 The current location of the zone. --- @field DCSTypes#Distance Radius The radius of the zone. --- @Extends Zone#ZONE_BASE -ZONE_RADIUS = { - ClassName="ZONE_RADIUS", - } - ---- Constructor of ZONE_RADIUS, taking the zone name, the zone location and a radius. --- @param #ZONE_RADIUS self --- @param DCSTypes#Vec2 PointVec2 The location of the zone. --- @param DCSTypes#Distance Radius The radius of the zone. --- @return #ZONE_RADIUS -function ZONE_RADIUS:New( ZoneName, PointVec2, Radius ) - local self = BASE:Inherit( self, ZONE_BASE:New( ZoneName ) ) - self:F( { ZoneName, PointVec2, Radius } ) - - self.Radius = Radius - self.PointVec2 = PointVec2 - - return self -end - - ---- Returns the radius of the zone. --- @param #ZONE_RADIUS self --- @return DCSTypes#Distance The radius of the zone. -function ZONE_RADIUS:GetRadius() - self:F2( self.ZoneName ) - - self:T2( { self.Radius } ) - - return self.Radius -end - ---- Sets the radius of the zone. --- @param #ZONE_RADIUS self --- @param DCSTypes#Distance Radius The radius of the zone. --- @return DCSTypes#Distance The radius of the zone. -function ZONE_RADIUS:SetRadius( Radius ) - self:F2( self.ZoneName ) - - self.Radius = Radius - self:T2( { self.Radius } ) - - return self.Radius -end - ---- Returns the location of the zone. --- @param #ZONE_RADIUS self --- @return DCSTypes#Vec2 The location of the zone. -function ZONE_RADIUS:GetPointVec2() - self:F2( self.ZoneName ) - - self:T2( { self.PointVec2 } ) - - return self.PointVec2 -end - ---- Sets the location of the zone. --- @param #ZONE_RADIUS self --- @param DCSTypes#Vec2 PointVec2 The new location of the zone. --- @return DCSTypes#Vec2 The new location of the zone. -function ZONE_RADIUS:SetPointVec2( PointVec2 ) - self:F2( self.ZoneName ) - - self.PointVec2 = PointVec2 - - self:T2( { self.PointVec2 } ) - - return self.PointVec2 -end - ---- Returns the point of the zone. --- @param #ZONE_RADIUS self --- @param DCSTypes#Distance Height The height to add to the land height where the center of the zone is located. --- @return DCSTypes#Vec3 The point of the zone. -function ZONE_RADIUS:GetPointVec3( Height ) - self:F2( self.ZoneName ) - - local PointVec2 = self:GetPointVec2() - - local PointVec3 = { x = PointVec2.x, y = land.getHeight( self:GetPointVec2() ) + Height, z = PointVec2.y } - - self:T2( { PointVec3 } ) - - return PointVec3 -end - ---- Returns if a location is within the zone. --- @param #ZONE_RADIUS self --- @param DCSTypes#Vec2 PointVec2 The location to test. --- @return #boolean true if the location is within the zone. -function ZONE_RADIUS:IsPointVec2InZone( PointVec2 ) - self:F2( PointVec2 ) - - if (( PointVec2.x - self.PointVec2.x )^2 + ( PointVec2.y - self.PointVec2.y ) ^2 ) ^ 0.5 <= self.Radius then - return true - end - - return false -end - ---- Returns if a point is within the zone. --- @param #ZONE_RADIUS self --- @param DCSTypes#Vec3 PointVec3 The point to test. --- @return #boolean true if the point is within the zone. -function ZONE_RADIUS:IsPointVec3InZone( PointVec3 ) - self:F2( PointVec3 ) - - local InZone = self:IsPointVec3InZone( { x = PointVec3.x, y = PointVec3.z } ) - - return InZone -end - ---- Returns a random location within the zone. --- @param #ZONE_RADIUS self --- @return DCSTypes#Vec2 The random location within the zone. -function ZONE_RADIUS:GetRandomPointVec2() - self:F( self.ZoneName ) - - local Point = {} - - local angle = math.random() * math.pi*2; - Point.x = self.PointVec2.x + math.cos( angle ) * math.random() * self.Radius; - Point.y = self.PointVec2.y + math.sin( angle ) * math.random() * self.Radius; - - self:T( { Point } ) - - return Point -end - - - ---- The ZONE class, defined by the zone name as defined within the Mission Editor. The location and the radius are automatically collected from the mission settings. --- @type ZONE --- @Extends Zone#ZONE_RADIUS -ZONE = { - ClassName="ZONE", - } - - ---- Constructor of ZONE, taking the zone name. --- @param #ZONE self --- @param #string ZoneName The name of the zone as defined within the mission editor. --- @return #ZONE -function ZONE:New( ZoneName ) - - local Zone = trigger.misc.getZone( ZoneName ) - - if not Zone then - error( "Zone " .. ZoneName .. " does not exist." ) - return nil - end - - local self = BASE:Inherit( self, ZONE_RADIUS:New( ZoneName, { x = Zone.x, y = Zone.y }, Zone.radius ) ) - self:F( ZoneName ) - - self.Zone = Zone - - return self -end - - - ---- The ZONE_UNIT class defined by a zone around a @{Unit#UNIT} with a radius. --- @type ZONE_UNIT --- @field Unit#UNIT ZoneUNIT --- @Extends Zone#ZONE_RADIUS -ZONE_UNIT = { - ClassName="ZONE_UNIT", - } - ---- Constructor to create a ZONE_UNIT instance, taking the zone name, a zone unit and a radius. --- @param #ZONE_UNIT self --- @param #string ZoneName Name of the zone. --- @param Unit#UNIT ZoneUNIT The unit as the center of the zone. --- @param DCSTypes#Distance Radius The radius of the zone. --- @return #ZONE_UNIT self -function ZONE_UNIT:New( ZoneName, ZoneUNIT, Radius ) - local self = BASE:Inherit( self, ZONE_RADIUS:New( ZoneName, ZoneUNIT:GetPointVec2(), Radius ) ) - self:F( { ZoneName, ZoneUNIT:GetPointVec2(), Radius } ) - - self.ZoneUNIT = ZoneUNIT - - return self -end - - ---- Returns the current location of the @{Unit#UNIT}. --- @param #ZONE_UNIT self --- @return DCSTypes#Vec2 The location of the zone based on the @{Unit#UNIT}location. -function ZONE_UNIT:GetPointVec2() - self:F( self.ZoneName ) - - local ZonePointVec2 = self.ZoneUNIT:GetPointVec2() - - self:T( { ZonePointVec2 } ) - - return ZonePointVec2 -end - - ---- The ZONE_POLYGON class defined by a sequence of @{Group#GROUP} waypoints within the Mission Editor, forming a polygon. --- @type ZONE_POLYGON --- @Extends Zone#ZONE_BASE -ZONE_POLYGON = { - ClassName="ZONE_POLYGON", - } - ---- Constructor to create a ZONE_POLYGON instance, taking the zone name and the name of the @{Group#GROUP} defined within the Mission Editor. --- The @{Group#GROUP} waypoints define the polygon corners. The first and the last point are automatically connected by ZONE_POLYGON. --- @param #ZONE_POLYGON self --- @param #string ZoneName Name of the zone. --- @param Group#GROUP ZoneGroup The GROUP waypoints as defined within the Mission Editor define the polygon shape. --- @return #ZONE_POLYGON self -function ZONE_POLYGON:New( ZoneName, ZoneGroup ) - local self = BASE:Inherit( self, ZONE_BASE:New( ZoneName ) ) - self:F( { ZoneName, ZoneGroup } ) - - local GroupPoints = ZoneGroup:GetTaskRoute() - local i = 0 - - self.Polygon = {} - - for i = 1, #GroupPoints do - self.Polygon[i] = {} - self.Polygon[i].x = GroupPoints[i].x - self.Polygon[i].y = GroupPoints[i].y - end - - return self -end - - ---- Returns if a location is within the zone. --- @param #ZONE_POLYGON self --- @param DCSTypes#Vec2 PointVec2 The location to test. --- @return #boolean true if the location is within the zone. -function ZONE_POLYGON:IsPointVec2InZone( PointVec2 ) - self:F2( PointVec2 ) - - local i - local j - local c = false - - i = 1 - j = #self.Polygon - - while i < #self.Polygon do - j = i - i = i + 1 - self:T( { i, j, self.Polygon[i], self.Polygon[j] } ) - if ( ( ( self.Polygon[i].y > PointVec2.y ) ~= ( self.Polygon[j].y > PointVec2.y ) ) and - ( PointVec2.x < ( self.Polygon[j].x - self.Polygon[i].x ) * ( PointVec2.y - self.Polygon[i].y ) / ( self.Polygon[j].y - self.Polygon[i].y ) + self.Polygon[i].x ) - ) then - c = not c - end - self:T( { "c = ", c } ) - end - - return c -end - ---- The CLIENT models client units in multi player missions. --- --- @{#CLIENT} class --- ================ --- Clients are those **Units** defined within the Mission Editor that have the skillset defined as __Client__ or __Player__. --- Note that clients are NOT the same as Units, they are NOT necessarily alive. --- The @{CLIENT} class is a wrapper class to handle the DCS Unit objects that have the skillset defined as __Client__ or __Player__: --- --- * Wraps the DCS Unit objects with skill level set to Player or Client. --- * Support all DCS Unit APIs. --- * Enhance with Unit specific APIs not in the DCS Group API set. --- * When player joins Unit, execute alive init logic. --- * Handles messages to players. --- * Manage the "state" of the DCS Unit. --- --- Clients are being used by the @{MISSION} class to follow players and register their successes. --- --- CLIENT reference methods --- ======================= --- For each DCS Unit having skill level Player or Client, a CLIENT wrapper object (instance) will be created within the _@{DATABASE} object. --- This is done at the beginning of the mission (when the mission starts). --- --- The CLIENT class does not contain a :New() method, rather it provides :Find() methods to retrieve the object reference --- using the DCS Unit or the DCS UnitName. --- --- Another thing to know is that CLIENT objects do not "contain" the DCS Unit object. --- The CLIENT methods will reference the DCS Unit object by name when it is needed during API execution. --- If the DCS Unit object does not exist or is nil, the CLIENT methods will return nil and log an exception in the DCS.log file. --- --- The CLIENT class provides the following functions to retrieve quickly the relevant CLIENT instance: --- --- * @{#CLIENT.Find}(): Find a CLIENT instance from the _DATABASE object using a DCS Unit object. --- * @{#CLIENT.FindByName}(): Find a CLIENT instance from the _DATABASE object using a DCS Unit name. --- --- IMPORTANT: ONE SHOULD NEVER SANATIZE these CLIENT OBJECT REFERENCES! (make the CLIENT object references nil). --- --- @module Client --- @author FlightControl - -Include.File( "Routines" ) -Include.File( "Base" ) -Include.File( "Cargo" ) -Include.File( "Message" ) - - ---- The CLIENT class --- @type CLIENT --- @extends Unit#UNIT -CLIENT = { - ONBOARDSIDE = { - NONE = 0, - LEFT = 1, - RIGHT = 2, - BACK = 3, - FRONT = 4 - }, - ClassName = "CLIENT", - ClientName = nil, - ClientAlive = false, - ClientTransport = false, - ClientBriefingShown = false, - _Menus = {}, - _Tasks = {}, - Messages = { - } -} - - ---- Finds a CLIENT from the _DATABASE using the relevant DCS Unit. --- @param #CLIENT self --- @param #string ClientName Name of the DCS **Unit** as defined within the Mission Editor. --- @param #string ClientBriefing Text that describes the briefing of the mission when a Player logs into the Client. --- @return #CLIENT --- @usage --- -- Create new Clients. --- local Mission = MISSIONSCHEDULER.AddMission( 'Russia Transport Troops SA-6', 'Operational', 'Transport troops from the control center to one of the SA-6 SAM sites to activate their operation.', 'Russia' ) --- Mission:AddGoal( DeploySA6TroopsGoal ) --- --- Mission:AddClient( CLIENT:FindByName( 'RU MI-8MTV2*HOT-Deploy Troops 1' ):Transport() ) --- Mission:AddClient( CLIENT:FindByName( 'RU MI-8MTV2*RAMP-Deploy Troops 3' ):Transport() ) --- Mission:AddClient( CLIENT:FindByName( 'RU MI-8MTV2*HOT-Deploy Troops 2' ):Transport() ) --- Mission:AddClient( CLIENT:FindByName( 'RU MI-8MTV2*RAMP-Deploy Troops 4' ):Transport() ) -function CLIENT:Find( DCSUnit ) - local ClientName = DCSUnit:getName() - local ClientFound = _DATABASE:FindClient( ClientName ) - - if ClientFound then - ClientFound:F( ClientName ) - return ClientFound - end - - error( "CLIENT not found for: " .. ClientName ) -end - - ---- Finds a CLIENT from the _DATABASE using the relevant Client Unit Name. --- As an optional parameter, a briefing text can be given also. --- @param #CLIENT self --- @param #string ClientName Name of the DCS **Unit** as defined within the Mission Editor. --- @param #string ClientBriefing Text that describes the briefing of the mission when a Player logs into the Client. --- @return #CLIENT --- @usage --- -- Create new Clients. --- local Mission = MISSIONSCHEDULER.AddMission( 'Russia Transport Troops SA-6', 'Operational', 'Transport troops from the control center to one of the SA-6 SAM sites to activate their operation.', 'Russia' ) --- Mission:AddGoal( DeploySA6TroopsGoal ) --- --- Mission:AddClient( CLIENT:FindByName( 'RU MI-8MTV2*HOT-Deploy Troops 1' ):Transport() ) --- Mission:AddClient( CLIENT:FindByName( 'RU MI-8MTV2*RAMP-Deploy Troops 3' ):Transport() ) --- Mission:AddClient( CLIENT:FindByName( 'RU MI-8MTV2*HOT-Deploy Troops 2' ):Transport() ) --- Mission:AddClient( CLIENT:FindByName( 'RU MI-8MTV2*RAMP-Deploy Troops 4' ):Transport() ) -function CLIENT:FindByName( ClientName, ClientBriefing ) - local ClientFound = _DATABASE:FindClient( ClientName ) - - if ClientFound then - ClientFound:F( { ClientName, ClientBriefing } ) - ClientFound:AddBriefing( ClientBriefing ) - ClientFound.MessageSwitch = true - - return ClientFound - end - - error( "CLIENT not found for: " .. ClientName ) -end - -function CLIENT:Register( ClientName ) - local self = BASE:Inherit( self, UNIT:Register( ClientName ) ) - - self:F( ClientName ) - self.ClientName = ClientName - self.MessageSwitch = true - self.ClientAlive2 = false - - --self.AliveCheckScheduler = routines.scheduleFunction( self._AliveCheckScheduler, { self }, timer.getTime() + 1, 5 ) - self.AliveCheckScheduler = SCHEDULER:New( self, self._AliveCheckScheduler, {}, 1, 5 ) - - return self -end - - ---- Transport defines that the Client is a Transport. Transports show cargo. --- @param #CLIENT self --- @return #CLIENT -function CLIENT:Transport() - self:F() - - self.ClientTransport = true - return self -end - ---- AddBriefing adds a briefing to a CLIENT when a player joins a mission. --- @param #CLIENT self --- @param #string ClientBriefing is the text defining the Mission briefing. --- @return #CLIENT self -function CLIENT:AddBriefing( ClientBriefing ) - self:F( ClientBriefing ) - self.ClientBriefing = ClientBriefing - self.ClientBriefingShown = false - - return self -end - ---- Show the briefing of a CLIENT. --- @param #CLIENT self --- @return #CLIENT self -function CLIENT:ShowBriefing() - self:F( { self.ClientName, self.ClientBriefingShown } ) - - if not self.ClientBriefingShown then - self.ClientBriefingShown = true - local Briefing = "" - if self.ClientBriefing then - Briefing = Briefing .. self.ClientBriefing - end - Briefing = Briefing .. " Press [LEFT ALT]+[B] to view the complete mission briefing." - self:Message( Briefing, 60, self.ClientName .. '/ClientBriefing', "Briefing" ) - end - - return self -end - ---- Show the mission briefing of a MISSION to the CLIENT. --- @param #CLIENT self --- @param #string MissionBriefing --- @return #CLIENT self -function CLIENT:ShowMissionBriefing( MissionBriefing ) - self:F( { self.ClientName } ) - - if MissionBriefing then - self:Message( MissionBriefing, 60, self.ClientName .. '/MissionBriefing', "Mission Briefing" ) - end - - return self -end - - - ---- Resets a CLIENT. --- @param #CLIENT self --- @param #string ClientName Name of the Group as defined within the Mission Editor. The Group must have a Unit with the type Client. -function CLIENT:Reset( ClientName ) - self:F() - self._Menus = {} -end - --- Is Functions - ---- Checks if the CLIENT is a multi-seated UNIT. --- @param #CLIENT self --- @return #boolean true if multi-seated. -function CLIENT:IsMultiSeated() - self:F( self.ClientName ) - - local ClientMultiSeatedTypes = { - ["Mi-8MT"] = "Mi-8MT", - ["UH-1H"] = "UH-1H", - ["P-51B"] = "P-51B" - } - - if self:IsAlive() then - local ClientTypeName = self:GetClientGroupUnit():GetTypeName() - if ClientMultiSeatedTypes[ClientTypeName] then - return true - end - end - - return false -end - ---- Checks for a client alive event and calls a function on a continuous basis. --- @param #CLIENT self --- @param #function CallBack Function. --- @return #CLIENT -function CLIENT:Alive( CallBack, ... ) - self:F() - - self.ClientCallBack = CallBack - self.ClientParameters = arg - - return self -end - ---- @param #CLIENT self -function CLIENT:_AliveCheckScheduler() - self:F( { self.ClientName, self.ClientAlive2, self.ClientBriefingShown } ) - - if self:IsAlive() then -- Polymorphic call of UNIT - if self.ClientAlive2 == false then - self:ShowBriefing() - if self.ClientCallBack then - self:T("Calling Callback function") - self.ClientCallBack( self, unpack( self.ClientParameters ) ) - end - self.ClientAlive2 = true - end - else - if self.ClientAlive2 == true then - self.ClientAlive2 = false - end - end - - return true -end - ---- Return the DCSGroup of a Client. --- This function is modified to deal with a couple of bugs in DCS 1.5.3 --- @param #CLIENT self --- @return DCSGroup#Group -function CLIENT:GetDCSGroup() - self:F3() - --- local ClientData = Group.getByName( self.ClientName ) --- if ClientData and ClientData:isExist() then --- self:T( self.ClientName .. " : group found!" ) --- return ClientData --- else --- return nil --- end - - local ClientUnit = Unit.getByName( self.ClientName ) - - local CoalitionsData = { AlivePlayersRed = coalition.getPlayers( coalition.side.RED ), AlivePlayersBlue = coalition.getPlayers( coalition.side.BLUE ) } - for CoalitionId, CoalitionData in pairs( CoalitionsData ) do - self:T3( { "CoalitionData:", CoalitionData } ) - for UnitId, UnitData in pairs( CoalitionData ) do - self:T3( { "UnitData:", UnitData } ) - if UnitData and UnitData:isExist() then - - --self:E(self.ClientName) - if ClientUnit then - local ClientGroup = ClientUnit:getGroup() - if ClientGroup then - self:T3( "ClientGroup = " .. self.ClientName ) - if ClientGroup:isExist() and UnitData:getGroup():isExist() then - if ClientGroup:getID() == UnitData:getGroup():getID() then - self:T3( "Normal logic" ) - self:T3( self.ClientName .. " : group found!" ) - self.ClientGroupID = ClientGroup:getID() - self.ClientGroupName = ClientGroup:getName() - return ClientGroup - end - else - -- Now we need to resolve the bugs in DCS 1.5 ... - -- Consult the database for the units of the Client Group. (ClientGroup:getUnits() returns nil) - self:T3( "Bug 1.5 logic" ) - local ClientGroupTemplate = _DATABASE.Templates.Units[self.ClientName].GroupTemplate - self.ClientGroupID = ClientGroupTemplate.groupId - self.ClientGroupName = _DATABASE.Templates.Units[self.ClientName].GroupName - self:T3( self.ClientName .. " : group found in bug 1.5 resolvement logic!" ) - return ClientGroup - end - -- else - -- error( "Client " .. self.ClientName .. " not found!" ) - end - else - --self:E( { "Client not found!", self.ClientName } ) - end - end - end - end - - -- For non player clients - if ClientUnit then - local ClientGroup = ClientUnit:getGroup() - if ClientGroup then - self:T3( "ClientGroup = " .. self.ClientName ) - if ClientGroup:isExist() then - self:T3( "Normal logic" ) - self:T3( self.ClientName .. " : group found!" ) - return ClientGroup - end - end - end - - self.ClientGroupID = nil - self.ClientGroupUnit = nil - - return nil -end - - --- TODO: Check DCSTypes#Group.ID ---- Get the group ID of the client. --- @param #CLIENT self --- @return DCSTypes#Group.ID -function CLIENT:GetClientGroupID() - - local ClientGroup = self:GetDCSGroup() - - --self:E( self.ClientGroupID ) -- Determined in GetDCSGroup() - return self.ClientGroupID -end - - ---- Get the name of the group of the client. --- @param #CLIENT self --- @return #string -function CLIENT:GetClientGroupName() - - local ClientGroup = self:GetDCSGroup() - - self:T( self.ClientGroupName ) -- Determined in GetDCSGroup() - return self.ClientGroupName -end - ---- Returns the UNIT of the CLIENT. --- @param #CLIENT self --- @return Unit#UNIT -function CLIENT:GetClientGroupUnit() - self:F2() - - local ClientDCSUnit = Unit.getByName( self.ClientName ) - - self:T( self.ClientDCSUnit ) - if ClientDCSUnit and ClientDCSUnit:isExist() then - local ClientUnit = _DATABASE:FindUnit( self.ClientName ) - self:T2( ClientUnit ) - return ClientUnit - end -end - ---- Returns the DCSUnit of the CLIENT. --- @param #CLIENT self --- @return DCSTypes#Unit -function CLIENT:GetClientGroupDCSUnit() - self:F2() - - local ClientDCSUnit = Unit.getByName( self.ClientName ) - - if ClientDCSUnit and ClientDCSUnit:isExist() then - self:T2( ClientDCSUnit ) - return ClientDCSUnit - end -end - - ---- Evaluates if the CLIENT is a transport. --- @param #CLIENT self --- @return #boolean true is a transport. -function CLIENT:IsTransport() - self:F() - return self.ClientTransport -end - ---- Shows the @{Cargo#CARGO} contained within the CLIENT to the player as a message. --- The @{Cargo#CARGO} is shown using the @{Message#MESSAGE} distribution system. --- @param #CLIENT self -function CLIENT:ShowCargo() - self:F() - - local CargoMsg = "" - - for CargoName, Cargo in pairs( CARGOS ) do - if self == Cargo:IsLoadedInClient() then - CargoMsg = CargoMsg .. Cargo.CargoName .. " Type:" .. Cargo.CargoType .. " Weight: " .. Cargo.CargoWeight .. "\n" - end - end - - if CargoMsg == "" then - CargoMsg = "empty" - end - - self:Message( CargoMsg, 15, self.ClientName .. "/Cargo", "Co-Pilot: Cargo Status", 30 ) - -end - --- TODO (1) I urgently need to revise this. ---- A local function called by the DCS World Menu system to switch off messages. -function CLIENT.SwitchMessages( PrmTable ) - PrmTable[1].MessageSwitch = PrmTable[2] -end - ---- The main message driver for the CLIENT. --- This function displays various messages to the Player logged into the CLIENT through the DCS World Messaging system. --- @param #CLIENT self --- @param #string Message is the text describing the message. --- @param #number MessageDuration is the duration in seconds that the Message should be displayed. --- @param #string MessageId is a text identifying the Message in the MessageQueue. The Message system overwrites Messages with the same MessageId --- @param #string MessageCategory is the category of the message (the title). --- @param #number MessageInterval is the interval in seconds between the display of the @{Message#MESSAGE} when the CLIENT is in the air. -function CLIENT:Message( Message, MessageDuration, MessageId, MessageCategory, MessageInterval ) - self:F( { Message, MessageDuration, MessageId, MessageCategory, MessageInterval } ) - - if not self.MenuMessages then - if self:GetClientGroupID() then - self.MenuMessages = MENU_CLIENT:New( self, 'Messages' ) - self.MenuRouteMessageOn = MENU_CLIENT_COMMAND:New( self, 'Messages On', self.MenuMessages, CLIENT.SwitchMessages, { self, true } ) - self.MenuRouteMessageOff = MENU_CLIENT_COMMAND:New( self,'Messages Off', self.MenuMessages, CLIENT.SwitchMessages, { self, false } ) - end - end - - if self.MessageSwitch == true then - if MessageCategory == nil then - MessageCategory = "Messages" - end - if self.Messages[MessageId] == nil then - self.Messages[MessageId] = {} - self.Messages[MessageId].MessageId = MessageId - self.Messages[MessageId].MessageTime = timer.getTime() - self.Messages[MessageId].MessageDuration = MessageDuration - if MessageInterval == nil then - self.Messages[MessageId].MessageInterval = 600 - else - self.Messages[MessageId].MessageInterval = MessageInterval - end - MESSAGE:New( Message, MessageCategory, MessageDuration, MessageId ):ToClient( self ) - else - if self:GetClientGroupDCSUnit() and not self:GetClientGroupDCSUnit():inAir() then - if timer.getTime() - self.Messages[MessageId].MessageTime >= self.Messages[MessageId].MessageDuration + 10 then - MESSAGE:New( Message, MessageCategory, MessageDuration, MessageId ):ToClient( self ) - self.Messages[MessageId].MessageTime = timer.getTime() - end - else - if timer.getTime() - self.Messages[MessageId].MessageTime >= self.Messages[MessageId].MessageDuration + self.Messages[MessageId].MessageInterval then - MESSAGE:New( Message, MessageCategory, MessageDuration, MessageId ):ToClient( self ) - self.Messages[MessageId].MessageTime = timer.getTime() - end - end - end - end -end ---- Manage the mission database. --- --- @{#DATABASE} class --- ================== --- Mission designers can use the DATABASE class to refer to: --- --- * UNITS --- * GROUPS --- * players --- * alive players --- * CLIENTS --- * alive CLIENTS --- --- On top, for internal MOOSE administration purposes, the DATBASE administers the Unit and Gruop templates as defined within the Mission Editor. --- --- Moose will automatically create one instance of the DATABASE class into the **global** object _DATABASE. --- Moose refers to _DATABASE within the framework extensively, but you can also refer to the _DATABASE object within your missions if required. --- --- DATABASE iterators: --- =================== --- You can iterate the database with the available iterator methods. --- The iterator methods will walk the DATABASE set, and call for each element within the set a function that you provide. --- The following iterator methods are currently available within the DATABASE: --- --- * @{#DATABASE.ForEachUnit}: Calls a function for each @{UNIT} it finds within the DATABASE. --- * @{#DATABASE.ForEachGroup}: Calls a function for each @{GROUP} it finds within the DATABASE. --- * @{#DATABASE.ForEachPlayer}: Calls a function for each player it finds within the DATABASE. --- * @{#DATABASE.ForEachPlayerAlive}: Calls a function for each alive player it finds within the DATABASE. --- * @{#DATABASE.ForEachClient}: Calls a function for each @{CLIENT} it finds within the DATABASE. --- * @{#DATABASE.ForEachClientAlive}: Calls a function for each alive @{CLIENT} it finds within the DATABASE. --- --- @module Database --- @author FlightControl - -Include.File( "Routines" ) -Include.File( "Base" ) -Include.File( "Menu" ) -Include.File( "Group" ) -Include.File( "Unit" ) -Include.File( "Event" ) -Include.File( "Client" ) - - ---- DATABASE class --- @type DATABASE --- @extends Base#BASE -DATABASE = { - ClassName = "DATABASE", - Templates = { - Units = {}, - Groups = {}, - ClientsByName = {}, - ClientsByID = {}, - }, - DCSUnits = {}, - DCSGroups = {}, - UNITS = {}, - GROUPS = {}, - PLAYERS = {}, - PLAYERSALIVE = {}, - CLIENTS = {}, - CLIENTSALIVE = {}, - NavPoints = {}, -} - -local _DATABASECoalition = - { - [1] = "Red", - [2] = "Blue", - } - -local _DATABASECategory = - { - [Unit.Category.AIRPLANE] = "Plane", - [Unit.Category.HELICOPTER] = "Helicopter", - [Unit.Category.GROUND_UNIT] = "Vehicle", - [Unit.Category.SHIP] = "Ship", - [Unit.Category.STRUCTURE] = "Structure", - } - - ---- Creates a new DATABASE object, building a set of units belonging to a coalitions, categories, countries, types or with defined prefix names. --- @param #DATABASE self --- @return #DATABASE --- @usage --- -- Define a new DATABASE Object. This DBObject will contain a reference to all Group and Unit Templates defined within the ME and the DCSRTE. --- DBObject = DATABASE:New() -function DATABASE:New() - - -- Inherits from BASE - local self = BASE:Inherit( self, BASE:New() ) - - _EVENTDISPATCHER:OnBirth( self._EventOnBirth, self ) - _EVENTDISPATCHER:OnDead( self._EventOnDeadOrCrash, self ) - _EVENTDISPATCHER:OnCrash( self._EventOnDeadOrCrash, self ) - - - -- Follow alive players and clients - _EVENTDISPATCHER:OnPlayerEnterUnit( self._EventOnPlayerEnterUnit, self ) - _EVENTDISPATCHER:OnPlayerLeaveUnit( self._EventOnPlayerLeaveUnit, self ) - - self:_RegisterTemplates() - self:_RegisterDatabase() - self:_RegisterPlayers() - - return self -end - ---- Finds a Unit based on the Unit Name. --- @param #DATABASE self --- @param #string UnitName --- @return Unit#UNIT The found Unit. -function DATABASE:FindUnit( UnitName ) - - local UnitFound = self.UNITS[UnitName] - return UnitFound -end - - ---- Adds a Unit based on the Unit Name in the DATABASE. --- @param #DATABASE self -function DATABASE:AddUnit( DCSUnit, DCSUnitName ) - - self.DCSUnits[DCSUnitName] = DCSUnit - self.UNITS[DCSUnitName] = UNIT:Register( DCSUnitName ) -end - - ---- Deletes a Unit from the DATABASE based on the Unit Name. --- @param #DATABASE self -function DATABASE:DeleteUnit( DCSUnitName ) - - self.DCSUnits[DCSUnitName] = nil -end - - ---- Finds a CLIENT based on the ClientName. --- @param #DATABASE self --- @param #string ClientName --- @return Client#CLIENT The found CLIENT. -function DATABASE:FindClient( ClientName ) - - local ClientFound = self.CLIENTS[ClientName] - return ClientFound -end - - ---- Adds a CLIENT based on the ClientName in the DATABASE. --- @param #DATABASE self -function DATABASE:AddClient( ClientName ) - - self.CLIENTS[ClientName] = CLIENT:Register( ClientName ) - self:E( self.CLIENTS[ClientName]:GetClassNameAndID() ) -end - - ---- Finds a GROUP based on the GroupName. --- @param #DATABASE self --- @param #string GroupName --- @return Group#GROUP The found GROUP. -function DATABASE:FindGroup( GroupName ) - - local GroupFound = self.GROUPS[GroupName] - return GroupFound -end - - ---- Adds a GROUP based on the GroupName in the DATABASE. --- @param #DATABASE self -function DATABASE:AddGroup( DCSGroup, GroupName ) - - self.DCSGroups[GroupName] = DCSGroup - self.GROUPS[GroupName] = GROUP:Register( GroupName ) -end - ---- Adds a player based on the Player Name in the DATABASE. --- @param #DATABASE self -function DATABASE:AddPlayer( UnitName, PlayerName ) - - if PlayerName then - self:E( { "Add player for unit:", UnitName, PlayerName } ) - self.PLAYERS[PlayerName] = PlayerName - self.PLAYERSALIVE[PlayerName] = PlayerName - self.CLIENTSALIVE[PlayerName] = self:FindClient( UnitName ) - end -end - ---- Deletes a player from the DATABASE based on the Player Name. --- @param #DATABASE self -function DATABASE:DeletePlayer( PlayerName ) - - if PlayerName then - self:E( { "Clean player:", PlayerName } ) - self.PLAYERSALIVE[PlayerName] = nil - self.CLIENTSALIVE[PlayerName] = nil - end -end - - ---- Instantiate new Groups within the DCSRTE. --- This method expects EXACTLY the same structure as a structure within the ME, and needs 2 additional fields defined: --- SpawnCountryID, SpawnCategoryID --- This method is used by the SPAWN class. --- @param #DATABASE self --- @param #table SpawnTemplate --- @return #DATABASE self -function DATABASE:Spawn( SpawnTemplate ) - self:F2( SpawnTemplate.name ) - - self:T2( { SpawnTemplate.SpawnCountryID, SpawnTemplate.SpawnCategoryID } ) - - -- Copy the spawn variables of the template in temporary storage, nullify, and restore the spawn variables. - local SpawnCoalitionID = SpawnTemplate.SpawnCoalitionID - local SpawnCountryID = SpawnTemplate.SpawnCountryID - local SpawnCategoryID = SpawnTemplate.SpawnCategoryID - - -- Nullify - SpawnTemplate.SpawnCoalitionID = nil - SpawnTemplate.SpawnCountryID = nil - SpawnTemplate.SpawnCategoryID = nil - - self:_RegisterTemplate( SpawnTemplate ) - coalition.addGroup( SpawnCountryID, SpawnCategoryID, SpawnTemplate ) - - -- Restore - SpawnTemplate.SpawnCoalitionID = SpawnCoalitionID - SpawnTemplate.SpawnCountryID = SpawnCountryID - SpawnTemplate.SpawnCategoryID = SpawnCategoryID - - - local SpawnGroup = GROUP:Register( SpawnTemplate.name ) - return SpawnGroup -end - ---- Set a status to a Group within the Database, this to check crossing events for example. -function DATABASE:SetStatusGroup( GroupName, Status ) - self:F2( Status ) - - self.Templates.Groups[GroupName].Status = Status -end - ---- Get a status to a Group within the Database, this to check crossing events for example. -function DATABASE:GetStatusGroup( GroupName ) - self:F2( Status ) - - if self.Templates.Groups[GroupName] then - return self.Templates.Groups[GroupName].Status - else - return "" - end -end - - ---- Private method that registers new Group Templates within the DATABASE Object. --- @param #DATABASE self --- @param #table GroupTemplate --- @return #DATABASE self -function DATABASE:_RegisterTemplate( GroupTemplate ) - - local GroupTemplateName = env.getValueDictByKey(GroupTemplate.name) - - if not self.Templates.Groups[GroupTemplateName] then - self.Templates.Groups[GroupTemplateName] = {} - self.Templates.Groups[GroupTemplateName].Status = nil - end - - -- Delete the spans from the route, it is not needed and takes memory. - if GroupTemplate.route and GroupTemplate.route.spans then - GroupTemplate.route.spans = nil - end - - self.Templates.Groups[GroupTemplateName].GroupName = GroupTemplateName - self.Templates.Groups[GroupTemplateName].Template = GroupTemplate - self.Templates.Groups[GroupTemplateName].groupId = GroupTemplate.groupId - self.Templates.Groups[GroupTemplateName].UnitCount = #GroupTemplate.units - self.Templates.Groups[GroupTemplateName].Units = GroupTemplate.units - - self:T2( { "Group", self.Templates.Groups[GroupTemplateName].GroupName, self.Templates.Groups[GroupTemplateName].UnitCount } ) - - for unit_num, UnitTemplate in pairs( GroupTemplate.units ) do - - local UnitTemplateName = env.getValueDictByKey(UnitTemplate.name) - self.Templates.Units[UnitTemplateName] = {} - self.Templates.Units[UnitTemplateName].UnitName = UnitTemplateName - self.Templates.Units[UnitTemplateName].Template = UnitTemplate - self.Templates.Units[UnitTemplateName].GroupName = GroupTemplateName - self.Templates.Units[UnitTemplateName].GroupTemplate = GroupTemplate - self.Templates.Units[UnitTemplateName].GroupId = GroupTemplate.groupId - self:E( {"skill",UnitTemplate.skill}) - if UnitTemplate.skill and (UnitTemplate.skill == "Client" or UnitTemplate.skill == "Player") then - self.Templates.ClientsByName[UnitTemplateName] = UnitTemplate - self.Templates.ClientsByID[UnitTemplate.unitId] = UnitTemplate - end - self:E( { "Unit", self.Templates.Units[UnitTemplateName].UnitName } ) - end -end - - ---- Private method that registers all alive players in the mission. --- @param #DATABASE self --- @return #DATABASE self -function DATABASE:_RegisterPlayers() - - local CoalitionsData = { AlivePlayersRed = coalition.getPlayers( coalition.side.RED ), AlivePlayersBlue = coalition.getPlayers( coalition.side.BLUE ) } - for CoalitionId, CoalitionData in pairs( CoalitionsData ) do - for UnitId, UnitData in pairs( CoalitionData ) do - self:T3( { "UnitData:", UnitData } ) - if UnitData and UnitData:isExist() then - local UnitName = UnitData:getName() - local PlayerName = UnitData:getPlayerName() - if not self.PLAYERS[PlayerName] then - self:E( { "Add player for unit:", UnitName, PlayerName } ) - self:AddPlayer( UnitName, PlayerName ) - end - end - end - end - - return self -end - - ---- Private method that registers all datapoints within in the mission. --- @param #DATABASE self --- @return #DATABASE self -function DATABASE:_RegisterDatabase() - - local CoalitionsData = { GroupsRed = coalition.getGroups( coalition.side.RED ), GroupsBlue = coalition.getGroups( coalition.side.BLUE ) } - for CoalitionId, CoalitionData in pairs( CoalitionsData ) do - for DCSGroupId, DCSGroup in pairs( CoalitionData ) do - - if DCSGroup:isExist() then - local DCSGroupName = DCSGroup:getName() - - self:E( { "Register Group:", DCSGroup, DCSGroupName } ) - self:AddGroup( DCSGroup, DCSGroupName ) - - for DCSUnitId, DCSUnit in pairs( DCSGroup:getUnits() ) do - - local DCSUnitName = DCSUnit:getName() - self:E( { "Register Unit:", DCSUnit, DCSUnitName } ) - self:AddUnit( DCSUnit, DCSUnitName ) - end - else - self:E( { "Group does not exist: ", DCSGroup } ) - end - - end - end - - for ClientName, ClientTemplate in pairs( self.Templates.ClientsByName ) do - self:E( { "Adding Client:", ClientName } ) - self:AddClient( ClientName ) - end - - return self -end - ---- Events - ---- Handles the OnBirth event for the alive units set. --- @param #DATABASE self --- @param Event#EVENTDATA Event -function DATABASE:_EventOnBirth( Event ) - self:F2( { Event } ) - - if Event.IniDCSUnit then - self:AddUnit( Event.IniDCSUnit, Event.IniDCSUnitName ) - self:AddGroup( Event.IniDCSGroup, Event.IniDCSGroupName ) - self:_EventOnPlayerEnterUnit( Event ) - end -end - - ---- Handles the OnDead or OnCrash event for alive units set. --- @param #DATABASE self --- @param Event#EVENTDATA Event -function DATABASE:_EventOnDeadOrCrash( Event ) - self:F2( { Event } ) - - if Event.IniDCSUnit then - if self.DCSUnits[Event.IniDCSUnitName] then - self:DeleteUnit( Event.IniDCSUnitName ) - -- add logic to correctly remove a group once all units are destroyed... - end - end -end - - ---- Handles the OnPlayerEnterUnit event to fill the active players table (with the unit filter applied). --- @param #DATABASE self --- @param Event#EVENTDATA Event -function DATABASE:_EventOnPlayerEnterUnit( Event ) - self:F2( { Event } ) - - if Event.IniDCSUnit then - local PlayerName = Event.IniDCSUnit:getPlayerName() - if not self.PLAYERSALIVE[PlayerName] then - self:AddPlayer( Event.IniDCSUnitName, PlayerName ) - end - end -end - - ---- Handles the OnPlayerLeaveUnit event to clean the active players table. --- @param #DATABASE self --- @param Event#EVENTDATA Event -function DATABASE:_EventOnPlayerLeaveUnit( Event ) - self:F2( { Event } ) - - if Event.IniDCSUnit then - local PlayerName = Event.IniDCSUnit:getPlayerName() - if self.PLAYERSALIVE[PlayerName] then - self:DeletePlayer( PlayerName ) - end - end -end - ---- Iterators - ---- Iterate the DATABASE and call an iterator function for the given set, providing the Object for each element within the set and optional parameters. --- @param #DATABASE self --- @param #function IteratorFunction The function that will be called when there is an alive player in the database. --- @return #DATABASE self -function DATABASE:ForEach( IteratorFunction, arg, Set ) - self:F2( arg ) - - local function CoRoutine() - local Count = 0 - for ObjectID, Object in pairs( Set ) do - self:T2( Object ) - IteratorFunction( Object, unpack( arg ) ) - Count = Count + 1 - if Count % 10 == 0 then - coroutine.yield( false ) - end - end - return true - end - - local co = coroutine.create( CoRoutine ) - - local function Schedule() - - local status, res = coroutine.resume( co ) - self:T2( { status, res } ) - - if status == false then - error( res ) - end - if res == false then - return true -- resume next time the loop - end - - return false - end - - local Scheduler = SCHEDULER:New( self, Schedule, {}, 0.001, 0.001, 0 ) - - return self -end - - ---- Iterate the DATABASE and call an iterator function for each **alive** unit, providing the DCSUnit and optional parameters. --- @param #DATABASE self --- @param #function IteratorFunction The function that will be called when there is an alive unit in the database. The function needs to accept a DCSUnit parameter. --- @return #DATABASE self -function DATABASE:ForEachDCSUnit( IteratorFunction, ... ) - self:F2( arg ) - - self:ForEach( IteratorFunction, arg, self.DCSUnits ) - - return self -end - - ---- Iterate the DATABASE and call an iterator function for each **alive** UNIT, providing the UNIT and optional parameters. --- @param #DATABASE self --- @param #function IteratorFunction The function that will be called when there is an alive UNIT in the database. The function needs to accept a UNIT parameter. --- @return #DATABASE self -function DATABASE:ForEachUnit( IteratorFunction, ... ) - self:F2( arg ) - - self:ForEach( IteratorFunction, arg, self.UNITS ) - - return self -end - ---- Iterate the DATABASE and call an iterator function for each **alive** GROUP, providing the GROUP and optional parameters. --- @param #DATABASE self --- @param #function IteratorFunction The function that will be called when there is an alive GROUP in the database. The function needs to accept a GROUP parameter. --- @return #DATABASE self -function DATABASE:ForEachGroup( IteratorFunction, ... ) - self:F2( arg ) - - self:ForEach( IteratorFunction, arg, self.GROUPS ) - - return self -end - - ---- Iterate the DATABASE and call an iterator function for each player, providing the player name and optional parameters. --- @param #DATABASE self --- @param #function IteratorFunction The function that will be called when there is an player in the database. The function needs to accept the player name. --- @return #DATABASE self -function DATABASE:ForEachPlayer( IteratorFunction, ... ) - self:F2( arg ) - - self:ForEach( IteratorFunction, arg, self.PLAYERS ) - - return self -end - - ---- Iterate the DATABASE and call an iterator function for each **alive** player, providing the Unit of the player and optional parameters. --- @param #DATABASE self --- @param #function IteratorFunction The function that will be called when there is an alive player in the database. The function needs to accept a UNIT parameter. --- @return #DATABASE self -function DATABASE:ForEachPlayerAlive( IteratorFunction, ... ) - self:F2( arg ) - - self:ForEach( IteratorFunction, arg, self.PLAYERSALIVE ) - - return self -end - ---- Iterate the DATABASE and call an iterator function for each CLIENT, providing the CLIENT to the function and optional parameters. --- @param #DATABASE self --- @param #function IteratorFunction The function that will be called when there is an alive player in the database. The function needs to accept a CLIENT parameter. --- @return #DATABASE self -function DATABASE:ForEachClient( IteratorFunction, ... ) - self:F2( arg ) - - self:ForEach( IteratorFunction, arg, self.CLIENTS ) - - return self -end - ---- Iterate the DATABASE and call an iterator function for each **ALIVE** CLIENT, providing the CLIENT to the function and optional parameters. --- @param #DATABASE self --- @param #function IteratorFunction The function that will be called when there is an alive CLIENT in the database. The function needs to accept a CLIENT parameter. --- @return #DATABASE self -function DATABASE:ForEachClientAlive( IteratorFunction, ... ) - self:F2( arg ) - - self:ForEach( IteratorFunction, arg, self.CLIENTSALIVE ) - - return self -end - - -function DATABASE:_RegisterTemplates() - self:F2() - - self.Navpoints = {} - self.UNITS = {} - --Build routines.db.units and self.Navpoints - for coa_name, coa_data in pairs(env.mission.coalition) do - - if (coa_name == 'red' or coa_name == 'blue') and type(coa_data) == 'table' then - --self.Units[coa_name] = {} - - ---------------------------------------------- - -- build nav points DB - self.Navpoints[coa_name] = {} - if coa_data.nav_points then --navpoints - for nav_ind, nav_data in pairs(coa_data.nav_points) do - - if type(nav_data) == 'table' then - self.Navpoints[coa_name][nav_ind] = routines.utils.deepCopy(nav_data) - - self.Navpoints[coa_name][nav_ind]['name'] = nav_data.callsignStr -- name is a little bit more self-explanatory. - self.Navpoints[coa_name][nav_ind]['point'] = {} -- point is used by SSE, support it. - self.Navpoints[coa_name][nav_ind]['point']['x'] = nav_data.x - self.Navpoints[coa_name][nav_ind]['point']['y'] = 0 - self.Navpoints[coa_name][nav_ind]['point']['z'] = nav_data.y - end - end - end - ------------------------------------------------- - if coa_data.country then --there is a country table - for cntry_id, cntry_data in pairs(coa_data.country) do - - local countryName = string.lower(cntry_data.name) - --self.Units[coa_name][countryName] = {} - --self.Units[coa_name][countryName]["countryId"] = cntry_data.id - - if type(cntry_data) == 'table' then --just making sure - - for obj_type_name, obj_type_data in pairs(cntry_data) do - - if obj_type_name == "helicopter" or obj_type_name == "ship" or obj_type_name == "plane" or obj_type_name == "vehicle" or obj_type_name == "static" then --should be an unncessary check - - local category = obj_type_name - - if ((type(obj_type_data) == 'table') and obj_type_data.group and (type(obj_type_data.group) == 'table') and (#obj_type_data.group > 0)) then --there's a group! - - --self.Units[coa_name][countryName][category] = {} - - for group_num, GroupTemplate in pairs(obj_type_data.group) do - - if GroupTemplate and GroupTemplate.units and type(GroupTemplate.units) == 'table' then --making sure again- this is a valid group - self:_RegisterTemplate( GroupTemplate ) - end --if GroupTemplate and GroupTemplate.units then - end --for group_num, GroupTemplate in pairs(obj_type_data.group) do - end --if ((type(obj_type_data) == 'table') and obj_type_data.group and (type(obj_type_data.group) == 'table') and (#obj_type_data.group > 0)) then - end --if obj_type_name == "helicopter" or obj_type_name == "ship" or obj_type_name == "plane" or obj_type_name == "vehicle" or obj_type_name == "static" then - end --for obj_type_name, obj_type_data in pairs(cntry_data) do - end --if type(cntry_data) == 'table' then - end --for cntry_id, cntry_data in pairs(coa_data.country) do - end --if coa_data.country then --there is a country table - end --if coa_name == 'red' or coa_name == 'blue' and type(coa_data) == 'table' then - end --for coa_name, coa_data in pairs(mission.coalition) do - - return self -end - - - - ---- The main include file for the MOOSE system. - -Include.File( "Routines" ) -Include.File( "Base" ) -Include.File( "Database" ) -Include.File( "Event" ) - --- The order of the declarations is important here. Don't touch it. - ---- Declare the event dispatcher based on the EVENT class -_EVENTDISPATCHER = EVENT:New() -- #EVENT - ---- Declare the main database object, which is used internally by the MOOSE classes. -_DATABASE = DATABASE:New() -- Database#DATABASE - ---- Scoring system for MOOSE. --- This scoring class calculates the hits and kills that players make within a simulation session. --- Scoring is calculated using a defined algorithm. --- With a small change in MissionScripting.lua, the scoring can also be logged in a CSV file, that can then be uploaded --- to a database or a BI tool to publish the scoring results to the player community. --- @module Scoring --- @author FlightControl - - -Include.File( "Routines" ) -Include.File( "Base" ) -Include.File( "Menu" ) -Include.File( "Group" ) -Include.File( "Event" ) - - ---- The Scoring class --- @type SCORING --- @field Players A collection of the current players that have joined the game. --- @extends Base#BASE -SCORING = { - ClassName = "SCORING", - ClassID = 0, - Players = {}, -} - -local _SCORINGCoalition = - { - [1] = "Red", - [2] = "Blue", - } - -local _SCORINGCategory = - { - [Unit.Category.AIRPLANE] = "Plane", - [Unit.Category.HELICOPTER] = "Helicopter", - [Unit.Category.GROUND_UNIT] = "Vehicle", - [Unit.Category.SHIP] = "Ship", - [Unit.Category.STRUCTURE] = "Structure", - } - ---- Creates a new SCORING object to administer the scoring achieved by players. --- @param #SCORING self --- @param #string GameName The name of the game. This name is also logged in the CSV score file. --- @return #SCORING self --- @usage --- -- Define a new scoring object for the mission Gori Valley. --- ScoringObject = SCORING:New( "Gori Valley" ) -function SCORING:New( GameName ) - - -- Inherits from BASE - local self = BASE:Inherit( self, BASE:New() ) - - if GameName then - self.GameName = GameName - else - error( "A game name must be given to register the scoring results" ) - end - - - _EVENTDISPATCHER:OnDead( self._EventOnDeadOrCrash, self ) - _EVENTDISPATCHER:OnCrash( self._EventOnDeadOrCrash, self ) - _EVENTDISPATCHER:OnHit( self._EventOnHit, self ) - - --self.SchedulerId = routines.scheduleFunction( SCORING._FollowPlayersScheduled, { self }, 0, 5 ) - self.SchedulerId = SCHEDULER:New( self, self._FollowPlayersScheduled, {}, 0, 5 ) - - self:ScoreMenu() - - return self - -end - ---- Creates a score radio menu. Can be accessed using Radio -> F10. --- @param #SCORING self --- @return #SCORING self -function SCORING:ScoreMenu() - self.Menu = SUBMENU:New( 'Scoring' ) - self.AllScoresMenu = COMMANDMENU:New( 'Score All Active Players', self.Menu, SCORING.ReportScoreAll, self ) - --- = COMMANDMENU:New('Your Current Score', ReportScore, SCORING.ReportScorePlayer, self ) - return self -end - ---- Follows new players entering Clients within the DCSRTE. --- TODO: Need to see if i can catch this also with an event. It will eliminate the schedule ... -function SCORING:_FollowPlayersScheduled() - self:F3( "_FollowPlayersScheduled" ) - - local ClientUnit = 0 - local CoalitionsData = { AlivePlayersRed = coalition.getPlayers(coalition.side.RED), AlivePlayersBlue = coalition.getPlayers(coalition.side.BLUE) } - local unitId - local unitData - local AlivePlayerUnits = {} - - for CoalitionId, CoalitionData in pairs( CoalitionsData ) do - self:T3( { "_FollowPlayersScheduled", CoalitionData } ) - for UnitId, UnitData in pairs( CoalitionData ) do - self:_AddPlayerFromUnit( UnitData ) - end - end - - return true -end - - ---- Track DEAD or CRASH events for the scoring. --- @param #SCORING self --- @param Event#EVENTDATA Event -function SCORING:_EventOnDeadOrCrash( Event ) - self:F( { Event } ) - - local TargetUnit = nil - local TargetGroup = nil - local TargetUnitName = "" - local TargetGroupName = "" - local TargetPlayerName = "" - local TargetCoalition = nil - local TargetCategory = nil - local TargetType = nil - local TargetUnitCoalition = nil - local TargetUnitCategory = nil - local TargetUnitType = nil - - if Event.IniDCSUnit then - - TargetUnit = Event.IniDCSUnit - TargetUnitName = Event.IniDCSUnitName - TargetGroup = Event.IniDCSGroup - TargetGroupName = Event.IniDCSGroupName - TargetPlayerName = TargetUnit:getPlayerName() - - TargetCoalition = TargetUnit:getCoalition() - --TargetCategory = TargetUnit:getCategory() - TargetCategory = TargetUnit:getDesc().category -- Workaround - TargetType = TargetUnit:getTypeName() - - TargetUnitCoalition = _SCORINGCoalition[TargetCoalition] - TargetUnitCategory = _SCORINGCategory[TargetCategory] - TargetUnitType = TargetType - - self:T( { TargetUnitName, TargetGroupName, TargetPlayerName, TargetCoalition, TargetCategory, TargetType } ) - end - - for PlayerName, PlayerData in pairs( self.Players ) do - if PlayerData then -- This should normally not happen, but i'll test it anyway. - self:T( "Something got killed" ) - - -- Some variables - local InitUnitName = PlayerData.UnitName - local InitUnitType = PlayerData.UnitType - local InitCoalition = PlayerData.UnitCoalition - local InitCategory = PlayerData.UnitCategory - local InitUnitCoalition = _SCORINGCoalition[InitCoalition] - local InitUnitCategory = _SCORINGCategory[InitCategory] - - self:T( { InitUnitName, InitUnitType, InitUnitCoalition, InitCoalition, InitUnitCategory, InitCategory } ) - - -- What is he hitting? - if TargetCategory then - if PlayerData and PlayerData.Hit and PlayerData.Hit[TargetCategory] and PlayerData.Hit[TargetCategory][TargetUnitName] then -- Was there a hit for this unit for this player before registered??? - if not PlayerData.Kill[TargetCategory] then - PlayerData.Kill[TargetCategory] = {} - end - if not PlayerData.Kill[TargetCategory][TargetType] then - PlayerData.Kill[TargetCategory][TargetType] = {} - PlayerData.Kill[TargetCategory][TargetType].Score = 0 - PlayerData.Kill[TargetCategory][TargetType].ScoreKill = 0 - PlayerData.Kill[TargetCategory][TargetType].Penalty = 0 - PlayerData.Kill[TargetCategory][TargetType].PenaltyKill = 0 - end - - if InitCoalition == TargetCoalition then - PlayerData.Penalty = PlayerData.Penalty + 25 - PlayerData.Kill[TargetCategory][TargetType].Penalty = PlayerData.Kill[TargetCategory][TargetType].Penalty + 25 - PlayerData.Kill[TargetCategory][TargetType].PenaltyKill = PlayerData.Kill[TargetCategory][TargetType].PenaltyKill + 1 - MESSAGE:New( "Player '" .. PlayerName .. "' killed a friendly " .. TargetUnitCategory .. " ( " .. TargetType .. " ) " .. - PlayerData.Kill[TargetCategory][TargetType].PenaltyKill .. " times. Penalty: -" .. PlayerData.Kill[TargetCategory][TargetType].Penalty .. - ". Score Total:" .. PlayerData.Score - PlayerData.Penalty, - "", 5, "/PENALTY" .. PlayerName .. "/" .. InitUnitName ):ToAll() - self:ScoreCSV( PlayerName, "KILL_PENALTY", 1, -125, InitUnitName, InitUnitCoalition, InitUnitCategory, InitUnitType, TargetUnitName, TargetUnitCoalition, TargetUnitCategory, TargetUnitType ) - else - PlayerData.Score = PlayerData.Score + 10 - PlayerData.Kill[TargetCategory][TargetType].Score = PlayerData.Kill[TargetCategory][TargetType].Score + 10 - PlayerData.Kill[TargetCategory][TargetType].ScoreKill = PlayerData.Kill[TargetCategory][TargetType].ScoreKill + 1 - MESSAGE:New( "Player '" .. PlayerName .. "' killed an enemy " .. TargetUnitCategory .. " ( " .. TargetType .. " ) " .. - PlayerData.Kill[TargetCategory][TargetType].ScoreKill .. " times. Score: " .. PlayerData.Kill[TargetCategory][TargetType].Score .. - ". Score Total:" .. PlayerData.Score - PlayerData.Penalty, - "", 5, "/SCORE" .. PlayerName .. "/" .. InitUnitName ):ToAll() - self:ScoreCSV( PlayerName, "KILL_SCORE", 1, 10, InitUnitName, InitUnitCoalition, InitUnitCategory, InitUnitType, TargetUnitName, TargetUnitCoalition, TargetUnitCategory, TargetUnitType ) - end - end - end - end - end -end - - - ---- Add a new player entering a Unit. -function SCORING:_AddPlayerFromUnit( UnitData ) - self:F( UnitData ) - - if UnitData and UnitData:isExist() then - local UnitName = UnitData:getName() - local PlayerName = UnitData:getPlayerName() - local UnitDesc = UnitData:getDesc() - local UnitCategory = UnitDesc.category - local UnitCoalition = UnitData:getCoalition() - local UnitTypeName = UnitData:getTypeName() - - self:T( { PlayerName, UnitName, UnitCategory, UnitCoalition, UnitTypeName } ) - - if self.Players[PlayerName] == nil then -- I believe this is the place where a Player gets a life in a mission when he enters a unit ... - self.Players[PlayerName] = {} - self.Players[PlayerName].Hit = {} - self.Players[PlayerName].Kill = {} - self.Players[PlayerName].Mission = {} - - -- for CategoryID, CategoryName in pairs( SCORINGCategory ) do - -- self.Players[PlayerName].Hit[CategoryID] = {} - -- self.Players[PlayerName].Kill[CategoryID] = {} - -- end - self.Players[PlayerName].HitPlayers = {} - self.Players[PlayerName].HitUnits = {} - self.Players[PlayerName].Score = 0 - self.Players[PlayerName].Penalty = 0 - self.Players[PlayerName].PenaltyCoalition = 0 - self.Players[PlayerName].PenaltyWarning = 0 - end - - if not self.Players[PlayerName].UnitCoalition then - self.Players[PlayerName].UnitCoalition = UnitCoalition - else - if self.Players[PlayerName].UnitCoalition ~= UnitCoalition then - self.Players[PlayerName].Penalty = self.Players[PlayerName].Penalty + 50 - self.Players[PlayerName].PenaltyCoalition = self.Players[PlayerName].PenaltyCoalition + 1 - MESSAGE:New( "Player '" .. PlayerName .. "' changed coalition from " .. _SCORINGCoalition[self.Players[PlayerName].UnitCoalition] .. " to " .. _SCORINGCoalition[UnitCoalition] .. - "(changed " .. self.Players[PlayerName].PenaltyCoalition .. " times the coalition). 50 Penalty points added.", - "", - 2, - "/PENALTYCOALITION" .. PlayerName - ):ToAll() - self:ScoreCSV( PlayerName, "COALITION_PENALTY", 1, -50, self.Players[PlayerName].UnitName, _SCORINGCoalition[self.Players[PlayerName].UnitCoalition], _SCORINGCategory[self.Players[PlayerName].UnitCategory], self.Players[PlayerName].UnitType, - UnitName, _SCORINGCoalition[UnitCoalition], _SCORINGCategory[UnitCategory], UnitData:getTypeName() ) - end - end - self.Players[PlayerName].UnitName = UnitName - self.Players[PlayerName].UnitCoalition = UnitCoalition - self.Players[PlayerName].UnitCategory = UnitCategory - self.Players[PlayerName].UnitType = UnitTypeName - - if self.Players[PlayerName].Penalty > 100 then - if self.Players[PlayerName].PenaltyWarning < 1 then - MESSAGE:New( "Player '" .. PlayerName .. "': WARNING! If you continue to commit FRATRICIDE and have a PENALTY score higher than 150, you will be COURT MARTIALED and DISMISSED from this mission! \nYour total penalty is: " .. self.Players[PlayerName].Penalty, - "", - 30, - "/PENALTYCOALITION" .. PlayerName - ):ToAll() - self.Players[PlayerName].PenaltyWarning = self.Players[PlayerName].PenaltyWarning + 1 - end - end - - if self.Players[PlayerName].Penalty > 150 then - ClientGroup = GROUP:NewFromDCSUnit( UnitData ) - ClientGroup:Destroy() - MESSAGE:New( "Player '" .. PlayerName .. "' committed FRATRICIDE, he will be COURT MARTIALED and is DISMISSED from this mission!", - "", - 10, - "/PENALTYCOALITION" .. PlayerName - ):ToAll() - end - - end -end - - ---- Registers Scores the players completing a Mission Task. -function SCORING:_AddMissionTaskScore( PlayerUnit, MissionName, Score ) - self:F( { PlayerUnit, MissionName, Score } ) - - local PlayerName = PlayerUnit:getPlayerName() - - if not self.Players[PlayerName].Mission[MissionName] then - self.Players[PlayerName].Mission[MissionName] = {} - self.Players[PlayerName].Mission[MissionName].ScoreTask = 0 - self.Players[PlayerName].Mission[MissionName].ScoreMission = 0 - end - - self:T( PlayerName ) - self:T( self.Players[PlayerName].Mission[MissionName] ) - - self.Players[PlayerName].Score = self.Players[PlayerName].Score + Score - self.Players[PlayerName].Mission[MissionName].ScoreTask = self.Players[PlayerName].Mission[MissionName].ScoreTask + Score - - MESSAGE:New( "Player '" .. PlayerName .. "' has finished another Task in Mission '" .. MissionName .. "'. " .. - Score .. " Score points added.", - "", 20, "/SCORETASK" .. PlayerName ):ToAll() - - self:ScoreCSV( PlayerName, "TASK_" .. MissionName:gsub( ' ', '_' ), 1, Score, PlayerUnit:getName() ) -end - - ---- Registers Mission Scores for possible multiple players that contributed in the Mission. -function SCORING:_AddMissionScore( MissionName, Score ) - self:F( { MissionName, Score } ) - - for PlayerName, PlayerData in pairs( self.Players ) do - - if PlayerData.Mission[MissionName] then - PlayerData.Score = PlayerData.Score + Score - PlayerData.Mission[MissionName].ScoreMission = PlayerData.Mission[MissionName].ScoreMission + Score - MESSAGE:New( "Player '" .. PlayerName .. "' has finished Mission '" .. MissionName .. "'. " .. - Score .. " Score points added.", - "", 20, "/SCOREMISSION" .. PlayerName ):ToAll() - self:ScoreCSV( PlayerName, "MISSION_" .. MissionName:gsub( ' ', '_' ), 1, Score ) - end - end -end - ---- Handles the OnHit event for the scoring. --- @param #SCORING self --- @param Event#EVENTDATA Event -function SCORING:_EventOnHit( Event ) - self:F( { Event } ) - - local InitUnit = nil - local InitUnitName = "" - local InitGroup = nil - local InitGroupName = "" - local InitPlayerName = nil - - local InitCoalition = nil - local InitCategory = nil - local InitType = nil - local InitUnitCoalition = nil - local InitUnitCategory = nil - local InitUnitType = nil - - local TargetUnit = nil - local TargetUnitName = "" - local TargetGroup = nil - local TargetGroupName = "" - local TargetPlayerName = "" - - local TargetCoalition = nil - local TargetCategory = nil - local TargetType = nil - local TargetUnitCoalition = nil - local TargetUnitCategory = nil - local TargetUnitType = nil - - if Event.IniDCSUnit then - - InitUnit = Event.IniDCSUnit - InitUnitName = Event.IniDCSUnitName - InitGroup = Event.IniDCSGroup - InitGroupName = Event.IniDCSGroupName - InitPlayerName = InitUnit:getPlayerName() - - InitCoalition = InitUnit:getCoalition() - --TODO: Workaround Client DCS Bug - --InitCategory = InitUnit:getCategory() - InitCategory = InitUnit:getDesc().category - InitType = InitUnit:getTypeName() - - InitUnitCoalition = _SCORINGCoalition[InitCoalition] - InitUnitCategory = _SCORINGCategory[InitCategory] - InitUnitType = InitType - - self:T( { InitUnitName, InitGroupName, InitPlayerName, InitCoalition, InitCategory, InitType , InitUnitCoalition, InitUnitCategory, InitUnitType } ) - end - - - if Event.TgtDCSUnit then - - TargetUnit = Event.TgtDCSUnit - TargetUnitName = Event.TgtDCSUnitName - TargetGroup = Event.TgtDCSGroup - TargetGroupName = Event.TgtDCSGroupName - TargetPlayerName = TargetUnit:getPlayerName() - - TargetCoalition = TargetUnit:getCoalition() - --TODO: Workaround Client DCS Bug - --TargetCategory = TargetUnit:getCategory() - TargetCategory = TargetUnit:getDesc().category - TargetType = TargetUnit:getTypeName() - - TargetUnitCoalition = _SCORINGCoalition[TargetCoalition] - TargetUnitCategory = _SCORINGCategory[TargetCategory] - TargetUnitType = TargetType - - self:T( { TargetUnitName, TargetGroupName, TargetPlayerName, TargetCoalition, TargetCategory, TargetType, TargetUnitCoalition, TargetUnitCategory, TargetUnitType } ) - end - - if InitPlayerName ~= nil then -- It is a player that is hitting something - self:_AddPlayerFromUnit( InitUnit ) - if self.Players[InitPlayerName] then -- This should normally not happen, but i'll test it anyway. - if TargetPlayerName ~= nil then -- It is a player hitting another player ... - self:_AddPlayerFromUnit( TargetUnit ) - self.Players[InitPlayerName].HitPlayers = self.Players[InitPlayerName].HitPlayers + 1 - end - - self:T( "Hitting Something" ) - -- What is he hitting? - if TargetCategory then - if not self.Players[InitPlayerName].Hit[TargetCategory] then - self.Players[InitPlayerName].Hit[TargetCategory] = {} - end - if not self.Players[InitPlayerName].Hit[TargetCategory][TargetUnitName] then - self.Players[InitPlayerName].Hit[TargetCategory][TargetUnitName] = {} - self.Players[InitPlayerName].Hit[TargetCategory][TargetUnitName].Score = 0 - self.Players[InitPlayerName].Hit[TargetCategory][TargetUnitName].Penalty = 0 - self.Players[InitPlayerName].Hit[TargetCategory][TargetUnitName].ScoreHit = 0 - self.Players[InitPlayerName].Hit[TargetCategory][TargetUnitName].PenaltyHit = 0 - end - local Score = 0 - if InitCoalition == TargetCoalition then - self.Players[InitPlayerName].Penalty = self.Players[InitPlayerName].Penalty + 10 - self.Players[InitPlayerName].Hit[TargetCategory][TargetUnitName].Penalty = self.Players[InitPlayerName].Hit[TargetCategory][TargetUnitName].Penalty + 10 - self.Players[InitPlayerName].Hit[TargetCategory][TargetUnitName].PenaltyHit = self.Players[InitPlayerName].Hit[TargetCategory][TargetUnitName].PenaltyHit + 1 - MESSAGE:New( "Player '" .. InitPlayerName .. "' hit a friendly " .. TargetUnitCategory .. " ( " .. TargetType .. " ) " .. - self.Players[InitPlayerName].Hit[TargetCategory][TargetUnitName].PenaltyHit .. " times. Penalty: -" .. self.Players[InitPlayerName].Hit[TargetCategory][TargetUnitName].Penalty .. - ". Score Total:" .. self.Players[InitPlayerName].Score - self.Players[InitPlayerName].Penalty, - "", - 2, - "/PENALTY" .. InitPlayerName .. "/" .. InitUnitName - ):ToAll() - self:ScoreCSV( InitPlayerName, "HIT_PENALTY", 1, -25, InitUnitName, InitUnitCoalition, InitUnitCategory, InitUnitType, TargetUnitName, TargetUnitCoalition, TargetUnitCategory, TargetUnitType ) - else - self.Players[InitPlayerName].Score = self.Players[InitPlayerName].Score + 10 - self.Players[InitPlayerName].Hit[TargetCategory][TargetUnitName].Score = self.Players[InitPlayerName].Hit[TargetCategory][TargetUnitName].Score + 1 - self.Players[InitPlayerName].Hit[TargetCategory][TargetUnitName].ScoreHit = self.Players[InitPlayerName].Hit[TargetCategory][TargetUnitName].ScoreHit + 1 - MESSAGE:New( "Player '" .. InitPlayerName .. "' hit a target " .. TargetUnitCategory .. " ( " .. TargetType .. " ) " .. - self.Players[InitPlayerName].Hit[TargetCategory][TargetUnitName].ScoreHit .. " times. Score: " .. self.Players[InitPlayerName].Hit[TargetCategory][TargetUnitName].Score .. - ". Score Total:" .. self.Players[InitPlayerName].Score - self.Players[InitPlayerName].Penalty, - "", - 2, - "/SCORE" .. InitPlayerName .. "/" .. InitUnitName - ):ToAll() - self:ScoreCSV( InitPlayerName, "HIT_SCORE", 1, 1, InitUnitName, InitUnitCoalition, InitUnitCategory, InitUnitType, TargetUnitName, TargetUnitCoalition, TargetUnitCategory, TargetUnitType ) - end - end - end - elseif InitPlayerName == nil then -- It is an AI hitting a player??? - - end -end - - -function SCORING:ReportScoreAll() - - env.info( "Hello World " ) - - local ScoreMessage = "" - local PlayerMessage = "" - - self:T( "Score Report" ) - - for PlayerName, PlayerData in pairs( self.Players ) do - if PlayerData then -- This should normally not happen, but i'll test it anyway. - self:T( "Score Player: " .. PlayerName ) - - -- Some variables - local InitUnitCoalition = _SCORINGCoalition[PlayerData.UnitCoalition] - local InitUnitCategory = _SCORINGCategory[PlayerData.UnitCategory] - local InitUnitType = PlayerData.UnitType - local InitUnitName = PlayerData.UnitName - - local PlayerScore = 0 - local PlayerPenalty = 0 - - ScoreMessage = ":\n" - - local ScoreMessageHits = "" - - for CategoryID, CategoryName in pairs( _SCORINGCategory ) do - self:T( CategoryName ) - if PlayerData.Hit[CategoryID] then - local Score = 0 - local ScoreHit = 0 - local Penalty = 0 - local PenaltyHit = 0 - self:T( "Hit scores exist for player " .. PlayerName ) - for UnitName, UnitData in pairs( PlayerData.Hit[CategoryID] ) do - Score = Score + UnitData.Score - ScoreHit = ScoreHit + UnitData.ScoreHit - Penalty = Penalty + UnitData.Penalty - PenaltyHit = UnitData.PenaltyHit - end - local ScoreMessageHit = string.format( "%s:%d ", CategoryName, Score - Penalty ) - self:T( ScoreMessageHit ) - ScoreMessageHits = ScoreMessageHits .. ScoreMessageHit - PlayerScore = PlayerScore + Score - PlayerPenalty = PlayerPenalty + Penalty - else - --ScoreMessageHits = ScoreMessageHits .. string.format( "%s:%d ", string.format(CategoryName, 1, 1), 0 ) - end - end - if ScoreMessageHits ~= "" then - ScoreMessage = ScoreMessage .. " Hits: " .. ScoreMessageHits .. "\n" - end - - local ScoreMessageKills = "" - for CategoryID, CategoryName in pairs( _SCORINGCategory ) do - self:T( "Kill scores exist for player " .. PlayerName ) - if PlayerData.Kill[CategoryID] then - local Score = 0 - local ScoreKill = 0 - local Penalty = 0 - local PenaltyKill = 0 - - for UnitName, UnitData in pairs( PlayerData.Kill[CategoryID] ) do - Score = Score + UnitData.Score - ScoreKill = ScoreKill + UnitData.ScoreKill - Penalty = Penalty + UnitData.Penalty - PenaltyKill = PenaltyKill + UnitData.PenaltyKill - end - - local ScoreMessageKill = string.format( " %s:%d ", CategoryName, Score - Penalty ) - self:T( ScoreMessageKill ) - ScoreMessageKills = ScoreMessageKills .. ScoreMessageKill - - PlayerScore = PlayerScore + Score - PlayerPenalty = PlayerPenalty + Penalty - else - --ScoreMessageKills = ScoreMessageKills .. string.format( "%s:%d ", string.format(CategoryName, 1, 1), 0 ) - end - end - if ScoreMessageKills ~= "" then - ScoreMessage = ScoreMessage .. " Kills: " .. ScoreMessageKills .. "\n" - end - - local ScoreMessageCoalitionChangePenalties = "" - if PlayerData.PenaltyCoalition ~= 0 then - ScoreMessageCoalitionChangePenalties = ScoreMessageCoalitionChangePenalties .. string.format( " -%d (%d changed)", PlayerData.Penalty, PlayerData.PenaltyCoalition ) - PlayerPenalty = PlayerPenalty + PlayerData.Penalty - end - if ScoreMessageCoalitionChangePenalties ~= "" then - ScoreMessage = ScoreMessage .. " Coalition Penalties: " .. ScoreMessageCoalitionChangePenalties .. "\n" - end - - local ScoreMessageMission = "" - local ScoreMission = 0 - local ScoreTask = 0 - for MissionName, MissionData in pairs( PlayerData.Mission ) do - ScoreMission = ScoreMission + MissionData.ScoreMission - ScoreTask = ScoreTask + MissionData.ScoreTask - ScoreMessageMission = ScoreMessageMission .. "'" .. MissionName .. "'; " - end - PlayerScore = PlayerScore + ScoreMission + ScoreTask - - if ScoreMessageMission ~= "" then - ScoreMessage = ScoreMessage .. " Tasks: " .. ScoreTask .. " Mission: " .. ScoreMission .. " ( " .. ScoreMessageMission .. ")\n" - end - - PlayerMessage = PlayerMessage .. string.format( "Player '%s' Score:%d (%d Score -%d Penalties)%s", PlayerName, PlayerScore - PlayerPenalty, PlayerScore, PlayerPenalty, ScoreMessage ) - end - end - MESSAGE:New( PlayerMessage, "Player Scores", 30, "AllPlayerScores"):ToAll() -end - - -function SCORING:ReportScorePlayer() - - env.info( "Hello World " ) - - local ScoreMessage = "" - local PlayerMessage = "" - - self:T( "Score Report" ) - - for PlayerName, PlayerData in pairs( self.Players ) do - if PlayerData then -- This should normally not happen, but i'll test it anyway. - self:T( "Score Player: " .. PlayerName ) - - -- Some variables - local InitUnitCoalition = _SCORINGCoalition[PlayerData.UnitCoalition] - local InitUnitCategory = _SCORINGCategory[PlayerData.UnitCategory] - local InitUnitType = PlayerData.UnitType - local InitUnitName = PlayerData.UnitName - - local PlayerScore = 0 - local PlayerPenalty = 0 - - ScoreMessage = "" - - local ScoreMessageHits = "" - - for CategoryID, CategoryName in pairs( _SCORINGCategory ) do - self:T( CategoryName ) - if PlayerData.Hit[CategoryID] then - local Score = 0 - local ScoreHit = 0 - local Penalty = 0 - local PenaltyHit = 0 - self:T( "Hit scores exist for player " .. PlayerName ) - for UnitName, UnitData in pairs( PlayerData.Hit[CategoryID] ) do - Score = Score + UnitData.Score - ScoreHit = ScoreHit + UnitData.ScoreHit - Penalty = Penalty + UnitData.Penalty - PenaltyHit = UnitData.PenaltyHit - end - local ScoreMessageHit = string.format( "\n %s = %d score(%d;-%d) hits(#%d;#-%d)", CategoryName, Score - Penalty, Score, Penalty, ScoreHit, PenaltyHit ) - self:T( ScoreMessageHit ) - ScoreMessageHits = ScoreMessageHits .. ScoreMessageHit - PlayerScore = PlayerScore + Score - PlayerPenalty = PlayerPenalty + Penalty - else - --ScoreMessageHits = ScoreMessageHits .. string.format( "%s:%d ", string.format(CategoryName, 1, 1), 0 ) - end - end - if ScoreMessageHits ~= "" then - ScoreMessage = ScoreMessage .. "\n Hits: " .. ScoreMessageHits .. " " - end - - local ScoreMessageKills = "" - for CategoryID, CategoryName in pairs( _SCORINGCategory ) do - self:T( "Kill scores exist for player " .. PlayerName ) - if PlayerData.Kill[CategoryID] then - local Score = 0 - local ScoreKill = 0 - local Penalty = 0 - local PenaltyKill = 0 - - for UnitName, UnitData in pairs( PlayerData.Kill[CategoryID] ) do - Score = Score + UnitData.Score - ScoreKill = ScoreKill + UnitData.ScoreKill - Penalty = Penalty + UnitData.Penalty - PenaltyKill = PenaltyKill + UnitData.PenaltyKill - end - - local ScoreMessageKill = string.format( "\n %s = %d score(%d;-%d) hits(#%d;#-%d)", CategoryName, Score - Penalty, Score, Penalty, ScoreKill, PenaltyKill ) - self:T( ScoreMessageKill ) - ScoreMessageKills = ScoreMessageKills .. ScoreMessageKill - - PlayerScore = PlayerScore + Score - PlayerPenalty = PlayerPenalty + Penalty - else - --ScoreMessageKills = ScoreMessageKills .. string.format( "%s:%d ", string.format(CategoryName, 1, 1), 0 ) - end - end - if ScoreMessageKills ~= "" then - ScoreMessage = ScoreMessage .. "\n Kills: " .. ScoreMessageKills .. " " - end - - local ScoreMessageCoalitionChangePenalties = "" - if PlayerData.PenaltyCoalition ~= 0 then - ScoreMessageCoalitionChangePenalties = ScoreMessageCoalitionChangePenalties .. string.format( " -%d (%d changed)", PlayerData.Penalty, PlayerData.PenaltyCoalition ) - PlayerPenalty = PlayerPenalty + PlayerData.Penalty - end - if ScoreMessageCoalitionChangePenalties ~= "" then - ScoreMessage = ScoreMessage .. "\n Coalition: " .. ScoreMessageCoalitionChangePenalties .. " " - end - - local ScoreMessageMission = "" - local ScoreMission = 0 - local ScoreTask = 0 - for MissionName, MissionData in pairs( PlayerData.Mission ) do - ScoreMission = ScoreMission + MissionData.ScoreMission - ScoreTask = ScoreTask + MissionData.ScoreTask - ScoreMessageMission = ScoreMessageMission .. "'" .. MissionName .. "'; " - end - PlayerScore = PlayerScore + ScoreMission + ScoreTask - - if ScoreMessageMission ~= "" then - ScoreMessage = ScoreMessage .. "\n Tasks: " .. ScoreTask .. " Mission: " .. ScoreMission .. " ( " .. ScoreMessageMission .. ") " - end - - PlayerMessage = PlayerMessage .. string.format( "Player '%s' Score = %d ( %d Score, -%d Penalties ):%s", PlayerName, PlayerScore - PlayerPenalty, PlayerScore, PlayerPenalty, ScoreMessage ) - end - end - MESSAGE:New( PlayerMessage, "Player Scores", 30, "AllPlayerScores"):ToAll() - -end - - -function SCORING:SecondsToClock(sSeconds) - local nSeconds = sSeconds - if nSeconds == 0 then - --return nil; - return "00:00:00"; - else - nHours = string.format("%02.f", math.floor(nSeconds/3600)); - nMins = string.format("%02.f", math.floor(nSeconds/60 - (nHours*60))); - nSecs = string.format("%02.f", math.floor(nSeconds - nHours*3600 - nMins *60)); - return nHours..":"..nMins..":"..nSecs - end -end - ---- Opens a score CSV file to log the scores. --- @param #SCORING self --- @param #string ScoringCSV --- @return #SCORING self --- @usage --- -- Open a new CSV file to log the scores of the game Gori Valley. Let the name of the CSV file begin with "Player Scores". --- ScoringObject = SCORING:New( "Gori Valley" ) --- ScoringObject:OpenCSV( "Player Scores" ) -function SCORING:OpenCSV( ScoringCSV ) - self:F( ScoringCSV ) - - if lfs and io and os then - if ScoringCSV then - self.ScoringCSV = ScoringCSV - local fdir = lfs.writedir() .. [[Logs\]] .. self.ScoringCSV .. " " .. os.date( "%Y-%m-%d %H-%M-%S" ) .. ".csv" - - self.CSVFile, self.err = io.open( fdir, "w+" ) - if not self.CSVFile then - error( "Error: Cannot open CSV file in " .. lfs.writedir() ) - end - - self.CSVFile:write( '"GameName","RunTime","Time","PlayerName","ScoreType","PlayerUnitCoaltion","PlayerUnitCategory","PlayerUnitType","PlayerUnitName","TargetUnitCoalition","TargetUnitCategory","TargetUnitType","TargetUnitName","Times","Score"\n' ) - - self.RunTime = os.date("%y-%m-%d_%H-%M-%S") - else - error( "A string containing the CSV file name must be given." ) - end - else - self:E( "The MissionScripting.lua file has not been changed to allow lfs, io and os modules to be used..." ) - end - return self -end - - ---- Registers a score for a player. --- @param #SCORING self --- @param #string PlayerName The name of the player. --- @param #string ScoreType The type of the score. --- @param #string ScoreTimes The amount of scores achieved. --- @param #string ScoreAmount The score given. --- @param #string PlayerUnitName The unit name of the player. --- @param #string PlayerUnitCoalition The coalition of the player unit. --- @param #string PlayerUnitCategory The category of the player unit. --- @param #string PlayerUnitType The type of the player unit. --- @param #string TargetUnitName The name of the target unit. --- @param #string TargetUnitCoalition The coalition of the target unit. --- @param #string TargetUnitCategory The category of the target unit. --- @param #string TargetUnitType The type of the target unit. --- @return #SCORING self -function SCORING:ScoreCSV( PlayerName, ScoreType, ScoreTimes, ScoreAmount, PlayerUnitName, PlayerUnitCoalition, PlayerUnitCategory, PlayerUnitType, TargetUnitName, TargetUnitCoalition, TargetUnitCategory, TargetUnitType ) - --write statistic information to file - local ScoreTime = self:SecondsToClock( timer.getTime() ) - PlayerName = PlayerName:gsub( '"', '_' ) - - if PlayerUnitName and PlayerUnitName ~= '' then - local PlayerUnit = Unit.getByName( PlayerUnitName ) - - if PlayerUnit then - if not PlayerUnitCategory then - --PlayerUnitCategory = SCORINGCategory[PlayerUnit:getCategory()] - PlayerUnitCategory = _SCORINGCategory[PlayerUnit:getDesc().category] - end - - if not PlayerUnitCoalition then - PlayerUnitCoalition = _SCORINGCoalition[PlayerUnit:getCoalition()] - end - - if not PlayerUnitType then - PlayerUnitType = PlayerUnit:getTypeName() - end - else - PlayerUnitName = '' - PlayerUnitCategory = '' - PlayerUnitCoalition = '' - PlayerUnitType = '' - end - else - PlayerUnitName = '' - PlayerUnitCategory = '' - PlayerUnitCoalition = '' - PlayerUnitType = '' - end - - if not TargetUnitCoalition then - TargetUnitCoalition = '' - end - - if not TargetUnitCategory then - TargetUnitCategory = '' - end - - if not TargetUnitType then - TargetUnitType = '' - end - - if not TargetUnitName then - TargetUnitName = '' - end - - if lfs and io and os then - self.CSVFile:write( - '"' .. self.GameName .. '"' .. ',' .. - '"' .. self.RunTime .. '"' .. ',' .. - '' .. ScoreTime .. '' .. ',' .. - '"' .. PlayerName .. '"' .. ',' .. - '"' .. ScoreType .. '"' .. ',' .. - '"' .. PlayerUnitCoalition .. '"' .. ',' .. - '"' .. PlayerUnitCategory .. '"' .. ',' .. - '"' .. PlayerUnitType .. '"' .. ',' .. - '"' .. PlayerUnitName .. '"' .. ',' .. - '"' .. TargetUnitCoalition .. '"' .. ',' .. - '"' .. TargetUnitCategory .. '"' .. ',' .. - '"' .. TargetUnitType .. '"' .. ',' .. - '"' .. TargetUnitName .. '"' .. ',' .. - '' .. ScoreTimes .. '' .. ',' .. - '' .. ScoreAmount - ) - - self.CSVFile:write( "\n" ) - end -end - - -function SCORING:CloseCSV() - if lfs and io and os then - self.CSVFile:close() - end -end - ---- CARGO Classes --- @module CARGO - -Include.File( "Routines" ) -Include.File( "Base" ) -Include.File( "Message" ) -Include.File( "Scheduler" ) - - ---- Clients are those Groups defined within the Mission Editor that have the skillset defined as "Client" or "Player". --- These clients are defined within the Mission Orchestration Framework (MOF) - -CARGOS = {} - - -CARGO_ZONE = { - ClassName="CARGO_ZONE", - CargoZoneName = '', - CargoHostUnitName = '', - SIGNAL = { - TYPE = { - SMOKE = { ID = 1, TEXT = "smoke" }, - FLARE = { ID = 2, TEXT = "flare" } - }, - COLOR = { - GREEN = { ID = 1, TRIGGERCOLOR = trigger.smokeColor.Green, TEXT = "A green" }, - RED = { ID = 2, TRIGGERCOLOR = trigger.smokeColor.Red, TEXT = "A red" }, - WHITE = { ID = 3, TRIGGERCOLOR = trigger.smokeColor.White, TEXT = "A white" }, - ORANGE = { ID = 4, TRIGGERCOLOR = trigger.smokeColor.Orange, TEXT = "An orange" }, - BLUE = { ID = 5, TRIGGERCOLOR = trigger.smokeColor.Blue, TEXT = "A blue" }, - YELLOW = { ID = 6, TRIGGERCOLOR = trigger.flareColor.Yellow, TEXT = "A yellow" } - } - } -} - ---- Creates a new zone where cargo can be collected or deployed. --- The zone functionality is useful to smoke or indicate routes for cargo pickups or deployments. --- Provide the zone name as declared in the mission file into the CargoZoneName in the :New method. --- An optional parameter is the CargoHostName, which is a Group declared with Late Activation switched on in the mission file. --- The CargoHostName is the "host" of the cargo zone: --- --- * It will smoke the zone position when a client is approaching the zone. --- * Depending on the cargo type, it will assist in the delivery of the cargo by driving to and from the client. --- --- @param #CARGO_ZONE self --- @param #string CargoZoneName The name of the zone as declared within the mission editor. --- @param #string CargoHostName The name of the Group "hosting" the zone. The Group MUST NOT be a static, and must be a "mobile" unit. -function CARGO_ZONE:New( CargoZoneName, CargoHostName ) local self = BASE:Inherit( self, ZONE:New( CargoZoneName ) ) - self:F( { CargoZoneName, CargoHostName } ) - - self.CargoZoneName = CargoZoneName - self.SignalHeight = 2 - --self.CargoZone = trigger.misc.getZone( CargoZoneName ) - - - if CargoHostName then - self.CargoHostName = CargoHostName - end - - self:T( self.CargoZoneName ) - - return self -end - -function CARGO_ZONE:Spawn() - self:F( self.CargoHostName ) - - if self.CargoHostName then -- Only spawn a host in the zone when there is one given as a parameter in the New function. - if self.CargoHostSpawn then - local CargoHostGroup = self.CargoHostSpawn:GetGroupFromIndex() - if CargoHostGroup and CargoHostGroup:IsAlive() then - else - self.CargoHostSpawn:ReSpawn( 1 ) - end - else - self:T( "Initialize CargoHostSpawn" ) - self.CargoHostSpawn = SPAWN:New( self.CargoHostName ):Limit( 1, 1 ) - self.CargoHostSpawn:ReSpawn( 1 ) - end - end - - return self -end - -function CARGO_ZONE:GetHostUnit() - self:F( self ) - - if self.CargoHostName then - - -- A Host has been given, signal the host - local CargoHostGroup = self.CargoHostSpawn:GetGroupFromIndex() - local CargoHostUnit - if CargoHostGroup and CargoHostGroup:IsAlive() then - CargoHostUnit = CargoHostGroup:GetUnit(1) - else - CargoHostUnit = StaticObject.getByName( self.CargoHostName ) - end - - return CargoHostUnit - end - - return nil -end - -function CARGO_ZONE:ReportCargosToClient( Client, CargoType ) - self:F() - - local SignalUnit = self:GetHostUnit() - - if SignalUnit then - - local SignalUnitTypeName = SignalUnit:getTypeName() - - local HostMessage = "" - - local IsCargo = false - for CargoID, Cargo in pairs( CARGOS ) do - if Cargo.CargoType == Task.CargoType then - if Cargo:IsStatusNone() then - HostMessage = HostMessage .. " - " .. Cargo.CargoName .. " - " .. Cargo.CargoType .. " (" .. Cargo.Weight .. "kg)" .. "\n" - IsCargo = true - end - end - end - - if not IsCargo then - HostMessage = "No Cargo Available." - end - - Client:Message( HostMessage, 20, Mission.Name .. "/StageHosts." .. SignalUnitTypeName, SignalUnitTypeName .. ": Reporting Cargo", 10 ) - end -end - - -function CARGO_ZONE:Signal() - self:F() - - local Signalled = false - - if self.SignalType then - - if self.CargoHostName then - - -- A Host has been given, signal the host - - local SignalUnit = self:GetHostUnit() - - if SignalUnit then - - self:T( 'Signalling Unit' ) - local SignalVehiclePos = SignalUnit:GetPointVec3() - SignalVehiclePos.y = SignalVehiclePos.y + 2 - - if self.SignalType.ID == CARGO_ZONE.SIGNAL.TYPE.SMOKE.ID then - - trigger.action.smoke( SignalVehiclePos, self.SignalColor.TRIGGERCOLOR ) - Signalled = true - - elseif self.SignalType.ID == CARGO_ZONE.SIGNAL.TYPE.FLARE.ID then - - trigger.action.signalFlare( SignalVehiclePos, self.SignalColor.TRIGGERCOLOR , 0 ) - Signalled = false - - end - end - - else - - local ZonePointVec3 = self:GetPointVec3( self.SignalHeight ) -- Get the zone position + the landheight + 2 meters - - if self.SignalType.ID == CARGO_ZONE.SIGNAL.TYPE.SMOKE.ID then - - trigger.action.smoke( ZonePointVec3, self.SignalColor.TRIGGERCOLOR ) - Signalled = true - - elseif self.SignalType.ID == CARGO_ZONE.SIGNAL.TYPE.FLARE.ID then - trigger.action.signalFlare( ZonePointVec3, self.SignalColor.TRIGGERCOLOR, 0 ) - Signalled = false - - end - end - end - - return Signalled - -end - -function CARGO_ZONE:WhiteSmoke( SignalHeight ) - self:F() - - self.SignalType = CARGO_ZONE.SIGNAL.TYPE.SMOKE - self.SignalColor = CARGO_ZONE.SIGNAL.COLOR.WHITE - - if SignalHeight then - self.SignalHeight = SignalHeight - end - - return self -end - -function CARGO_ZONE:BlueSmoke( SignalHeight ) - self:F() - - self.SignalType = CARGO_ZONE.SIGNAL.TYPE.SMOKE - self.SignalColor = CARGO_ZONE.SIGNAL.COLOR.BLUE - - if SignalHeight then - self.SignalHeight = SignalHeight - end - - return self -end - -function CARGO_ZONE:RedSmoke( SignalHeight ) - self:F() - - self.SignalType = CARGO_ZONE.SIGNAL.TYPE.SMOKE - self.SignalColor = CARGO_ZONE.SIGNAL.COLOR.RED - - if SignalHeight then - self.SignalHeight = SignalHeight - end - - return self -end - -function CARGO_ZONE:OrangeSmoke( SignalHeight ) - self:F() - - self.SignalType = CARGO_ZONE.SIGNAL.TYPE.SMOKE - self.SignalColor = CARGO_ZONE.SIGNAL.COLOR.ORANGE - - if SignalHeight then - self.SignalHeight = SignalHeight - end - - return self -end - -function CARGO_ZONE:GreenSmoke( SignalHeight ) - self:F() - - self.SignalType = CARGO_ZONE.SIGNAL.TYPE.SMOKE - self.SignalColor = CARGO_ZONE.SIGNAL.COLOR.GREEN - - if SignalHeight then - self.SignalHeight = SignalHeight - end - - return self -end - - -function CARGO_ZONE:WhiteFlare( SignalHeight ) - self:F() - - self.SignalType = CARGO_ZONE.SIGNAL.TYPE.FLARE - self.SignalColor = CARGO_ZONE.SIGNAL.COLOR.WHITE - - if SignalHeight then - self.SignalHeight = SignalHeight - end - - return self -end - -function CARGO_ZONE:RedFlare( SignalHeight ) - self:F() - - self.SignalType = CARGO_ZONE.SIGNAL.TYPE.FLARE - self.SignalColor = CARGO_ZONE.SIGNAL.COLOR.RED - - if SignalHeight then - self.SignalHeight = SignalHeight - end - - return self -end - -function CARGO_ZONE:GreenFlare( SignalHeight ) - self:F() - - self.SignalType = CARGO_ZONE.SIGNAL.TYPE.FLARE - self.SignalColor = CARGO_ZONE.SIGNAL.COLOR.GREEN - - if SignalHeight then - self.SignalHeight = SignalHeight - end - - return self -end - -function CARGO_ZONE:YellowFlare( SignalHeight ) - self:F() - - self.SignalType = CARGO_ZONE.SIGNAL.TYPE.FLARE - self.SignalColor = CARGO_ZONE.SIGNAL.COLOR.YELLOW - - if SignalHeight then - self.SignalHeight = SignalHeight - end - - return self -end - - -function CARGO_ZONE:GetCargoHostUnit() - self:F( self ) - - if self.CargoHostSpawn then - local CargoHostGroup = self.CargoHostSpawn:GetGroupFromIndex(1) - if CargoHostGroup and CargoHostGroup:IsAlive() then - local CargoHostUnit = CargoHostGroup:GetUnit(1) - if CargoHostUnit and CargoHostUnit:IsAlive() then - return CargoHostUnit - end - end - end - - return nil -end - -function CARGO_ZONE:GetCargoZoneName() - self:F() - - return self.CargoZoneName -end - -CARGO = { - ClassName = "CARGO", - STATUS = { - NONE = 0, - LOADED = 1, - UNLOADED = 2, - LOADING = 3 - }, - CargoClient = nil -} - ---- Add Cargo to the mission... Cargo functionality needs to be reworked a bit, so this is still under construction. I need to make a CARGO Class... -function CARGO:New( CargoType, CargoName, CargoWeight ) local self = BASE:Inherit( self, BASE:New() ) - self:F( { CargoType, CargoName, CargoWeight } ) - - - self.CargoType = CargoType - self.CargoName = CargoName - self.CargoWeight = CargoWeight - - self:StatusNone() - - return self -end - -function CARGO:Spawn( Client ) - self:F() - - return self - -end - -function CARGO:IsNear( Client, LandingZone ) - self:F() - - local Near = true - - return Near - -end - - -function CARGO:IsLoadingToClient() - self:F() - - if self:IsStatusLoading() then - return self.CargoClient - end - - return nil - -end - - -function CARGO:IsLoadedInClient() - self:F() - - if self:IsStatusLoaded() then - return self.CargoClient - end - - return nil - -end - - -function CARGO:UnLoad( Client, TargetZoneName ) - self:F() - - self:StatusUnLoaded() - - return self -end - -function CARGO:OnBoard( Client, LandingZone ) - self:F() - - local Valid = true - - self.CargoClient = Client - local ClientUnit = Client:GetClientGroupDCSUnit() - - return Valid -end - -function CARGO:OnBoarded( Client, LandingZone ) - self:F() - - local OnBoarded = true - - return OnBoarded -end - -function CARGO:Load( Client ) - self:F() - - self:StatusLoaded( Client ) - - return self -end - -function CARGO:IsLandingRequired() - self:F() - return true -end - -function CARGO:IsSlingLoad() - self:F() - return false -end - - -function CARGO:StatusNone() - self:F() - - self.CargoClient = nil - self.CargoStatus = CARGO.STATUS.NONE - - return self -end - -function CARGO:StatusLoading( Client ) - self:F() - - self.CargoClient = Client - self.CargoStatus = CARGO.STATUS.LOADING - self:T( "Cargo " .. self.CargoName .. " loading to Client: " .. self.CargoClient:GetClientGroupName() ) - - return self -end - -function CARGO:StatusLoaded( Client ) - self:F() - - self.CargoClient = Client - self.CargoStatus = CARGO.STATUS.LOADED - self:T( "Cargo " .. self.CargoName .. " loaded in Client: " .. self.CargoClient:GetClientGroupName() ) - - return self -end - -function CARGO:StatusUnLoaded() - self:F() - - self.CargoClient = nil - self.CargoStatus = CARGO.STATUS.UNLOADED - - return self -end - - -function CARGO:IsStatusNone() - self:F() - - return self.CargoStatus == CARGO.STATUS.NONE -end - -function CARGO:IsStatusLoading() - self:F() - - return self.CargoStatus == CARGO.STATUS.LOADING -end - -function CARGO:IsStatusLoaded() - self:F() - - return self.CargoStatus == CARGO.STATUS.LOADED -end - -function CARGO:IsStatusUnLoaded() - self:F() - - return self.CargoStatus == CARGO.STATUS.UNLOADED -end - - -CARGO_GROUP = { - ClassName = "CARGO_GROUP" -} - - -function CARGO_GROUP:New( CargoType, CargoName, CargoWeight, CargoGroupTemplate, CargoZone ) local self = BASE:Inherit( self, CARGO:New( CargoType, CargoName, CargoWeight ) ) - self:F( { CargoType, CargoName, CargoWeight, CargoGroupTemplate, CargoZone } ) - - self.CargoSpawn = SPAWN:NewWithAlias( CargoGroupTemplate, CargoName ) - self.CargoZone = CargoZone - - CARGOS[self.CargoName] = self - - return self - -end - -function CARGO_GROUP:Spawn( Client ) - self:F( { Client } ) - - local SpawnCargo = true - - if self:IsStatusNone() then - local CargoGroup = Group.getByName( self.CargoName ) - if CargoGroup and CargoGroup:isExist() then - SpawnCargo = false - end - - elseif self:IsStatusLoading() then - - local Client = self:IsLoadingToClient() - if Client and Client:GetDCSGroup() then - SpawnCargo = false - else - local CargoGroup = Group.getByName( self.CargoName ) - if CargoGroup and CargoGroup:isExist() then - SpawnCargo = false - end - end - - elseif self:IsStatusLoaded() then - - local ClientLoaded = self:IsLoadedInClient() - -- Now test if another Client is alive (not this one), and it has the CARGO, then this cargo does not need to be initialized and spawned. - if ClientLoaded and ClientLoaded ~= Client then - local ClientGroup = Client:GetDCSGroup() - if ClientLoaded:GetClientGroupDCSUnit() and ClientLoaded:GetClientGroupDCSUnit():isExist() then - SpawnCargo = false - else - self:StatusNone() - end - else - -- Same Client, but now in initialize, so set back the status to None. - self:StatusNone() - end - - elseif self:IsStatusUnLoaded() then - - SpawnCargo = false - - end - - if SpawnCargo then - if self.CargoZone:GetCargoHostUnit() then - --- ReSpawn the Cargo from the CargoHost - self.CargoGroupName = self.CargoSpawn:SpawnFromUnit( self.CargoZone:GetCargoHostUnit(), 60, 30, 1 ):GetName() - else - --- ReSpawn the Cargo in the CargoZone without a host ... - self:T( self.CargoZone ) - self.CargoGroupName = self.CargoSpawn:SpawnInZone( self.CargoZone, true, 1 ):GetName() - end - self:StatusNone() - end - - self:T( { self.CargoGroupName, CARGOS[self.CargoName].CargoGroupName } ) - - return self -end - -function CARGO_GROUP:IsNear( Client, LandingZone ) - self:F() - - local Near = false - - if self.CargoGroupName then - local CargoGroup = Group.getByName( self.CargoGroupName ) - if routines.IsPartOfGroupInRadius( CargoGroup, Client:GetPositionVec3(), 250 ) then - Near = true - end - end - - return Near - -end - - -function CARGO_GROUP:OnBoard( Client, LandingZone, OnBoardSide ) - self:F() - - local Valid = true - - local ClientUnit = Client:GetClientGroupDCSUnit() - - local CarrierPos = ClientUnit:getPoint() - local CarrierPosMove = ClientUnit:getPoint() - local CarrierPosOnBoard = ClientUnit:getPoint() - - local CargoGroup = Group.getByName( self.CargoGroupName ) - - local CargoUnit = CargoGroup:getUnit(1) - local CargoPos = CargoUnit:getPoint() - - self.CargoInAir = CargoUnit:inAir() - - self:T( self.CargoInAir ) - - -- Only move the group to the carrier when the cargo is not in the air - -- (eg. cargo can be on a oil derrick, moving the cargo on the oil derrick will drop the cargo on the sea). - if not self.CargoInAir then - - local Points = {} - - self:T( 'CargoPos x = ' .. CargoPos.x .. " z = " .. CargoPos.z ) - self:T( 'CarrierPosMove x = ' .. CarrierPosMove.x .. " z = " .. CarrierPosMove.z ) - - Points[#Points+1] = routines.ground.buildWP( CargoPos, "Cone", 10 ) - - self:T( 'Points[1] x = ' .. Points[1].x .. " y = " .. Points[1].y ) - - if OnBoardSide == nil then - OnBoardSide = CLIENT.ONBOARDSIDE.NONE - end - - if OnBoardSide == CLIENT.ONBOARDSIDE.LEFT then - - self:T( "TransportCargoOnBoard: Onboarding LEFT" ) - CarrierPosMove.z = CarrierPosMove.z - 25 - CarrierPosOnBoard.z = CarrierPosOnBoard.z - 5 - Points[#Points+1] = routines.ground.buildWP( CarrierPosMove, "Cone", 10 ) - Points[#Points+1] = routines.ground.buildWP( CarrierPosOnBoard, "Cone", 10 ) - - elseif OnBoardSide == CLIENT.ONBOARDSIDE.RIGHT then - - self:T( "TransportCargoOnBoard: Onboarding RIGHT" ) - CarrierPosMove.z = CarrierPosMove.z + 25 - CarrierPosOnBoard.z = CarrierPosOnBoard.z + 5 - Points[#Points+1] = routines.ground.buildWP( CarrierPosMove, "Cone", 10 ) - Points[#Points+1] = routines.ground.buildWP( CarrierPosOnBoard, "Cone", 10 ) - - elseif OnBoardSide == CLIENT.ONBOARDSIDE.BACK then - - self:T( "TransportCargoOnBoard: Onboarding BACK" ) - CarrierPosMove.x = CarrierPosMove.x - 25 - CarrierPosOnBoard.x = CarrierPosOnBoard.x - 5 - Points[#Points+1] = routines.ground.buildWP( CarrierPosMove, "Cone", 10 ) - Points[#Points+1] = routines.ground.buildWP( CarrierPosOnBoard, "Cone", 10 ) - - elseif OnBoardSide == CLIENT.ONBOARDSIDE.FRONT then - - self:T( "TransportCargoOnBoard: Onboarding FRONT" ) - CarrierPosMove.x = CarrierPosMove.x + 25 - CarrierPosOnBoard.x = CarrierPosOnBoard.x + 5 - Points[#Points+1] = routines.ground.buildWP( CarrierPosMove, "Cone", 10 ) - Points[#Points+1] = routines.ground.buildWP( CarrierPosOnBoard, "Cone", 10 ) - - elseif OnBoardSide == CLIENT.ONBOARDSIDE.NONE then - - self:T( "TransportCargoOnBoard: Onboarding CENTRAL" ) - Points[#Points+1] = routines.ground.buildWP( CarrierPos, "Cone", 10 ) - - end - self:T( "TransportCargoOnBoard: Routing " .. self.CargoGroupName ) - - --routines.scheduleFunction( routines.goRoute, { self.CargoGroupName, Points}, timer.getTime() + 4 ) - SCHEDULER:New( self, routines.goRoute, { self.CargoGroupName, Points}, 4 ) - end - - self:StatusLoading( Client ) - - return Valid - -end - - -function CARGO_GROUP:OnBoarded( Client, LandingZone ) - self:F() - - local OnBoarded = false - - local CargoGroup = Group.getByName( self.CargoGroupName ) - - if not self.CargoInAir then - if routines.IsPartOfGroupInRadius( CargoGroup, Client:GetPositionVec3(), 25 ) then - CargoGroup:destroy() - self:StatusLoaded( Client ) - OnBoarded = true - end - else - CargoGroup:destroy() - self:StatusLoaded( Client ) - OnBoarded = true - end - - return OnBoarded -end - - -function CARGO_GROUP:UnLoad( Client, TargetZoneName ) - self:F() - - self:T( 'self.CargoName = ' .. self.CargoName ) - - local CargoGroup = self.CargoSpawn:SpawnFromUnit( Client:GetClientGroupUnit(), 60, 30 ) - - self.CargoGroupName = CargoGroup:GetName() - self:T( 'self.CargoGroupName = ' .. self.CargoGroupName ) - - CargoGroup:TaskRouteToZone( ZONE:New( TargetZoneName ), true ) - - self:StatusUnLoaded() - - return self -end - - -CARGO_PACKAGE = { - ClassName = "CARGO_PACKAGE" -} - - -function CARGO_PACKAGE:New( CargoType, CargoName, CargoWeight, CargoClient ) local self = BASE:Inherit( self, CARGO:New( CargoType, CargoName, CargoWeight ) ) - self:F( { CargoType, CargoName, CargoWeight, CargoClient } ) - - self.CargoClient = CargoClient - - CARGOS[self.CargoName] = self - - return self - -end - - -function CARGO_PACKAGE:Spawn( Client ) - self:F( { self, Client } ) - - -- this needs to be checked thoroughly - - local CargoClientGroup = self.CargoClient:GetDCSGroup() - if not CargoClientGroup then - if not self.CargoClientSpawn then - self.CargoClientSpawn = SPAWN:New( self.CargoClient:GetClientGroupName() ):Limit( 1, 1 ) - end - self.CargoClientSpawn:ReSpawn( 1 ) - end - - local SpawnCargo = true - - if self:IsStatusNone() then - - elseif self:IsStatusLoading() or self:IsStatusLoaded() then - - local CargoClientLoaded = self:IsLoadedInClient() - if CargoClientLoaded and CargoClientLoaded:GetDCSGroup() then - SpawnCargo = false - end - - elseif self:IsStatusUnLoaded() then - - SpawnCargo = false - - else - - end - - if SpawnCargo then - self:StatusLoaded( self.CargoClient ) - end - - return self -end - - -function CARGO_PACKAGE:IsNear( Client, LandingZone ) - self:F() - - local Near = false - - if self.CargoClient and self.CargoClient:GetDCSGroup() then - self:T( self.CargoClient.ClientName ) - self:T( 'Client Exists.' ) - - if routines.IsUnitInRadius( self.CargoClient:GetClientGroupDCSUnit(), Client:GetPositionVec3(), 150 ) then - Near = true - end - end - - return Near - -end - - -function CARGO_PACKAGE:OnBoard( Client, LandingZone, OnBoardSide ) - self:F() - - local Valid = true - - local ClientUnit = Client:GetClientGroupDCSUnit() - - local CarrierPos = ClientUnit:getPoint() - local CarrierPosMove = ClientUnit:getPoint() - local CarrierPosOnBoard = ClientUnit:getPoint() - local CarrierPosMoveAway = ClientUnit:getPoint() - - local CargoHostGroup = self.CargoClient:GetDCSGroup() - local CargoHostName = self.CargoClient:GetDCSGroup():getName() - - local CargoHostUnits = CargoHostGroup:getUnits() - local CargoPos = CargoHostUnits[1]:getPoint() - - local Points = {} - - self:T( 'CargoPos x = ' .. CargoPos.x .. " z = " .. CargoPos.z ) - self:T( 'CarrierPosMove x = ' .. CarrierPosMove.x .. " z = " .. CarrierPosMove.z ) - - Points[#Points+1] = routines.ground.buildWP( CargoPos, "Cone", 10 ) - - self:T( 'Points[1] x = ' .. Points[1].x .. " y = " .. Points[1].y ) - - if OnBoardSide == nil then - OnBoardSide = CLIENT.ONBOARDSIDE.NONE - end - - if OnBoardSide == CLIENT.ONBOARDSIDE.LEFT then - - self:T( "TransportCargoOnBoard: Onboarding LEFT" ) - CarrierPosMove.z = CarrierPosMove.z - 25 - CarrierPosOnBoard.z = CarrierPosOnBoard.z - 5 - CarrierPosMoveAway.z = CarrierPosMoveAway.z - 20 - Points[#Points+1] = routines.ground.buildWP( CarrierPosMove, "Cone", 10 ) - Points[#Points+1] = routines.ground.buildWP( CarrierPosOnBoard, "Cone", 10 ) - Points[#Points+1] = routines.ground.buildWP( CarrierPosMoveAway, "Cone", 10 ) - - elseif OnBoardSide == CLIENT.ONBOARDSIDE.RIGHT then - - self:T( "TransportCargoOnBoard: Onboarding RIGHT" ) - CarrierPosMove.z = CarrierPosMove.z + 25 - CarrierPosOnBoard.z = CarrierPosOnBoard.z + 5 - CarrierPosMoveAway.z = CarrierPosMoveAway.z + 20 - Points[#Points+1] = routines.ground.buildWP( CarrierPosMove, "Cone", 10 ) - Points[#Points+1] = routines.ground.buildWP( CarrierPosOnBoard, "Cone", 10 ) - Points[#Points+1] = routines.ground.buildWP( CarrierPosMoveAway, "Cone", 10 ) - - elseif OnBoardSide == CLIENT.ONBOARDSIDE.BACK then - - self:T( "TransportCargoOnBoard: Onboarding BACK" ) - CarrierPosMove.x = CarrierPosMove.x - 25 - CarrierPosOnBoard.x = CarrierPosOnBoard.x - 5 - CarrierPosMoveAway.x = CarrierPosMoveAway.x - 20 - Points[#Points+1] = routines.ground.buildWP( CarrierPosMove, "Cone", 10 ) - Points[#Points+1] = routines.ground.buildWP( CarrierPosOnBoard, "Cone", 10 ) - Points[#Points+1] = routines.ground.buildWP( CarrierPosMoveAway, "Cone", 10 ) - - elseif OnBoardSide == CLIENT.ONBOARDSIDE.FRONT then - - self:T( "TransportCargoOnBoard: Onboarding FRONT" ) - CarrierPosMove.x = CarrierPosMove.x + 25 - CarrierPosOnBoard.x = CarrierPosOnBoard.x + 5 - CarrierPosMoveAway.x = CarrierPosMoveAway.x + 20 - Points[#Points+1] = routines.ground.buildWP( CarrierPosMove, "Cone", 10 ) - Points[#Points+1] = routines.ground.buildWP( CarrierPosOnBoard, "Cone", 10 ) - Points[#Points+1] = routines.ground.buildWP( CarrierPosMoveAway, "Cone", 10 ) - - elseif OnBoardSide == CLIENT.ONBOARDSIDE.NONE then - - self:T( "TransportCargoOnBoard: Onboarding FRONT" ) - CarrierPosMove.x = CarrierPosMove.x + 25 - CarrierPosOnBoard.x = CarrierPosOnBoard.x + 5 - CarrierPosMoveAway.x = CarrierPosMoveAway.x + 20 - Points[#Points+1] = routines.ground.buildWP( CarrierPosMove, "Cone", 10 ) - Points[#Points+1] = routines.ground.buildWP( CarrierPosOnBoard, "Cone", 10 ) - Points[#Points+1] = routines.ground.buildWP( CarrierPosMoveAway, "Cone", 10 ) - - end - self:T( "Routing " .. CargoHostName ) - - --routines.scheduleFunction( routines.goRoute, { CargoHostName, Points}, timer.getTime() + 4 ) - SCHEDULER:New( self, routines.goRoute, { CargoHostName, Points }, 4 ) - - return Valid - -end - - -function CARGO_PACKAGE:OnBoarded( Client, LandingZone ) - self:F() - - local OnBoarded = false - - if self.CargoClient and self.CargoClient:GetDCSGroup() then - if routines.IsUnitInRadius( self.CargoClient:GetClientGroupDCSUnit(), self.CargoClient:GetPositionVec3(), 10 ) then - - -- Switch Cargo from self.CargoClient to Client ... Each cargo can have only one client. So assigning the new client for the cargo is enough. - self:StatusLoaded( Client ) - - -- All done, onboarded the Cargo to the new Client. - OnBoarded = true - end - end - - return OnBoarded -end - - -function CARGO_PACKAGE:UnLoad( Client, TargetZoneName ) - self:F() - - self:T( 'self.CargoName = ' .. self.CargoName ) - --self:T( 'self.CargoHostName = ' .. self.CargoHostName ) - - --self.CargoSpawn:FromCarrier( Client:GetDCSGroup(), TargetZoneName, self.CargoHostName ) - self:StatusUnLoaded() - - return Cargo -end - - -CARGO_SLINGLOAD = { - ClassName = "CARGO_SLINGLOAD" -} - - -function CARGO_SLINGLOAD:New( CargoType, CargoName, CargoWeight, CargoZone, CargoHostName, CargoCountryID ) - local self = BASE:Inherit( self, CARGO:New( CargoType, CargoName, CargoWeight ) ) - self:F( { CargoType, CargoName, CargoWeight, CargoZone, CargoHostName, CargoCountryID } ) - - self.CargoHostName = CargoHostName - - -- Cargo will be initialized around the CargoZone position. - self.CargoZone = CargoZone - - self.CargoCount = 0 - self.CargoStaticName = string.format( "%s#%03d", self.CargoName, self.CargoCount ) - - -- The country ID needs to be correctly set. - self.CargoCountryID = CargoCountryID - - CARGOS[self.CargoName] = self - - return self - -end - - -function CARGO_SLINGLOAD:IsLandingRequired() - self:F() - return false -end - - -function CARGO_SLINGLOAD:IsSlingLoad() - self:F() - return true -end - - -function CARGO_SLINGLOAD:Spawn( Client ) - self:F( { self, Client } ) - - local Zone = trigger.misc.getZone( self.CargoZone ) - - local ZonePos = {} - ZonePos.x = Zone.point.x + math.random( Zone.radius / 2 * -1, Zone.radius / 2 ) - ZonePos.y = Zone.point.z + math.random( Zone.radius / 2 * -1, Zone.radius / 2 ) - - self:T( "Cargo Location = " .. ZonePos.x .. ", " .. ZonePos.y ) - - --[[ - -- This does not work in 1.5.2. - CargoStatic = StaticObject.getByName( self.CargoName ) - if CargoStatic then - CargoStatic:destroy() - end - --]] - - CargoStatic = StaticObject.getByName( self.CargoStaticName ) - - if CargoStatic and CargoStatic:isExist() then - CargoStatic:destroy() - end - - -- I need to make every time a new cargo due to bugs in 1.5.2. - - self.CargoCount = self.CargoCount + 1 - self.CargoStaticName = string.format( "%s#%03d", self.CargoName, self.CargoCount ) - - local CargoTemplate = { - ["category"] = "Cargo", - ["shape_name"] = "ab-212_cargo", - ["type"] = "Cargo1", - ["x"] = ZonePos.x, - ["y"] = ZonePos.y, - ["mass"] = self.CargoWeight, - ["name"] = self.CargoStaticName, - ["canCargo"] = true, - ["heading"] = 0, - } - - coalition.addStaticObject( self.CargoCountryID, CargoTemplate ) - --- end - - return self -end - - -function CARGO_SLINGLOAD:IsNear( Client, LandingZone ) - self:F() - - local Near = false - - return Near -end - - -function CARGO_SLINGLOAD:IsInLandingZone( Client, LandingZone ) - self:F() - - local Near = false - - local CargoStaticUnit = StaticObject.getByName( self.CargoName ) - if CargoStaticUnit then - if routines.IsStaticInZones( CargoStaticUnit, LandingZone ) then - Near = true - end - end - - return Near -end - - -function CARGO_SLINGLOAD:OnBoard( Client, LandingZone, OnBoardSide ) - self:F() - - local Valid = true - - - return Valid -end - - -function CARGO_SLINGLOAD:OnBoarded( Client, LandingZone ) - self:F() - - local OnBoarded = false - - local CargoStaticUnit = StaticObject.getByName( self.CargoName ) - if CargoStaticUnit then - if not routines.IsStaticInZones( CargoStaticUnit, LandingZone ) then - OnBoarded = true - end - end - - return OnBoarded -end - - -function CARGO_SLINGLOAD:UnLoad( Client, TargetZoneName ) - self:F() - - self:T( 'self.CargoName = ' .. self.CargoName ) - self:T( 'self.CargoGroupName = ' .. self.CargoGroupName ) - - self:StatusUnLoaded() - - return Cargo -end ---- Message System to display Messages for Clients and Coalitions or All. --- Messages are grouped on the display panel per Category to improve readability for the players. --- Messages are shown on the display panel for an amount of seconds, and will then disappear. --- Messages are identified by an ID. The messages with the same ID belonging to the same category will be overwritten if they were still being displayed on the display panel. --- Messages are created with MESSAGE:@{New}(). --- Messages are sent to Clients with MESSAGE:@{ToClient}(). --- Messages are sent to Coalitions with MESSAGE:@{ToCoalition}(). --- Messages are sent to All Players with MESSAGE:@{ToAll}(). --- @module Message - -Include.File( "Base" ) - ---- The MESSAGE class --- @type MESSAGE -MESSAGE = { - ClassName = "MESSAGE", - MessageCategory = 0, - MessageID = 0, -} - - ---- Creates a new MESSAGE object. Note that these MESSAGE objects are not yet displayed on the display panel. You must use the functions @{ToClient} or @{ToCoalition} or @{ToAll} to send these Messages to the respective recipients. --- @param self --- @param #string MessageText is the text of the Message. --- @param #string MessageCategory is a string expressing the Category of the Message. Messages are grouped on the display panel per Category to improve readability. --- @param #number MessageDuration is a number in seconds of how long the MESSAGE should be shown on the display panel. --- @param #string MessageID is a string expressing the ID of the Message. --- @return #MESSAGE --- @usage --- -- Create a series of new Messages. --- -- MessageAll is meant to be sent to all players, for 25 seconds, and is classified as "Score". --- -- MessageRED is meant to be sent to the RED players only, for 10 seconds, and is classified as "End of Mission", with ID "Win". --- -- MessageClient1 is meant to be sent to a Client, for 25 seconds, and is classified as "Score", with ID "Score". --- -- MessageClient1 is meant to be sent to a Client, for 25 seconds, and is classified as "Score", with ID "Score". --- MessageAll = MESSAGE:New( "To all Players: BLUE has won! Each player of BLUE wins 50 points!", "End of Mission", 25, "Win" ) --- MessageRED = MESSAGE:New( "To the RED Players: You receive a penalty because you've killed one of your own units", "Penalty", 25, "Score" ) --- MessageClient1 = MESSAGE:New( "Congratulations, you've just hit a target", "Score", 25, "Score" ) --- MessageClient2 = MESSAGE:New( "Congratulations, you've just killed a target", "Score", 25, "Score" ) -function MESSAGE:New( MessageText, MessageCategory, MessageDuration, MessageID ) - local self = BASE:Inherit( self, BASE:New() ) - self:F( { MessageText, MessageCategory, MessageDuration, MessageID } ) - - -- When no messagecategory is given, we don't show it as a title... - if MessageCategory and MessageCategory ~= "" then - self.MessageCategory = MessageCategory .. ": " - else - self.MessageCategory = "" - end - - self.MessageDuration = MessageDuration - self.MessageID = MessageID - self.MessageTime = timer.getTime() - self.MessageText = MessageText - - self.MessageSent = false - self.MessageGroup = false - self.MessageCoalition = false - - return self -end - ---- Sends a MESSAGE to a Client Group. Note that the Group needs to be defined within the ME with the skillset "Client" or "Player". --- @param #MESSAGE self --- @param Client#CLIENT Client is the Group of the Client. --- @return #MESSAGE --- @usage --- -- Send the 2 messages created with the @{New} method to the Client Group. --- -- Note that the Message of MessageClient2 is overwriting the Message of MessageClient1. --- ClientGroup = Group.getByName( "ClientGroup" ) --- --- MessageClient1 = MESSAGE:New( "Congratulations, you've just hit a target", "Score", 25, "Score" ):ToClient( ClientGroup ) --- MessageClient2 = MESSAGE:New( "Congratulations, you've just killed a target", "Score", 25, "Score" ):ToClient( ClientGroup ) --- or --- MESSAGE:New( "Congratulations, you've just hit a target", "Score", 25, "Score" ):ToClient( ClientGroup ) --- MESSAGE:New( "Congratulations, you've just killed a target", "Score", 25, "Score" ):ToClient( ClientGroup ) --- or --- MessageClient1 = MESSAGE:New( "Congratulations, you've just hit a target", "Score", 25, "Score" ) --- MessageClient2 = MESSAGE:New( "Congratulations, you've just killed a target", "Score", 25, "Score" ) --- MessageClient1:ToClient( ClientGroup ) --- MessageClient2:ToClient( ClientGroup ) -function MESSAGE:ToClient( Client ) - self:F( Client ) - - if Client and Client:GetClientGroupID() then - - local ClientGroupID = Client:GetClientGroupID() - self:T( self.MessageCategory .. self.MessageText:gsub("\n$",""):gsub("\n$","") .. " / " .. self.MessageDuration ) - trigger.action.outTextForGroup( ClientGroupID, self.MessageCategory .. self.MessageText:gsub("\n$",""):gsub("\n$",""), self.MessageDuration ) - end - - return self -end - ---- Sends a MESSAGE to the Blue coalition. --- @param #MESSAGE self --- @return #MESSAGE --- @usage --- -- Send a message created with the @{New} method to the BLUE coalition. --- MessageBLUE = MESSAGE:New( "To the BLUE Players: You receive a penalty because you've killed one of your own units", "Penalty", 25, "Score" ):ToBlue() --- or --- MESSAGE:New( "To the BLUE Players: You receive a penalty because you've killed one of your own units", "Penalty", 25, "Score" ):ToBlue() --- or --- MessageBLUE = MESSAGE:New( "To the BLUE Players: You receive a penalty because you've killed one of your own units", "Penalty", 25, "Score" ) --- MessageBLUE:ToBlue() -function MESSAGE:ToBlue() - self:F() - - self:ToCoalition( coalition.side.BLUE ) - - return self -end - ---- Sends a MESSAGE to the Red Coalition. --- @param #MESSAGE self --- @return #MESSAGE --- @usage --- -- Send a message created with the @{New} method to the RED coalition. --- MessageRED = MESSAGE:New( "To the RED Players: You receive a penalty because you've killed one of your own units", "Penalty", 25, "Score" ):ToRed() --- or --- MESSAGE:New( "To the RED Players: You receive a penalty because you've killed one of your own units", "Penalty", 25, "Score" ):ToRed() --- or --- MessageRED = MESSAGE:New( "To the RED Players: You receive a penalty because you've killed one of your own units", "Penalty", 25, "Score" ) --- MessageRED:ToRed() -function MESSAGE:ToRed( ) - self:F() - - self:ToCoalition( coalition.side.RED ) - - return self -end - ---- Sends a MESSAGE to a Coalition. --- @param #MESSAGE self --- @param CoalitionSide needs to be filled out by the defined structure of the standard scripting engine @{coalition.side}. --- @return #MESSAGE --- @usage --- -- Send a message created with the @{New} method to the RED coalition. --- MessageRED = MESSAGE:New( "To the RED Players: You receive a penalty because you've killed one of your own units", "Penalty", 25, "Score" ):ToCoalition( coalition.side.RED ) --- or --- MESSAGE:New( "To the RED Players: You receive a penalty because you've killed one of your own units", "Penalty", 25, "Score" ):ToCoalition( coalition.side.RED ) --- or --- MessageRED = MESSAGE:New( "To the RED Players: You receive a penalty because you've killed one of your own units", "Penalty", 25, "Score" ) --- MessageRED:ToCoalition( coalition.side.RED ) -function MESSAGE:ToCoalition( CoalitionSide ) - self:F( CoalitionSide ) - - if CoalitionSide then - self:T( self.MessageCategory .. self.MessageText:gsub("\n$",""):gsub("\n$","") .. " / " .. self.MessageDuration ) - trigger.action.outTextForCoalition( CoalitionSide, self.MessageCategory .. self.MessageText:gsub("\n$",""):gsub("\n$",""), self.MessageDuration ) - end - - return self -end - ---- Sends a MESSAGE to all players. --- @param #MESSAGE self --- @return #MESSAGE --- @usage --- -- Send a message created to all players. --- MessageAll = MESSAGE:New( "To all Players: BLUE has won! Each player of BLUE wins 50 points!", "End of Mission", 25, "Win" ):ToAll() --- or --- MESSAGE:New( "To all Players: BLUE has won! Each player of BLUE wins 50 points!", "End of Mission", 25, "Win" ):ToAll() --- or --- MessageAll = MESSAGE:New( "To all Players: BLUE has won! Each player of BLUE wins 50 points!", "End of Mission", 25, "Win" ) --- MessageAll:ToAll() -function MESSAGE:ToAll() - self:F() - - self:ToCoalition( coalition.side.RED ) - self:ToCoalition( coalition.side.BLUE ) - - return self -end - - - ---- The MESSAGEQUEUE class --- @type MESSAGEQUEUE -MESSAGEQUEUE = { - ClientGroups = {}, - CoalitionSides = {} -} - -function MESSAGEQUEUE:New( RefreshInterval ) - local self = BASE:Inherit( self, BASE:New() ) - self:F( { RefreshInterval } ) - - self.RefreshInterval = RefreshInterval - - --self.DisplayFunction = routines.scheduleFunction( self._DisplayMessages, { self }, 0, RefreshInterval ) - self.DisplayFunction = SCHEDULER:New( self, self._DisplayMessages, {}, 0, RefreshInterval ) - - return self -end - ---- This function is called automatically by the MESSAGEQUEUE scheduler. -function MESSAGEQUEUE:_DisplayMessages() - - -- First we display all messages that a coalition needs to receive... Also those who are not in a client (CA module clients...). - for CoalitionSideID, CoalitionSideData in pairs( self.CoalitionSides ) do - for MessageID, MessageData in pairs( CoalitionSideData.Messages ) do - if MessageData.MessageSent == false then - --trigger.action.outTextForCoalition( CoalitionSideID, MessageData.MessageCategory .. '\n' .. MessageData.MessageText:gsub("\n$",""):gsub("\n$",""), MessageData.MessageDuration ) - MessageData.MessageSent = true - end - local MessageTimeLeft = ( MessageData.MessageTime + MessageData.MessageDuration ) - timer.getTime() - if MessageTimeLeft <= 0 then - MessageData = nil - end - end - end - - -- Then we send the messages for each individual client, but also to be included are those Coalition messages for the Clients who belong to a coalition. - -- Because the Client messages will overwrite the Coalition messages (for that Client). - for ClientGroupName, ClientGroupData in pairs( self.ClientGroups ) do - for MessageID, MessageData in pairs( ClientGroupData.Messages ) do - if MessageData.MessageGroup == false then - trigger.action.outTextForGroup( Group.getByName(ClientGroupName):getID(), MessageData.MessageCategory .. '\n' .. MessageData.MessageText:gsub("\n$",""):gsub("\n$",""), MessageData.MessageDuration ) - MessageData.MessageGroup = true - end - local MessageTimeLeft = ( MessageData.MessageTime + MessageData.MessageDuration ) - timer.getTime() - if MessageTimeLeft <= 0 then - MessageData = nil - end - end - - -- Now check if the Client also has messages that belong to the Coalition of the Client... - for CoalitionSideID, CoalitionSideData in pairs( self.CoalitionSides ) do - for MessageID, MessageData in pairs( CoalitionSideData.Messages ) do - local CoalitionGroup = Group.getByName( ClientGroupName ) - if CoalitionGroup and CoalitionGroup:getCoalition() == CoalitionSideID then - if MessageData.MessageCoalition == false then - trigger.action.outTextForGroup( Group.getByName(ClientGroupName):getID(), MessageData.MessageCategory .. '\n' .. MessageData.MessageText:gsub("\n$",""):gsub("\n$",""), MessageData.MessageDuration ) - MessageData.MessageCoalition = true - end - end - local MessageTimeLeft = ( MessageData.MessageTime + MessageData.MessageDuration ) - timer.getTime() - if MessageTimeLeft <= 0 then - MessageData = nil - end - end - end - end - - return true -end - ---- The _MessageQueue object is created when the MESSAGE class module is loaded. ---_MessageQueue = MESSAGEQUEUE:New( 0.5 ) - ---- Stages within a @{TASK} within a @{MISSION}. All of the STAGE functionality is considered internally administered and not to be used by any Mission designer. --- @module STAGE --- @author Flightcontrol - -Include.File( "Routines" ) -Include.File( "Base" ) -Include.File( "Mission" ) -Include.File( "Client" ) -Include.File( "Task" ) - ---- The STAGE class --- @type -STAGE = { - ClassName = "STAGE", - MSG = { ID = "None", TIME = 10 }, - FREQUENCY = { NONE = 0, ONCE = 1, REPEAT = -1 }, - - Name = "NoStage", - StageType = '', - WaitTime = 1, - Frequency = 1, - MessageCount = 0, - MessageInterval = 15, - MessageShown = {}, - MessageShow = false, - MessageFlash = false -} - - -function STAGE:New() - local self = BASE:Inherit( self, BASE:New() ) - self:F() - return self -end - -function STAGE:Execute( Mission, Client, Task ) - - local Valid = true - - return Valid -end - -function STAGE:Executing( Mission, Client, Task ) - -end - -function STAGE:Validate( Mission, Client, Task ) - local Valid = true - - return Valid -end - - -STAGEBRIEF = { - ClassName = "BRIEF", - MSG = { ID = "Brief", TIME = 1 }, - Name = "Brief", - StageBriefingTime = 0, - StageBriefingDuration = 1 -} - -function STAGEBRIEF:New() - local self = BASE:Inherit( self, STAGE:New() ) - self:F() - self.StageType = 'CLIENT' - return self -end - ---- Execute --- @param #STAGEBRIEF self --- @param Mission#MISSION Mission --- @param Client#CLIENT Client --- @param Task#TASK Task --- @return #boolean -function STAGEBRIEF:Execute( Mission, Client, Task ) - local Valid = BASE:Inherited(self):Execute( Mission, Client, Task ) - self:F() - Client:ShowMissionBriefing( Mission.MissionBriefing ) - self.StageBriefingTime = timer.getTime() - return Valid -end - -function STAGEBRIEF:Validate( Mission, Client, Task ) - local Valid = STAGE:Validate( Mission, Client, Task ) - self:T() - - if timer.getTime() - self.StageBriefingTime <= self.StageBriefingDuration then - return 0 - else - self.StageBriefingTime = timer.getTime() - return 1 - end - -end - - -STAGESTART = { - ClassName = "START", - MSG = { ID = "Start", TIME = 1 }, - Name = "Start", - StageStartTime = 0, - StageStartDuration = 1 -} - -function STAGESTART:New() - local self = BASE:Inherit( self, STAGE:New() ) - self:F() - self.StageType = 'CLIENT' - return self -end - -function STAGESTART:Execute( Mission, Client, Task ) - self:F() - local Valid = BASE:Inherited(self):Execute( Mission, Client, Task ) - if Task.TaskBriefing then - Client:Message( Task.TaskBriefing, 30, Mission.Name .. "/Stage", "Command" ) - else - Client:Message( 'Task ' .. Task.TaskNumber .. '.', 30, Mission.Name .. "/Stage", "Command" ) - end - self.StageStartTime = timer.getTime() - return Valid -end - -function STAGESTART:Validate( Mission, Client, Task ) - self:F() - local Valid = STAGE:Validate( Mission, Client, Task ) - - if timer.getTime() - self.StageStartTime <= self.StageStartDuration then - return 0 - else - self.StageStartTime = timer.getTime() - return 1 - end - - return 1 - -end - -STAGE_CARGO_LOAD = { - ClassName = "STAGE_CARGO_LOAD" -} - -function STAGE_CARGO_LOAD:New() - local self = BASE:Inherit( self, STAGE:New() ) - self:F() - self.StageType = 'CLIENT' - return self -end - -function STAGE_CARGO_LOAD:Execute( Mission, Client, Task ) - self:F() - local Valid = BASE:Inherited(self):Execute( Mission, Client, Task ) - - for LoadCargoID, LoadCargo in pairs( Task.Cargos.LoadCargos ) do - LoadCargo:Load( Client ) - end - - if Mission.MissionReportFlash and Client:IsTransport() then - Client:ShowCargo() - end - - return Valid -end - -function STAGE_CARGO_LOAD:Validate( Mission, Client, Task ) - self:F() - local Valid = STAGE:Validate( Mission, Client, Task ) - - return 1 -end - - -STAGE_CARGO_INIT = { - ClassName = "STAGE_CARGO_INIT" -} - -function STAGE_CARGO_INIT:New() - local self = BASE:Inherit( self, STAGE:New() ) - self:F() - self.StageType = 'CLIENT' - return self -end - -function STAGE_CARGO_INIT:Execute( Mission, Client, Task ) - self:F() - local Valid = BASE:Inherited(self):Execute( Mission, Client, Task ) - - for InitLandingZoneID, InitLandingZone in pairs( Task.LandingZones.LandingZones ) do - self:T( InitLandingZone ) - InitLandingZone:Spawn() - end - - - self:T( Task.Cargos.InitCargos ) - for InitCargoID, InitCargoData in pairs( Task.Cargos.InitCargos ) do - self:T( { InitCargoData } ) - InitCargoData:Spawn( Client ) - end - - return Valid -end - - -function STAGE_CARGO_INIT:Validate( Mission, Client, Task ) - self:F() - local Valid = STAGE:Validate( Mission, Client, Task ) - - return 1 -end - - - -STAGEROUTE = { - ClassName = "STAGEROUTE", - MSG = { ID = "Route", TIME = 5 }, - Frequency = STAGE.FREQUENCY.REPEAT, - Name = "Route" -} - -function STAGEROUTE:New() - local self = BASE:Inherit( self, STAGE:New() ) - self:F() - self.StageType = 'CLIENT' - self.MessageSwitch = true - return self -end - - ---- Execute the routing. --- @param #STAGEROUTE self --- @param Mission#MISSION Mission --- @param Client#CLIENT Client --- @param Task#TASK Task -function STAGEROUTE:Execute( Mission, Client, Task ) - self:F() - local Valid = BASE:Inherited(self):Execute( Mission, Client, Task ) - - local RouteMessage = "Fly to: " - self:T( Task.LandingZones ) - for LandingZoneID, LandingZoneName in pairs( Task.LandingZones.LandingZoneNames ) do - RouteMessage = RouteMessage .. "\n " .. LandingZoneName .. ' at ' .. routines.getBRStringZone( { zone = LandingZoneName, ref = Client:GetClientGroupDCSUnit():getPoint(), true, true } ) .. ' km.' - end - - if Client:IsMultiSeated() then - Client:Message( RouteMessage, self.MSG.TIME, Mission.Name .. "/StageRoute", "Co-Pilot", 20 ) - else - Client:Message( RouteMessage, self.MSG.TIME, Mission.Name .. "/StageRoute", "Command", 20 ) - end - - - if Mission.MissionReportFlash and Client:IsTransport() then - Client:ShowCargo() - end - - return Valid -end - -function STAGEROUTE:Validate( Mission, Client, Task ) - self:F() - local Valid = STAGE:Validate( Mission, Client, Task ) - - -- check if the Client is in the landing zone - self:T( Task.LandingZones.LandingZoneNames ) - Task.CurrentLandingZoneName = routines.IsUnitNearZonesRadius( Client:GetClientGroupDCSUnit(), Task.LandingZones.LandingZoneNames, 500 ) - - if Task.CurrentLandingZoneName then - - Task.CurrentLandingZone = Task.LandingZones.LandingZones[Task.CurrentLandingZoneName].CargoZone - Task.CurrentCargoZone = Task.LandingZones.LandingZones[Task.CurrentLandingZoneName] - - if Task.CurrentCargoZone then - if not Task.Signalled then - Task.Signalled = Task.CurrentCargoZone:Signal() - end - end - - self:T( 1 ) - return 1 - end - - self:T( 0 ) - return 0 -end - - - -STAGELANDING = { - ClassName = "STAGELANDING", - MSG = { ID = "Landing", TIME = 10 }, - Name = "Landing", - Signalled = false -} - -function STAGELANDING:New() - local self = BASE:Inherit( self, STAGE:New() ) - self:F() - self.StageType = 'CLIENT' - return self -end - ---- Execute the landing coordination. --- @param #STAGELANDING self --- @param Mission#MISSION Mission --- @param Client#CLIENT Client --- @param Task#TASK Task -function STAGELANDING:Execute( Mission, Client, Task ) - self:F() - - if Client:IsMultiSeated() then - Client:Message( "We have arrived at the landing zone.", self.MSG.TIME, Mission.Name .. "/StageArrived", "Co-Pilot", 10 ) - else - Client:Message( "You have arrived at the landing zone.", self.MSG.TIME, Mission.Name .. "/StageArrived", "Command", 10 ) - end - - Task.HostUnit = Task.CurrentCargoZone:GetHostUnit() - - self:T( { Task.HostUnit } ) - - if Task.HostUnit then - - Task.HostUnitName = Task.HostUnit:GetPrefix() - Task.HostUnitTypeName = Task.HostUnit:GetTypeName() - - local HostMessage = "" - Task.CargoNames = "" - - local IsFirst = true - - for CargoID, Cargo in pairs( CARGOS ) do - if Cargo.CargoType == Task.CargoType then - - if Cargo:IsLandingRequired() then - self:T( "Task for cargo " .. Cargo.CargoType .. " requires landing.") - Task.IsLandingRequired = true - end - - if Cargo:IsSlingLoad() then - self:T( "Task for cargo " .. Cargo.CargoType .. " is a slingload.") - Task.IsSlingLoad = true - end - - if IsFirst then - IsFirst = false - Task.CargoNames = Task.CargoNames .. Cargo.CargoName .. "( " .. Cargo.CargoWeight .. " )" - else - Task.CargoNames = Task.CargoNames .. "; " .. Cargo.CargoName .. "( " .. Cargo.CargoWeight .. " )" - end - end - end - - if Task.IsLandingRequired then - HostMessage = "Land the helicopter to " .. Task.TEXT[1] .. " " .. Task.CargoNames .. "." - else - HostMessage = "Use the Radio menu and F6 to find the cargo, then fly or land near the cargo and " .. Task.TEXT[1] .. " " .. Task.CargoNames .. "." - end - - local Host = "Command" - if Task.HostUnitName then - Host = Task.HostUnitName .. " (" .. Task.HostUnitTypeName .. ")" - else - if Client:IsMultiSeated() then - Host = "Co-Pilot" - end - end - - Client:Message( HostMessage, self.MSG.TIME, Mission.Name .. "/STAGELANDING.EXEC." .. Host, Host, 10 ) - - end -end - -function STAGELANDING:Validate( Mission, Client, Task ) - self:F() - - Task.CurrentLandingZoneName = routines.IsUnitNearZonesRadius( Client:GetClientGroupDCSUnit(), Task.LandingZones.LandingZoneNames, 500 ) - if Task.CurrentLandingZoneName then - - -- Client is in de landing zone. - self:T( Task.CurrentLandingZoneName ) - - Task.CurrentLandingZone = Task.LandingZones.LandingZones[Task.CurrentLandingZoneName].CargoZone - Task.CurrentCargoZone = Task.LandingZones.LandingZones[Task.CurrentLandingZoneName] - - if Task.CurrentCargoZone then - if not Task.Signalled then - Task.Signalled = Task.CurrentCargoZone:Signal() - end - end - else - if Task.CurrentLandingZone then - Task.CurrentLandingZone = nil - end - if Task.CurrentCargoZone then - Task.CurrentCargoZone = nil - end - Task.Signalled = false - Task:RemoveCargoMenus( Client ) - self:T( -1 ) - return -1 - end - - - local DCSUnitVelocityVec3 = Client:GetClientGroupDCSUnit():getVelocity() - local DCSUnitVelocity = ( DCSUnitVelocityVec3.x ^2 + DCSUnitVelocityVec3.y ^2 + DCSUnitVelocityVec3.z ^2 ) ^ 0.5 - - local DCSUnitPointVec3 = Client:GetClientGroupDCSUnit():getPoint() - local LandHeight = land.getHeight( { x = DCSUnitPointVec3.x, y = DCSUnitPointVec3.z } ) - local DCSUnitHeight = DCSUnitPointVec3.y - LandHeight - - self:T( { Task.IsLandingRequired, Client:GetClientGroupDCSUnit():inAir() } ) - if Task.IsLandingRequired and not Client:GetClientGroupDCSUnit():inAir() then - self:T( 1 ) - Task.IsInAirTestRequired = true - return 1 - end - - self:T( { DCSUnitVelocity, DCSUnitHeight, LandHeight, Task.CurrentCargoZone.SignalHeight } ) - if Task.IsLandingRequired and DCSUnitVelocity <= 0.05 and DCSUnitHeight <= Task.CurrentCargoZone.SignalHeight then - self:T( 1 ) - Task.IsInAirTestRequired = false - return 1 - end - - self:T( 0 ) - return 0 -end - -STAGELANDED = { - ClassName = "STAGELANDED", - MSG = { ID = "Land", TIME = 10 }, - Name = "Landed", - MenusAdded = false -} - -function STAGELANDED:New() - local self = BASE:Inherit( self, STAGE:New() ) - self:F() - self.StageType = 'CLIENT' - return self -end - -function STAGELANDED:Execute( Mission, Client, Task ) - self:F() - - if Task.IsLandingRequired then - - local Host = "Command" - if Task.HostUnitName then - Host = Task.HostUnitName .. " (" .. Task.HostUnitTypeName .. ")" - else - if Client:IsMultiSeated() then - Host = "Co-Pilot" - end - end - - Client:Message( 'You have landed within the landing zone. Use the radio menu (F10) to ' .. Task.TEXT[1] .. ' the ' .. Task.CargoType .. '.', - self.MSG.TIME, Mission.Name .. "/STAGELANDED.EXEC" .. Host, Host ) - - if not self.MenusAdded then - Task.Cargo = nil - Task:RemoveCargoMenus( Client ) - Task:AddCargoMenus( Client, CARGOS, 250 ) - end - end -end - - - -function STAGELANDED:Validate( Mission, Client, Task ) - self:F() - - if not routines.IsUnitNearZonesRadius( Client:GetClientGroupDCSUnit(), Task.CurrentLandingZoneName, 500 ) then - self:T( "Client is not anymore in the landing zone, go back to stage Route, and remove cargo menus." ) - Task.Signalled = false - Task:RemoveCargoMenus( Client ) - self:T( -2 ) - return -2 - end - - local DCSUnitVelocityVec3 = Client:GetClientGroupDCSUnit():getVelocity() - local DCSUnitVelocity = ( DCSUnitVelocityVec3.x ^2 + DCSUnitVelocityVec3.y ^2 + DCSUnitVelocityVec3.z ^2 ) ^ 0.5 - - local DCSUnitPointVec3 = Client:GetClientGroupDCSUnit():getPoint() - local LandHeight = land.getHeight( { x = DCSUnitPointVec3.x, y = DCSUnitPointVec3.z } ) - local DCSUnitHeight = DCSUnitPointVec3.y - LandHeight - - self:T( { Task.IsLandingRequired, Client:GetClientGroupDCSUnit():inAir() } ) - if Task.IsLandingRequired and Task.IsInAirTestRequired == true and Client:GetClientGroupDCSUnit():inAir() then - self:T( "Client went back in the air. Go back to stage Landing." ) - self:T( -1 ) - return -1 - end - - self:T( { DCSUnitVelocity, DCSUnitHeight, LandHeight, Task.CurrentCargoZone.SignalHeight } ) - if Task.IsLandingRequired and Task.IsInAirTestRequired == false and DCSUnitVelocity >= 2 and DCSUnitHeight >= Task.CurrentCargoZone.SignalHeight then - self:T( "It seems the Client went back in the air and over the boundary limits. Go back to stage Landing." ) - self:T( -1 ) - return -1 - end - - -- Wait until cargo is selected from the menu. - if Task.IsLandingRequired then - if not Task.Cargo then - self:T( 0 ) - return 0 - end - end - - self:T( 1 ) - return 1 -end - -STAGEUNLOAD = { - ClassName = "STAGEUNLOAD", - MSG = { ID = "Unload", TIME = 10 }, - Name = "Unload" -} - -function STAGEUNLOAD:New() - local self = BASE:Inherit( self, STAGE:New() ) - self:F() - self.StageType = 'CLIENT' - return self -end - ---- Coordinate UnLoading --- @param #STAGEUNLOAD self --- @param Mission#MISSION Mission --- @param Client#CLIENT Client --- @param Task#TASK Task -function STAGEUNLOAD:Execute( Mission, Client, Task ) - self:F() - - if Client:IsMultiSeated() then - Client:Message( 'The ' .. Task.CargoType .. ' are being ' .. Task.TEXT[2] .. ' within the landing zone. Wait until the helicopter is ' .. Task.TEXT[3] .. '.', - self.MSG.TIME, Mission.Name .. "/StageUnLoad", "Co-Pilot" ) - else - Client:Message( 'You are unloading the ' .. Task.CargoType .. ' ' .. Task.TEXT[2] .. ' within the landing zone. Wait until the helicopter is ' .. Task.TEXT[3] .. '.', - self.MSG.TIME, Mission.Name .. "/StageUnLoad", "Command" ) - end - Task:RemoveCargoMenus( Client ) -end - -function STAGEUNLOAD:Executing( Mission, Client, Task ) - self:F() - env.info( 'STAGEUNLOAD:Executing() Task.Cargo.CargoName = ' .. Task.Cargo.CargoName ) - - local TargetZoneName - - if Task.TargetZoneName then - TargetZoneName = Task.TargetZoneName - else - TargetZoneName = Task.CurrentLandingZoneName - end - - if Task.Cargo:UnLoad( Client, TargetZoneName ) then - Task.ExecuteStage = _TransportExecuteStage.SUCCESS - if Mission.MissionReportFlash then - Client:ShowCargo() - end - end -end - ---- Validate UnLoading --- @param #STAGEUNLOAD self --- @param Mission#MISSION Mission --- @param Client#CLIENT Client --- @param Task#TASK Task -function STAGEUNLOAD:Validate( Mission, Client, Task ) - self:F() - env.info( 'STAGEUNLOAD:Validate()' ) - - if routines.IsUnitNearZonesRadius( Client:GetClientGroupDCSUnit(), Task.CurrentLandingZoneName, 500 ) then - else - Task.ExecuteStage = _TransportExecuteStage.FAILED - Task:RemoveCargoMenus( Client ) - if Client:IsMultiSeated() then - Client:Message( 'The ' .. Task.CargoType .. " haven't been successfully " .. Task.TEXT[3] .. ' within the landing zone. Task and mission has failed.', - _TransportStageMsgTime.DONE, Mission.Name .. "/StageFailure", "Co-Pilot" ) - else - Client:Message( 'The ' .. Task.CargoType .. " haven't been successfully " .. Task.TEXT[3] .. ' within the landing zone. Task and mission has failed.', - _TransportStageMsgTime.DONE, Mission.Name .. "/StageFailure", "Command" ) - end - return 1 - end - - if not Client:GetClientGroupDCSUnit():inAir() then - else - Task.ExecuteStage = _TransportExecuteStage.FAILED - Task:RemoveCargoMenus( Client ) - if Client:IsMultiSeated() then - Client:Message( 'The ' .. Task.CargoType .. " haven't been successfully " .. Task.TEXT[3] .. ' within the landing zone. Task and mission has failed.', - _TransportStageMsgTime.DONE, Mission.Name .. "/StageFailure", "Co-Pilot" ) - else - Client:Message( 'The ' .. Task.CargoType .. " haven't been successfully " .. Task.TEXT[3] .. ' within the landing zone. Task and mission has failed.', - _TransportStageMsgTime.DONE, Mission.Name .. "/StageFailure", "Command" ) - end - return 1 - end - - if Task.ExecuteStage == _TransportExecuteStage.SUCCESS then - if Client:IsMultiSeated() then - Client:Message( 'The ' .. Task.CargoType .. ' have been sucessfully ' .. Task.TEXT[3] .. ' within the landing zone.', _TransportStageMsgTime.DONE, Mission.Name .. "/Stage", "Co-Pilot" ) - else - Client:Message( 'The ' .. Task.CargoType .. ' have been sucessfully ' .. Task.TEXT[3] .. ' within the landing zone.', _TransportStageMsgTime.DONE, Mission.Name .. "/Stage", "Command" ) - end - Task:RemoveCargoMenus( Client ) - Task.MissionTask:AddGoalCompletion( Task.MissionTask.GoalVerb, Task.CargoName, 1 ) -- We set the cargo as one more goal completed in the mission. - return 1 - end - - return 1 -end - -STAGELOAD = { - ClassName = "STAGELOAD", - MSG = { ID = "Load", TIME = 10 }, - Name = "Load" -} - -function STAGELOAD:New() - local self = BASE:Inherit( self, STAGE:New() ) - self:F() - self.StageType = 'CLIENT' - return self -end - -function STAGELOAD:Execute( Mission, Client, Task ) - self:F() - - if not Task.IsSlingLoad then - - local Host = "Command" - if Task.HostUnitName then - Host = Task.HostUnitName .. " (" .. Task.HostUnitTypeName .. ")" - else - if Client:IsMultiSeated() then - Host = "Co-Pilot" - end - end - - Client:Message( 'The ' .. Task.CargoType .. ' are being ' .. Task.TEXT[2] .. ' within the landing zone. Wait until the helicopter is ' .. Task.TEXT[3] .. '.', - _TransportStageMsgTime.EXECUTING, Mission.Name .. "/STAGELOAD.EXEC." .. Host, Host ) - - -- Route the cargo to the Carrier - - Task.Cargo:OnBoard( Client, Task.CurrentCargoZone, Task.OnBoardSide ) - Task.ExecuteStage = _TransportExecuteStage.EXECUTING - else - Task.ExecuteStage = _TransportExecuteStage.EXECUTING - end -end - -function STAGELOAD:Executing( Mission, Client, Task ) - self:F() - - -- If the Cargo is ready to be loaded, load it into the Client. - - local Host = "Command" - if Task.HostUnitName then - Host = Task.HostUnitName .. " (" .. Task.HostUnitTypeName .. ")" - else - if Client:IsMultiSeated() then - Host = "Co-Pilot" - end - end - - if not Task.IsSlingLoad then - self:T( Task.Cargo.CargoName) - - if Task.Cargo:OnBoarded( Client, Task.CurrentCargoZone ) then - - -- Load the Cargo onto the Client - Task.Cargo:Load( Client ) - - -- Message to the pilot that cargo has been loaded. - Client:Message( "The cargo " .. Task.Cargo.CargoName .. " has been loaded in our helicopter.", - 20, Mission.Name .. "/STAGELANDING.LOADING1." .. Host, Host ) - Task.ExecuteStage = _TransportExecuteStage.SUCCESS - - Client:ShowCargo() - end - else - Client:Message( "Hook the " .. Task.CargoNames .. " onto the helicopter " .. Task.TEXT[3] .. " within the landing zone.", - _TransportStageMsgTime.EXECUTING, Mission.Name .. "/STAGELOAD.LOADING.1." .. Host, Host , 10 ) - for CargoID, Cargo in pairs( CARGOS ) do - self:T( "Cargo.CargoName = " .. Cargo.CargoName ) - - if Cargo:IsSlingLoad() then - local CargoStatic = StaticObject.getByName( Cargo.CargoStaticName ) - if CargoStatic then - self:T( "Cargo is found in the DCS simulator.") - local CargoStaticPosition = CargoStatic:getPosition().p - self:T( "Cargo Position x = " .. CargoStaticPosition.x .. ", y = " .. CargoStaticPosition.y .. ", z = " .. CargoStaticPosition.z ) - local CargoStaticHeight = routines.GetUnitHeight( CargoStatic ) - if CargoStaticHeight > 5 then - self:T( "Cargo is airborne.") - Cargo:StatusLoaded() - Task.Cargo = Cargo - Client:Message( 'The Cargo has been successfully hooked onto the helicopter and is now being sling loaded. Fly outside the landing zone.', - self.MSG.TIME, Mission.Name .. "/STAGELANDING.LOADING.2." .. Host, Host ) - Task.ExecuteStage = _TransportExecuteStage.SUCCESS - break - end - else - self:T( "Cargo not found in the DCS simulator." ) - end - end - end - end - -end - -function STAGELOAD:Validate( Mission, Client, Task ) - self:F() - - self:T( "Task.CurrentLandingZoneName = " .. Task.CurrentLandingZoneName ) - - local Host = "Command" - if Task.HostUnitName then - Host = Task.HostUnitName .. " (" .. Task.HostUnitTypeName .. ")" - else - if Client:IsMultiSeated() then - Host = "Co-Pilot" - end - end - - if not Task.IsSlingLoad then - if not routines.IsUnitNearZonesRadius( Client:GetClientGroupDCSUnit(), Task.CurrentLandingZoneName, 500 ) then - Task:RemoveCargoMenus( Client ) - Task.ExecuteStage = _TransportExecuteStage.FAILED - Task.CargoName = nil - Client:Message( "The " .. Task.CargoType .. " loading has been aborted. You flew outside the pick-up zone while loading. ", - self.MSG.TIME, Mission.Name .. "/STAGELANDING.VALIDATE.1." .. Host, Host ) - self:T( -1 ) - return -1 - end - - local DCSUnitVelocityVec3 = Client:GetClientGroupDCSUnit():getVelocity() - local DCSUnitVelocity = ( DCSUnitVelocityVec3.x ^2 + DCSUnitVelocityVec3.y ^2 + DCSUnitVelocityVec3.z ^2 ) ^ 0.5 - - local DCSUnitPointVec3 = Client:GetClientGroupDCSUnit():getPoint() - local LandHeight = land.getHeight( { x = DCSUnitPointVec3.x, y = DCSUnitPointVec3.z } ) - local DCSUnitHeight = DCSUnitPointVec3.y - LandHeight - - self:T( { Task.IsLandingRequired, Client:GetClientGroupDCSUnit():inAir() } ) - if Task.IsLandingRequired and Task.IsInAirTestRequired == true and Client:GetClientGroupDCSUnit():inAir() then - Task:RemoveCargoMenus( Client ) - Task.ExecuteStage = _TransportExecuteStage.FAILED - Task.CargoName = nil - Client:Message( "The " .. Task.CargoType .. " loading has been aborted. Re-start the " .. Task.TEXT[3] .. " process. Don't fly outside the pick-up zone.", - self.MSG.TIME, Mission.Name .. "/STAGELANDING.VALIDATE.1." .. Host, Host ) - self:T( -1 ) - return -1 - end - - self:T( { DCSUnitVelocity, DCSUnitHeight, LandHeight, Task.CurrentCargoZone.SignalHeight } ) - if Task.IsLandingRequired and Task.IsInAirTestRequired == false and DCSUnitVelocity >= 2 and DCSUnitHeight >= Task.CurrentCargoZone.SignalHeight then - Task:RemoveCargoMenus( Client ) - Task.ExecuteStage = _TransportExecuteStage.FAILED - Task.CargoName = nil - Client:Message( "The " .. Task.CargoType .. " loading has been aborted. Re-start the " .. Task.TEXT[3] .. " process. Don't fly outside the pick-up zone.", - self.MSG.TIME, Mission.Name .. "/STAGELANDING.VALIDATE.1." .. Host, Host ) - self:T( -1 ) - return -1 - end - - if Task.ExecuteStage == _TransportExecuteStage.SUCCESS then - Task:RemoveCargoMenus( Client ) - Client:Message( "Good Job. The " .. Task.CargoType .. " has been sucessfully " .. Task.TEXT[3] .. " within the landing zone.", - self.MSG.TIME, Mission.Name .. "/STAGELANDING.VALIDATE.3." .. Host, Host ) - Task.MissionTask:AddGoalCompletion( Task.MissionTask.GoalVerb, Task.CargoName, 1 ) - self:T( 1 ) - return 1 - end - - else - if Task.ExecuteStage == _TransportExecuteStage.SUCCESS then - CargoStatic = StaticObject.getByName( Task.Cargo.CargoStaticName ) - if CargoStatic and not routines.IsStaticInZones( CargoStatic, Task.CurrentLandingZoneName ) then - Client:Message( "Good Job. The " .. Task.CargoType .. " has been sucessfully " .. Task.TEXT[3] .. " and flown outside of the landing zone.", - self.MSG.TIME, Mission.Name .. "/STAGELANDING.VALIDATE.4." .. Host, Host ) - Task.MissionTask:AddGoalCompletion( Task.MissionTask.GoalVerb, Task.Cargo.CargoName, 1 ) - self:T( 1 ) - return 1 - end - end - - end - - - self:T( 0 ) - return 0 -end - - -STAGEDONE = { - ClassName = "STAGEDONE", - MSG = { ID = "Done", TIME = 10 }, - Name = "Done" -} - -function STAGEDONE:New() - local self = BASE:Inherit( self, STAGE:New() ) - self:F() - self.StageType = 'AI' - return self -end - -function STAGEDONE:Execute( Mission, Client, Task ) - self:F() - -end - -function STAGEDONE:Validate( Mission, Client, Task ) - self:F() - - Task:Done() - - return 0 -end - -STAGEARRIVE = { - ClassName = "STAGEARRIVE", - MSG = { ID = "Arrive", TIME = 10 }, - Name = "Arrive" -} - -function STAGEARRIVE:New() - local self = BASE:Inherit( self, STAGE:New() ) - self:F() - self.StageType = 'CLIENT' - return self -end - - ---- Execute Arrival --- @param #STAGEARRIVE self --- @param Mission#MISSION Mission --- @param Client#CLIENT Client --- @param Task#TASK Task -function STAGEARRIVE:Execute( Mission, Client, Task ) - self:F() - - if Client:IsMultiSeated() then - Client:Message( 'We have arrived at ' .. Task.CurrentLandingZoneName .. ".", self.MSG.TIME, Mission.Name .. "/Stage", "Co-Pilot" ) - else - Client:Message( 'We have arrived at ' .. Task.CurrentLandingZoneName .. ".", self.MSG.TIME, Mission.Name .. "/Stage", "Command" ) - end - -end - -function STAGEARRIVE:Validate( Mission, Client, Task ) - self:F() - - Task.CurrentLandingZoneID = routines.IsUnitInZones( Client:GetClientGroupDCSUnit(), Task.LandingZones ) - if ( Task.CurrentLandingZoneID ) then - else - return -1 - end - - return 1 -end - -STAGEGROUPSDESTROYED = { - ClassName = "STAGEGROUPSDESTROYED", - DestroyGroupSize = -1, - Frequency = STAGE.FREQUENCY.REPEAT, - MSG = { ID = "DestroyGroup", TIME = 10 }, - Name = "GroupsDestroyed" -} - -function STAGEGROUPSDESTROYED:New() - local self = BASE:Inherit( self, STAGE:New() ) - self:F() - self.StageType = 'AI' - return self -end - ---function STAGEGROUPSDESTROYED:Execute( Mission, Client, Task ) --- --- Client:Message( 'Task: Still ' .. DestroyGroupSize .. " of " .. Task.DestroyGroupCount .. " " .. Task.DestroyGroupType .. " to be destroyed!", self.MSG.TIME, Mission.Name .. "/Stage" ) --- ---end - -function STAGEGROUPSDESTROYED:Validate( Mission, Client, Task ) - self:F() - - if Task.MissionTask:IsGoalReached() then - return 1 - else - return 0 - end -end - -function STAGEGROUPSDESTROYED:Execute( Mission, Client, Task ) - self:F() - self:T( { Task.ClassName, Task.Destroyed } ) - --env.info( 'Event Table Task = ' .. tostring(Task) ) - -end - - - - - - - - - - - - - ---[[ - _TransportStage: Defines the different stages of which of transport missions can be in. This table is internal and is used to control the sequence of messages, actions and flow. - - - _TransportStage.START - - _TransportStage.ROUTE - - _TransportStage.LAND - - _TransportStage.EXECUTE - - _TransportStage.DONE - - _TransportStage.REMOVE ---]] -_TransportStage = { - HOLD = "HOLD", - START = "START", - ROUTE = "ROUTE", - LANDING = "LANDING", - LANDED = "LANDED", - EXECUTING = "EXECUTING", - LOAD = "LOAD", - UNLOAD = "UNLOAD", - DONE = "DONE", - NEXT = "NEXT" -} - -_TransportStageMsgTime = { - HOLD = 10, - START = 60, - ROUTE = 5, - LANDING = 10, - LANDED = 30, - EXECUTING = 30, - LOAD = 30, - UNLOAD = 30, - DONE = 30, - NEXT = 0 -} - -_TransportStageTime = { - HOLD = 10, - START = 5, - ROUTE = 5, - LANDING = 1, - LANDED = 1, - EXECUTING = 5, - LOAD = 5, - UNLOAD = 5, - DONE = 1, - NEXT = 0 -} - -_TransportStageAction = { - REPEAT = -1, - NONE = 0, - ONCE = 1 -} ---- The TASK Classes define major end-to-end activities within a MISSION. The TASK Class is the Master Class to orchestrate these activities. From this class, many concrete TASK classes are inherited. --- @module TASK - -Include.File( "Routines" ) -Include.File( "Base" ) -Include.File( "Mission" ) -Include.File( "Client" ) -Include.File( "Stage" ) - ---- The TASK class --- @type TASK --- @extends Base#BASE -TASK = { - - -- Defines the different signal types with a Task. - SIGNAL = { - COLOR = { - RED = { ID = 1, COLOR = trigger.smokeColor.Red, TEXT = "A red" }, - GREEN = { ID = 2, COLOR = trigger.smokeColor.Green, TEXT = "A green" }, - BLUE = { ID = 3, COLOR = trigger.smokeColor.Blue, TEXT = "A blue" }, - WHITE = { ID = 4, COLOR = trigger.smokeColor.White, TEXT = "A white" }, - ORANGE = { ID = 5, COLOR = trigger.smokeColor.Orange, TEXT = "An orange" } - }, - TYPE = { - SMOKE = { ID = 1, TEXT = "smoke" }, - FLARE = { ID = 2, TEXT = "flare" } - } - }, - ClassName = "TASK", - Mission = {}, -- Owning mission of the Task - Name = '', - Stages = {}, - Stage = {}, - Cargos = { - InitCargos = {}, - LoadCargos = {} - }, - LandingZones = { - LandingZoneNames = {}, - LandingZones = {} - }, - ActiveStage = 0, - TaskDone = false, - TaskFailed = false, - GoalTasks = {} -} - ---- Instantiates a new TASK Base. Should never be used. Interface Class. --- @return TASK -function TASK:New() - local self = BASE:Inherit( self, BASE:New() ) - self:F() - - -- assign Task default values during construction - self.TaskBriefing = "Task: No Task." - self.Time = timer.getTime() - self.ExecuteStage = _TransportExecuteStage.NONE - - return self -end - -function TASK:SetStage( StageSequenceIncrement ) - self:F( { StageSequenceIncrement } ) - - local Valid = false - if StageSequenceIncrement ~= 0 then - self.ActiveStage = self.ActiveStage + StageSequenceIncrement - if 1 <= self.ActiveStage and self.ActiveStage <= #self.Stages then - self.Stage = self.Stages[self.ActiveStage] - self:T( { self.Stage.Name } ) - self.Frequency = self.Stage.Frequency - Valid = true - else - Valid = false - env.info( "TASK:SetStage() self.ActiveStage is smaller or larger than self.Stages array. self.ActiveStage = " .. self.ActiveStage ) - end - end - self.Time = timer.getTime() - return Valid -end - -function TASK:Init() - self:F() - self.ActiveStage = 0 - self:SetStage(1) - self.TaskDone = false - self.TaskFailed = false -end - - ---- Get progress of a TASK. --- @return string GoalsText -function TASK:GetGoalProgress() - self:F2() - - local GoalsText = "" - for GoalVerb, GoalVerbData in pairs( self.GoalTasks ) do - local Goals = self:GetGoalCompletion( GoalVerb ) - if Goals and Goals ~= "" then - Goals = '(' .. Goals .. ')' - else - Goals = '( - )' - end - GoalsText = GoalsText .. GoalVerb .. ': ' .. self:GetGoalCount(GoalVerb) .. ' goals ' .. Goals .. ' of ' .. self:GetGoalTotal(GoalVerb) .. ' goals completed (' .. self:GetGoalPercentage(GoalVerb) .. '%); ' - end - - if GoalsText == "" then - GoalsText = "( - )" - end - - return GoalsText -end - ---- Show progress of a TASK. --- @param MISSION Mission Group structure describing the Mission. --- @param CLIENT Client Group structure describing the Client. -function TASK:ShowGoalProgress( Mission, Client ) - self:F2() - - local GoalsText = "" - for GoalVerb, GoalVerbData in pairs( self.GoalTasks ) do - if Mission:IsCompleted() then - else - local Goals = self:GetGoalCompletion( GoalVerb ) - if Goals and Goals ~= "" then - else - Goals = "-" - end - GoalsText = GoalsText .. self:GetGoalProgress() - end - end - - if Mission.MissionReportFlash or Mission.MissionReportShow then - Client:Message( GoalsText, 10, "/TASKPROGRESS" .. self.ClassName, "Mission Command: Task Status", 30 ) - end -end - ---- Sets a TASK to status Done. -function TASK:Done() - self:F2() - self.TaskDone = true -end - ---- Returns if a TASK is done. --- @return bool -function TASK:IsDone() - self:F2( self.TaskDone ) - return self.TaskDone -end - ---- Sets a TASK to status failed. -function TASK:Failed() - self:F() - self.TaskFailed = true -end - ---- Returns if a TASk has failed. --- @return bool -function TASK:IsFailed() - self:F2( self.TaskFailed ) - return self.TaskFailed -end - -function TASK:Reset( Mission, Client ) - self:F2() - self.ExecuteStage = _TransportExecuteStage.NONE -end - ---- Returns the Goals of a TASK --- @return @table Goals -function TASK:GetGoals() - return self.GoalTasks -end - ---- Returns if a TASK has Goal(s). --- @param #TASK self --- @param #string GoalVerb is the name of the Goal of the TASK. --- @return bool -function TASK:Goal( GoalVerb ) - self:F2( { GoalVerb } ) - if not GoalVerb then - GoalVerb = self.GoalVerb - end - self:T2( {self.GoalTasks[GoalVerb] } ) - if self.GoalTasks[GoalVerb] and self.GoalTasks[GoalVerb].GoalTotal > 0 then - return true - else - return false - end -end - ---- Sets the total Goals to be achieved of the Goal Name --- @param number GoalTotal is the number of times the GoalVerb needs to be achieved. --- @param ?string GoalVerb is the name of the Goal of the TASK. If the GoalVerb is not given, then the default TASK Goals will be used. -function TASK:SetGoalTotal( GoalTotal, GoalVerb ) - self:F2( { GoalTotal, GoalVerb } ) - - if not GoalVerb then - GoalVerb = self.GoalVerb - end - self.GoalTasks[GoalVerb] = {} - self.GoalTasks[GoalVerb].Goals = {} - self.GoalTasks[GoalVerb].GoalTotal = GoalTotal - self.GoalTasks[GoalVerb].GoalCount = 0 - return self -end - ---- Gets the total of Goals to be achieved within the TASK of the GoalVerb. --- @param ?string GoalVerb is the name of the Goal of the TASK. If the GoalVerb is not given, then the default TASK Goals will be used. -function TASK:GetGoalTotal( GoalVerb ) - self:F2( { GoalVerb } ) - if not GoalVerb then - GoalVerb = self.GoalVerb - end - if self:Goal( GoalVerb ) then - return self.GoalTasks[GoalVerb].GoalTotal - else - return 0 - end -end - ---- Sets the total of Goals currently achieved within the TASK of the GoalVerb. --- @param number GoalCount is the total number of Goals achieved within the TASK. --- @param ?string GoalVerb is the name of the Goal of the TASK. If the GoalVerb is not given, then the default TASK Goals will be used. --- @return TASK -function TASK:SetGoalCount( GoalCount, GoalVerb ) - self:F2() - if not GoalVerb then - GoalVerb = self.GoalVerb - end - if self:Goal( GoalVerb) then - self.GoalTasks[GoalVerb].GoalCount = GoalCount - end - return self -end - ---- Increments the total of Goals currently achieved within the TASK of the GoalVerb, with the given GoalCountIncrease. --- @param number GoalCountIncrease is the number of new Goals achieved within the TASK. --- @param ?string GoalVerb is the name of the Goal of the TASK. If the GoalVerb is not given, then the default TASK Goals will be used. --- @return TASK -function TASK:IncreaseGoalCount( GoalCountIncrease, GoalVerb ) - self:F2( { GoalCountIncrease, GoalVerb } ) - if not GoalVerb then - GoalVerb = self.GoalVerb - end - if self:Goal( GoalVerb) then - self.GoalTasks[GoalVerb].GoalCount = self.GoalTasks[GoalVerb].GoalCount + GoalCountIncrease - end - return self -end - ---- Gets the total of Goals currently achieved within the TASK of the GoalVerb. --- @param ?string GoalVerb is the name of the Goal of the TASK. If the GoalVerb is not given, then the default TASK Goals will be used. --- @return TASK -function TASK:GetGoalCount( GoalVerb ) - self:F2() - if not GoalVerb then - GoalVerb = self.GoalVerb - end - if self:Goal( GoalVerb ) then - return self.GoalTasks[GoalVerb].GoalCount - else - return 0 - end -end - ---- Gets the percentage of Goals currently achieved within the TASK of the GoalVerb. --- @param ?string GoalVerb is the name of the Goal of the TASK. If the GoalVerb is not given, then the default TASK Goals will be used. --- @return TASK -function TASK:GetGoalPercentage( GoalVerb ) - self:F2() - if not GoalVerb then - GoalVerb = self.GoalVerb - end - if self:Goal( GoalVerb ) then - return math.floor( self:GetGoalCount( GoalVerb ) / self:GetGoalTotal( GoalVerb ) * 100 + .5 ) - else - return 100 - end -end - ---- Returns if all the Goals of the TASK were achieved. --- @return bool -function TASK:IsGoalReached() - self:F2() - - local GoalReached = true - - for GoalVerb, Goals in pairs( self.GoalTasks ) do - self:T2( { "GoalVerb", GoalVerb } ) - if self:Goal( GoalVerb ) then - local GoalToDo = self:GetGoalTotal( GoalVerb ) - self:GetGoalCount( GoalVerb ) - self:T2( "GoalToDo = " .. GoalToDo ) - if GoalToDo <= 0 then - else - GoalReached = false - break - end - else - break - end - end - - self:T( { GoalReached, self.GoalTasks } ) - return GoalReached -end - ---- Adds an Additional Goal for the TASK to be achieved. --- @param string GoalVerb is the name of the Goal of the TASK. --- @param string GoalTask is a text describing the Goal of the TASK to be achieved. --- @param number GoalIncrease is a number by which the Goal achievement is increasing. -function TASK:AddGoalCompletion( GoalVerb, GoalTask, GoalIncrease ) - self:F2( { GoalVerb, GoalTask, GoalIncrease } ) - - if self:Goal( GoalVerb ) then - self.GoalTasks[GoalVerb].Goals[#self.GoalTasks[GoalVerb].Goals+1] = GoalTask - self.GoalTasks[GoalVerb].GoalCount = self.GoalTasks[GoalVerb].GoalCount + GoalIncrease - end - return self -end - ---- Returns if the additional Goal for the TASK was completed. --- @param ?string GoalVerb is the name of the Goal of the TASK. If the GoalVerb is not given, then the default TASK Goals will be used. --- @return string Goals -function TASK:GetGoalCompletion( GoalVerb ) - self:F2( { GoalVerb } ) - - if self:Goal( GoalVerb ) then - local Goals = "" - for GoalID, GoalName in pairs( self.GoalTasks[GoalVerb].Goals ) do Goals = Goals .. GoalName .. " + " end - return Goals:gsub(" + $", ""), self.GoalTasks[GoalVerb].GoalCount - end -end - -function TASK.MenuAction( Parameter ) - Parameter.ReferenceTask.ExecuteStage = _TransportExecuteStage.EXECUTING - Parameter.ReferenceTask.Cargo = Parameter.CargoTask -end - -function TASK:StageExecute() - self:F() - - local Execute = false - - if self.Frequency == STAGE.FREQUENCY.REPEAT then - Execute = true - elseif self.Frequency == STAGE.FREQUENCY.NONE then - Execute = false - elseif self.Frequency >= 0 then - Execute = true - self.Frequency = self.Frequency - 1 - end - - return Execute - -end - ---- Work function to set signal events within a TASK. -function TASK:AddSignal( SignalUnitNames, SignalType, SignalColor, SignalHeight ) - self:F() - - local Valid = true - - if Valid then - if type( SignalUnitNames ) == "table" then - self.LandingZoneSignalUnitNames = SignalUnitNames - else - self.LandingZoneSignalUnitNames = { SignalUnitNames } - end - self.LandingZoneSignalType = SignalType - self.LandingZoneSignalColor = SignalColor - self.Signalled = false - if SignalHeight ~= nil then - self.LandingZoneSignalHeight = SignalHeight - else - self.LandingZoneSignalHeight = 0 - end - - if self.TaskBriefing then - self.TaskBriefing = self.TaskBriefing .. " " .. SignalColor.TEXT .. " " .. SignalType.TEXT .. " will be fired when entering the landing zone." - end - end - - return Valid -end - ---- When the CLIENT is approaching the landing zone, a RED SMOKE will be fired by an optional SignalUnitNames. --- @param table|string SignalUnitNames Name of the Group that will fire the signal. If this parameter is NIL, the signal will be fired from the center of the landing zone. --- @param number SignalHeight Altitude that the Signal should be fired... -function TASK:AddSmokeRed( SignalUnitNames, SignalHeight ) - self:F() - self:AddSignal( SignalUnitNames, TASK.SIGNAL.TYPE.SMOKE, TASK.SIGNAL.COLOR.RED, SignalHeight ) -end - ---- When the CLIENT is approaching the landing zone, a GREEN SMOKE will be fired by an optional SignalUnitNames. --- @param table|string SignalUnitNames Name of the Group that will fire the signal. If this parameter is NIL, the signal will be fired from the center of the landing zone. --- @param number SignalHeight Altitude that the Signal should be fired... -function TASK:AddSmokeGreen( SignalUnitNames, SignalHeight ) - self:F() - self:AddSignal( SignalUnitNames, TASK.SIGNAL.TYPE.SMOKE, TASK.SIGNAL.COLOR.GREEN, SignalHeight ) -end - ---- When the CLIENT is approaching the landing zone, a BLUE SMOKE will be fired by an optional SignalUnitNames. --- @param table|string SignalUnitNames Name of the Group that will fire the signal. If this parameter is NIL, the signal will be fired from the center of the landing zone. --- @param number SignalHeight Altitude that the Signal should be fired... -function TASK:AddSmokeBlue( SignalUnitNames, SignalHeight ) - self:F() - self:AddSignal( SignalUnitNames, TASK.SIGNAL.TYPE.SMOKE, TASK.SIGNAL.COLOR.BLUE, SignalHeight ) -end - ---- When the CLIENT is approaching the landing zone, a WHITE SMOKE will be fired by an optional SignalUnitNames. --- @param table|string SignalUnitNames Name of the Group that will fire the signal. If this parameter is NIL, the signal will be fired from the center of the landing zone. --- @param number SignalHeight Altitude that the Signal should be fired... -function TASK:AddSmokeWhite( SignalUnitNames, SignalHeight ) - self:F() - self:AddSignal( SignalUnitNames, TASK.SIGNAL.TYPE.SMOKE, TASK.SIGNAL.COLOR.WHITE, SignalHeight ) -end - ---- When the CLIENT is approaching the landing zone, an ORANGE SMOKE will be fired by an optional SignalUnitNames. --- @param table|string SignalUnitNames Name of the Group that will fire the signal. If this parameter is NIL, the signal will be fired from the center of the landing zone. --- @param number SignalHeight Altitude that the Signal should be fired... -function TASK:AddSmokeOrange( SignalUnitNames, SignalHeight ) - self:F() - self:AddSignal( SignalUnitNames, TASK.SIGNAL.TYPE.SMOKE, TASK.SIGNAL.COLOR.ORANGE, SignalHeight ) -end - ---- When the CLIENT is approaching the landing zone, a RED FLARE will be fired by an optional SignalUnitNames. --- @param table|string SignalUnitNames Name of the Group that will fire the signal. If this parameter is NIL, the signal will be fired from the center of the landing zone. --- @param number SignalHeight Altitude that the Signal should be fired... -function TASK:AddFlareRed( SignalUnitNames, SignalHeight ) - self:F() - self:AddSignal( SignalUnitNames, TASK.SIGNAL.TYPE.FLARE, TASK.SIGNAL.COLOR.RED, SignalHeight ) -end - ---- When the CLIENT is approaching the landing zone, a GREEN FLARE will be fired by an optional SignalUnitNames. --- @param table|string SignalUnitNames Name of the Group that will fire the signal. If this parameter is NIL, the signal will be fired from the center of the landing zone. --- @param number SignalHeight Altitude that the Signal should be fired... -function TASK:AddFlareGreen( SignalUnitNames, SignalHeight ) - self:F() - self:AddSignal( SignalUnitNames, TASK.SIGNAL.TYPE.FLARE, TASK.SIGNAL.COLOR.GREEN, SignalHeight ) -end - ---- When the CLIENT is approaching the landing zone, a BLUE FLARE will be fired by an optional SignalUnitNames. --- @param table|string SignalUnitNames Name of the Group that will fire the signal. If this parameter is NIL, the signal will be fired from the center of the landing zone. --- @param number SignalHeight Altitude that the Signal should be fired... -function TASK:AddFlareBlue( SignalUnitNames, SignalHeight ) - self:F() - self:AddSignal( SignalUnitNames, TASK.SIGNAL.TYPE.FLARE, TASK.SIGNAL.COLOR.BLUE, SignalHeight ) -end - ---- When the CLIENT is approaching the landing zone, a WHITE FLARE will be fired by an optional SignalUnitNames. --- @param table|string SignalUnitNames Name of the Group that will fire the signal. If this parameter is NIL, the signal will be fired from the center of the landing zone. --- @param number SignalHeight Altitude that the Signal should be fired... -function TASK:AddFlareWhite( SignalUnitNames, SignalHeight ) - self:F() - self:AddSignal( SignalUnitNames, TASK.SIGNAL.TYPE.FLARE, TASK.SIGNAL.COLOR.WHITE, SignalHeight ) -end - ---- When the CLIENT is approaching the landing zone, an ORANGE FLARE will be fired by an optional SignalUnitNames. --- @param table|string SignalUnitNames Name of the Group that will fire the signal. If this parameter is NIL, the signal will be fired from the center of the landing zone. --- @param number SignalHeight Altitude that the Signal should be fired... -function TASK:AddFlareOrange( SignalUnitNames, SignalHeight ) - self:F() - self:AddSignal( SignalUnitNames, TASK.SIGNAL.TYPE.FLARE, TASK.SIGNAL.COLOR.ORANGE, SignalHeight ) -end ---- A GOHOMETASK orchestrates the travel back to the home base, which is a specific zone defined within the ME. --- @module GOHOMETASK - -Include.File("Task") - ---- The GOHOMETASK class --- @type -GOHOMETASK = { - ClassName = "GOHOMETASK", -} - ---- Creates a new GOHOMETASK. --- @param table{string,...}|string LandingZones Table of Landing Zone names where Home(s) are located. --- @return GOHOMETASK -function GOHOMETASK:New( LandingZones ) - local self = BASE:Inherit( self, TASK:New() ) - self:F( { LandingZones } ) - local Valid = true - - Valid = routines.ValidateZone( LandingZones, "LandingZones", Valid ) - - if Valid then - self.Name = 'Fly Home' - self.TaskBriefing = "Task: Fly back to your home base. Your co-pilot will provide you with the directions (required flight angle in degrees) and the distance (in km) to your home base." - if type( LandingZones ) == "table" then - self.LandingZones = LandingZones - else - self.LandingZones = { LandingZones } - end - self.Stages = { STAGEBRIEF:New(), STAGESTART:New(), STAGEROUTE:New(), STAGEARRIVE:New(), STAGEDONE:New() } - self.SetStage( self, 1 ) - end - - return self -end ---- A DESTROYBASETASK will monitor the destruction of Groups and Units. This is a BASE class, other classes are derived from this class. --- @module DESTROYBASETASK --- @see DESTROYGROUPSTASK --- @see DESTROYUNITTYPESTASK --- @see DESTROY_RADARS_TASK - -Include.File("Task") - ---- The DESTROYBASETASK class --- @type DESTROYBASETASK -DESTROYBASETASK = { - ClassName = "DESTROYBASETASK", - Destroyed = 0, - GoalVerb = "Destroy", - DestroyPercentage = 100, -} - ---- Creates a new DESTROYBASETASK. --- @param #DESTROYBASETASK self --- @param #string DestroyGroupType Text describing the group to be destroyed. f.e. "Radar Installations", "Ships", "Vehicles", "Command Centers". --- @param #string DestroyUnitType Text describing the unit types to be destroyed. f.e. "SA-6", "Row Boats", "Tanks", "Tents". --- @param #list<#string> DestroyGroupPrefixes Table of Prefixes of the Groups to be destroyed before task is completed. --- @param #number DestroyPercentage defines the %-tage that needs to be destroyed to achieve mission success. eg. If in the Group there are 10 units, then a value of 75 would require 8 units to be destroyed from the Group to complete the @{TASK}. --- @return DESTROYBASETASK -function DESTROYBASETASK:New( DestroyGroupType, DestroyUnitType, DestroyGroupPrefixes, DestroyPercentage ) - local self = BASE:Inherit( self, TASK:New() ) - self:F() - - self.Name = 'Destroy' - self.Destroyed = 0 - self.DestroyGroupPrefixes = DestroyGroupPrefixes - self.DestroyGroupType = DestroyGroupType - self.DestroyUnitType = DestroyUnitType - if DestroyPercentage then - self.DestroyPercentage = DestroyPercentage - end - self.TaskBriefing = "Task: Destroy " .. DestroyGroupType .. "." - self.Stages = { STAGEBRIEF:New(), STAGESTART:New(), STAGEGROUPSDESTROYED:New(), STAGEDONE:New() } - self.SetStage( self, 1 ) - - return self -end - ---- Handle the S_EVENT_DEAD events to validate the destruction of units for the task monitoring. --- @param #DESTROYBASETASK self --- @param Event#EVENTDATA Event structure of MOOSE. -function DESTROYBASETASK:EventDead( Event ) - self:F( { Event } ) - - if Event.IniDCSUnit then - local DestroyUnit = Event.IniDCSUnit - local DestroyUnitName = Event.IniDCSUnitName - local DestroyGroup = Event.IniDCSGroup - local DestroyGroupName = Event.IniDCSGroupName - - --TODO: I need to fix here if 2 groups in the mission have a similar name with GroupPrefix equal, then i should differentiate for which group the goal was reached! - --I may need to test if for the goalverb that group goal was reached or something. Need to think about it a bit more ... - local UnitsDestroyed = 0 - for DestroyGroupPrefixID, DestroyGroupPrefix in pairs( self.DestroyGroupPrefixes ) do - self:T( DestroyGroupPrefix ) - if string.find( DestroyGroupName, DestroyGroupPrefix, 1, true ) then - self:T( BASE:Inherited(self).ClassName ) - UnitsDestroyed = self:ReportGoalProgress( DestroyGroup, DestroyUnit ) - self:T( UnitsDestroyed ) - end - end - - self:T( { UnitsDestroyed } ) - self:IncreaseGoalCount( UnitsDestroyed, self.GoalVerb ) - end - -end - ---- Validate task completeness of DESTROYBASETASK. --- @param DestroyGroup Group structure describing the group to be evaluated. --- @param DestroyUnit Unit structure describing the Unit to be evaluated. -function DESTROYBASETASK:ReportGoalProgress( DestroyGroup, DestroyUnit ) - self:F() - - return 0 -end ---- DESTROYGROUPSTASK --- @module DESTROYGROUPSTASK - -Include.File("DestroyBaseTask") - ---- The DESTROYGROUPSTASK class --- @type -DESTROYGROUPSTASK = { - ClassName = "DESTROYGROUPSTASK", - GoalVerb = "Destroy Groups", -} - ---- Creates a new DESTROYGROUPSTASK. --- @param #DESTROYGROUPSTASK self --- @param #string DestroyGroupType String describing the group to be destroyed. --- @param #string DestroyUnitType String describing the unit to be destroyed. --- @param #list<#string> DestroyGroupNames Table of string containing the name of the groups to be destroyed before task is completed. --- @param #number DestroyPercentage defines the %-tage that needs to be destroyed to achieve mission success. eg. If in the Group there are 10 units, then a value of 75 would require 8 units to be destroyed from the Group to complete the @{TASK}. ----@return DESTROYGROUPSTASK -function DESTROYGROUPSTASK:New( DestroyGroupType, DestroyUnitType, DestroyGroupNames, DestroyPercentage ) - local self = BASE:Inherit( self, DESTROYBASETASK:New( DestroyGroupType, DestroyUnitType, DestroyGroupNames, DestroyPercentage ) ) - self:F() - - self.Name = 'Destroy Groups' - self.GoalVerb = "Destroy " .. DestroyGroupType - - _EVENTDISPATCHER:OnDead( self.EventDead , self ) - _EVENTDISPATCHER:OnCrash( self.EventDead , self ) - - return self -end - ---- Report Goal Progress. --- @param #DESTROYGROUPSTASK self --- @param DCSGroup#Group DestroyGroup Group structure describing the group to be evaluated. --- @param DCSUnit#Unit DestroyUnit Unit structure describing the Unit to be evaluated. --- @return #number The DestroyCount reflecting the amount of units destroyed within the group. -function DESTROYGROUPSTASK:ReportGoalProgress( DestroyGroup, DestroyUnit ) - self:F( { DestroyGroup, DestroyUnit, self.DestroyPercentage } ) - - local DestroyGroupSize = DestroyGroup:getSize() - 1 -- When a DEAD event occurs, the getSize is still one larger than the destroyed unit. - local DestroyGroupInitialSize = DestroyGroup:getInitialSize() - self:T( { DestroyGroupSize, DestroyGroupInitialSize - ( DestroyGroupInitialSize * self.DestroyPercentage / 100 ) } ) - - local DestroyCount = 0 - if DestroyGroup then - if DestroyGroupSize <= DestroyGroupInitialSize - ( DestroyGroupInitialSize * self.DestroyPercentage / 100 ) then - DestroyCount = 1 - end - else - DestroyCount = 1 - end - - self:T( DestroyCount ) - - return DestroyCount -end ---- Task class to destroy radar installations. --- @module DESTROYRADARSTASK - -Include.File("DestroyBaseTask") - ---- The DESTROYRADARS class --- @type -DESTROYRADARSTASK = { - ClassName = "DESTROYRADARSTASK", - GoalVerb = "Destroy Radars" -} - ---- Creates a new DESTROYRADARSTASK. --- @param table{string,...} DestroyGroupNames Table of string containing the group names of which the radars are be destroyed. --- @return DESTROYRADARSTASK -function DESTROYRADARSTASK:New( DestroyGroupNames ) - local self = BASE:Inherit( self, DESTROYGROUPSTASK:New( 'radar installations', 'radars', DestroyGroupNames ) ) - self:F() - - self.Name = 'Destroy Radars' - - _EVENTDISPATCHER:OnDead( self.EventDead , self ) - - return self -end - ---- Report Goal Progress. --- @param Group DestroyGroup Group structure describing the group to be evaluated. --- @param Unit DestroyUnit Unit structure describing the Unit to be evaluated. -function DESTROYRADARSTASK:ReportGoalProgress( DestroyGroup, DestroyUnit ) - self:F( { DestroyGroup, DestroyUnit } ) - - local DestroyCount = 0 - if DestroyUnit and DestroyUnit:hasSensors( Unit.SensorType.RADAR, Unit.RadarType.AS ) then - if DestroyUnit and DestroyUnit:getLife() <= 1.0 then - self:T( 'Destroyed a radar' ) - DestroyCount = 1 - end - end - return DestroyCount -end ---- Set TASK to destroy certain unit types. --- @module DESTROYUNITTYPESTASK - -Include.File("DestroyBaseTask") - ---- The DESTROYUNITTYPESTASK class --- @type -DESTROYUNITTYPESTASK = { - ClassName = "DESTROYUNITTYPESTASK", - GoalVerb = "Destroy", -} - ---- Creates a new DESTROYUNITTYPESTASK. --- @param string DestroyGroupType String describing the group to be destroyed. f.e. "Radar Installations", "Fleet", "Batallion", "Command Centers". --- @param string DestroyUnitType String describing the unit to be destroyed. f.e. "radars", "ships", "tanks", "centers". --- @param table{string,...} DestroyGroupNames Table of string containing the group names of which the radars are be destroyed. --- @param string DestroyUnitTypes Table of string containing the type names of the units to achieve mission success. --- @return DESTROYUNITTYPESTASK -function DESTROYUNITTYPESTASK:New( DestroyGroupType, DestroyUnitType, DestroyGroupNames, DestroyUnitTypes ) - local self = BASE:Inherit( self, DESTROYBASETASK:New( DestroyGroupType, DestroyUnitType, DestroyGroupNames ) ) - self:F( { DestroyGroupType, DestroyUnitType, DestroyGroupNames, DestroyUnitTypes } ) - - if type(DestroyUnitTypes) == 'table' then - self.DestroyUnitTypes = DestroyUnitTypes - else - self.DestroyUnitTypes = { DestroyUnitTypes } - end - - self.Name = 'Destroy Unit Types' - self.GoalVerb = "Destroy " .. DestroyGroupType - - _EVENTDISPATCHER:OnDead( self.EventDead , self ) - - return self -end - ---- Report Goal Progress. --- @param Group DestroyGroup Group structure describing the group to be evaluated. --- @param Unit DestroyUnit Unit structure describing the Unit to be evaluated. -function DESTROYUNITTYPESTASK:ReportGoalProgress( DestroyGroup, DestroyUnit ) - self:F( { DestroyGroup, DestroyUnit } ) - - local DestroyCount = 0 - for UnitTypeID, UnitType in pairs( self.DestroyUnitTypes ) do - if DestroyUnit and DestroyUnit:getTypeName() == UnitType then - if DestroyUnit and DestroyUnit:getLife() <= 1.0 then - DestroyCount = DestroyCount + 1 - end - end - end - return DestroyCount -end ---- A PICKUPTASK orchestrates the loading of CARGO at a specific landing zone. --- @module PICKUPTASK --- @parent TASK - -Include.File("Task") -Include.File("Cargo") - ---- The PICKUPTASK class --- @type -PICKUPTASK = { - ClassName = "PICKUPTASK", - TEXT = { "Pick-Up", "picked-up", "loaded" }, - GoalVerb = "Pick-Up" -} - ---- Creates a new PICKUPTASK. --- @param table{string,...}|string LandingZones Table of Zone names where Cargo is to be loaded. --- @param CARGO_TYPE CargoType Type of the Cargo. The type must be of the following Enumeration:.. --- @param number OnBoardSide Reflects from which side the cargo Group will be on-boarded on the Carrier. -function PICKUPTASK:New( CargoType, OnBoardSide ) - local self = BASE:Inherit( self, TASK:New() ) - self:F() - - -- self holds the inherited instance of the PICKUPTASK Class to the BASE class. - - local Valid = true - - if Valid then - self.Name = 'Pickup Cargo' - self.TaskBriefing = "Task: Fly to the indicated landing zones and pickup " .. CargoType .. ". Your co-pilot will provide you with the directions (required flight angle in degrees) and the distance (in km) to the pickup zone." - self.CargoType = CargoType - self.GoalVerb = CargoType .. " " .. self.GoalVerb - self.OnBoardSide = OnBoardSide - self.IsLandingRequired = true -- required to decide whether the client needs to land or not - self.IsSlingLoad = false -- Indicates whether the cargo is a sling load cargo - self.Stages = { STAGE_CARGO_INIT:New(), STAGE_CARGO_LOAD:New(), STAGEBRIEF:New(), STAGESTART:New(), STAGEROUTE:New(), STAGELANDING:New(), STAGELANDED:New(), STAGELOAD:New(), STAGEDONE:New() } - self.SetStage( self, 1 ) - end - - return self -end - -function PICKUPTASK:FromZone( LandingZone ) - self:F() - - self.LandingZones.LandingZoneNames[LandingZone.CargoZoneName] = LandingZone.CargoZoneName - self.LandingZones.LandingZones[LandingZone.CargoZoneName] = LandingZone - - return self -end - -function PICKUPTASK:InitCargo( InitCargos ) - self:F( { InitCargos } ) - - if type( InitCargos ) == "table" then - self.Cargos.InitCargos = InitCargos - else - self.Cargos.InitCargos = { InitCargos } - end - - return self -end - -function PICKUPTASK:LoadCargo( LoadCargos ) - self:F( { LoadCargos } ) - - if type( LoadCargos ) == "table" then - self.Cargos.LoadCargos = LoadCargos - else - self.Cargos.LoadCargos = { LoadCargos } - end - - return self -end - -function PICKUPTASK:AddCargoMenus( Client, Cargos, TransportRadius ) - self:F() - - for CargoID, Cargo in pairs( Cargos ) do - - self:T( { Cargo.ClassName, Cargo.CargoName, Cargo.CargoType, Cargo:IsStatusNone(), Cargo:IsStatusLoaded(), Cargo:IsStatusLoading(), Cargo:IsStatusUnLoaded() } ) - - -- If the Cargo has no status, allow the menu option. - if Cargo:IsStatusNone() or ( Cargo:IsStatusLoading() and Client == Cargo:IsLoadingToClient() ) then - - local MenuAdd = false - if Cargo:IsNear( Client, self.CurrentCargoZone ) then - MenuAdd = true - end - - if MenuAdd then - if Client._Menus[Cargo.CargoType] == nil then - Client._Menus[Cargo.CargoType] = {} - end - - if not Client._Menus[Cargo.CargoType].PickupMenu then - Client._Menus[Cargo.CargoType].PickupMenu = missionCommands.addSubMenuForGroup( - Client:GetClientGroupID(), - self.TEXT[1] .. " " .. Cargo.CargoType, - nil - ) - self:T( 'Added PickupMenu: ' .. self.TEXT[1] .. " " .. Cargo.CargoType ) - end - - if Client._Menus[Cargo.CargoType].PickupSubMenus == nil then - Client._Menus[Cargo.CargoType].PickupSubMenus = {} - end - - Client._Menus[Cargo.CargoType].PickupSubMenus[ #Client._Menus[Cargo.CargoType].PickupSubMenus + 1 ] = missionCommands.addCommandForGroup( - Client:GetClientGroupID(), - Cargo.CargoName .. " ( " .. Cargo.CargoWeight .. "kg )", - Client._Menus[Cargo.CargoType].PickupMenu, - self.MenuAction, - { ReferenceTask = self, CargoTask = Cargo } - ) - self:T( 'Added PickupSubMenu' .. Cargo.CargoType .. ":" .. Cargo.CargoName .. " ( " .. Cargo.CargoWeight .. "kg )" ) - end - end - end - -end - -function PICKUPTASK:RemoveCargoMenus( Client ) - self:F() - - for MenuID, MenuData in pairs( Client._Menus ) do - for SubMenuID, SubMenuData in pairs( MenuData.PickupSubMenus ) do - missionCommands.removeItemForGroup( Client:GetClientGroupID(), SubMenuData ) - self:T( "Removed PickupSubMenu " ) - SubMenuData = nil - end - if MenuData.PickupMenu then - missionCommands.removeItemForGroup( Client:GetClientGroupID(), MenuData.PickupMenu ) - self:T( "Removed PickupMenu " ) - MenuData.PickupMenu = nil - end - end - - for CargoID, Cargo in pairs( CARGOS ) do - self:T( { Cargo.ClassName, Cargo.CargoName, Cargo.CargoType, Cargo:IsStatusNone(), Cargo:IsStatusLoaded(), Cargo:IsStatusLoading(), Cargo:IsStatusUnLoaded() } ) - if Cargo:IsStatusLoading() and Client == Cargo:IsLoadingToClient() then - Cargo:StatusNone() - end - end - -end - - - -function PICKUPTASK:HasFailed( ClientDead ) - self:F() - - local TaskHasFailed = self.TaskFailed - return TaskHasFailed -end - ---- A DEPLOYTASK orchestrates the deployment of CARGO within a specific landing zone. --- @module DEPLOYTASK - -Include.File( "Task" ) - ---- A DeployTask --- @type DEPLOYTASK -DEPLOYTASK = { - ClassName = "DEPLOYTASK", - TEXT = { "Deploy", "deployed", "unloaded" }, - GoalVerb = "Deployment" -} - - ---- Creates a new DEPLOYTASK object, which models the sequence of STAGEs to unload a cargo. --- @function [parent=#DEPLOYTASK] New --- @param #string CargoType Type of the Cargo. --- @return #DEPLOYTASK The created DeployTask -function DEPLOYTASK:New( CargoType ) - local self = BASE:Inherit( self, TASK:New() ) - self:F() - - local Valid = true - - if Valid then - self.Name = 'Deploy Cargo' - self.TaskBriefing = "Fly to one of the indicated landing zones and deploy " .. CargoType .. ". Your co-pilot will provide you with the directions (required flight angle in degrees) and the distance (in km) to the deployment zone." - self.CargoType = CargoType - self.GoalVerb = CargoType .. " " .. self.GoalVerb - self.Stages = { STAGE_CARGO_INIT:New(), STAGE_CARGO_LOAD:New(), STAGEBRIEF:New(), STAGESTART:New(), STAGEROUTE:New(), STAGELANDING:New(), STAGELANDED:New(), STAGEUNLOAD:New(), STAGEDONE:New() } - self.SetStage( self, 1 ) - end - - return self -end - -function DEPLOYTASK:ToZone( LandingZone ) - self:F() - - self.LandingZones.LandingZoneNames[LandingZone.CargoZoneName] = LandingZone.CargoZoneName - self.LandingZones.LandingZones[LandingZone.CargoZoneName] = LandingZone - - return self -end - - -function DEPLOYTASK:InitCargo( InitCargos ) - self:F( { InitCargos } ) - - if type( InitCargos ) == "table" then - self.Cargos.InitCargos = InitCargos - else - self.Cargos.InitCargos = { InitCargos } - end - - return self -end - - -function DEPLOYTASK:LoadCargo( LoadCargos ) - self:F( { LoadCargos } ) - - if type( LoadCargos ) == "table" then - self.Cargos.LoadCargos = LoadCargos - else - self.Cargos.LoadCargos = { LoadCargos } - end - - return self -end - - ---- When the cargo is unloaded, it will move to the target zone name. --- @param string TargetZoneName Name of the Zone to where the Cargo should move after unloading. -function DEPLOYTASK:SetCargoTargetZoneName( TargetZoneName ) - self:F() - - local Valid = true - - Valid = routines.ValidateString( TargetZoneName, "TargetZoneName", Valid ) - - if Valid then - self.TargetZoneName = TargetZoneName - end - - return Valid - -end - -function DEPLOYTASK:AddCargoMenus( Client, Cargos, TransportRadius ) - self:F() - - local ClientGroupID = Client:GetClientGroupID() - - self:T( ClientGroupID ) - - for CargoID, Cargo in pairs( Cargos ) do - - self:T( { Cargo.ClassName, Cargo.CargoName, Cargo.CargoType, Cargo.CargoWeight } ) - - if Cargo:IsStatusLoaded() and Client == Cargo:IsLoadedInClient() then - - if Client._Menus[Cargo.CargoType] == nil then - Client._Menus[Cargo.CargoType] = {} - end - - if not Client._Menus[Cargo.CargoType].DeployMenu then - Client._Menus[Cargo.CargoType].DeployMenu = missionCommands.addSubMenuForGroup( - ClientGroupID, - self.TEXT[1] .. " " .. Cargo.CargoType, - nil - ) - self:T( 'Added DeployMenu ' .. self.TEXT[1] ) - end - - if Client._Menus[Cargo.CargoType].DeploySubMenus == nil then - Client._Menus[Cargo.CargoType].DeploySubMenus = {} - end - - if Client._Menus[Cargo.CargoType].DeployMenu == nil then - self:T( 'deploymenu is nil' ) - end - - Client._Menus[Cargo.CargoType].DeploySubMenus[ #Client._Menus[Cargo.CargoType].DeploySubMenus + 1 ] = missionCommands.addCommandForGroup( - ClientGroupID, - Cargo.CargoName .. " ( " .. Cargo.CargoWeight .. "kg )", - Client._Menus[Cargo.CargoType].DeployMenu, - self.MenuAction, - { ReferenceTask = self, CargoTask = Cargo } - ) - self:T( 'Added DeploySubMenu ' .. Cargo.CargoType .. ":" .. Cargo.CargoName .. " ( " .. Cargo.CargoWeight .. "kg )" ) - end - end - -end - -function DEPLOYTASK:RemoveCargoMenus( Client ) - self:F() - - local ClientGroupID = Client:GetClientGroupID() - self:T( ClientGroupID ) - - for MenuID, MenuData in pairs( Client._Menus ) do - if MenuData.DeploySubMenus ~= nil then - for SubMenuID, SubMenuData in pairs( MenuData.DeploySubMenus ) do - missionCommands.removeItemForGroup( ClientGroupID, SubMenuData ) - self:T( "Removed DeploySubMenu " ) - SubMenuData = nil - end - end - if MenuData.DeployMenu then - missionCommands.removeItemForGroup( ClientGroupID, MenuData.DeployMenu ) - self:T( "Removed DeployMenu " ) - MenuData.DeployMenu = nil - end - end - -end ---- A NOTASK is a dummy activity... But it will show a Mission Briefing... --- @module NOTASK - -Include.File("Task") - ---- The NOTASK class --- @type -NOTASK = { - ClassName = "NOTASK", -} - ---- Creates a new NOTASK. -function NOTASK:New() - local self = BASE:Inherit( self, TASK:New() ) - self:F() - - local Valid = true - - if Valid then - self.Name = 'Nothing' - self.TaskBriefing = "Task: Execute your mission." - self.Stages = { STAGEBRIEF:New(), STAGESTART:New(), STAGEDONE:New() } - self.SetStage( self, 1 ) - end - - return self -end ---- A ROUTETASK orchestrates the travel to a specific zone defined within the ME. --- @module ROUTETASK - ---- The ROUTETASK class --- @type -ROUTETASK = { - ClassName = "ROUTETASK", - GoalVerb = "Route", -} - ---- Creates a new ROUTETASK. --- @param table{sring,...}|string LandingZones Table of Zone Names where the target is located. --- @param string TaskBriefing (optional) Defines a text describing the briefing of the task. --- @return ROUTETASK -function ROUTETASK:New( LandingZones, TaskBriefing ) - local self = BASE:Inherit( self, TASK:New() ) - self:F( { LandingZones, TaskBriefing } ) - - local Valid = true - - Valid = routines.ValidateZone( LandingZones, "LandingZones", Valid ) - - if Valid then - self.Name = 'Route To Zone' - if TaskBriefing then - self.TaskBriefing = TaskBriefing .. " Your co-pilot will provide you with the directions (required flight angle in degrees) and the distance (in km) to the target objective." - else - self.TaskBriefing = "Task: Fly to specified zone(s). Your co-pilot will provide you with the directions (required flight angle in degrees) and the distance (in km) to the target objective." - end - if type( LandingZones ) == "table" then - self.LandingZones = LandingZones - else - self.LandingZones = { LandingZones } - end - self.Stages = { STAGEBRIEF:New(), STAGESTART:New(), STAGEROUTE:New(), STAGEARRIVE:New(), STAGEDONE:New() } - self.SetStage( self, 1 ) - end - - return self -end - ---- A MISSION is the main owner of a Mission orchestration within MOOSE . The Mission framework orchestrates @{CLIENT}s, @{TASK}s, @{STAGE}s etc. --- A @{CLIENT} needs to be registered within the @{MISSION} through the function @{AddClient}. A @{TASK} needs to be registered within the @{MISSION} through the function @{AddTask}. --- @module Mission - -Include.File( "Routines" ) -Include.File( "Base" ) -Include.File( "Client" ) -Include.File( "Task" ) - ---- The MISSION class --- @type MISSION --- @extends Base#BASE --- @field #MISSION.Clients _Clients --- @field #string MissionBriefing -MISSION = { - ClassName = "MISSION", - Name = "", - MissionStatus = "PENDING", - _Clients = {}, - _Tasks = {}, - _ActiveTasks = {}, - GoalFunction = nil, - MissionReportTrigger = 0, - MissionProgressTrigger = 0, - MissionReportShow = false, - MissionReportFlash = false, - MissionTimeInterval = 0, - MissionCoalition = "", - SUCCESS = 1, - FAILED = 2, - REPEAT = 3, - _GoalTasks = {} -} - ---- @type MISSION.Clients --- @list - -function MISSION:Meta() - - local self = BASE:Inherit( self, BASE:New() ) - self:F() - - return self -end - ---- This is the main MISSION declaration method. Each Mission is like the master or a Mission orchestration between, Clients, Tasks, Stages etc. --- @param string MissionName is the name of the mission. This name will be used to reference the status of each mission by the players. --- @param string MissionPriority is a string indicating the "priority" of the Mission. f.e. "Primary", "Secondary" or "First", "Second". It is free format and up to the Mission designer to choose. There are no rules behind this field. --- @param string MissionBriefing is a string indicating the mission briefing to be shown when a player joins a @{CLIENT}. --- @param string MissionCoalition is a string indicating the coalition or party to which this mission belongs to. It is free format and can be chosen freely by the mission designer. Note that this field is not to be confused with the coalition concept of the ME. Examples of a Mission Coalition could be "NATO", "CCCP", "Intruders", "Terrorists"... --- @return MISSION --- @usage --- -- Declare a few missions. --- local Mission = MISSIONSCHEDULER.AddMission( 'Russia Transport Troops SA-6', 'Operational', 'Transport troops from the control center to one of the SA-6 SAM sites to activate their operation.', 'Russia' ) --- local Mission = MISSIONSCHEDULER.AddMission( 'Patriots', 'Primary', 'Our intelligence reports that 3 Patriot SAM defense batteries are located near Ruisi, Kvarhiti and Gori.', 'Russia' ) --- local Mission = MISSIONSCHEDULER.AddMission( 'Package Delivery', 'Operational', 'In order to be in full control of the situation, we need you to deliver a very important package at a secret location. Fly undetected through the NATO defenses and deliver the secret package. The secret agent is located at waypoint 4.', 'Russia' ) --- local Mission = MISSIONSCHEDULER.AddMission( 'Rescue General', 'Tactical', 'Our intelligence has received a remote signal behind Gori. We believe it is a very important Russian General that was captured by Georgia. Go out there and rescue him! Ensure you stay out of the battle zone, keep south. Waypoint 4 is the location of our Russian General.', 'Russia' ) --- local Mission = MISSIONSCHEDULER.AddMission( 'NATO Transport Troops', 'Operational', 'Transport 3 groups of air defense engineers from our barracks "Gold" and "Titan" to each patriot battery control center to activate our air defenses.', 'NATO' ) --- local Mission = MISSIONSCHEDULER.AddMission( 'SA-6 SAMs', 'Primary', 'Our intelligence reports that 3 SA-6 SAM defense batteries are located near Didmukha, Khetagurov and Berula. Eliminate the Russian SAMs.', 'NATO' ) --- local Mission = MISSIONSCHEDULER.AddMission( 'NATO Sling Load', 'Operational', 'Fly to the cargo pickup zone at Dzegvi or Kaspi, and sling the cargo to Soganlug airbase.', 'NATO' ) --- local Mission = MISSIONSCHEDULER.AddMission( 'Rescue secret agent', 'Tactical', 'In order to be in full control of the situation, we need you to rescue a secret agent from the woods behind enemy lines. Avoid the Russian defenses and rescue the agent. Keep south until Khasuri, and keep your eyes open for any SAM presence. The agent is located at waypoint 4 on your kneeboard.', 'NATO' ) -function MISSION:New( MissionName, MissionPriority, MissionBriefing, MissionCoalition ) - - self = MISSION:Meta() - self:T({ MissionName, MissionPriority, MissionBriefing, MissionCoalition }) - - local Valid = true - - Valid = routines.ValidateString( MissionName, "MissionName", Valid ) - Valid = routines.ValidateString( MissionPriority, "MissionPriority", Valid ) - Valid = routines.ValidateString( MissionBriefing, "MissionBriefing", Valid ) - Valid = routines.ValidateString( MissionCoalition, "MissionCoalition", Valid ) - - if Valid then - self.Name = MissionName - self.MissionPriority = MissionPriority - self.MissionBriefing = MissionBriefing - self.MissionCoalition = MissionCoalition - end - - return self -end - ---- Returns if a Mission has completed. --- @return bool -function MISSION:IsCompleted() - self:F() - return self.MissionStatus == "ACCOMPLISHED" -end - ---- Set a Mission to completed. -function MISSION:Completed() - self:F() - self.MissionStatus = "ACCOMPLISHED" - self:StatusToClients() -end - ---- Returns if a Mission is ongoing. --- treturn bool -function MISSION:IsOngoing() - self:F() - return self.MissionStatus == "ONGOING" -end - ---- Set a Mission to ongoing. -function MISSION:Ongoing() - self:F() - self.MissionStatus = "ONGOING" - --self:StatusToClients() -end - ---- Returns if a Mission is pending. --- treturn bool -function MISSION:IsPending() - self:F() - return self.MissionStatus == "PENDING" -end - ---- Set a Mission to pending. -function MISSION:Pending() - self:F() - self.MissionStatus = "PENDING" - self:StatusToClients() -end - ---- Returns if a Mission has failed. --- treturn bool -function MISSION:IsFailed() - self:F() - return self.MissionStatus == "FAILED" -end - ---- Set a Mission to failed. -function MISSION:Failed() - self:F() - self.MissionStatus = "FAILED" - self:StatusToClients() -end - ---- Send the status of the MISSION to all Clients. -function MISSION:StatusToClients() - self:F() - if self.MissionReportFlash then - for ClientID, Client in pairs( self._Clients ) do - Client:Message( self.MissionCoalition .. ' "' .. self.Name .. '": ' .. self.MissionStatus .. '! ( ' .. self.MissionPriority .. ' mission ) ', 10, self.Name .. '/Status', "Mission Command: Mission Status") - end - end -end - ---- Handles the reporting. After certain time intervals, a MISSION report MESSAGE will be shown to All Players. -function MISSION:ReportTrigger() - self:F() - - if self.MissionReportShow == true then - self.MissionReportShow = false - return true - else - if self.MissionReportFlash == true then - if timer.getTime() >= self.MissionReportTrigger then - self.MissionReportTrigger = timer.getTime() + self.MissionTimeInterval - return true - else - return false - end - else - return false - end - end -end - ---- Report the status of all MISSIONs to all active Clients. -function MISSION:ReportToAll() - self:F() - - local AlivePlayers = '' - for ClientID, Client in pairs( self._Clients ) do - if Client:GetDCSGroup() then - if Client:GetClientGroupDCSUnit() then - if Client:GetClientGroupDCSUnit():getLife() > 0.0 then - if AlivePlayers == '' then - AlivePlayers = ' Players: ' .. Client:GetClientGroupDCSUnit():getPlayerName() - else - AlivePlayers = AlivePlayers .. ' / ' .. Client:GetClientGroupDCSUnit():getPlayerName() - end - end - end - end - end - local Tasks = self:GetTasks() - local TaskText = "" - for TaskID, TaskData in pairs( Tasks ) do - TaskText = TaskText .. " - Task " .. TaskID .. ": " .. TaskData.Name .. ": " .. TaskData:GetGoalProgress() .. "\n" - end - MESSAGE:New( self.MissionCoalition .. ' "' .. self.Name .. '": ' .. self.MissionStatus .. ' ( ' .. self.MissionPriority .. ' mission )' .. AlivePlayers .. "\n" .. TaskText:gsub("\n$",""), "Mission Command: Mission Report", 10, self.Name .. '/Status'):ToAll() -end - - ---- Add a goal function to a MISSION. Goal functions are called when a @{TASK} within a mission has been completed. --- @param function GoalFunction is the function defined by the mission designer to evaluate whether a certain goal has been reached after a @{TASK} finishes within the @{MISSION}. A GoalFunction must accept 2 parameters: Mission, Client, which contains the current MISSION object and the current CLIENT object respectively. --- @usage --- PatriotActivation = { --- { "US SAM Patriot Zerti", false }, --- { "US SAM Patriot Zegduleti", false }, --- { "US SAM Patriot Gvleti", false } --- } --- --- function DeployPatriotTroopsGoal( Mission, Client ) --- --- --- -- Check if the cargo is all deployed for mission success. --- for CargoID, CargoData in pairs( Mission._Cargos ) do --- if Group.getByName( CargoData.CargoGroupName ) then --- CargoGroup = Group.getByName( CargoData.CargoGroupName ) --- if CargoGroup then --- -- Check if the cargo is ready to activate --- CurrentLandingZoneID = routines.IsUnitInZones( CargoGroup:getUnits()[1], Mission:GetTask( 2 ).LandingZones ) -- The second task is the Deploytask to measure mission success upon --- if CurrentLandingZoneID then --- if PatriotActivation[CurrentLandingZoneID][2] == false then --- -- Now check if this is a new Mission Task to be completed... --- trigger.action.setGroupAIOn( Group.getByName( PatriotActivation[CurrentLandingZoneID][1] ) ) --- PatriotActivation[CurrentLandingZoneID][2] = true --- MessageToBlue( "Mission Command: Message to all airborne units! The " .. PatriotActivation[CurrentLandingZoneID][1] .. " is armed. Our air defenses are now stronger.", 60, "BLUE/PatriotDefense" ) --- MessageToRed( "Mission Command: Our satellite systems are detecting additional NATO air defenses. To all airborne units: Take care!!!", 60, "RED/PatriotDefense" ) --- Mission:GetTask( 2 ):AddGoalCompletion( "Patriots activated", PatriotActivation[CurrentLandingZoneID][1], 1 ) -- Register Patriot activation as part of mission goal. --- end --- end --- end --- end --- end --- end --- --- local Mission = MISSIONSCHEDULER.AddMission( 'NATO Transport Troops', 'Operational', 'Transport 3 groups of air defense engineers from our barracks "Gold" and "Titan" to each patriot battery control center to activate our air defenses.', 'NATO' ) --- Mission:AddGoalFunction( DeployPatriotTroopsGoal ) -function MISSION:AddGoalFunction( GoalFunction ) - self:F() - self.GoalFunction = GoalFunction -end - ---- Register a new @{CLIENT} to participate within the mission. --- @param CLIENT Client is the @{CLIENT} object. The object must have been instantiated with @{CLIENT:New}. --- @return CLIENT --- @usage --- Add a number of Client objects to the Mission. --- Mission:AddClient( CLIENT:FindByName( 'US UH-1H*HOT-Deploy Troops 1', 'Transport 3 groups of air defense engineers from our barracks "Gold" and "Titan" to each patriot battery control center to activate our air defenses.' ):Transport() ) --- Mission:AddClient( CLIENT:FindByName( 'US UH-1H*RAMP-Deploy Troops 3', 'Transport 3 groups of air defense engineers from our barracks "Gold" and "Titan" to each patriot battery control center to activate our air defenses.' ):Transport() ) --- Mission:AddClient( CLIENT:FindByName( 'US UH-1H*HOT-Deploy Troops 2', 'Transport 3 groups of air defense engineers from our barracks "Gold" and "Titan" to each patriot battery control center to activate our air defenses.' ):Transport() ) --- Mission:AddClient( CLIENT:FindByName( 'US UH-1H*RAMP-Deploy Troops 4', 'Transport 3 groups of air defense engineers from our barracks "Gold" and "Titan" to each patriot battery control center to activate our air defenses.' ):Transport() ) -function MISSION:AddClient( Client ) - self:F( { Client } ) - - local Valid = true - - if Valid then - self._Clients[Client.ClientName] = Client - end - - return Client -end - ---- Find a @{CLIENT} object within the @{MISSION} by its ClientName. --- @param CLIENT ClientName is a string defining the Client Group as defined within the ME. --- @return CLIENT --- @usage --- -- Seach for Client "Bomber" within the Mission. --- local BomberClient = Mission:FindClient( "Bomber" ) -function MISSION:FindClient( ClientName ) - self:F( { self._Clients[ClientName] } ) - return self._Clients[ClientName] -end - - ---- Register a @{TASK} to be completed within the @{MISSION}. Note that there can be multiple @{TASK}s registered to be completed. Each TASK can be set a certain Goal. The MISSION will not be completed until all Goals are reached. --- @param TASK Task is the @{TASK} object. The object must have been instantiated with @{TASK:New} or any of its inherited @{TASK}s. --- @param number TaskNumber is the sequence number of the TASK within the MISSION. This number does have to be chronological. --- @return TASK --- @usage --- -- Define a few tasks for the Mission. --- PickupZones = { "NATO Gold Pickup Zone", "NATO Titan Pickup Zone" } --- PickupSignalUnits = { "NATO Gold Coordination Center", "NATO Titan Coordination Center" } --- --- -- Assign the Pickup Task --- local PickupTask = PICKUPTASK:New( PickupZones, CARGO_TYPE.ENGINEERS, CLIENT.ONBOARDSIDE.LEFT ) --- PickupTask:AddSmokeBlue( PickupSignalUnits ) --- PickupTask:SetGoalTotal( 3 ) --- Mission:AddTask( PickupTask, 1 ) --- --- -- Assign the Deploy Task --- local PatriotActivationZones = { "US Patriot Battery 1 Activation", "US Patriot Battery 2 Activation", "US Patriot Battery 3 Activation" } --- local PatriotActivationZonesSmokeUnits = { "US SAM Patriot - Battery 1 Control", "US SAM Patriot - Battery 2 Control", "US SAM Patriot - Battery 3 Control" } --- local DeployTask = DEPLOYTASK:New( PatriotActivationZones, CARGO_TYPE.ENGINEERS ) --- --DeployTask:SetCargoTargetZoneName( 'US Troops Attack ' .. math.random(2) ) --- DeployTask:AddSmokeBlue( PatriotActivationZonesSmokeUnits ) --- DeployTask:SetGoalTotal( 3 ) --- DeployTask:SetGoalTotal( 3, "Patriots activated" ) --- Mission:AddTask( DeployTask, 2 ) - -function MISSION:AddTask( Task, TaskNumber ) - self:F() - - self._Tasks[TaskNumber] = Task - self._Tasks[TaskNumber]:EnableEvents() - self._Tasks[TaskNumber].ID = TaskNumber - - return Task - end - ---- Get the TASK idenified by the TaskNumber from the Mission. This function is useful in GoalFunctions. --- @param number TaskNumber is the number of the @{TASK} within the @{MISSION}. --- @return TASK --- @usage --- -- Get Task 2 from the Mission. --- Task2 = Mission:GetTask( 2 ) - -function MISSION:GetTask( TaskNumber ) - self:F() - - local Valid = true - - local Task = nil - - if type(TaskNumber) ~= "number" then - Valid = false - end - - if Valid then - Task = self._Tasks[TaskNumber] - end - - return Task -end - ---- Get all the TASKs from the Mission. This function is useful in GoalFunctions. --- @return {TASK,...} Structure of TASKS with the @{TASK} number as the key. --- @usage --- -- Get Tasks from the Mission. --- Tasks = Mission:GetTasks() --- env.info( "Task 2 Completion = " .. Tasks[2]:GetGoalPercentage() .. "%" ) -function MISSION:GetTasks() - self:F() - - return self._Tasks -end - - ---[[ - _TransportExecuteStage: Defines the different stages of Transport unload/load execution. This table is internal and is used to control the validity of Transport load/unload timing. - - - _TransportExecuteStage.EXECUTING - - _TransportExecuteStage.SUCCESS - - _TransportExecuteStage.FAILED - ---]] -_TransportExecuteStage = { - NONE = 0, - EXECUTING = 1, - SUCCESS = 2, - FAILED = 3 -} - - ---- The MISSIONSCHEDULER is an OBJECT and is the main scheduler of ALL active MISSIONs registered within this scheduler. It's workings are considered internal and is automatically created when the Mission.lua file is included. --- @type MISSIONSCHEDULER --- @field #MISSIONSCHEDULER.MISSIONS Missions -MISSIONSCHEDULER = { - Missions = {}, - MissionCount = 0, - TimeIntervalCount = 0, - TimeIntervalShow = 150, - TimeSeconds = 14400, - TimeShow = 5 -} - ---- @type MISSIONSCHEDULER.MISSIONS --- @list <#MISSION> Mission - ---- This is the main MISSIONSCHEDULER Scheduler function. It is considered internal and is automatically created when the Mission.lua file is included. -function MISSIONSCHEDULER.Scheduler() - - - -- loop through the missions in the TransportTasks - for MissionName, MissionData in pairs( MISSIONSCHEDULER.Missions ) do - - local Mission = MissionData -- #MISSION - - if not Mission:IsCompleted() then - - -- This flag will monitor if for this mission, there are clients alive. If this flag is still false at the end of the loop, the mission status will be set to Pending (if not Failed or Completed). - local ClientsAlive = false - - for ClientID, ClientData in pairs( Mission._Clients ) do - - local Client = ClientData -- Client#CLIENT - - if Client:IsAlive() then - - -- There is at least one Client that is alive... So the Mission status is set to Ongoing. - ClientsAlive = true - - -- If this Client was not registered as Alive before: - -- 1. We register the Client as Alive. - -- 2. We initialize the Client Tasks and make a link to the original Mission Task. - -- 3. We initialize the Cargos. - -- 4. We flag the Mission as Ongoing. - if not Client.ClientAlive then - Client.ClientAlive = true - Client.ClientBriefingShown = false - for TaskNumber, Task in pairs( Mission._Tasks ) do - -- Note that this a deepCopy. Each client must have their own Tasks with own Stages!!! - Client._Tasks[TaskNumber] = routines.utils.deepCopy( Mission._Tasks[TaskNumber] ) - -- Each MissionTask must point to the original Mission. - Client._Tasks[TaskNumber].MissionTask = Mission._Tasks[TaskNumber] - Client._Tasks[TaskNumber].Cargos = Mission._Tasks[TaskNumber].Cargos - Client._Tasks[TaskNumber].LandingZones = Mission._Tasks[TaskNumber].LandingZones - end - - Mission:Ongoing() - end - - - -- For each Client, check for each Task the state and evolve the mission. - -- This flag will indicate if the Task of the Client is Complete. - local TaskComplete = false - - for TaskNumber, Task in pairs( Client._Tasks ) do - - if not Task.Stage then - Task:SetStage( 1 ) - end - - - local TransportTime = timer.getTime() - - if not Task:IsDone() then - - if Task:Goal() then - Task:ShowGoalProgress( Mission, Client ) - end - - --env.info( 'Scheduler: Mission = ' .. Mission.Name .. ' / Client = ' .. Client.ClientName .. ' / Task = ' .. Task.Name .. ' / Stage = ' .. Task.ActiveStage .. ' - ' .. Task.Stage.Name .. ' - ' .. Task.Stage.StageType ) - - -- Action - if Task:StageExecute() then - Task.Stage:Execute( Mission, Client, Task ) - end - - -- Wait until execution is finished - if Task.ExecuteStage == _TransportExecuteStage.EXECUTING then - Task.Stage:Executing( Mission, Client, Task ) - end - - -- Validate completion or reverse to earlier stage - if Task.Time + Task.Stage.WaitTime <= TransportTime then - Task:SetStage( Task.Stage:Validate( Mission, Client, Task ) ) - end - - if Task:IsDone() then - --env.info( 'Scheduler: Mission '.. Mission.Name .. ' Task ' .. Task.Name .. ' Stage ' .. Task.Stage.Name .. ' done. TaskComplete = ' .. string.format ( "%s", TaskComplete and "true" or "false" ) ) - TaskComplete = true -- when a task is not yet completed, a mission cannot be completed - - else - -- break only if this task is not yet done, so that future task are not yet activated. - TaskComplete = false -- when a task is not yet completed, a mission cannot be completed - --env.info( 'Scheduler: Mission "'.. Mission.Name .. '" Task "' .. Task.Name .. '" Stage "' .. Task.Stage.Name .. '" break. TaskComplete = ' .. string.format ( "%s", TaskComplete and "true" or "false" ) ) - break - end - - if TaskComplete then - - if Mission.GoalFunction ~= nil then - Mission.GoalFunction( Mission, Client ) - end - if MISSIONSCHEDULER.Scoring then - MISSIONSCHEDULER.Scoring:_AddMissionTaskScore( Client:GetClientGroupDCSUnit(), Mission.Name, 25 ) - end - --- if not Mission:IsCompleted() then --- end - end - end - end - - local MissionComplete = true - for TaskNumber, Task in pairs( Mission._Tasks ) do - if Task:Goal() then --- Task:ShowGoalProgress( Mission, Client ) - if Task:IsGoalReached() then - else - MissionComplete = false - end - else - MissionComplete = false -- If there is no goal, the mission should never be ended. The goal status will be set somewhere else. - end - end - - if MissionComplete then - Mission:Completed() - if MISSIONSCHEDULER.Scoring then - MISSIONSCHEDULER.Scoring:_AddMissionScore( Mission.Name, 100 ) - end - else - if TaskComplete then - -- Reset for new tasking of active client - Client.ClientAlive = false -- Reset the client tasks. - end - end - - - else - if Client.ClientAlive then - env.info( 'Scheduler: Client "' .. Client.ClientName .. '" is inactive.' ) - Client.ClientAlive = false - - -- This is tricky. If we sanitize Client._Tasks before sanitizing Client._Tasks[TaskNumber].MissionTask, then the original MissionTask will be sanitized, and will be lost within the garbage collector. - -- So first sanitize Client._Tasks[TaskNumber].MissionTask, after that, sanitize only the whole _Tasks structure... - --Client._Tasks[TaskNumber].MissionTask = nil - --Client._Tasks = nil - end - end - end - - -- If all Clients of this Mission are not activated, then the Mission status needs to be put back into Pending status. - -- But only if the Mission was Ongoing. In case the Mission is Completed or Failed, the Mission status may not be changed. In these cases, this will be the last run of this Mission in the Scheduler. - if ClientsAlive == false then - if Mission:IsOngoing() then - -- Mission status back to pending... - Mission:Pending() - end - end - end - - Mission:StatusToClients() - - if Mission:ReportTrigger() then - Mission:ReportToAll() - end - end - - return true -end - ---- Start the MISSIONSCHEDULER. -function MISSIONSCHEDULER.Start() - if MISSIONSCHEDULER ~= nil then - --MISSIONSCHEDULER.SchedulerId = routines.scheduleFunction( MISSIONSCHEDULER.Scheduler, { }, 0, 2 ) - MISSIONSCHEDULER.SchedulerId = SCHEDULER:New( nil, MISSIONSCHEDULER.Scheduler, { }, 0, 2 ) - end -end - ---- Stop the MISSIONSCHEDULER. -function MISSIONSCHEDULER.Stop() - if MISSIONSCHEDULER.SchedulerId then - routines.removeFunction(MISSIONSCHEDULER.SchedulerId) - MISSIONSCHEDULER.SchedulerId = nil - end -end - ---- This is the main MISSION declaration method. Each Mission is like the master or a Mission orchestration between, Clients, Tasks, Stages etc. --- @param Mission is the MISSION object instantiated by @{MISSION:New}. --- @return MISSION --- @usage --- -- Declare a mission. --- Mission = MISSION:New( 'Russia Transport Troops SA-6', --- 'Operational', --- 'Transport troops from the control center to one of the SA-6 SAM sites to activate their operation.', --- 'Russia' ) --- MISSIONSCHEDULER:AddMission( Mission ) -function MISSIONSCHEDULER.AddMission( Mission ) - MISSIONSCHEDULER.Missions[Mission.Name] = Mission - MISSIONSCHEDULER.MissionCount = MISSIONSCHEDULER.MissionCount + 1 - -- Add an overall AI Client for the AI tasks... This AI Client will facilitate the Events in the background for each Task. - --MissionAdd:AddClient( CLIENT:Register( 'AI' ) ) - - return Mission -end - ---- Remove a MISSION from the MISSIONSCHEDULER. --- @param MissionName is the name of the MISSION given at declaration using @{AddMission}. --- @usage --- -- Declare a mission. --- Mission = MISSION:New( 'Russia Transport Troops SA-6', --- 'Operational', --- 'Transport troops from the control center to one of the SA-6 SAM sites to activate their operation.', --- 'Russia' ) --- MISSIONSCHEDULER:AddMission( Mission ) --- --- -- Now remove the Mission. --- MISSIONSCHEDULER:RemoveMission( 'Russia Transport Troops SA-6' ) -function MISSIONSCHEDULER.RemoveMission( MissionName ) - MISSIONSCHEDULER.Missions[MissionName] = nil - MISSIONSCHEDULER.MissionCount = MISSIONSCHEDULER.MissionCount - 1 -end - ---- Find a MISSION within the MISSIONSCHEDULER. --- @param MissionName is the name of the MISSION given at declaration using @{AddMission}. --- @return MISSION --- @usage --- -- Declare a mission. --- Mission = MISSION:New( 'Russia Transport Troops SA-6', --- 'Operational', --- 'Transport troops from the control center to one of the SA-6 SAM sites to activate their operation.', --- 'Russia' ) --- MISSIONSCHEDULER:AddMission( Mission ) --- --- -- Now find the Mission. --- MissionFind = MISSIONSCHEDULER:FindMission( 'Russia Transport Troops SA-6' ) -function MISSIONSCHEDULER.FindMission( MissionName ) - return MISSIONSCHEDULER.Missions[MissionName] -end - --- Internal function used by the MISSIONSCHEDULER menu. -function MISSIONSCHEDULER.ReportMissionsShow( ) - for MissionName, Mission in pairs( MISSIONSCHEDULER.Missions ) do - Mission.MissionReportShow = true - Mission.MissionReportFlash = false - end -end - --- Internal function used by the MISSIONSCHEDULER menu. -function MISSIONSCHEDULER.ReportMissionsFlash( TimeInterval ) - local Count = 0 - for MissionName, Mission in pairs( MISSIONSCHEDULER.Missions ) do - Mission.MissionReportShow = false - Mission.MissionReportFlash = true - Mission.MissionReportTrigger = timer.getTime() + Count * TimeInterval - Mission.MissionTimeInterval = MISSIONSCHEDULER.MissionCount * TimeInterval - env.info( "TimeInterval = " .. Mission.MissionTimeInterval ) - Count = Count + 1 - end -end - --- Internal function used by the MISSIONSCHEDULER menu. -function MISSIONSCHEDULER.ReportMissionsHide( Prm ) - for MissionName, Mission in pairs( MISSIONSCHEDULER.Missions ) do - Mission.MissionReportShow = false - Mission.MissionReportFlash = false - end -end - ---- Enables a MENU option in the communications menu under F10 to control the status of the active missions. --- This function should be called only once when starting the MISSIONSCHEDULER. -function MISSIONSCHEDULER.ReportMenu() - local ReportMenu = SUBMENU:New( 'Status' ) - local ReportMenuShow = COMMANDMENU:New( 'Show Report Missions', ReportMenu, MISSIONSCHEDULER.ReportMissionsShow, 0 ) - local ReportMenuFlash = COMMANDMENU:New('Flash Report Missions', ReportMenu, MISSIONSCHEDULER.ReportMissionsFlash, 120 ) - local ReportMenuHide = COMMANDMENU:New( 'Hide Report Missions', ReportMenu, MISSIONSCHEDULER.ReportMissionsHide, 0 ) -end - ---- Show the remaining mission time. -function MISSIONSCHEDULER:TimeShow() - self.TimeIntervalCount = self.TimeIntervalCount + 1 - if self.TimeIntervalCount >= self.TimeTriggerShow then - local TimeMsg = string.format("%00d", ( self.TimeSeconds / 60 ) - ( timer.getTime() / 60 )) .. ' minutes left until mission reload.' - MESSAGE:New( TimeMsg, "Mission time", self.TimeShow, '/TimeMsg' ):ToAll() - self.TimeIntervalCount = 0 - end -end - -function MISSIONSCHEDULER:Time( TimeSeconds, TimeIntervalShow, TimeShow ) - - self.TimeIntervalCount = 0 - self.TimeSeconds = TimeSeconds - self.TimeIntervalShow = TimeIntervalShow - self.TimeShow = TimeShow -end - ---- Adds a mission scoring to the game. -function MISSIONSCHEDULER:Scoring( Scoring ) - - self.Scoring = Scoring -end - ---- The CLEANUP class keeps an area clean of crashing or colliding airplanes. It also prevents airplanes from firing within this area. --- @module CleanUp --- @author Flightcontrol - -Include.File( "Routines" ) -Include.File( "Base" ) -Include.File( "Mission" ) -Include.File( "Client" ) -Include.File( "Task" ) - ---- The CLEANUP class. --- @type CLEANUP --- @extends Base#BASE -CLEANUP = { - ClassName = "CLEANUP", - ZoneNames = {}, - TimeInterval = 300, - CleanUpList = {}, -} - ---- Creates the main object which is handling the cleaning of the debris within the given Zone Names. --- @param #CLEANUP self --- @param #table ZoneNames Is a table of zone names where the debris should be cleaned. Also a single string can be passed with one zone name. --- @param #number TimeInterval The interval in seconds when the clean activity takes place. The default is 300 seconds, thus every 5 minutes. --- @return #CLEANUP --- @usage --- -- Clean these Zones. --- CleanUpAirports = CLEANUP:New( { 'CLEAN Tbilisi', 'CLEAN Kutaisi' }, 150 ) --- or --- CleanUpTbilisi = CLEANUP:New( 'CLEAN Tbilisi', 150 ) --- CleanUpKutaisi = CLEANUP:New( 'CLEAN Kutaisi', 600 ) -function CLEANUP:New( ZoneNames, TimeInterval ) local self = BASE:Inherit( self, BASE:New() ) - self:F( { ZoneNames, TimeInterval } ) - - if type( ZoneNames ) == 'table' then - self.ZoneNames = ZoneNames - else - self.ZoneNames = { ZoneNames } - end - if TimeInterval then - self.TimeInterval = TimeInterval - end - - _EVENTDISPATCHER:OnBirth( self._OnEventBirth, self ) - - --self.CleanUpScheduler = routines.scheduleFunction( self._CleanUpScheduler, { self }, timer.getTime() + 1, TimeInterval ) - self.CleanUpScheduler = SCHEDULER:New( self, self._CleanUpScheduler, {}, 1, TimeInterval ) - - return self -end - - ---- Destroys a group from the simulator, but checks first if it is still existing! --- @param #CLEANUP self --- @param DCSGroup#Group GroupObject The object to be destroyed. --- @param #string CleanUpGroupName The groupname... -function CLEANUP:_DestroyGroup( GroupObject, CleanUpGroupName ) - self:F( { GroupObject, CleanUpGroupName } ) - - if GroupObject then -- and GroupObject:isExist() then - --MESSAGE:New( "Destroy Group " .. CleanUpGroupName, CleanUpGroupName, 1, CleanUpGroupName ):ToAll() - trigger.action.deactivateGroup(GroupObject) - self:T( { "GroupObject Destroyed", GroupObject } ) - end -end - ---- Destroys a @{DCSUnit#Unit} from the simulator, but checks first if it is still existing! --- @param #CLEANUP self --- @param DCSUnit#Unit CleanUpUnit The object to be destroyed. --- @param #string CleanUpUnitName The Unit name ... -function CLEANUP:_DestroyUnit( CleanUpUnit, CleanUpUnitName ) - self:F( { CleanUpUnit, CleanUpUnitName } ) - - if CleanUpUnit then - --MESSAGE:New( "Destroy " .. CleanUpUnitName, CleanUpUnitName, 1, CleanUpUnitName ):ToAll() - local CleanUpGroup = Unit.getGroup(CleanUpUnit) - -- TODO Client bug in 1.5.3 - if CleanUpGroup and CleanUpGroup:isExist() then - local CleanUpGroupUnits = CleanUpGroup:getUnits() - if #CleanUpGroupUnits == 1 then - local CleanUpGroupName = CleanUpGroup:getName() - --self:CreateEventCrash( timer.getTime(), CleanUpUnit ) - CleanUpGroup:destroy() - self:T( { "Destroyed Group:", CleanUpGroupName } ) - else - CleanUpUnit:destroy() - self:T( { "Destroyed Unit:", CleanUpUnitName } ) - end - self.CleanUpList[CleanUpUnitName] = nil -- Cleaning from the list - CleanUpUnit = nil - end - end -end - --- TODO check DCSTypes#Weapon ---- Destroys a missile from the simulator, but checks first if it is still existing! --- @param #CLEANUP self --- @param DCSTypes#Weapon MissileObject -function CLEANUP:_DestroyMissile( MissileObject ) - self:F( { MissileObject } ) - - if MissileObject and MissileObject:isExist() then - MissileObject:destroy() - self:T( "MissileObject Destroyed") - end -end - -function CLEANUP:_OnEventBirth( Event ) - self:F( { Event } ) - - self.CleanUpList[Event.IniDCSUnitName] = {} - self.CleanUpList[Event.IniDCSUnitName].CleanUpUnit = Event.IniDCSUnit - self.CleanUpList[Event.IniDCSUnitName].CleanUpGroup = Event.IniDCSGroup - self.CleanUpList[Event.IniDCSUnitName].CleanUpGroupName = Event.IniDCSGroupName - self.CleanUpList[Event.IniDCSUnitName].CleanUpUnitName = Event.IniDCSUnitName - - _EVENTDISPATCHER:OnEngineShutDownForUnit( Event.IniDCSUnitName, self._EventAddForCleanUp, self ) - _EVENTDISPATCHER:OnEngineStartUpForUnit( Event.IniDCSUnitName, self._EventAddForCleanUp, self ) - _EVENTDISPATCHER:OnHitForUnit( Event.IniDCSUnitName, self._EventAddForCleanUp, self ) - _EVENTDISPATCHER:OnPilotDeadForUnit( Event.IniDCSUnitName, self._EventCrash, self ) - _EVENTDISPATCHER:OnDeadForUnit( Event.IniDCSUnitName, self._EventCrash, self ) - _EVENTDISPATCHER:OnCrashForUnit( Event.IniDCSUnitName, self._EventCrash, self ) - _EVENTDISPATCHER:OnShotForUnit( Event.IniDCSUnitName, self._EventShot, self ) - - --self:AddEvent( world.event.S_EVENT_ENGINE_SHUTDOWN, self._EventAddForCleanUp ) - --self:AddEvent( world.event.S_EVENT_ENGINE_STARTUP, self._EventAddForCleanUp ) --- self:AddEvent( world.event.S_EVENT_HIT, self._EventAddForCleanUp ) -- , self._EventHitCleanUp ) --- self:AddEvent( world.event.S_EVENT_CRASH, self._EventCrash ) -- , self._EventHitCleanUp ) --- --self:AddEvent( world.event.S_EVENT_DEAD, self._EventCrash ) --- self:AddEvent( world.event.S_EVENT_SHOT, self._EventShot ) --- --- self:EnableEvents() - - -end - ---- Detects if a crash event occurs. --- Crashed units go into a CleanUpList for removal. --- @param #CLEANUP self --- @param DCSTypes#Event event -function CLEANUP:_EventCrash( Event ) - self:F( { Event } ) - - --TODO: This stuff is not working due to a DCS bug. Burning units cannot be destroyed. - --MESSAGE:New( "Crash ", "Crash", 10, "Crash" ):ToAll() - -- self:T("before getGroup") - -- local _grp = Unit.getGroup(event.initiator)-- Identify the group that fired - -- self:T("after getGroup") - -- _grp:destroy() - -- self:T("after deactivateGroup") - -- event.initiator:destroy() - - self.CleanUpList[Event.IniDCSUnitName] = {} - self.CleanUpList[Event.IniDCSUnitName].CleanUpUnit = Event.IniDCSUnit - self.CleanUpList[Event.IniDCSUnitName].CleanUpGroup = Event.IniDCSGroup - self.CleanUpList[Event.IniDCSUnitName].CleanUpGroupName = Event.IniDCSGroupName - self.CleanUpList[Event.IniDCSUnitName].CleanUpUnitName = Event.IniDCSUnitName - -end - ---- Detects if a unit shoots a missile. --- If this occurs within one of the zones, then the weapon used must be destroyed. --- @param #CLEANUP self --- @param DCSTypes#Event event -function CLEANUP:_EventShot( Event ) - self:F( { Event } ) - - -- Test if the missile was fired within one of the CLEANUP.ZoneNames. - local CurrentLandingZoneID = 0 - CurrentLandingZoneID = routines.IsUnitInZones( Event.IniDCSUnit, self.ZoneNames ) - if ( CurrentLandingZoneID ) then - -- Okay, the missile was fired within the CLEANUP.ZoneNames, destroy the fired weapon. - --_SEADmissile:destroy() - --routines.scheduleFunction( CLEANUP._DestroyMissile, { self, Event.Weapon }, timer.getTime() + 0.1) - SCHEDULER:New( self, CLEANUP._DestroyMissile, { Event.Weapon }, 0.1 ) - end -end - - ---- Detects if the Unit has an S_EVENT_HIT within the given ZoneNames. If this is the case, destroy the unit. --- @param #CLEANUP self --- @param DCSTypes#Event event -function CLEANUP:_EventHitCleanUp( Event ) - self:F( { Event } ) - - if Event.IniDCSUnit then - if routines.IsUnitInZones( Event.IniDCSUnit, self.ZoneNames ) ~= nil then - self:T( { "Life: ", Event.IniDCSUnitName, ' = ', Event.IniDCSUnit:getLife(), "/", Event.IniDCSUnit:getLife0() } ) - if Event.IniDCSUnit:getLife() < Event.IniDCSUnit:getLife0() then - self:T( "CleanUp: Destroy: " .. Event.IniDCSUnitName ) - --routines.scheduleFunction( CLEANUP._DestroyUnit, { self, Event.IniDCSUnit }, timer.getTime() + 0.1) - SCHEDULER:New( self, CLEANUP._DestroyUnit, { Event.IniDCSUnit }, 0.1 ) - end - end - end - - if Event.TgtDCSUnit then - if routines.IsUnitInZones( Event.TgtDCSUnit, self.ZoneNames ) ~= nil then - self:T( { "Life: ", Event.TgtDCSUnitName, ' = ', Event.TgtDCSUnit:getLife(), "/", Event.TgtDCSUnit:getLife0() } ) - if Event.TgtDCSUnit:getLife() < Event.TgtDCSUnit:getLife0() then - self:T( "CleanUp: Destroy: " .. Event.TgtDCSUnitName ) - --routines.scheduleFunction( CLEANUP._DestroyUnit, { self, Event.TgtDCSUnit }, timer.getTime() + 0.1 ) - SCHEDULER:New( self, CLEANUP._DestroyUnit, { Event.TgtDCSUnit }, 0.1 ) - end - end - end -end - ---- Add the @{DCSUnit#Unit} to the CleanUpList for CleanUp. -function CLEANUP:_AddForCleanUp( CleanUpUnit, CleanUpUnitName ) - self:F( { CleanUpUnit, CleanUpUnitName } ) - - self.CleanUpList[CleanUpUnitName] = {} - self.CleanUpList[CleanUpUnitName].CleanUpUnit = CleanUpUnit - self.CleanUpList[CleanUpUnitName].CleanUpUnitName = CleanUpUnitName - self.CleanUpList[CleanUpUnitName].CleanUpGroup = Unit.getGroup(CleanUpUnit) - self.CleanUpList[CleanUpUnitName].CleanUpGroupName = Unit.getGroup(CleanUpUnit):getName() - self.CleanUpList[CleanUpUnitName].CleanUpTime = timer.getTime() - self.CleanUpList[CleanUpUnitName].CleanUpMoved = false - - self:T( { "CleanUp: Add to CleanUpList: ", Unit.getGroup(CleanUpUnit):getName(), CleanUpUnitName } ) - -end - ---- Detects if the Unit has an S_EVENT_ENGINE_SHUTDOWN or an S_EVENT_HIT within the given ZoneNames. If this is the case, add the Group to the CLEANUP List. --- @param #CLEANUP self --- @param DCSTypes#Event event -function CLEANUP:_EventAddForCleanUp( Event ) - - if Event.IniDCSUnit then - if self.CleanUpList[Event.IniDCSUnitName] == nil then - if routines.IsUnitInZones( Event.IniDCSUnit, self.ZoneNames ) ~= nil then - self:_AddForCleanUp( Event.IniDCSUnit, Event.IniDCSUnitName ) - end - end - end - - if Event.TgtDCSUnit then - if self.CleanUpList[Event.TgtDCSUnitName] == nil then - if routines.IsUnitInZones( Event.TgtDCSUnit, self.ZoneNames ) ~= nil then - self:_AddForCleanUp( Event.TgtDCSUnit, Event.TgtDCSUnitName ) - end - end - end - -end - -local CleanUpSurfaceTypeText = { - "LAND", - "SHALLOW_WATER", - "WATER", - "ROAD", - "RUNWAY" - } - ---- At the defined time interval, CleanUp the Groups within the CleanUpList. --- @param #CLEANUP self -function CLEANUP:_CleanUpScheduler() - self:F( { "CleanUp Scheduler" } ) - - local CleanUpCount = 0 - for CleanUpUnitName, UnitData in pairs( self.CleanUpList ) do - CleanUpCount = CleanUpCount + 1 - - self:T( { CleanUpUnitName, UnitData } ) - local CleanUpUnit = Unit.getByName(UnitData.CleanUpUnitName) - local CleanUpGroupName = UnitData.CleanUpGroupName - local CleanUpUnitName = UnitData.CleanUpUnitName - if CleanUpUnit then - self:T( { "CleanUp Scheduler", "Checking:", CleanUpUnitName } ) - if _DATABASE:GetStatusGroup( CleanUpGroupName ) ~= "ReSpawn" then - local CleanUpUnitVec3 = CleanUpUnit:getPoint() - --self:T( CleanUpUnitVec3 ) - local CleanUpUnitVec2 = {} - CleanUpUnitVec2.x = CleanUpUnitVec3.x - CleanUpUnitVec2.y = CleanUpUnitVec3.z - --self:T( CleanUpUnitVec2 ) - local CleanUpSurfaceType = land.getSurfaceType(CleanUpUnitVec2) - --self:T( CleanUpSurfaceType ) - --MESSAGE:New( "Surface " .. CleanUpUnitName .. " = " .. CleanUpSurfaceTypeText[CleanUpSurfaceType], CleanUpUnitName, 10, CleanUpUnitName ):ToAll() - - if CleanUpUnit and CleanUpUnit:getLife() <= CleanUpUnit:getLife0() * 0.95 then - if CleanUpSurfaceType == land.SurfaceType.RUNWAY then - if CleanUpUnit:inAir() then - local CleanUpLandHeight = land.getHeight(CleanUpUnitVec2) - local CleanUpUnitHeight = CleanUpUnitVec3.y - CleanUpLandHeight - self:T( { "CleanUp Scheduler", "Height = " .. CleanUpUnitHeight } ) - if CleanUpUnitHeight < 30 then - self:T( { "CleanUp Scheduler", "Destroy " .. CleanUpUnitName .. " because below safe height and damaged." } ) - self:_DestroyUnit(CleanUpUnit, CleanUpUnitName) - end - else - self:T( { "CleanUp Scheduler", "Destroy " .. CleanUpUnitName .. " because on runway and damaged." } ) - self:_DestroyUnit(CleanUpUnit, CleanUpUnitName) - end - end - end - -- Clean Units which are waiting for a very long time in the CleanUpZone. - if CleanUpUnit then - local CleanUpUnitVelocity = CleanUpUnit:getVelocity() - local CleanUpUnitVelocityTotal = math.abs(CleanUpUnitVelocity.x) + math.abs(CleanUpUnitVelocity.y) + math.abs(CleanUpUnitVelocity.z) - if CleanUpUnitVelocityTotal < 1 then - if UnitData.CleanUpMoved then - if UnitData.CleanUpTime + 180 <= timer.getTime() then - self:T( { "CleanUp Scheduler", "Destroy due to not moving anymore " .. CleanUpUnitName } ) - self:_DestroyUnit(CleanUpUnit, CleanUpUnitName) - end - end - else - UnitData.CleanUpTime = timer.getTime() - UnitData.CleanUpMoved = true - --MESSAGE:New( "Moved " .. CleanUpUnitName, CleanUpUnitName, 10, CleanUpUnitName ):ToAll() - end - end - - else - -- Do nothing ... - self.CleanUpList[CleanUpUnitName] = nil -- Not anymore in the DCSRTE - end - else - self:T( "CleanUp: Group " .. CleanUpUnitName .. " cannot be found in DCS RTE, removing ..." ) - self.CleanUpList[CleanUpUnitName] = nil -- Not anymore in the DCSRTE - end - end - self:T(CleanUpCount) - - return true -end - ---- Dynamic spawning of groups (and units). --- --- @{#SPAWN} class --- =============== --- The @{#SPAWN} class allows to spawn dynamically new groups, based on pre-defined initialization settings, modifying the behaviour when groups are spawned. --- For each group to be spawned, within the mission editor, a group has to be created with the "late activation flag" set. We call this group the *"Spawn Template"* of the SPAWN object. --- A reference to this Spawn Template needs to be provided when constructing the SPAWN object, by indicating the name of the group within the mission editor in the constructor methods. --- --- Within the SPAWN object, there is an internal index that keeps track of which group from the internal group list was spawned. --- When new groups get spawned by using the SPAWN functions (see below), it will be validated whether the Limits (@{#SPAWN.Limit}) of the SPAWN object are not reached. --- When all is valid, a new group will be created by the spawning methods, and the internal index will be increased with 1. --- --- Regarding the name of new spawned groups, a _SpawnPrefix_ will be assigned for each new group created. --- If you want to have the Spawn Template name to be used as the _SpawnPrefix_ name, use the @{#SPAWN.New} constructor. --- However, when the @{#SPAWN.NewWithAlias} constructor was used, the Alias name will define the _SpawnPrefix_ name. --- Groups will follow the following naming structure when spawned at run-time: --- --- 1. Spawned groups will have the name _SpawnPrefix_#ggg, where ggg is a counter from 0 to 999. --- 2. Spawned units will have the name _SpawnPrefix_#ggg-uu, where uu is a counter from 0 to 99 for each new spawned unit belonging to the group. --- --- Some additional notes that need to be remembered: --- --- * Templates are actually groups defined within the mission editor, with the flag "Late Activation" set. As such, these groups are never used within the mission, but are used by the @{#SPAWN} module. --- * It is important to defined BEFORE you spawn new groups, a proper initialization of the SPAWN instance is done with the options you want to use. --- * When designing a mission, NEVER name groups using a "#" within the name of the group Spawn Template(s), or the SPAWN module logic won't work anymore. --- --- SPAWN construction methods: --- =========================== --- Create a new SPAWN object with the @{#SPAWN.New} or the @{#SPAWN.NewWithAlias} methods: --- --- * @{#SPAWN.New}: Creates a new SPAWN object taking the name of the group that functions as the Template. --- --- It is important to understand how the SPAWN class works internally. The SPAWN object created will contain internally a list of groups that will be spawned and that are already spawned. --- The initialization functions will modify this list of groups so that when a group gets spawned, ALL information is already prepared when spawning. This is done for performance reasons. --- So in principle, the group list will contain all parameters and configurations after initialization, and when groups get actually spawned, this spawning can be done quickly and efficient. --- --- SPAWN initialization methods: --- ============================= --- A spawn object will behave differently based on the usage of initialization methods: --- --- * @{#SPAWN.Limit}: Limits the amount of groups that can be alive at the same time and that can be dynamically spawned. --- * @{#SPAWN.RandomizeRoute}: Randomize the routes of spawned groups. --- * @{#SPAWN.RandomizeTemplate}: Randomize the group templates so that when a new group is spawned, a random group template is selected from one of the templates defined. --- * @{#SPAWN.Uncontrolled}: Spawn plane groups uncontrolled. --- * @{#SPAWN.Array}: Make groups visible before they are actually activated, and order these groups like a batallion in an array. --- * @{#SPAWN.InitRepeat}: Re-spawn groups when they land at the home base. Similar functions are @{#SPAWN.InitRepeatOnLanding} and @{#SPAWN.InitRepeatOnEngineShutDown}. --- --- SPAWN spawning methods: --- ======================= --- Groups can be spawned at different times and methods: --- --- * @{#SPAWN.Spawn}: Spawn one new group based on the last spawned index. --- * @{#SPAWN.ReSpawn}: Re-spawn a group based on a given index. --- * @{#SPAWN.SpawnScheduled}: Spawn groups at scheduled but randomized intervals. You can use @{#SPAWN.SpawnScheduleStart} and @{#SPAWN.SpawnScheduleStop} to start and stop the schedule respectively. --- * @{#SPAWN.SpawnFromUnit}: Spawn a new group taking the position of a @{UNIT}. --- * @{#SPAWN.SpawnInZone}: Spawn a new group in a @{ZONE}. --- --- Note that @{#SPAWN.Spawn} and @{#SPAWN.ReSpawn} return a @{GROUP#GROUP.New} object, that contains a reference to the DCSGroup object. --- You can use the @{GROUP} object to do further actions with the DCSGroup. --- --- SPAWN object cleaning: --- ========================= --- Sometimes, it will occur during a mission run-time, that ground or especially air objects get damaged, and will while being damged stop their activities, while remaining alive. --- In such cases, the SPAWN object will just sit there and wait until that group gets destroyed, but most of the time it won't, --- and it may occur that no new groups are or can be spawned as limits are reached. --- To prevent this, a @{#SPAWN.CleanUp} initialization method has been defined that will silently monitor the status of each spawned group. --- Once a group has a velocity = 0, and has been waiting for a defined interval, that group will be cleaned or removed from run-time. --- There is a catch however :-) If a damaged group has returned to an airbase within the coalition, that group will not be considered as "lost"... --- In such a case, when the inactive group is cleaned, a new group will Re-spawned automatically. --- This models AI that has succesfully returned to their airbase, to restart their combat activities. --- Check the @{#SPAWN.CleanUp} for further info. --- --- ==== --- @module Spawn --- @author FlightControl - -Include.File( "Routines" ) -Include.File( "Base" ) -Include.File( "Database" ) -Include.File( "Group" ) -Include.File( "Zone" ) -Include.File( "Event" ) -Include.File( "Scheduler" ) - ---- SPAWN Class --- @type SPAWN --- @extends Base#BASE --- @field ClassName --- @field #string SpawnTemplatePrefix --- @field #string SpawnAliasPrefix -SPAWN = { - ClassName = "SPAWN", - SpawnTemplatePrefix = nil, - SpawnAliasPrefix = nil, -} - - - ---- Creates the main object to spawn a GROUP defined in the DCS ME. --- @param #SPAWN self --- @param #string SpawnTemplatePrefix is the name of the Group in the ME that defines the Template. Each new group will have the name starting with SpawnTemplatePrefix. --- @return #SPAWN --- @usage --- -- NATO helicopters engaging in the battle field. --- Spawn_BE_KA50 = SPAWN:New( 'BE KA-50@RAMP-Ground Defense' ) --- @usage local Plane = SPAWN:New( "Plane" ) -- Creates a new local variable that can initiate new planes with the name "Plane#ddd" using the template "Plane" as defined within the ME. -function SPAWN:New( SpawnTemplatePrefix ) - local self = BASE:Inherit( self, BASE:New() ) - self:F( { SpawnTemplatePrefix } ) - - local TemplateGroup = Group.getByName( SpawnTemplatePrefix ) - if TemplateGroup then - self.SpawnTemplatePrefix = SpawnTemplatePrefix - self.SpawnIndex = 0 - self.SpawnCount = 0 -- The internal counter of the amount of spawning the has happened since SpawnStart. - self.AliveUnits = 0 -- Contains the counter how many units are currently alive - self.SpawnIsScheduled = false -- Reflects if the spawning for this SpawnTemplatePrefix is going to be scheduled or not. - self.SpawnTemplate = self._GetTemplate( self, SpawnTemplatePrefix ) -- Contains the template structure for a Group Spawn from the Mission Editor. Note that this group must have lateActivation always on!!! - self.Repeat = false -- Don't repeat the group from Take-Off till Landing and back Take-Off by ReSpawning. - self.UnControlled = false -- When working in UnControlled mode, all planes are Spawned in UnControlled mode before the scheduler starts. - self.SpawnMaxUnitsAlive = 0 -- The maximum amount of groups that can be alive of SpawnTemplatePrefix at the same time. - self.SpawnMaxGroups = 0 -- The maximum amount of groups that can be spawned. - self.SpawnRandomize = false -- Sets the randomization flag of new Spawned units to false. - self.SpawnVisible = false -- Flag that indicates if all the Groups of the SpawnGroup need to be visible when Spawned. - - self.SpawnGroups = {} -- Array containing the descriptions of each Group to be Spawned. - else - error( "SPAWN:New: There is no group declared in the mission editor with SpawnTemplatePrefix = '" .. SpawnTemplatePrefix .. "'" ) - end - - return self -end - ---- Creates a new SPAWN instance to create new groups based on the defined template and using a new alias for each new group. --- @param #SPAWN self --- @param #string SpawnTemplatePrefix is the name of the Group in the ME that defines the Template. --- @param #string SpawnAliasPrefix is the name that will be given to the Group at runtime. --- @return #SPAWN --- @usage --- -- NATO helicopters engaging in the battle field. --- Spawn_BE_KA50 = SPAWN:NewWithAlias( 'BE KA-50@RAMP-Ground Defense', 'Helicopter Attacking a City' ) --- @usage local PlaneWithAlias = SPAWN:NewWithAlias( "Plane", "Bomber" ) -- Creates a new local variable that can instantiate new planes with the name "Bomber#ddd" using the template "Plane" as defined within the ME. -function SPAWN:NewWithAlias( SpawnTemplatePrefix, SpawnAliasPrefix ) - local self = BASE:Inherit( self, BASE:New() ) - self:F( { SpawnTemplatePrefix, SpawnAliasPrefix } ) - - local TemplateGroup = Group.getByName( SpawnTemplatePrefix ) - if TemplateGroup then - self.SpawnTemplatePrefix = SpawnTemplatePrefix - self.SpawnAliasPrefix = SpawnAliasPrefix - self.SpawnIndex = 0 - self.SpawnCount = 0 -- The internal counter of the amount of spawning the has happened since SpawnStart. - self.AliveUnits = 0 -- Contains the counter how many units are currently alive - self.SpawnIsScheduled = false -- Reflects if the spawning for this SpawnTemplatePrefix is going to be scheduled or not. - self.SpawnTemplate = self._GetTemplate( self, SpawnTemplatePrefix ) -- Contains the template structure for a Group Spawn from the Mission Editor. Note that this group must have lateActivation always on!!! - self.Repeat = false -- Don't repeat the group from Take-Off till Landing and back Take-Off by ReSpawning. - self.UnControlled = false -- When working in UnControlled mode, all planes are Spawned in UnControlled mode before the scheduler starts. - self.SpawnMaxUnitsAlive = 0 -- The maximum amount of groups that can be alive of SpawnTemplatePrefix at the same time. - self.SpawnMaxGroups = 0 -- The maximum amount of groups that can be spawned. - self.SpawnRandomize = false -- Sets the randomization flag of new Spawned units to false. - self.SpawnVisible = false -- Flag that indicates if all the Groups of the SpawnGroup need to be visible when Spawned. - - self.SpawnGroups = {} -- Array containing the descriptions of each Group to be Spawned. - else - error( "SPAWN:New: There is no group declared in the mission editor with SpawnTemplatePrefix = '" .. SpawnTemplatePrefix .. "'" ) - end - - return self -end - - ---- Limits the Maximum amount of Units that can be alive at the same time, and the maximum amount of groups that can be spawned. --- Note that this method is exceptionally important to balance the performance of the mission. Depending on the machine etc, a mission can only process a maximum amount of units. --- If the time interval must be short, but there should not be more Units or Groups alive than a maximum amount of units, then this function should be used... --- When a @{#SPAWN.New} is executed and the limit of the amount of units alive is reached, then no new spawn will happen of the group, until some of these units of the spawn object will be destroyed. --- @param #SPAWN self --- @param #number SpawnMaxUnitsAlive The maximum amount of units that can be alive at runtime. --- @param #number SpawnMaxGroups The maximum amount of groups that can be spawned. When the limit is reached, then no more actual spawns will happen of the group. --- This parameter is useful to define a maximum amount of airplanes, ground troops, helicopters, ships etc within a supply area. --- This parameter accepts the value 0, which defines that there are no maximum group limits, but there are limits on the maximum of units that can be alive at the same time. --- @return #SPAWN self --- @usage --- -- NATO helicopters engaging in the battle field. --- -- This helicopter group consists of one Unit. So, this group will SPAWN maximum 2 groups simultaneously within the DCSRTE. --- -- There will be maximum 24 groups spawned during the whole mission lifetime. --- Spawn_BE_KA50 = SPAWN:New( 'BE KA-50@RAMP-Ground Defense' ):Limit( 2, 24 ) -function SPAWN:Limit( SpawnMaxUnitsAlive, SpawnMaxGroups ) - self:F( { self.SpawnTemplatePrefix, SpawnMaxUnitsAlive, SpawnMaxGroups } ) - - self.SpawnMaxUnitsAlive = SpawnMaxUnitsAlive -- The maximum amount of groups that can be alive of SpawnTemplatePrefix at the same time. - self.SpawnMaxGroups = SpawnMaxGroups -- The maximum amount of groups that can be spawned. - - for SpawnGroupID = 1, self.SpawnMaxGroups do - self:_InitializeSpawnGroups( SpawnGroupID ) - end - - return self -end - - ---- Randomizes the defined route of the SpawnTemplatePrefix group in the ME. This is very useful to define extra variation of the behaviour of groups. --- @param #SPAWN self --- @param #number SpawnStartPoint is the waypoint where the randomization begins. --- Note that the StartPoint = 0 equaling the point where the group is spawned. --- @param #number SpawnEndPoint is the waypoint where the randomization ends counting backwards. --- This parameter is useful to avoid randomization to end at a waypoint earlier than the last waypoint on the route. --- @param #number SpawnRadius is the radius in meters in which the randomization of the new waypoints, with the original waypoint of the original template located in the middle ... --- @return #SPAWN --- @usage --- -- NATO helicopters engaging in the battle field. --- -- The KA-50 has waypoints Start point ( =0 or SP ), 1, 2, 3, 4, End point (= 5 or DP). --- -- Waypoints 2 and 3 will only be randomized. The others will remain on their original position with each new spawn of the helicopter. --- -- The randomization of waypoint 2 and 3 will take place within a radius of 2000 meters. --- Spawn_BE_KA50 = SPAWN:New( 'BE KA-50@RAMP-Ground Defense' ):RandomizeRoute( 2, 2, 2000 ) -function SPAWN:RandomizeRoute( SpawnStartPoint, SpawnEndPoint, SpawnRadius ) - self:F( { self.SpawnTemplatePrefix, SpawnStartPoint, SpawnEndPoint, SpawnRadius } ) - - self.SpawnRandomizeRoute = true - self.SpawnRandomizeRouteStartPoint = SpawnStartPoint - self.SpawnRandomizeRouteEndPoint = SpawnEndPoint - self.SpawnRandomizeRouteRadius = SpawnRadius - - for GroupID = 1, self.SpawnMaxGroups do - self:_RandomizeRoute( GroupID ) - end - - return self -end - - ---- This function is rather complicated to understand. But I'll try to explain. --- This function becomes useful when you need to spawn groups with random templates of groups defined within the mission editor, --- but they will all follow the same Template route and have the same prefix name. --- In other words, this method randomizes between a defined set of groups the template to be used for each new spawn of a group. --- @param #SPAWN self --- @param #string SpawnTemplatePrefixTable A table with the names of the groups defined within the mission editor, from which one will be choosen when a new group will be spawned. --- @return #SPAWN --- @usage --- -- NATO Tank Platoons invading Gori. --- -- Choose between 13 different 'US Tank Platoon' configurations for each new SPAWN the Group to be spawned for the --- -- 'US Tank Platoon Left', 'US Tank Platoon Middle' and 'US Tank Platoon Right' SpawnTemplatePrefixes. --- -- Each new SPAWN will randomize the route, with a defined time interval of 200 seconds with 40% time variation (randomization) and --- -- with a limit set of maximum 12 Units alive simulteneously and 150 Groups to be spawned during the whole mission. --- Spawn_US_Platoon = { 'US Tank Platoon 1', 'US Tank Platoon 2', 'US Tank Platoon 3', 'US Tank Platoon 4', 'US Tank Platoon 5', --- 'US Tank Platoon 6', 'US Tank Platoon 7', 'US Tank Platoon 8', 'US Tank Platoon 9', 'US Tank Platoon 10', --- 'US Tank Platoon 11', 'US Tank Platoon 12', 'US Tank Platoon 13' } --- Spawn_US_Platoon_Left = SPAWN:New( 'US Tank Platoon Left' ):Limit( 12, 150 ):Schedule( 200, 0.4 ):RandomizeTemplate( Spawn_US_Platoon ):RandomizeRoute( 3, 3, 2000 ) --- Spawn_US_Platoon_Middle = SPAWN:New( 'US Tank Platoon Middle' ):Limit( 12, 150 ):Schedule( 200, 0.4 ):RandomizeTemplate( Spawn_US_Platoon ):RandomizeRoute( 3, 3, 2000 ) --- Spawn_US_Platoon_Right = SPAWN:New( 'US Tank Platoon Right' ):Limit( 12, 150 ):Schedule( 200, 0.4 ):RandomizeTemplate( Spawn_US_Platoon ):RandomizeRoute( 3, 3, 2000 ) -function SPAWN:RandomizeTemplate( SpawnTemplatePrefixTable ) - self:F( { self.SpawnTemplatePrefix, SpawnTemplatePrefixTable } ) - - self.SpawnTemplatePrefixTable = SpawnTemplatePrefixTable - self.SpawnRandomizeTemplate = true - - for SpawnGroupID = 1, self.SpawnMaxGroups do - self:_RandomizeTemplate( SpawnGroupID ) - end - - return self -end - - - - - ---- For planes and helicopters, when these groups go home and land on their home airbases and farps, they normally would taxi to the parking spot, shut-down their engines and wait forever until the Group is removed by the runtime environment. --- This function is used to re-spawn automatically (so no extra call is needed anymore) the same group after it has landed. --- This will enable a spawned group to be re-spawned after it lands, until it is destroyed... --- Note: When the group is respawned, it will re-spawn from the original airbase where it took off. --- So ensure that the routes for groups that respawn, always return to the original airbase, or players may get confused ... --- @param #SPAWN self --- @return #SPAWN self --- @usage --- -- RU Su-34 - AI Ship Attack --- -- Re-SPAWN the Group(s) after each landing and Engine Shut-Down automatically. --- SpawnRU_SU34 = SPAWN:New( 'TF1 RU Su-34 Krymsk@AI - Attack Ships' ):Schedule( 2, 3, 1800, 0.4 ):SpawnUncontrolled():RandomizeRoute( 1, 1, 3000 ):RepeatOnEngineShutDown() -function SPAWN:InitRepeat() - self:F( { self.SpawnTemplatePrefix, self.SpawnIndex } ) - - self.Repeat = true - self.RepeatOnEngineShutDown = false - self.RepeatOnLanding = true - - return self -end - ---- Respawn group after landing. --- @param #SPAWN self --- @return #SPAWN self -function SPAWN:InitRepeatOnLanding() - self:F( { self.SpawnTemplatePrefix } ) - - self:InitRepeat() - self.RepeatOnEngineShutDown = false - self.RepeatOnLanding = true - - return self -end - - ---- Respawn after landing when its engines have shut down. --- @param #SPAWN self --- @return #SPAWN self -function SPAWN:InitRepeatOnEngineShutDown() - self:F( { self.SpawnTemplatePrefix } ) - - self:InitRepeat() - self.RepeatOnEngineShutDown = true - self.RepeatOnLanding = false - - return self -end - - ---- CleanUp groups when they are still alive, but inactive. --- When groups are still alive and have become inactive due to damage and are unable to contribute anything, then this group will be removed at defined intervals in seconds. --- @param #SPAWN self --- @param #string SpawnCleanUpInterval The interval to check for inactive groups within seconds. --- @return #SPAWN self --- @usage Spawn_Helicopter:CleanUp( 20 ) -- CleanUp the spawning of the helicopters every 20 seconds when they become inactive. -function SPAWN:CleanUp( SpawnCleanUpInterval ) - self:F( { self.SpawnTemplatePrefix, SpawnCleanUpInterval } ) - - self.SpawnCleanUpInterval = SpawnCleanUpInterval - self.SpawnCleanUpTimeStamps = {} - --self.CleanUpFunction = routines.scheduleFunction( self._SpawnCleanUpScheduler, { self }, timer.getTime() + 1, SpawnCleanUpInterval ) - self.CleanUpScheduler = SCHEDULER:New( self, self._SpawnCleanUpScheduler, {}, 1, SpawnCleanUpInterval, 0.2 ) - return self -end - - - ---- Makes the groups visible before start (like a batallion). --- The method will take the position of the group as the first position in the array. --- @param #SPAWN self --- @param #number SpawnAngle The angle in degrees how the groups and each unit of the group will be positioned. --- @param #number SpawnWidth The amount of Groups that will be positioned on the X axis. --- @param #number SpawnDeltaX The space between each Group on the X-axis. --- @param #number SpawnDeltaY The space between each Group on the Y-axis. --- @return #SPAWN self --- @usage --- -- Define an array of Groups. --- Spawn_BE_Ground = SPAWN:New( 'BE Ground' ):Limit( 2, 24 ):Visible( 90, "Diamond", 10, 100, 50 ) -function SPAWN:Array( SpawnAngle, SpawnWidth, SpawnDeltaX, SpawnDeltaY ) - self:F( { self.SpawnTemplatePrefix, SpawnAngle, SpawnWidth, SpawnDeltaX, SpawnDeltaY } ) - - self.SpawnVisible = true -- When the first Spawn executes, all the Groups need to be made visible before start. - - local SpawnX = 0 - local SpawnY = 0 - local SpawnXIndex = 0 - local SpawnYIndex = 0 - - for SpawnGroupID = 1, self.SpawnMaxGroups do - self:T( { SpawnX, SpawnY, SpawnXIndex, SpawnYIndex } ) - - self.SpawnGroups[SpawnGroupID].Visible = true - self.SpawnGroups[SpawnGroupID].Spawned = false - - SpawnXIndex = SpawnXIndex + 1 - if SpawnWidth and SpawnWidth ~= 0 then - if SpawnXIndex >= SpawnWidth then - SpawnXIndex = 0 - SpawnYIndex = SpawnYIndex + 1 - end - end - - local SpawnRootX = self.SpawnGroups[SpawnGroupID].SpawnTemplate.x - local SpawnRootY = self.SpawnGroups[SpawnGroupID].SpawnTemplate.y - - self:_TranslateRotate( SpawnGroupID, SpawnRootX, SpawnRootY, SpawnX, SpawnY, SpawnAngle ) - - self.SpawnGroups[SpawnGroupID].SpawnTemplate.lateActivation = true - self.SpawnGroups[SpawnGroupID].SpawnTemplate.visible = true - - self.SpawnGroups[SpawnGroupID].Visible = true - - _EVENTDISPATCHER:OnBirthForTemplate( self.SpawnGroups[SpawnGroupID].SpawnTemplate, self._OnBirth, self ) - _EVENTDISPATCHER:OnCrashForTemplate( self.SpawnGroups[SpawnGroupID].SpawnTemplate, self._OnDeadOrCrash, self ) - _EVENTDISPATCHER:OnDeadForTemplate( self.SpawnGroups[SpawnGroupID].SpawnTemplate, self._OnDeadOrCrash, self ) - - if self.Repeat then - _EVENTDISPATCHER:OnTakeOffForTemplate( self.SpawnGroups[SpawnGroupID].SpawnTemplate, self._OnTakeOff, self ) - _EVENTDISPATCHER:OnLandForTemplate( self.SpawnGroups[SpawnGroupID].SpawnTemplate, self._OnLand, self ) - end - if self.RepeatOnEngineShutDown then - _EVENTDISPATCHER:OnEngineShutDownForTemplate( self.SpawnGroups[SpawnGroupID].SpawnTemplate, self._OnEngineShutDown, self ) - end - - self.SpawnGroups[SpawnGroupID].Group = _DATABASE:Spawn( self.SpawnGroups[SpawnGroupID].SpawnTemplate ) - - SpawnX = SpawnXIndex * SpawnDeltaX - SpawnY = SpawnYIndex * SpawnDeltaY - end - - return self -end - - - ---- Will spawn a group based on the internal index. --- Note: Uses @{DATABASE} module defined in MOOSE. --- @param #SPAWN self --- @return Group#GROUP The group that was spawned. You can use this group for further actions. -function SPAWN:Spawn() - self:F( { self.SpawnTemplatePrefix, self.SpawnIndex } ) - - return self:SpawnWithIndex( self.SpawnIndex + 1 ) -end - ---- Will re-spawn a group based on a given index. --- Note: Uses @{DATABASE} module defined in MOOSE. --- @param #SPAWN self --- @param #string SpawnIndex The index of the group to be spawned. --- @return Group#GROUP The group that was spawned. You can use this group for further actions. -function SPAWN:ReSpawn( SpawnIndex ) - self:F( { self.SpawnTemplatePrefix, SpawnIndex } ) - - if not SpawnIndex then - SpawnIndex = 1 - end - --- TODO: This logic makes DCS crash and i don't know why (yet). - local SpawnGroup = self:GetGroupFromIndex( SpawnIndex ) - if SpawnGroup then - local SpawnDCSGroup = SpawnGroup:GetDCSGroup() - if SpawnDCSGroup then - SpawnGroup:Destroy() - end - end - - return self:SpawnWithIndex( SpawnIndex ) -end - ---- Will spawn a group with a specified index number. --- Uses @{DATABASE} global object defined in MOOSE. --- @param #SPAWN self --- @return Group#GROUP The group that was spawned. You can use this group for further actions. -function SPAWN:SpawnWithIndex( SpawnIndex ) - self:F( { self.SpawnTemplatePrefix, SpawnIndex, self.SpawnMaxGroups } ) - - if self:_GetSpawnIndex( SpawnIndex ) then - - if self.SpawnGroups[self.SpawnIndex].Visible then - self.SpawnGroups[self.SpawnIndex].Group:Activate() - else - self:T( self.SpawnGroups[self.SpawnIndex].SpawnTemplate ) - _EVENTDISPATCHER:OnBirthForTemplate( self.SpawnGroups[self.SpawnIndex].SpawnTemplate, self._OnBirth, self ) - _EVENTDISPATCHER:OnCrashForTemplate( self.SpawnGroups[self.SpawnIndex].SpawnTemplate, self._OnDeadOrCrash, self ) - _EVENTDISPATCHER:OnDeadForTemplate( self.SpawnGroups[self.SpawnIndex].SpawnTemplate, self._OnDeadOrCrash, self ) - - if self.Repeat then - _EVENTDISPATCHER:OnTakeOffForTemplate( self.SpawnGroups[self.SpawnIndex].SpawnTemplate, self._OnTakeOff, self ) - _EVENTDISPATCHER:OnLandForTemplate( self.SpawnGroups[self.SpawnIndex].SpawnTemplate, self._OnLand, self ) - end - if self.RepeatOnEngineShutDown then - _EVENTDISPATCHER:OnEngineShutDownForTemplate( self.SpawnGroups[self.SpawnIndex].SpawnTemplate, self._OnEngineShutDown, self ) - end - - self:T( self.SpawnGroups[self.SpawnIndex].SpawnTemplate ) - - self.SpawnGroups[self.SpawnIndex].Group = _DATABASE:Spawn( self.SpawnGroups[self.SpawnIndex].SpawnTemplate ) - - -- If there is a SpawnFunction hook defined, call it. - if self.SpawnFunctionHook then - self.SpawnFunctionHook( self.SpawnGroups[self.SpawnIndex].Group, unpack( self.SpawnFunctionArguments ) ) - end - -- TODO: Need to fix this by putting an "R" in the name of the group when the group repeats. - --if self.Repeat then - -- _DATABASE:SetStatusGroup( SpawnTemplate.name, "ReSpawn" ) - --end - end - - self.SpawnGroups[self.SpawnIndex].Spawned = true - return self.SpawnGroups[self.SpawnIndex].Group - else - --self:E( { self.SpawnTemplatePrefix, "No more Groups to Spawn:", SpawnIndex, self.SpawnMaxGroups } ) - end - - return nil -end - ---- Spawns new groups at varying time intervals. --- This is useful if you want to have continuity within your missions of certain (AI) groups to be present (alive) within your missions. --- @param #SPAWN self --- @param #number SpawnTime The time interval defined in seconds between each new spawn of new groups. --- @param #number SpawnTimeVariation The variation to be applied on the defined time interval between each new spawn. --- The variation is a number between 0 and 1, representing the %-tage of variation to be applied on the time interval. --- @return #SPAWN self --- @usage --- -- NATO helicopters engaging in the battle field. --- -- The time interval is set to SPAWN new helicopters between each 600 seconds, with a time variation of 50%. --- -- The time variation in this case will be between 450 seconds and 750 seconds. --- -- This is calculated as follows: --- -- Low limit: 600 * ( 1 - 0.5 / 2 ) = 450 --- -- High limit: 600 * ( 1 + 0.5 / 2 ) = 750 --- -- Between these two values, a random amount of seconds will be choosen for each new spawn of the helicopters. --- Spawn_BE_KA50 = SPAWN:New( 'BE KA-50@RAMP-Ground Defense' ):Schedule( 600, 0.5 ) -function SPAWN:SpawnScheduled( SpawnTime, SpawnTimeVariation ) - self:F( { SpawnTime, SpawnTimeVariation } ) - - if SpawnTime ~= nil and SpawnTimeVariation ~= nil then - self.SpawnScheduler = SCHEDULER:New( self, self._Scheduler, {}, 1, SpawnTime, SpawnTimeVariation ) - end - - return self -end - ---- Will re-start the spawning scheduler. --- Note: This function is only required to be called when the schedule was stopped. -function SPAWN:SpawnScheduleStart() - self:F( { self.SpawnTemplatePrefix } ) - - self.SpawnScheduler:Start() -end - ---- Will stop the scheduled spawning scheduler. -function SPAWN:SpawnScheduleStop() - self:F( { self.SpawnTemplatePrefix } ) - - self.SpawnScheduler:Stop() -end - - ---- Allows to place a CallFunction hook when a new group spawns. --- The provided function will be called when a new group is spawned, including its given parameters. --- The first parameter of the SpawnFunction is the @{Group#GROUP} that was spawned. --- @param #SPAWN self --- @param #function SpawnFunctionHook The function to be called when a group spawns. --- @param SpawnFunctionArguments A random amount of arguments to be provided to the function when the group spawns. --- @return #SPAWN -function SPAWN:SpawnFunction( SpawnFunctionHook, ... ) - self:F( SpawnFunction ) - - self.SpawnFunctionHook = SpawnFunctionHook - self.SpawnFunctionArguments = {} - if arg then - self.SpawnFunctionArguments = arg - end - - return self -end - - - - ---- Will spawn a group from a hosting unit. This function is mostly advisable to be used if you want to simulate spawning from air units, like helicopters, which are dropping infantry into a defined Landing Zone. --- Note that each point in the route assigned to the spawning group is reset to the point of the spawn. --- You can use the returned group to further define the route to be followed. --- @param #SPAWN self --- @param Unit#UNIT HostUnit The air or ground unit dropping or unloading the group. --- @param #number OuterRadius The outer radius in meters where the new group will be spawned. --- @param #number InnerRadius The inner radius in meters where the new group will NOT be spawned. --- @param #number SpawnIndex (Optional) The index which group to spawn within the given zone. --- @return Group#GROUP that was spawned. --- @return #nil Nothing was spawned. -function SPAWN:SpawnFromUnit( HostUnit, OuterRadius, InnerRadius, SpawnIndex ) - self:F( { self.SpawnTemplatePrefix, HostUnit, OuterRadius, InnerRadius, SpawnIndex } ) - - if HostUnit and HostUnit:IsAlive() then -- and HostUnit:getUnit(1):inAir() == false then - - if SpawnIndex then - else - SpawnIndex = self.SpawnIndex + 1 - end - - if self:_GetSpawnIndex( SpawnIndex ) then - - local SpawnTemplate = self.SpawnGroups[self.SpawnIndex].SpawnTemplate - - if SpawnTemplate then - - local UnitPoint = HostUnit:GetPointVec2() - - self:T( { "Current point of ", self.SpawnTemplatePrefix, UnitPoint } ) - - --for PointID, Point in pairs( SpawnTemplate.route.points ) do - --Point.x = UnitPoint.x - --Point.y = UnitPoint.y - --Point.alt = nil - --Point.alt_type = nil - --end - - SpawnTemplate.route.points[1].x = UnitPoint.x - SpawnTemplate.route.points[1].y = UnitPoint.y - - if not InnerRadius then - InnerRadius = 10 - end - - if not OuterRadius then - OuterRadius = 50 - end - - -- Apply SpawnFormation - for UnitID = 1, #SpawnTemplate.units do - if InnerRadius == 0 then - SpawnTemplate.units[UnitID].x = UnitPoint.x - SpawnTemplate.units[UnitID].y = UnitPoint.y - else - local CirclePos = routines.getRandPointInCircle( UnitPoint, OuterRadius, InnerRadius ) - SpawnTemplate.units[UnitID].x = CirclePos.x - SpawnTemplate.units[UnitID].y = CirclePos.y - end - self:T( 'SpawnTemplate.units['..UnitID..'].x = ' .. SpawnTemplate.units[UnitID].x .. ', SpawnTemplate.units['..UnitID..'].y = ' .. SpawnTemplate.units[UnitID].y ) - end - - local SpawnPos = routines.getRandPointInCircle( UnitPoint, OuterRadius, InnerRadius ) - local Point = {} - Point.type = "Turning Point" - Point.x = SpawnPos.x - Point.y = SpawnPos.y - Point.action = "Cone" - Point.speed = 5 - - table.insert( SpawnTemplate.route.points, 2, Point ) - - return self:SpawnWithIndex( self.SpawnIndex ) - end - end - end - - return nil -end - ---- Will spawn a Group within a given @{Zone#ZONE}. --- Once the group is spawned within the zone, it will continue on its route. --- The first waypoint (where the group is spawned) is replaced with the zone coordinates. --- @param #SPAWN self --- @param Zone#ZONE Zone The zone where the group is to be spawned. --- @param #number ZoneRandomize (Optional) Set to true if you want to randomize the starting point in the zone. --- @param #number SpawnIndex (Optional) The index which group to spawn within the given zone. --- @return Group#GROUP that was spawned. --- @return #nil when nothing was spawned. -function SPAWN:SpawnInZone( Zone, ZoneRandomize, SpawnIndex ) - self:F( { self.SpawnTemplatePrefix, Zone, ZoneRandomize, SpawnIndex } ) - - if Zone then - - if SpawnIndex then - else - SpawnIndex = self.SpawnIndex + 1 - end - - if self:_GetSpawnIndex( SpawnIndex ) then - - local SpawnTemplate = self.SpawnGroups[self.SpawnIndex].SpawnTemplate - - if SpawnTemplate then - - local ZonePoint - - if ZoneRandomize == true then - ZonePoint = Zone:GetRandomPointVec2() - else - ZonePoint = Zone:GetPointVec2() - end - - SpawnTemplate.route.points[1].x = ZonePoint.x - SpawnTemplate.route.points[1].y = ZonePoint.y - - -- Apply SpawnFormation - for UnitID = 1, #SpawnTemplate.units do - local ZonePointUnit = Zone:GetRandomPointVec2() - SpawnTemplate.units[UnitID].x = ZonePointUnit.x - SpawnTemplate.units[UnitID].y = ZonePointUnit.y - self:T( 'SpawnTemplate.units['..UnitID..'].x = ' .. SpawnTemplate.units[UnitID].x .. ', SpawnTemplate.units['..UnitID..'].y = ' .. SpawnTemplate.units[UnitID].y ) - end - - return self:SpawnWithIndex( self.SpawnIndex ) - end - end - end - - return nil -end - - - - ---- Will spawn a plane group in uncontrolled mode... --- This will be similar to the uncontrolled flag setting in the ME. --- @return #SPAWN self -function SPAWN:UnControlled() - self:F( { self.SpawnTemplatePrefix } ) - - self.SpawnUnControlled = true - - for SpawnGroupID = 1, self.SpawnMaxGroups do - self.SpawnGroups[SpawnGroupID].UnControlled = true - end - - return self -end - - - ---- Will return the SpawnGroupName either with with a specific count number or without any count. --- @param #SPAWN self --- @param #number SpawnIndex Is the number of the Group that is to be spawned. --- @return #string SpawnGroupName -function SPAWN:SpawnGroupName( SpawnIndex ) - self:F( { self.SpawnTemplatePrefix, SpawnIndex } ) - - local SpawnPrefix = self.SpawnTemplatePrefix - if self.SpawnAliasPrefix then - SpawnPrefix = self.SpawnAliasPrefix - end - - if SpawnIndex then - local SpawnName = string.format( '%s#%03d', SpawnPrefix, SpawnIndex ) - self:T( SpawnName ) - return SpawnName - else - self:T( SpawnPrefix ) - return SpawnPrefix - end - -end - ---- Find the first alive group. --- @param #SPAWN self --- @param #number SpawnCursor A number holding the index from where to find the first group from. --- @return Group#GROUP, #number The group found, the new index where the group was found. --- @return #nil, #nil When no group is found, #nil is returned. -function SPAWN:GetFirstAliveGroup( SpawnCursor ) - self:F( { self.SpawnTemplatePrefix, self.SpawnAliasPrefix, SpawnCursor } ) - - for SpawnIndex = 1, self.SpawnCount do - local SpawnGroup = self:GetGroupFromIndex( SpawnIndex ) - if SpawnGroup and SpawnGroup:IsAlive() then - SpawnCursor = SpawnIndex - return SpawnGroup, SpawnCursor - end - end - - return nil, nil -end - - ---- Find the next alive group. --- @param #SPAWN self --- @param #number SpawnCursor A number holding the last found previous index. --- @return Group#GROUP, #number The group found, the new index where the group was found. --- @return #nil, #nil When no group is found, #nil is returned. -function SPAWN:GetNextAliveGroup( SpawnCursor ) - self:F( { self.SpawnTemplatePrefix, self.SpawnAliasPrefix, SpawnCursor } ) - - SpawnCursor = SpawnCursor + 1 - for SpawnIndex = SpawnCursor, self.SpawnCount do - local SpawnGroup = self:GetGroupFromIndex( SpawnIndex ) - if SpawnGroup and SpawnGroup:IsAlive() then - SpawnCursor = SpawnIndex - return SpawnGroup, SpawnCursor - end - end - - return nil, nil -end - ---- Find the last alive group during runtime. -function SPAWN:GetLastAliveGroup() - self:F( { self.SpawnTemplatePrefixself.SpawnAliasPrefix } ) - - self.SpawnIndex = self:_GetLastIndex() - for SpawnIndex = self.SpawnIndex, 1, -1 do - local SpawnGroup = self:GetGroupFromIndex( SpawnIndex ) - if SpawnGroup and SpawnGroup:IsAlive() then - self.SpawnIndex = SpawnIndex - return SpawnGroup - end - end - - self.SpawnIndex = nil - return nil -end - - - ---- Get the group from an index. --- Returns the group from the SpawnGroups list. --- If no index is given, it will return the first group in the list. --- @param #SPAWN self --- @param #number SpawnIndex The index of the group to return. --- @return Group#GROUP -function SPAWN:GetGroupFromIndex( SpawnIndex ) - self:F( { self.SpawnTemplatePrefix, self.SpawnAliasPrefix, SpawnIndex } ) - - if not SpawnIndex then - SpawnIndex = 1 - end - - if self.SpawnGroups and self.SpawnGroups[SpawnIndex] then - local SpawnGroup = self.SpawnGroups[SpawnIndex].Group - return SpawnGroup - else - return nil - end -end - ---- Get the group index from a DCSUnit. --- The method will search for a #-mark, and will return the index behind the #-mark of the DCSUnit. --- It will return nil of no prefix was found. --- @param #SPAWN self --- @param DCSUnit The DCS unit to be searched. --- @return #string The prefix --- @return #nil Nothing found -function SPAWN:_GetGroupIndexFromDCSUnit( DCSUnit ) - self:F( { self.SpawnTemplatePrefix, self.SpawnAliasPrefix, DCSUnit } ) - - if DCSUnit and DCSUnit:getName() then - local IndexString = string.match( DCSUnit:getName(), "#.*-" ):sub( 2, -2 ) - self:T( IndexString ) - - if IndexString then - local Index = tonumber( IndexString ) - self:T( { "Index:", IndexString, Index } ) - return Index - end - end - - return nil -end - ---- Return the prefix of a DCSUnit. --- The method will search for a #-mark, and will return the text before the #-mark. --- It will return nil of no prefix was found. --- @param #SPAWN self --- @param DCSUnit The DCS unit to be searched. --- @return #string The prefix --- @return #nil Nothing found -function SPAWN:_GetPrefixFromDCSUnit( DCSUnit ) - self:F( { self.SpawnTemplatePrefix, self.SpawnAliasPrefix, DCSUnit } ) - - if DCSUnit and DCSUnit:getName() then - local SpawnPrefix = string.match( DCSUnit:getName(), ".*#" ) - if SpawnPrefix then - SpawnPrefix = SpawnPrefix:sub( 1, -2 ) - end - self:T( SpawnPrefix ) - return SpawnPrefix - end - - return nil -end - ---- Return the group within the SpawnGroups collection with input a DCSUnit. -function SPAWN:_GetGroupFromDCSUnit( DCSUnit ) - self:F( { self.SpawnTemplatePrefix, self.SpawnAliasPrefix, DCSUnit } ) - - if DCSUnit then - local SpawnPrefix = self:_GetPrefixFromDCSUnit( DCSUnit ) - - if self.SpawnTemplatePrefix == SpawnPrefix or ( self.SpawnAliasPrefix and self.SpawnAliasPrefix == SpawnPrefix ) then - local SpawnGroupIndex = self:_GetGroupIndexFromDCSUnit( DCSUnit ) - local SpawnGroup = self.SpawnGroups[SpawnGroupIndex].Group - self:T( SpawnGroup ) - return SpawnGroup - end - end - - return nil -end - - ---- Get the index from a given group. --- The function will search the name of the group for a #, and will return the number behind the #-mark. -function SPAWN:GetSpawnIndexFromGroup( SpawnGroup ) - self:F( { self.SpawnTemplatePrefix, self.SpawnAliasPrefix, SpawnGroup } ) - - local IndexString = string.match( SpawnGroup:GetName(), "#.*$" ):sub( 2 ) - local Index = tonumber( IndexString ) - - self:T( IndexString, Index ) - return Index - -end - ---- Return the last maximum index that can be used. -function SPAWN:_GetLastIndex() - self:F( { self.SpawnTemplatePrefix, self.SpawnAliasPrefix } ) - - return self.SpawnMaxGroups -end - ---- Initalize the SpawnGroups collection. -function SPAWN:_InitializeSpawnGroups( SpawnIndex ) - self:F( { self.SpawnTemplatePrefix, self.SpawnAliasPrefix, SpawnIndex } ) - - if not self.SpawnGroups[SpawnIndex] then - self.SpawnGroups[SpawnIndex] = {} - self.SpawnGroups[SpawnIndex].Visible = false - self.SpawnGroups[SpawnIndex].Spawned = false - self.SpawnGroups[SpawnIndex].UnControlled = false - self.SpawnGroups[SpawnIndex].SpawnTime = 0 - - self.SpawnGroups[SpawnIndex].SpawnTemplatePrefix = self.SpawnTemplatePrefix - self.SpawnGroups[SpawnIndex].SpawnTemplate = self:_Prepare( self.SpawnGroups[SpawnIndex].SpawnTemplatePrefix, SpawnIndex ) - end - - self:_RandomizeTemplate( SpawnIndex ) - self:_RandomizeRoute( SpawnIndex ) - --self:_TranslateRotate( SpawnIndex ) - - return self.SpawnGroups[SpawnIndex] -end - - - ---- Gets the CategoryID of the Group with the given SpawnPrefix -function SPAWN:_GetGroupCategoryID( SpawnPrefix ) - local TemplateGroup = Group.getByName( SpawnPrefix ) - - if TemplateGroup then - return TemplateGroup:getCategory() - else - return nil - end -end - ---- Gets the CoalitionID of the Group with the given SpawnPrefix -function SPAWN:_GetGroupCoalitionID( SpawnPrefix ) - local TemplateGroup = Group.getByName( SpawnPrefix ) - - if TemplateGroup then - return TemplateGroup:getCoalition() - else - return nil - end -end - ---- Gets the CountryID of the Group with the given SpawnPrefix -function SPAWN:_GetGroupCountryID( SpawnPrefix ) - self:F( { self.SpawnTemplatePrefix, self.SpawnAliasPrefix, SpawnPrefix } ) - - local TemplateGroup = Group.getByName( SpawnPrefix ) - - if TemplateGroup then - local TemplateUnits = TemplateGroup:getUnits() - return TemplateUnits[1]:getCountry() - else - return nil - end -end - ---- Gets the Group Template from the ME environment definition. --- This method used the @{DATABASE} object, which contains ALL initial and new spawned object in MOOSE. --- @param #SPAWN self --- @param #string SpawnTemplatePrefix --- @return @SPAWN self -function SPAWN:_GetTemplate( SpawnTemplatePrefix ) - self:F( { self.SpawnTemplatePrefix, self.SpawnAliasPrefix, SpawnTemplatePrefix } ) - - local SpawnTemplate = nil - - SpawnTemplate = routines.utils.deepCopy( _DATABASE.Templates.Groups[SpawnTemplatePrefix].Template ) - - if SpawnTemplate == nil then - error( 'No Template returned for SpawnTemplatePrefix = ' .. SpawnTemplatePrefix ) - end - - SpawnTemplate.SpawnCoalitionID = self:_GetGroupCoalitionID( SpawnTemplatePrefix ) - SpawnTemplate.SpawnCategoryID = self:_GetGroupCategoryID( SpawnTemplatePrefix ) - SpawnTemplate.SpawnCountryID = self:_GetGroupCountryID( SpawnTemplatePrefix ) - - self:T( { SpawnTemplate } ) - return SpawnTemplate -end - ---- Prepares the new Group Template. --- @param #SPAWN self --- @param #string SpawnTemplatePrefix --- @param #number SpawnIndex --- @return #SPAWN self -function SPAWN:_Prepare( SpawnTemplatePrefix, SpawnIndex ) - self:F( { self.SpawnTemplatePrefix, self.SpawnAliasPrefix } ) - - local SpawnTemplate = self:_GetTemplate( SpawnTemplatePrefix ) - SpawnTemplate.name = self:SpawnGroupName( SpawnIndex ) - - SpawnTemplate.groupId = nil - SpawnTemplate.lateActivation = false - - if SpawnTemplate.SpawnCategoryID == Group.Category.GROUND then - self:T( "For ground units, visible needs to be false..." ) - SpawnTemplate.visible = false - end - - if SpawnTemplate.SpawnCategoryID == Group.Category.HELICOPTER or SpawnTemplate.SpawnCategoryID == Group.Category.AIRPLANE then - SpawnTemplate.uncontrolled = false - end - - for UnitID = 1, #SpawnTemplate.units do - SpawnTemplate.units[UnitID].name = string.format( SpawnTemplate.name .. '-%02d', UnitID ) - SpawnTemplate.units[UnitID].unitId = nil - SpawnTemplate.units[UnitID].x = SpawnTemplate.route.points[1].x - SpawnTemplate.units[UnitID].y = SpawnTemplate.route.points[1].y - end - - self:T( { "Template:", SpawnTemplate } ) - return SpawnTemplate - -end - ---- Private method randomizing the routes. --- @param #SPAWN self --- @param #number SpawnIndex The index of the group to be spawned. --- @return #SPAWN -function SPAWN:_RandomizeRoute( SpawnIndex ) - self:F( { self.SpawnTemplatePrefix, SpawnIndex, self.SpawnRandomizeRoute, self.SpawnRandomizeRouteStartPoint, self.SpawnRandomizeRouteEndPoint, self.SpawnRandomizeRouteRadius } ) - - if self.SpawnRandomizeRoute then - local SpawnTemplate = self.SpawnGroups[SpawnIndex].SpawnTemplate - local RouteCount = #SpawnTemplate.route.points - - for t = self.SpawnRandomizeRouteStartPoint + 1, ( RouteCount - self.SpawnRandomizeRouteEndPoint ) do - SpawnTemplate.route.points[t].x = SpawnTemplate.route.points[t].x + math.random( self.SpawnRandomizeRouteRadius * -1, self.SpawnRandomizeRouteRadius ) - SpawnTemplate.route.points[t].y = SpawnTemplate.route.points[t].y + math.random( self.SpawnRandomizeRouteRadius * -1, self.SpawnRandomizeRouteRadius ) - -- TODO: manage altitude for airborne units ... - SpawnTemplate.route.points[t].alt = nil - --SpawnGroup.route.points[t].alt_type = nil - self:T( 'SpawnTemplate.route.points[' .. t .. '].x = ' .. SpawnTemplate.route.points[t].x .. ', SpawnTemplate.route.points[' .. t .. '].y = ' .. SpawnTemplate.route.points[t].y ) - end - end - - return self -end - ---- Private method that randomizes the template of the group. --- @param #SPAWN self --- @param #number SpawnIndex --- @return #SPAWN self -function SPAWN:_RandomizeTemplate( SpawnIndex ) - self:F( { self.SpawnTemplatePrefix, SpawnIndex } ) - - if self.SpawnRandomizeTemplate then - self.SpawnGroups[SpawnIndex].SpawnTemplatePrefix = self.SpawnTemplatePrefixTable[ math.random( 1, #self.SpawnTemplatePrefixTable ) ] - self.SpawnGroups[SpawnIndex].SpawnTemplate = self:_Prepare( self.SpawnGroups[SpawnIndex].SpawnTemplatePrefix, SpawnIndex ) - self.SpawnGroups[SpawnIndex].SpawnTemplate.route = routines.utils.deepCopy( self.SpawnTemplate.route ) - self.SpawnGroups[SpawnIndex].SpawnTemplate.x = self.SpawnTemplate.x - self.SpawnGroups[SpawnIndex].SpawnTemplate.y = self.SpawnTemplate.y - self.SpawnGroups[SpawnIndex].SpawnTemplate.start_time = self.SpawnTemplate.start_time - for UnitID = 1, #self.SpawnGroups[SpawnIndex].SpawnTemplate.units do - self.SpawnGroups[SpawnIndex].SpawnTemplate.units[UnitID].heading = self.SpawnTemplate.units[1].heading - end - end - - self:_RandomizeRoute( SpawnIndex ) - - return self -end - -function SPAWN:_TranslateRotate( SpawnIndex, SpawnRootX, SpawnRootY, SpawnX, SpawnY, SpawnAngle ) - self:F( { self.SpawnTemplatePrefix, SpawnIndex, SpawnRootX, SpawnRootY, SpawnX, SpawnY, SpawnAngle } ) - - -- Translate - local TranslatedX = SpawnX - local TranslatedY = SpawnY - - -- Rotate - -- From Wikipedia: https://en.wikipedia.org/wiki/Rotation_matrix#Common_rotations - -- x' = x \cos \theta - y \sin \theta\ - -- y' = x \sin \theta + y \cos \theta\ - local RotatedX = - TranslatedX * math.cos( math.rad( SpawnAngle ) ) - + TranslatedY * math.sin( math.rad( SpawnAngle ) ) - local RotatedY = TranslatedX * math.sin( math.rad( SpawnAngle ) ) - + TranslatedY * math.cos( math.rad( SpawnAngle ) ) - - -- Assign - self.SpawnGroups[SpawnIndex].SpawnTemplate.x = SpawnRootX - RotatedX - self.SpawnGroups[SpawnIndex].SpawnTemplate.y = SpawnRootY + RotatedY - - - local SpawnUnitCount = table.getn( self.SpawnGroups[SpawnIndex].SpawnTemplate.units ) - for u = 1, SpawnUnitCount do - - -- Translate - local TranslatedX = SpawnX - local TranslatedY = SpawnY - 10 * ( u - 1 ) - - -- Rotate - local RotatedX = - TranslatedX * math.cos( math.rad( SpawnAngle ) ) - + TranslatedY * math.sin( math.rad( SpawnAngle ) ) - local RotatedY = TranslatedX * math.sin( math.rad( SpawnAngle ) ) - + TranslatedY * math.cos( math.rad( SpawnAngle ) ) - - -- Assign - self.SpawnGroups[SpawnIndex].SpawnTemplate.units[u].x = SpawnRootX - RotatedX - self.SpawnGroups[SpawnIndex].SpawnTemplate.units[u].y = SpawnRootY + RotatedY - self.SpawnGroups[SpawnIndex].SpawnTemplate.units[u].heading = self.SpawnGroups[SpawnIndex].SpawnTemplate.units[u].heading + math.rad( SpawnAngle ) - end - - return self -end - ---- Get the next index of the groups to be spawned. This function is complicated, as it is used at several spaces. -function SPAWN:_GetSpawnIndex( SpawnIndex ) - self:F( { self.SpawnTemplatePrefix, SpawnIndex, self.SpawnMaxGroups, self.SpawnMaxUnitsAlive, self.AliveUnits, #self.SpawnTemplate.units } ) - - - if ( self.SpawnMaxGroups == 0 ) or ( SpawnIndex <= self.SpawnMaxGroups ) then - if ( self.SpawnMaxUnitsAlive == 0 ) or ( self.AliveUnits < self.SpawnMaxUnitsAlive * #self.SpawnTemplate.units ) or self.UnControlled then - if SpawnIndex and SpawnIndex >= self.SpawnCount + 1 then - self.SpawnCount = self.SpawnCount + 1 - SpawnIndex = self.SpawnCount - end - self.SpawnIndex = SpawnIndex - if not self.SpawnGroups[self.SpawnIndex] then - self:_InitializeSpawnGroups( self.SpawnIndex ) - end - else - return nil - end - else - return nil - end - - return self.SpawnIndex -end - - --- TODO Need to delete this... _DATABASE does this now ... -function SPAWN:_OnBirth( event ) - - if timer.getTime0() < timer.getAbsTime() then -- dont need to add units spawned in at the start of the mission if mist is loaded in init line - if event.initiator and event.initiator:getName() then - local EventPrefix = self:_GetPrefixFromDCSUnit( event.initiator ) - if EventPrefix == self.SpawnTemplatePrefix or ( self.SpawnAliasPrefix and EventPrefix == self.SpawnAliasPrefix ) then - self:T( { "Birth event: " .. event.initiator:getName(), event } ) - --MessageToAll( "Mission command: unit " .. SpawnTemplatePrefix .. " spawned." , 5, EventPrefix .. '/Event') - self.AliveUnits = self.AliveUnits + 1 - self:T( "Alive Units: " .. self.AliveUnits ) - end - end - end - -end - ---- Obscolete --- @todo Need to delete this... _DATABASE does this now ... -function SPAWN:_OnDeadOrCrash( event ) - self:F( self.SpawnTemplatePrefix, event ) - - if event.initiator and event.initiator:getName() then - local EventPrefix = self:_GetPrefixFromDCSUnit( event.initiator ) - if EventPrefix == self.SpawnTemplatePrefix or ( self.SpawnAliasPrefix and EventPrefix == self.SpawnAliasPrefix ) then - self:T( { "Dead event: " .. event.initiator:getName(), event } ) --- local DestroyedUnit = Unit.getByName( EventPrefix ) --- if DestroyedUnit and DestroyedUnit.getLife() <= 1.0 then - --MessageToAll( "Mission command: unit " .. SpawnTemplatePrefix .. " crashed." , 5, EventPrefix .. '/Event') - self.AliveUnits = self.AliveUnits - 1 - self:T( "Alive Units: " .. self.AliveUnits ) --- end - end - end -end - ---- Will detect AIR Units taking off... When the event takes place, the spawned Group is registered as airborne... --- This is needed to ensure that Re-SPAWNing only is done for landed AIR Groups. --- @todo Need to test for AIR Groups only... -function SPAWN:_OnTakeOff( event ) - self:F( self.SpawnTemplatePrefix, event ) - - if event.initiator and event.initiator:getName() then - local SpawnGroup = self:_GetGroupFromDCSUnit( event.initiator ) - if SpawnGroup then - self:T( { "TakeOff event: " .. event.initiator:getName(), event } ) - self:T( "self.Landed = false" ) - self.Landed = false - end - end -end - ---- Will detect AIR Units landing... When the event takes place, the spawned Group is registered as landed. --- This is needed to ensure that Re-SPAWNing is only done for landed AIR Groups. --- @todo Need to test for AIR Groups only... -function SPAWN:_OnLand( event ) - self:F( self.SpawnTemplatePrefix, event ) - - local SpawnUnit = event.initiator - if SpawnUnit and SpawnUnit:isExist() and Object.getCategory(SpawnUnit) == Object.Category.UNIT then - local SpawnGroup = self:_GetGroupFromDCSUnit( SpawnUnit ) - if SpawnGroup then - self:T( { "Landed event:" .. SpawnUnit:getName(), event } ) - self.Landed = true - self:T( "self.Landed = true" ) - if self.Landed and self.RepeatOnLanding then - local SpawnGroupIndex = self:GetSpawnIndexFromGroup( SpawnGroup ) - self:T( { "Landed:", "ReSpawn:", SpawnGroup:GetName(), SpawnGroupIndex } ) - self:ReSpawn( SpawnGroupIndex ) - end - end - end -end - ---- Will detect AIR Units shutting down their engines ... --- When the event takes place, and the method @{RepeatOnEngineShutDown} was called, the spawned Group will Re-SPAWN. --- But only when the Unit was registered to have landed. --- @param #SPAWN self --- @see _OnTakeOff --- @see _OnLand --- @todo Need to test for AIR Groups only... -function SPAWN:_OnEngineShutDown( event ) - self:F( self.SpawnTemplatePrefix, event ) - - local SpawnUnit = event.initiator - if SpawnUnit and SpawnUnit:isExist() and Object.getCategory(SpawnUnit) == Object.Category.UNIT then - local SpawnGroup = self:_GetGroupFromDCSUnit( SpawnUnit ) - if SpawnGroup then - self:T( { "EngineShutDown event: " .. SpawnUnit:getName(), event } ) - if self.Landed and self.RepeatOnEngineShutDown then - local SpawnGroupIndex = self:GetSpawnIndexFromGroup( SpawnGroup ) - self:T( { "EngineShutDown: ", "ReSpawn:", SpawnGroup:GetName(), SpawnGroupIndex } ) - self:ReSpawn( SpawnGroupIndex ) - end - end - end -end - ---- This function is called automatically by the Spawning scheduler. --- It is the internal worker method SPAWNing new Groups on the defined time intervals. -function SPAWN:_Scheduler() - self:F( { "_Scheduler", self.SpawnTemplatePrefix, self.SpawnAliasPrefix, self.SpawnIndex, self.SpawnMaxGroups, self.SpawnMaxUnitsAlive } ) - - -- Validate if there are still groups left in the batch... - self:Spawn() - - return true -end - -function SPAWN:_SpawnCleanUpScheduler() - self:F( { "CleanUp Scheduler:", self.SpawnTemplatePrefix } ) - - local SpawnCursor - local SpawnGroup, SpawnCursor = self:GetFirstAliveGroup( SpawnCursor ) - - self:T( { "CleanUp Scheduler:", SpawnGroup } ) - - while SpawnGroup do - - if SpawnGroup:AllOnGround() and SpawnGroup:GetMaxVelocity() < 1 then - if not self.SpawnCleanUpTimeStamps[SpawnGroup:GetName()] then - self.SpawnCleanUpTimeStamps[SpawnGroup:GetName()] = timer.getTime() - else - if self.SpawnCleanUpTimeStamps[SpawnGroup:GetName()] + self.SpawnCleanUpInterval < timer.getTime() then - self:T( { "CleanUp Scheduler:", "Cleaning:", SpawnGroup } ) - SpawnGroup:Destroy() - end - end - else - self.SpawnCleanUpTimeStamps[SpawnGroup:GetName()] = nil - end - - SpawnGroup, SpawnCursor = self:GetNextAliveGroup( SpawnCursor ) - - self:T( { "CleanUp Scheduler:", SpawnGroup } ) - - end - - return true -- Repeat - -end ---- Limit the simultaneous movement of Groups within a running Mission. --- This module is defined to improve the performance in missions, and to bring additional realism for GROUND vehicles. --- Performance: If in a DCSRTE there are a lot of moving GROUND units, then in a multi player mission, this WILL create lag if --- the main DCS execution core of your CPU is fully utilized. So, this class will limit the amount of simultaneous moving GROUND units --- on defined intervals (currently every minute). --- @module MOVEMENT - -Include.File( "Routines" ) - ---- the MOVEMENT class --- @type -MOVEMENT = { - ClassName = "MOVEMENT", -} - ---- Creates the main object which is handling the GROUND forces movement. --- @param table{string,...}|string MovePrefixes is a table of the Prefixes (names) of the GROUND Groups that need to be controlled by the MOVEMENT Object. --- @param number MoveMaximum is a number that defines the maximum amount of GROUND Units to be moving during one minute. --- @return MOVEMENT --- @usage --- -- Limit the amount of simultaneous moving units on the ground to prevent lag. --- Movement_US_Platoons = MOVEMENT:New( { 'US Tank Platoon Left', 'US Tank Platoon Middle', 'US Tank Platoon Right', 'US CH-47D Troops' }, 15 ) - -function MOVEMENT:New( MovePrefixes, MoveMaximum ) - local self = BASE:Inherit( self, BASE:New() ) - self:F( { MovePrefixes, MoveMaximum } ) - - if type( MovePrefixes ) == 'table' then - self.MovePrefixes = MovePrefixes - else - self.MovePrefixes = { MovePrefixes } - end - self.MoveCount = 0 -- The internal counter of the amount of Moveing the has happened since MoveStart. - self.MoveMaximum = MoveMaximum -- Contains the Maximum amount of units that are allowed to move... - self.AliveUnits = 0 -- Contains the counter how many units are currently alive - self.MoveUnits = {} -- Reflects if the Moving for this MovePrefixes is going to be scheduled or not. - - _EVENTDISPATCHER:OnBirth( self.OnBirth, self ) - --- self:AddEvent( world.event.S_EVENT_BIRTH, self.OnBirth ) --- --- self:EnableEvents() - - self:ScheduleStart() - - return self -end - ---- Call this function to start the MOVEMENT scheduling. -function MOVEMENT:ScheduleStart() - self:F() - --self.MoveFunction = routines.scheduleFunction( self._Scheduler, { self }, timer.getTime() + 1, 120 ) - self.MoveFunction = SCHEDULER:New( self, self._Scheduler, {}, 1, 120 ) -end - ---- Call this function to stop the MOVEMENT scheduling. --- @todo need to implement it ... Forgot. -function MOVEMENT:ScheduleStop() - self:F() - -end - ---- Captures the birth events when new Units were spawned. --- @todo This method should become obsolete. The new @{DATABASE} class will handle the collection administration. -function MOVEMENT:OnBirth( Event ) - self:F( { Event } ) - - if timer.getTime0() < timer.getAbsTime() then -- dont need to add units spawned in at the start of the mission if mist is loaded in init line - if Event.IniDCSUnit then - self:T( "Birth object : " .. Event.IniDCSUnitName ) - if Event.IniDCSGroup and Event.IniDCSGroup:isExist() then - for MovePrefixID, MovePrefix in pairs( self.MovePrefixes ) do - if string.find( Event.IniDCSUnitName, MovePrefix, 1, true ) then - self.AliveUnits = self.AliveUnits + 1 - self.MoveUnits[Event.IniDCSUnitName] = Event.IniDCSGroupName - self:T( self.AliveUnits ) - end - end - end - end - _EVENTDISPATCHER:OnCrashForUnit( Event.IniDCSUnitName, self.OnDeadOrCrash, self ) - _EVENTDISPATCHER:OnDeadForUnit( Event.IniDCSUnitName, self.OnDeadOrCrash, self ) - end - -end - ---- Captures the Dead or Crash events when Units crash or are destroyed. --- @todo This method should become obsolete. The new @{DATABASE} class will handle the collection administration. -function MOVEMENT:OnDeadOrCrash( Event ) - self:F( { Event } ) - - if Event.IniDCSUnit then - self:T( "Dead object : " .. Event.IniDCSUnitName ) - for MovePrefixID, MovePrefix in pairs( self.MovePrefixes ) do - if string.find( Event.IniDCSUnitName, MovePrefix, 1, true ) then - self.AliveUnits = self.AliveUnits - 1 - self.MoveUnits[Event.IniDCSUnitName] = nil - self:T( self.AliveUnits ) - end - end - end -end - ---- This function is called automatically by the MOVEMENT scheduler. A new function is scheduled when MoveScheduled is true. -function MOVEMENT:_Scheduler() - self:F( { self.MovePrefixes, self.MoveMaximum, self.AliveUnits, self.MovementGroups } ) - - if self.AliveUnits > 0 then - local MoveProbability = ( self.MoveMaximum * 100 ) / self.AliveUnits - self:T( 'Move Probability = ' .. MoveProbability ) - - for MovementUnitName, MovementGroupName in pairs( self.MoveUnits ) do - local MovementGroup = Group.getByName( MovementGroupName ) - if MovementGroup and MovementGroup:isExist() then - local MoveOrStop = math.random( 1, 100 ) - self:T( 'MoveOrStop = ' .. MoveOrStop ) - if MoveOrStop <= MoveProbability then - self:T( 'Group continues moving = ' .. MovementGroupName ) - trigger.action.groupContinueMoving( MovementGroup ) - else - self:T( 'Group stops moving = ' .. MovementGroupName ) - trigger.action.groupStopMoving( MovementGroup ) - end - else - self.MoveUnits[MovementUnitName] = nil - end - end - end - return true -end ---- Provides defensive behaviour to a set of SAM sites within a running Mission. --- @module Sead --- @author to be searched on the forum --- @author (co) Flightcontrol (Modified and enriched with functionality) - -Include.File( "Routines" ) -Include.File( "Event" ) -Include.File( "Base" ) -Include.File( "Mission" ) -Include.File( "Client" ) -Include.File( "Task" ) - ---- The SEAD class --- @type SEAD --- @extends Base#BASE -SEAD = { - ClassName = "SEAD", - TargetSkill = { - Average = { Evade = 50, DelayOff = { 10, 25 }, DelayOn = { 10, 30 } } , - Good = { Evade = 30, DelayOff = { 8, 20 }, DelayOn = { 20, 40 } } , - High = { Evade = 15, DelayOff = { 5, 17 }, DelayOn = { 30, 50 } } , - Excellent = { Evade = 10, DelayOff = { 3, 10 }, DelayOn = { 30, 60 } } - }, - SEADGroupPrefixes = {} -} - ---- Creates the main object which is handling defensive actions for SA sites or moving SA vehicles. --- When an anti radiation missile is fired (KH-58, KH-31P, KH-31A, KH-25MPU, HARM missiles), the SA will shut down their radars and will take evasive actions... --- Chances are big that the missile will miss. --- @param table{string,...}|string SEADGroupPrefixes which is a table of Prefixes of the SA Groups in the DCSRTE on which evasive actions need to be taken. --- @return SEAD --- @usage --- -- CCCP SEAD Defenses --- -- Defends the Russian SA installations from SEAD attacks. --- SEAD_RU_SAM_Defenses = SEAD:New( { 'RU SA-6 Kub', 'RU SA-6 Defenses', 'RU MI-26 Troops', 'RU Attack Gori' } ) -function SEAD:New( SEADGroupPrefixes ) - local self = BASE:Inherit( self, BASE:New() ) - self:F( SEADGroupPrefixes ) - if type( SEADGroupPrefixes ) == 'table' then - for SEADGroupPrefixID, SEADGroupPrefix in pairs( SEADGroupPrefixes ) do - self.SEADGroupPrefixes[SEADGroupPrefix] = SEADGroupPrefix - end - else - self.SEADGroupNames[SEADGroupPrefixes] = SEADGroupPrefixes - end - _EVENTDISPATCHER:OnShot( self.EventShot, self ) - - return self -end - ---- Detects if an SA site was shot with an anti radiation missile. In this case, take evasive actions based on the skill level set within the ME. --- @see SEAD -function SEAD:EventShot( Event ) - self:F( { Event } ) - - local SEADUnit = Event.IniDCSUnit - local SEADUnitName = Event.IniDCSUnitName - local SEADWeapon = Event.Weapon -- Identify the weapon fired - local SEADWeaponName = Event.WeaponName -- return weapon type - --trigger.action.outText( string.format("Alerte, depart missile " ..string.format(SEADWeaponName)), 20) --debug message - -- Start of the 2nd loop - self:T( "Missile Launched = " .. SEADWeaponName ) - if SEADWeaponName == "KH-58" or SEADWeaponName == "KH-25MPU" or SEADWeaponName == "AGM-88" or SEADWeaponName == "KH-31A" or SEADWeaponName == "KH-31P" then -- Check if the missile is a SEAD - local _evade = math.random (1,100) -- random number for chance of evading action - local _targetMim = Event.Weapon:getTarget() -- Identify target - local _targetMimname = Unit.getName(_targetMim) - local _targetMimgroup = Unit.getGroup(Weapon.getTarget(SEADWeapon)) - local _targetMimgroupName = _targetMimgroup:getName() - local _targetMimcont= _targetMimgroup:getController() - local _targetskill = _DATABASE.Templates.Units[_targetMimname].Template.skill - self:T( self.SEADGroupPrefixes ) - self:T( _targetMimgroupName ) - local SEADGroupFound = false - for SEADGroupPrefixID, SEADGroupPrefix in pairs( self.SEADGroupPrefixes ) do - if string.find( _targetMimgroupName, SEADGroupPrefix, 1, true ) then - SEADGroupFound = true - self:T( 'Group Found' ) - break - end - end - if SEADGroupFound == true then - if _targetskill == "Random" then -- when skill is random, choose a skill - local Skills = { "Average", "Good", "High", "Excellent" } - _targetskill = Skills[ math.random(1,4) ] - end - self:T( _targetskill ) -- debug message for skill check - if self.TargetSkill[_targetskill] then - if (_evade > self.TargetSkill[_targetskill].Evade) then - self:T( string.format("Evading, target skill " ..string.format(_targetskill)) ) --debug message - local _targetMim = Weapon.getTarget(SEADWeapon) - local _targetMimname = Unit.getName(_targetMim) - local _targetMimgroup = Unit.getGroup(Weapon.getTarget(SEADWeapon)) - local _targetMimcont= _targetMimgroup:getController() - routines.groupRandomDistSelf(_targetMimgroup,300,'Diamond',250,20) -- move randomly - local SuppressedGroups1 = {} -- unit suppressed radar off for a random time - local function SuppressionEnd1(id) - id.ctrl:setOption(AI.Option.Ground.id.ALARM_STATE,AI.Option.Ground.val.ALARM_STATE.GREEN) - SuppressedGroups1[id.groupName] = nil - end - local id = { - groupName = _targetMimgroup, - ctrl = _targetMimcont - } - local delay1 = math.random(self.TargetSkill[_targetskill].DelayOff[1], self.TargetSkill[_targetskill].DelayOff[2]) - if SuppressedGroups1[id.groupName] == nil then - SuppressedGroups1[id.groupName] = { - SuppressionEndTime1 = timer.getTime() + delay1, - SuppressionEndN1 = SuppressionEndCounter1 --Store instance of SuppressionEnd() scheduled function - } - Controller.setOption(_targetMimcont, AI.Option.Ground.id.ALARM_STATE,AI.Option.Ground.val.ALARM_STATE.GREEN) - timer.scheduleFunction(SuppressionEnd1, id, SuppressedGroups1[id.groupName].SuppressionEndTime1) --Schedule the SuppressionEnd() function - --trigger.action.outText( string.format("Radar Off " ..string.format(delay1)), 20) - end - - local SuppressedGroups = {} - local function SuppressionEnd(id) - id.ctrl:setOption(AI.Option.Ground.id.ALARM_STATE,AI.Option.Ground.val.ALARM_STATE.RED) - SuppressedGroups[id.groupName] = nil - end - local id = { - groupName = _targetMimgroup, - ctrl = _targetMimcont - } - local delay = math.random(self.TargetSkill[_targetskill].DelayOn[1], self.TargetSkill[_targetskill].DelayOn[2]) - if SuppressedGroups[id.groupName] == nil then - SuppressedGroups[id.groupName] = { - SuppressionEndTime = timer.getTime() + delay, - SuppressionEndN = SuppressionEndCounter --Store instance of SuppressionEnd() scheduled function - } - timer.scheduleFunction(SuppressionEnd, id, SuppressedGroups[id.groupName].SuppressionEndTime) --Schedule the SuppressionEnd() function - --trigger.action.outText( string.format("Radar On " ..string.format(delay)), 20) - end - end - end - end - end -end ---- Taking the lead of AI escorting your flight. --- --- @{#ESCORT} class --- ================ --- The @{#ESCORT} class allows you to interact with escorting AI on your flight and take the lead. --- Each escorting group can be commanded with a whole set of radio commands (radio menu in your flight, and then F10). --- --- The radio commands will vary according the category of the group. The richest set of commands are with Helicopters and AirPlanes. --- Ships and Ground troops will have a more limited set, but they can provide support through the bombing of targets designated by the other escorts. --- --- RADIO MENUs that can be created: --- ================================ --- Find a summary below of the current available commands: --- --- Navigation ...: --- --------------- --- Escort group navigation functions: --- --- * **"Join-Up and Follow at x meters":** The escort group fill follow you at about x meters, and they will follow you. --- * **"Flare":** Provides menu commands to let the escort group shoot a flare in the air in a color. --- * **"Smoke":** Provides menu commands to let the escort group smoke the air in a color. Note that smoking is only available for ground and naval troops. --- --- Hold position ...: --- ------------------ --- Escort group navigation functions: --- --- * **"At current location":** Stops the escort group and they will hover 30 meters above the ground at the position they stopped. --- * **"At client location":** Stops the escort group and they will hover 30 meters above the ground at the position they stopped. --- --- Report targets ...: --- ------------------- --- Report targets will make the escort group to report any target that it identifies within a 8km range. Any detected target can be attacked using the 4. Attack nearby targets function. (see below). --- --- * **"Report now":** Will report the current detected targets. --- * **"Report targets on":** Will make the escort group to report detected targets and will fill the "Attack nearby targets" menu list. --- * **"Report targets off":** Will stop detecting targets. --- --- Scan targets ...: --- ----------------- --- Menu items to pop-up the escort group for target scanning. After scanning, the escort group will resume with the mission or defined task. --- --- * **"Scan targets 30 seconds":** Scan 30 seconds for targets. --- * **"Scan targets 60 seconds":** Scan 60 seconds for targets. --- --- Attack targets ...: --- ------------------- --- This menu item will list all detected targets within a 15km range. Depending on the level of detection (known/unknown) and visuality, the targets type will also be listed. --- --- Request assistance from ...: --- ---------------------------- --- This menu item will list all detected targets within a 15km range, as with the menu item **Attack Targets**. --- This menu item allows to request attack support from other escorts supporting the current client group. --- eg. the function allows a player to request support from the Ship escort to attack a target identified by the Plane escort with its Tomahawk missiles. --- eg. the function allows a player to request support from other Planes escorting to bomb the unit with illumination missiles or bombs, so that the main plane escort can attack the area. --- --- ROE ...: --- -------- --- Sets the Rules of Engagement (ROE) of the escort group when in flight. --- --- * **"Hold Fire":** The escort group will hold fire. --- * **"Return Fire":** The escort group will return fire. --- * **"Open Fire":** The escort group will open fire on designated targets. --- * **"Weapon Free":** The escort group will engage with any target. --- --- Evasion ...: --- ------------ --- Will define the evasion techniques that the escort group will perform during flight or combat. --- --- * **"Fight until death":** The escort group will have no reaction to threats. --- * **"Use flares, chaff and jammers":** The escort group will use passive defense using flares and jammers. No evasive manoeuvres are executed. --- * **"Evade enemy fire":** The rescort group will evade enemy fire before firing. --- * **"Go below radar and evade fire":** The escort group will perform evasive vertical manoeuvres. --- --- Resume Mission ...: --- ------------------- --- Escort groups can have their own mission. This menu item will allow the escort group to resume their Mission from a given waypoint. --- Note that this is really fantastic, as you now have the dynamic of taking control of the escort groups, and allowing them to resume their path or mission. --- --- ESCORT construction methods. --- ============================ --- Create a new SPAWN object with the @{#ESCORT.New} method: --- --- * @{#ESCORT.New}: Creates a new ESCORT object from a @{Group#GROUP} for a @{Client#CLIENT}, with an optional briefing text. --- --- ESCORT initialization methods. --- ============================== --- The following menus are created within the RADIO MENU of an active unit hosted by a player: --- --- * @{#ESCORT.MenuFollowAt}: Creates a menu to make the escort follow the client. --- * @{#ESCORT.MenuHoldAtEscortPosition}: Creates a menu to hold the escort at its current position. --- * @{#ESCORT.MenuHoldAtLeaderPosition}: Creates a menu to hold the escort at the client position. --- * @{#ESCORT.MenuScanForTargets}: Creates a menu so that the escort scans targets. --- * @{#ESCORT.MenuFlare}: Creates a menu to disperse flares. --- * @{#ESCORT.MenuSmoke}: Creates a menu to disparse smoke. --- * @{#ESCORT.MenuReportTargets}: Creates a menu so that the escort reports targets. --- * @{#ESCORT.MenuReportPosition}: Creates a menu so that the escort reports its current position from bullseye. --- * @{#ESCORT.MenuAssistedAttack: Creates a menu so that the escort supportes assisted attack from other escorts with the client. --- * @{#ESCORT.MenuROE: Creates a menu structure to set the rules of engagement of the escort. --- * @{#ESCORT.MenuEvasion: Creates a menu structure to set the evasion techniques when the escort is under threat. --- * @{#ESCORT.MenuResumeMission}: Creates a menu structure so that the escort can resume from a waypoint. --- --- @module Escort --- @author FlightControl - -Include.File( "Routines" ) -Include.File( "Base" ) -Include.File( "Database" ) -Include.File( "Group" ) -Include.File( "Zone" ) - ---- --- @type ESCORT --- @extends Base#BASE --- @field Client#CLIENT EscortClient --- @field Group#GROUP EscortGroup --- @field #string EscortName --- @field #ESCORT.MODE EscortMode The mode the escort is in. --- @field #number FollowScheduler The id of the _FollowScheduler function. --- @field #boolean ReportTargets If true, nearby targets are reported. --- @Field DCSTypes#AI.Option.Air.val.ROE OptionROE Which ROE is set to the EscortGroup. --- @field DCSTypes#AI.Option.Air.val.REACTION_ON_THREAT OptionReactionOnThreat Which REACTION_ON_THREAT is set to the EscortGroup. --- @field Menu#MENU_CLIENT EscortMenuResumeMission -ESCORT = { - ClassName = "ESCORT", - EscortName = nil, -- The Escort Name - EscortClient = nil, - EscortGroup = nil, - EscortMode = nil, - MODE = { - FOLLOW = 1, - MISSION = 2, - }, - Targets = {}, -- The identified targets - FollowScheduler = nil, - ReportTargets = true, - OptionROE = AI.Option.Air.val.ROE.OPEN_FIRE, - OptionReactionOnThreat = AI.Option.Air.val.REACTION_ON_THREAT.ALLOW_ABORT_MISSION, - TaskPoints = {} -} - ---- ESCORT.Mode class --- @type ESCORT.MODE --- @field #number FOLLOW --- @field #number MISSION - ---- MENUPARAM type --- @type MENUPARAM --- @field #ESCORT ParamSelf --- @field #Distance ParamDistance --- @field #function ParamFunction --- @field #string ParamMessage - ---- ESCORT class constructor for an AI group --- @param #ESCORT self --- @param Client#CLIENT EscortClient The client escorted by the EscortGroup. --- @param Group#GROUP EscortGroup The group AI escorting the EscortClient. --- @param #string EscortName Name of the escort. --- @return #ESCORT self -function ESCORT:New( EscortClient, EscortGroup, EscortName, EscortBriefing ) - local self = BASE:Inherit( self, BASE:New() ) - self:F( { EscortClient, EscortGroup, EscortName } ) - - self.EscortClient = EscortClient -- Client#CLIENT - self.EscortGroup = EscortGroup -- Group#GROUP - self.EscortName = EscortName - self.EscortBriefing = EscortBriefing - - self:T( EscortGroup:GetClassNameAndID() ) - - -- Set EscortGroup known at EscortClient. - if not self.EscortClient._EscortGroups then - self.EscortClient._EscortGroups = {} - end - - if not self.EscortClient._EscortGroups[EscortGroup:GetName()] then - self.EscortClient._EscortGroups[EscortGroup:GetName()] = {} - self.EscortClient._EscortGroups[EscortGroup:GetName()].EscortGroup = self.EscortGroup - self.EscortClient._EscortGroups[EscortGroup:GetName()].EscortName = self.EscortName - self.EscortClient._EscortGroups[EscortGroup:GetName()].Targets = {} - self.EscortMode = ESCORT.MODE.FOLLOW - end - - - self.EscortMenu = MENU_CLIENT:New( self.EscortClient, self.EscortName ) - - self.EscortGroup:WayPointInitialize(1) - - self.EscortGroup:OptionROTVertical() - self.EscortGroup:OptionROEOpenFire() - - EscortGroup:MessageToClient( EscortGroup:GetCategoryName() .. " '" .. EscortName .. "' (" .. EscortGroup:GetCallsign() .. ") reporting! " .. - "We're escorting your flight. " .. - "Use the Radio Menu and F10 and use the options under + " .. EscortName .. "\n", - 60, EscortClient - ) - - return self -end - - ---- Defines the default menus --- @param #ESCORT self --- @return #ESCORT -function ESCORT:Menus() - self:F() - - self:MenuFollowAt( 100 ) - self:MenuFollowAt( 200 ) - self:MenuFollowAt( 300 ) - self:MenuFollowAt( 400 ) - - self:MenuScanForTargets( 100, 60 ) - - self:MenuHoldAtEscortPosition( 30 ) - self:MenuHoldAtLeaderPosition( 30 ) - - self:MenuFlare() - self:MenuSmoke() - - self:MenuReportTargets( 60 ) - self:MenuAssistedAttack() - self:MenuROE() - self:MenuEvasion() - self:MenuResumeMission() - - return self -end - - - ---- Defines a menu slot to let the escort Join and Follow you at a certain distance. --- This menu will appear under **Navigation**. --- @param #ESCORT self --- @param DCSTypes#Distance Distance The distance in meters that the escort needs to follow the client. --- @return #ESCORT -function ESCORT:MenuFollowAt( Distance ) - self:F(Distance) - - if self.EscortGroup:IsAir() then - if not self.EscortMenuReportNavigation then - self.EscortMenuReportNavigation = MENU_CLIENT:New( self.EscortClient, "Navigation", self.EscortMenu ) - end - - if not self.EscortMenuJoinUpAndFollow then - self.EscortMenuJoinUpAndFollow = {} - end - - self.EscortMenuJoinUpAndFollow[#self.EscortMenuJoinUpAndFollow+1] = MENU_CLIENT_COMMAND:New( self.EscortClient, "Join-Up and Follow at " .. Distance, self.EscortMenuReportNavigation, ESCORT._JoinUpAndFollow, { ParamSelf = self, ParamDistance = Distance } ) - - self.EscortMode = ESCORT.MODE.FOLLOW - end - - return self -end - ---- Defines a menu slot to let the escort hold at their current position and stay low with a specified height during a specified time in seconds. --- This menu will appear under **Hold position**. --- @param #ESCORT self --- @param DCSTypes#Distance Height Optional parameter that sets the height in meters to let the escort orbit at the current location. The default value is 30 meters. --- @param DCSTypes#Time Seconds Optional parameter that lets the escort orbit at the current position for a specified time. (not implemented yet). The default value is 0 seconds, meaning, that the escort will orbit forever until a sequent command is given. --- @param #string MenuTextFormat Optional parameter that shows the menu option text. The text string is formatted, and should contain two %d tokens in the string. The first for the Height, the second for the Time (if given). If no text is given, the default text will be displayed. --- @return #ESCORT --- TODO: Implement Seconds parameter. Challenge is to first develop the "continue from last activity" function. -function ESCORT:MenuHoldAtEscortPosition( Height, Seconds, MenuTextFormat ) - self:F( { Height, Seconds, MenuTextFormat } ) - - if self.EscortGroup:IsAir() then - - if not self.EscortMenuHold then - self.EscortMenuHold = MENU_CLIENT:New( self.EscortClient, "Hold position", self.EscortMenu ) - end - - if not Height then - Height = 30 - end - - if not Seconds then - Seconds = 0 - end - - local MenuText = "" - if not MenuTextFormat then - if Seconds == 0 then - MenuText = string.format( "Hold at %d meter", Height ) - else - MenuText = string.format( "Hold at %d meter for %d seconds", Height, Seconds ) - end - else - if Seconds == 0 then - MenuText = string.format( MenuTextFormat, Height ) - else - MenuText = string.format( MenuTextFormat, Height, Seconds ) - end - end - - if not self.EscortMenuHoldPosition then - self.EscortMenuHoldPosition = {} - end - - self.EscortMenuHoldPosition[#self.EscortMenuHoldPosition+1] = MENU_CLIENT_COMMAND - :New( - self.EscortClient, - MenuText, - self.EscortMenuHold, - ESCORT._HoldPosition, - { ParamSelf = self, - ParamOrbitGroup = self.EscortGroup, - ParamHeight = Height, - ParamSeconds = Seconds - } - ) - end - - return self -end - - ---- Defines a menu slot to let the escort hold at the client position and stay low with a specified height during a specified time in seconds. --- This menu will appear under **Navigation**. --- @param #ESCORT self --- @param DCSTypes#Distance Height Optional parameter that sets the height in meters to let the escort orbit at the current location. The default value is 30 meters. --- @param DCSTypes#Time Seconds Optional parameter that lets the escort orbit at the current position for a specified time. (not implemented yet). The default value is 0 seconds, meaning, that the escort will orbit forever until a sequent command is given. --- @param #string MenuTextFormat Optional parameter that shows the menu option text. The text string is formatted, and should contain one or two %d tokens in the string. The first for the Height, the second for the Time (if given). If no text is given, the default text will be displayed. --- @return #ESCORT --- TODO: Implement Seconds parameter. Challenge is to first develop the "continue from last activity" function. -function ESCORT:MenuHoldAtLeaderPosition( Height, Seconds, MenuTextFormat ) - self:F( { Height, Seconds, MenuTextFormat } ) - - if self.EscortGroup:IsAir() then - - if not self.EscortMenuHold then - self.EscortMenuHold = MENU_CLIENT:New( self.EscortClient, "Hold position", self.EscortMenu ) - end - - if not Height then - Height = 30 - end - - if not Seconds then - Seconds = 0 - end - - local MenuText = "" - if not MenuTextFormat then - if Seconds == 0 then - MenuText = string.format( "Rejoin and hold at %d meter", Height ) - else - MenuText = string.format( "Rejoin and hold at %d meter for %d seconds", Height, Seconds ) - end - else - if Seconds == 0 then - MenuText = string.format( MenuTextFormat, Height ) - else - MenuText = string.format( MenuTextFormat, Height, Seconds ) - end - end - - if not self.EscortMenuHoldAtLeaderPosition then - self.EscortMenuHoldAtLeaderPosition = {} - end - - self.EscortMenuHoldAtLeaderPosition[#self.EscortMenuHoldAtLeaderPosition+1] = MENU_CLIENT_COMMAND - :New( - self.EscortClient, - MenuText, - self.EscortMenuHold, - ESCORT._HoldPosition, - { ParamSelf = self, - ParamOrbitGroup = self.EscortClient, - ParamHeight = Height, - ParamSeconds = Seconds - } - ) - end - - return self -end - ---- Defines a menu slot to let the escort scan for targets at a certain height for a certain time in seconds. --- This menu will appear under **Scan targets**. --- @param #ESCORT self --- @param DCSTypes#Distance Height Optional parameter that sets the height in meters to let the escort orbit at the current location. The default value is 30 meters. --- @param DCSTypes#Time Seconds Optional parameter that lets the escort orbit at the current position for a specified time. (not implemented yet). The default value is 0 seconds, meaning, that the escort will orbit forever until a sequent command is given. --- @param #string MenuTextFormat Optional parameter that shows the menu option text. The text string is formatted, and should contain one or two %d tokens in the string. The first for the Height, the second for the Time (if given). If no text is given, the default text will be displayed. --- @return #ESCORT -function ESCORT:MenuScanForTargets( Height, Seconds, MenuTextFormat ) - self:F( { Height, Seconds, MenuTextFormat } ) - - if self.EscortGroup:IsAir() then - if not self.EscortMenuScan then - self.EscortMenuScan = MENU_CLIENT:New( self.EscortClient, "Scan for targets", self.EscortMenu ) - end - - if not Height then - Height = 100 - end - - if not Seconds then - Seconds = 30 - end - - local MenuText = "" - if not MenuTextFormat then - if Seconds == 0 then - MenuText = string.format( "At %d meter", Height ) - else - MenuText = string.format( "At %d meter for %d seconds", Height, Seconds ) - end - else - if Seconds == 0 then - MenuText = string.format( MenuTextFormat, Height ) - else - MenuText = string.format( MenuTextFormat, Height, Seconds ) - end - end - - if not self.EscortMenuScanForTargets then - self.EscortMenuScanForTargets = {} - end - - self.EscortMenuScanForTargets[#self.EscortMenuScanForTargets+1] = MENU_CLIENT_COMMAND - :New( - self.EscortClient, - MenuText, - self.EscortMenuScan, - ESCORT._ScanTargets, - { ParamSelf = self, - ParamScanDuration = 30 - } - ) - end - - return self -end - - - ---- Defines a menu slot to let the escort disperse a flare in a certain color. --- This menu will appear under **Navigation**. --- The flare will be fired from the first unit in the group. --- @param #ESCORT self --- @param #string MenuTextFormat Optional parameter that shows the menu option text. If no text is given, the default text will be displayed. --- @return #ESCORT -function ESCORT:MenuFlare( MenuTextFormat ) - self:F() - - if not self.EscortMenuReportNavigation then - self.EscortMenuReportNavigation = MENU_CLIENT:New( self.EscortClient, "Navigation", self.EscortMenu ) - end - - local MenuText = "" - if not MenuTextFormat then - MenuText = "Flare" - else - MenuText = MenuTextFormat - end - - if not self.EscortMenuFlare then - self.EscortMenuFlare = MENU_CLIENT:New( self.EscortClient, MenuText, self.EscortMenuReportNavigation, ESCORT._Flare, { ParamSelf = self } ) - self.EscortMenuFlareGreen = MENU_CLIENT_COMMAND:New( self.EscortClient, "Release green flare", self.EscortMenuFlare, ESCORT._Flare, { ParamSelf = self, ParamColor = UNIT.FlareColor.Green, ParamMessage = "Released a green flare!" } ) - self.EscortMenuFlareRed = MENU_CLIENT_COMMAND:New( self.EscortClient, "Release red flare", self.EscortMenuFlare, ESCORT._Flare, { ParamSelf = self, ParamColor = UNIT.FlareColor.Red, ParamMessage = "Released a red flare!" } ) - self.EscortMenuFlareWhite = MENU_CLIENT_COMMAND:New( self.EscortClient, "Release white flare", self.EscortMenuFlare, ESCORT._Flare, { ParamSelf = self, ParamColor = UNIT.FlareColor.White, ParamMessage = "Released a white flare!" } ) - self.EscortMenuFlareYellow = MENU_CLIENT_COMMAND:New( self.EscortClient, "Release yellow flare", self.EscortMenuFlare, ESCORT._Flare, { ParamSelf = self, ParamColor = UNIT.FlareColor.Yellow, ParamMessage = "Released a yellow flare!" } ) - end - - return self -end - ---- Defines a menu slot to let the escort disperse a smoke in a certain color. --- This menu will appear under **Navigation**. --- Note that smoke menu options will only be displayed for ships and ground units. Not for air units. --- The smoke will be fired from the first unit in the group. --- @param #ESCORT self --- @param #string MenuTextFormat Optional parameter that shows the menu option text. If no text is given, the default text will be displayed. --- @return #ESCORT -function ESCORT:MenuSmoke( MenuTextFormat ) - self:F() - - if not self.EscortGroup:IsAir() then - if not self.EscortMenuReportNavigation then - self.EscortMenuReportNavigation = MENU_CLIENT:New( self.EscortClient, "Navigation", self.EscortMenu ) - end - - local MenuText = "" - if not MenuTextFormat then - MenuText = "Smoke" - else - MenuText = MenuTextFormat - end - - if not self.EscortMenuSmoke then - self.EscortMenuSmoke = MENU_CLIENT:New( self.EscortClient, "Smoke", self.EscortMenuReportNavigation, ESCORT._Smoke, { ParamSelf = self } ) - self.EscortMenuSmokeGreen = MENU_CLIENT_COMMAND:New( self.EscortClient, "Release green smoke", self.EscortMenuSmoke, ESCORT._Smoke, { ParamSelf = self, ParamColor = UNIT.SmokeColor.Green, ParamMessage = "Releasing green smoke!" } ) - self.EscortMenuSmokeRed = MENU_CLIENT_COMMAND:New( self.EscortClient, "Release red smoke", self.EscortMenuSmoke, ESCORT._Smoke, { ParamSelf = self, ParamColor = UNIT.SmokeColor.Red, ParamMessage = "Releasing red smoke!" } ) - self.EscortMenuSmokeWhite = MENU_CLIENT_COMMAND:New( self.EscortClient, "Release white smoke", self.EscortMenuSmoke, ESCORT._Smoke, { ParamSelf = self, ParamColor = UNIT.SmokeColor.White, ParamMessage = "Releasing white smoke!" } ) - self.EscortMenuSmokeOrange = MENU_CLIENT_COMMAND:New( self.EscortClient, "Release orange smoke", self.EscortMenuSmoke, ESCORT._Smoke, { ParamSelf = self, ParamColor = UNIT.SmokeColor.Orange, ParamMessage = "Releasing orange smoke!" } ) - self.EscortMenuSmokeBlue = MENU_CLIENT_COMMAND:New( self.EscortClient, "Release blue smoke", self.EscortMenuSmoke, ESCORT._Smoke, { ParamSelf = self, ParamColor = UNIT.SmokeColor.Blue, ParamMessage = "Releasing blue smoke!" } ) - end - end - - return self -end - ---- Defines a menu slot to let the escort report their current detected targets with a specified time interval in seconds. --- This menu will appear under **Report targets**. --- Note that if a report targets menu is not specified, no targets will be detected by the escort, and the attack and assisted attack menus will not be displayed. --- @param #ESCORT self --- @param DCSTypes#Time Seconds Optional parameter that lets the escort report their current detected targets after specified time interval in seconds. The default time is 30 seconds. --- @return #ESCORT -function ESCORT:MenuReportTargets( Seconds ) - self:F( { Seconds } ) - - if not self.EscortMenuReportNearbyTargets then - self.EscortMenuReportNearbyTargets = MENU_CLIENT:New( self.EscortClient, "Report targets", self.EscortMenu ) - end - - if not Seconds then - Seconds = 30 - end - - -- Report Targets - self.EscortMenuReportNearbyTargetsNow = MENU_CLIENT_COMMAND:New( self.EscortClient, "Report targets now!", self.EscortMenuReportNearbyTargets, ESCORT._ReportNearbyTargetsNow, { ParamSelf = self } ) - self.EscortMenuReportNearbyTargetsOn = MENU_CLIENT_COMMAND:New( self.EscortClient, "Report targets on", self.EscortMenuReportNearbyTargets, ESCORT._SwitchReportNearbyTargets, { ParamSelf = self, ParamReportTargets = true } ) - self.EscortMenuReportNearbyTargetsOff = MENU_CLIENT_COMMAND:New( self.EscortClient, "Report targets off", self.EscortMenuReportNearbyTargets, ESCORT._SwitchReportNearbyTargets, { ParamSelf = self, ParamReportTargets = false, } ) - - -- Attack Targets - self.EscortMenuAttackNearbyTargets = MENU_CLIENT:New( self.EscortClient, "Attack targets", self.EscortMenu ) - - - --self.ReportTargetsScheduler = routines.scheduleFunction( self._ReportTargetsScheduler, { self }, timer.getTime() + 1, Seconds ) - self.ReportTargetsScheduler = SCHEDULER:New( self, self._ReportTargetsScheduler, {}, 1, Seconds ) - - return self -end - ---- Defines a menu slot to let the escort attack its detected targets using assisted attack from another escort joined also with the client. --- This menu will appear under **Request assistance from**. --- Note that this method needs to be preceded with the method MenuReportTargets. --- @param #ESCORT self --- @return #ESCORT -function ESCORT:MenuAssistedAttack() - self:F() - - -- Request assistance from other escorts. - -- This is very useful to let f.e. an escorting ship attack a target detected by an escorting plane... - self.EscortMenuTargetAssistance = MENU_CLIENT:New( self.EscortClient, "Request assistance from", self.EscortMenu ) - - return self -end - ---- Defines a menu to let the escort set its rules of engagement. --- All rules of engagement will appear under the menu **ROE**. --- @param #ESCORT self --- @return #ESCORT -function ESCORT:MenuROE( MenuTextFormat ) - self:F( MenuTextFormat ) - - if not self.EscortMenuROE then - -- Rules of Engagement - self.EscortMenuROE = MENU_CLIENT:New( self.EscortClient, "ROE", self.EscortMenu ) - if self.EscortGroup:OptionROEHoldFirePossible() then - self.EscortMenuROEHoldFire = MENU_CLIENT_COMMAND:New( self.EscortClient, "Hold Fire", self.EscortMenuROE, ESCORT._ROE, { ParamSelf = self, ParamFunction = self.EscortGroup:OptionROEHoldFire(), ParamMessage = "Holding weapons!" } ) - end - if self.EscortGroup:OptionROEReturnFirePossible() then - self.EscortMenuROEReturnFire = MENU_CLIENT_COMMAND:New( self.EscortClient, "Return Fire", self.EscortMenuROE, ESCORT._ROE, { ParamSelf = self, ParamFunction = self.EscortGroup:OptionROEReturnFire(), ParamMessage = "Returning fire!" } ) - end - if self.EscortGroup:OptionROEOpenFirePossible() then - self.EscortMenuROEOpenFire = MENU_CLIENT_COMMAND:New( self.EscortClient, "Open Fire", self.EscortMenuROE, ESCORT._ROE, { ParamSelf = self, ParamFunction = self.EscortGroup:OptionROEOpenFire(), ParamMessage = "Opening fire on designated targets!!" } ) - end - if self.EscortGroup:OptionROEWeaponFreePossible() then - self.EscortMenuROEWeaponFree = MENU_CLIENT_COMMAND:New( self.EscortClient, "Weapon Free", self.EscortMenuROE, ESCORT._ROE, { ParamSelf = self, ParamFunction = self.EscortGroup:OptionROEWeaponFree(), ParamMessage = "Opening fire on targets of opportunity!" } ) - end - end - - return self -end - - ---- Defines a menu to let the escort set its evasion when under threat. --- All rules of engagement will appear under the menu **Evasion**. --- @param #ESCORT self --- @return #ESCORT -function ESCORT:MenuEvasion( MenuTextFormat ) - self:F( MenuTextFormat ) - - if self.EscortGroup:IsAir() then - if not self.EscortMenuEvasion then - -- Reaction to Threats - self.EscortMenuEvasion = MENU_CLIENT:New( self.EscortClient, "Evasion", self.EscortMenu ) - if self.EscortGroup:OptionROTNoReactionPossible() then - self.EscortMenuEvasionNoReaction = MENU_CLIENT_COMMAND:New( self.EscortClient, "Fight until death", self.EscortMenuEvasion, ESCORT._ROT, { ParamSelf = self, ParamFunction = self.EscortGroup:OptionROTNoReaction(), ParamMessage = "Fighting until death!" } ) - end - if self.EscortGroup:OptionROTPassiveDefensePossible() then - self.EscortMenuEvasionPassiveDefense = MENU_CLIENT_COMMAND:New( self.EscortClient, "Use flares, chaff and jammers", self.EscortMenuEvasion, ESCORT._ROT, { ParamSelf = self, ParamFunction = self.EscortGroup:OptionROTPassiveDefense(), ParamMessage = "Defending using jammers, chaff and flares!" } ) - end - if self.EscortGroup:OptionROTEvadeFirePossible() then - self.EscortMenuEvasionEvadeFire = MENU_CLIENT_COMMAND:New( self.EscortClient, "Evade enemy fire", self.EscortMenuEvasion, ESCORT._ROT, { ParamSelf = self, ParamFunction = self.EscortGroup:OptionROTEvadeFire(), ParamMessage = "Evading on enemy fire!" } ) - end - if self.EscortGroup:OptionROTVerticalPossible() then - self.EscortMenuOptionEvasionVertical = MENU_CLIENT_COMMAND:New( self.EscortClient, "Go below radar and evade fire", self.EscortMenuEvasion, ESCORT._ROT, { ParamSelf = self, ParamFunction = self.EscortGroup:OptionROTVertical(), ParamMessage = "Evading on enemy fire with vertical manoeuvres!" } ) - end - end - end - - return self -end - ---- Defines a menu to let the escort resume its mission from a waypoint on its route. --- All rules of engagement will appear under the menu **Resume mission from**. --- @param #ESCORT self --- @return #ESCORT -function ESCORT:MenuResumeMission() - self:F() - - if not self.EscortMenuResumeMission then - -- Mission Resume Menu Root - self.EscortMenuResumeMission = MENU_CLIENT:New( self.EscortClient, "Resume mission from", self.EscortMenu ) - end - - return self -end - - ---- @param #MENUPARAM MenuParam -function ESCORT._HoldPosition( MenuParam ) - - local self = MenuParam.ParamSelf - local EscortGroup = self.EscortGroup - local EscortClient = self.EscortClient - - local OrbitGroup = MenuParam.ParamOrbitGroup -- Group#GROUP - local OrbitUnit = OrbitGroup:GetUnit(1) -- Unit#UNIT - local OrbitHeight = MenuParam.ParamHeight - local OrbitSeconds = MenuParam.ParamSeconds -- Not implemented yet - - routines.removeFunction( self.FollowScheduler ) - - local PointFrom = {} - local GroupPoint = EscortGroup:GetUnit(1):GetPointVec3() - PointFrom = {} - PointFrom.x = GroupPoint.x - PointFrom.y = GroupPoint.z - PointFrom.speed = 250 - PointFrom.type = AI.Task.WaypointType.TURNING_POINT - PointFrom.alt = GroupPoint.y - PointFrom.alt_type = AI.Task.AltitudeType.BARO - - local OrbitPoint = OrbitUnit:GetPointVec2() - local PointTo = {} - PointTo.x = OrbitPoint.x - PointTo.y = OrbitPoint.y - PointTo.speed = 250 - PointTo.type = AI.Task.WaypointType.TURNING_POINT - PointTo.alt = OrbitHeight - PointTo.alt_type = AI.Task.AltitudeType.BARO - PointTo.task = EscortGroup:TaskOrbitCircleAtVec2( OrbitPoint, OrbitHeight, 0 ) - - local Points = { PointFrom, PointTo } - - EscortGroup:OptionROEHoldFire() - EscortGroup:OptionROTPassiveDefense() - - EscortGroup:SetTask( EscortGroup:TaskRoute( Points ) ) - EscortGroup:MessageToClient( "Orbiting at location.", 10, EscortClient ) -end - ---- @param #MENUPARAM MenuParam -function ESCORT._JoinUpAndFollow( MenuParam ) - - local self = MenuParam.ParamSelf - local EscortGroup = self.EscortGroup - local EscortClient = self.EscortClient - - self.Distance = MenuParam.ParamDistance - - self:JoinUpAndFollow( EscortGroup, EscortClient, self.Distance ) -end - ---- JoinsUp and Follows a CLIENT. --- @param Escort#ESCORT self --- @param Group#GROUP EscortGroup --- @param Client#CLIENT EscortClient --- @param DCSTypes#Distance Distance -function ESCORT:JoinUpAndFollow( EscortGroup, EscortClient, Distance ) - self:F( { EscortGroup, EscortClient, Distance } ) - - if self.FollowScheduler then - routines.removeFunction( self.FollowScheduler ) - end - - EscortGroup:OptionROEHoldFire() - EscortGroup:OptionROTPassiveDefense() - - self.EscortMode = ESCORT.MODE.FOLLOW - - self.CT1 = 0 - self.GT1 = 0 - --self.FollowScheduler = routines.scheduleFunction( self._FollowScheduler, { self, Distance }, timer.getTime() + 1, .5 ) - self.FollowScheduler = SCHEDULER:New( self, self._FollowScheduler, { Distance }, 1, .5, .1 ) - EscortGroup:MessageToClient( "Rejoining and Following at " .. Distance .. "!", 30, EscortClient ) -end - ---- @param #MENUPARAM MenuParam -function ESCORT._Flare( MenuParam ) - - local self = MenuParam.ParamSelf - local EscortGroup = self.EscortGroup - local EscortClient = self.EscortClient - - local Color = MenuParam.ParamColor - local Message = MenuParam.ParamMessage - - EscortGroup:GetUnit(1):Flare( Color ) - EscortGroup:MessageToClient( Message, 10, EscortClient ) -end - ---- @param #MENUPARAM MenuParam -function ESCORT._Smoke( MenuParam ) - - local self = MenuParam.ParamSelf - local EscortGroup = self.EscortGroup - local EscortClient = self.EscortClient - - local Color = MenuParam.ParamColor - local Message = MenuParam.ParamMessage - - EscortGroup:GetUnit(1):Smoke( Color ) - EscortGroup:MessageToClient( Message, 10, EscortClient ) -end - - ---- @param #MENUPARAM MenuParam -function ESCORT._ReportNearbyTargetsNow( MenuParam ) - - local self = MenuParam.ParamSelf - local EscortGroup = self.EscortGroup - local EscortClient = self.EscortClient - - self:_ReportTargetsScheduler() - -end - -function ESCORT._SwitchReportNearbyTargets( MenuParam ) - - local self = MenuParam.ParamSelf - local EscortGroup = self.EscortGroup - local EscortClient = self.EscortClient - - self.ReportTargets = MenuParam.ParamReportTargets - - if self.ReportTargets then - if not self.ReportTargetsScheduler then - --self.ReportTargetsScheduler = routines.scheduleFunction( self._ReportTargetsScheduler, { self }, timer.getTime() + 1, 30 ) - self.ReportTargetsScheduler = SCHEDULER:New( self, self._ReportTargetsScheduler, {}, 1, 30 ) - end - else - routines.removeFunction( self.ReportTargetsScheduler ) - self.ReportTargetsScheduler = nil - end -end - ---- @param #MENUPARAM MenuParam -function ESCORT._ScanTargets( MenuParam ) - - local self = MenuParam.ParamSelf - local EscortGroup = self.EscortGroup - local EscortClient = self.EscortClient - - local ScanDuration = MenuParam.ParamScanDuration - - if self.FollowScheduler then - routines.removeFunction( self.FollowScheduler ) - end - - self:T( { "FollowScheduler after removefunction: ", self.FollowScheduler } ) - - if EscortGroup:IsHelicopter() then - SCHEDULER:New( EscortGroup, EscortGroup.PushTask, - { EscortGroup:TaskControlled( - EscortGroup:TaskOrbitCircle( 200, 20 ), - EscortGroup:TaskCondition( nil, nil, nil, nil, ScanDuration, nil ) - ) - }, - 1 - ) - elseif EscortGroup:IsAirPlane() then - SCHEDULER:New( EscortGroup, EscortGroup.PushTask, - { EscortGroup:TaskControlled( - EscortGroup:TaskOrbitCircle( 1000, 500 ), - EscortGroup:TaskCondition( nil, nil, nil, nil, ScanDuration, nil ) - ) - }, - 1 - ) - end - - EscortGroup:MessageToClient( "Scanning targets for " .. ScanDuration .. " seconds.", ScanDuration, EscortClient ) - - if self.EscortMode == ESCORT.MODE.FOLLOW then - --self.FollowScheduler = routines.scheduleFunction( self._FollowScheduler, { self, Distance }, timer.getTime() + ScanDuration, 1 ) - self.FollowScheduler:Start() - end - -end - -function _Resume( EscortGroup ) - env.info( '_Resume' ) - - local Escort = EscortGroup.Escort -- #ESCORT - env.info( "EscortMode = " .. Escort.EscortMode ) - if Escort.EscortMode == ESCORT.MODE.FOLLOW then - Escort:JoinUpAndFollow( EscortGroup, Escort.EscortClient, Escort.Distance ) - end - -end - ---- @param #MENUPARAM MenuParam -function ESCORT._AttackTarget( MenuParam ) - - local self = MenuParam.ParamSelf - local EscortGroup = self.EscortGroup - local EscortClient = self.EscortClient - local AttackUnit = MenuParam.ParamUnit -- Unit#UNIT - - if self.FollowScheduler then - routines.removeFunction( self.FollowScheduler ) - end - - self:T( AttackUnit ) - - if EscortGroup:IsAir() then - EscortGroup:OptionROEOpenFire() - EscortGroup:OptionROTPassiveDefense() - EscortGroup.Escort = self -- Need to do this trick to get the reference for the escort in the _Resume function. --- routines.scheduleFunction( --- EscortGroup.PushTask, --- { EscortGroup, --- EscortGroup:TaskCombo( --- { EscortGroup:TaskAttackUnit( AttackUnit ), --- EscortGroup:TaskFunction( 1, 2, "_Resume", {"''"} ) --- } --- ) --- }, timer.getTime() + 10 --- ) - SCHEDULER:New( EscortGroup, - EscortGroup.PushTask, - { EscortGroup:TaskCombo( - { EscortGroup:TaskAttackUnit( AttackUnit ), - EscortGroup:TaskFunction( 1, 2, "_Resume", {"''"} ) - } - ) - }, 10 - ) - else --- routines.scheduleFunction( --- EscortGroup.PushTask, --- { EscortGroup, --- EscortGroup:TaskCombo( --- { EscortGroup:TaskFireAtPoint( AttackUnit:GetPointVec2(), 50 ) --- } --- ) --- }, timer.getTime() + 10 --- ) - SCHEDULER:New( EscortGroup, - EscortGroup.PushTask, - { EscortGroup:TaskCombo( - { EscortGroup:TaskFireAtPoint( AttackUnit:GetPointVec2(), 50 ) - } - ) - }, 10 - ) - end - EscortGroup:MessageToClient( "Engaging Designated Unit!", 10, EscortClient ) - - -end - ---- @param #MENUPARAM MenuParam -function ESCORT._AssistTarget( MenuParam ) - - local self = MenuParam.ParamSelf - local EscortGroup = self.EscortGroup - local EscortClient = self.EscortClient - local EscortGroupAttack = MenuParam.ParamEscortGroup - local AttackUnit = MenuParam.ParamUnit -- Unit#UNIT - - if self.FollowScheduler then - routines.removeFunction( self.FollowScheduler ) - end - - - self:T( AttackUnit ) - - if EscortGroupAttack:IsAir() then - EscortGroupAttack:OptionROEOpenFire() - EscortGroupAttack:OptionROTVertical() --- routines.scheduleFunction( --- EscortGroupAttack.PushTask, --- { EscortGroupAttack, --- EscortGroupAttack:TaskCombo( --- { EscortGroupAttack:TaskAttackUnit( AttackUnit ), --- EscortGroupAttack:TaskOrbitCircle( 500, 350 ) --- } --- ) --- }, timer.getTime() + 10 --- ) - SCHDULER:New( EscortGroupAttack, - EscortGroupAttack.PushTask, - { EscortGroupAttack:TaskCombo( - { EscortGroupAttack:TaskAttackUnit( AttackUnit ), - EscortGroupAttack:TaskOrbitCircle( 500, 350 ) - } - ) - }, 10 - ) - else --- routines.scheduleFunction( --- EscortGroupAttack.PushTask, --- { EscortGroupAttack, --- EscortGroupAttack:TaskCombo( --- { EscortGroupAttack:TaskFireAtPoint( AttackUnit:GetPointVec2(), 50 ) --- } --- ) --- }, timer.getTime() + 10 --- ) - SCHEDULER:New( EscortGroupAttack, - EscortGroupAttack.PushTask, - { EscortGroupAttack:TaskCombo( - { EscortGroupAttack:TaskFireAtPoint( AttackUnit:GetPointVec2(), 50 ) - } - ) - }, 10 - ) - end - EscortGroupAttack:MessageToClient( "Assisting with the destroying the enemy unit!", 10, EscortClient ) - -end - ---- @param #MENUPARAM MenuParam -function ESCORT._ROE( MenuParam ) - - local self = MenuParam.ParamSelf - local EscortGroup = self.EscortGroup - local EscortClient = self.EscortClient - - local EscortROEFunction = MenuParam.ParamFunction - local EscortROEMessage = MenuParam.ParamMessage - - pcall( function() EscortROEFunction() end ) - EscortGroup:MessageToClient( EscortROEMessage, 10, EscortClient ) -end - ---- @param #MENUPARAM MenuParam -function ESCORT._ROT( MenuParam ) - - local self = MenuParam.ParamSelf - local EscortGroup = self.EscortGroup - local EscortClient = self.EscortClient - - local EscortROTFunction = MenuParam.ParamFunction - local EscortROTMessage = MenuParam.ParamMessage - - pcall( function() EscortROTFunction() end ) - EscortGroup:MessageToClient( EscortROTMessage, 10, EscortClient ) -end - ---- @param #MENUPARAM MenuParam -function ESCORT._ResumeMission( MenuParam ) - - local self = MenuParam.ParamSelf - local EscortGroup = self.EscortGroup - local EscortClient = self.EscortClient - - local WayPoint = MenuParam.ParamWayPoint - - routines.removeFunction( self.FollowScheduler ) - self.FollowScheduler = nil - - local WayPoints = EscortGroup:GetTaskRoute() - self:T( WayPoint, WayPoints ) - - for WayPointIgnore = 1, WayPoint do - table.remove( WayPoints, 1 ) - end - - --routines.scheduleFunction( EscortGroup.SetTask, {EscortGroup, EscortGroup:TaskRoute( WayPoints ) }, timer.getTime() + 1 ) - SCHEDULER:New( EscortGroup, EscortGroup.SetTask, { EscortGroup:TaskRoute( WayPoints ) }, 1 ) - - EscortGroup:MessageToClient( "Resuming mission from waypoint " .. WayPoint .. ".", 10, EscortClient ) -end - ---- Registers the waypoints --- @param #ESCORT self --- @return #table -function ESCORT:RegisterRoute() - self:F() - - local EscortGroup = self.EscortGroup -- Group#GROUP - - local TaskPoints = EscortGroup:GetTaskRoute() - - self:T( TaskPoints ) - - return TaskPoints -end - ---- @param Escort#ESCORT self -function ESCORT:_FollowScheduler( FollowDistance ) - self:F( { FollowDistance }) - - if self.EscortGroup:IsAlive() and self.EscortClient:IsAlive() then - - local ClientUnit = self.EscortClient:GetClientGroupUnit() - local GroupUnit = self.EscortGroup:GetUnit( 1 ) - - if self.CT1 == 0 and self.GT1 == 0 then - self.CV1 = ClientUnit:GetPointVec3() - self.CT1 = timer.getTime() - self.GV1 = GroupUnit:GetPointVec3() - self.GT1 = timer.getTime() - else - local CT1 = self.CT1 - local CT2 = timer.getTime() - local CV1 = self.CV1 - local CV2 = ClientUnit:GetPointVec3() - self.CT1 = CT2 - self.CV1 = CV2 - - local CD = ( ( CV2.x - CV1.x )^2 + ( CV2.y - CV1.y )^2 + ( CV2.z - CV1.z )^2 ) ^ 0.5 - local CT = CT2 - CT1 - - local CS = ( 3600 / CT ) * ( CD / 1000 ) - - self:T2( { "Client:", CS, CD, CT, CV2, CV1, CT2, CT1 } ) - - local GT1 = self.GT1 - local GT2 = timer.getTime() - local GV1 = self.GV1 - local GV2 = GroupUnit:GetPointVec3() - self.GT1 = GT2 - self.GV1 = GV2 - - local GD = ( ( GV2.x - GV1.x )^2 + ( GV2.y - GV1.y )^2 + ( GV2.z - GV1.z )^2 ) ^ 0.5 - local GT = GT2 - GT1 - - local GS = ( 3600 / GT ) * ( GD / 1000 ) - - self:T2( { "Group:", GS, GD, GT, GV2, GV1, GT2, GT1 } ) - - -- Calculate the group direction vector - local GV = { x = GV2.x - CV2.x, y = GV2.y - CV2.y, z = GV2.z - CV2.z } - - -- Calculate GH2, GH2 with the same height as CV2. - local GH2 = { x = GV2.x, y = CV2.y, z = GV2.z } - - -- Calculate the angle of GV to the orthonormal plane - local alpha = math.atan2( GV.z, GV.x ) - - -- Now we calculate the intersecting vector between the circle around CV2 with radius FollowDistance and GH2. - -- From the GeoGebra model: CVI = (x(CV2) + FollowDistance cos(alpha), y(GH2) + FollowDistance sin(alpha), z(CV2)) - local CVI = { x = CV2.x + FollowDistance * math.cos(alpha), - y = GH2.y, - z = CV2.z + FollowDistance * math.sin(alpha), - } - - -- Calculate the direction vector DV of the escort group. We use CVI as the base and CV2 as the direction. - local DV = { x = CV2.x - CVI.x, y = CV2.y - CVI.y, z = CV2.z - CVI.z } - - -- We now calculate the unary direction vector DVu, so that we can multiply DVu with the speed, which is expressed in meters / s. - -- We need to calculate this vector to predict the point the escort group needs to fly to according its speed. - -- The distance of the destination point should be far enough not to have the aircraft starting to swipe left to right... - local DVu = { x = DV.x / FollowDistance, y = DV.y / FollowDistance, z = DV.z / FollowDistance } - - -- Now we can calculate the group destination vector GDV. - local GDV = { x = DVu.x * CS * 8 + CVI.x, y = CVI.y, z = DVu.z * CS * 8 + CVI.z } - - --trigger.action.smoke( GDV, trigger.smokeColor.Red ) - self:T2( { "CV2:", CV2 } ) - self:T2( { "CVI:", CVI } ) - self:T2( { "GDV:", GDV } ) - - -- Measure distance between client and group - local CatchUpDistance = ( ( GDV.x - GV2.x )^2 + ( GDV.y - GV2.y )^2 + ( GDV.z - GV2.z )^2 ) ^ 0.5 - - -- The calculation of the Speed would simulate that the group would take 30 seconds to overcome - -- the requested Distance). - local Time = 10 - local CatchUpSpeed = ( CatchUpDistance - ( CS * 8.4 ) ) / Time - - local Speed = CS + CatchUpSpeed - if Speed < 0 then - Speed = 0 - end - - self:T( { "Client Speed, Escort Speed, Speed, FlyDistance, Time:", CS, GS, Speed, Distance, Time } ) - - -- Now route the escort to the desired point with the desired speed. - self.EscortGroup:TaskRouteToVec3( GDV, Speed / 3.6 ) -- DCS models speed in Mps (Miles per second) - end - return true - end - - return false -end - - ---- Report Targets Scheduler. --- @param #ESCORT self -function ESCORT:_ReportTargetsScheduler() - self:F( self.EscortGroup:GetName() ) - - if self.EscortGroup:IsAlive() and self.EscortClient:IsAlive() then - local EscortGroupName = self.EscortGroup:GetName() - local EscortTargets = self.EscortGroup:GetDetectedTargets() - - local ClientEscortTargets = self.EscortClient._EscortGroups[EscortGroupName].Targets - - local EscortTargetMessages = "" - for EscortTargetID, EscortTarget in pairs( EscortTargets ) do - local EscortObject = EscortTarget.object - self:T( EscortObject ) - if EscortObject and EscortObject:isExist() and EscortObject.id_ < 50000000 then - - local EscortTargetUnit = UNIT:Find( EscortObject ) - local EscortTargetUnitName = EscortTargetUnit:GetName() - - - - -- local EscortTargetIsDetected, - -- EscortTargetIsVisible, - -- EscortTargetLastTime, - -- EscortTargetKnowType, - -- EscortTargetKnowDistance, - -- EscortTargetLastPos, - -- EscortTargetLastVelocity - -- = self.EscortGroup:IsTargetDetected( EscortObject ) - -- - -- self:T( { EscortTargetIsDetected, - -- EscortTargetIsVisible, - -- EscortTargetLastTime, - -- EscortTargetKnowType, - -- EscortTargetKnowDistance, - -- EscortTargetLastPos, - -- EscortTargetLastVelocity } ) - - - local EscortTargetUnitPositionVec3 = EscortTargetUnit:GetPointVec3() - local EscortPositionVec3 = self.EscortGroup:GetPointVec3() - local Distance = ( ( EscortTargetUnitPositionVec3.x - EscortPositionVec3.x )^2 + - ( EscortTargetUnitPositionVec3.y - EscortPositionVec3.y )^2 + - ( EscortTargetUnitPositionVec3.z - EscortPositionVec3.z )^2 - ) ^ 0.5 / 1000 - - self:T( { self.EscortGroup:GetName(), EscortTargetUnit:GetName(), Distance, EscortTarget } ) - - if Distance <= 15 then - - if not ClientEscortTargets[EscortTargetUnitName] then - ClientEscortTargets[EscortTargetUnitName] = {} - end - ClientEscortTargets[EscortTargetUnitName].AttackUnit = EscortTargetUnit - ClientEscortTargets[EscortTargetUnitName].visible = EscortTarget.visible - ClientEscortTargets[EscortTargetUnitName].type = EscortTarget.type - ClientEscortTargets[EscortTargetUnitName].distance = EscortTarget.distance - else - if ClientEscortTargets[EscortTargetUnitName] then - ClientEscortTargets[EscortTargetUnitName] = nil - end - end - end - end - - self:T( { "Sorting Targets Table:", ClientEscortTargets } ) - table.sort( ClientEscortTargets, function( a, b ) return a.Distance < b.Distance end ) - self:T( { "Sorted Targets Table:", ClientEscortTargets } ) - - -- Remove the sub menus of the Attack menu of the Escort for the EscortGroup. - self.EscortMenuAttackNearbyTargets:RemoveSubMenus() - - if self.EscortMenuTargetAssistance then - self.EscortMenuTargetAssistance:RemoveSubMenus() - end - - --for MenuIndex = 1, #self.EscortMenuAttackTargets do - -- self:T( { "Remove Menu:", self.EscortMenuAttackTargets[MenuIndex] } ) - -- self.EscortMenuAttackTargets[MenuIndex] = self.EscortMenuAttackTargets[MenuIndex]:Remove() - --end - - - if ClientEscortTargets then - for ClientEscortTargetUnitName, ClientEscortTargetData in pairs( ClientEscortTargets ) do - - for ClientEscortGroupName, EscortGroupData in pairs( self.EscortClient._EscortGroups ) do - - if ClientEscortTargetData and ClientEscortTargetData.AttackUnit:IsAlive() then - - local EscortTargetMessage = "" - local EscortTargetCategoryName = ClientEscortTargetData.AttackUnit:GetCategoryName() - local EscortTargetCategoryType = ClientEscortTargetData.AttackUnit:GetTypeName() - if ClientEscortTargetData.type then - EscortTargetMessage = EscortTargetMessage .. EscortTargetCategoryName .. " (" .. EscortTargetCategoryType .. ") at " - else - EscortTargetMessage = EscortTargetMessage .. "Unknown target at " - end - - local EscortTargetUnitPositionVec3 = ClientEscortTargetData.AttackUnit:GetPointVec3() - local EscortPositionVec3 = self.EscortGroup:GetPointVec3() - local Distance = ( ( EscortTargetUnitPositionVec3.x - EscortPositionVec3.x )^2 + - ( EscortTargetUnitPositionVec3.y - EscortPositionVec3.y )^2 + - ( EscortTargetUnitPositionVec3.z - EscortPositionVec3.z )^2 - ) ^ 0.5 / 1000 - - self:T( { self.EscortGroup:GetName(), ClientEscortTargetData.AttackUnit:GetName(), Distance, ClientEscortTargetData.AttackUnit } ) - if ClientEscortTargetData.visible == false then - EscortTargetMessage = EscortTargetMessage .. string.format( "%.2f", Distance ) .. " estimated km" - else - EscortTargetMessage = EscortTargetMessage .. string.format( "%.2f", Distance ) .. " km" - end - - if ClientEscortTargetData.visible then - EscortTargetMessage = EscortTargetMessage .. ", visual" - end - - if ClientEscortGroupName == EscortGroupName then - - MENU_CLIENT_COMMAND:New( self.EscortClient, - EscortTargetMessage, - self.EscortMenuAttackNearbyTargets, - ESCORT._AttackTarget, - { ParamSelf = self, - ParamUnit = ClientEscortTargetData.AttackUnit - } - ) - EscortTargetMessages = EscortTargetMessages .. "\n - " .. EscortTargetMessage - else - if self.EscortMenuTargetAssistance then - local MenuTargetAssistance = MENU_CLIENT:New( self.EscortClient, EscortGroupData.EscortName, self.EscortMenuTargetAssistance ) - MENU_CLIENT_COMMAND:New( self.EscortClient, - EscortTargetMessage, - MenuTargetAssistance, - ESCORT._AssistTarget, - { ParamSelf = self, - ParamEscortGroup = EscortGroupData.EscortGroup, - ParamUnit = ClientEscortTargetData.AttackUnit - } - ) - end - end - else - ClientEscortTargetData = nil - end - end - end - - if EscortTargetMessages ~= "" and self.ReportTargets == true then - self.EscortGroup:MessageToClient( "Detected targets within 15 km range:" .. EscortTargetMessages:gsub("\n$",""), 20, self.EscortClient ) - else - self.EscortGroup:MessageToClient( "No targets detected!", 20, self.EscortClient ) - end - end - - if self.EscortMenuResumeMission then - self.EscortMenuResumeMission:RemoveSubMenus() - - -- if self.EscortMenuResumeWayPoints then - -- for MenuIndex = 1, #self.EscortMenuResumeWayPoints do - -- self:T( { "Remove Menu:", self.EscortMenuResumeWayPoints[MenuIndex] } ) - -- self.EscortMenuResumeWayPoints[MenuIndex] = self.EscortMenuResumeWayPoints[MenuIndex]:Remove() - -- end - -- end - - local TaskPoints = self:RegisterRoute() - for WayPointID, WayPoint in pairs( TaskPoints ) do - local EscortPositionVec3 = self.EscortGroup:GetPointVec3() - local Distance = ( ( WayPoint.x - EscortPositionVec3.x )^2 + - ( WayPoint.y - EscortPositionVec3.z )^2 - ) ^ 0.5 / 1000 - MENU_CLIENT_COMMAND:New( self.EscortClient, "Waypoint " .. WayPointID .. " at " .. string.format( "%.2f", Distance ).. "km", self.EscortMenuResumeMission, ESCORT._ResumeMission, { ParamSelf = self, ParamWayPoint = WayPointID } ) - end - end - return true - end - - return false -end ---- Provides missile training functions. --- --- @{#MISSILETRAINER} class --- ======================== --- The @{#MISSILETRAINER} class uses the DCS world messaging system to be alerted of any missiles fired, and when a missile would hit your aircraft, --- the class will destroy the missile within a certain range, to avoid damage to your aircraft. --- It suports the following functionality: --- --- * Track the missiles fired at you and other players, providing bearing and range information of the missiles towards the airplanes. --- * Provide alerts of missile launches, including detailed information of the units launching, including bearing, range … --- * Provide alerts when a missile would have killed your aircraft. --- * Provide alerts when the missile self destructs. --- * Enable / Disable and Configure the Missile Trainer using the various menu options. --- --- When running a mission where MISSILETRAINER is used, the following radio menu structure ( 'Radio Menu' -> 'Other (F10)' -> 'MissileTrainer' ) options are available for the players: --- --- * **Messages**: Menu to configure all messages. --- * **Messages On**: Show all messages. --- * **Messages Off**: Disable all messages. --- * **Tracking**: Menu to configure missile tracking messages. --- * **To All**: Shows missile tracking messages to all players. --- * **To Target**: Shows missile tracking messages only to the player where the missile is targetted at. --- * **Tracking On**: Show missile tracking messages. --- * **Tracking Off**: Disable missile tracking messages. --- * **Frequency Increase**: Increases the missile tracking message frequency with one second. --- * **Frequency Decrease**: Decreases the missile tracking message frequency with one second. --- * **Alerts**: Menu to configure alert messages. --- * **To All**: Shows alert messages to all players. --- * **To Target**: Shows alert messages only to the player where the missile is (was) targetted at. --- * **Hits On**: Show missile hit alert messages. --- * **Hits Off**: Disable missile hit alert messages. --- * **Launches On**: Show missile launch messages. --- * **Launches Off**: Disable missile launch messages. --- * **Details**: Menu to configure message details. --- * **Range On**: Shows range information when a missile is fired to a target. --- * **Range Off**: Disable range information when a missile is fired to a target. --- * **Bearing On**: Shows bearing information when a missile is fired to a target. --- * **Bearing Off**: Disable bearing information when a missile is fired to a target. --- * **Distance**: Menu to configure the distance when a missile needs to be destroyed when near to a player, during tracking. This will improve/influence hit calculation accuracy, but has the risk of damaging the aircraft when the missile reaches the aircraft before the distance is measured. --- * **50 meter**: Destroys the missile when the distance to the aircraft is below or equal to 50 meter. --- * **100 meter**: Destroys the missile when the distance to the aircraft is below or equal to 100 meter. --- * **150 meter**: Destroys the missile when the distance to the aircraft is below or equal to 150 meter. --- * **200 meter**: Destroys the missile when the distance to the aircraft is below or equal to 200 meter. --- --- --- MISSILETRAINER construction methods: --- ==================================== --- Create a new MISSILETRAINER object with the @{#MISSILETRAINER.New} method: --- --- * @{#MISSILETRAINER.New}: Creates a new MISSILETRAINER object taking the maximum distance to your aircraft to evaluate when a missile needs to be destroyed. --- --- MISSILETRAINER will collect each unit declared in the mission with a skill level "Client" and "Player", and will monitor the missiles shot at those. --- --- MISSILETRAINER initialization methods: --- ====================================== --- A MISSILETRAINER object will behave differently based on the usage of initialization methods: --- --- * @{#MISSILETRAINER.InitMessagesOnOff}: Sets by default the display of any message to be ON or OFF. --- * @{#MISSILETRAINER.InitTrackingToAll}: Sets by default the missile tracking report for all players or only for those missiles targetted to you. --- * @{#MISSILETRAINER.InitTrackingOnOff}: Sets by default the display of missile tracking report to be ON or OFF. --- * @{#MISSILETRAINER.InitTrackingFrequency}: Increases, decreases the missile tracking message display frequency with the provided time interval in seconds. --- * @{#MISSILETRAINER.InitAlertsToAll}: Sets by default the display of alerts to be shown to all players or only to you. --- * @{#MISSILETRAINER.InitAlertsHitsOnOff}: Sets by default the display of hit alerts ON or OFF. --- * @{#MISSILETRAINER.InitAlertsLaunchesOnOff}: Sets by default the display of launch alerts ON or OFF. --- * @{#MISSILETRAINER.InitRangeOnOff}: Sets by default the display of range information of missiles ON of OFF. --- * @{#MISSILETRAINER.InitBearingOnOff}: Sets by default the display of bearing information of missiles ON of OFF. --- * @{#MISSILETRAINER.InitMenusOnOff}: Allows to configure the options through the radio menu. --- --- @module MissileTrainer --- @author FlightControl - - -Include.File( "Client" ) -Include.File( "Scheduler" ) - ---- The MISSILETRAINER class --- @type MISSILETRAINER --- @extends Base#BASE -MISSILETRAINER = { - ClassName = "MISSILETRAINER", -} - ---- Creates the main object which is handling missile tracking. --- When a missile is fired a SCHEDULER is set off that follows the missile. When near a certain a client player, the missile will be destroyed. --- @param #MISSILETRAINER self --- @param #number Distance The distance in meters when a tracked missile needs to be destroyed when close to a player. --- @param #string Briefing (Optional) Will show a text to the players when starting their mission. Can be used for briefing purposes. --- @return #MISSILETRAINER -function MISSILETRAINER:New( Distance, Briefing ) - local self = BASE:Inherit( self, BASE:New() ) - self:F( Distance ) - - if Briefing then - self.Briefing = Briefing - end - - self.Schedulers = {} - self.SchedulerID = 0 - - self.MessageInterval = 2 - self.MessageLastTime = timer.getTime() - - self.Distance = Distance / 1000 - - _EVENTDISPATCHER:OnShot( self._EventShot, self ) - - self.DB = DATABASE:New():FilterStart() - self.DBClients = self.DB.Clients - self.DBUnits = self.DB.Units - - for ClientID, Client in pairs( self.DBClients ) do - - local function _Alive( Client ) - - if self.Briefing then - Client:Message( self.Briefing, 15, "HELLO WORLD", "Trainer" ) - end - - if self.MenusOnOff == true then - Client:Message( "Use the 'Radio Menu' -> 'Other (F10)' -> 'Missile Trainer' menu options to change the Missile Trainer settings (for all players).", 15, "MENU", "Trainer" ) - - Client.MainMenu = MENU_CLIENT:New( Client, "Missile Trainer", nil ) -- Menu#MENU_CLIENT - - Client.MenuMessages = MENU_CLIENT:New( Client, "Messages", Client.MainMenu ) - Client.MenuOn = MENU_CLIENT_COMMAND:New( Client, "Messages On", Client.MenuMessages, self._MenuMessages, { MenuSelf = self, MessagesOnOff = true } ) - Client.MenuOff = MENU_CLIENT_COMMAND:New( Client, "Messages Off", Client.MenuMessages, self._MenuMessages, { MenuSelf = self, MessagesOnOff = false } ) - - Client.MenuTracking = MENU_CLIENT:New( Client, "Tracking", Client.MainMenu ) - Client.MenuTrackingToAll = MENU_CLIENT_COMMAND:New( Client, "To All", Client.MenuTracking, self._MenuMessages, { MenuSelf = self, TrackingToAll = true } ) - Client.MenuTrackingToTarget = MENU_CLIENT_COMMAND:New( Client, "To Target", Client.MenuTracking, self._MenuMessages, { MenuSelf = self, TrackingToAll = false } ) - Client.MenuTrackOn = MENU_CLIENT_COMMAND:New( Client, "Tracking On", Client.MenuTracking, self._MenuMessages, { MenuSelf = self, TrackingOnOff = true } ) - Client.MenuTrackOff = MENU_CLIENT_COMMAND:New( Client, "Tracking Off", Client.MenuTracking, self._MenuMessages, { MenuSelf = self, TrackingOnOff = false } ) - Client.MenuTrackIncrease = MENU_CLIENT_COMMAND:New( Client, "Frequency Increase", Client.MenuTracking, self._MenuMessages, { MenuSelf = self, TrackingFrequency = -1 } ) - Client.MenuTrackDecrease = MENU_CLIENT_COMMAND:New( Client, "Frequency Decrease", Client.MenuTracking, self._MenuMessages, { MenuSelf = self, TrackingFrequency = 1 } ) - - Client.MenuAlerts = MENU_CLIENT:New( Client, "Alerts", Client.MainMenu ) - Client.MenuAlertsToAll = MENU_CLIENT_COMMAND:New( Client, "To All", Client.MenuAlerts, self._MenuMessages, { MenuSelf = self, AlertsToAll = true } ) - Client.MenuAlertsToTarget = MENU_CLIENT_COMMAND:New( Client, "To Target", Client.MenuAlerts, self._MenuMessages, { MenuSelf = self, AlertsToAll = false } ) - Client.MenuHitsOn = MENU_CLIENT_COMMAND:New( Client, "Hits On", Client.MenuAlerts, self._MenuMessages, { MenuSelf = self, AlertsHitsOnOff = true } ) - Client.MenuHitsOff = MENU_CLIENT_COMMAND:New( Client, "Hits Off", Client.MenuAlerts, self._MenuMessages, { MenuSelf = self, AlertsHitsOnOff = false } ) - Client.MenuLaunchesOn = MENU_CLIENT_COMMAND:New( Client, "Launches On", Client.MenuAlerts, self._MenuMessages, { MenuSelf = self, AlertsLaunchesOnOff = true } ) - Client.MenuLaunchesOff = MENU_CLIENT_COMMAND:New( Client, "Launches Off", Client.MenuAlerts, self._MenuMessages, { MenuSelf = self, AlertsLaunchesOnOff = false } ) - - Client.MenuDetails = MENU_CLIENT:New( Client, "Details", Client.MainMenu ) - Client.MenuDetailsDistanceOn = MENU_CLIENT_COMMAND:New( Client, "Range On", Client.MenuDetails, self._MenuMessages, { MenuSelf = self, DetailsRangeOnOff = true } ) - Client.MenuDetailsDistanceOff = MENU_CLIENT_COMMAND:New( Client, "Range Off", Client.MenuDetails, self._MenuMessages, { MenuSelf = self, DetailsRangeOnOff = false } ) - Client.MenuDetailsBearingOn = MENU_CLIENT_COMMAND:New( Client, "Bearing On", Client.MenuDetails, self._MenuMessages, { MenuSelf = self, DetailsBearingOnOff = true } ) - Client.MenuDetailsBearingOff = MENU_CLIENT_COMMAND:New( Client, "Bearing Off", Client.MenuDetails, self._MenuMessages, { MenuSelf = self, DetailsBearingOnOff = false } ) - - Client.MenuDistance = MENU_CLIENT:New( Client, "Set distance to plane", Client.MainMenu ) - Client.MenuDistance50 = MENU_CLIENT_COMMAND:New( Client, "50 meter", Client.MenuDistance, self._MenuMessages, { MenuSelf = self, Distance = 50 / 1000 } ) - Client.MenuDistance100 = MENU_CLIENT_COMMAND:New( Client, "100 meter", Client.MenuDistance, self._MenuMessages, { MenuSelf = self, Distance = 100 / 1000 } ) - Client.MenuDistance150 = MENU_CLIENT_COMMAND:New( Client, "150 meter", Client.MenuDistance, self._MenuMessages, { MenuSelf = self, Distance = 150 / 1000 } ) - Client.MenuDistance200 = MENU_CLIENT_COMMAND:New( Client, "200 meter", Client.MenuDistance, self._MenuMessages, { MenuSelf = self, Distance = 200 / 1000 } ) - else - if Client.MainMenu then - Client.MainMenu:Remove() - end - end - - - local ClientID = Client:GetID() - self:T( ClientID ) - if not self.TrackingMissiles[ClientID] then - self.TrackingMissiles[ClientID] = {} - end - self.TrackingMissiles[ClientID].Client = Client - if not self.TrackingMissiles[ClientID].MissileData then - self.TrackingMissiles[ClientID].MissileData = {} - end - end - - Client:Alive( _Alive ) - - end - --- self.DB:ForEachClient( --- --- @param Client#CLIENT Client --- function( Client ) --- --- ... actions ... --- --- end --- ) - - self.MessagesOnOff = true - - self.TrackingToAll = false - self.TrackingOnOff = true - self.TrackingFrequency = 3 - - self.AlertsToAll = true - self.AlertsHitsOnOff = true - self.AlertsLaunchesOnOff = true - - self.DetailsRangeOnOff = true - self.DetailsBearingOnOff = true - - self.MenusOnOff = true - - self.TrackingMissiles = {} - - self.TrackingScheduler = SCHEDULER:New( self, self._TrackMissiles, {}, 0.5, 0.05, 0 ) - - return self -end - --- Initialization methods. - - ---- Sets by default the display of any message to be ON or OFF. --- @param #MISSILETRAINER self --- @param #boolean MessagesOnOff true or false --- @return #MISSILETRAINER self -function MISSILETRAINER:InitMessagesOnOff( MessagesOnOff ) - self:F( MessagesOnOff ) - - self.MessagesOnOff = MessagesOnOff - if self.MessagesOnOff == true then - MESSAGE:New( "Messages ON", "Menu", 15, "ID" ):ToAll() - else - MESSAGE:New( "Messages OFF", "Menu", 15, "ID" ):ToAll() - end - - return self -end - ---- Sets by default the missile tracking report for all players or only for those missiles targetted to you. --- @param #MISSILETRAINER self --- @param #boolean TrackingToAll true or false --- @return #MISSILETRAINER self -function MISSILETRAINER:InitTrackingToAll( TrackingToAll ) - self:F( TrackingToAll ) - - self.TrackingToAll = TrackingToAll - if self.TrackingToAll == true then - MESSAGE:New( "Missile tracking to all players ON", "Menu", 15, "ID" ):ToAll() - else - MESSAGE:New( "Missile tracking to all players OFF", "Menu", 15, "ID" ):ToAll() - end - - return self -end - ---- Sets by default the display of missile tracking report to be ON or OFF. --- @param #MISSILETRAINER self --- @param #boolean TrackingOnOff true or false --- @return #MISSILETRAINER self -function MISSILETRAINER:InitTrackingOnOff( TrackingOnOff ) - self:F( TrackingOnOff ) - - self.TrackingOnOff = TrackingOnOff - if self.TrackingOnOff == true then - MESSAGE:New( "Missile tracking ON", "Menu", 15, "ID" ):ToAll() - else - MESSAGE:New( "Missile tracking OFF", "Menu", 15, "ID" ):ToAll() - end - - return self -end - ---- Increases, decreases the missile tracking message display frequency with the provided time interval in seconds. --- The default frequency is a 3 second interval, so the Tracking Frequency parameter specifies the increase or decrease from the default 3 seconds or the last frequency update. --- @param #MISSILETRAINER self --- @param #number TrackingFrequency Provide a negative or positive value in seconds to incraese or decrease the display frequency. --- @return #MISSILETRAINER self -function MISSILETRAINER:InitTrackingFrequency( TrackingFrequency ) - self:F( TrackingFrequency ) - - self.TrackingFrequency = self.TrackingFrequency + TrackingFrequency - if self.TrackingFrequency < 0.5 then - self.TrackingFrequency = 0.5 - end - if self.TrackingFrequency then - MESSAGE:New( "Missile tracking frequency is " .. self.TrackingFrequency .. " seconds.", "Menu", 15, "ID" ):ToAll() - end - - return self -end - ---- Sets by default the display of alerts to be shown to all players or only to you. --- @param #MISSILETRAINER self --- @param #boolean AlertsToAll true or false --- @return #MISSILETRAINER self -function MISSILETRAINER:InitAlertsToAll( AlertsToAll ) - self:F( AlertsToAll ) - - self.AlertsToAll = AlertsToAll - if self.AlertsToAll == true then - MESSAGE:New( "Alerts to all players ON", "Menu", 15, "ID" ):ToAll() - else - MESSAGE:New( "Alerts to all players OFF", "Menu", 15, "ID" ):ToAll() - end - - return self -end - ---- Sets by default the display of hit alerts ON or OFF. --- @param #MISSILETRAINER self --- @param #boolean AlertsHitsOnOff true or false --- @return #MISSILETRAINER self -function MISSILETRAINER:InitAlertsHitsOnOff( AlertsHitsOnOff ) - self:F( AlertsHitsOnOff ) - - self.AlertsHitsOnOff = AlertsHitsOnOff - if self.AlertsHitsOnOff == true then - MESSAGE:New( "Alerts Hits ON", "Menu", 15, "ID" ):ToAll() - else - MESSAGE:New( "Alerts Hits OFF", "Menu", 15, "ID" ):ToAll() - end - - return self -end - ---- Sets by default the display of launch alerts ON or OFF. --- @param #MISSILETRAINER self --- @param #boolean AlertsLaunchesOnOff true or false --- @return #MISSILETRAINER self -function MISSILETRAINER:InitAlertsLaunchesOnOff( AlertsLaunchesOnOff ) - self:F( AlertsLaunchesOnOff ) - - self.AlertsLaunchesOnOff = AlertsLaunchesOnOff - if self.AlertsLaunchesOnOff == true then - MESSAGE:New( "Alerts Launches ON", "Menu", 15, "ID" ):ToAll() - else - MESSAGE:New( "Alerts Launches OFF", "Menu", 15, "ID" ):ToAll() - end - - return self -end - ---- Sets by default the display of range information of missiles ON of OFF. --- @param #MISSILETRAINER self --- @param #boolean DetailsRangeOnOff true or false --- @return #MISSILETRAINER self -function MISSILETRAINER:InitRangeOnOff( DetailsRangeOnOff ) - self:F( DetailsRangeOnOff ) - - self.DetailsRangeOnOff = DetailsRangeOnOff - if self.DetailsRangeOnOff == true then - MESSAGE:New( "Range display ON", "Menu", 15, "ID" ):ToAll() - else - MESSAGE:New( "Range display OFF", "Menu", 15, "ID" ):ToAll() - end - - return self -end - ---- Sets by default the display of bearing information of missiles ON of OFF. --- @param #MISSILETRAINER self --- @param #boolean DetailsBearingOnOff true or false --- @return #MISSILETRAINER self -function MISSILETRAINER:InitBearingOnOff( DetailsBearingOnOff ) - self:F( DetailsBearingOnOff ) - - self.DetailsBearingOnOff = DetailsBearingOnOff - if self.DetailsBearingOnOff == true then - MESSAGE:New( "Bearing display OFF", "Menu", 15, "ID" ):ToAll() - else - MESSAGE:New( "Bearing display OFF", "Menu", 15, "ID" ):ToAll() - end - - return self -end - ---- Enables / Disables the menus. --- @param #MISSILETRAINER self --- @param #boolean MenusOnOff true or false --- @return #MISSILETRAINER self -function MISSILETRAINER:InitMenusOnOff( MenusOnOff ) - self:F( MenusOnOff ) - - self.MenusOnOff = MenusOnOff - if self.MenusOnOff == true then - MESSAGE:New( "Menus are ENABLED (only when a player rejoins a slot)", "Menu", 15, "ID" ):ToAll() - else - MESSAGE:New( "Menus are DISABLED", "Menu", 15, "ID" ):ToAll() - end - - return self -end - - --- Menu functions - -function MISSILETRAINER._MenuMessages( MenuParameters ) - - local self = MenuParameters.MenuSelf - - if MenuParameters.MessagesOnOff ~= nil then - self:InitMessagesOnOff( MenuParameters.MessagesOnOff ) - end - - if MenuParameters.TrackingToAll ~= nil then - self:InitTrackingToAll( MenuParameters.TrackingToAll ) - end - - if MenuParameters.TrackingOnOff ~= nil then - self:InitTrackingOnOff( MenuParameters.TrackingOnOff ) - end - - if MenuParameters.TrackingFrequency ~= nil then - self:InitTrackingFrequency( MenuParameters.TrackingFrequency ) - end - - if MenuParameters.AlertsToAll ~= nil then - self:InitAlertsToAll( MenuParameters.AlertsToAll ) - end - - if MenuParameters.AlertsHitsOnOff ~= nil then - self:InitAlertsHitsOnOff( MenuParameters.AlertsHitsOnOff ) - end - - if MenuParameters.AlertsLaunchesOnOff ~= nil then - self:InitAlertsLaunchesOnOff( MenuParameters.AlertsLaunchesOnOff ) - end - - if MenuParameters.DetailsRangeOnOff ~= nil then - self:InitRangeOnOff( MenuParameters.DetailsRangeOnOff ) - end - - if MenuParameters.DetailsBearingOnOff ~= nil then - self:InitBearingOnOff( MenuParameters.DetailsBearingOnOff ) - end - - if MenuParameters.Distance ~= nil then - self.Distance = MenuParameters.Distance - MESSAGE:New( "Hit detection distance set to " .. self.Distance .. " meters", "Menu", 15, "ID" ):ToAll() - end - -end - ---- Detects if an SA site was shot with an anti radiation missile. In this case, take evasive actions based on the skill level set within the ME. --- @param #MISSILETRAINER self --- @param Event#EVENTDATA Event -function MISSILETRAINER:_EventShot( Event ) - self:F( { Event } ) - - local TrainerSourceDCSUnit = Event.IniDCSUnit - local TrainerSourceDCSUnitName = Event.IniDCSUnitName - local TrainerWeapon = Event.Weapon -- Identify the weapon fired - local TrainerWeaponName = Event.WeaponName -- return weapon type - - self:T( "Missile Launched = " .. TrainerWeaponName ) - - local TrainerTargetDCSUnit = TrainerWeapon:getTarget() -- Identify target - local TrainerTargetDCSUnitName = Unit.getName( TrainerTargetDCSUnit ) - local TrainerTargetSkill = _DATABASE.Templates.Units[TrainerTargetDCSUnitName].Template.skill - - self:T(TrainerTargetDCSUnitName ) - - local Client = self.DBClients[TrainerTargetDCSUnitName] - if Client then - - local TrainerSourceUnit = UNIT:Find( TrainerSourceDCSUnit ) - local TrainerTargetUnit = UNIT:Find( TrainerTargetDCSUnit ) - - if self.MessagesOnOff == true and self.AlertsLaunchesOnOff == true then - - local Message = MESSAGE:New( - string.format( "%s launched a %s", - TrainerSourceUnit:GetTypeName(), - TrainerWeaponName - ) .. self:_AddRange( Client, TrainerWeapon ) .. self:_AddBearing( Client, TrainerWeapon ),"Launch Alert", 5, "ID" ) - - if self.AlertsToAll then - Message:ToAll() - else - Message:ToClient( Client ) - end - end - - local ClientID = Client:GetID() - local MissileData = {} - MissileData.TrainerSourceUnit = TrainerSourceUnit - MissileData.TrainerWeapon = TrainerWeapon - MissileData.TrainerTargetUnit = TrainerTargetUnit - MissileData.TrainerWeaponTypeName = TrainerWeapon:getTypeName() - MissileData.TrainerWeaponLaunched = true - table.insert( self.TrackingMissiles[ClientID].MissileData, MissileData ) - --self:T( self.TrackingMissiles ) - end -end - -function MISSILETRAINER:_AddRange( Client, TrainerWeapon ) - - local RangeText = "" - - if self.DetailsRangeOnOff then - - local PositionMissile = TrainerWeapon:getPoint() - local PositionTarget = Client:GetPointVec3() - - local Range = ( ( PositionMissile.x - PositionTarget.x )^2 + - ( PositionMissile.y - PositionTarget.y )^2 + - ( PositionMissile.z - PositionTarget.z )^2 - ) ^ 0.5 / 1000 - - RangeText = string.format( ", at %4.2fkm", Range ) - end - - return RangeText -end - -function MISSILETRAINER:_AddBearing( Client, TrainerWeapon ) - - local BearingText = "" - - if self.DetailsBearingOnOff then - - local PositionMissile = TrainerWeapon:getPoint() - local PositionTarget = Client:GetPointVec3() - - self:T2( { PositionTarget, PositionMissile }) - - local DirectionVector = { x = PositionMissile.x - PositionTarget.x, y = PositionMissile.y - PositionTarget.y, z = PositionMissile.z - PositionTarget.z } - local DirectionRadians = math.atan2( DirectionVector.z, DirectionVector.x ) - --DirectionRadians = DirectionRadians + routines.getNorthCorrection( PositionTarget ) - if DirectionRadians < 0 then - DirectionRadians = DirectionRadians + 2 * math.pi - end - local DirectionDegrees = DirectionRadians * 180 / math.pi - - BearingText = string.format( ", %d degrees", DirectionDegrees ) - end - - return BearingText -end - - -function MISSILETRAINER:_TrackMissiles() - self:F2() - - - local ShowMessages = false - if self.MessagesOnOff and self.MessageLastTime + self.TrackingFrequency <= timer.getTime() then - self.MessageLastTime = timer.getTime() - ShowMessages = true - end - - -- ALERTS PART - - -- Loop for all Player Clients to check the alerts and deletion of missiles. - for ClientDataID, ClientData in pairs( self.TrackingMissiles ) do - - local Client = ClientData.Client - self:T2( { Client:GetName() } ) - - for MissileDataID, MissileData in pairs( ClientData.MissileData ) do - self:T3( MissileDataID ) - - local TrainerSourceUnit = MissileData.TrainerSourceUnit - local TrainerWeapon = MissileData.TrainerWeapon - local TrainerTargetUnit = MissileData.TrainerTargetUnit - local TrainerWeaponTypeName = MissileData.TrainerWeaponTypeName - local TrainerWeaponLaunched = MissileData.TrainerWeaponLaunched - - if Client and Client:IsAlive() and TrainerSourceUnit and TrainerSourceUnit:IsAlive() and TrainerWeapon and TrainerWeapon:isExist() and TrainerTargetUnit and TrainerTargetUnit:IsAlive() then - local PositionMissile = TrainerWeapon:getPosition().p - local PositionTarget = Client:GetPointVec3() - - local Distance = ( ( PositionMissile.x - PositionTarget.x )^2 + - ( PositionMissile.y - PositionTarget.y )^2 + - ( PositionMissile.z - PositionTarget.z )^2 - ) ^ 0.5 / 1000 - - if Distance <= self.Distance then - -- Hit alert - TrainerWeapon:destroy() - if self.MessagesOnOff == true and self.AlertsHitsOnOff == true then - - self:T( "killed" ) - - local Message = MESSAGE:New( - string.format( "%s launched by %s killed %s", - TrainerWeapon:getTypeName(), - TrainerSourceUnit:GetTypeName(), - TrainerTargetUnit:GetPlayerName() - ),"Hit Alert", 15, "ID" ) - - if self.AlertsToAll == true then - Message:ToAll() - else - Message:ToClient( Client ) - end - - MissileData = nil - table.remove( ClientData.MissileData, MissileDataID ) - self:T(ClientData.MissileData) - end - end - else - if not ( TrainerWeapon and TrainerWeapon:isExist() ) then - if self.MessagesOnOff == true and self.AlertsLaunchesOnOff == true then - -- Weapon does not exist anymore. Delete from Table - local Message = MESSAGE:New( - string.format( "%s launched by %s self destructed!", - TrainerWeaponTypeName, - TrainerSourceUnit:GetTypeName() - ),"Tracking", 5, "ID" ) - - if self.AlertsToAll == true then - Message:ToAll() - else - Message:ToClient( Client ) - end - end - MissileData = nil - table.remove( ClientData.MissileData, MissileDataID ) - self:T( ClientData.MissileData ) - end - end - end - end - - if ShowMessages == true and self.MessagesOnOff == true and self.TrackingOnOff == true then -- Only do this when tracking information needs to be displayed. - - -- TRACKING PART - - -- For the current client, the missile range and bearing details are displayed To the Player Client. - -- For the other clients, the missile range and bearing details are displayed To the other Player Clients. - -- To achieve this, a cross loop is done for each Player Client <-> Other Player Client missile information. - - -- Main Player Client loop - for ClientDataID, ClientData in pairs( self.TrackingMissiles ) do - - local Client = ClientData.Client - self:T2( { Client:GetName() } ) - - - ClientData.MessageToClient = "" - ClientData.MessageToAll = "" - - -- Other Players Client loop - for TrackingDataID, TrackingData in pairs( self.TrackingMissiles ) do - - for MissileDataID, MissileData in pairs( TrackingData.MissileData ) do - self:T3( MissileDataID ) - - local TrainerSourceUnit = MissileData.TrainerSourceUnit - local TrainerWeapon = MissileData.TrainerWeapon - local TrainerTargetUnit = MissileData.TrainerTargetUnit - local TrainerWeaponTypeName = MissileData.TrainerWeaponTypeName - local TrainerWeaponLaunched = MissileData.TrainerWeaponLaunched - - if Client and Client:IsAlive() and TrainerSourceUnit and TrainerSourceUnit:IsAlive() and TrainerWeapon and TrainerWeapon:isExist() and TrainerTargetUnit and TrainerTargetUnit:IsAlive() then - - if ShowMessages == true then - local TrackingTo - TrackingTo = string.format( " -> %s", - TrainerWeaponTypeName - ) - - if ClientDataID == TrackingDataID then - if ClientData.MessageToClient == "" then - ClientData.MessageToClient = "Missiles to You:\n" - end - ClientData.MessageToClient = ClientData.MessageToClient .. TrackingTo .. self:_AddRange( ClientData.Client, TrainerWeapon ) .. self:_AddBearing( ClientData.Client, TrainerWeapon ) .. "\n" - else - if self.TrackingToAll == true then - if ClientData.MessageToAll == "" then - ClientData.MessageToAll = "Missiles to other Players:\n" - end - ClientData.MessageToAll = ClientData.MessageToAll .. TrackingTo .. self:_AddRange( ClientData.Client, TrainerWeapon ) .. self:_AddBearing( ClientData.Client, TrainerWeapon ) .. " ( " .. TrainerTargetUnit:GetPlayerName() .. " )\n" - end - end - end - end - end - end - - -- Once the Player Client and the Other Player Client tracking messages are prepared, show them. - if ClientData.MessageToClient ~= "" or ClientData.MessageToAll ~= "" then - local Message = MESSAGE:New( ClientData.MessageToClient .. ClientData.MessageToAll, "Tracking", 1, "ID" ):ToClient( Client ) - end - end - end - - return true -end -env.info( '*** MOOSE INCLUDE END *** ' ) +env.info("Loaded MOOSE Include Engine")env.info( '*** MOOSE INCLUDE END *** ' ) diff --git a/Moose Test Missions/Moose_Test_CLEANUP/Moose_Test_CLEANUP.miz b/Moose Test Missions/Moose_Test_CLEANUP/Moose_Test_CLEANUP.miz index bc0f5b2f8908d495c6c8bf12fb4afa61c185dcd5..3090778e9eed937c96bf587e786e08584fb152e7 100644 GIT binary patch delta 1048 zcmZ9Kdr*{B7{<@{9UwLq_rmV77eM5e!9XOCiiB|y2oMpFluPZzY#JcTZ3Tu9%uv~7 zwgF~&qmufn4$eU0ev0fXqeW(znweO`Sj9dCocWyzg(Gd51db zwIya>h=q*#OMPMW*Fb4bBGhY&s-!|u@!7a!=?|WqqWYNi9@Sf^jy!*jjLl}4?=Ov; z@gDEd#H(IEEq<}Z?e4^YX5IfTO?)Wf*fP8CX~*>G!seoyC9AB8aQfEAM?^dZ4}IGI5ZPxIaZTLoM(A@NiRD5M)5ZdwM%_2SG}EpXAO8J{ z;bFn;^_5n6SNAPRWX^cB$mjj(uS)3mBRWp)`4n@<_KL2g+^;aZ%zIOgIe5f?6PIBRGy-r>eLpy25 z8|h6f&m5U!2cPJ?H+6J+xPxgKW^4^~v|8l~glBlfKrv?pM+qkIGZy(c#U5lu-^viIad7|+EkqE=!y#B$ zfBD4Pf8)ck#v9yJj{dw7m{g-s6!YF@-0IkwZ;L=8w!MCQ?lR9%*}ae zwcaxDx_?^Gy+0}Q~+*l0t%W* zyML%}wfu)#!6D$b5QpO>9s#x@?1%YY1SA=SDu{qjL^u$C5JA9{i0Tyd1_5?9)Yot# r0h^wYe302tq(R99R4kJs&>C;@3<73ts2l^c3GlGRBC`j%#)SR`Tn?JC delta 107616 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�&7PFaJ*l;onvZWADgNNwZ) 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

    cy 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 Q1DE}O0UHJn5(5AL0NhTXp#T5? diff --git a/Moose Test Missions/Moose_Test_DATABASE/Moose_Test_DATABASE.miz b/Moose Test Missions/Moose_Test_DATABASE/Moose_Test_DATABASE.miz index 3c3d95c9710ff4a5bef2c30a593d2800000c9ee4..598b65f8da4873a75bb7a5cef9443bb1126c0a86 100644 GIT binary patch delta 688 zcmV;h0#E((;|Rj30Y6Y#CYNT$G-jtBw(0K^3V02TlMmvJxx6Mrsjbz!AcU2obj z6n&;r|HGAEY9kgtv~>~^4+vO=ROmF=!?aeFNt|FQu`Aoz%e4PK+X-N3T7mi!#rC=9 zoO`c*nfMcNkxC3V?RFa$4-cyuOn)uMi}?iR%gO!E=?qru@sBmQ^BW*=eH8>Pq|^-V zm|%(;E(NT4!L*^p%YP6Cz5Z?Qw)f?E(Et3kioCwcWlVF}P#ZOZ=evLm-AkHqk<}&; zM3Kiu#!{*%V`jY3jvf;rj%qIAyi6R=-+#e6`cBQ(Zl^cnU%q2=V&&5$XxdmI(`O9fJbQla&aT4twYhs!xWlmLbe75u{2M zRhjpdQ!-Pu@C77}t14P*MX1(H8C-QFx1CBY4{nNV(u(quA|RgBChizVAb7q@@I$T_ zTx(n5z3U5X*MFgB*>3Xfj4LG-U^J0sp7@SBnfel^jtRX(UFDu@*SSlo;51lrRxw)j zWlnLm_V=_By{z(;<~i5qNU~P+-@_w$9XYbEFjoA<=&qkCT~y-^S=G4kp*w|eBB4g= zH~o^+*w=Dz*4HZ^y-YufPIoP@&&PNBbl$PuP1y~znGndhV2Csg=KVmPEvLaa{tvg> z>;Vo#5AdzUNT$G-jtBw(0K^3Vm-jCMH3qi2GZ|yQmohK{JOimu0GDwv0#5?~QvjF4 zFak0I3333J_%H%m1MqYJmsK$WG6GF|mzo#?9G9gr0xBfMjQ{|5VRB_?Z*_BJb5KhK W1^@s601f~S0P+I>0J@L>0002m&pEjO delta 107285 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 xIu8Pq$CFwEArbn#ER000Y7KRN&a diff --git a/Moose Test Missions/Moose_Test_DESTROY/MOOSE_Test_DESTROY.miz b/Moose Test Missions/Moose_Test_DESTROY/MOOSE_Test_DESTROY.miz index 50a2d616a6eb275b9139410d433db11b6fc5d776..e110149cdaa759b1d60fc6dcaca1694b826fcad3 100644 GIT binary patch delta 775 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�&7PFaJ*l;onvZWADgNNwZ) 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

    cy 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 diff --git a/Moose Test Missions/Moose_Test_ESCORT/MOOSE_Test_ESCORT.miz b/Moose Test Missions/Moose_Test_ESCORT/MOOSE_Test_ESCORT.miz index 2a269c2f27edda55372cb9091691e8239e4b6dc8..e441823aa683d68cb9e6742d0816c98c450fc949 100644 GIT binary patch delta 866 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�&7PFaJ*l;onvZWADgNNwZ) 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

    cy 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 S03HAy01pTN05N<50002?@PEVr diff --git a/Moose Test Missions/Moose_Test_MISSILETRAINER/Moose_Test_MISSILETRAINER.miz b/Moose Test Missions/Moose_Test_MISSILETRAINER/Moose_Test_MISSILETRAINER.miz index 931bd7e3c80e712a1c18b70b90fd3dc23863af49..106143bba0c0bc264d109486be914bb7777e1c11 100644 GIT binary patch delta 710 zcmV;%0y+Kk*A2s+2e5P=fAFovNT$G-jtBw(0K^3V02TlM0BkWZZZAYdMnP3fR4+|$ zZ*yfXY;|F!R9$b{Fcf{JQvbu1Uuq*3KD2cb5)TMig;eM?*u%6|l}VgnDX}Zt*~_&5 zKHCXkXj*~#62p-wTisH%4JM**iaia zg6F${4BbnbaFNv}5JZv3MaEL9C}U>4(T*MyAdYG-;=D{8&)+paW=yNTg+{V&=h$nNkUd9v0NZTa0kj?h-_Xy4>J?=hJ`; zGxv)gA5jN&5pjtmp^I-kXQ2zI5B$D`w|ELd8VK?F_Yvv|%$5lYZ5@LG%#)P}mJWO9 z4ysRvu9hLpEfJ(j7FC(|l~XcPwD1Kaj;ktKYDK8lOc`8te@S!_}I&dPPM(Q{HlGE7Na&OkxD<8c~KZ;IwEw9hVcl&hSvE5DC4YQfZxL}Ah z4d(qoo-L=rIQ|b%O9KR#U1|dwhxNSyxAnaO2CNV8t;I;Dz?Y5)0ssKS1pt={Y6CR} zwz@MJW51V0Y6Cn2rXT>9glYp-1Ct^Em)vRtG6S=(0hbYL12O{!wgHz$YXd?9cDDhS si)#Z#B)!N10C!<>WoU18b7gZ-O9ci10000C01N<50{{SD%K-oY0D59UQvd(} delta 107303 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

  • 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 P3;<380059^0{{R3H=sj_ diff --git a/Moose Test Missions/Moose_Test_SEAD/MOOSE_Test_SEAD.miz b/Moose Test Missions/Moose_Test_SEAD/MOOSE_Test_SEAD.miz index 1254f21401114d73b9e6ca9d2ba58f259a42657d..35d83616def44cc82b524c2925365c86ebd7e8b5 100644 GIT binary patch delta 661 zcmV;G0&4x-g9xk10kFmw67a3XNT$G-jtBw(0K^3V02Tn14FVW{rBq#S+AtJ-rc(dI zm0xNj7Cy9f5)uyxScO#RG}yzmR+UMdU@5UH+u6&s|32FZU}#!_`Vz(Vx#ygFuYH;L z6LFDB3^(m|8x{`_s~JpxEys)b1m?@h{m!8-a*&DL(FrHGv+Y{39f32US5QNlK5<`}*3paW=y zNTg+{V&=h$nNkUd9v0NZTa0kj?h-_Xy4>J?=hJ`;Gxv*s9v@K$brEriB%zCMJZGT` zs1N+Ug|~PLLK+D1`u7p)3CxxW3vC^P0?d<@2$l|e=nkq+hOU+&%q{+ORC^BSaMb|TJ>d4akcjM zv=Y6n@|ET}*XBsFR`lP)BY7P;vac{!{Ke?5pDJBc;|^KXxbUGng>WLFM(Q{HlGE7N za&OkxD<8c~KZ;IwEw9hVcl&hSvE5DC4YQfZxL}A7G!5qcK%On9!8ra8P)h>@l}`d1 zw@0@DrbrL)t;I;Dz?Y5)0ssKS1pt@){{b}ywz@MJW51O*0z3ow832`b0!ss#8UU5V v0x|=)MF5rg0x|;%OaPZI0Rln;dQAYAa{&TH1HoPZm%9N18wOEf00000=Z`T+ delta 107266 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 diff --git a/Moose Test Missions/Moose_Test_SPAWN/MOOSE_Test_SPAWN.miz b/Moose Test Missions/Moose_Test_SPAWN/MOOSE_Test_SPAWN.miz index e71b914fdd0d9601fd097d78005cbcad0c329881..b2ecae6e774cdbcd30926b2f2bd1dcc7f0b019f8 100644 GIT binary patch delta 35757 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%0DOb7331`AOS8mIV+iTgn<2kQ;lJ=Nf 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

    cy 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 X0+UvJLjyGu0+XD48wT$b0ssI2ai&U) diff --git a/Moose Test Missions/Moose_Test_WRAPPER/Moose_Test_WRAPPER.miz b/Moose Test Missions/Moose_Test_WRAPPER/Moose_Test_WRAPPER.miz index 5746543f10612e2781fc0a95fa41e3455e93a8d9..d146778d741f4cfc53cf0f6b97e2084b535551e9 100644 GIT binary patch delta 691 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�&7PFaJ*l;onvZWADgNNwZ) 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

    cy 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 diff --git a/Moose Test Missions/Moose_Test_ZONE/Moose_Test_ZONE.lua b/Moose Test Missions/Moose_Test_ZONE/Moose_Test_ZONE.lua new file mode 100644 index 000000000..d9bbe059d --- /dev/null +++ b/Moose Test Missions/Moose_Test_ZONE/Moose_Test_ZONE.lua @@ -0,0 +1,19 @@ + +Include.File( "Zone" ) +Include.File( "Group" ) +Include.File( "Scheduler" ) + +local GroupInside = GROUP:FindByName( "Test Inside Polygon" ) +local GroupOutside = GROUP:FindByName( "Test Outside Polygon" ) + +local ZoneA = ZONE:New( "Zone A" ):SmokeZone( POINT_VEC3.SmokeColor.White, 90 ) + +Messager = SCHEDULER:New( nil, + function() + GroupInside:MessageToAll( ( GroupInside:IsCompletelyInZone( ZoneA ) ) and "Inside Zone A" or "Outside Zone A", 1 ) + if GroupInside:IsCompletelyInZone( ZoneA ) then + GroupInside:GetUnit(1):SmokeRed() + end + end, + {}, 0, 1 ) + diff --git a/Moose Test Missions/Moose_Test_ZONE/Moose_Test_ZONE.miz b/Moose Test Missions/Moose_Test_ZONE/Moose_Test_ZONE.miz new file mode 100644 index 0000000000000000000000000000000000000000..67c9195d167e6d4d5086b6af8e807358f84144fe GIT binary patch literal 20873 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 delta 124827 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 diff --git a/Moose Test Missions/Moose_Test_ZONE_RADIUS/Moose_Test_ZONE_RADIUS.lua b/Moose Test Missions/Moose_Test_ZONE_RADIUS/Moose_Test_ZONE_RADIUS.lua new file mode 100644 index 000000000..1d01e5451 --- /dev/null +++ b/Moose Test Missions/Moose_Test_ZONE_RADIUS/Moose_Test_ZONE_RADIUS.lua @@ -0,0 +1,20 @@ + +Include.File( "Zone" ) +Include.File( "Group" ) +Include.File( "Scheduler" ) + +local GroupInside = GROUP:FindByName( "Test Inside Polygon" ) +local GroupOutside = GROUP:FindByName( "Test Outside Polygon" ) + +local House = STATIC:FindByName( "House" ) +local ZoneA = ZONE_RADIUS:New( "Zone A", House:GetPointVec2(), 300 ):SmokeZone( POINT_VEC3.SmokeColor.White, 90 ) + +Messager = SCHEDULER:New( nil, + function() + GroupInside:MessageToAll( ( GroupInside:IsCompletelyInZone( ZoneA ) ) and "Inside Zone A" or "Outside Zone A", 1 ) + if GroupInside:IsCompletelyInZone( ZoneA ) then + GroupInside:GetUnit(1):SmokeRed() + end + end, + {}, 0, 1 ) + diff --git a/Moose Test Missions/Moose_Test_ZONE_RADIUS/Moose_Test_ZONE_RADIUS.miz b/Moose Test Missions/Moose_Test_ZONE_RADIUS/Moose_Test_ZONE_RADIUS.miz new file mode 100644 index 0000000000000000000000000000000000000000..de3cba3813678968651e8f2c8156c21f7df3c84e GIT binary patch literal 21030 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

    Q8nqP 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 W1^@s601E&M00#pA0M}mt0000wZ#=*N delta 107291 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 D9pF8% diff --git a/Moose Test Missions/Moose_Test_TASK_Pickup_and_Deploy/MOOSE_Test_TASK_Pickup_and_Deploy.miz b/Moose Test Missions/Moose_Test_TASK_Pickup_and_Deploy/MOOSE_Test_TASK_Pickup_and_Deploy.miz index 0e6c7d84a4173f3434571866f21a5071109e47c0..64d34f825f5a7bb00da7d6a0b276df4e20b1fef4 100644 GIT binary patch delta 716 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�&7PFaJ*l;onvZWADgNNwZ) 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

  • NOTASK
  • PICKUPTASK
  • +
  • Point
  • ROUTETASK
  • STAGE
  • Scheduler
  • @@ -58,6 +59,7 @@
  • Sead
  • Set
  • Spawn
  • +
  • Static
  • StaticObject
  • TASK
  • Unit
  • diff --git a/Moose Training/Documentation/Base.html b/Moose Training/Documentation/Base.html index b6d89a410..bd96b901b 100644 --- a/Moose Training/Documentation/Base.html +++ b/Moose Training/Documentation/Base.html @@ -51,6 +51,7 @@
  • Mission
  • NOTASK
  • PICKUPTASK
  • +
  • Point
  • ROUTETASK
  • STAGE
  • Scheduler
  • @@ -58,6 +59,7 @@
  • Sead
  • Set
  • Spawn
  • +
  • Static
  • StaticObject
  • TASK
  • Unit
  • @@ -206,7 +208,7 @@ These tracing levels were defined to avoid bulks of tracing to be generated by l
    - + @@ -260,7 +262,7 @@ These tracing levels were defined to avoid bulks of tracing to be generated by l - + @@ -575,7 +577,7 @@ A #table or any field.

    -BASE:F(Arguments) +BASE:F(Arguments, DebugInfoCurrentParam, DebugInfoFromParam)
    @@ -585,13 +587,23 @@ A #table or any field.

    Must be at the beginning of the function logic.

    -

    Parameter

    +

    Parameters

    • Arguments : A #table or any field.

      +
    • +
    • + +

      DebugInfoCurrentParam :

      + +
    • +
    • + +

      DebugInfoFromParam :

      +
    @@ -802,7 +814,7 @@ end
    -BASE:T(Arguments) +BASE:T(Arguments, DebugInfoCurrentParam, DebugInfoFromParam)
    @@ -812,13 +824,23 @@ end

    Can be anywhere within the function logic.

    -

    Parameter

    +

    Parameters

    • Arguments : A #table or any field.

      +
    • +
    • + +

      DebugInfoCurrentParam :

      + +
    • +
    • + +

      DebugInfoFromParam :

      +
    diff --git a/Moose Training/Documentation/CARGO.html b/Moose Training/Documentation/CARGO.html index 887fddee7..b87c177e3 100644 --- a/Moose Training/Documentation/CARGO.html +++ b/Moose Training/Documentation/CARGO.html @@ -51,6 +51,7 @@
  • Mission
  • NOTASK
  • PICKUPTASK
  • +
  • Point
  • ROUTETASK
  • STAGE
  • Scheduler
  • @@ -58,6 +59,7 @@
  • Sead
  • Set
  • Spawn
  • +
  • Static
  • StaticObject
  • TASK
  • Unit
  • diff --git a/Moose Training/Documentation/CleanUp.html b/Moose Training/Documentation/CleanUp.html index 09d6b19f7..d1ade1478 100644 --- a/Moose Training/Documentation/CleanUp.html +++ b/Moose Training/Documentation/CleanUp.html @@ -51,6 +51,7 @@
  • Mission
  • NOTASK
  • PICKUPTASK
  • +
  • Point
  • ROUTETASK
  • STAGE
  • Scheduler
  • @@ -58,6 +59,7 @@
  • Sead
  • Set
  • Spawn
  • +
  • Static
  • StaticObject
  • TASK
  • Unit
  • diff --git a/Moose Training/Documentation/Client.html b/Moose Training/Documentation/Client.html index 3ac967009..d0fc0da40 100644 --- a/Moose Training/Documentation/Client.html +++ b/Moose Training/Documentation/Client.html @@ -51,6 +51,7 @@
  • Mission
  • NOTASK
  • PICKUPTASK
  • +
  • Point
  • ROUTETASK
  • STAGE
  • Scheduler
  • @@ -58,6 +59,7 @@
  • Sead
  • Set
  • Spawn
  • +
  • Static
  • StaticObject
  • TASK
  • Unit
  • diff --git a/Moose Training/Documentation/DCSAirbase.html b/Moose Training/Documentation/DCSAirbase.html index 2d2c35185..da2207317 100644 --- a/Moose Training/Documentation/DCSAirbase.html +++ b/Moose Training/Documentation/DCSAirbase.html @@ -51,6 +51,7 @@
  • Mission
  • NOTASK
  • PICKUPTASK
  • +
  • Point
  • ROUTETASK
  • STAGE
  • Scheduler
  • @@ -58,6 +59,7 @@
  • Sead
  • Set
  • Spawn
  • +
  • Static
  • StaticObject
  • TASK
  • Unit
  • diff --git a/Moose Training/Documentation/DCSCoalitionObject.html b/Moose Training/Documentation/DCSCoalitionObject.html index 1394b09b8..563037392 100644 --- a/Moose Training/Documentation/DCSCoalitionObject.html +++ b/Moose Training/Documentation/DCSCoalitionObject.html @@ -51,6 +51,7 @@
  • Mission
  • NOTASK
  • PICKUPTASK
  • +
  • Point
  • ROUTETASK
  • STAGE
  • Scheduler
  • @@ -58,6 +59,7 @@
  • Sead
  • Set
  • Spawn
  • +
  • Static
  • StaticObject
  • TASK
  • Unit
  • diff --git a/Moose Training/Documentation/DCSCommand.html b/Moose Training/Documentation/DCSCommand.html index ffb46f8cb..e52889367 100644 --- a/Moose Training/Documentation/DCSCommand.html +++ b/Moose Training/Documentation/DCSCommand.html @@ -51,6 +51,7 @@
  • Mission
  • NOTASK
  • PICKUPTASK
  • +
  • Point
  • ROUTETASK
  • STAGE
  • Scheduler
  • @@ -58,6 +59,7 @@
  • Sead
  • Set
  • Spawn
  • +
  • Static
  • StaticObject
  • TASK
  • Unit
  • diff --git a/Moose Training/Documentation/DCSController.html b/Moose Training/Documentation/DCSController.html index 89cb04d28..eabadf9b3 100644 --- a/Moose Training/Documentation/DCSController.html +++ b/Moose Training/Documentation/DCSController.html @@ -51,6 +51,7 @@
  • Mission
  • NOTASK
  • PICKUPTASK
  • +
  • Point
  • ROUTETASK
  • STAGE
  • Scheduler
  • @@ -58,6 +59,7 @@
  • Sead
  • Set
  • Spawn
  • +
  • Static
  • StaticObject
  • TASK
  • Unit
  • diff --git a/Moose Training/Documentation/DCSGroup.html b/Moose Training/Documentation/DCSGroup.html index c46f4755e..d3dc0c75a 100644 --- a/Moose Training/Documentation/DCSGroup.html +++ b/Moose Training/Documentation/DCSGroup.html @@ -51,6 +51,7 @@
  • Mission
  • NOTASK
  • PICKUPTASK
  • +
  • Point
  • ROUTETASK
  • STAGE
  • Scheduler
  • @@ -58,6 +59,7 @@
  • Sead
  • Set
  • Spawn
  • +
  • Static
  • StaticObject
  • TASK
  • Unit
  • diff --git a/Moose Training/Documentation/DCSObject.html b/Moose Training/Documentation/DCSObject.html index 08f490b23..5120affce 100644 --- a/Moose Training/Documentation/DCSObject.html +++ b/Moose Training/Documentation/DCSObject.html @@ -51,6 +51,7 @@
  • Mission
  • NOTASK
  • PICKUPTASK
  • +
  • Point
  • ROUTETASK
  • STAGE
  • Scheduler
  • @@ -58,6 +59,7 @@
  • Sead
  • Set
  • Spawn
  • +
  • Static
  • StaticObject
  • TASK
  • Unit
  • diff --git a/Moose Training/Documentation/DCSTask.html b/Moose Training/Documentation/DCSTask.html index 0bbfd971a..cdbe87871 100644 --- a/Moose Training/Documentation/DCSTask.html +++ b/Moose Training/Documentation/DCSTask.html @@ -51,6 +51,7 @@
  • Mission
  • NOTASK
  • PICKUPTASK
  • +
  • Point
  • ROUTETASK
  • STAGE
  • Scheduler
  • @@ -58,6 +59,7 @@
  • Sead
  • Set
  • Spawn
  • +
  • Static
  • StaticObject
  • TASK
  • Unit
  • diff --git a/Moose Training/Documentation/DCSTypes.html b/Moose Training/Documentation/DCSTypes.html index 5eeb019c3..e4fa753f7 100644 --- a/Moose Training/Documentation/DCSTypes.html +++ b/Moose Training/Documentation/DCSTypes.html @@ -51,6 +51,7 @@
  • Mission
  • NOTASK
  • PICKUPTASK
  • +
  • Point
  • ROUTETASK
  • STAGE
  • Scheduler
  • @@ -58,6 +59,7 @@
  • Sead
  • Set
  • Spawn
  • +
  • Static
  • StaticObject
  • TASK
  • Unit
  • diff --git a/Moose Training/Documentation/DCSUnit.html b/Moose Training/Documentation/DCSUnit.html index c55ecc3e4..20b5c9f57 100644 --- a/Moose Training/Documentation/DCSUnit.html +++ b/Moose Training/Documentation/DCSUnit.html @@ -51,6 +51,7 @@
  • Mission
  • NOTASK
  • PICKUPTASK
  • +
  • Point
  • ROUTETASK
  • STAGE
  • Scheduler
  • @@ -58,6 +59,7 @@
  • Sead
  • Set
  • Spawn
  • +
  • Static
  • StaticObject
  • TASK
  • Unit
  • diff --git a/Moose Training/Documentation/DCSWorld.html b/Moose Training/Documentation/DCSWorld.html index 8e993da85..8afaae99a 100644 --- a/Moose Training/Documentation/DCSWorld.html +++ b/Moose Training/Documentation/DCSWorld.html @@ -51,6 +51,7 @@
  • Mission
  • NOTASK
  • PICKUPTASK
  • +
  • Point
  • ROUTETASK
  • STAGE
  • Scheduler
  • @@ -58,6 +59,7 @@
  • Sead
  • Set
  • Spawn
  • +
  • Static
  • StaticObject
  • TASK
  • Unit
  • diff --git a/Moose Training/Documentation/DCStimer.html b/Moose Training/Documentation/DCStimer.html index 00f626d06..e09e649cb 100644 --- a/Moose Training/Documentation/DCStimer.html +++ b/Moose Training/Documentation/DCStimer.html @@ -51,6 +51,7 @@
  • Mission
  • NOTASK
  • PICKUPTASK
  • +
  • Point
  • ROUTETASK
  • STAGE
  • Scheduler
  • @@ -58,6 +59,7 @@
  • Sead
  • Set
  • Spawn
  • +
  • Static
  • StaticObject
  • TASK
  • Unit
  • diff --git a/Moose Training/Documentation/DEPLOYTASK.html b/Moose Training/Documentation/DEPLOYTASK.html index 1fa64e415..02f845c63 100644 --- a/Moose Training/Documentation/DEPLOYTASK.html +++ b/Moose Training/Documentation/DEPLOYTASK.html @@ -51,6 +51,7 @@
  • Mission
  • NOTASK
  • PICKUPTASK
  • +
  • Point
  • ROUTETASK
  • STAGE
  • Scheduler
  • @@ -58,6 +59,7 @@
  • Sead
  • Set
  • Spawn
  • +
  • Static
  • StaticObject
  • TASK
  • Unit
  • diff --git a/Moose Training/Documentation/DESTROYBASETASK.html b/Moose Training/Documentation/DESTROYBASETASK.html index 8de686c17..fb41bfe0f 100644 --- a/Moose Training/Documentation/DESTROYBASETASK.html +++ b/Moose Training/Documentation/DESTROYBASETASK.html @@ -51,6 +51,7 @@
  • Mission
  • NOTASK
  • PICKUPTASK
  • +
  • Point
  • ROUTETASK
  • STAGE
  • Scheduler
  • @@ -58,6 +59,7 @@
  • Sead
  • Set
  • Spawn
  • +
  • Static
  • StaticObject
  • TASK
  • Unit
  • diff --git a/Moose Training/Documentation/DESTROYGROUPSTASK.html b/Moose Training/Documentation/DESTROYGROUPSTASK.html index 0c9455cf6..22e462095 100644 --- a/Moose Training/Documentation/DESTROYGROUPSTASK.html +++ b/Moose Training/Documentation/DESTROYGROUPSTASK.html @@ -51,6 +51,7 @@
  • Mission
  • NOTASK
  • PICKUPTASK
  • +
  • Point
  • ROUTETASK
  • STAGE
  • Scheduler
  • @@ -58,6 +59,7 @@
  • Sead
  • Set
  • Spawn
  • +
  • Static
  • StaticObject
  • TASK
  • Unit
  • diff --git a/Moose Training/Documentation/DESTROYRADARSTASK.html b/Moose Training/Documentation/DESTROYRADARSTASK.html index c88de6600..f61ac25ed 100644 --- a/Moose Training/Documentation/DESTROYRADARSTASK.html +++ b/Moose Training/Documentation/DESTROYRADARSTASK.html @@ -51,6 +51,7 @@
  • Mission
  • NOTASK
  • PICKUPTASK
  • +
  • Point
  • ROUTETASK
  • STAGE
  • Scheduler
  • @@ -58,6 +59,7 @@
  • Sead
  • Set
  • Spawn
  • +
  • Static
  • StaticObject
  • TASK
  • Unit
  • diff --git a/Moose Training/Documentation/DESTROYUNITTYPESTASK.html b/Moose Training/Documentation/DESTROYUNITTYPESTASK.html index 17f188b27..bea58fa6f 100644 --- a/Moose Training/Documentation/DESTROYUNITTYPESTASK.html +++ b/Moose Training/Documentation/DESTROYUNITTYPESTASK.html @@ -51,6 +51,7 @@
  • Mission
  • NOTASK
  • PICKUPTASK
  • +
  • Point
  • ROUTETASK
  • STAGE
  • Scheduler
  • @@ -58,6 +59,7 @@
  • Sead
  • Set
  • Spawn
  • +
  • Static
  • StaticObject
  • TASK
  • Unit
  • diff --git a/Moose Training/Documentation/Database.html b/Moose Training/Documentation/Database.html index d73e87dd4..e4a84907d 100644 --- a/Moose Training/Documentation/Database.html +++ b/Moose Training/Documentation/Database.html @@ -51,6 +51,7 @@
  • Mission
  • NOTASK
  • PICKUPTASK
  • +
  • Point
  • ROUTETASK
  • STAGE
  • Scheduler
  • @@ -58,6 +59,7 @@
  • Sead
  • Set
  • Spawn
  • +
  • Static
  • StaticObject
  • TASK
  • Unit
  • @@ -134,6 +136,12 @@ The following iterator methods are currently available within the DATABASE:

    + + + + @@ -164,6 +172,12 @@ The following iterator methods are currently available within the DATABASE:

    + + + + @@ -176,6 +190,12 @@ The following iterator methods are currently available within the DATABASE:

    + + + + @@ -194,6 +214,12 @@ The following iterator methods are currently available within the DATABASE:

    + + + + @@ -284,6 +310,12 @@ The following iterator methods are currently available within the DATABASE:

    + + + + @@ -335,15 +367,21 @@ The following iterator methods are currently available within the DATABASE:

    - + + + + + @@ -458,6 +496,32 @@ The following iterator methods are currently available within the DATABASE:

    + +DATABASE:AddStatic(DCSStatic, DCSStaticName) + +
    +
    + +

    Adds a Static based on the Static Name in the DATABASE.

    + +

    Parameters

    +
      +
    • + +

      DCSStatic :

      + +
    • +
    • + +

      DCSStaticName :

      + +
    • +
    +
    +
    +
    +
    + DATABASE:AddUnit(DCSUnit, DCSUnitName) @@ -535,6 +599,20 @@ The following iterator methods are currently available within the DATABASE:

    + +
    +
    +
    + + + +DATABASE.DCSStatics + +
    +
    + + +
    @@ -575,6 +653,27 @@ The following iterator methods are currently available within the DATABASE:

    + +DATABASE:DeleteStatic(DCSStaticName) + +
    +
    + +

    Deletes a Static from the DATABASE based on the Static Name.

    + +

    Parameter

    +
      +
    • + +

      DCSStaticName :

      + +
    • +
    +
    +
    +
    +
    + DATABASE:DeleteUnit(DCSUnitName) @@ -648,6 +747,32 @@ The found GROUP.

    + +DATABASE:FindStatic(StaticName) + +
    +
    + +

    Finds a STATIC based on the StaticName.

    + +

    Parameter

    +
      +
    • + +

      #string StaticName :

      + +
    • +
    +

    Return value

    + +

    Static#STATIC: +The found STATIC.

    + +
    +
    +
    +
    + DATABASE:FindUnit(UnitName) @@ -1029,6 +1154,20 @@ DBObject = DATABASE:New() + +
    +
    +
    + + + +DATABASE.STATICS + +
    +
    + + +
    @@ -1203,13 +1342,13 @@ self

    - -DATABASE:_RegisterDatabase() + +DATABASE:_RegisterGroupsAndUnits()
    -

    Private method that registers all datapoints within in the mission.

    +

    Private method that registers all Groups and Units within in the mission.

    Return value

    @@ -1234,6 +1373,19 @@ self

    #DATABASE: self

    +
    +
    +
    +
    + + +DATABASE:_RegisterStatics() + +
    +
    + + +
    diff --git a/Moose Training/Documentation/Escort.html b/Moose Training/Documentation/Escort.html index 1b3f58c93..5a831df88 100644 --- a/Moose Training/Documentation/Escort.html +++ b/Moose Training/Documentation/Escort.html @@ -51,6 +51,7 @@
  • Mission
  • NOTASK
  • PICKUPTASK
  • +
  • Point
  • ROUTETASK
  • STAGE
  • Scheduler
  • @@ -58,6 +59,7 @@
  • Sead
  • Set
  • Spawn
  • +
  • Static
  • StaticObject
  • TASK
  • Unit
  • diff --git a/Moose Training/Documentation/Event.html b/Moose Training/Documentation/Event.html index 8d0022235..11e6c6d9a 100644 --- a/Moose Training/Documentation/Event.html +++ b/Moose Training/Documentation/Event.html @@ -51,6 +51,7 @@
  • Mission
  • NOTASK
  • PICKUPTASK
  • +
  • Point
  • ROUTETASK
  • STAGE
  • Scheduler
  • @@ -58,6 +59,7 @@
  • Sead
  • Set
  • Spawn
  • +
  • Static
  • StaticObject
  • TASK
  • Unit
  • diff --git a/Moose Training/Documentation/GOHOMETASK.html b/Moose Training/Documentation/GOHOMETASK.html index 8290602af..407e6bfac 100644 --- a/Moose Training/Documentation/GOHOMETASK.html +++ b/Moose Training/Documentation/GOHOMETASK.html @@ -51,6 +51,7 @@
  • Mission
  • NOTASK
  • PICKUPTASK
  • +
  • Point
  • ROUTETASK
  • STAGE
  • Scheduler
  • @@ -58,6 +59,7 @@
  • Sead
  • Set
  • Spawn
  • +
  • Static
  • StaticObject
  • TASK
  • Unit
  • diff --git a/Moose Training/Documentation/Group.html b/Moose Training/Documentation/Group.html index 052c06a43..3bd916c01 100644 --- a/Moose Training/Documentation/Group.html +++ b/Moose Training/Documentation/Group.html @@ -51,6 +51,7 @@
  • Mission
  • NOTASK
  • PICKUPTASK
  • +
  • Point
  • ROUTETASK
  • STAGE
  • Scheduler
  • @@ -58,6 +59,7 @@
  • Sead
  • Set
  • Spawn
  • +
  • Static
  • StaticObject
  • TASK
  • Unit
  • diff --git a/Moose Training/Documentation/GroupSet.html b/Moose Training/Documentation/GroupSet.html index ec91f7267..e0ae7f72c 100644 --- a/Moose Training/Documentation/GroupSet.html +++ b/Moose Training/Documentation/GroupSet.html @@ -51,6 +51,7 @@
  • Mission
  • NOTASK
  • PICKUPTASK
  • +
  • Point
  • ROUTETASK
  • STAGE
  • Scheduler
  • @@ -58,6 +59,7 @@
  • Sead
  • Set
  • Spawn
  • +
  • Static
  • StaticObject
  • TASK
  • Unit
  • diff --git a/Moose Training/Documentation/MISSION.html b/Moose Training/Documentation/MISSION.html index 080e4f1ec..977eb7641 100644 --- a/Moose Training/Documentation/MISSION.html +++ b/Moose Training/Documentation/MISSION.html @@ -51,6 +51,7 @@
  • Mission
  • NOTASK
  • PICKUPTASK
  • +
  • Point
  • ROUTETASK
  • STAGE
  • Scheduler
  • @@ -58,6 +59,7 @@
  • Sead
  • Set
  • Spawn
  • +
  • Static
  • StaticObject
  • TASK
  • Unit
  • diff --git a/Moose Training/Documentation/MOVEMENT.html b/Moose Training/Documentation/MOVEMENT.html index feee71367..8808e50ae 100644 --- a/Moose Training/Documentation/MOVEMENT.html +++ b/Moose Training/Documentation/MOVEMENT.html @@ -51,6 +51,7 @@
  • Mission
  • NOTASK
  • PICKUPTASK
  • +
  • Point
  • ROUTETASK
  • STAGE
  • Scheduler
  • @@ -58,6 +59,7 @@
  • Sead
  • Set
  • Spawn
  • +
  • Static
  • StaticObject
  • TASK
  • Unit
  • diff --git a/Moose Training/Documentation/Menu.html b/Moose Training/Documentation/Menu.html index 33582dadc..6b2a14236 100644 --- a/Moose Training/Documentation/Menu.html +++ b/Moose Training/Documentation/Menu.html @@ -51,6 +51,7 @@
  • Mission
  • NOTASK
  • PICKUPTASK
  • +
  • Point
  • ROUTETASK
  • STAGE
  • Scheduler
  • @@ -58,6 +59,7 @@
  • Sead
  • Set
  • Spawn
  • +
  • Static
  • StaticObject
  • TASK
  • Unit
  • diff --git a/Moose Training/Documentation/Message.html b/Moose Training/Documentation/Message.html index e61742e06..0646a26d4 100644 --- a/Moose Training/Documentation/Message.html +++ b/Moose Training/Documentation/Message.html @@ -51,6 +51,7 @@
  • Mission
  • NOTASK
  • PICKUPTASK
  • +
  • Point
  • ROUTETASK
  • STAGE
  • Scheduler
  • @@ -58,6 +59,7 @@
  • Sead
  • Set
  • Spawn
  • +
  • Static
  • StaticObject
  • TASK
  • Unit
  • diff --git a/Moose Training/Documentation/MissileTrainer.html b/Moose Training/Documentation/MissileTrainer.html index 46f34d872..ca64eaf84 100644 --- a/Moose Training/Documentation/MissileTrainer.html +++ b/Moose Training/Documentation/MissileTrainer.html @@ -51,6 +51,7 @@
  • Mission
  • NOTASK
  • PICKUPTASK
  • +
  • Point
  • ROUTETASK
  • STAGE
  • Scheduler
  • @@ -58,6 +59,7 @@
  • Sead
  • Set
  • Spawn
  • +
  • Static
  • StaticObject
  • TASK
  • Unit
  • diff --git a/Moose Training/Documentation/NOTASK.html b/Moose Training/Documentation/NOTASK.html index 3c056316d..932d91fa2 100644 --- a/Moose Training/Documentation/NOTASK.html +++ b/Moose Training/Documentation/NOTASK.html @@ -51,6 +51,7 @@
  • Mission
  • NOTASK
  • PICKUPTASK
  • +
  • Point
  • ROUTETASK
  • STAGE
  • Scheduler
  • @@ -58,6 +59,7 @@
  • Sead
  • Set
  • Spawn
  • +
  • Static
  • StaticObject
  • TASK
  • Unit
  • diff --git a/Moose Training/Documentation/PICKUPTASK.html b/Moose Training/Documentation/PICKUPTASK.html index e73b68b2a..e19440ba3 100644 --- a/Moose Training/Documentation/PICKUPTASK.html +++ b/Moose Training/Documentation/PICKUPTASK.html @@ -51,6 +51,7 @@
  • Mission
  • NOTASK
  • PICKUPTASK
  • +
  • Point
  • ROUTETASK
  • STAGE
  • Scheduler
  • @@ -58,6 +59,7 @@
  • Sead
  • Set
  • Spawn
  • +
  • Static
  • StaticObject
  • TASK
  • Unit
  • diff --git a/Moose Training/Documentation/Point.html b/Moose Training/Documentation/Point.html new file mode 100644 index 000000000..90905194b --- /dev/null +++ b/Moose Training/Documentation/Point.html @@ -0,0 +1,826 @@ + + + + + + +
    +
    + +
    +
    +
    +
    + +
    +

    Module Point

    + +

    This module contains the POINT classes.

    + + + +

    1) Point#POINT_VEC3 class, extends Base#BASE

    +

    The Point#POINT_VEC3 class defines a 3D point in the simulator.

    + +

    1.1) POINT_VEC3 constructor

    + +

    A new POINT instance can be created with:

    + + + +

    2) Point#POINT_VEC2 class, extends Point#POINT_VEC3

    +

    The Point#POINT_VEC2 class defines a 2D point in the simulator. The height coordinate (if needed) will be the land height + an optional added height specified.

    + +

    2.1) POINT_VEC2 constructor

    + +

    A new POINT instance can be created with:

    + + + + +

    Global(s)

    +
    Spawn -

    Dynamic spawning of groups (and units).

    +

    This module contains the SPAWN class.

    BASE:F(Arguments)BASE:F(Arguments, DebugInfoCurrentParam, DebugInfoFromParam)

    Trace a function call.

    BASE:T(Arguments)BASE:T(Arguments, DebugInfoCurrentParam, DebugInfoFromParam)

    Trace a function logic.

    DATABASE:AddPlayer(UnitName, PlayerName)

    Adds a player based on the Player Name in the DATABASE.

    +
    DATABASE:AddStatic(DCSStatic, DCSStaticName) +

    Adds a Static based on the Static Name in the DATABASE.

    DATABASE.DCSGroups +
    DATABASE.DCSStatics +
    DATABASE:DeletePlayer(PlayerName)

    Deletes a player from the DATABASE based on the Player Name.

    +
    DATABASE:DeleteStatic(DCSStaticName) +

    Deletes a Static from the DATABASE based on the Static Name.

    DATABASE:FindGroup(GroupName)

    Finds a GROUP based on the GroupName.

    +
    DATABASE:FindStatic(StaticName) +

    Finds a STATIC based on the StaticName.

    DATABASE.PLAYERSALIVE +
    DATABASE.STATICS +
    DATABASE:_RegisterDatabase()DATABASE:_RegisterGroupsAndUnits() -

    Private method that registers all datapoints within in the mission.

    +

    Private method that registers all Groups and Units within in the mission.

    DATABASE:_RegisterPlayers()

    Private method that registers all alive players in the mission.

    +
    DATABASE:_RegisterStatics() +
    + + + + + + + + +
    POINT_VEC2 + +
    POINT_VEC3 + +
    +

    Type POINT_VEC2

    + + + + + + + + + +
    POINT_VEC2.ClassName + +
    POINT_VEC2:New(x, y, LandHeightAdd) +

    Create a new POINT_VEC2 object.

    +
    + +

    Type POINT_VEC3

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    POINT_VEC3.ClassName + +
    POINT_VEC3:Flare(Point, (, FlareColor, Azimuth) +

    Flares the point in a color.

    +
    POINT_VEC3.FlareColor + +
    POINT_VEC3:FlareGreen((, Azimuth) +

    Flare the POINT_VEC3 Green.

    +
    POINT_VEC3:FlareRed(Azimuth) +

    Flare the POINT_VEC3 Red.

    +
    POINT_VEC3:FlareWhite((, Azimuth) +

    Flare the POINT_VEC3 White.

    +
    POINT_VEC3:FlareYellow((, Azimuth) +

    Flare the POINT_VEC3 Yellow.

    +
    POINT_VEC3:New(x, y, z) +

    Create a new POINT_VEC3 object.

    +
    POINT_VEC3:Smoke(SmokeColor) +

    Smokes the point in a color.

    +
    POINT_VEC3:SmokeBlue() +

    Smoke the POINT_VEC3 Blue.

    +
    POINT_VEC3.SmokeColor + +
    POINT_VEC3:SmokeGreen() +

    Smoke the POINT_VEC3 Green.

    +
    POINT_VEC3:SmokeOrange() +

    Smoke the POINT_VEC3 Orange.

    +
    POINT_VEC3:SmokeRed() +

    Smoke the POINT_VEC3 Red.

    +
    POINT_VEC3:SmokeWhite() +

    Smoke the POINT_VEC3 White.

    +
    + +

    Type POINT_VEC3.FlareColor

    + + + + + + + + + + + + + + + + + +
    POINT_VEC3.FlareColor.Green + +
    POINT_VEC3.FlareColor.Red + +
    POINT_VEC3.FlareColor.White + +
    POINT_VEC3.FlareColor.Yellow + +
    + +

    Type POINT_VEC3.SmokeColor

    + + + + + + + + + + + + + + + + + + + + + +
    POINT_VEC3.SmokeColor.Blue + +
    POINT_VEC3.SmokeColor.Green + +
    POINT_VEC3.SmokeColor.Orange + +
    POINT_VEC3.SmokeColor.Red + +
    POINT_VEC3.SmokeColor.White + +
    + +

    Global(s)

    +
    +
    + + #POINT_VEC2 + +POINT_VEC2 + +
    +
    + + + +
    +
    +
    +
    + + #POINT_VEC3 + +POINT_VEC3 + +
    +
    + + + +
    +
    +

    Type Point

    + +

    Type POINT_VEC2

    + +

    The POINT_VEC2 class

    + +

    Field(s)

    +
    +
    + + #string + +POINT_VEC2.ClassName + +
    +
    + + + +
    +
    +
    +
    + + +POINT_VEC2:New(x, y, LandHeightAdd) + +
    +
    + +

    Create a new POINT_VEC2 object.

    + +

    Parameters

    +
      +
    • + +

      DCSTypes#Distance x : +The x coordinate of the Vec3 point, pointing to the North.

      + +
    • +
    • + +

      DCSTypes#Distance y : +The y coordinate of the Vec3 point, pointing to the Right.

      + +
    • +
    • + +

      DCSTypes#Distance LandHeightAdd : +(optional) The default height if required to be evaluated will be the land height of the x, y coordinate. You can specify an extra height to be added to the land height.

      + +
    • +
    +

    Return value

    + +

    Point#POINT_VEC2:

    + + +
    +
    + +

    Type POINT_VEC3

    + +

    The POINT_VEC3 class

    + +

    Field(s)

    +
    +
    + + #string + +POINT_VEC3.ClassName + +
    +
    + + + +
    +
    +
    +
    + + +POINT_VEC3:Flare(Point, (, FlareColor, Azimuth) + +
    +
    + +

    Flares the point in a color.

    + +

    Parameters

    +
      +
    • + +

      Point : +POINT_VEC3.FlareColor

      + +
    • +
    • + +

      DCSTypes#Azimuth ( : +ptional) Azimuth The azimuth of the flare direction. The default azimuth is 0.

      + +
    • +
    • + +

      FlareColor :

      + +
    • +
    • + +

      Azimuth :

      + +
    • +
    +
    +
    +
    +
    + + #POINT_VEC3.FlareColor + +POINT_VEC3.FlareColor + +
    +
    + + + +
    +
    +
    +
    + + +POINT_VEC3:FlareGreen((, Azimuth) + +
    +
    + +

    Flare the POINT_VEC3 Green.

    + +

    Parameters

    +
      +
    • + +

      DCSTypes#Azimuth ( : +ptional) Azimuth The azimuth of the flare direction. The default azimuth is 0.

      + +
    • +
    • + +

      Azimuth :

      + +
    • +
    +
    +
    +
    +
    + + +POINT_VEC3:FlareRed(Azimuth) + +
    +
    + +

    Flare the POINT_VEC3 Red.

    + +

    Parameter

    +
      +
    • + +

      Azimuth :

      + +
    • +
    +
    +
    +
    +
    + + +POINT_VEC3:FlareWhite((, Azimuth) + +
    +
    + +

    Flare the POINT_VEC3 White.

    + +

    Parameters

    +
      +
    • + +

      DCSTypes#Azimuth ( : +ptional) Azimuth The azimuth of the flare direction. The default azimuth is 0.

      + +
    • +
    • + +

      Azimuth :

      + +
    • +
    +
    +
    +
    +
    + + +POINT_VEC3:FlareYellow((, Azimuth) + +
    +
    + +

    Flare the POINT_VEC3 Yellow.

    + +

    Parameters

    +
      +
    • + +

      DCSTypes#Azimuth ( : +ptional) Azimuth The azimuth of the flare direction. The default azimuth is 0.

      + +
    • +
    • + +

      Azimuth :

      + +
    • +
    +
    +
    +
    +
    + + +POINT_VEC3:New(x, y, z) + +
    +
    + +

    Create a new POINT_VEC3 object.

    + +

    Parameters

    +
      +
    • + +

      DCSTypes#Distance x : +The x coordinate of the Vec3 point, pointing to the North.

      + +
    • +
    • + +

      DCSTypes#Distance y : +The y coordinate of the Vec3 point, pointing Upwards.

      + +
    • +
    • + +

      DCSTypes#Distance z : +The z coordinate of the Vec3 point, pointing to the Right.

      + +
    • +
    +

    Return value

    + +

    Point#POINT_VEC3:

    + + +
    +
    +
    +
    + + +POINT_VEC3:Smoke(SmokeColor) + +
    +
    + +

    Smokes the point in a color.

    + +

    Parameter

    + +
    +
    +
    +
    + + +POINT_VEC3:SmokeBlue() + +
    +
    + +

    Smoke the POINT_VEC3 Blue.

    + +
    +
    +
    +
    + + #POINT_VEC3.SmokeColor + +POINT_VEC3.SmokeColor + +
    +
    + + + +
    +
    +
    +
    + + +POINT_VEC3:SmokeGreen() + +
    +
    + +

    Smoke the POINT_VEC3 Green.

    + +
    +
    +
    +
    + + +POINT_VEC3:SmokeOrange() + +
    +
    + +

    Smoke the POINT_VEC3 Orange.

    + +
    +
    +
    +
    + + +POINT_VEC3:SmokeRed() + +
    +
    + +

    Smoke the POINT_VEC3 Red.

    + +
    +
    +
    +
    + + +POINT_VEC3:SmokeWhite() + +
    +
    + +

    Smoke the POINT_VEC3 White.

    + +
    +
    + +

    Type POINT_VEC3.FlareColor

    + +

    FlareColor

    + +

    Field(s)

    +
    +
    + + +POINT_VEC3.FlareColor.Green + +
    +
    + + + +
    +
    +
    +
    + + +POINT_VEC3.FlareColor.Red + +
    +
    + + + +
    +
    +
    +
    + + +POINT_VEC3.FlareColor.White + +
    +
    + + + +
    +
    +
    +
    + + +POINT_VEC3.FlareColor.Yellow + +
    +
    + + + +
    +
    + +

    Type POINT_VEC3.SmokeColor

    + +

    SmokeColor

    + +

    Field(s)

    +
    +
    + + +POINT_VEC3.SmokeColor.Blue + +
    +
    + + + +
    +
    +
    +
    + + +POINT_VEC3.SmokeColor.Green + +
    +
    + + + +
    +
    +
    +
    + + +POINT_VEC3.SmokeColor.Orange + +
    +
    + + + +
    +
    +
    +
    + + +POINT_VEC3.SmokeColor.Red + +
    +
    + + + +
    +
    +
    +
    + + +POINT_VEC3.SmokeColor.White + +
    +
    + + + +
    +
    + +
    + + + + diff --git a/Moose Training/Documentation/ROUTETASK.html b/Moose Training/Documentation/ROUTETASK.html index 05c8b48a8..05977ad42 100644 --- a/Moose Training/Documentation/ROUTETASK.html +++ b/Moose Training/Documentation/ROUTETASK.html @@ -51,6 +51,7 @@
  • Mission
  • NOTASK
  • PICKUPTASK
  • +
  • Point
  • ROUTETASK
  • STAGE
  • Scheduler
  • @@ -58,6 +59,7 @@
  • Sead
  • Set
  • Spawn
  • +
  • Static
  • StaticObject
  • TASK
  • Unit
  • diff --git a/Moose Training/Documentation/STAGE.html b/Moose Training/Documentation/STAGE.html index 34233aaa0..3cd29ea7b 100644 --- a/Moose Training/Documentation/STAGE.html +++ b/Moose Training/Documentation/STAGE.html @@ -51,6 +51,7 @@
  • Mission
  • NOTASK
  • PICKUPTASK
  • +
  • Point
  • ROUTETASK
  • STAGE
  • Scheduler
  • @@ -58,6 +59,7 @@
  • Sead
  • Set
  • Spawn
  • +
  • Static
  • StaticObject
  • TASK
  • Unit
  • diff --git a/Moose Training/Documentation/Scheduler.html b/Moose Training/Documentation/Scheduler.html index 8272a801a..0ca0aa1dc 100644 --- a/Moose Training/Documentation/Scheduler.html +++ b/Moose Training/Documentation/Scheduler.html @@ -51,6 +51,7 @@
  • Mission
  • NOTASK
  • PICKUPTASK
  • +
  • Point
  • ROUTETASK
  • STAGE
  • Scheduler
  • @@ -58,6 +59,7 @@
  • Sead
  • Set
  • Spawn
  • +
  • Static
  • StaticObject
  • TASK
  • Unit
  • diff --git a/Moose Training/Documentation/Scoring.html b/Moose Training/Documentation/Scoring.html index 5779476cc..10a4e3e44 100644 --- a/Moose Training/Documentation/Scoring.html +++ b/Moose Training/Documentation/Scoring.html @@ -51,6 +51,7 @@
  • Mission
  • NOTASK
  • PICKUPTASK
  • +
  • Point
  • ROUTETASK
  • STAGE
  • Scheduler
  • @@ -58,6 +59,7 @@
  • Sead
  • Set
  • Spawn
  • +
  • Static
  • StaticObject
  • TASK
  • Unit
  • diff --git a/Moose Training/Documentation/Sead.html b/Moose Training/Documentation/Sead.html index 96abe0840..10b277bd4 100644 --- a/Moose Training/Documentation/Sead.html +++ b/Moose Training/Documentation/Sead.html @@ -51,6 +51,7 @@
  • Mission
  • NOTASK
  • PICKUPTASK
  • +
  • Point
  • ROUTETASK
  • STAGE
  • Scheduler
  • @@ -58,6 +59,7 @@
  • Sead
  • Set
  • Spawn
  • +
  • Static
  • StaticObject
  • TASK
  • Unit
  • diff --git a/Moose Training/Documentation/Set.html b/Moose Training/Documentation/Set.html index 6a1c4fc64..12c0764fe 100644 --- a/Moose Training/Documentation/Set.html +++ b/Moose Training/Documentation/Set.html @@ -51,6 +51,7 @@
  • Mission
  • NOTASK
  • PICKUPTASK
  • +
  • Point
  • ROUTETASK
  • STAGE
  • Scheduler
  • @@ -58,6 +59,7 @@
  • Sead
  • Set
  • Spawn
  • +
  • Static
  • StaticObject
  • TASK
  • Unit
  • diff --git a/Moose Training/Documentation/Spawn.html b/Moose Training/Documentation/Spawn.html index 042e1984c..05801f80f 100644 --- a/Moose Training/Documentation/Spawn.html +++ b/Moose Training/Documentation/Spawn.html @@ -51,6 +51,7 @@
  • Mission
  • NOTASK
  • PICKUPTASK
  • +
  • Point
  • ROUTETASK
  • STAGE
  • Scheduler
  • @@ -58,6 +59,7 @@
  • Sead
  • Set
  • Spawn
  • +
  • Static
  • StaticObject
  • TASK
  • Unit
  • diff --git a/Moose Training/Documentation/Static.html b/Moose Training/Documentation/Static.html new file mode 100644 index 000000000..c298df14c --- /dev/null +++ b/Moose Training/Documentation/Static.html @@ -0,0 +1,253 @@ + + + + + + +
    +
    + +
    +
    +
    +
    + +
    +

    Module Static

    + +

    This module contains the STATIC class.

    + + + +

    1) Static#STATIC class, extends Unit#UNIT

    +

    Statics are Static Units defined within the Mission Editor. +Note that Statics are almost the same as Units, but they don't have a controller. +The Static#STATIC class is a wrapper class to handle the DCS Static objects:

    + +
      +
    • Wraps the DCS Static objects.
    • +
    • Support all DCS Static APIs.
    • +
    • Enhance with Static specific APIs not in the DCS API set.
    • +
    + +

    1.1) STATIC reference methods

    +

    For each DCS Static will have a STATIC wrapper object (instance) within the _DATABASE object. +This is done at the beginning of the mission (when the mission starts).

    + +

    The STATIC class does not contain a :New() method, rather it provides :Find() methods to retrieve the object reference +using the Static Name.

    + +

    Another thing to know is that STATIC objects do not "contain" the DCS Static object. +The STATIc methods will reference the DCS Static object by name when it is needed during API execution. +If the DCS Static object does not exist or is nil, the STATIC methods will return nil and log an exception in the DCS.log file.

    + +

    The STATIc class provides the following functions to retrieve quickly the relevant STATIC instance:

    + +
      +
    • STATIC.FindByName(): Find a STATIC instance from the _DATABASE object using a DCS Static name.
    • +
    + +

    IMPORTANT: ONE SHOULD NEVER SANATIZE these STATIC OBJECT REFERENCES! (make the STATIC object references nil).

    + + +

    Global(s)

    + + + + + +
    STATIC + +
    +

    Type STATIC

    + + + + + + + + + + + + + + + + + +
    STATIC.ClassName + +
    STATIC:FindByName(StaticName) +

    Finds a STATIC from the _DATABASE using the relevant Static Name.

    +
    STATIC:GetDCSUnit() + +
    STATIC:Register(StaticName) + +
    + +

    Global(s)

    +
    +
    + + #STATIC + +STATIC + +
    +
    + + + +
    +
    +

    Type Static

    + +

    Type STATIC

    + +

    The STATIC class

    + +

    Field(s)

    +
    +
    + + #string + +STATIC.ClassName + +
    +
    + + + +
    +
    +
    +
    + + +STATIC:FindByName(StaticName) + +
    +
    + +

    Finds a STATIC from the _DATABASE using the relevant Static Name.

    + + +

    As an optional parameter, a briefing text can be given also.

    + +

    Parameter

    +
      +
    • + +

      #string StaticName : +Name of the DCS Static as defined within the Mission Editor.

      + +
    • +
    +

    Return value

    + +

    #STATIC:

    + + +
    +
    +
    +
    + + +STATIC:GetDCSUnit() + +
    +
    + + + +
    +
    +
    +
    + + +STATIC:Register(StaticName) + +
    +
    + + + +

    Parameter

    +
      +
    • + +

      StaticName :

      + +
    • +
    +
    +
    + +
    + +
    + + diff --git a/Moose Training/Documentation/StaticObject.html b/Moose Training/Documentation/StaticObject.html index 4c683810a..013f3334a 100644 --- a/Moose Training/Documentation/StaticObject.html +++ b/Moose Training/Documentation/StaticObject.html @@ -51,6 +51,7 @@
  • Mission
  • NOTASK
  • PICKUPTASK
  • +
  • Point
  • ROUTETASK
  • STAGE
  • Scheduler
  • @@ -58,6 +59,7 @@
  • Sead
  • Set
  • Spawn
  • +
  • Static
  • StaticObject
  • TASK
  • Unit
  • diff --git a/Moose Training/Documentation/TASK.html b/Moose Training/Documentation/TASK.html index 95a1bb086..d62f547dc 100644 --- a/Moose Training/Documentation/TASK.html +++ b/Moose Training/Documentation/TASK.html @@ -51,6 +51,7 @@
  • Mission
  • NOTASK
  • PICKUPTASK
  • +
  • Point
  • ROUTETASK
  • STAGE
  • Scheduler
  • @@ -58,6 +59,7 @@
  • Sead
  • Set
  • Spawn
  • +
  • Static
  • StaticObject
  • TASK
  • Unit
  • diff --git a/Moose Training/Documentation/Unit.html b/Moose Training/Documentation/Unit.html index a4f339517..e2035c8b5 100644 --- a/Moose Training/Documentation/Unit.html +++ b/Moose Training/Documentation/Unit.html @@ -51,6 +51,7 @@
  • Mission
  • NOTASK
  • PICKUPTASK
  • +
  • Point
  • ROUTETASK
  • STAGE
  • Scheduler
  • @@ -58,6 +59,7 @@
  • Sead
  • Set
  • Spawn
  • +
  • Static
  • StaticObject
  • TASK
  • Unit
  • diff --git a/Moose Training/Documentation/UnitSet.html b/Moose Training/Documentation/UnitSet.html index 6b2a18d04..4f6d4cbad 100644 --- a/Moose Training/Documentation/UnitSet.html +++ b/Moose Training/Documentation/UnitSet.html @@ -51,6 +51,7 @@
  • Mission
  • NOTASK
  • PICKUPTASK
  • +
  • Point
  • ROUTETASK
  • STAGE
  • Scheduler
  • @@ -58,6 +59,7 @@
  • Sead
  • Set
  • Spawn
  • +
  • Static
  • StaticObject
  • TASK
  • Unit
  • diff --git a/Moose Training/Documentation/Zone.html b/Moose Training/Documentation/Zone.html index 80dca123e..72034c196 100644 --- a/Moose Training/Documentation/Zone.html +++ b/Moose Training/Documentation/Zone.html @@ -51,6 +51,7 @@
  • Mission
  • NOTASK
  • PICKUPTASK
  • +
  • Point
  • ROUTETASK
  • STAGE
  • Scheduler
  • @@ -58,6 +59,7 @@
  • Sead
  • Set
  • Spawn
  • +
  • Static
  • StaticObject
  • TASK
  • Unit
  • @@ -209,7 +211,13 @@
    ZONE_BASE:New(ZoneName) - +

    ZONE_BASE constructor

    +
    ZONE_BASE:SmokeZone(SmokeColor) +

    Smokes the zone boundaries in a color.

    @@ -232,6 +240,12 @@ ZONE_POLYGON:New(ZoneName, ZoneGroup)

    Constructor to create a ZONE_POLYGON instance, taking the zone name and the name of the Group#GROUP defined within the Mission Editor.

    + + + + ZONE_POLYGON:SmokeZone(SmokeColor) + +

    Smokes the zone boundaries in a color.

    @@ -242,6 +256,12 @@ ZONE_RADIUS.ClassName + + + + ZONE_RADIUS:FlareZone(FlareColor, Points, Azimuth) + +

    Flares the zone boundaries in a color.

    @@ -281,7 +301,7 @@ - ZONE_RADIUS:New(PointVec2, Radius, ZoneName) + ZONE_RADIUS:New(ZoneName, PointVec2, Radius)

    Constructor of ZONE_RADIUS, taking the zone name, the zone location and a radius.

    @@ -308,6 +328,12 @@ ZONE_RADIUS:SetRadius(Radius)

    Sets the radius of the zone.

    + + + + ZONE_RADIUS:SmokeZone(SmokeColor, Points) + +

    Smokes the zone boundaries in a color.

    @@ -413,6 +439,10 @@

    Type Zone

    +

    Type POINT_VEC3.FlareColor

    + +

    Type POINT_VEC3.SmokeColor

    +

    Type ZONE

    The ZONE class, defined by the zone name as defined within the Mission Editor.

    @@ -545,13 +575,41 @@ true if the point is within the zone.

    - +

    ZONE_BASE constructor

    Parameter

    • -

      ZoneName :

      +

      #string ZoneName : +Name of the zone.

      + +
    • +
    +

    Return value

    + +

    #ZONE_BASE: +self

    + +
    + +
    +
    + + +ZONE_BASE:SmokeZone(SmokeColor) + +
    +
    + +

    Smokes the zone boundaries in a color.

    + +

    Parameter

    +
      +
    • + +

      SmokeColor : +The smoke color.

    @@ -638,6 +696,33 @@ The GROUP waypoints as defined within the Mission Editor define the polygon shap

    #ZONE_POLYGON: self

    +
    +
    +
    +
    + + +ZONE_POLYGON:SmokeZone(SmokeColor) + +
    +
    + +

    Smokes the zone boundaries in a color.

    + +

    Parameter

    + +

    Return value

    + +

    #ZONE_POLYGON: +self

    +
    @@ -658,6 +743,45 @@ self

    + + +
    +
    + + +ZONE_RADIUS:FlareZone(FlareColor, Points, Azimuth) + +
    +
    + +

    Flares the zone boundaries in a color.

    + +

    Parameters

    +
      +
    • + +

      #POINT_VEC3.FlareColor FlareColor : +The flare color.

      + +
    • +
    • + +

      #number Points : +(optional) The amount of points in the circle.

      + +
    • +
    • + +

      DCSTypes#Azimuth Azimuth : +(optional) Azimuth The azimuth of the flare.

      + +
    • +
    +

    Return value

    + +

    #ZONE_RADIUS: +self

    +
    @@ -799,7 +923,7 @@ true if the point is within the zone.

    -ZONE_RADIUS:New(PointVec2, Radius, ZoneName) +ZONE_RADIUS:New(ZoneName, PointVec2, Radius)
    @@ -810,6 +934,12 @@ true if the point is within the zone.

    • +

      #string ZoneName : +Name of the zone.

      + +
    • +
    • +

      DCSTypes#Vec2 PointVec2 : The location of the zone.

      @@ -819,17 +949,12 @@ The location of the zone.

      DCSTypes#Distance Radius : The radius of the zone.

      -
    • -
    • - -

      ZoneName :

      -

    Return value

    -

    #ZONE_RADIUS:

    - +

    #ZONE_RADIUS: +self

    @@ -913,6 +1038,39 @@ The radius of the zone.

    DCSTypes#Distance: The radius of the zone.

    + + +
    +
    + + +ZONE_RADIUS:SmokeZone(SmokeColor, Points) + +
    +
    + +

    Smokes the zone boundaries in a color.

    + +

    Parameters

    +
      +
    • + +

      #POINT_VEC3.SmokeColor SmokeColor : +The smoke color.

      + +
    • +
    • + +

      #number Points : +(optional) The amount of points in the circle.

      + +
    • +
    +

    Return value

    + +

    #ZONE_RADIUS: +self

    +
    diff --git a/Moose Training/Documentation/env.html b/Moose Training/Documentation/env.html index 7afe0823f..749d7eafa 100644 --- a/Moose Training/Documentation/env.html +++ b/Moose Training/Documentation/env.html @@ -51,6 +51,7 @@
  • Mission
  • NOTASK
  • PICKUPTASK
  • +
  • Point
  • ROUTETASK
  • STAGE
  • Scheduler
  • @@ -58,6 +59,7 @@
  • Sead
  • Set
  • Spawn
  • +
  • Static
  • StaticObject
  • TASK
  • Unit
  • diff --git a/Moose Training/Documentation/index.html b/Moose Training/Documentation/index.html index e48e04d74..890d5b675 100644 --- a/Moose Training/Documentation/index.html +++ b/Moose Training/Documentation/index.html @@ -51,6 +51,7 @@
  • Mission
  • NOTASK
  • PICKUPTASK
  • +
  • Point
  • ROUTETASK
  • STAGE
  • Scheduler
  • @@ -58,6 +59,7 @@
  • Sead
  • Set
  • Spawn
  • +
  • Static
  • StaticObject
  • TASK
  • Unit
  • @@ -280,6 +282,12 @@ PICKUPTASK

    A PICKUPTASK orchestrates the loading of CARGO at a specific landing zone.

    + + + + Point + +

    This module contains the POINT classes.

    @@ -322,6 +330,12 @@ Spawn

    This module contains the SPAWN class.

    + + + + Static + +

    This module contains the STATIC class.

    diff --git a/Moose Training/Documentation/land.html b/Moose Training/Documentation/land.html index 0a1a6c817..2bc1f0b6c 100644 --- a/Moose Training/Documentation/land.html +++ b/Moose Training/Documentation/land.html @@ -51,6 +51,7 @@
  • Mission
  • NOTASK
  • PICKUPTASK
  • +
  • Point
  • ROUTETASK
  • STAGE
  • Scheduler
  • @@ -58,6 +59,7 @@
  • Sead
  • Set
  • Spawn
  • +
  • Static
  • StaticObject
  • TASK
  • Unit
  • diff --git a/Moose Training/Documentation/routines.html b/Moose Training/Documentation/routines.html index e9e546ca5..8b1ea6154 100644 --- a/Moose Training/Documentation/routines.html +++ b/Moose Training/Documentation/routines.html @@ -51,6 +51,7 @@
  • Mission
  • NOTASK
  • PICKUPTASK
  • +
  • Point
  • ROUTETASK
  • STAGE
  • Scheduler
  • @@ -58,6 +59,7 @@
  • Sead
  • Set
  • Spawn
  • +
  • Static
  • StaticObject
  • TASK
  • Unit
  • diff --git a/Moose Training/Presentations/DCS World - MOOSE - Zones - Part 1 - Use zones with GROUP and UNIT.pptx b/Moose Training/Presentations/DCS World - MOOSE - Zones - Part 1 - Use zones with GROUP and UNIT.pptx index fd0c6f066331cd6f221149950d4728acf0cd8d59..f7d46732426687a331cb1a9b1402daa6305a3d0b 100644 GIT binary patch delta 641559 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

    lMjsUJVFjj$`|b5Xw2logIQ6&e z-RVYdSH|SbuThn2ipQ@lxEDY`fC}i}Tp+}PT3Tn42{VqATH-}K-@gZc<}iLE;-e1N z0!4-A9;AJreO~E{F5K&Sb6tP6re0mgEnJrCCx95LKy z>yJz;Z<0m0QTNj1^i=d!6lU#{>1Z8O3n+$(amLQ0AeSViL!JSQLi4+1gx^qc^i*6N zH%0#~lfONmrIuTp$2sjletmVQhN=riw&cA#I%DQnPMlQxyy*$5_8D zruDv1AeA1_c?pP)49{$DiaqT+mp4%}n&22|Ye#gu-tKKvH*_?}SW!c6f`q!h;U+oY z1n>y?;9l0o!;AfpvGPdq?Nz4r7i`;SW!Gw3w}AS{pk+@�lJg4o?O)6SvC=+Y^YZ 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 l zu}67Z3_4Rm=7lHB2rha7N~RC-fT-t8jpPv+zEu(cC1#bo^Ora2uI{tsrL;Ltsy7x2 zw>pB7Po@k2K|2%27?qn)RdSq5&WK%G=1~NP)JaTmOzu9v>x&-bB-aWG#1~y!l~(fg zLRWwI%7P$(k|qd^zkEVH6d5Gi)#bd?F0D0n30P@KZDOHEN_He}t%v>b6u>J>d&K!+ zbpBi*LQtp)?ZDvn`h2kvgJzMHOG7~^Q+|OeAnrljPsr|f8=P1ci?UsFs6mEk+ZwfM zNIP%1nC@ir^2H)dZ4b1nG&rhcf>acsr1F2H_a8lk9z+jpM7KE+RPhN>4IxQ)chIK6 z^ELz3@3ap43=kPY3FIv+YCb-dX{ceMw4qv5>sp|mK>2WDW8aKX6s()*i?`jpl%)<& z5~HZWJ^ujhiA7sT1s(U}X;2!83P~TBz&|bcgU@c*q*&aGroXkPK~j#5-?|*ss|M%eN{cunN+SmKvY3V{+N_nRgz8$ zEsW7aZ$oVtBt&{lksE&ViVY6H*d8l`IYa0DbT-Z$gNgN254Vr9rgR z1t^`pLw-L`p4f`FbWG_l={?WW1GKB<8%=l%K5AYBK!OZ{Ki+UE*Vno`CUk$YD=uax zol^#_nxtHy{9je%njvBFJ#KP|Y#j{e>ov94EY}2V61s%9t#-Gfb)oU(0wuTCI#bJ= zO(X=7Zf|~1xPjNy3OwWTt<8UYQ+`4L>~MYuuj}ZPc$Vcz(^=2z^j zt(#tF%bCP6RZ7~F6sEo+k>RbqTlsEkKqQa>B;XsWafHKQw41CNHOT4-6?Ioa?uBiN zOD_;$G*xCNYr~34 z9jk4%I^u2B4T2ok_$<7Xt+!;U4m8aqam2?E4e}07M@seJ5G)$b+X}TBXGp^No8^!# zr298rDCO6{BFHt;*KR9pR4KBlQx3>=8$lZaBaeCK8xOQ8acG2N%+ubSTh}G|?yq$` z;gy~Sk(930s>6nY=- zmP4cCh0Od$_)^HeC3338ww%#sTU9=*Wq*_A)mzgbqy>ShrjU{Xn^&z9s7c(pvNR7W zf6910FZMq|n-q?T+nJu@_+OSiTIr8gJT+$8t6qG#R4Tc;mso$Tw%prSn8M&KE&_jq zrWBPx1tbx+G{@v>9$^Bih$Dv%EP8(HRIQd6#M|sUzeKyEULZ52wa4svY}Si)Hm6%Q z$JA7ZRAm1Eh@jq`I*A4($=-3F#Jnd=;v{$*k8#j@g{1g@iOk*6#^M?~9;fK9c25xW zId0UXU$SMc@aun6>vC>a*6pu4_N0v=)D;kPDF#A#1DtZC@QF1C{I?JFqSSSX{|k1MKFAbB9X@f$8yFKk5xbH4cAkSZNMgC2_z4eJ1>>31<&Af@LUMmcL39r?>_XqsM#&LtA9{> ze{r){QoPtHuA_M9QA$tdN_4MclK_*y2MN<_bb5*~$Ot`%{W%{c(bZ^mFtquNAd2W! zuQ6JfcJzPER$F8^TeqQwD`=M2veOWeup%(%q}swBdf&}Qz~;C)gMhwjnyva&GeE$7 z;(XGSnMzYX;p+YscjvIhIE~puWbluuw%6P#UNlxf3uo$-Hf_ML@;P~qk$Ev-jVTvA5Rf;;_3 zZg3}oOE)EKv;wVi6|~6^N7uLMhz=De{XYm7$qDR{Av4=zf8gH{!`La2*5%E*n);gY zrPPfHkeri~1Ox(iZs117efh$)qV$gc0Qj!|0PSLAm}owqxlHNFLe!+fN`RB3C;9=l z^Yed<7bzJkRKnWyrLpXE9luRq_r;7WayEhW>4mAd^>URBTk#VgB5)*jP#k4AwW*{& z()_ff7XUg)*lJH>J+KZ2ioQbAr>+Won{F#vQYh+61fInYXaxNVV;reXc&EG%s9gpP z+FBhGy4Jj_?L$FfI%?K5#LugbpL}$i`9gon8a^s}3+faBw1TpUPW+uJDLb9}Vjop> zMiXWhw1n=JM&7Om%6;)yl|Ry&Tby*P8RUXvVgCR&#CHk-m37FK!kz6%Qf0S9r@Vas z0Bi`i1l$4wvh@$8*&j4!RpuJ2MG7tzNo~rC5Wabm;Uw|C1YN{pnytS&K;_i@C z6$uMT3H2ly8=mGi#RfPJ%vB2Qgkyi+8aif`6Y$HVSX8BLC~QwZm0*v3qZC8G+hR;J80YIE|W7`GxzCm}5L7HyoeTOFcpjPF+IMjYTS?tW!!G4iSG+5+{)X zXPg++w{jmKk%WSx?&e>tCoy^U#VQiny3(3(v&ji@XUkXUsQKZZYe>65BX~7Qm76g9 zO+hWbg*I3uED*m|s3X#%LE~b3;mkXUq$dL@i>+^jDv^NU~S0IDD5J$>q1}lUl z+A5~vu(@>Ul19cSoxRNB#oB)x%3XTRwtF44T{8{dnvR*5+SgTAP?noYl&uYoYES^F zYeGOgsXz%N3|p0h?Jf`3-x)bu!*xT{y-B~){qbz0ZTd{BO;8!Ebt-N_Nihk6km8pi zB~V7`n~&RhX!!aeE-a%)cM#HJ6fsl(CCzJbn1)gWRL0uO(eIY?h0wjV=$v^Ti(gIK=r3}SG?5)%^`rArY z6$N{7{{T0}d34aqL32SXLp3j8plKIRn5&u^US$ub=655s{{Y(a78=5a=~S}~kX0!@DWn|)rU=}ta18wa0HzjXeOflK z9H^YV(le+$_)LG00a}LK;_g$%RhF=ILR@oIoHza9;Isp`lC+XP*nKf#8RXz0FNv8Y z4Bl9$X`_84np zB?F11W1kFK2IQ99k?CM6QV+cHqw_x4F&!a4yg$=0T{!va4twXvYvLuCmh6zS4teqT8G;>o39sH!_dO$Dn# zg(!b$19{p699HZqA#UZ79$K|}NK7SMLFar;$_C*^%{84$4U3gBmK)LOsX;%k^Ee(+ zP%AG{SQg)rQC`s0WNf8x^Z>}j$WXVkUzw?CX)?u7u_C?tuOUgLYLeLc{c6}9k-(Xm z8xCg>x!EeVW|M0kSVD5`B^}@@vF2%8ZlQnLdo#^6rGW!VPOSs96&UVuVa}nPsx1g= z?1hml>_+#PXqvTCfvx3TRNDchj_X-gl#cRMw|K>g95ZVCpzL$*ReD~P^jA1ktNS6< zD-COaYEmrOhL)v3ZM-zKK%M6X*~$~A4dfBH|^SfRPxXGg|9Euk4HP@)+ujM?_LCa54WM>{cO*gD4B+==5NQEQyo%q^C~60G;ISc-s=n0x2eXqc*i^YT(VDj;+du ziFScIC@B8`>4hn2O3Z2!tssAxogl~)eGvc&QswIoVYa;bs4dp^(Bq9MZ=#$6r1^0L zA;LakIosh_vB`?gz=H4AMkr!)&v>GedF?F1z3bdr6i1lI&5y;V;7(G~6{-9uO# z4TT36M(9bBWhs=%DT#j|fHx61(%A)3NOOBC-BxM%T5|K&TZfvb5|vYmHS0vLK~azd z0qP(UV}MTBV0ERObV{!mtCim{+o&xsE}6F8Q`JvYQ7uV%poIq+NF@aeBS8)jKmdp* zg%U%BBc_m>h54+6r4SU8zWug4eMSurDlnv%$l#QXj~sD4^N4?<*_R>;)F)`zjrYVv z)dkbxS4&gz^uH3v!mPhcDa*cVT1ip@K$Vgt1b|690B02NDM5mw$+ecsyB!mj>H|#Q z!zb_+Os3$(pGtr{k|c>I5xC=oZsw068&K*}LvDaot^iotXRz(>g98af+W2UxN>rt( zLO>**cISVd-uQnNW4fVrhoJo->mavV`nl7ZJjF|DtX*Zcnxd+qpu?(4Q|2X1IE4j5 zK!Qk)*i+(b>(Hh)S1=GbJfpHtN;+?lZ`C)fm1Ta~x|$@@Jxp${)VH8G779bMpmism zW=CurMF0@F<=m@R#WaSL)5TkDBuDGFX~CPMB9(U0ZOea;-7ewVMLUkQUdzSBG3qZa zpGuqr?i5lWk=tp-3ME^|vMD@JZG|?L8wm+W1JX7CaRcqxA znpM^lOxAyFs1CZK+p4F~km9y;ONoL8(X<^xBnjLMOUi|y08?5zhSyC`P*AybNlHHn zK#2tIB2pu|qBuLo4B1c$Bz9WWQ#3Am8&dq$GLK4%gJ5bq{{WCGNd^qS6SQD?Qs}R! z>X=ha)D<7ZR+iJ{C=#PFA|)aRBms+1f>do)QZ9e?@54xSG{eu-R8gc6rYB*sJEZPL z`{E%ODu0U&GbSM@8%QzQCl}RS0<^5DZ&PI?fR`pvxCi8W5%R?-LMfVxWmC9?x{;~9 zlE32HkDelcWeH7LNQzd~QBccZwv?YSVKcDUPkc+HCAJef3TN)Gp%%IdnvcRIN~NN8 zz&U^Jl#xC0TiQ7)_LZf6UcAw|g63AbK>i_Te`%ekN4fXs6MIPK^h5zCgiS4$^-aC;zWn+l^~DE{>WeR-`mMg@xvBIpt37y9b%cX%cygbbKi38vE0s=ZzzQ1M zP1>0&QL$I(Z7SBUyWSDB?sV)Uxj3Na_f>zigTeVFj9eKf`?XtcLQb%k0U-N*eptI5 zRqf59ky3}*Lx3tlAz&Yn{{U_=D661FtObw~|3A98Sl7ZiEjp50^ECQNGIl3^Ki>jv7&e8t)Y~f4@s$iM z*92=V>eNo#cEHf;qp2=^R+l{}w^x5Of%%k#sL#v3{{TD*8MHv4+h)@3ai~kz_Jc^3 zDU`3CA|rDhy|6WE!@)G2Sr0Wv_7w&d;v5yMVZG!ukYPU^~Q?oC_YTjV}MXqSFx-AA{T{4A5C2G*9^f=n!gY_HY=&J_8g5hJxS)#M! z^Dj^G?bf1qsk!C)N|y|O?s2sec<+HA9(hI{_KFT8;zF|9uPsneBH2Ms%{3!`mX?(X zX{3*m5eXlr2WMqB8?uUO^s|3Zr$gH*xKd+sK^xE0XuuZIAn=*n?}tvJ?1e=4k?(;c z=7=83&6R3w*V?q&a|PSUrdwpGYxIT2`ZXWQ2%XQg4amY@y@J{@j8pxWaE;8}P5Y98 zR*sljn5Jd89)FT0U>KC7?LRe1KEs?y^yS%*l2yJ?!AuLpUuoY&tQ~(@uv7J~HQJfJ zU2?rIky!OpQngx^;WO!ge5Y2W$&;bS1c8pMMn=G6g~g;<71tRZ@&)_Cs7ob~GG^E~ z7t{V%iQKhx;=q?^Y`G@SOxvmTs*>KB9+)Kayb?q~9{9vgszMzj$s@TXbQvC!5JMOM z_bS$M$^AaQ+kQUfk}H3%AS5KaNVO@{q-+2>!2k#nL;=j>c9T=8h4jaP@8K&^r_)T& zX}iBw%~$2D7;#K$QpkTB^#04jzn@N3}ZuyDO!f@q-t$|vsY%bCZ%3=Gk#fZMM*$T3@A zL~LSq+n)R4y~%5HSn(v2t4N)|1Ak-w{{ZQTp(Lw6OzVFZ<@CxVfSDik_Q1=ACdK)e zG3xWGXU2z7&p-U+cRdituWrc&qR zS{9|kOo9}cpVa&R0InQqBweP|ulb39fDC#;8-CaV6$6A#JGvY#tz(m^0FY*VzL>9R zMB<6mp_YHkU>Hy#ByTbf{{XMC7#9$Ywxh`PRMh!y^2J>-S}Cse8b-L$FF2rM>j!?v z9F0k>WKJBA0_egIl;Aj48^fw@{{T_~;D-`HQRYyR2<c1GL8E5Mm6+1bg5J2Y{}U6mygRtL? zx5AB-O`wK%C9P<6Ev|?0lMgT`{VPmxvABO${nUdUh6J@< z5;dS(SbE(0g!;-_^3>X*WQg}5;jER>gr`Q=n_TNR^zW-(KB!$zcFXk5+YF(b^|{qQ zOz1KaN`WP^cG+P+DT&6I=ikpM4~J!u!miimcd7iuySkf=S~U_3%))|W^qBs-TKj(h zr0h1l#rB5ymgy6nExY)2yxNXpxL=uQR?$<`y1=y*IG34y$6Fww=G|?#P=I+z)wF^_ z7itAv0D1Ktm065}IbWQ~=`KfRyYJC;TeLGrm!fo`m?lWz-Q&WF7ru7$^DIRNuQbLC_w8=Y@?~N@qlbb7bx{?N$ zlepna0FXEOe_R)M3>`ZHB4hXG3oc5dYc4XfsPh#EjiL{@{rJTu5PoQ2 z!=6b`sZg`1lk+{t8{mlr1vzN8m*uJgf!rNOpZIX6HLg4-G>{ZbHRZaM`OAMHU!5vc z&fE{2;SPnW%!hUs)x|ETy-z5Tlcg?hPjj~8Vf$c2Kz3KX))&gGtZZp+>f%%UAUtPo z{NPM1Jb+UK@5K_esJK_W<4SVm;?NYNs$7u}e{a(QG_hyd3eKWS2G&ziUXm5(rD9@B zW7tRizf41k70oP7M}kADuY?5<8t}>tGnqs zuGJ|#dR;NUet(uL@bNc>g>Ifla!_ox^NuV#RI;s8sZOZ(S8`+Y!vg?3eGnI(;8JZ zTQBOcTW*y!zYJ5QwjNVt5`?Q#pvmpA+ip3>FH5HXcC!1NPZfSL+aR;Hytgy-QBe-X|J@Adle^Ef@BSd$1h zvjr71>ZfY4E;{nIDIrQb4rAxP%LFRY-0nwp8}}EI(yHoRC`x}&RP1xd1N80AEv+P) z7KP#2J=gBX+125yx5JNv?3a*lHsZzRwus*I5=hdtSJvryO_T21eoIhzEk-$d$qS|< zwmx6oZjGcdb_)_+cJS(rA#JoGJmt6~FIVK#$T7U}8*_}wv`V+xSX0Y!NI=jEQ7Y~t zU=Py-ILf`M)j)rWdR+>2U?nM#kY-Q(?SaWEgHdhNxm1(oAfy>GNAvmqn26H5hH}f6 zyOXy1o1?E)vXqx7t<-Kl;sHre1f@Cwjo_#d2-|Tm0#pXnpW8-_JyhFP($fNzKT?t( zR-RNFl7JPl85vl@A z37a-l>6M0l_cSa}Tyr(ntg^{NibYzfg+ho(D_Eut0Ix|PCIHl6aTR%108J`0er%|5 zN*4vQ-WzEmf2?ze0V+Cx$`x0<(E15`GSsOA?vQkW`$i#YDuHTAd&xOdI(bfJ?5S+L z7N^TMi+X=*v~j?9P#w6%7{TN#674u7d$5aVCs}Fj;?l-nwzo!r0w~jNX)K^jfR@10 zH{XtT#d%nzJnY_Yzg0ahShi6eR5mIW_ut8*Z4vJp02qQgQ_Vd|_@bG!I2Q(ujUY(@ zv4YsBJOa1-p+#F#q>``7q5S>lj88Ao5q0%awQGO6ER}>*ZXrc4sA~HA;r-q0-zt6JMqNgwveni1TE7k*eetoz2!SySOA?h*0vU@G70r3nC=YXw&6hR zVOQ?H9=a)hsHUy2={=Rz(mCc+7QDv1r9l9tC|XiBByqvTabAjU=NzHyJUjHlp`@mU zp6h>XDOps~+!UnF+rzqnhQ+DB_ujOUZHpHHptU$a$_*61mdFV|A9;u}CDi8>`fak&saKw-jmA4I1{ z`!$tY71oN!>TM1ozldQ8T~jD^A;g6bLZE*U8oM43VsO^EuHz_6OGvOsy-jVhS}G9Y zO)yynNm7#H;BmL+k=qtHLqSbRZ>FQCHu@@Lun>|^1i>ehypm_x9XP!EU2S5^T$1q`TUMdvxg~D)p(f z`hfSJ(l^@#*AQt(w{t;U%cwRqTI#JAE2Ju&yMPFBD^drTTUcyLNRU^gL6Ano5rZyi zq_D?P1BERz!jq{A)F6)XKiJQ{9c6z2Z7;oH@V`ol8hu=Yyn*gxd{*o#Kbb>NwFLkK zX;#FY{$tw&4JroKL#N6MJFm(mvQ@Anx5!B3Pq@H1JOd@~cXnD3PJ341GN_{{TK%wFspR6~&sm z!%;(05_H3Wq{!w$+hfk${V_m-r4WyOerV8;LV+T5nBeyR09+8_)e@4>KTy@;;pRXd zO(|hPQ>cD0nCxUkAFq5y@~wZ@K{F2$@=OH|>N^qK89VnFG$Vz%czL0~449qx;F0^E z*AW*5OvB02oh}mtayI_}pS~iZEo_%SY67(+k5rBh@K4GxC-W)-g)FH`3ra(plwgn* z+x~xCPxPYTr1XnrIhFG3N|Qv=l1~Tm9up&;c%E@Y8^VR8gzkohy0w1|yFq8FeFVZ* z#VVKbAQ3+?A6#AcDw^L!Jw<}*ilnGmD$xVh(W6}R$q_guWKx&m?o6dgU7DpT+z{m= z!THRIz=GbTOoWd!E!N+rZkd|3d{5yh({{Vk#p8o*w0gL#dBKocA^2K|SukAhDM`YJG0KoqM?H^oCx7A(O zs*%fO+MI{}{{XyIAtWeKhgfvHp(G>^AW4`2Y8%G;3_=TftGmSyukyJcM843=jzsF6 z_b#(#rCU$c&8ohk4XxnAYEx~ZNF^lbDmq9ctWN-8Zj3y8M5}+3bZ$FnuUgxF(k60d zM5xc1;pN+{Ho7%c+-r*t`E<;Pm8(h#AOkxBW40FUJWXjQ03&3tc@3=eSLS?gW;BN! zXt)B@R1}vKq^J-|RFXLn2iVRh;h0tV?)f7c@ws-=P~z$V&?JQ`ZI1EZd|%<(ht6`# z{yHk?8(mF(bB%vdu-lK+R63=lEwT=1MTP3IIo=DZYpld;b6yEX)AV^6PKQezO-s>HfgXO)nMtk;NHMLa= zidK|QrO+4Z+9U%L`s1O(z(QujhtiEd`f3UU_x}LCArzEBTWUg9XLShN_Sk>EE{c_( zRV{v{+nzvdgsGwc><`nJoKj`sJhUj&Gvp`IBUYkda18hT@E~DX8An?y=-1`4&018Y z1;7jBh>?E>w|{&}%CKt*qfcp2Y^((xfcD${@h=JyNZMMLyuAe=?Fu9vz4z^k!hqGI zDX!1AC?kD=iT#JSBYXj9D8VSkZ;k8HwL*@=dG`JJ!0c9BQAn=^NO83(Ky0871L!%$ z9!fAuE|%z^z|!;rqp>jq=Nx@Mo+u2eIX0M5-r0XkV5#IG2#9e)0>7X0zz_mzs{)qi(7z8k$28NWvG8}wst@e_l`X5%7MiP;hiX#>HPbOr0FaTnCj+&5c+M@y z)A@fiK32CK9OQqPLwyOe@)utc7jerT3;bVS>6GSc>aR}nOM2trvesR!zrUw>BC4_4 zMuDC8q$3D+xLD|e6oJ3yr z%eO7K4XCcFmGvKGCYdwJhd6sRVE$|+yG;YXD~nI95%i)yMN=sHpKE6}HPg)HX1e7( z&iPQM%Q?1$XlG0&wy10p6y{ER9y8)OYFB%Yy3Ji^;+z^-jkb49h} zHLBa2t<*H=Y^tpehz=?f8d8*yIhiIm_c-jr_KsRfJT6S}x#oj_?{=y+Rjz;3HW;tD zHv0*yP)bms*>y?Mld%A8JaN9m8-o}>D59`!H|-njm|80<>f5NLEW8!ukP?%qAPMyY z!B?sYpJVNe?__b1eO8#FbMO~SQ;DRaRrZ?iO-K;ZT1uX0%uyq9ltGfBdvQJSk*%^C zK`HHfn%&JHC6tEz@Lfq#-X4EvoVVSOrNXqB+6e=F_XBOl_|oq!zoJg*UCve2hOP}z z7i|~yA-9n$T96e9fDHSpH}5fwW#F8S7V-#Y4@GFQIKru^D8BllDorpbOZ8|%+>YQZ ziQLB11oMXP3y&*3vt>4N+jMQPwcB0LM3)jZr2eC5!ESGKjjpZ`<>r4B;cO`>CwSw3 zX#W6AS#b(t)Bc>^=_&IIkyx2emR(AcK}3=S`vVgrVlbJc8xtWJzKfjoV)5}_F1nL- zqo*}A%gUKWK6No0B@}fE=^cOm@yGuFrGXsH-L|`ad5_l&;gV9T{x7VTH}g=4E?rk0JPTLwKh@|-kANz zx9NqFQyNDFKeB&St-9KGf?#SOnAq@lAMh9{u;Gy1|afrmurc_)JOpV zle)u@^WD~>!;`a3E7g>*sh6qW52Z8K!cqssZuz|J|an%@euhCc>$+R^3 z>d{=)Gm6Cy_7P_=*6+C0Z`D$;GaWB&k}56^ws)S3Ae z;)JEfnh7bMOqFzLa=YK#iv9VTg!C)y{_6f~rKzV|Pf@j!-c2+5j>M4DvXv)LDJg;? z2Qv&>r&id>2hm@b9UadD($|tRCs2OUO#OSh<{X9KH>w#v+gnuQ)|(q;qxE5;}=f^o<434KXk0{ebs7*o_o!y zecYQ?rMj}MMMUY;NtvDTxv$$)(vn%6xO~DEi@@iO8;#AoMK6QSr-$EEC*m?qV`xlr zRN~MOk@G4TaFNdFmhG+T55;El;1kD%p6-A3maD;!Qr7J&s!Qvn$~6@&C;$j3b)=~d zCymgeF>RL_2wWOR<_Zdr0{%AX&zV=?!>Pkdes1{=u~3pZfZ5-EIUU9e%>-6e2*+0h zvbVv%i+VT9RsImVn9)mVR4=FZ2?0<+kj!vK)3op35I@kW*w*z4TfP}QL{hh<-wl7g zL1;lRaz()->OTkN8)3fLI0Xpu>+=P1bL{HzmgY$r@|&QyH|dBDD&IwOr&YzY#-LS3 zTn`P5!cs^(5j$WUT*p;?{1qLfb4rZghR+bLG#vi`$PS@s1_H)Tul;#voEw_){*s4u zd|1DFn&079#KnC$Rky>hQB;sN2PS`3Y;e;}6O?O&%o0c7akd4q z$Te?ap%{Qt04&|^AqLI$^emw0Pc@)tF#k+9qRglQ(Yd;0t}5g zPPhL6`Fy^=zAxGCh=R3iqJ3j^OCR|&oVHNXMpLbm>D+&XxWJkOs~l4K-ivjAoKq{y z=)Q6Ex3K=nR-IdIx0S#8Vw?koTBeLDmr?u^^&hE~%-7WPdp%KAu#YWI(`5>^2NF0+ zfow?qMP9e9t51y3cfaz0tHn~Yi8}36}O!wsd zFkk_}OD+U(fUW39T%1w!x(S}tppX*VSw^()_42nnleX9}2XqC;s6k$O9pY8`SCZd{ zZlGw;LUiQH=_hag)z0_>N2-?IQacBRPZM8xCH44h>Hta-Ppc(Y09Ces+q2Jpa7_Uy zipuoQ+0EczICWRWrdXuw*G}&_YbIs)KK{Q{W}92IELNhGVNFn_PbDF1b>i445`46{ zPQwE$yts>iv(S2;zYbQ2_B#Zx+ghB#VYn64r!Y}IrIBu6_;@FM~m>)~GNPN?(3nPW(|J+ajT zN+b6(J+Q$GyQ=d*DsTM9yAVDS#+2|BrMo15Q~M9w1R*DtMqa^1QJ*evfQqL`90aDF z^@vIH zm}v@VOzk?spG?3V#7}D)a8>!w?1nv5r4E{U%Id0B{wMgs4ZsGAQRXVMf z$B@Dl^D1n|slP#~*9Dk`h#+iqlu{KTX{ znJJj$1B}g*Lj9&9J#a_Ru8f)uJ9PeQbxbC|FSZ@-0nGybG@fN1r{uipo$I=BMNMD# zt-9FV!RG}EpP*X{aJB*~nbl5R)FiT{CEy5Ff}d6!u&#L&0lXD!X4HiKbp?U>eH)LL z8=sy8w1o+Or8_ppR}hr!NZ^Sc@;-+YtJzYjflZy(t%lobpWA#yOXO3kr|`;>xsjt# zGw<`jIE8H|x{3P*DoHD)LO!Ge^MQdP(F24#mf8d)p{l16WrAaLV?s2K*p9#9u{}7v(;FXx^YqF zmk?T8WF^G72q%4~-{ppkiwQ_qTNL*NB$WWP0+j${N56TDU*=IPSX&hiqxe(-5@Kil za4OF#8gkoeaiypLwaERjb`^|aVV7B?F0}c72||w2p||{uQ8t87B@IJWLq=Cb@`H^i zkfH59!`@>B%Ag3su4db1eJu?mwyScg)$wUMmulJe_Sz=^gJbOJoQMf4L?OuN}d{g&wF zRiaJm{{VieeGXlUO;e4aCA2Li2v6Z5FpWc2rAd{MFcJW<rLt48 zY_4(IcD%yVpDRjQYhRjF z($Ju;;7Wmz3ETD;3#{;{JEET2^?P+*TIy8mKxmILG%7@x_K4Wb9kF0hRtO@Js#@9$ zUDBg3H+@A@%Dntb)H;E6pEvTR0g>F!z=_*zOf#=45xC!{=&YvTAEzIPT-FSKLQm2@ zU#wujq_KrxHm7Ru)rwW-sR?luuCmJwC8aUt`Jkk$e=!RxDj{5OHWQ1;yxoV#Rer08?q%1+bI0s2s=q_raNj1wC(^r>1%s*GRR z$BbBPXDco3rZl1F?6+2GgGy3%Le$cZl0YN_1i_3EHiUu^L@7Cs zPJ&A9qhOc@9dr45f#>wagPKHdZKc*M!*!>+S6a?xewvAj$F);8a&5hT3NC8Zp-PaI z12O;x4{^6E#ZQPajXFR{H+5eQR+v18SdiBp(+bSvc%%pj&h_P&l0q9@)wLmU?4n_2 z48SLC`(u&j{{T@O?LYl1NN$d~znYeZK4#>GU2i(vkCN+U0M`X35~PSGOb*+T&K(rq zIvzJS7oW?*hCL-5{-`^D@)Vnz11)*MH+REp^UHpnYlRcZfgXdgoO&{GVRMDrsbpTE z<$JCEJ@f7a*Z~ zfRiE#21g>v1rts}{QKzB546pvCh zWwyI3+#M*csCOhZ+A6kAlxhdEhy-uQf<$))IK(2>a&yYE+FW+7lgy;72>>Na^XgKQ ztG?Wg$@y^@AN4DL#bFk!ZOPQaD_WS`2h#`jCy~YpP!zXKHQJ1ag+L`JT8hy6Nl63J zK$+xVT&-Vv7O_;6C;T$n5|EbA0#gzINKU{&0tXmdfC!n&?Qi+j7Q%-%C~aXgBne3y z{{Yt+@qZ-nPbES6lPq~wcMGLJ++U0U& zX;=eqZg%>NQn7-JDN~esNfHuH<8n9P;<}m<-RK+UI<3h)D)^5SoBAJ=e`30 zT9q|Sw%j&Mvit_q4P0AWg(%AqMRNZb7f^5bj?7N`pfTaD6#E?8a6`IhxV zX|>Xcsk&XO8>OaTf9`qGlp|^7LjXr8nAf?%trkyCr{I$0e9zQwxvYQkw|IQcokXNF z<>o7GGj`0rN=!+*+)FGxkan71h(5raWq!9y9s{g@=kkmAUmsPqx*b6t*bVe2KOtx5 zOQ+;d2pxaU%`WTJuD)6Fl?6R})K%GkqljkhSxr#Nh;o*q^KfjTr;v798KFYbVi&kp zIkWhT`-o#U@y<>~k3nF9Fmax%YjjXDtQULn?!eF0V=MKe?9uRN_J`zO2Uom-LrK)U z{{WSLTDs-#q-NWq@0S*?4^+C%Ev@S6^*ZevwJ2>)Gv%q4)U7RqB)HbB6FK4*%`1rn zkZj#mQ>%(5#yBG)tc_*9TunS(;0hEgKDn{*E42Nu9e=Oz+4f}h!>aAyYUyq*WIC%Y zj;)%tF;vaU;-t`1Ev14Mmr(6MSW-w*bV!JQk+Z{KWV*0q78)Gmd{bIY6VMYw<4L+u z!8=@d7VPnWNFNhJ)S6Vku}AGvr17ud4UV97w>sNtv)4`BMTe=?_4Q5DwDX8$E}H7H zOd&N)XrOmuyeW_{7e{X+( zhaU$yBQ?A%)>kWSeM+aMswrxs=X{}1prmw0l`fpKNcVU(fNVjHy86=iY$Rpwdt66m z*^FOYm$}4o?6ur2&ud}u;0??SY{;AY3>ELJ=@bgjdlz2v&R1b+Y$DG^rOWo@aNJ#mNAs> z_H4#2j^yjThL-JLc&Jm!OH74-p-u-7;v8?vH0nwGS=0;xUMoM~;SL6YXmEERf-eKE zaa@y*QwEACn@%A0+%CO7$X}=S{+#&5u0mO%@R3DsPQ^ccbw-htwJ|6k4NX)?20$iE zM|@Ltz_1rI-Di$|WoB-Tjvmy2A4Ze=gjL7G-;H~S@+#@NL6&LOJymsoIhO5wT0O~S z6qEp%oxH#a?~D9*`&;$?$i|WZ%Zc{@G4CbcqWs12J6N#}ib1aZ9xcaF5EUs|?&=p@LLCpRh z?D>&Na`)5&_?5ucnb`9Ub9%MR|sm09SuWhuu$9<+LWZGrAPC*17RFaz)u7pmOA0(zS841 zFe#xQQDCgKSz4&eY&gU8s!DfhCQwf41jI;++612G)_;;*XuJ(UM-DOKq^y<8-uqU#=vp%!wWht zLy2*;uA?AQS{4y%x?HITAkp2QNd1b)@AAPV?xTdh<9^RpkfL*4WyYB)T(fa;1;*2- z)U-STOo6;EL4pZM^#w^`gpO$wT-O|`&xbCwUHb3SyxBv4eaMa?j^^W*{H1cW^$O#b zt~WN=PztI|P;Q}`Ql%{j3rh=v3P>_%m#m6^Bs940IiY~xPA}B0?P~yOq0cSac1s;qss$`F?;$HOIIq%X_T+YF^DNtVLG ziP@*!E}gW0OF$e~C#mX5HGH2;CCuoglc5|}6c=~N9yY$oUZk3GZ`aEUibQCB_WOE? zh$Om|36aP#xsY(u%|Xa;KMG1Lgu1BLp)9g3@Qw zAt@k!UH6zWH`p9CE#;t(OH;~^{lyns;rpY|p+(|*b~|sr2CO2xIZZ8v z;(!WNy=u^qK-oi{`w1MKh~VOr8Ze#P7Kc=ShR}&VZ{{Qj=0N>Be6X@QqW3P7k{3^O zwAWecB)3yU;tCYzl`axakfiPvvQzNofyCZayr&)Tvi@lR55pYU;)@y5O z-Kl)acT!wh%*aug0!bu}_{90%ZKUI}+9MZ%m35?}r){FrT|)>e)Z$x8QVNeGfCQd@ zH|K0A(liW|L4>7wx2WAH>AeBDbqA>SOD!-2`PW;kG^v5}aY9Dju%}GWc|;lAaa`~A zy8WHqJ*skn9w2D51z;sV1(c}jF0K`Pz8wlo{{Zq>7QONhVWih!nXq>Q-a!3VD$Sp6 zPFGUgqv-d9yz6&TK`5)tuhQAsKF33Uid(S|eO6>QWA;M-aEWJ%&o> zO?{+)XxE5L!n~i+zMf?ZMOjda3q7u~{Z`Ud`Bbt?OrbISO8^e|)I0}N=5Llj2h;XS zZ;I(jrZk_Y@~>HEz%SYp*UDsEJXUz%%voxVp&-9t$}h0Ppl#_;qDyU{>^3fcxJP-x zj}P$3PbL2VAU{j`BK&0MhJo`xy6OEp`y0FfWg4X3vzJKfbN$r8a_7`LnI zSZr}I2ld2g(!x)b7;nRI`MS`V^$$65_+#{5hRA&+=(k8H(M{71k>yOX(_>`i{If|$ zM=$|tw32)7P9T-z@|yQy2^YzKC*G_n%(azaPS@QkoJdq8Dy2mr@3c%{3!HkZYX?w- z`@xEb6soGXo78qfT#dc)LCzgj>*Y2 zX_stNAXHQk6lYV%X~FJtn_8w_rqNQLO=F56cW{$GuWVPDAmvuZlqFwHa`kcvTMfI! z1+4rB~+@LTH$vgdjC}N4Shi$HbKfnW^9rrRd57Q4Ci{UNMi^>rhLejZvmhyn6 z&V@F%6bcWtM337C_<`90g{mcF<^p9G8gm15lA-Q4G4Jhy6Z_RVG7$ASdfiO&5dGSX zwK+ao9eN@JD_aV;N(nxihIaYvL~rxN^I3d-6!KlvtUJ@%0;zQr zDl^)xsWJZm$#aQ+=CJ<&!m%5N1$;VbZFOFnIznK2lTwI3&vW|VOs)F}ytCA;)6*(o zN(B`fpnnss&;J0G{+J&zrB5xx+_wJ!%NuG5DzvbWPU=gkC-oY=qZ7<$Wi}p)HFV06 zeugRABu6Ki{__KLyEw-Trp*FhWU@_%kO?TXsMr8!3KPQ5lYectc{ z`elQ$<_By*8hWBTmWj)E)JZgNi1%oj_AqcX-snc?ql8?m4K-bTC_2>ZVmDK2DoFiM zWC-^gVPpc1$ou{gVxqdO2t%$ap|r_KOWLFV0FgUlaI9HcrOIstsnxZ&`FZ{J{&*K7 za)qb!GcFY;E>qMn0VsFlv?*h@z!CDCB<>x5FoFe@#U z0n*^w0_qdG4}BmY$1{l&*iAc>FKd7_t8{%(&g`KLR$ax-geWLCaV2Vxlc^zNWA1*K z&|!()Gw77pymeh8AoX{rIe|>tuLyR_T44x9bxyV&QS6tt0Q{B#p5)d=BC|SPVK4tSOu%S8?Jc`JjA6zr0ZIe z@?20YkN}WUrC`=-JXM;eejT8&fqsVbyVAcX9G*}%CKE>;k~=nR>a9xxfaQA{eiVk- zsI1KIIvi{(N?i0)B<_e@9mK~Y9li4OX!)e3HVCt zs8)bLB)r%lER@ItUbv^-#7hm-Jcq4yiil_s*tUnn##PGow&?#-T!z({5oQep*u_`?`n$VM+k2 zg#by7M7F!DzeGjM=+X5*x}KYVB0RT4l|4(&FQqOOXkKDc02=iK!%0MqBql)y1cD5l zO`fGtfBhhQKa`r|)0<7E7|E2d?rt_%{&kW^TybxCxoI);=0L0MkF zY#v)$Zq572L?(3>nxZ=a^$O7eZiRVp0U{@GJAD5Dd^B>B!(0CE3Ng9l>@0wDa478cKo}U{&-^_e5JZDMipJ! zddhp#)C*zqC6pk(L@cjSCU)Er5!hj-x*!6&Whb(`Lsym%-%st~qTS846s4Ca$ds$o zFCYUAl6Klskasu?bXU56=$@&iuAaH-Upl^s(>%FbjU~{q2_yrkY<2@-$IqM_ZnC4R zqM7PvQUY6020t+y`*H`gVvv#o(Ug{*cB!_CkC!P9 zobh#icYirGG&IU)jYtVJp(#L{UJFJORzk@u03$08x^ReX4b29>WS)lw{<>4 zZMwtD4lXqqCsciK=E&2+2gde*2;p>x>Kvxbt{Q@-(@$o9eMgX_=~_wp7$m^p#@pi1 zUKDjXL#Nlr4b?O&sat?6;yx|ptwBi#oj{oz@6T~KF~S!=a$43^$#%>2MU}j-NNJTw z%}HCXEyV{EJ|RMlQM&} z8HV2BZ!}ibWVKKxxnamskyKj=ss+zng(w-BnZ{^k50%ZXI{osUJ08}wmssd8k8-s% zwwPncVW8SlsR=?ff$y+^-f_1JD&3co%2c-4L&s2m($lpbN*pAB6XtGE2_Q%WiIFD& z@FQ%FRS1O;~O$lMq{;(gBtJB=+($X-XI z0+qH^F$E{zZ)4k>ZW&nID5i`pD^8M))4YFw&(LDd6&!`S7JSl(jY2>j_>bj^R5{8% znF?D44H+s1Kg%b)kCDZ7OtOlnq-|x8ir3pJNRpKW0qGn1fuGRvi&a;I+K4}IEC(yy zc_Hsu@=yxI7>MpRKTJ+hfD=Tzg&l3LP=UN|H#_{c_P}n+It6T{lI#WQAPEGCCj(@E z;az9kmt-8%bn7QkuYDEp^V93+P;-7-Lq{>$EWZy%)uk@UZB;c_2Wi>~R+T|#&O1O! zFb-+;aA}>j=h~|Pa!2X&D@0m3B>QExcJ|-jiK=w|lC! zWPG)es6P6+TxwWgI^!nma%~iJ%O!1pG?=1rDd(GQ4k=1btW$WD!XqPE00phHlWyY} z{lKwnd|n>|VswtT06^?4-C$>-{{T?JtN1(d&Gsv|;&-XtGwN1cVHuyK_Y0j)U+Sk< zFN@5K=G#@QpNqI!YAS(Zk@Pyt366bkZ_kE)hV6-3_1`$RvNZ=#qLHT#M}2{{Y1IVZPjRrc(P!Z-$1`M2n_i z$XULghx_BSiFtJhuvE0%C3Rj((u!w5MzW7B!cThfl!1N)K!@dTZ?k`)qT! zj}NoYqCOOJs_Wj(*9bsNpz(RXKmZIkU#rpm@b=8j!M(uPRml4#?KtlFmikN*H_sy@rkwr9Sj zT=Jz>VYOz?npWEeU1S9_Q+r`y`%904w8JTP&uPViN?WN~fKdTBL4~i>#P@zsNOygt zSp$)F1rv;$O9h@|cU=>j=Dj_7413o-@PFbc+euC}SgaFppwkdQVSQU?PJ*SY$(zZ6MrbgFY|y#N^W2&E@cF(IH?7~pa$x={TB z_8;3H_KSF%`&2p?d+{sKyt7qq@Uzoiq$4j?+tA|0!P}bY*?OAyc4P=eGlrlwPBjqA zkQ@nHjghC!X>^)@eL1>lbDS&}0#D_|?P+b1$-{`DP19^-Zi*9l_MAV|FMu&k9l1Z5 zzyVG65B?ip7(F-X57_ye^Y34Jr)$c&N2fhmy|Z0?y;T<2q^EwKhPf@Ll{(_yt8^ij z!j`otB_TxPnWcogS2Sz}&evp)3qZ}#0Btr(%-G)}sel}RUvGIQf$u#RlKQju{{ZG+ z7r$)Rhu)`TM=lv_q+L7eeI2(g+N!`sO>I5Re|Fq1m8k@P>y*_i2x>@Wus}N8aF_U$ zfw~_iBVZ8sANLlUq1aW1^*f1mSPg8_wmmEVEzKv=gVXAZ_pcJVk2ntfxme8U!7@w#u ziO%)`yEzRV!0*@&PYH2EH4dYIGEZUO_#Bgfyvz1;{k7S9F8Bb>K03T`^$gjLcIy6T zz0g|&=Alem(eSL(TIf=DbfmJT8%X4&twaq<2pjc(dbxz8#s$;V~EGC%$!%cgJXu2-~Y?B>p2&K+3lUCOSe;dG*1Z5K~+ zt$D!fl`7T#B9u8Q{KY^)Ct(=tmX?}r5#1C2 z05h|BQ8(}^K}&Y^zS;b$3ts9S!P1@k{{UP=&QP57MX^&v+ob){7NV#DWnd3|^+5js zg8*~EO$|q;<4sP&-ES(>r5cs3WvDQHlvHDX+DE<;3I70cAkeo>;it};T)5P3Nns7C zKEM(?o_+S?-l+coxm`4JlvF!SOIRF5Z^P9skdS^DZa<0?dF`=04%qa5*BpiC_cR(= zdG9@iv|NCsXi-3tQe+bxjgRSz292odaHJ~@Jx@hZNN!44Z6vUk+>%05q$PXINgD}& zgWm+_3kH%4T-N13$~PxPB3rFNm;gs(w>`n&d*R#dbDZ4aGOna*sHph^^2v@to_~bZZ2{H>m|7DzcWr_^f|d4jnX+Pd_ZZrwz%rBqZX@Jj2ImCdEV|ri z4EyVVlKu7?(UN{cy5RYv!47Gq$rpQng@ZR<^F{vGYHa1}J-(n)v>a_{1-9B&s0nN- zaD@deKx|JS{X<&dOK205$*ShdjqT z#Q;+2PNhmzB*Ym9bB#`POkh0^A4H%iA#+zxGp0v({{WwSjbCokqos8es!BJ1<`wxB z-}0#Zu|vy~iYlB)g?~gQE0tY(Kv!ulGEx*S`EatAI-0K*z*8Eka=AS|zX+&ufwIune2@|1mIf%v$Mu+ha4{;=p7O1tJ zMV2&OFH-m&`&_(c_;-4bru`&;$?j%*)pJeKA=-l%i+}&XTw;Oc{N}Fw$pn)Krz2-5?hr{(c zkR@}#1e^h!6}$0pL^hU^;qv}h3(kFH@r%^5>hu2qirnp1il-skI|V~_ih15s{oNXZ zU_^y%b~x?B;JOysdyBpJ`F{%oyiQa90G7}`XZ2KPxh5tS3&jK-{G|&{RMm z0tt!0lWO@i5^IN1t(5tigCV(hqi*wFhuxsG8rIWOR+d06skYRhTnGgvMLbBH342-z z=mnJnOZW@FCM^Q`#=c+FOSRn4u&{Th)|nWGTioyL+Q`_j8(&iPWC0na>U-` zkYX~Hf^aX3PnOj(+9WD_P~}`MOW|$_cN;7N+r~ksP8}P z^1}9i6m2#ZkM$zkLvMDv?CWi?%1WJm!vQIgA5$a<8SK^5NyDz-5Cn%yoE!3N&CL3x`Nzk)I^TpgU`0(6x~C* zsQ8BgDy+)a>nomG(&On1I*{UkS_l5!ym>*1qa_AR?IY!iE(4Wd60=22^YY4y z*?9o@wC<6qBj0V5pZ&r|Zg#!Z z<@Chf6%czZSC^VnMAEcput5Dm#qKI7oXa$eopenQ49R6bzaH4V!B#1J-dd+=Iz9=N zBoVP;A|r#xwkvX*y%yiun|V%yYhncLEE6h9sZclUL^UEr#X4rhbob3 zZHJvHD{-U=)RgH-(smndumHyMicFJMcjtELB>W9Z*WhH1vxr zMXfbWh=ABBct+B9(y{b|@+TC1kgo+rOOY%CT~!UOkR60RwxtSLPXSR9M8pvyV;8#6 zme&Dp#zeHDLo^@)AxSD%*WZcni@U*4aJC&e%YZ3D&Y4js(zQp|bMrob*p^k*Ex+>S z(o(M?nJJQXUZKow&+{0or51m%cIM3e-XNaNDmNa}$MnS#5dz`D(fo~Pt_7zl9YpW0 zo~_g<9^5N&@-jWf0DwZh&NxI{ZI_I`<7&0m)fSrJ6zWRUNB;KQl&pX8N>8vj0>F$q z(^Xur7a}Tt64tg*G`UlMOw*z1?v=KavH1c>_P~~r?pN%lwo6+sQX$&<)mA!nBs{nX z1K1>N4`VWY%;Lx)Ru4)?yJ;K3pa+J|h+}BPIcA88q z9?Aql$H`JYScR={Re%>h&0ZeuS4Nzyu&SQXUX+DtX|)O}rEfBSfhB@=^(WIO@`#*J z5;uckQ2_L%$g@6Mt+l@Omi=s9JwTMLw^Qj@_XmY1<_QN6WA_V5b117PMf&Yu)2od> zSI$+de=a(((j9P>F4##Bq@GJMeMvI|aS&2QR)TP&UIC)LBv@>2r6M`jl}J9v<{-@D zI(-F?jiN~@_=FgLnF%w$z9O{^MZ^u8Kqf>LdS~VI#S&>yt4Z!zshULrQCQ1kQ~;4D z^*z5_4oWcWq?cZ%*saX1$F5Ghq)L?8*bU5|ZVn)6Jr(>{iN4k@zI5xWJ{)TDUrw_< zlH;1Jx0`)q*4kT}PSr7QU0X<~Q;9)7S_ur9a0HUx{9#gmwaj6zagT~*I|PGpIkdYb z(qC-WW+?LoTMkz?79BK;)Pjv1u_6AC2$Z)7OP zK9lW z-*9q;y2^Tr)UPbmJ2a|rv{WT2TVq$JT4b5f2d+ZjD=V+arZO{qJu*2^E2~yDT^tWnY3zq9uwCZ*Mcqwt(WT6=eR#SVaT(ip<4PS4P@TomE?QE;7MFl$EMU2uTW%N#Ldo z5seLT1Dt*JS#R?2lDN}VEq2ry2dL<1AH#||62{Sw~N0u|d%Xk4-V zzNZehl>d;j z7LByg-4y5l06bZ-x|O!!aY?42O9@f|)QJ+JHv@%l5$`lf;SnREccaX;ru3I--=}pO9AzH$cnKD2h zhzQg|lZm+9DL@SHo6s{;PLkv9FkB>(8JG#|4zBUvZSi2*qg^;j`j?aGx{Z8fe$XN4q>kvwHrafeg{!2+8e+8x5qeKh&{{Up>&Ef9hYRdNfu}6E$ z4*UZSvek0(^MTh=w@Z?t=O0vbXQ;W|E{zmcvr318MzvGEw=@`?!jcaH zdy+R8ZuW#EZbB-7gW`P}io=c&-$gINtqSzCwIrR- zV18Y}#JW)dd}6+ior{ePOLW1S_80L_v>Zwl7cmAPlK>vX&ujz8AcBpze&i;8>Sg)b zR_UphyQ}S2B9XQiQiL;1`oc&-1!*BlN~9EmI}$LzWw^Qh})pTW$vA1pqk)QUQ*V!l2T_oG%>On6|azKRVm0E0C8?bGoIplgRkz4KRk$c$^J%={<*C=2 zAR>03_2(2xRt2jMh8)3h%oKFDtHw>cW%u80(Nkx?20kj3rlG__{D&NDg#?A9rDPN> zB<~<8?**u~?KNw=rQa>~Qy{3kk1T1`yz{?(`;qm+9m3MVk==PtlBt`evA3ye(4sVu zHGv@WAE&l9G*DT8Nw*(*$}4HvT3ap+iAe}aD<$N;*U|_(>p%3Uw#d{bpwuw34h9^7^l8r$}|SP;{ApBUmJj_W*Y9f!eQf8Sb~` zrlCTG zS;CDCBT8-3Lg}fNpz%mkex)8(ufuhZfw9?R7~I1!EvsvyXKgk3->q)KKWW zI(;{h9M6=3*GSuRW}F;a(}G=NCBy>Ic9meccr@@g;-l?6KWI~oS%DuZnKKFPze{Qy&YPYh|_Ege0P=}myNDfmrf)2F|5FRT302y!%Xn+vv z+gD&6px+mQbAWg>w|LCI(b4!Gn^mG~{{R<%ClOB=Tjw$UN3aHfj}jqnQOehmK1 zj+EwK9hdHnb^KrMT|eow)kinn7^q7k>eG!li)dkJ(xff_05O`NB#?$zBN?H8i60ks zl(ZH!**U$ZBI_3H4xExWD*SK5zoqm(2M)hL`3vO$wT>+#ADlSQKF(W#`KfUmAAn1L zo?-E5d>_?y5~`ZvLz!Hmyxtc?-;qykWm?_2OzeY91E?RwR)mezFf(g>MV=z#=|1p9_h#+JQb^w;#%KhysJ;<4(UL1=SY=C;d^4di4WWSYk+&-Rb_2;nV!zTBYP#N`_5cO$|bnkgH37&T0x$&)oC8bGAm)B z$-Ui2UU?r8(Q^C;!Mq#BbZ?SPNr~*snm`~A_XiRzVBS5RILYYVHonb24_QaUrc}+| z95dUD=e(PgDOl=-sJ^P2T**?}byVD_^{!fZwJm8=AeP)^q^%(W_ARJeQHbluJ;^|mb2x?qSs`ps#vE@ zPN7UI3qbj5s8bBE+MJD0hz2p1d7>K0B4D6TeuC(HG8bD@;ifGEbpYUok}Hkb1Dw^> z{{SnVe z)Zc;tp?`k$+A<$W>^(n!wA`~*`HH*s)9%&Oyy~e-?u0f{fu)q03Dl$jB<&=WghFgF zwiULD?R_`6{9$ds+JBq%8`LWaa{Ho)!& zAw9m**fO?=OEnL^l6NVl*&Ffl-Zv5T-xN(FZg4n9($S?v($%WDdeS38l9}x!nT?}= zd@aS@DFL8W0rwbxOD(xaa%{YUpi=x4D38pM*cpw-?cW~0yM^YRRgO}sCDz-iUTylt z5{Hmdkmy^ho)J6}2m%2T2O|z8jv|Ld5$EFXl8hr6ZMu>U z2Ab$l%cU+7-bcPHSH0fFt+WC#( zAAk5TGzzeP*MY+4T}#b5eLnEoGZYP9Y}QM%Q%KH~E~L{#?hrQAwYXHH+>&`X zs3_@n_H&2B9D9-|i3mIzKNRAJKhWG6ag^N>rql>i3Ug3!dnqc|?Y0YOM9?~_mSO0Z zMf#0i7&&=1`nrSv0KzPwQPh zn?;s}vHD7Tg~d&!>Y|4fl(v@2+w%+nR8#2(VI;;izE3TJ@<<9cI|QB=r8*1JjGf`x zmy=>{sr%F5vvs^zwx2wKAB2Pue1`k!8RVb=NJK?HIH%4Jl)QvhwveR$5BF6K3W6u|`h@Qrdtw_x zMpMgu`s-1rO;sRKZayTS`bmK>RRey+nLBTREhJUaww&ZE1-~a|D@C1$9bsXh*dnf_ zr7(vMk-1Wm5D7ANR0-!495`0yxRQIK9cJf$Lh5O56y=qzw5^b$3RaKvp-GgjGq$9X zFjv_L1R5hLrMl?qIYM-#i5jLq=fBGo?p2HhYs;5_vZuInQqoQHA{#Kr*Y?!(O6TT4%%Q1r)2H{*yB!&F}eWAKsUc&2^^o*Nm%zd zxveJ(f0dT<^?llwqK2-CEViNp&ZI#}j&~cG17p0z&NRsIzz8T{)4E+KLyl|2pB&v3Pw6plJiJwD%mNXMNP(~EHIY9 z)TbPF5*5KBNE~cExx-=9>O9t$WPSXSR87<^3Vflotu3i;mf1;LflwMmL>V6~t=vG#U8feBnOHe$m(;@^!fEke}27?$+Tv^hu*lyfb5myo5nX;v;Jl2{{U54 z$(a{0<~kd;e|?HZ{t1_rz%5bJO8E)~@_sms?}jVkTSZA_u& zR)spnLupzhMx+u*l#?LtCl7FIf0{w+vu3?jf5Z1cGIxfam0LP3(ma&ar!U$YD5Iuf z!nG1qRJR;kjxA0&wW&%{i2#)t06+&Mo5&}i1KbAyVO_udS+#UcRZR=!nx@p+&_<@* zFk|24?}`8rsWD>Xs3fU-K__l~uqp$bqS>w`Nzk%)5=R4_@eyXQq&20@e@>P$WkG z0QbV25is;r{NYoWD$NxQ9lPV1q0Q8f-6>Fi6wr{UQWN}oTqslx$Z2u7j9WmkPh;~@ z#neLl)VF<^e`!q@+6ijvJsv}?O)C1F=48Eff~w-kW$S3FQA;|Op!S1GLn4Ps0b)pq zPz?;G8f2{i0&MbKVvc(re}b`Pb!VSM?GS8Yi5zx5?|)v)_4gv*>+OnW-%9${rWs3V zZ7K>Vg)d)KGW~(TcC~B(1mC6HuOAYFD z{{Zy32Q{oVNC=y`_yKrt#fRIU;X|k$1kToOkk@8<%lkI=s`AS;f7Z&H6J2v<-APIx zM(9aE*e2*7XnaNCY0|XEICI-#h&NqAuVpX%L^->W%hU<;1q0PH};g2Vo-`-k#@tZ}?!RCf&yvI)}JIIY+F8C73D-BY;GOkw6wsfNOfV(z&vsF&>O>}8eK2UhX z+b8=<5?gdr1@!|dw(zG_(UP(?B`vy@Ncw|?@1w#kq^TOt**1LW_eG zPb3)*A=aTyC=v=(2LupDKTH<;Kv;X_Oq*LMR)_+2+niqG&8f51ZY`~$DTx4YF}5b+ zRqPe&w^gySb*Z%c_K$z(i$pAPpnAaGtw0g%e*wi=Rkr=hLuYJ3Q(&b301|lz6}eW^ zeu_G*yoD>`sNW3Kgus7DA!D*uKZ!j2#K<7vP1T|SX+cK1qV-i9DWk7#z};g@8j`XE z`hfiDDcvgA$Izz&O{>5OrKYF`N<4+O8(D2^xywu55((ubZj}v)+v!>5P7?&7wWJT& zfBu*?Yem~xT&Qi|d{8A1=0IKYm9F(lsynT{nx>Q?P1H0NpVDRz%ti=3Pi1mmrFcWj znSrNY$+uT*^(#S|cL9Ete4JQJ+ND>AS@SzLmAqyqCG3MvDONfDL&}8`4!if zsz14<4XC9GQ_FyX<%I6IgMc8DgiYLNe|20#J^inq5Hj7xc1*R@_A^bf#&n^_v%E)ul^1tKs8e={K^#;>46W(}eRk<{7xF7Zp#hMw|XxMz&lR_Ibq za-PifNlV8-3keM^9#|_%RVH8pKZ!)>V+CZAed{@pjsW=teLg_Sja0i)QEqmn4?%6Z z>iU<0Au9@xG1Y6-T~Q#26C7*{%VGZjl7+Ik9#rh*EVoH+rJ<;|QLEv+f1&5OM#q@? z)2H*0+$gA_B!C2zrU23~L5vus432f>5Q~kD&r?})O+!qspU7sZERs^eolTD|ACW}5 z41fs*B$5D&ri_I^?lh%g`dV~1mfpA2EviP7P{?^ITOmns=?PlN9$;E^08EXJ!ZBcU zLJ2tqM)hO&G|;(ImY7pdeS#}xgun|!q&Wb>zyxXqL=0V8hUpNdDw4I` z>Fkt7;)CS1QeB0(z;{pu-z=#j6s7rK5EZnU)rn&LRA{Ufid!|hjTE+89JOt3*+dfc z6KJMv3TM)#X)Uv(N(c*5gNY!5NCHl*UP(}qUZrbQm9pM+v0QCAf7d43lrI$iUDcCL zhr{|3P|B9Q2`-c*B%qimI|2xkPmVWOs|64xt^^Z~7cxEux-`yOwb&f2%xm~vDXw`r z#^~4HX!4Ymg`pK;4Qg7v#RR8)G2EPI8aM-XfNTEapQ>rqOka4fi|;jXKAu*?^n&p_8im6L4WtDvBrItvJDpN?JQ*I{@L!GxDMv@>v2O8q*D4w|scA20H0;%)rKXnh*3(X> zP}GLXiW^W0e^8VFKqrYf7i-#i=#9D_Zq2Mzc)9DvO>%C3+GnZVY`Pm&6>F?|TvAl2 z2v7lz-n7@#G==3u}a99yk0z zwvjol^Bvu;bkEjRvEv3c!2N{=j9x-1K0ACt7D5%6e-gcpg(=l+Kj-g@{AlQ`=)wO0 zNc;G&ljF0mNh)RQwxASGtz^f_NZSP6b@f5`R^D1ZzslHn@$1t4PF<4(Yyy$E9k)ae zY#-xCMIEDP94SYSUa>agb=8#2)f#lEC`*bEw5draWT1MzAO&(az@1}n)d13CJR_*Q zf9G8+f0bmKR{%2FkyN-7w1Roqk@Ps9jgP)j{uRNvO=!N*?BPt&VXThQLH_{uQ&u zjXa!ES5@|!Uun;gRhMZMr68=ODN>_wbwW1Zw?DoFYP8_<`l=dPPenBc+Etoq9!*Ui zS!v*qg}BLi3mQ*uB_NHvVE+IS3F?FJt~MyIBG7n;>svl1FF${E3bL7Z+|({CA0>pM zf29vpq^&XK=><)YJuw9*zB0F3OwJBAFCOpsTIYZWeUZoC(SES>lOtWtKjLP)tDZ$e zr{R*1F;BM;lqEcaxgY>%U?L|SM*tTsg3Yd%X|h}uX=r?*t`8PZB`ic${K;-`#0z7*7k$Uuj>De-^$OJZLAP zc?YSqv>8pjqhY-;(aO{n70X>qB~JkR%_~f;wM2uY7#oQrx|-d`kbZ=Z*ezxOf8{i^ zWZ%(p8gI0ZIyFYyG#Oo>mXMz=Y5*`c6S3Yl`R|Qw)Wuw^zlC=vsvf`XBI<+6A&kFD zmgE!oylouD`~5IqiejUuDP>>U57l)!=L#wzJ1fm{M`#EAyJCJNykQeGtvMknxOnsG z%~L9Bsj6cHsYptRf;k^a+Y|9je?WAb%>_-U@xRo>*1bhRnCTeOb%x50!CUblfw>Ym zz_(h`?V%I&tpr#@uf|VT!1Gm`Db|>s5h6K|XKjx-VbwR$SK*j(!Um_s_fm;5o{*48 zBS#Urjk|1cKZ{}IPr^T<1%4|t^X-yv?$qkssk(I&%#tIM&e&Pj#tsU$f9YP-6P_Tt zt6cJpE4M|504Ro3nB#6XA6!GN9W(Jo_+n0fMHBs5>kVhEZ#tbx8kJK}0FQ72y|%(m zxrv{JC}(s309BqyQNL4akILKX1P;(b1b&AL{A+KN#_5R1M81*x`!2hhRvx9yNUch# ztL-&E2~rz@secsFOWNnQf1n_5GqNA4W8IO2{e(B!SL=U^uNZc=8)d$^X1j|m2xgx# zc~?ZDI|m&ebaVdzt0ZEC;k;w&sK#B${gsz5`1I<_BC3-#WGidVI`S8ARj%ay3$Cv~ zLRPdaI+YNFr6EOo001x`Sk?eWOD$<}7pcI|JQQi&&>cgtq zO?qF&Q(>U(uB#MifATvX;`%D>`|S#)ryA@YAG3Sw18Lr=mFIzsLD^wo@Z}-Vi1ube|Z#2>CfUaO%RN@kU9(n zUv=d=coEnE#vT9*nCF)iMXCEk6&_{c-1Spq^0duJXpuDAZe|1 zZO~h?v7=$8$Z48qQUVtS2=sx@l1Y=vnK-a%5ZVopo3+=6O^(*h#dVD#+VwwD_K;4b z$ZbUGB&XD1e;6R7#DTf_p3N&c^eYuTeL$vK8o5_d>8J@Mkfb?1l_6UqCt)47II`v& zQ~?<)qf=e!GZ#-PE3SE}s_SR0yjt6Gj?Bs`E9@2QQ`8omX_q}~Y2+##EW#BD3nZl} z0!b}3R0m$ZzXf@5EA^U|&zU^7UAxOyC9jZ!Jq-#rF zZixeR6&C=FyLat4KQNKPy}7Z<=2W$J8&x}KzoMCyxb!y5ASqk$P)_O)0VM7|c=rws zdyd;)e_ezzzSUYTj_$*)A&oTS;sT3qvb{;wC-Wb8@7&13%LqQ?OnXW9rbu*KZFLk6 z7D@|g^3|zDU>$;p*iRyUW9NVeaR}UYeSs!B`OMS%>~&Y&fF42K_huR z@u2PvG_##RFDA9%@Ldv!lhk&65Z^| zMdPC#VsepXz`ANn;!0Lk$R2B3A8Av6?Tp2e$N5d4RN}^LyTaxjZ|V1nCv){SYt6Y9 zf41RuO&u)>e=aFCUl7WD0Yo-Rf%O7Hk{~Cx38qGYO*MDvWo3AblYcI%t}}*lvsS8t z;Z;!0Q)-84YgjFUq-gw z0LcX^*qH385;()+nl0cvf`QN)p_TeMf75=jXNvnZw!Jm?TE^;aeqm+Cm|dZ5#Dpn> z2q;oy1n4r6C)I?^#)5E`+iS?|xetvj!IL^+)p|Nin5%mhoWqyXQj24$PPwd;9+Ws>=YX3zk{B)bL9|PN1c8JMZr&*iP7ff8*I+ z){a%fEcJO6N=CJAqCEj(6}b8Hx7QR6p>}vq2Z)N>RaRQCTk|+YZAI!1nzrA4HrD?56G91|KI`t(E^cG~p!hCdMfOv#z;+IK7Nl-8=J16LMn>eAyC2v`29 z2C`64s4}1oNIZ-xXxX-iM9CcBe?j3{y3N#Fo0(a3SWO!x;<}evq)JkR)h0g`2~Xrx zh$?Mx0AHY)CBGdNAcx zMM+CwO19Vp#Gjbwk9=m7&`oX*7ZA+-K&iau3hUmbA-cM^9|~Hur$OKmf5AFRe@@uh z6gy)A`YwYUcpN2FIl9qhxBcK=^U%Fcyxl5cN`eU@d&x+X`^Fd}bKSK^%GgDoIaFG% zspf0*%KOPQ%3<{o)e`B@pwfWYf_GZI$=Z7jv9s{euzNg?tC#r6Uh6y_i=gzwt4(yz zHQ2M(WVb(Zw%F@hsCJ6pf5UCQ@_|;J3U^9&AQ&V`Pa|w)F*Vj2GHflTR|aI^dV1IP zhIB78G8E+oakeEY9%AdVyN@9R@Cxaa=-+MzFr6!z)GBEbSs7L<7mM!?_ZQ17^{&9n zs!#YgN`=v^eN#|`N3>u|FBG9;haiP>wdd@)nsh&v^M#`3g?>-Ff38hEC)?1Yz5`>2 zB9PUiYbtJzHk3JUdO4LeVlgNLL7*y^QZH`MWgCMu_0CY#IZWehS2otAQo5uoL!d_G zD$+;HU>#(4LgPTM1^5y0i9>UzwRLZM)A8 zUfo+EHp}A;p#dl@Q(YMWD+H-rs1ve*k|H?9xFFX-rj8b$%GS640B8Y8rPED2c5Jw7ac;f)Y$L6TfWgzK1ryd$(1U$ zg`|zce~vK^DD4ub3~|85$n;uT$iIytd-V;-A1tplbr-_zpEG3DLRgzvQDTx1B@D<31rXR8Ls_*QnkgebW9DGBjx)qvX6vB+o_y; zKlMo86H^GGU7swb*eTQ}P*_{f`GoNa(-FMLe}%Kco5P%M(ueD7Nz{ikb6by!o!!EJ#R6PR4iA1mhv_$pnEe)UzG6G(W`wy?{h;%al0J_kA zErUC0W!&|7LQ-6|slX%B770DLI}wGQ9E}GlpNnDWv{rFp{{U0jVU_xXhiO}%VH5K| z?|}R~!~IJC01(IYQ_|;ex{6keo*O59e^jemWbwbCkKYC5Ols{xBw(kMej(~?DEP{o z)@8P~AwF{%nz4kYW4^c>?eoAn+MWR^t&$>6K(%hS_|49*TGeEGuKhzz6SR&~JxVjx zU~O!>ve0y_YDpVzNsb7@p2;L(Y=Xf=-9U}om}vXIMJ*RxEVU{X6#YZZ^zJ~1f9W%g zduuyK=1ahxqvwTrV}5?y!bEp$$u_{ZwLK)6#}GQWymqXwyxLMSdd zzN)g3X;=B$bxI50a8)E8F{URqmy@36{{U2nZ+mEg@&NqCS5CG4r=BWXNlmw`%5}*6 zH)|~^(v!CRi8C7xnxGm1N7mY4?fyMGH3cbs~zP4L6}GdfKf-@<}0E z5~4}Lw6e0)vgebMtPFjx-EOiE{&+LaUS%K+UVf(b?sru2+71YLWYsD!lo|rpp!^zm z!SONU0kz-qrF{(+SEYSTJ(yKU@c7lE{6tZGt1zJIvFo5zW{+=sWB0)aY0p#+e`LU?_P@8nnPO}DV|M_7CAV5oJb&)@oK3NJLvjO@`j_qJ z$t#bH>DFLL{w1Y^sD8m%n;G3+=N^GHw|%_bC3OD)dCPaE=btj(cKQDR*A!V0{{T`T zPi0N($J%Yt4-pl1dg@OS9bxIy)~#rHIRi7)THCK>Yf6>pp$H*ve6;nuK2Jwmqc!1$DY-2RxO3)Ppj4yoN2k3NT202|KMf6xZN{8CQd_#Y-k1g$BR zCyZW?)Pdw@3whPLN1mV8X_&GIkL@R1=(wlflBj*QirUaW*MJy_uJ0WNT=^wr+o&Q6RD}W*nA!}2Il+eoWZLm}k6*EyBKVxif6k}Fr&zC@6wEEP6!e*BtNSxv zM4c5@wp7|%B<<%@l#x1$9OD5XbH*Ha=$R9m%oc(@+4-;M>&K^p&l{g--%^>$o+~;) z0e-ct>%y~-HydDobAAPYY$D&^0YusOA$3QZFST0wdzvt_f8lK5jqT6b+w^l>! z*F4EmE(#o=Hr$3)B>BNg5L*)X&gSvLM4&bJHVC!)Q){N6p<0`!xKur@4W)i{OOHrG zGy}ZBAW0$#JCaG9Xi0VS;Tb_qX+;e^AYt{Qf00O4Hl)6yl_4c5B}a9bpUh01%$yr= z086uUQEjG)snL$bjognZw)UV$L08;o^rMFwDX;`;V*#k^cgnTtW z!yzbXNhF}86A2*h2;6qX&{O?Lq`Op-3aK>upeauYKUfF0*sv*4zEo>&rD-YF(gEHO ze}bs?=0AAER^Ak-rcgmjt7-&9X@n2tpKMt+hzn9706Y)JzqCrVCP(Y1d{U!J4>M9F z0=?NH6iU(*Oh@^7`eMMfRBdkS-a?YnE9zZ&Mq5Hc4Dcp&Y$v`f-vL4^s`BTIKeYb< zrrsSKe)HhF8U23O!f8}{? zp~nIgvUZIndzpc-I2UQy!DOoQT<1_~lKIrS{JgXq#WGDUuP&;sn^WrYTm$l{AD9rW zw}aecIACzRrWb%ZC{ffuz3$Y%+5DMZc74W@mTQ@{ls1r{4v#Tw1gZ?^0Fk(foEVI} z;?S7`M|D`wekW+MhGku*&0wIqe>jHX;Qc*P(%N5=3KCLET+#wTSlF2Wr~suc(9y$@ ziEE-!{{YLEUO@itfQ`wDtVTSSNJ{C3x}qS{N!Z>JRg zQdI+1lB)1ZWWXnQi4t*Ng_5W^{J*-U>ljX3_5RD0_?!DLx?SP!@k4C1c)B;ST~S!k za<3(!gtl0tqNx4~rzDkDe*{3|$|rJQd7tWU89&ppLgF{?F1+onweP-HXTo%`_?dlR zw!Loe&~{!g$y8a_J$3%~(P3#t8yRh<7kasnqK1N2l%Z|yF8PXaB@$2yNh4&CeFuXU zc;r#b1O0~p>m!dsJA;b8S1ZLNJ{adRM%#g^9e=mMbw<25T(rtFf9nb%8nhcR1RbS2 zIk}DJY*gZ}`e{{SnJ-x^^50OgdoP7 zC?T@npZH!@(=PDM~w-%I#f340z)A9=6W7y6#yTKh+CHf!bXK#%*$N6XGKZUJFhdjoWx?0WF zb)}#QQmEb|eYf^A*x*NkN`LvIf1%YVfyR-iV-jHdcfyB* zYlM_s0Pp>gpBd0?!wvTS_P2MzetN2F%&6)erL`?$64f)Q^qsX6&;ZDYBpDm+ zi*JHz1OEUpzlt|_oGyslPi~9#C!fjvGFB=}X;;IYGpvQcgzjL#F}aL& zCBeewGav%3R_3h^GTj())=PoF7Mi6XECP4*`e(e4e`vymx89iKdh)%Y?<_F$>PGTD zAzDYz=46vT_#kanVKJz&P$J&@l!~e!gj5H_7%)D3_8Z_614ZFyrS7vumY%IAU&6R` z4L}}F-!Fa!66!`UyhZlp^iQtY^TySSHuQ@j+wQav^oqpW)m693dPsG*>r1)6qe6Ht!{v@ zmkl;^x2%9n69v($Zu1{JFn>4fB5LA++sD%P0B!dzTe>l^(SEiZKNC+U&9f;&Es}7oI!`eXv zST)eA$4>IaX%B2)@cGkaRDk?G?-B!Ed-I+^Nl)R4e?!cW=JD0 z0M&{)?a!*oKEK0svTTw-4`XBYN7eM_H_)iFUDF)ar37jTMqa9NK#3#EL6ZVwp5kzB zfAF6gW2?!1{{Y&c@h=K32hDHI4gUa>_gbU?u88J0gUb#St0&etwJS*6LuFt`ZHLNm zseCWSAseKLzGG?ln(@*5-2vvTw)itz(Ki~@^zg`Zlc*yNa9A}e|dVTq6BZZk|aSJ;7sniB>a;@7&=nbo}=V9 z7FrpJvD%PAIl5{#SOO5 z&gUy54(M);oJghmJo}Dz=edTJ1QE|AR+?kHte__K& z_YP9dshvWN%+Z)#8d=N8N~e`o4Y`8=d+mz<01uP8p{t1w?dLo>r5;@yCrLc5TMy+w zOg*|1dCF6@Wd2+wm9+QkqLA%n{U}-iLL6#{Y8}kU;&+2P&JDgEFD8(kX&9s{mO9Fi zfaYVbTGo%q0vn&C3HkGejRQNSf1Oj^(IU@O)Hy>fKYOgFsHt!*4O1~wR~Hq;oES(PVIkXe@1Q;H1#!|bv3-dk<3N^J1#ub4|qeXe>3tEit^7y0waIh`=xciVYgQpcU7mvCPSA0q6Ao>qmaXuM)Ml+97!APDg6my$GzWx4m5Q+G>4DOG>71T7(}- zQb92)9EuE)!!$nq$ejokO3dfjXPv5+(yX0$x70L-mYT)Z(YZ>ef50-7Bo#OikOD^f zwdAuUDk$G=7a*$ zgtq3Qpb%6NkfN0(PGEPl(E1e)oRiA-l~v0&F;ewaTI|SE%kvlH1`p;`$OsA`Ozd`? zFhs&St$@%|R@b5De~{yqC21-rTaUJZ$T0!9B72zndy8U32~bvDDXs-Yb+kzuiotE& zWGjg>+CUTS?>IKbLaQr?)6-o`e;0A3aZWu@w@c|{l_GmU+(6nQCm!TU7&Hp;fvzIT zHkGR;Vx|H2{uM}Ud_*-1G9&^x)D=68!PxPIzDGvvWi^Gaf9i=v23~%Jg8R>{wKNp3 z#VJ~3ozyq}AUpT$Fgu%IBVK{VQc%FQSMhdU};8Y(L3z7m$ZOK5gh93ZI( zkU>ELW)CJHdt%%G%^_iV6?`V4iq_w5_gUoy61Ixa%#e^|O7_%ZK1cS(Q&+d*v;g2k ziW>cvGG1JHvi=a{+Vg1v~7I~c}R86kGp3O=hq5z5`oBE1my`}OYG z=%=i4XaFlpjK_E%^v2do95RyVMcT61`oVOzKA$`gbqU@!{(bw5H~{RSb3h2bvh@k9 z>tV7s!=+Br)jH>z*#T%!N&-kw+z@vkJX}L-e~AfO-SS)IT<78gtv5PsokP@G>Q-r+ zn%j#t4m7VX(v>OY%9OPoAOHlCHv|o-@U-RMsy0l1!u4-Q%{D}^wQ8rhd8utOG`{PO zEoWlut~#YS>d4w*DM;BUPdKb?q%t_X+2wR94E5zSgd(K2pqVNh0o?xM3y{!4+9s0x zf5X)mZ*LrjV7R*JsT%8FWY5E}Hj@w&toj7RlA<^;m}4@^9aaL+$jus6b4hevQ?wNo zg(0^z4NgD;KQa*MrL1r!MAtnilA(>5^#Dg$jm5d5>-m-o_yB z{#;R(AnWVVDt1dKp~qFP_EPypL{_}Ee-_hB!Vv1vrJ#ZN{mGNOZ@j_4d8~V=yPuK< zY2MMs6Pj$v=G+aUt>zw1zr;+XX>((`LFC5#{@6>Rtc39=zX|=UaPK235 zBT4j)=W`ngkYo-p1}B$uWe{^f-~mVrc5pSdFEwVVFHyAE@=&FfrDsp6B6%s?fA6-@ zvBS(ojrO@oWSibV;3S!@)0c0QPE%a%^o>91E>_dhB)ZWm+$Bj843H!phdf3uKVkL) zDfVrmN-Hg8{-e>*GyRykUM+$Hg1XUvtZUE+kVlvlRRr!f;PHx;@E4mu3i}B$MLBJO z@#pncDtz_g0?BjuduLqp!!(Ive_R!Jg;dJU;GZ{IK<&r0;ZA0q%;PD+vX|zo-Cv?} zP1dgw)RiPN)z_|VsuGb`mo0CoIlPshhY*A5+?kW|!b~w&6pgJLvYMyFM_Q>!X1?{8 zDuEECy^?9mWS$fFZYR`YBjj)&hhgC`d0^4~RMj3Sy6s@OF=)1B+=$~9e+`wUpyek~ z5O)PBtK9s#?HDFO83f)!2^&rT0&nlKN16P3b`Xb7TNVnvRbP_wHtqU>w&Iikmh6VQyb*-Es;oq9;Z-3s&jR6(xnk0VLoV*Anbkj5r(y}i1z?4)q6%jf7ALX8_8K-ou+OV zb|`KShEk>0)V5w)=bfC@>YYIEfhOE&Qh9UR)h?{d^k)96N0OR9jHg4a8YICHBUEev zkOUv=h6htGvdZ@FcGHC>RIyZB?C&tTjTH#gg(jicCrZpL4kKjq*zd*-&TEJua;i2t ztswG_s<&LL+h&c>f7=LcpvbR50s-W~5=6$szVqJ;wt`PSi1wP#%}-rytIM>kxoN0& zsZ{_sQu$ew0Xv_4_mQ*+z=t*FjuDp@)g@JyOHOR7Z|}R=gtS#gs&k|XU#O5~M1m$H zOyP}t;=QAuP&tg8jpvRPhTCS#V$7Cp^;J(aP)d?XB&%^Ge;y3TBzMMlIs5FbP1wlx zw&^a+>{{)XO8cc?d6y{YY94JUK-od1ndS(Q$UOU;Q{L@|JraGL*}7kxM=WKF-KCUW z^7Rc@;G~mLNR`BobqO2%@IF*-0@@14=D0YJP5aZTw{$X8v}uIwNAd&Zx3(Fv3!Yud z5I(da2_-{ef4q(V0N>vQx0IV9YHGBn@`U%;Z5W$VF2)wE)gnf{%4BNOJ9|&O5xyqN z7MHk$WlN2#%OvoCME?K}x&6)rG+JSKDQ0VKmafp6TGkNiT&ra&4j2d22;b`;Tq5>m4xF_Cmf6jbTj>-Fh$+S%-U!g6q!?nsD zT8Vi}NhQ!h+iucEhycS7f!LIR8xE>7f)ClW;`&HXMsof!Y^&jx*tV) z@a5qPF!hJ23Zk@@Sj$w*BDXi(z7=kpasX1il&C;2yb@5EB`N1%lZG+G0^-sI_3Ejw z560#DLE*1G#^*}+HmHt%`i|eRur@dbHLe*4@8Ev;qIpeMTso0P z>kW!pIdx_f;@m<+ZyN;?U~w30n)uTE#=D}~j=1$l%t~6UwSb@u`R}Ni;Kqp}dtlh< z&Kpc&;`8Qt#){m@RV5vzBXIeG_e^vOUi&KkG1CuT-AbFnCnfI$F|v=ON)3MVrq zhE0w+N2iuK+jNvCuh*8AlBOR@fsIN@Bz*QCEGpz3Q;1;53RL)md1(u{S5>XEfByia ziX|Z=dle)SeYY@uu~#woDh4u}H{!y4C<$KAs|Qo&4w>?hb0Ew;WDN1 zXJA0q(GH3K0Mej!L+klB9UrSxu-sSK2GVrf(rCvH%eEydW#)HId&BXmLq2 z)VAr@D^)^`eNIDS*2>fyLYuBje}PUNMhF`q!byoB!HvO%>Pd;9lAi@gXauc)W1pfd$W^SswCmlVTv~>?%X{d-=GYjaBJgUXX`D}2;>awTdy?$x6H;My9 zLTIxk*s6apxh`$Jmy1L}|{1AH%X_zlV3TFjYUp1$>_<9VfB)|9I#<=c&7mgO}Pz?!;* z_I1z!Z71?K3OlX@b(583ilDtiY0Oo0X+o%;S`?6<%6BKR`C`R{4FqLha$j6Cjg|Bl z-&4p65*Bv@fB6^zbmHLGwq(}%2tYz zx^^=k^L#IBf+0m&X;n{I3uS3OouiyDbrj8@j4IDs`lXP%1=3u}*6yiXoTSUyR?zjv z?)ym8;ccuPeX{gS0TN?~GJOJOMh*!ajjPkyURkp?tv6c5b%{{Cyp zZTNq)bt^R6?VTyDqqn(qxHCxYw*7GpGePDoBh3{H<&=d<3iW_CD>#NWfROVvg+xc3QLX1T2CO2i2cSi18X_qeNMINI;JCF4h_5^tf`xLphmDxoq_Cqrvxag z;8Lz$bAM4S*Gh_8Uq+p|&>_t<)ztZhowDjb1ctW_llKbU~hXIeoXlK_*k+ZNJ#gan50ZCVnx!ctu% zB~nhFM%;YyX6;cWRC?Ls52KzQGP*NgS##ALlAfhO7WSQ4H5JQ{G_ulVYXBKifP{%8 zj7Pn(w%lkYv5u1fTDo+-e`L>#E|%5g?x%gB`D&))e|c#rc8e`_A>6F>0%RX84m=rt zppzPkz(E2$xZLxm)bDWs(E6=$!z&+qZ2S*Tit@kO2lfZ}J?M`~mDeu|zBRA47WyjI zTdT^|_d8wC*EagJg;CYC+j6uRQjnmzOr1$06nZ+EaTzBmdY8G8I!YEf^&iUdZ8w3u znwR{We}`0aYrv^Kw*DC!N$oyf;yVxD9kJo@0d{_imHr_i{{Tn}pZKc#KiQ|qFXq0E zUN2W$)s+Ryt*W}Mr%hET5=#NJB$pBSwC+}tK;0oK$*b_>Ybz4`+Fob z4_{u(#RVh@?eC5X?9#bqe!O)nDpR*bO?Yate}+Uh)y|E#$_B$oT86ZyKZGa`mJPB! zoD?OY+^@4|UV59HD4ey|UfQIjbtNv-TPWM64y1@FTAN5yi9X6Ce6eOnyOO9etu_Lt zVQ81wiZ57rEby0`9?G?Sdc1s9uI8##oQ#FI8xQIvJ5a6lASoJ<+<*_5RyGMIY+5Z; ze}S)SY#aXom6Bat5xlURuG?+Cc$>>~YqnConNrGtLfdh_IVa_|phSVUaff~rTtCu& zNMESZRvbQR({JnNja1em=1ed8+FUe?!SCZlP6=INGYxf8rSw>i{-@(o(ijPMF#aIuEF+Q^xVX=>Guz zB8iREoq?w8dqjdV21Q*CS4TtrM9&H?Ft>G&a0DD*pvvX;8vL)){{S2vL#NJ{+FKRA z^O9|qR;tUbau{j$nMEQM>v2g7R-`OI+?Ld1V~+2KX*7NjKjENgV*^?mJ-}Xif0AsI z?_9lZqJI*FvpknR&gvcRz8nS96V?p1c6=OH(KfKbk=O8_ici}-N02;l{lw$yz-k* zmW`fv5|u2@kv@|-hMn?igzmrqe}FpQQ`@g}(>q(G@>^t+xSpQj*P`gcvBkKnaCEAr zg1;g=l1Jw3Bu^*jjhkp+Lb3}!^*t--df*$VT&ZJA;E)hborHJTo%`TRNNtaTV@;Y+ z(x#EUG;EE2Q_4sIQlf$k$UK>jNAkfs`6|d2OX@cgs>LNOl91qSGEzgJf2six4{3;> zV+0IGT_w;4(R!a%u+@HVhdOns1S}>%Kd#dPcft*CuIY`)wKFu0(^akNW>TcMONdEI zl$C1bByu}!eYWq4aVH4a4(uW7Qu`KqiWV4JDIKJFPO|ut*)6IPO1B&C4JT?x13uFRBA13pF)8u20QWr;<`b& zgWYM`;hN!fb}B9o<_bj?6qP!crK)#^fTE&Em1!hN?vb$lF$uqdAx8?uLs4;ceo?o% z2r#kcqi^T89AL9bfzJq^h^#{n2kj5(N)Doz5w_g^X^#6~PB})?e@af53wr3PRar)b zpu7;JIL`-J5F`^2L7s4uMU_Rw61e{W+Gke97g;iOJDars08gn3Q>X-hn##12M}KU3 zZ|VI*A=5Y!{-gQ@&hc2CDQBQRs`J%C(77pL4f;UYM{e4;Cx6rS$G3=r+Xlk&4`~jf zD6h{y8odDOoy)}re{Z~GZjzYcoN^Z{#ym28X1mO3 z0022XZ2WsKMN#DJgKw)_H;nY{R+OtsXeiW_xJLjIO1mBQ$6kNxEnKnG5P(ltI>`5d zg_WKO7&iCcpcVDyF-B)qg_CN@^oh1pCUn$*k2Tbj%F4Y*V-fB2#~x=(tCP*tJ8|vM zdxrsb^txR>f0jLrZ4a-ry zOwyOyLeh|^?;zm;mzoKiNqFq3dB4GbhJ4v>T@9zF3bIr$K~2^Gp+H{0*L7MQFn3Ru z^48Q5v6K=A1VrJCE@|Zqx@e^3qWh|SSJ{=($5fw%>OJn6CAGGe$|zotvnn6pq(M9H z&ukx_@xe(R9)H8gL%sH7bi9=~zO-I|QX15iT4+z?GL6Jele}?@{8XS&D2Il_{?)7B zX0J|~s8fyg*7iVfyr2GesR>JjK`J`-1bm~|V%w~kD?S+s>qx6V+2hi>SIN9}A2Qsj zz%fq61uZdBgu&OLWRH*o=5c3NI5|HxKf>VMc2fm?oqxRot!GoO=M4z}AwL?x2fWY2 zfPMR7&bDFOW*>$O&fO(0XGV0Yp{J=!>!MZRhMRbVsURsxXe_1` zK9Ucy!lcyABWcIwgvRJJ>~*v*q0(;(ULCp~ggMgh5BW;pRM^tZd(;ip*C5E;KUB9| zo)4sr;D5l3Wg(qbk195s4P7BA&9DCed^B3nr3Ec&YgsDaxNL#H%wTs#!6^2$=8*Mv ztj3x}SG|{NRMHHkNTHGmozJoP z9)0`Z9W5HA97>THTGc|Nu8#WoaR3q?SVDyI4y6Iu?TQk)*dmlXC~mfzB`e|_y1t~O zKz~@R01o>Q=$~kTBpAW9?y5(07OmQBszM*QW=e!Mv`SDO)hU?n;S=)M;2h`l3War8 z8Gj`|D_&+w5T$9>`$1mDKt`zB+)gWeqx~vwZwq$qId$RqS%tP*R3$!Loy9=^0NhFe znchI#z9BE|^-|h!xZN*O7eP}~P|~%fNPk9{{SlZY3iJ0I-e~-B})p_L>}IyAJ}ei=Tr|K&488c%noRk6~iaz%8aDK zt<+>VYXeU|PT?*kvl@oeu>?UJ4)}CZ>BOgT#aba0#vzWX!DzKE$hv!NvW1tMZGWP* zq0}Q&X;75~1Gl`TQSCw(JfwY>#u zwdYF(9XZtFjv)$C*!Z15CI>OXfY`~C8;BzhbaE49Whe0wv?VUyt}oW6sfuEyxP#^- zl2YN-B@#@;9e^bM_`9K2vAS~SSO_a}>1{S7&{$NpywFfwjV0wBG6^#RAb)Sf3_3>{ zUvI!dU+hzPOX{dmQ&xs<3xCV-*X6}M?-uqtjRC#&pV~v2NxoUSx zci`w;fhKm3p~73BfVXhLJ%5&;#%ckgYz0Tn9v81x=fTT)ri!mo(%Ux#d^3~S6-tpa zJCX$R6O6xt)HS4ob)L!p0E=Ou;YaV}x#jn#`RgrH{8j$|D_2ueB_UrFSSw}@;Q5G@ zZ|qbK6}j;rY*J|1BYl%;?@PLyL6azzZ4{;)d(Cp8w2|qX<-_HVZl(!7=N!C!$y;AFaQtZ7L%g@v^t3_q@uqihB zMEBI@-eSA?Xq6MT!+a!zFIo#kG44KrcHW=lt42Y~uh=T?V!7(NpYOL?@MLku7Uy-O#y0>VF2e8ei)xkP>t!C7QtDw4c%EdRmuSOS_7?V3@Il5Hh#IJCF!JQHbei*%+m5V5}UeuXh@!*{7kW^G#BoLf%vo5&R?qHU>m)f0h)(c6uf} znxLu9@6-KpEHnNyWGN3mg!7?`V?*|IatARgSBkbk`%DbZ-fb zx{EelDSsTUr*ZV5w-1)L&-kt$=>W!(JN5$zc!{JB)1XXnmBPW}^-6E|n%3>iR?|~B z>d~dATVVva0aoeTkO_&6j`JKc7}{PzAP-fRN4S7`r}q1eWla-wbgjQgP=^4dLQ;(h z-ek_iZbx%Cr$)eUk=<-zBmq_Etrogkz<{fZ=zn#+Ax*XxbrZPMPrPjd+j4ovDF_D( zQ*MQzQ&#Oo{l+Zo2|@>4(0SF)wLt@J#K#~<7#52>b? zM&O=3^>Q&zc@9R#g49LDyS=g68b-ofrGIgS0^@*(5)-s2a15SznK%IEyLWWmq)=6U zqUJ?2(mdH+b!9128Fu1YEw?2lEiEaNzy({!F%h;ZR<~|G?I^nicomAG)fxdplu(p` z5J?a=j>o>(wve%w*s;ovzc$dJjUm9L1#SoC1AqBAHxLD-iwPY^Q0;WfDRB<~RevH| zJO2QtE6hEVt=&`!>Rw(XYONr43Qx@ZpnWkszbXqNQx;hz zb$TikSEEEWuTlZzNstaB{h$>`?0?z57SxQkg|zK0YR8nFE)fvtrZ*gX_S+Rz$U^6r z8wZ3{BeemPHr37wUJxEkg(T0Uk;#cOw(*Eb3fc#B*2i#lXnpFM)r0XXOGVuyKpb(- z`@x;DF2as!u!*(x11i*CTFVsKik151sHC!lD3hfiozt>Ucs%yN0~?KAQ-2E!S!eT(Q!d0qVslBV146SU@g^q2!x?L2GR#JJmAh7e zZso%5kkq*2l?(+oyLP0lYkzYPEQesDNNFd`&NR@%j$S4o8;tmqg zM*7l~i$T;Im_meV`t~0^{+QIvbV`?Nm%IMT@3ZdR)VjNWiBA!^3Z}CtG5zBzgN<}o&3D}PI{d##aUQcHoWcy%*XiI{M>6fbNXdi95;)d4ALD1MTNl&Z3{EuNXh-0xz*&u05S<6dq zrAm6^ROFDIF1R%PHXF{{p7>*93f(P=U4y~*gU+LPvFi0FN%~}jwBkUjyx(pKQKqs` zl|rf>Aj-)nOMh+tXBPlK3Q}G+M9sx#KG~tl{gTcfWS@t8@AhuzF92N`%QQ5Xd;JS{ zOD1f%As={G=E^W!p{%NW@D{yP-dbS|Gg7dT`HHz3$39`ZsK_6E`>on~iPSNCujeYJ z#dM&le${)nJ4IVY^6Bg7YS2>UE9hFAb)_XjLeR9SB!3Vff-zCX$21nv2<3Z$&nk8; z3^=l-G?Es-P}V>rztHV7`(c6>_Dl0!Nu33jolhmkXp$7Qq>`l)k~@GmouquRsgZ_+ zm$;r+ufEMM226FsHzTY4Mzkd4jI~|^G_?#8-SXms6c~@0*6s|_x|FGDqopq+P*b68jQZ>BFLQsH)+j#ToN>Y@#B%}Zc zAPDGgYny{h3!3H?`X%8H$5vYE2S%;bo_`@PqbcWW6}7r-!0u#eRJ4~+%1Q;snx$jO zeJ&&+YYA4M;a0^ZDlBUxEiT$3R23==HucydK%CtIW4A6?qjl)K(^u zb=22`P||7&b$L3PLV;e8PMMezF<>2m)sE^Gxv$!J?bTN9Uujo>dKWY^;ys$;k$>w& zvn<@IK13221DWLf@O9A*9=J$u{{U-mf$L~-G?|k;+?Lvu38cu6HWj$wytGK%Z^!I$ zU><21hyY1&`u_k5y>RMx_@;+k~W>OI9IS%2|o(@*+~BY`t_Oq@o}r7%f1;h z2pzlk6Snv!;F~~lxF3m+ z0QoPh_o|HJ)610>TFg~TDyV73l$t8{Or1+gMy6JxK`TH|CP_?^tbcPgej5&`7qHX5 zhu_%x{TEM7;&MboWXSse0Dru%B6S^Waiul=`XE78iEW;U?9up5pSFa@J- zBB6%r)lg6rsCAcKg-q-O2odZ!!4}aWR_hj~w=Uaqr+(LPRD~&Fs8Io8PNELm_S(2}^1vtux35M}IIojsTH`w7QFFObptV&{?dk zOnF#gm>V`I2jz^+8h*ZAe{1-J!`ACyH{03Q1itu7a5QWH(bV|0ziOv z8;;)tsuIyba9C3mX;U0aKF>c?0OfZJ^)B~65; zbSTLqka!z!hca=n0as|Gr#`~;UxfO{DXjFrA5uOY`UE zE?wDnrN^n5c?38Eg-U>b*nh4H@PzQUrL9GB{t>bZi%+afgSP(wO}oYg6DpIAj@w0T zBhC4WAU?g1ZTI<;Bfs>*i*sF(wYgj~?L)d-=yT6Zua$P!Ji5G_TT0@z!lj#oh648h z!+(Is&PF=^4{p=Q0pO3&CF=uyf<`hwPOFhGr>m^9Gn#0sT~!X1yvgXa;esjFQ>Ic%*lF3Dss*sf5v-Qr`QiLfgqea1CDFgVDl*WM_ zpzk>2>by%|C?Xg`fjre8i6=irp_&mCmw&i|2Y=Z-v}OE_aA>`6HP;f`VCrm2n zxhV!uBl=^FsMKp1?Xplm57~61(is3ClzX{)#dz0Cd#+;Kge(NQ+X`E*i6eBi-a7&$ z?Xce&S*e;VuwDB904rO3Jd=B=3Z9vC$*Pqqx$B)nDn5tH2xD+K2v?Y~&-th67=L&8 zj<3`8{uYMlqdbyI`kO7;E$=NB+kUiz6z0$*7*I5{fY63E#%rNetvs}ugbwq;A36PSd+AmIQZ-|B zW6*`8LD8h7NE>%lo&Yh%D9EP@QGahhd&^xql2as~IRX!IWb7xjkJMp%iC1{ag~q88 zw1u~%suBr#kSDhNgl{Jnn`LD+8c-l5M3@K83jqAWV1Ag0Y%I5Trb2YM)fS|l?6_1( zJZ&S7Y4*fbX7Z$`zFh-)Ev!>Eo#RC!k`p}d6Yb0c>@idiD7RAiw{ul`&3`*K_0*+O zRHRZU0kji8uRhqbuyScpakZ4uW>hFDp-5>(AB30Eppc!TNIV{YOi?Z9tP+YvR&b&L z(RrzDY6MF!DG&tkOhDX@a5Tfy3OU3CaxNL%(j~f^gNkLg!EaqlBr9RD1j>)h&K6>X zo-$Np)+%!bds}F3ru@o(41b2z<}f!sicr}jliv}MLJk}Ht1}UW5-*)dq(Ew)G`PY6 zA#OCX*jLL^P!E15dHG=cy+8X^2b3aRzdTlJFUzRZvQ)KKI#j*(AQcHb?0?q;cJv=b zMan9~7LuAp)u}+p2|ARe6UfxEMD57L_E3UC%`?`voGKKQD=Pp6ynou;vf%`@# zNJcTqQ#x#}ATHwiQi4^d;g|%Uee{q_cK~nifcAmHjvlCbrm~|?70}w9e4Vubk*8xM zN(mf$V!@E|sD~EwYewI*sR>$XT^cvja~}^*hOU&CDtcOlEUCIxqzRoOH{i&f z=0L?48lo*;01gI^Wj&VY-6btWJ<-)uxhhl7spTZ2SA9tY6MwXJI33qinG>nG!VUb* zaIoelZgjfd^`#X4V}vCLR>eRQxRc4)9kHd2Y>Wf$(3#xF5;B!$JjGvetTshghZd*Y zGM!4&NaI>$00527+xNqxiGjPTqRS)8-L#&m+ZB|w)T&E#Yjwt|8UbyU6qNC$N`N6l zw3!2qv7P6-)_)wK3iUUO(nD}r|5gD@u< z!(@IMIQb^qM<$lFHhS8M_1!3`o+(>JX=&0ErBM(_6Tz4f+Ye;TYj(Jc2>h2Gi|_39 z^{3brmX~T$^8Ww@HI%+u6qyH6aCU+u0w+%1*e^CB4Z6MG!j02RTmxE7`hMx9*QB|I zwdP->p?{^W34K0oTQx-mpbq91Njv>^_UyK6;sAqV(QTK*X0d>C-5Q*MO=4=UV4NEAa9^Wx0_<2=*KNpfgWIdN-ZlTYs6OqIT!&1F*N%MexokBuQ4bv`FWY zPtO_M9AJZgBy3@RK*qOu%)vQrDK#O=(L^j^!aB05=?Q-xlv|dM1{%i~xypg4tMwKH~vT zC4VdOn^L^QH#^E>dH#FI#WC*&x+N0Pfy((Ji41Le_C4!+fJUs2hd_!H)knzRkUGEQ){DBjaRc-R8W^C zv@L&!Cy+oJ851+U!x6F`C@3OeHl(huq<<4^s#;K|60azNpc^6yJN(ZZiTPlBzN4ar zz+<`kMMviNhLZuleI-I+QV!B%zke}@ zejV*@;zf2z61DEy0lw;5wbzve@KvGXKXOFk7&+&Bp)%3^a^_| z?Z?*ZZqd9PEQKkM2;+T8PiQ{ek8Z#k0w%r16uO($J!0u;>Znst;#3-JRRlW&R3t6| z1d<2?Z_;pE;{wPu6f)DQ@|ESB$6Z@fQD{xM(gKu^Hh$@*-2K4cdK1>N_k3f(}t3jXj0OW2--oB+?YHZXOeB?1WeP0Te_tc7i)Ez zsdt-YS*m?Y(N-!X1V9D^{%!V!Ji4hS8%mPV zS5W(Z1#)_)MKa2ir%5P@2U1ox+yG#4?~8uh4i%Kxq%}s-_x#sic7L`rZ?UwNm;i@R z%bH2k1P~NAB1s_gg@&*jB{Es;Q%xn!-fmYGS$49$f8E|vWcrlYkISpL@3!5*9O4tS zqzRn*vaoOU>|I{1Vx5+qDFL`}sjfDVCMG111fC8U2rWz!xH{|jTIS5rer0rZY+c=P zEj2YLrIKWlM*5&Zfq$fp%x-aUwXdHAdF^cL4$TbA3Ktm%9w zOHII39ZM-3cRS!VHjZ=AEXek>ZEiZR9VXfhzl1{tbJ{_gaI zBrDlO?WPP#*mK(pngb&}ft2W+);MnAKBn-A;_||j8eWsTT1!JqwyWJ8UbGo0P)Z(> z49GFK1GX>*>VKi-rEYYZSD(xRLw4wgiW?oqo&4L;tmxZ8YhIUf)4(Z2Y*M5of?{?D zYzrij&gwwrT!t_xRh|`!x{EVqmQak_l`l5L!a`SawZ6z&j`~4bM62W^{IR!td#quZ zpb*s;)@ds|p;VUEvaKyRvVus6*ufm)i-6@5LAnaPn}0fvx;&?%&35=#+ploF4X1Dv zN|Oh1v>mrT_{Bb>Yb+Yd)f5|@l`lZ;l0e&XOh-6o zmCS#%70(-ovKQ+YhEETVbYr6x9YwCUC0X+2QAS)t*D8u-TCL`(knK8GPL-&*Th_IL zl7%fOZGS~5N|k_~ZNve~YqRp9YjOmkeo?gtf6g8Hcqx9EHgV&md98D9N7N!#0B)0fltv9p66A}tZ zCkT*8Bxwe_`h}}cM{sj&5s!LT(C-4WXTGmxdFacF9N?)ddK9-v&WejAA zwd_$Ob^SW_rP2;EGj;y}%JYrUvegY^)By&eRLam6R05O|WAecQeW3jC=UYM>7k{3r zwvMC~<<@GhmRi={seLr46zSo>H&9Zx(=)c@@Nl0rZOArLgg(&#j0MwjFHZW2)J)}M z>Fz@Sl(= zdUcjBP1IDp>lHbg=BhLWU8=^Q>wke;5RC*j(oW5U%o4RuNgQN#^iN=GK>#mcWINUU zOrWt}P3NVR`A&u)dD^84k1{|B5I{Sf!5^0hEpV$%4sKWC$NnNe2`T7TjuGM~D&^$S z-(u=D#VfNv(L!apehAl%YhV!C(F@KYo#F^6XO^nd&P*Mw=& ztn2PmG6ukV{PD4?KLK^034R*0Pl`^gQuOA=^ORQh5Gu1R?JdeJv>`wh4#npWp|tl= zld@Dnz54~BHfsy@_aNn5pVO?JYsgs|%+nv8=I)k11*_UYZMsu&a)zsXtw6|L7_N$nyCGRQE zISs)+UlXw^Ckc&$Ai@Su$B?y&9V?`>fDK>{4Jlga-B(9*W%H>0P=Dw*TJrB*^7mC) zxG$}BxusumW@~j_>82^^so!e^~rCZ48f z8h26^tUQH~ke58wlz)PvV|O~paReWSG(8ai0GQC$hJq+qyxA6duFK-#2YZLD>AevV(99USp5)jpJ7n!4oN)mKQS)^zzVl!Noz zaAV*0#wjC>?WYS`n)kK#3jH1Mh5rDEA2Z~uH5Nhf4b!Vmcgw*(RYe`uu&0|zyyQ8?rrgZ}_)haTcSDbI!(#%P1oV2}Hnd;b8^ zSLZHF&sN@)^)WpmUU_2gXnOJ~XewA*h-LMiC~>lRLVuM2gSO!E4Erw&*S)fc&j+Vs zyw8bf80ehwRx^FTL3rr1R4=9O=KRj%mm6+gyVJc}mg-(pR2NrWQkg@qErq4hrpu>5 z3jz?S8=38EVvb!nCD;d!0qO6@y>T=zd~*;7Bi?cRuQ2#vtH^HW3zc75^A2VMb=3pwL71Z zLx!|7rh3@^RYv#Kj|#T@pHE4b^A}K)dJMRyDt}(fl&;gd=a@=Lkf+c<34tjflezDO zz0kFoCeNqcD{D0#U^uUT>D?yj&8PnWFkY;=+p}P#XYrS0UE3`@YA-Gg2=Z7BI;4Vy zEhR;32>=olqBP?(p7Ja-kWF88y^Lo4yRrqJMcFzh;o|$4ZPy{3?UxL#bhl&GS zx_?kqCZ!GllD!IdPRmRUlL?vn?9yqB_qzZZB8}p{OCGXM!)@D}76{;j!5)jy_NM5? z8&sOmgaPEHof{QJoKGsiFxN%-e>KCA))p>3_RA;`D z2<&%E>_;aTf>ktkP&-#rlrEjObtP?r>VH+ZIsk$;=691nTop8%JgPVFO%zpD#VG}^ zBg>T~MoJVnf@5*p7O-_M(5=bSxihz737?(}5ORylaRD7k zY*Y6HQ2C2cb+s1OvpS3kA6`syFthn>J(_0{2XuQKHp~}#CDuI6G8`1ZHl1+l1b>nw z9ildXNx*rnV}R*t?eN)L2_z2P(pvj&ZlI)nPt&cp!sR8P0U#*IOc|Z{LHv)5xi9ROM`XyuHSv3EDQ3vD^Oft^t@?rfFoARcKmzMbkG;S5nrJiGNebLP1PH z8dLN4JQ)YJDbFsj7ID!`+qEUiaD^nlvJmJWnImu{>^3KT<7^H9H^LxK#cFO&ng?j! zLP~U$FU=C6sEyCRCvanNiY@l6Dh@S8eDlg`r8f8J^a9#bPPC6yq=*I#5xLk1jt=-S z?F%0iSG3m)A9$*!oKg7+eSdB!`KtgOGx>oB-gx%J45N2JLjJ)Fr>j*^`d3P($#|hF zN+(I!g>%O7C$<`PkTcON-sQR)HFV^PM-ZaPB}x7=dE1EuL=rHwf`|+)ky@lwel-?^ zIs!_D@Z?HC_7Ef3;%&Cz@TTAjV!EAet%sRxd7%bUs3)CCj^zcZ;S>;hum8rK$Whrt2 zg9PolG4jQ*vBN6dP2-hl>Ay~|y-K62ucoPOnsl;GrWUG~)Dj3#LnsAHGqeev_K}WW zw_O&RK^sMp@EcN|kZuN$_2Zr4^Z8%+^)-CeT3NO}umqo(=|O z9oDbHaReqwIzb^LVE_Su^Ji$QDTG8#hKu)O34-o#eX|Wal7+`At5AZ+rUzS zfB^ccNhHif5IN@-C6}v;tZ}q|?H|Hnp1d=3V(*me?fDY7F)SRKfC2pYn;3Mo-w4jp8fB z7gsYMLa8lp^t+=s8p~_8d!_xWiY`=4Iv8%Hv^?OdTaVQt)VNqu01qG%fY@5KhRnx? zFpz5Oawu8!$4>Z9{6Cmo6Ge~#cR+Dud^q|HkQ0uFb$`<>^^2wyJxS@#U$tebOT$G@ zT9~vc)lxW>DGP7RacWseQavhBB!UUw7$jkHfqRRObAq1>fN2c?cdY)Z$z4QhT}^%B ztraeE6p9E}u^*i=-=EWLTV-=aG}py6#K&ZdSzRduQ#yiFKZS@;9k?U{NaA_KvhH$? zt#3seT7O#gx|)WNN1-WgA`ic-w|L`hOsgO%QAm`SReFE|Q|3IBPs(?lyK#!YX&YDw zT9&jpl^cTxeUOzEf_DaDC+ImiB}7t%`l@tQemP~JNWo2Ya0qkdZLV%dwK{y@4k$@>; zrKGXwX%wm{PzrHPtdc#!owxQgiw4zLv@KmBtf(b5!LXF;3Qaj!JaU~zIXg%DgK0qQ zoFW>_rA>se_)94+gh~x)TmKFkQA4zQJ@asC$w?T*8}ER%4O|5s7*aZV%}0M ziBpLHXkB_nh#bOW+!#N;Cj6l;P}N%NMKDX0RBouG66^KFDFAXifyv$v*AP1W%BszU zx7{>hCU+F=y`01Wsc5TuHy3u*&! zWev%gnIsM41jpYcHKZO&;Iyi(rLL%>yIRprQo&fLr!=rlU)XZC-UMQ329q5Zw3Vld<&;Gk-hA@%7&X?Piut zlV1cw!?h!Ue-Za-?c1ewk6GKNskW)=*8o($@-#5?f}^K$1OvD`&tr_N)U}VWa6X}E zcZXXlte>GrVXce^A~YM%LHrwn99XozAoO!jtb7sTz9KP_$7t zgdt6oIi*R}F~0;Do+sZB17M7lZ*_6~i27zc>^&UbT4ig@!0WrXs+zqz+;E8mDC4Vr`7)+A#Uv&oVUI^Iv zYgqwZ#GhyfVFwD@K=xG^02Yc{iBL_l=GxGu82FUx&<{KJ?fPQI2126qSSVWN>Q>NV z`&Pp)YXJo*DoWGN(;LTbaAJ?;NpszP(NdbaR*ssBz;S9(2qlAwE}yzPi%ysI-%+tn}3xx(9)-xR5)aeiTJEw&X12WbrTRHVFr8PqlM2|W!17H zL=@`VdZWzt#J=^s>1n`HvI59d06`#*`|YtD@r1Y*JAVh2qB$8eEk{_Zl{8VB){A5j zPQN4v89b#!eSjnB9N?PfyEKXZ!9cli%9r%14&7GD>Jmd0YF@83N{P~y0s&6_gmMn! z4EEz7fpm~x9D|xb+U&M0yK1K`-e>eU9p`K%z!E6o7oHl!i$6p%@-4lnPn6jRaKfn8QPgFNx*oS)83jsnU41L%Lr^iGkU;}z zjt|eAYx5a1D36Ekut>ukmdAU@Pi|T6;;MEnHGfqqSDJ*aYFU*Kl3+)^-REp$WM?FF zPJXgV4Jlif3WoJoxpyT9cqvQM8cY&DPVgcyzyZJsUTe9uH9hrryPB6?%3X0a3WTj- zlqgJ;#{xEy9>)!QUR-!Ilf20#oRRcSt26CwrrxUhO$BR7MzWwmUeHw=1#JVd1AlC0 zj(-66QQ>QLrO`)VWe(p^Z!5QaF1K|wq_}DdN?a(N!IAH_(XoMs7#bga(0(#w9^Mah znc5b`8_%|IGx-2r@eWJK@ZAIA04TlyV?M80>b$d;OpZKpJ+F*$qKjzbPtBJxD4bsYz0b0o4FUa6vnb zjt#(fLJ34V74YrVRHUj2MM9K_Esn=%BWM7O04E?L7C^ocjWt0{MANIRaj=(45Pw%n z0#ZMOlf(#u4(4{kE$(?0^-d9uyrDzRu8yvj-Akn6?ox)R9 zBl(Z(hIz7mgKe__r(kej0g_ijHPIgUN0@8Wg(*%8Y`e2&(bqP;}wSPdWz2hzB z{IxG#ZEJC)?eSE~^IJbMK#}k27;|I`JK}S4R&AGRYJ{b=Eh{~MGbg_O_;X%)2m=RI zdUM7vUV2Ajwb5l`W39K*v?*H`J1?5!Nd{7dIF%)3Fm#Rf2?BV=U2dyW5Ci~0?mDe7 zL8h3Ny211{gqHXAgZRVDReub-P1KqzH9HQKvrBBWQ>7?7371l}oq!vXV;rW>sNP&C zUo;m(@Y;5?0xr9fs=42;J#Ff`n*RXI-lo@H#WTg~M(Z9>X_b&cQ)od-P^kVO0Rw}J z-6P#@%^`GbVfFOEo4j?2EKc zYg}?HFL7nxvv2Kb%71K47miMe-%+HbBQo^Xse<75QmGQ2OoIo%d{^QmI0F9u3Y`=L z`z@tYyM3NNY*m=4ZD-zr-k1*+pi<{M-MK+BpTp5nOyUYg-~|!{?hIgtq2jQq&_Z#a zr|i6a;!`U1Podr*=(=&^726F9mwPqA*K+>=PBUt+w+hyf+J9XsLv1wQ!>H*6w;WPZ zN>nFh01|3lA^g03{ZrwItQUXXUHlbvYsFVjRa4a4XM#SrU$T9Dz*Ny!&}EBt(xG%) zDX{3Ic`iDjwJ6G4Bn=?yGH~`z=)m27B&V^Gk^_J~rkAra*N$$TbaJ7J&aUL{sbn^S zf4qNeIyIQ+TYqUIlBW#;KoQ?u4}SPFs(^Cu*Z4?}L8yDSumXJ?-{pEg!>`(%;8Upg zdOJo-@tM<#yM;@hRV}gn%F`7usK70TAJDbx1~kU|jrcX?nQg5bub|2@$sx;y5WFq+ ztK9l&_FFY<&%PBhCS1RCj_q@NT=M0MH&d}+lWy<0r+-w#l!{4O>0SyeX~;fVL1}sb zXI@sx!MlFhYE(2&^<{}>f2xx z<7HmkL4%FaYR2lUEK+Ek@AVIl_O;ydC)=;!eY&vic2(+SxJH#QGCdQ;1asBb2(w?bR+xn%EvjShqc6`l~>#3c+ z(bbmNt)N1iLedFW!_+q`04|+i#*$7I-avO{Iy5%2xE`Y$Z~q}~;8J`}SK zO{K{qm79I{CL`nCugonss`E*u73H&1v;r1fX@9`lWQ{}t0x*HCbGHXokI`v5R_<*B z{nwVVKU1&PyURlLZLFxKs#rq`^O6))V@i^h2vqIC@3EXRJx~w!xI-qG*R#s~X!|WX zanby*m1;Vaj-+MVu64W9Er;o8?zHYXW1`f8X=7fbKC+}K(-HwgV2~9pbmm+Oq4g^% zg@5t#2wv5oO+#vJ)@iB@@oJVyf-4IwWW%In=UyP-^{;ucb<3Q1Bl!QcHc zPae(@G~^zNnf9LeNn^*afV|(*3k|t1X8R&jn!0jjDp|WxHsXyaJ%vp=pQerqmf1g) zV+_|FNYRm>hf(n#Rk9}n?XEaD{twN6I)5x>+l!Rqt%lBr8}kwtl9E0|at!Sr^M*5D z4$y5Iw6YUj7r%TPc&6}8;lHFboi(*)yOVc1qMEGFd9Jg#+O8GFFr%$ zWs|738nL7l`FCV*`V&8=ICr(#C^X*+&zG}xrN@${t`tthog%3VN~CTK9yjB-!M4H^ zg~@tl;2WkrJzLwdI#AmV1bCZqq3W2@g2a4mh=;3sIA? zQ3_tQwl^}eNE`#vJ=5=NfB;`4b$?rr0uKKGXjsa%UNy6lx*0hGjmKx5MWls^gr^KI7`mtxNs(UWdWp19@Db}FYR?EzQ-YXwh5m1i#AoXRn}D0!V^tK%9geKp*x>%Xu^YC zE4H^MpaRMw=ETj;G&-K2HR*p09ufMPWzLrFsrZ7f@}9P<&$MNPJ%6cwcuDfzs40+y zpu&S-l1e~2V1wxVH^Sr(6HAKVb-!P`UUy&OVazc@ka;~m3%T_JrI{0~*?qjD)Vf-W zm9Z6xs%@t09H;zHl_e%xQb~ff?5PrdK#tt-vRL+!*z$UMt~^t|H``4ga6bM}T`=fp zNct6WscWYBNYGY8jDM=)y4AT-q^PB33UXm+l%@e2M{^{|G|Y-WWPbLpNu-(n+ljA` z_a`~~r#&U=O#<4_JwLPEY8B0GMYSn;V3h71Kud{KcbWNOgbj1SEwDa_gwAgVC2}0; z_5i0qSigF7Quy1oSwj1Fu((!3W8xE5!p9I0>^MEASLua2M#I6cs%L-VU&$6eO21(6 zIn=DPpRBpg#nz0zs?5C0CeSPFFAs+ePnJVSSp=m-uXDQ2qa@)?(oV;=O9r^GYaWW< zEK)+~@;6=40Oy?7I9`gVyLED|y?LjseOjo^_rx&OKi)MIenMJd2?oQfQ0tqCU2ed%j z>y0jH#c-AbvwW|pf^#!$t*4No=Ok)Tgpf|;`|M_T?cW0Cn2jjFT#v4xLyo%Q96uLM zQkR--1d;-P3P?Kk3l;qD8jt)mUR+pB*MCJdR}D|z4@7!&@=xp^2p09`kIau(W^D*!(mml(yR0L=vsQOb$#> zw)nQa&%r?UhKn5+HN4!-&DA2ADW5bcw15E+2Qj>DAEe`ZBMli`NuRv>p_sY5QuCBL z)P*3D=9L*v@R&cMe|#B)0d%sp+m6wKzO|`Kv=lp9mz;Ii6yvT9BoxUCj>L_&z(_6l z6cx3kHzt4iN0mQPg8N~e9|*M+k*P&q^YoJk+60_uAOl{hyz$T|>m5yV6mpPWX@aSD z_|i6jL_vTC+i%Bw69HqL*r*5~XDS9+X|@GQkXu~BR8`2_k+#Qa6Z&ABY|;_{MeC-h zu0q?^+MRFmppr^>Dm!op1Lqsze$!fSqL{wQAlZNTH=iqT8PJ7l*)Al35GFyHgWrDG zz249YR^YMlD=fQD@kl{!Dc0kQ^e@z89l0AB9R9ey^g&gykVUOxqMay3Rd5Sw^r2}S z2`7Mg8w03&;H(}3lt30y1iNj~Pg3(_B@i1tg=#y<;QmpC;rR%tfkkU>(M*!^mg0P> zooRn|r7%d>u#Wrg365k&Be@mZqNX$ex!wDwooLHdwVAJ>nfXbgeyw$t8GgC&JcX@l zTKuIbK?JCsB!VU+jB<54GWkhp1fKr@v0Z32fw9wx9`CzKa}SD77gk0n?Ah-m)fzfF zfEK0OTvINzCt{}MB1A&L*uWzk=e9`27Lb1y_~eR1VZf57vH0`7S}!PF>n$hYn?osW zntI2Q<4Ou&nFUMrg(RSWK!Ow`f(S`;BdT!{AIgra`$KOJN*qv+;Cf<=G2ZUb7Kh>UHe8Z_6+#`Yo@KcgqCVoS8Sni2u*)d z-APCwDZmPV&}CbaCP9rO=0c>gi?(s7zSSv7XUq=N zr3flnL4~VJC{CbBJcQ;z{)?MjZ zk^P>dt)sQAbivhCvbx6>LNy^Ei9+|-3EB?*FDFr~ z(vZ)KYTf^4Ih}Iwvkk!sJG^F+C?RbmsD;|rDjIar1@YIzrOzfJV5yG+IQ6n z58{xHWi0N?N`9uw`bi-~Gh=^rv}9~GC;OmK>oY$izI={r&lP~=z{6bpGQum zL?J=B0y{>nxId;A*PB8D5pODi^`&nzd&iWP(q>45yzF@XxG+IhNa1hyo4QaOZKOn> zFuSk@OuJ-VRw=SI_w}Mt$tMg8x2?IzR^ZVepj-d~j54{GOszCDBQBhEo zp(LsFIIX@!N=XB4fH63-=X44elfX-;>nYy2rNdI~Kv(1;$3j~IHy{np+!G&MFq5@F z^MIVx)YLyxw*`NsyxW6MmYNkgCP9F&eWnNmbA$@w)mwnV1&f7kYq42tsUAym0~XXG zM)0$*fzH7v>wq%9~}hFefkFaaZu-otn}Sa3X?s&IL3 zQu>;krBkVOO_qj}Eh^-IrSlR(If)TF9@}A!Z~+eG@~(du6u6Zo3TY7vIzdtH09g?- zJAnsjz>p4AS?Ey|>aV0y%|$cbw!al*K@q}?9mMQN9P_rtWGiW|O6B?CbQ!m)_ba<~ z47Wn%O4iboRjDPtDFBj@uz@kK9r(wt&<91OYfm-Xs`DDc*>%n!;?b13L8j?xFZ6Z( zYYf%H&j)`cB^rq%n26KA8yWdI(-7jqGD5b(14G9|+V7IutTOWH$_vR|F1d}8Wb6bJ zAeC@`Od-05G|;ru4}Ll%cg)XexF)8ajptYmQXOy8Fd_7(eE|Mq2?Ksa6ETN2H`uv+Ob&i01)iGBVsw!BoNi8^1qPmKp8dyL`I+K3{%pLchB1GeGjJ2huVBK!MJ?XAr zsinWE>YCeuWtJ2arMO0?)7YdD8=bcseE7nokIMiKR^2pydG{Zhyyfc!hL)-7^iZgw zOG=tc@A}(O0%S}c+dz@LV+@aRp=+qf8q31XRYTUgw6=>|X?IFchr&bzi2@Z8O#N_e zYe;|PS@uo_RIXNBR??J!S#_|jD@(qWfOtP54}aSMOdg>!oZz9UyB1kDMvK*HEs(Z~ z^rUbH%=hO8+9z)c#76Q~rr&T~p+%;bPG6GhRPLhIr2-@8_4!T-&S-afLL;L@tu0jd zt95Fht1VQ~g{dOGqexR`AOd*#`^nhti06Mb&BhO99ke>}N?O#|-*KUFq+5;{@|UGh zb~}8;?e+TNMkE(pDdx4L0JW^96m)DZmCBR=3OuzdUz;X&S0O|gj(=K_DNV*lTKvL!4}3Mw{~}Ewfl1b!s7W!{Q)?B}9LE zxQ&S)z9_e-R3>QUZ&jNpmqk%fl{B{4)}1c2N|K?rl!)JG6WIKQ0LDQBx))B?f_fk> z*^=LM%bsmL0#{Oo!hE-v0VJK&4*-ECV{-uQf{YOG7HM?>@nB^QXsdMjPEs`2oWrGQ zTeTWOw4I8SHU>t}B+0`G+G*S+M)QA*=!u}Zp*5am%A~2fN`)+@)*znY3XQfZS38}g z;7;21diPqRm4lOk*;m@kcPoWbU3@;Y6lwT%gsE^g0I4Jq>6!07`{PEy(N?+6)IHC$ zb=eB4io1=*q53+G@XGB-Q{1KZhd0Jt8#(Rr_HOF_qFI`4NXx0`C`aD5Im!iSV9NChepJMY>c znf`bktOCHoBQ&mXE^$jJ3r66!+;zaRfR||k;2~p`1qlK`ksBTG=M%739nzTZXr@1T z(%h?Dq)RDKLuzRba#69^_l|!)qkeFQFn|e8Gj24AV!0KT72A~9bqgicl_~<%gosI= zKmkS%CyoXHov*$V1Iwe^(M3m6-GSFGE!-XQDp*-l9+-@FP&|Cy#73k?tr<_Ngv)6)K=Z_DWWZ1PYgfM`fsU z2#t>hcRx%FZEk<^9&^XpM)!LoZycy9?-e&HH=L-qr$Io}r0nLc{U?$L;7Euh7{df1 zjucfoLiXe+ri#7fB-1*Agzn-NKv{re+?hK^1RNgMG;)?Gu65$E+WOv^CX$Mc_URhT zG|syF4*H);P_mGsVm}b4m=XZSc_IPLB>X!j$01=jTuy(Xt7Sq4nx;Wg)45WoOvxO^ z{`0qK!y6MjBQm)4So^xz`bwHwVN!OfR@?9a+~E9%_E+XQ`B+trKbfagsBFrUQ8G_& z%dqdh1ISR$<@el$DghNQi6EVlU~M92x9$7lzYN~$ej(s+l-#;om#=G6mupIze7ZwV zQZy3c$7O#?PLh5~20hLvk?TtQ+ZQd?!NZ)OyJAcT+ouY%HVAX0dX4kVm&tI^L zpT!~5a;VCh#&vXA~>^g+y*l`Psv{{S;=c^$eY+=zua z@Xvpsx~Pv*$v))cIg5F-)fbv;`>Q=SOmkfgIYW8g%TuHhN#0f-?^Eq>HSso-GTX~qT8zh36kAX6t6K#q)e3~D&fCO^uO~DDGceoKA9wd#Dx0bI zi&Cz189x17(~X5FGkB$PPOUlsS`cT0?HqrcS%lpn6Ii?YBrJGl%hs#%^KbtED%FwO zqoftxD(p6Eg;6B#N}X_#zT^&jVuV4w1Y%-E5}em{AFkF08lvgnOD=bJTfH$uaB+EV zofPy{GVKPX8!Q_FOHI9UR2Hbe2pJzvdf~>T=apMP*AOt-3mY ziCsl5imxW8%Tj5^;dADq5}<#roBn)2jMra^TOH>do)wd>UKzSG;`5~6`A^qusrRM1 zi^ zn3$?kJ_k4EDr?0pDQ#mylT7t21wcs!%|rt!DV!T>uI|TQu#opS8mfQyU-DOS>Suvp z2${mIo1M?WUrM}(l#h#fzL(H>^-|!}3ymR_0#ml2WF5u@%oz=#_wY~>*84=CilJwJ z27hIjOzchO8#jWS+`yqrOnA;tSPMB_w2IoNR* zg>RN(&7_LykK7N{RP%rLgHEsXJ37$jj{^QUdYPZHZP5-U;gPeRbW$&Qeb`c)eVV$Z z(K0qO)42r&m9`g9=m0{>f|39bWbYDr^v|u0BfbWGdZvG|kBlE^9w^Ztvh#BM z6Md!i8SR|I;v>Tjb+_9uH!8~9$(pRW9lL^Cam2e&R?Bw1Xg*`aBm^X&1xNr09HFMt zx=p3T4oUw2mA%@@L`A>{ICK;jDC*8jx>M9WP15fYojdrNKf|xIU+EvUT$^xz3fir2 zN)_8lQg;~9ABTT2#Q9PJJx<@hn$GQXfuqcfgX!&lpTgpKtE}Bm$hX&W#%r==+P9iQ z6kKD=bqh+86qN@lohULRf@9=o2z*Y7#iZnV+R(|wj1B`IB+IA0b$2-Cx=ghGU!$OU ztzKJIDXCaaxR99UR740nk_UW1^1+2iY09|XI{kg=_3?lFw|c6)(LGF*tUFC`SC;E% zhZ|P8Qe$}LBt(KSV^ZK~lWGR;0Q6Vvo8kkhm*&s*SF1NS!)!L{+C})4p$i(4N>#Yn z&ihBt8e6H8p+NRDWoezfPW2xsiZ=5Ge81E=aC^z2rlGAbE!CKWh&&QN9^~!c1a$}f zMJHf&*B*bWxz!&Q8N;U4tlIMp#`jfJ`V_FkcXEvhNz*Dj?Wip>0S8Hm5KJ1dILbE1 zjIMuMCl=oY*SYy~K=_mQ@l5{!5z@LMKqUMX%E|V5_mTk0wu;NrdD%JUvLEcnJ?lIPfO#~vMXddC8@9|u@ry;POfAqi#~ZF&?50tnoZ?qEz~P+<-AS&m)C6_Y6CTUF+fir4F!Z51A-!)*DA zQG=v8{zJCF$=)``DPH!tis5b2=~(a_P6~ffne5f}i=(z$I#j;u(1Yh8y&h;FPd&f@ zNh6MNsuCn-VEs`Q2pI2fw1d)U=Q6Y4T!2`Og=G)TC=%%KrDfBGVq|B@) z00;b|^L=L;7~EM|^%9XmsJl(V=JgNXkJ*Jv($a-0Qb{OW0tqq1eRhcNfN>l4-2|37 z<-3Sf`^Ia{6}Kc@7hhC`DFuI}wA%E5ne`BmVD}OP$Q{NtHIar9g1PUWcRs-))xRkw z@l@Dp;^NCKsmdyshXkagN#$IV5h6J~u}I)O7fVa#5l1P~m|a~n55GuMutEt)f)xj} zNgJ!3zIYIGL2W=SMz-gn*MLK+3vbb>O_csc0(c;$MtGgD&Jqq}u+s~)xN5R)b5v@DXFi0 zS{olFqzzh!`J@OS3~Yt=#{zOXE_Cqik**CnmRe z9pZbzk%;->Xa@3tX=i_sni%e&ahGigdXk|^523IYjU=T1018N+MEh=M>wzBIuc8OE z$6)dnlyK2gju%NuPMJI_i61U`{Y>$1%_R#9cGTM}k3OKS0i_@vazNgA=3;(aoDR}X z0=uD=np&2rgF(bPbTCqdYLXIlPNN$iRPEma_7ilYQ3_kMmUe&Amde!Qi&#sNG=u}W zi2ndL8{u0+Ne+JPt*n?v`p>m8{X# z+gM3ftt+f$4-gLVsX`)2A52*>y!&7p?g#F)vS$XX2%H@5{tF09mPdbi?yK_idK?+H2 zC)AKal#LQVi6qYW;CP;javCG588?O6@a;??#m}%#2kg5_vS-7uOBM8$VbZNNHtMfA z2_gvqX-NelM*DNWe0j3_Imf>X(TH8}Q#YCOrbKOa>PzL#h8$2>W~PNLf+x~ccb&J~ z{N#V)HW;PJ0{se`-orr;Q`D@=`Vy2@x~Ci?%XYEFsRW3SHvk9&ZYLM`Sc0!L$|rM$ z{l{IRtD>h*subNYN_CUT8|gcV-bc(}ObloQ6%3Mf2#O1GFYK+>?7Blqf#%$48q$5r zR-k*403YHWU8xr!Qk+G=&Ir%GzCrEohaz$%ZR-`L{+01{f$V*Ut&Y=FLBO>0)_(?@t> zrPL@&SyfRIc@kJXhhjIuekfwWAAa;MiN}J5Jv+WIkxx{ITP?11y35K6nAl1Nz(#-j zbBpuCxayV|;3%k+@hT2)?As5wW>SC{70I;O}&E_tpfOi239-Twe=0c@w7CeuK%!V$`x zsF1HYH(Gbvk1)4wK3cdj>UK$y#BN7!0d16auYdMb*0hY8DmN}ULG`G=NmPIPicjGe z)Ef{$Frs86^8^_j3Eu^_Pxw}Ld)AL!a?@?8RQBdTY>zofuVkqNa72QAhST!J`DeNU z8+i+6u8uocs#|36RP{l8r-2$pc zvJ$_HQIk8J5CP|62!L>2$vmKFBq=Kuf2vRa05dJ_G=%^H+;j+z#L46kV102{8+j@{ zk1h6BHF}D(F5X(A`1ZWl8I%txNuGTxsmK~>l$nm*?B_&WSplLiW`mA%voh+zAQt#OKAerkB($Tx)6n0JGJmwSdD~RJ9^fuw-cj z?0N6BcEuMpuHQhEQAH$;^4v(Eifbm=DbS|?PPhqEes86~2Kxw&_v4MD0p`f>z7xL% z19M4*8mxAPJf^MmS~Pw}*c)^HZNQPnEcuT)CevFR8Y!ZOxe0$r##j|EDvrxbtN4#^Ar=ZPNMp8NBP_jN$vX+Y)viBy`Jr3p(;1c!hs)=c;2Io>crGkmBe z0lX~JTs2f7%Ibe)(}gxPG_K>aiR>iv$?c0VfG8mo=8h4HtY_B3=^H`G? z`^=tB7qIf7lKEV_Ip5uW`tzu~xb-n`8aj5}1t9?XKu>jSN9sPf>Ol|;7|&I~)k`Fj zle))1o@DxzU#XKoxBmbYEte?NOcIcNP3t>sHrjr1I7EMg%XReo=(Xux<~M2Qr~IRr zO;u)goriCf$rX+PMx85IT7?AhTV%$c#*D^J5Pq%emGrw=JE2TvYi$l!dt z4n*+ALR^0?*FI_7$5v}q;*=YHFK zunfQig&g7y0;09MOe$SfzKzBZN8+ioq@aWA160o)yKVBrLm5JJ&r zSZNHbA?Dj~1$Wqp08Y^cf1W9U?iINS0~lJ=T`1h5_}a!HZXhyNf~6#^{{RY1Ovdmh zVH|&Ayr(tWM@;-a`=ECKsj9q%GSU(Xo~lz zc>LmsWh8ds2pbKE+h7i92RJF1 zaK=zB*UKrWscj`rDEUsh00l!)Jjf?w>KJHX27+2KG`9q>9=Fq|Eh`0OPRMa5a;AUG z?WFG`a3mZFb8kO>^hJcW!quyTR7_|!O;k4eVJs!Wl>%ggJIUOc5x9&(-QJXg0Zg{2 z>uO6%saq}-0=HaO3ijp+8*j|*-vT!@acO~|p`J8VRZ94ZgrSOtQlE*ZfL8;V94bd9 zb^z~&jm>DGkIz%lc2du{P}s=YWF6qfG>IDeCjl+Zpn9*Z`I^0SVyo_#KuoskB|4E2Gr@mO-u&`7 zoK(7a_g3XikcQnN(OL0tHkzAr&7c65stQM@PXK~SOvgJJ!c2R3b*LR@Ap({tYwO+n z-A%Ilgu>BM4updeQ@}jPfPP)@`z&X(k?upZ6P{Mo$SoR!sb%(@N?bu>M#LCWbwrW` z@dSI~pPKAd*3>=Xxu(+NUSfZoZm1;+Njy+qNp`xny|p`B{;!EDQ_U$Lq!M)y1Z)JvcKUx|t!NwyP*@a7 znYy(k=laKNUTIxXSv3hz(zY9v>M{ugexUER3a=`vhE#~G4Ym-Pa5SgV zpt573`ZF|mr&{7Lvs#wvzyjn zy1i^=)CJp{c9||eQjUM?DJn=pVqlXem;wpq0{I+BpgMZ3&XJKc3bWR_dVA6JUKwsL zOLUz?WkC)J4%*eF3g#3-p+iYLNbQ0#O+uVLNBK(pOjdn^^9!M~pFD14e=UkH5e-z) zG=#FyYSyrZ8%P=f^z4wGw%B%zXKt5QBh9!UN}{woS*2quY4?BM?5q@CCp>-H+im7L zooK2-FxQ_6D<81iziI6_v!~PpTS2c>V^O9e!6V`Q(s+R?sJ^u-M}7!eE0fa!!@7$ORn)h5NY1;WtMOn;!QMv(i$2%hMMYEtn-(SPX&2% zEZuXaVq+&M))@~_)6^PtCC9ZTw$b?%l&4ydBS}OFAc@DzbrHS@i^$=99uej|HqX!I zzaoD+sp5Afbsr|?9Ic zUoNjuz{iqry6d;fia_?@kH3oZM^1cS_=xBhVr+Cvs#oT$^e#G^Wj%W+TLG6e6_0^+ zPO{NiLNx~9pDY>J0j?@vb|&Bo9$=uS#WOil&*a!w>wXJT{>&? zVr_KlMKNw+OrofzOh`Vk%E?dz(oA3^jrbt&h)BW+q<391zFF}-om%QfWzWx8vjDfI zlBVU9){10THiZy{KHG^}Tv|aX3jrrg0!Rsfk6SbrHi8l)i+SdWRLehwUb0Z;iY0&L zPZ)X4`*^BpHB=V*$6BdA{-IpdeAX;|mG+HoHKKZGuS>c4-9ew$p{w!ijs^^-PG-e?z7MVLBcL~g7WP_zY= zvRQ7biQuB2!F`}i%1ep$5p>SHw}nlDCfF|n-~8X~s7dj=(cYSx_WG~UFA^C|HS|hh z#=3>l`>V~e7X-Paqhd6~`%Wa9rpP^@1$F=`Zk^3O%dY)Reu+0q{?VR^^x}W{Vyx+x zUa$8yTuW4!7cDs^_K`>?8(Zy~KP;y}h(2M~b^r}UEpu=KffS9<$^ozey5uXL+L51p z6!_%uU3bj3yq#Z}y0?_A?YWV&E=TFL?Kcn->O9J7H^88ryk`?Nn8;c8C>?Br-s5Lm^s`G{Ca;ZI@{P<&QIyr`1r5V zD<(>$_*dP{FRr;t)#b9z#Rwun)L~OPwmWf;MCsj)m_2>#pQq7=gXU)c07b3ir`b*W zO=FfzlkL>CPFC2cC20zYB*2nLBu~$cv2p4rYsUPKlBx81a@TDn8tQHm5 zRZ}HlY!x@U(;$Dr1Wv${B1z+MhcDzK!dT`c=_W;;sJKd5|-^55tm&lY)_gU6=_P4TtF-qoCi_f3Eoe)X***))K$WK ztcAL*^uHXe$8xy3)5;{Uqyn-}uuk#^GItXgxZdD40fm1=4cp#PH@0jQwd#4w)l>(X zON*v$%_%|9M96|Y;K#l!IrV|ZRjtg^5(zhBgcZdpZtqP?NHns_P~V=CqO>PSP*Ir& zeYWlU;@WAXo=VLv7lyQ8C5>BZ=`Qt`3POdnNhMA@6Qq%(4hHiFl0Eyh$j8Rko>p@i zW1Q}X?vsD23$xYKi+1T)>uO6x5eM+lW;FbxxDzYI|0~%fnoq>1JDj*5=jRfMGFttZsyun0KQu2_LO;O$k+eAjhjwAQR zV#jURa2BC6SpDtE^;6z+&F3&z{m6y1ni_@=mcoBWrNu_2C>}wbpl$n{M#9#&cTlPN z*(H9=07o6vHLYB8H^V6pt)^LHOIk@DV)qMFDmR%C#Ba_adtwAtlgf_{mb1cVW2mxF zKT|&5+gA#ZF`-)zVYw6C;#U;yul=DmNd0HvKH9P;brM zX$vJF5R~>avaT~;UOvV+TTc%sFB#hzC&>sFl=Qf8|g!NrfQYcUaD3ArBO-+O4Qj3CKP`o zedmA&%LdnU?y5%Dw0bSGRJCqoyGc&%BA;z*^BdU-6Y5NIPs`r`3EXP!6t(4pR)ouF zwcV=fSY2gHO!;BtC2a(#tP)}r0RxT1a&W>+MfFN(YmZ=&=RAu=SLR$O?hX_>5W1pH zqJydw-!KG01VNq7G($a5BP%reX2^ec0;-pLEzDeg6{=OFw3rG{r4B3tB#|U-q)!CN z#+c<`ZIZdt>E0heAltNEtLa*-YLVi!B&k}O(i}j7c;*iBH$C>j?_hS@No+DbwgJM5 z(^i7pOG8O=Wj=SBcT9Ru@+ahEV&rODZwI2C`d=5F+*DW4{p)f4TTv8oip@T z^NbL(&_^m7X(OV`^o1;`r7a$l!k4~+0n#Jp0QR4*C`pwn)~>Bp6%48HRI;5YbeKB1 zN=$7rw4e0FoC8T)NjY1JqKbca9dBi=V6V$Nqiy4PJMMkHm`JR@0E40HAd>#LRut-n@{KLHaqjdANQ%EYg$OM zQO4^aDLR4iY}pM}C9J7QbuB6ItsyBXkfZJ;L_m$>7opf@r#ihmrp|v{*sM1CTCHVP z{yNaj9c#s+>7{2MQVy~@xF1Ux=dYj2t z!y=i1sU}oCNizpvqs)SSc*ziGm=T`2PnqY-KA5C_TeRIAs71boD_W{sY^I$Kl#q`k zC25ri1d>T0z=^`O62yPjmm0_Ogvg?FjtywL{u8@@g?qh4ny%GLm?>%|O&z|KPB^Cd zljeb?AgVW&a!%c`zxs+M$k!Iva%=Se0EMi01N^4~@#sIlPpZD;4+>eo;9On#Y+9bD ztQAzRDde;p)Tv1+SE*`(p&)_ZzBzi&9f9uxFi0YoM@QjLYdwFW0lOc4PwKmNPqYlA z^G`i?t*B*$B|iw7^s>tIOoCDggD^k>M+Y8mc|7cZ0X(qaF=d(C1~}ngdjNOXmMr$NY-@xzI+|_=L8%NN>{XntF-K^ zQV~?}AHt%7G>>t_9r1P)Hc-t_&{G9IT5+`RsH(Uo55DAXLGRn=izNsZg|oJsdfC@P z;(`h!DIR~lxA!M`+z8v}hzaVaMG8|^2jH}&HdK(N)HSG$fG{Qu_98YsVmZomSa97b zR$lwH)T|H|A6ArsF%o7EY5k)RIizx|ISRX#a~kdMSX9Ufg6dmQ^b^Sm6EWQL-;7?+ zatgBT#|t#|Ez_Y6+36lgTf4d#Qgr}#hyan_v5|lE#SvnPgc4Nr*Q>-JIcW|oD5bR` zjb&W(>se3eM1zX*nloyHTyUml&75xFvdt6pr3xckwJ1u#* zd8B{Rts*?twzm*|V|DNPgX|*-cZfpaR8#)|0XJIuq8HM%A(f)+`z$!50+RJZs{IK{ zq=?hUzW4*Hcltsm=%{3Y^-G<}Sz3`rRXME=C(^Yv)gf9z8~|K$LD+5wzSto=r-uDd z9V|m7$KVqhOBPvu9(}VfR$Pc!N&;z8q=kPSjE~9>17RceI8l~cqUuH>glBE6R9SN% zb+%}7jYYi;DprLygaH8R5Fin}!Ql481DnZpq1${mg2&x`MRjRtC1^rG(d%uAld=4; zH=om-M@a=JVt+uGe`B*HOG!{Pi(ZXN4O|vVexxTzfxHqn?Sy%(7nAZ#FiL9+jaGjq z*Qpn3OIWy7gQc+AyMa$b;;Tj8+^U5(+C!)uewtqpHg_ z^pvDgI{QtmwluARnIo{$cY-9Hx!!SPSi%Q9U0Rt}8&fIJ~XZLBh+8kdy=P#h$X36MG1 z^Ejrp`>5yFuv#Ceg{<5S5!1O<>YT%KxYGyf+;t0OVCc{i<8YxM&jx=$KR@Wrfv)ds zER)G2L3c%fwW-IH>-yh955u_|JQcD@8`ZYz%DRcib*7#jHnrHH7irhtI2(_5o5re_| z!lCKPng0O9p!k-V1q`9{2{)brbVVB$nlCNnb#(F?2!K65pk5 zG|*PGo&2BmcjQ!#L3LXM)+)lODX>fj#6W0Su9jNm8&OHO}1>H$U}<%@zV3+qqFOaH^!VmMQApr7b)XQtE;9g?@CNB!W+* z@$-!J^NI}(19GBEjufp_($>^4 z5m7&coer%7Nk4z(SGn!Z7fxtK3vFoSJLb97HBh8H5>C!2l%S9ZPhtTFw2#vkT-|{U zSyQXy6H2OwT?wrPG7>ch0#pPZcT#tcuM>rWE{6!*328k-h4&w+q*{{GWhGmHy+}^M zAn^cB!2XBd4R5mKt2DKvu2o~qw@TDiG@uexy#+gw5j%gLL64Wd1 zqT5LIlgdc*Dgh{|Or;70%mW~9J%Qhx6j1MQlK34F7nXw62`yJvrk0wRDQ&Pn_%g_J zD9q{p5S^w*{OmA)kXi57g$X3kA0;AGr6~wsnp|f{ZAx=xg?9B%>^MJM4+8oXTvwv{ z40N{v51qmVT#`N$#u_lZD=i8rMgry5aX+OLJbqXN4MSZI05@ zxk*;qbb{N7Qo=zK%+BI}oPL&C@Z(`k&DtuH2B}MGU0UkY6xjhuWgN_att#Y6hzIF} zmtGTgkkqcfYPsWPB{iZ6OSK9qcWuE@ z;XwY7cEiKi(t4$x#T8p_a-xAJ?$=c1BrPj;m^kEepoM$Ej^aOjC6euV&JW2k!*fPB z`TP{rpLdEi+uo;fw@Y)Xo(b*vY9UgUNdtdyIElqOd3bm@`^sPp*|)0X{v|U*G@UUv z(%Qq<8-gi3#{!_XpT%=>Hz1`cF)^w)#>O?2MLWZAcMxkR>N+YN7)M>IlN4hM@wBD$e0 zA^Me6A%rLeIEIv<$X3KFXy>sILGExHTXZ@7QG3vhCZ^c8f}KW}6ai_JLvAKYq)d>m zH!uMa?T3=rf%a7kYFE^oeSU7p*POjgPf_s|E%|9ftb~ndR<6X2%2Fmb8~cCbJdy8V z0FEs&k`VCj%gU7*Cn?rhp3Bcz5{i12mAuPtDWw+#?yV#$M38aF^8v!@hB#NE%NAB_ zHd=ZsO4i*yHA!2BsQJqP%#BOj35~|!ZHBf$0y4sKg{7@c5|76rNh)AU0RR#^{=#;{ zSu0DaB2CR1u#IZ(ZDpS>o!x)jQ~;&yRw?wO(3aCY|*p z1E_?+1k985p8d(f1WY{w==shI6_;C+$PKw$<~1<1mecxe8*PC6JYd)qtIv>sbCdkVziw57$k;!yZ00!b&-H}{do zFpma>&amEv~7uciJZlX}NbbqUqwzG4iWy@_MGV|4IY&h1m3Wt=Y zTWARyigf`n2{_}*1acMvO%g7bQZv1Q#)W`>YSY&5vVW^xAbFY|iujwbJ!`t#DJdze z+4(;SUYhcht;Q)FZKWaOtqNOfKtjW0g$P2Fs@Ws<#?ma12dO52L}U?vvC=x|0#Bd< z$xHkl{g?hNJXqwrwrt8?EwXN3rLo;vp>eCrHS1IEEw4C~c`Yauq!0{|B#6hL@&5qn zjaPw99CJ#?7lQ9*@k9#Cd-WK?^WFvhPo?qrA1qM0fu_B!wt3DDIN;wQdRHNRhW;XK zw~A`4=k}A>l9!NEQAuup$Q3nEm8VG(^UaMw84?d2_s0r2H4qz#!KaHE{X*_}(Ye0U zNga*{%pciXyj4_IeU=^psGQq-cJsmAJ-+F5a8QiV)uF$OyhV;Fp=4vR_S2!rA(?&H)(&6`&H zH5DpLkEXrE6o3qWC9Xo$R3aomk|qGe3_MbRH=HMRnf1_m?#Jb)7%H2`&T|sSWON&Wy0ccT42~Z>$ zCNV@F>CFMacm5aUC)%z50Eg4TS4et!UDp2q4;@{p=`Blt9zvCuGgV8M48FG?bh5)K zsZmv3Bab)~5TEZd8gWG}w%XiJHdzZMY!NiQ=Q~AVqp2o`LsybP>`3cq^u~DKG>#2m z#hc5pXfy&%SlmSh+j%4d`3$_rocdjvE;%ajwbE8wYTcx`(s`1Qq$s6H_F860JAxpM zu--=$mt~}XfK(MX{F?ehuH~v7W=gbBr2ucC{{RlaaA%xa4@5K9hMsg*DM@HH-h-k5Kppq)f2IKPp&%x`A?Y7fyiRA9`f<`* zL3kvGEA9`Hih5T60QxJ=N2Mcp8T+$EJr*7-LTy<0W%lGs}yL z=^1{R_v}ihyWEjiQtO1N@ZxkKK&k>(p5H&^jPnxNeUU*rCYMF+8zRn1yXI zC)#nPx^}tSj|e8zHV|0TpV1vpm}>5*YTtKsEiV9ttICA94+Qo+4{p(fmH=!chGw~x z?36W|Eh^`7sWo>rp-enN)P`ibuHWT>$c^KFnZq9HXu?3!`H~xTXXcq*^7UG-MWI`cA0B`5{H#1dqx zLD+IJp^o-Tx-Mp>2Sp%nC-y`6H56_%el^9VwFMAKPy~Uo3XfDqz@5IhygKl+9n2$t zDTR*JU7BbSQr$Xyhg?zhh*DxmAv}XJAnnh5E=rBb(Z?*{8o@$ctTzi?LHK06q&}rB zw4n+-D40|U8yWV)V|!dPSVJUEh~psxUu>yvnQcDPO*=cG#|{+mKM&2(y+9Z0lY+i13k7p`}<;~6m0-?^iM6-E4;e(xom`a^&Vw9 zH6!qxBTS`Tfk=pfBYtrV$v2LL-0+5~*|#%S5Rl2(s3!L+Sz-mm#~-A?6GcG{+1 zr~ItFq_nkeTw0FCK|2WCL7Zo3YsneH=(1^JXs`&cm%Sfrsb#trYHyUyR@1HRK+~+N zLgosLK@mJo`~5HuvvtaFeY9SGLMGQzi!$B0QL^ILVZ=1|l`}GZTSzI~>}O$$aNH>J znZIDZKto;bmnJE08KS{YPf+iWUTF^^5Ld}i1nj6xL4hW4akY*uW3V_>=Q+{1vn469 z=X%?VOQL;*k0l}BF)4{&%TiKCz?mXqU=DEkbm5gpm7XacZy)lep{2ZkQBYRjY>H&Q z9F~K~I^aN10PIx&jfe(07)>{D4&fJcM~b@o$K*S;o?T&?Qsz8fx~S2~qApp>bB=0FHSxgE&c=eRtKQ(14IsJ^17 zW|LMtoWX7tbm1bkrj%)a&>c{Yc_-X<;(mAv+I13Y zq^oYWtNS~aXz7J@G7D^IGTUh&qynjlu;*4bvS}Yc@UY1YZE1G|s{a7QHF3E*mZ;RC+d(P_Y>=&r zxdVN_QMkkQmau1)h>gxT;cZDzP4UgpCG?ajYH_87>6FRaZbsyAM;He(=b4%tC zQmUlTRH-FSsOnOG)9EQ!9Uv@QLVQsl2o@)TT&LCKmq(eU$4&q z=7(|7712|+!>oA~EV{LWQ}~EeeyER3?d`mumpEB%^#WDu`8MI4tdAAdy4q0x0FzNf$O?7j2}oL0OaVN|g9HKJ9(z|f(?|f$EFR0yX*6$^ zGGBmBM^$!zd&3r6t+y_+{cE;c%SuXGak{4*eWwCuL~M7Hxg=^LBN&_GI)=WO;(h!r z=fiYGnP?r4Ri!^gI&R0AMw-VSVd0_nn`O2VspJ!-N+*Ld2;yS^{{R%#nj-{!QpSf& z&{_rxvE|&U)7-k+6KBd)YH=wAZ&a;Mtd!3FsoDsC9ro{xQ|h&I{&y4fA4R4ZwD5{! zK>PKyXY|Fn zM!J@w-$p@nDMaoT5+Fw-o+QT@p3;YK;Vh)i88YFR9?KNh1un6dl-rFhkK#`t6S4if zAJy-MX2c#_K&1)de5Nq(Xmm$D^|_jZM%6`sIH(AfGN;>1icbEhJAnY1h>18`SmG|Q znrWwPi&U)9*1B6&Ej?X=%9`Ic;-=Or2|`Or5>yIy1f7#4lM@^5(2K*}C5JkIA63oN zc!OdCV7oQ&S6rudwdX5i7aMg)mWL2L)RgM-$pDZ^AnZGV^MQ_Z(Y_a!ou)Tpwmlug@Lx`3tA&81|j-1Cd`W*juC@?s}00V$}l*;@r^yRfBi0ZtbZk@}5}-GDK+GzlNu z2}U@F1QaD*lG5VBs&0u<2?7zTbG!|IqwCuY5)wEQMe(>uPnDrd6C4l9KVo}fMnE%47y;_1X2EGwhngu%Rjj{8pf zR1;2+r8xCV?YS|)2?ha^$s#?D6#Y$$S{bFyaICaBb1Kl;+jYwK*Hm^aI^tB6E3q07 z2_61k=NO$d#m9rqC=7@~lg)5(*#kun{<;9%dvzjdE$i@zuX-~0uCwbriC%gAB6 zy2LZ30Z3I_kQJmQO3|b!B%Q)Uzz|6?aU13lZlY5*vay9dt1BD(p^6$BSJvPF{B?7o zAQE7N1xZxNgZko~FkrV8ZGgz?Xv%9_lQT7jr8I8Q+n6a#mnmsh@{I0OqM~4v1_XSt zqdadHm7%&xS_T5$yrX)5dG)Q@L5}k&`2_3n|)de{4zIGVqjFerjvYzaR>F!s@5b}alDjW9f5=q?c zAF;)~rMUrH+$xgH*;!F(txYv5+!Ux~CY_|8F=K5z?Z-QD7&w}L94zvwlChQ)x19S) zZnT>{HDtVo(GRpBH$Kn=8183$C_v{r$ihaeSjM!qrz@SCBh;-uaGitw*ebjq?g=-EAp# zDtSbW;vnojrb!10HZjyHYk+n1C~J$Y+%+xI5a-1Nr2)AhPvsG?mw% zWf-fCMZEqKifvMYTnG^2Rko53Cuo&zyv{S$?oqIjN;=9Tp~~xhE5Y!irAv2ouWn?< zm5qUpa7>qfJ6v)1`YUq*$mM0n4Rr%g8F$PnOUerY#=+bP9-;vp9fy1ncE^#~Q3q~# zQ88;YZz8I$y~mOcnsu<=!;;f-o(Zw%T$L5HNbF%@r$6IORPMK}nQiqUBneidCmU1gm-V4q$fNOo8l4#Wlf=q7fEu zHVzhlwKWxKUzD{vvSC`AY80Rh9_PA-@iD#&*&_%X<)upvy!onKL#0cB<(NAsk;IV% zo_X7hM!bPYN9I~I-8EtbD|KlqQ^8-}TS%Fm(nrf}Jb-sNyDc|gB`6TS6z*Hpw7+t3 zrzz4i8}kdEQe0?_p)wOH1W(WPoJU5-G&=M3QLb|dX&75lD&JI+^`X~UN+3Uf zO45BTjn68PrVPXb?r}~oZX7Sw7z}lh)2H7>9UTSQm31Pvp_fp~)an`5r7dXFxk`H& zGC(`_#mM;IwuKXqMNx->eKLf-Jw)^W03PS#GTUJVQz=IZ8pmM=lfc_!hr$RI!9RFH z;w?;yrtOqr)X}XCw(#=49Rw+*f(N93q{toj*qPt91hBo;dG%4Q4CteIH8%p~ZKAML zdWiGFw5S85lctcZG{4r{4Snv~O_2zZc@>RO7l^R$3=FhJ)N=ECU>a5%fKh8BiB?O+G5&*HRh z_O|O>qpGK24k@q}ihv0O9fTQy1nxFGjfNqFZ4L*H$xd;)D2hM0ZI3*mNPzMZrrBY} zQUohWP)OfV`4Pmy#TQ8CjN|Wrlx%ElvPMTrS{ti2TeVg3HpbUZ@{lS8Lu*cBNNN>*co(375n4lt9w}T;4$~cR5W)xjn;{DG>?_6%BiW!B}s2cAZnN@ zf_acQGI4K>u{;-ied$}=@j+^b6zeFiYgu-e%SA&@s1+3O6s?Sn$RlWf8}W!h2D%;< z2H3ID5qhPje=9e3wo6AmQvVx+JW@AFNY1j!#+z2u-F%l-)a0p6#5$oscn?& z+C3zYB|z^GAa)QiP}|slK*fBOyzMrDyk(55n`u&v*JGf$CAXBSXDexStPP5aCP?36 zPRHNAC$!UyVGip_D*6f1_vn1e?wDH}RO$GZQu9bkw}5o4NcrvjutH0A98_~a93-xI zdFd)2O+9{8sHfBl*?N-d_JyDWJE>c4f8^o*W6N!h`UE10$XIiK!w*KEEj-e%iA&Cq z+8MfqaA$H`JI8OAxWfGT#fup9RAXms6>p%();k4^*>cr7=`F1-DobprB%x`K#8S+Y zsBBff`l82OUv=R@>FEr7Zbvt(G)-ZjhyECy-P<$9>0hgvk@fJd|6(9_731x~=L< zeWKpOG^=;<6dhKOkWR(~f~nx_cjE#CVXiMEo{AmT-L$r>xYg5Kmr%y2aR7kI!C44Q zC@69SL7nwrS{hkJS#i5kCD!Vw)k#xAP=z>TtY|@2oxtvY4)MtMz|m>2QFNlU523nx zYGk(MTTW|Al=rR>00cY0Bons+56c&mXOF&#c);kAU-CvmyV5${$01QT>xm2VUZen} zA`JP6g&)-MvG&59r;1bUG-v1hr!r|`t%QWSx1!w?uc=SQnlDM(8Fz4IOTGm)l{La z#3Y^cpeZPVOpvYcFf=mpNTrd|FcMWZi!|KZLQ=b%qt&t$0=09#`$jZ}B?g~WJN0U~ zC>rJ{s(C0=^r%#R`;IU`*HS&o$lb^X-i)WbymzO6Lpp)=6q1?Sos18pVr&X;3UuFU z6{Hs35_eK637_Az@AAak>Zm_FA}MdlNG-UhL5NWrRqwvg3He4Wu#tAJ&Ky!{ZOpXF zeYcppEHsqqEUAr*4nZ4_-xFUnD35T3fN`G9-j55OwT@G+Pvj{hG+Hlzo$7pywB6m z3;EkNxpJl}qqy3##br&kgazpu-C+tU(nsY)6C0@_G3TL#O7CsdKKriR(}?&MSC~43 z;v=r~1^Rxabj&eckx*!=FFAesS7;t}hZs|Ttb9X3OrI^qB2qyiL>-BqqZy@*?Q?4c z5y3bia;1E;hq1>F1Xg$=xa_$90D;dL{Xp>7lye?MzuQpaDz7Zoqsc;>ObB_kzqvH=6#cDVirri()x;%jRl{BwV@?zf+{9-{R~X{qiPOI=c_l+b>E zm0HVWh>$mx1G-h%jll$rdD$Rs-wV++ymOW3ueBS-C3jo=JY;K2wN+KW&iyFC>} z8`SDjL4j2Af`_#0m@~f^H~D&pnLDL_2D&O}=)EVGzR=#BUIUC&UuZnEKD0U%mes6- z2|a|zxPiQEabgzM3aWAUt0k+({za&|u$14>N=CL&(tt>C5JB6H_*M>gpG1S_;tEN}+5o}}bJ3Co{N~LLkNMtRA z3DnvWKvzGQA!LqYX$CQw%r1Xrz6S=z;wX?h`t$J^rQ{#C8^wP{y2sPn9}Qhy>aEKv z+XiK-%(gRT%B@^(7i+Br4Fxs6fCp+B@(`m{SmN9zK_z2Q5(2#YHM*T2ioQr95;#cK z)$I*wYi-2!+nR4(#(`bwA=AHq!eNd_?GBH1*~^TMBv1z?nlJvA)IGeap_t zJD`_kT`otOe#;LQd2vsivr(0EI}A1)Qmr|WmWW2?N@{~d9>I5y_9~EDj=!z4x$xALNWJhoa++v4?>dB(o`G0hW z_?DT2oA+P#T{ow{W-ULEo2OcOqwz~Z#8~pv1r4cM;uliz5go!?Cw-JT$3sux?G6T4 zW7GNm%bzcc7Xl+~A7A5t`>#^;n$eZ|J!z-PeKE4rSZ$0F_rNsV6|OX?OH!q7D2N)? zNgzaxvDgqr6nj_z9-nzwo2!_*+-$3+V7pm!hFhqlt7Xbcr=AWtx>zbZ89GPi1SSY0 zZf0?CxWynnyR9yjlSV_Gi_JABx-fI@P-Y9$*UHzOBg<0@TP-xD00N8T{fRjT;Q0+hOvq?Uq<6r9LGn>(vIRB zOSN@2msmp6t!^Vrh;C*|id7nRJa6nb#Fje7>pv?^iMyCyTZMSDWvYwyrN>)aD}O_X zX_5j%zlSaF*(P^Z(H~rLo_0SxEv?fRvhjUCY@~I6xpL)|Yl>N0Yehmzoiy(frjD3W zNq_;8OoPPE9wlU>I3Z?q62yCh+oBX@`;Al7&Rf_i&;UqrNkR~fQ73LUBVr`)gY$p{ z6a!Byh@hF#>0#yq)Fw#$UvXN9x+S^-5Ysmq~0+bRp4L#xrJ3!Zit)=S&Hq{fiAV`TFxx)_ceJzY|JrMP``sxaF+E}dfT?rm*RSxXZ3Zi3^ zx}rzFd_f-ko)x}O2m-A)X8!<0?TPDkTjdE#i(x^n_cBiW2mtN`0fZRKUufR;n8@LO zM6m5GY0}tvH7fGiZES?7B#qLds2XH*^zVZJC9)DhAuqO7nk>SH>Ywt($+ZP5_(P(9 zG5-KBJa_rwg`}|8MV3HgmpxH67dxHa;`=tL&n1={2xtbA3tCEnPOx?ah~5t#__npJ z0FjhI#r$KUHkPjFs#GyoQgl4i&Ki_|ok(Ftp&rC1RGs_I7U0{!?3@F`X!_^ifXQNj zDOGgOq0-B!9G`;3lhjq2j42~HqqEGP8{9>w|eh5O8h6;cHlQIC{35Wn6X~7qQ&=zxL)>PLU zO+siWD^pueokdJVJA}eU@@Mk$o#08p#_{b6^-=7m2VW>eHBRH|Xr;ucFIrTk5R?-V zCt!E}d(JGlfR-z=HTK*?>8nP6q^Z5ql@L8)F$bMOKWrlLO8VN;;ZTZqDQXnMjRJiQ zg~C=$9nWA%m^>aZOdGcZP8hW{uQ66LMx$KYguPHd478+;DKjabkN`%C*<9=rX=fBGUbVm$-jbzqx75@Mz z^=i+MU40K&jm)`8>2y1#y^@`iw(8Z)og;6|an03e-KnZ|SEB6?6^a`hN%dH*@e7^m zt?koL(a=-WlCrvlvRrKHN!ckR=u$@VNstRe##=d z#D%rmYhbixw_K`qwK;KZ>bXM^AuXlI0F@afQLqp}oB;5r+qXM^0|OlY0K$&(X!f+V zx$Eia@j>6S<^KRaQ#WwRX?~fvZ7$PXN5#*Ur4XV(9-<0RKqPQ`Nx{RXWCoZH`N;uI>5e*Ot|L%m(?Ifl`iFBDfw%6oeS#L&_!LY!%^tvZxu0t%C{+yMZBL^o9n z9}}3`1oij-04OwnubGmy?*xI+b|1p)R{PZ^YPVD0DJmA?D-s+?eLk`5lO{m}-aWvK zdFQdwys+{Yp^ipOz~R+Vt{q#w)8CY*GV;Cy%cyRenYIs}ry2o4N=XAsNFYJnY~;4nv)5GHQAbCaXx1u!>lU&7)sP!$FhEkm$Ruh7 zFg|;XU-)yRE-W}5`uvrT6l7pFQIdLaJ?KkjbIA&-ug?{2QqkOL>K2CAtuX7$N2l6M zg%~n@jvDPgplyg*2j~J@b$VAl(+~k4Q%j%TGmYajUWM#cpw`tkmfWeP0V)YfV@e_h zk~WdJ)IkS-jCEV5Y)so&9Ty&5T(e8Nb(7R1DlM1hS}VCS8$#0Fw-(@0L%K|)Y-5=O zZS8>E)52knU-b^(HP||Nlk)|yFEvD!CGz1)f+_Trqf$oF4(dNXdqBsV)#@X3#oT+> zr_pJoiXh%e&&^l{S-m*0(kNG`BozRXbo|KXKr^&|`(q*0Mg`j2{ zK?8mZU_?&y&JgbqgdDgg4IG^T`7f8yo~N|#hq6_3D^WgJapuw%J>Ze@+A)9P5Lf2? ze}rRyMK%6k(N9^?T<1cNZZ>wQ0)0vj*R%>f&-kSAfg0$^!L;$DkT%Grnhu*&u-aDr zU97nTsR?vB18v5o#L4Y|lU7{nqez>l0CYuHBDUY`B`W5Jo_xmue*zO4heIU1}IBsBWF)z)6RZDpA^H zFbVD7Z{G$q><6+3Y8+LL*mFH=06lSkqor?9Y_KX8;RoE5Y&P3@JmWi>#++q2lNWSM zEzOHFgYKG2mz+@`I+l_MP@TZkNE{h4vEvAQeqhfFOD7Q=45D7ld6n8{6-7@@+7^(9 zl)Wx4OzsL!-=L562Eh|~7E@iVndg+e&}M`0VZZ*0X@w2$JE@=K|MRKp3ABw)p<>++O|I0 zs~@*C(h*M}g=yB0Vv)=p=bhsVxAAJ4>jaRNTr(Xtf|2uR%j6#@rk%$nNGe{S2%Uh4 zB>Q2^h0>9^*y@z|gl#)p(Nd9rZ_c^ACaIRF((?*O#yI|j1TR*Z^A6fzak=B`jm|oF zEE}W8{4Qw|O~qrA!ozl_3*X%;$|{x0TYFJjyTSL5ZKt<5L6f+`OF=KI$~pUeotwC6 z)D2YcpRZtyN_^w60vOo=q!t0cuiGfPhZN)M5xxfhI8; z4&WV{N|oD=;e-+k33V*gGV_Qj4*V$^Edyq^)G5rWVjs$R<8F5$++wOGL6xD#b?CJ_}8a+Y?3W$?`G7L^EHSBOb5ju#< zj+9*3t~7NmAxzW_Pa>WD5F|v*0sHP}>4v*u7T!WwZ?#24E={%tyIBQGhRdmv0N5D< z6})`Dc!oR507na9O7&V3=2gC?-ZJATOoTu(C);_C=Ya$?@xp|6D>U~GKZY5~H%cgc+FQ zX~M$=BXP2!YT;7N(JVDa<1GgWD_Ib^PRdE{Cu6h`ymNyrYnV;h`{f4rZ>quq=U(NC z?1t(ZbyUR)TP%5Uol;V*_9W~8h=4}e(Hw1-D-;S_j>pk|;TYY;x>Pdr3RC`LWfc0- zHJFb<8$s1r@j!p(R>lOhl*w8^oQkZFEd; zv}mD_KYln;wt;m@L$qwP^NE6`%#q4Ux7&CSf0h8h%XSTfAd;Z7FtlA7ZpyLq%fp{00c|rs zaZ*OZ9h1*wZFa|Tm70bssp^Pw&XAWW%9a}iDRn)$5Usz2!HE&J1&$kkH&sQh-NN4G zW~p0kRwlU&GPOlRjE!?3X&$Z6snR4!Ke@rOYOz*&ef31>r~`OV(9+U*&ed06)|DVD z%5A29!(bgyU~j0InKL7hW<|*3LYkuk4U+7wUty{`Cf=;9Qz5aaywg5nQ|b~R@<;$c z5j)1)Q%NR(v?ua{Ptw=OsJC1kblTlWMM(}8lj#6&yz)$mh>qBWuW#n$DQzT{@yeLc zDO9Lw4?5S9jY>*gQj|)zk?ff>u^4BG9!kM?M<&2au!y(Z3K>#UR@SFXsIroPHzr6N2{HQbzA4Pgw#akp zwq>7&Xw%lerN@*VN*fXZ{M#MpeWde$^6U;9vH~Vo1!(=s)m-Vc)UdR^qw8zbbSx|L z?hcfhGe1p+4YA6>yc{7eX*){Rp_*%J?X=Nz$_s^rK@Eer5I5w^jiNy~mgfxetbo(# zwr;Y&L#S?^k#xnyd`Nk2emX>NzR@Iz1ndFga4y+nCi*KU1ahNs^tny&cJ~s08d)Wv z>C~iZ{uIvSPSQ*f8%7x02HnaE#yC;Z-2Ao`YN%On))I$XZVP23Ndp#mT!Qg-=pBq$P0VQnoKaJ4|2u!*LsX$-65!?f@;1WQ zTpV(m;5Lc~25A*YDvf0`^ns+PJQlAoEg*Xt_K~-EKKOBXby2%Y3>my5D5&ZkWfkN) zXfH%pCAG-)1r9XANrSNcjtn#wlVb`85O`bIjTWWR zy2*8Js%euXfRz)aB0WQ})OI`>?^AA|L8|3kdrgY!g}&5OwN9$+w`gXX;L8qqNqtIb zvs9F;$_oHUPN>vCB#DrJdBks-uz>6AsoO)lcV1U#z-L_V57bv&`iYg*RZ{AzD=JlR zs8+WeQBu@Tk=;a{_?g&aHrX4JGPJ&Ej~}8XJ^?zA$<fNQcboyHsr<7C*h$Hij_8f12gDrLXAriKYqb*(s zJ|)!CRCSex!qP}BSW3V>!Iz{DncT-1w=!n7z#ml`ByK!XJst;bO3>H-Zq_?e6hq8Y z*paXsl8JQcT5;6eS}E1x>BH z1$yes;~S|RJm~ee!rxCiFVl>_)9YL8Tor1u<)_MS6$~giO>sHwsL zke!Bi==A!49`_RBcqgaJg|WK1Aa}6PG0L>o{jdHt5X*~yvS$pZLemYQ3{%kL3U<`k z5E76Sr6eQ*2G9T-0ye`N;d*NTgP;16za1rFzDgR;wb$(jt*0$D*XAio5`5s+Rks8P z8;DyQzf3?`qd9aW^bBCHUCuAk-CBoYSx zb-7W$X*>6S;|g|$A%0tGy-GIgOGqRG+Z-=H^*5pRo}*kveq+r~w(AQ%U)`B@*Gc9i z>`6@>D*`w&WDk+T+oP}b6Y@?zAtQ~DFXBISPr3Lr$`_i$Lgr{{sk($E$4$<|=C?XmKfn z@+WLDrR0%CTeT22zlB~;Mf%>AqUB}E7YEyAM@p!!EhvGwBmm$b$Q+0`89eqnww$AG zr%dpFeWCUK6Iv|A;$tZ2RSmN=`V=LHEzdbA2h=4g+Ck=jTnCveMqBhK!=NV)1zarM zYw>pSlDl6|>zNHG8d|E#H?)Hqb$%+)0-;22v>Y%w?l^6!z9xUDB^^!aZ(6)XUg%xx zyVllil(h<|suIfTg59TKhl^pPX-FuhV8Ky;Ax)A=D^@WN2AXX_m>r;=I{n~swY$e4 zZj?e9Wwrt7R!wujB%F6$j*{p7lCaU+vg=7|j*6WW%!W!x^1@4644sh#6FU?1$DoH! z#sJav`{i&Z);yiZlq>2hO6`8P5E2yHLd+2a2-EWsCVlwd4hFMpA(74%YgUM$P;KRZ zY6(dTNtEe9m=pRz-`f)|Lz_XT|#xFlA;!|1u$TJc-(Uw&KmB3D(b#+yw)yX zs7hXGOY+dM2q=Ic6WUeVzAQ3^1`v~KdreBK6y+5?W|W5#mt;voqi_$r6TZ+yVN$bg z5*4x5XcfDc8`CY*QyTXWQiW5x+MFVPCw)=e$Qz#9P8c>DG@Iv2C|^oi(B%8|$f??( zq_mccjwJ;u^HID6g>Ynd;P&4SGe#%{8K;rr&mXF=Q|4AId2rlCD~`2FkcfE@0w5j7 z@d(r;9`VT-OQJ7*UP{`@1aV(Lf@v1K)pdI8)e`BF<52S~xTFA(LPC z!{TUfG?dWIOr_Ob{{Un)I_O-?b#%7n6t_$H)llx8YXeloZ3-vr^5YThf0ojDC<~e- zEp90_vgfqgD_y3huL_}kgtX`i2UsFW+z3?cNRza2gt`Yf0!CBf)d<~Jf{eJUCsbR! z`%OBKv?whVEHSwCBoWT)f)4(F;!fK}wovT+mX~>NZVIPeD6VzY%|6ShQvu~RmA2xE zNRL5+Bp6QOd;EqsG_*3h(&x$?=i`LZz01u7zg^PTQA*2+DN2%%eBSa1CN}jM?Gud5 z0K3^Xo4Qsv+G(%VCAwC;^~R2h*-E;LaCN60c?*aqWPp1@(gf~6=Np)R)`k*I9R2)~ zi?>MKqX|}Pv77d9Shpcb*t6r0LW){NTdGkO1Z}qA8mc8OceSKRZ!Pz`wuU zbsJ5ZuG5#$#U5XNhMJh`buG6ESP3zzN%YEyf-N z;NxNJlIF(JfXp`&K=nP2rn|~eT3a4k2Kv2*@{`2&B6-7Oi*POi*FRF`w++TqbRx3G z>-P(fn^R6aw-TmGib{8x{w-VZM&ND65(`~GV5Ud9GwmBy{L^@UO}{XKZ(^a<1P?NS zGNzZUAxTsbB>cV3HbC2pGzWCOOw4SwGJ7YqbT2hrFAdx2!WU4rA%fyYw8C{53Nl9E zfw&_Id1>}<;)Q^2-$S10zwJG?w&bt5?i9~7^&W@YFm>rplLPc7I|;%a8LA^IRC2*5 z4g{bpF4hX#3Wn%^R9ST?aJA+lHG?uIo_7KSjz%WO1AeFSLpQ z6to>irM%NrR0h;gvZk9`=_v@904#PBB$F^qVxJSEa0LurBG+CpmftEU9lEZnnb)5* ziw(*@!dqze1Z+aMo?!7K4r7a3Tv|@1b~)y`7(?H0wX{}1&4*ca_toYphRM>9CJ2H= zl6aWs-Xu+bYoBg35~b8sKr@r{P+0SQ+R`0;RdpjuJhxXm!ATLqq!S9{#@rlKkp~f7 zQsUG|+p>Es<%|7hR=1jp2VPrBaUo%DdWvLk-U#5wZg5hMG1Tr+!8_r|;W4hwEY;9e zQHyIyc~u%xRGmSx2!{;pRFJ9Pa(%?%A+$j}C%;yI(!wh#0i?ProYdD`mX!smH4Y*q z0(UXNOagX|zPNFbgwP9|T<3C7&AU>Rt%u-0sDN8ch)Ekyer9`pg z?9xg6%`Am55J6V)&vU`{o%h8$qeW%I_ESGiDW`F@d4bh8D^h>M)7&1!zz{(bg$LxJ zaKKQ1Qqk5iR^>9AP+%;qxaSK&QPe(>{P@FM_Bnv{LK^Eml#Zo!7Gxo4g@r=3Dm0`S zjVGPs>Gb7b)A7P>7coNnl~q1dCag3Vbz0D%Nh&6G91#*egmHuRKqjuj3N|RxBJxtx z+N!Bkr6)^jQ%NN%C%O4YF+6X8jPC15-T-%hs)gG6hN#(PD>~GoQm{WNq81~PVjvN@ zIIzaK#?r|&6qI*rq*pE1j5r3T64==)f@JCM2ln>GJ~r*bwzz}pi(AyMK9m=l0dA!z zNE&pJGDmPo?;pzwrvbul;BbU>3DC_=I#=oRrL`Z)x{5>%jKpmRY%!*+6eX8M6;SGb z{Djs8p|G7H4io+ksP212%uI;+;X^K@Wv6YXS#L5uXS)Si>WWZ?NO&biR+XcG42b}h z4tE0zk{!*r1noS|h4$0$QQEV0aJ8#0z8y45aH(xH;(&c2X<3pZX-Z~9d+j*6AZ_j( z*UJg9YaGF}Tn*{cM(&!L>yJAF zbADq}i>iL(=2SkW18OSPNjeY!Y;HsV0RZjHYdUii+Z22O_nxZ{o9A4wHc9)(MI)8g zs;XmAPT^&0PO5WWguw^~LR4hRL=X-#>V}c5 zsagr_Kr3F5>RfG(APisZyKSzkte4ul5tF*ze7M&wkx#DUbMn-}ijSv%S<;Z6Op+(K z$DDMU76K%M4{+$aaYw6h202Ohm2Jv>L(P`wQA?S+gI8ADGKXmC&0^nDfe14&f;;TL z)3!N!m|&AJwy)d*>Oy5<_MK||b?U!P^DVWieA>M5^*Lp>mTPD#l91v|dP{nOldEVF zM%d+z6s&i$MW0Z%9ZW@kzTJWDD#4KYf70%wJ}RVAJs$?l5j^5e}t6wS}w*Uwb zWbYec@Va>h8(#FeJhpP>xBg-DL#I~Op0xCema?(*g4(NVL;7}q^%pqMpKTx$ya?Y7 zW{Xp(f3)HUrV>u7C|h7zRg3qC49%D*O#@UmN;+>dc5U=J0QLmy1cA>d8`Y&+ zQEHNz3L}o?|{{Z4Td!lRJwSR@`+5xKv zvJSH*F2z!oZ+1_Hb!peIl~B`7tfEvAOxRf4ZPUa-`TIoR zovw0fPQQdjr`T9eETLtzoPVyE+$q_b9sfKpxoFcb-pOhNsy zM;SaIX#)USQJ6CIT`iKLrc(VnSwfwsrPfk`JEbJ{)Fh3zB;m}|GjJRfnc{Gb#;kT# zdsWTLb4hZgwWX?$@KEC@)t0!H9~b{^4-nY+$83!2jAV8^a>}dYS!{EPTZCWIu;a^r}0Sq!+4T5 zAalOp;P%^g?f(FTx4gLSB{F^XY8IDVeG2lM3NF)nyoGQSV2KmkeYxWqKsU$DTaDN3 zgSON&P}83iO4x15Q`DhQkabDYI0tfLf04s~91C11=ehuJzFid?)Q(lQ3vN7va2$Z9D3v;0r>v$f(pEX<55y|?f8zF5+k^TTJIKIMW3n)y_QxtF z=_`_aw2A*>Pbq{Ra2!ZSTGVJV5lU2 zOqmCM*ko>uN!)w7Apq8SQ`5I!O+=Qes!M}kr6_0o0webX5(zSU;2aE{hd)*SAIGoF zwXadx;~Lk>CZlZkUe~(!TK7_BS=Y));@aVxnM;&?FYXngYbF`llrBkjR>&wt(fIxD z-*7&UbI#}ee!ZSgH`$zbH@f}lY~x#dir2}t&ybiXQ!ELZean$qUYFG~`PR=qsuAN# z*3z0k*%f7j3|Ou6lZF4M9M9L>wRN{$9`R-nSHnrK6V$M+-4B>3fU5}!;wMpoP@%%9 z1a!AAh!+e3dE$P1-S-nthVIz=>e@k{*`qCmL`#LtW|XD5Z3214gG5L3TUHa^4GVf$ z$539W?Ms*XeST!ijr~#|-zo_gQOc7_=16LP^i!+Hi?k+skww|3d-EAZNhG#SDU1AL zre{FVVNEFv%vi#F*kXXdOU$=3#R}tYY)kxy^{_56E4{mIK2htItzu%5T}a>LI;e^MPxQ`;9B#tQxs3VK}xNrSuci>l!F{OLJRkB5@q0S)T|pnHQYQ znE!n!%lwrM68#0M7aKg=UN_erd4aD^kSHWaW)>3sjfcrtZE$FGXZsn(`+mCMW{ZL$ z{dXzOzrlZOH3u#DoDAvzQ;dl3T4^ndk9{52s#Ww{d?n+PW3UMzh7{Pj{pIMK4NQC&u+J+!=JGkLH%7 zbw9N~!zyvi16j!YI=^3HiN{*M=W9f&h_3MJ z9UTWD%nNT!ELRn5?)4YwCcIq+VUo=AOFY#ZzmL%~`sXL#9hjbP?Rq%WY33|vW(`pHv-T?+c+C z?PSK$s2hAA3e6TZ&Jt5353eC~rel5Ge%`I*S*ok2&dJH851MkGwElj~cPot;p`G&; z&jDfuKo_5nw}=)gDqiN*bJ##PLbS;R1Iy6M3d;tSZ#Me{_I-jyD+Ju9@BZaaH^{Aa z3L<{5@EE8~Cjq0R=XTAr%>GNw#d|lo@Ie_DMx8(7m}yGOu}@KNX=>B8KRSIoXQkLR z?IZAt06@%{7jod8#TCx$FqwR6Fp~5dB}aFLW^iyokSQ>ul%Bps-w?K7$kvE4Y9U@d zy~ZY!{Jp}@0#K$VeK$+6gvHW4_H%YM!;?$8O4EEct<|-)jrA0d+b7pi{;oE74w^1J zeaoZYaVfeiS3m85dqMLqg)2<=j#Zak;CwhQN~9eGL>EF7-khhfTJUh?mJ8mXuD!D! zMH<|9{+(c7PN0H{20*OsV^WjBp8X1WtlR3XYYe@VoOLt8(3NjfRYZP=0UvB8a5lfw zLEe-Z`q}4LU-(^U6#`Ixg%dCQ^N@S4JIfHba4e!m5h#m zc)+8k^NwrFP^hqiGn|4Ng}Tx<0#tjFVFIGWH^*GOMVG@vFq*YI(~!t`+96mq(xdspp5xTj7M4ll#pV58HqN)TXLoK`Jk}5)Xm684mw@<|FI% zMpRZbe!vyXGZB69#hmJW$UL?`1hi#&B~8u{nn4I{@Mc{U7-qZYDXLv#^TaHh3k9j$ z6K<7&p+eFj4;a05cznwK2Y3=@r@&NQ=W$L(&oDmfzSlxx1l2~BLmin?S{U_mro*Ht zQ(nvsK0-pANRDd{@b134JY(qnDgi#8cP$U}V!6#+IV`3%a7|A=`WFDlCDKZS3Yd}d zpYDz$R=o$RM{#ac5o)l%(Njaeo0&g!yAzW){}{})-fu-ed&MH7 z30(HFiB_7=Rt9Di=rTPtvY+8Reo#5xJ62gF+Kt6OZu9VQ`md=vR!OzN)YRdFWMKwa zV8xU*W)UDA#OYtn%fkZLBL8R|a)i(EB@$wjG~<$;)D1&Nyb)dps@?0fd(V&Ds-8Zz zeA!U2==b?Tl@7PI4#l1%k7li!%-4{3mnnPkvv4kjPvTv`Oe9rD`wQi6pRs2U)}C-V zHcuNbX)Vx|(wXyXR9xA^bV;=_lT7S4uhEM`cfrK8;FE}G2K7%zb z7rNT{`3XlWE1D&qE=Ab7u}mPaN7WmM8w%95T=UpieHDz2PM_b>x~z?|x=fgx`xtQD zJ8v-y7_7wDb}=nx=J=7mn{cp#u8WnmXG+(V(CCfu=(I*I)pw-K#KMEtTOm<=`ngX& z9mJh>bYtln=LP^dV#TMb)u8qZzJ74*SzUOsU=j<5NGEJFyDQmeH)FeN{kLp#^icE_ zr`KAJ!Ku=weOp$En+0%mfp7V(e3_eivb>r){{sM8i*I{4zK`TyT=K4Ji=`k)vqV$b zQ1tJ<_2{IFHoj`jPI(w~VH6>w#?|YYVyD>_rz{4hi8zi~iF@MKfCzqu4+>x(yjhYE zce$Pg44BK~0_iAm>{s$E^3v2pbQLRCu!S=kH-p~OstLdV?#5aWaaW+x)I#xF?{cr1 z@z>5r!zpt!+p}YG-WeQD+~d`Y;kUoRfF>xY>@>Che}Llr&hlvE4c=&sa5U8QNA&e> zt)jsHzEtxVEl?GZR-KM`L%G{VanNf`7v#nPJqkmL8OxZUz`a_}=$!*G>0#cQvG7)s zs_b!UL;J{W(UOBSSe=h6uT!<^y~m?QGL5n0@BHOITMZdVXm(uWPVbMlNG%&>Ky}UM z`i!4mS#Q)S?c5OUu1t^it|fi0Z~cvERzmNAXr6RWU>{gzOdf&He(TSWn=Rss+n2`qpcZ4RucH><>MTD!-CD@c;u2Lp-t;V zP@8NkOh{u9UP5`vc_vAX$a^s10737arj##L^EFK3ywr~F(zn0U4ooe0gw`dsS zkd~8*xaP5DDqbCi6%lc~V7Qrew_)QFr+KDg0F9(D?wDzR){C?QiCXf-KC=|EwBgmR zg%mYAuP6D0*^NXoE%AHqTWWq zfO23e{xc90c5o%(2m#CxDV)KXXza=7!9fl@{_)hBIz-I02zshfP~bc0Rw?RhRRgDtJmSjCAmjb80! zY3p4WMS}Ddw&WEGG{ohy*c)`6pT**66F{1%YUg1a^S)gHvT7+~J}2B`m*<LUw{gmG=S=F~`{;jY0T4`P5RkIi zm<*DejU^pM$KhQ#XZ=5=jB{~U8apki^%tpHO`$BIiXW=o!hwpIhhRXNdFLS)u4f|) zQE)9>{)4MdzHTBwzR=~*=wBVvGZ4OLVr#_Rm^(@hPqTX;}lsvchU&*laq z#Mtb%I3?_K`Fdil+HylhxL{NH{EUa6$dpTdh0`yYJFup#~SRkeR z-Eyc~!d{tW=i;?y-C_*V?7G?0omh>1cmWq)g)gM6?z?0u=yRvnt8Ovh$q&w?Wu=Hy z+q&B@CH$`j(A%PXY9N5Pf9GJ8OXQJBCG1zF`l#*nD~GxuY4?Jn-6l2PQoIHb5>h@+ zP+k5!Lt)!v9{G}1=AghZvi@jU<5IY!+)E+C!cP?ZuOEx7)=oms^eBvDzMu@I=^d?b zGF0NOd3n3Yhwb8-{IkuMoB@<4KQTx++*}%Jf-e!DGey(?Ues%3b1l{u)~XLqe+yq% zCfj*C-o|SN{K}VvmRze9{Pd!_`R7RgcxjE+oFJJRo2$7)BNQr<6c3pjBKu|I zJ09w{aKc8dZWZG~6m4voV(L!b{W$x)f-T3~%Udup>^qTR_}p`lBBd@@@OksGol&kF z6^~hIY^(_<1xk0{4J+h+4Q_8y@Z^yCt3NP0R8!}S;>_0JRt_fjoLC4FnP+sr(6tSD z9JAD&{LcBYg)qit@BAFTCMCjDR7lj-r3FZV8SM>0)eqcmb;2wEo5BX?sbuNzYfOglE_03#!-EicUQW zldtZDTPUvxvHEN=ad8Qz{eG)-OY5d38Rz8m%%h>)k+%8}>So4~eYTi0bFEj=gLKgA zk^yNtH6-=9?Wy($`l&OT1eYxSijgt=c1=NAXXo;X;2TB^eE6j=x{4|RaH-oE)%66NH^j)1-Rk_!x zy1h@S8y)P@FU)rV4!4=&bfV(n+G=cQf_7oi0vWc?piU4F?W3~<*4A&Yg$InDC+BS+ zigsSJtZe&O=2bfo2cQpiIwS_})H!I;9(q6ZFeGDUGF2)=_)G=A{NdHzq~L6sCrirQ3t0TZU0U7momVRV>sDPD8fOnoY-K zh`!mf#^s8AvhK7E%H_0H9lfl%3}-68K~^jL7pnKjpUZXo z_4yO)ImduPRTH?c(xFB-9HrBXstXctdG#=9y;8^xR!8THc}AorOYW7(z+MTAkNK9= zKW@_}^IM*yinXoSjr;yR`rzLN2K)(PcnHYYkHs53k$!UuHIfN}DVqn7>YCJMH0M+n9uacQj4HDvdmVjM1R0;eZtWNw0@6fzbxDIU}wg2=eq6 zetGU=y&MMwK25q(&vFFG)6ZPI!)i4@>3)%eZgp;>qW7M~-lyE~gSr%nF`7BnN@W(v zSd@EP+)f7ZO`EiFMZ<;0Q3xsxnSG6?xlz%%LgV>a7CIKB%W5Bd{qMlr8}9*LlFYWW z%q)sd5A7DRZ<=V9k;xZLfc|+RzHtvvXWDk>uC7LgGW3hRx4iOPvk0=R)}EM-bVgSh zngDS9YZ*srSL!Aes;oW$W*Li}kn0c%WlzkNefrx?&|yikpw%##4-Cz2UYi!NF@fpY zIe!p&d|Rkq&l+yC1q)Xp^0`~w9btZyY@)HE5xlZp_ELbIX}wLkG5$HUApzgnpcI77 zbbcgSUyk(r*Q{`1pSnCJ6z4SX&UAbtC<`u*E6zX!%wCMTHjFsv9q{BaZqZ|XHJgy> z*V(2O{bCTO{T$xb*;dW>4k-CLioV-llPuO}()P{wU%WK*bhZUi>M%7GY#@1JkS_eZ z@`#g%M|a;a=8(X?9*q~}l9sL?gu;w9= z+^nq>#Um(>&p0xy2p08?dc3I|cCos+{p5K6deEoo1fka*TaBxZ(^dFAj+s})LxpnV z=Jk1>ntT8D;w)m2E93@|dX)2mwcu`@+_eXSj4$DI`xx>jGt=AfVKMCBthqNM5@i1-N~Oo$}MgZo!|j^2@1Ev1)eUKXX3?yMM$-4h5d! zi%b`vd%9W#izvD%QnKMesz0<3|G@b_cM?rEvn{?7E5e(TR(aGy#=~VgU94W_`+NTn zP~vE7v3yB~C6F^bi91mb39q9?S&h%H1(trk&X$1O=}z;LbST9S3}*Nsi;4RddCZ`^ zn=mlH7!xZGNReP2CP*cIU+$=GEhy=5+QmW?U^l$27TI$QzqfNyLuyiky^tt9=L0k4 zVvGpH5x(dEAdE?49whRLW^9C~y}(mI;C&&2LRsBs6ckQMN_d&2f6uVO3w$*EyIjNWw4@Eo!L$6%>-s(UHTpaPTAZP-Cpm>|2=lB=|k0|#!RuD^B9#{b%Xa(zv*xFoTR z`D}b{FCg04@@ApR-_1>uP?TU3f7P5b2-NCj3V%e1S!CNk0i-Itd}oeTi%n>m{k#5; zaMqky)Gxpa6MH>5Y07i~d|Rh?v<(pl8!y_jzC}4!{s7%U@gyjbDL@bQoLjN{`&TW# zXNt9|3$Gdvu%R-vo3n2DKl13w zz3R%FpRr-wowR{HMr133Zl&TkdMnTijtGhMzi1@SCz~7Ys67$IVTu8*19R?+Efto0 z#Ez-Q9sJiS#7Gl#z?c`dFYFac69k*eU@~^ca%T2mMtMMg(hD`=((TUQ49t!_d}&%hJoPI zB*RYyFy<70jt4%adZ1io$WvQeCkSNGgob(N(2be^_>4!9ktGfpmPvj*oyX@>CD#58cW3Goe$AyW)Wzi}1) zEoJI{%yf54v%|6bm7Ij-i%!LVRC;1*YgNZr zO){ur^){3BQg4d?x_^#(oQ_@VT-tfov`(Io(xdW~nrm0YTcSE;eL~Y3E(B&#cyj|1qza~8#j zw&*IHyCo96J{U|gHSA;5;hnSlot>_jfZ40h4V>P;W{CW zoVQz;3+{j=KkHwS@UY|r2xqtkMD5RuMM8kVMg0b7YQCnubSLP+gszEaL~{EM8$Pc;+avdIPR*m9RKT+u|E8kiMXX7JIC zMe2V54oNlZ_Q7DgL}pi#s;wj`%83(|%}@n|<2g7H9AF9E)qvC0C+r2;JZPztPr*}{ zYCB}|>;Ak(vBc&CGAH}oKGe-%UX%Fy7M#^)`WOS4QkhL9(Q_e<_&#a|7y$x&o;ezs zVdVIwZ0>@6XhCuTs{&)2?_*>f<|T`GnL{e()KB5p6@NIpQ5W(HuU1ZZl7SozA`bKT z69|8&#NuyjMs>A2fc9>PoiX}LZ3t<2Zf27WNNctje8{wE$_VDp`E`ALx>A^0HTSzd zAd(b_NR*IA&dUSNc9ZrKTw9^6S?wX+4u%ephN6Har1S4BMCV2p6llLK36=F4(Z_|{ zyvrhH5>b?2%-4>jc(+$zv#_2O4tUw)oYz+0mb^l~EW0S*k_bPoXxG}7gIbIs{@pk( zUyRvcY9|lrMQ;~9b*7#O*$->J8tqqWPwi8HLO^i`S_ezs{XBwkRr6M61L*5IPOD<> zu?rSO&Y857f3Ezmw*Fo@${YgrT|tXZWbP2vXz%Netj&`A@@NZ=M{HlHefWy-lfK_L zLpEe8)liOSwST%QBL;D=XpZtf|@HNZ%ll9lcCaz=oXv3Uv+d?XV%O4Z@0v3HYxe;J2r&=;A zKuxZQ?^q1^%%i={#>1yW#UJx3rq^34p$E#4jI`_Ts!bhP0Rmc56=5a=4~h#dgvm+) z|Gven{pI9&_ALrg`Sxl#jdf7yg=g=0>v}S!@@{$K`7LqWwi&Q8R0&>>nqd;adQYg4qJ|ITX08baZ$Xdpk|Zoo@SLdRS=z&QGD?akNtu0auho~#bHtt(?5;?=k;?6MPT;%OjB zN0I2Cya12)2QqafBCHn0yx-p`=}>oax^V;jD>7Up{K|H5^tial-JZ*u+uyB2XY)5{ z*IWq(P82ize*q6gzcCtb1jokPXX!L?Wq=GyM>>V}sJ#+4OshHL6NCsILX7TWW5V8v zmKxvlfcDhnC|)x(DO;Xb(?pCnSm4Wbj6dgza*afB(0#v{4!_bT#J%g|FO@o4BcIm3 z(!gGdsF{s5ps>3Ti7=*3-4XS1$+H#v%5Ll=uaO>pyWNQw8Ip$R+~S45%Had#1J{?t;eAYB!D|ojcTQES{dcD}2bK;d@8- zdH*up9&B-x-rO~iV)>i4EFfCk`Jqdm@+NYhEM(RDi_{ufrHVo&&M$_O|F+9!fBrdW z4wh*){`p7hrM@o5wS*sC`=9NKbcK|hpS^a%`_UfoRbCs_;ny(wd!;{Jf_RUSfm#kM zT8`>j1|1FlT}F2Z7E;PCL~{Jq20v_(AmA=y>&2eLV~JoF{78J>)HYM zyQ#$+h_}mR+U|@!F~Zcvs#kART4HNI#X5pR<-_yK8aTH4hYBo*X!z zdpW|QtLw0t6&j_!B>#h5j!T)tP9iG#+RDOu$uSxD$fw3Ou*vOhLA2wS6XwC zxeBjhm*diS4OH~CM4Ui&KC9KtJ;K;*&!lCf*+;^+dO8-l9bn<@c7F}b@!=C zBxY8XVxW4L-MlY0@ZOi78ughsX8$a zL^eLs9(+69ibw+xBDC>G0`$hv;^Ybw?J0g%~9vbn+YMMtTAj^h}WZ@xtBge3cG5~t6xV2%D3)i`&ig&hX;&IKMNA)^8t#@XC5e8rDA0{WeDTLDVB?A_ z_awuF6jg-Sq3Qrrg``)8moDCRKay_%KJh=nRQ+`A)F;s7#__6FYqwx*co^74+yY&BHGZOb%4z*m~SVR~!<1EUN6VUIk#-zxf1=@NL=Ek|(sWHA%jV4-Xb zWWp5tbI}{n&&W{oo_&c8XmEcIV-i1Z*)vj!H>|reAKEg@F8+HmIV_l4zA5X%4P#;4 zTXrD)0mj!%=f4eqa6m@o$PU$XI!B3yx^2hV|tzlt8RF9s+r9kj^c zc@{IYQcFT*M!NXgKUw{iV;O!TpKrFb@yUjZ&GRYmRINpd2B2J_UB!6+>YQ~XOZ!Sd z@Sx5VbwlU}(8dY9m3H3)%FJg5la}Yoo$AX}XpzC#Qoj`rKNdWsh**i&*eJ&j{joH7 zB{~(^C@o|CNVX@xACPY(Cc68~X^=B;GNuigYT(Z^sOAh)qTs3jlZ}>UC;2;EUVY=>u~%lMvB%t09z($-V`X z5pD$zX2p`;od!70Q>BS58xe9V8*-|ZSRaJu!E{hGeniEMQ$f7FcYsF@S$r3)i;rAX;u zQ`fGP^%jC%V3GR$ex_ct0|^UNP`>5fhVDWk7v<{4ed{Gv%3eWadtgAL>=$n?F9LWn z+}B`4r`Cdkq*VM|i^+JBSytY>GSUgCw1fzjXFED5JB(YlsPPAQD9%^acVbzbWXsJD zn1u`o98rKI60E>P3XyyzrMW*g+h=D}vbwz^Y*?6SqK+&bh|>Jz3XH&l-&7j^g?+vw zF|Qu16fWHHd;H~gp!=^#h4Fwq zp_c9YMIXK?ghkmMGsg{sAKPCv(PLP?xBjuQ$+gQ-u5t(dXThYzbOrT0lw(ay(6gme z5BfjA6@_lhUmd^ps)bwb)@$7aO{!kqWN_K2R&(|*S#S0yfh+}pIFfLuescD|ca(x= z$9u+b5FDQp$gBGa#|#pz-DE5gyC@S@1GpXIdj5|*)&FeS&$)Xqkj04{aF4oY{y?tH z212{Wr;FEw8DxMg#s z4sOaqH#>GQ80*3|JvUp2N^l&YaqK`gF)ZTwq~2d9rgAN95=g~086Wy=sbdoM8W+R`K%PVsGMS%Wa0fs6slc`B3GPQGN*U>6{Zk3FH zvT_&}KJ1~73p&*Qdv<1Wo!d(&(0gTJqH$KS(MH-U9TBJr)#@ubV`@2Tvc5{eKU|k8 zcj&k&LFoZ%&uFKy@ll%yN{XP!(XtLUswrEh{tS;SHN@-kKxub%>1rf0fKujMyvE3w z=PCI;#4vL+PlJ6)-(2OfxCzNAveA84tTExK^xB7#GvcM0jsOi&@qc%8UwM(TSLPKc zXXC>k>piZ7RR!FUW3D`J-{jfFmu=FaEGCQNP289>I~z53cSRfoV~U}_)bzkiAl9X% zlZ#Ie7p_=+zzIA5!)9Nlna&waKZEk!l#}``(EC5Y)(}(R&chi(Lx3k~L@d;t0K8r_ z08OmX=*$@jO;}tXQ%W(t;V^A*e~PixZ1Gn{A~8=ej{9}!Z$=IK`2U>nd3(y9xf%7p zB4v?6(gUAsP3QS1ll9J%UTG=&w|VAHykk9JtgpXufelp2j>B*fiAij@ZF{Yb8CFSO z8h24?buDDqMp7wkC4WJgcf+y&yfhb}To z6~r$6Njx2Rv*yV70r&~evwS!2D|XW6$3fnV37}1(6?&d|2D^B3>8@a_$xrg`jH5FR zlqzQzPzFZ;d<%dtGGy4!y>0>Bl=tpma`-@`?-S;aCK+LCBT|{7-#Qtd zs<)&5V0CHLpWM1&tRbqJ}fve$ZoSJCmW4a;K=;5cCa1rlZSQa?znTS^egQ8b> z@gei=)ORGcfr%#iX&?wOSSo#xyWV_LXg50v{HJrHU6B#SU;<@;Z<)7+{WgfIYAvj+ z>j*dgSy8K)I2+f&Qd_hODGV$is7R&h)~@A6GlfpQy8T+9=Zk4idgtI z9&vUw{Xx>=AHdEIPKI=P$GA5YJ*?ic_^*Fd($W6$sVl-$&J==3=8*jJpzrmCS#l>N z$-{OCGKZ>(aW2qdQTE*{pT70#Et97XU$w(5KGeClgR(b1?TE%Y85AO*Q9$cvDzXa!``~UKPu|8Muv->yJhsyGk=y&g-&j!086#Pd^7RWXZ!k@~}|z=SCnN z^1hy+Km#I}s0V;@b*cY;%7;j)e)L4qX_2$fRBHf?Aa;J@5sMWgetTa0^(y7^wA?!B z^l?Z@aAM{8M;5jjI<7yvJ--9rBmvky$6VhVQ2t~_92T;>6S7Y8(4mh=q$guRj=u&J=dULPc z8TQ?7q2m#x?C;x);>6>OPKLxnq#^u%1A~(JgZ#>Bw&}P`{@&v&!*$w49remu?s^iR zbdIOOYt3SSp?IB9MJZF*nPm9za?7LNy3~UuGohb+2c8X7DYE~K#?%T2Bpz8Qqbs}m zqht`Hh$iX#Z0Cz%`Ln6W2b|g7+&6S7Q3tX7*!r9T3=`XR3$d) zuC>;lLIjK%x)^`j@7m;WsE2-jBe)Af>`{Dg2iXh^j}R_1wc^=W4Y;O)mFNpRoZ)mo zB-rRh>LI3NXJ;(~u~!}8_~mSCbejDg<9~5t(3jO;w6D0xngG($&d`>n<8zEfe8j77 zx0NLec|$zEoeZ@vK_yvy)8ALU!&lxdnefxUQDJvfr7Y0~hHiL!hOn2Vb5C~>^}jlB z&5QHvW_24VND>2E{G@`S>V)``OG=E6djC97veHis5D1Si)IAsZ5C76!8?7e2*?#Zb zo0L~)5h9pS8UEua-Jq0aXP}%T^WEGS^|ouLqB^>E*Wuuj>GWct2|$1`N`h;ob9Fbh zId9)DG}lf{b>7;ev`c%z|KQ*%rOh$5!4+{Bh|DZ#E z%fMPc&W6ld;Z^%*=8Fd@ed2-AXS);gCZcq()@Hr^9nC_mpr&)#4aAvhn;a20U z9JID?;=kig`z~4kwjbm3Y4{$GR@*W#Q2f1PRb!B-cNb>MCS?M1X|V`ASvM}Me7 zdIdrHHs(s$*+Nm#OkmZ0$CB$dA-ZNms=(6kasBz=c)i8&_RF{b2Utke)hHXCby-{p z|K#>00sMRRDJljimymb*Y9HaGu>Y@Vpo3gA9vrL5bot3cS)?v8M&8EyPWt|Uf7rq)BH3X;aIXdaK z7UoMazD(u*#q{|N2D3>)6*0Rn4t=sX78^t>COJu$@}IHH=Uwk(#bpBC1PxO{CkuE zVo$DRb)MlMN#nehM8 zAFh0?dP;j&|1>rUu~NA~M1UHMOv>7&)@?7IB5#v{t_xKtKpcOt5Bdkygs3Tj?SYJtEBkFNP0 zG#9EiRhM900xYrU;tRCW7%5_BHMOIKi<89P^ z3q?5@UkiURdBgI!r1Td)rG~`EL8EM(PK+cucE zC<14LH4S<}BNH{gMyV<4cQ6r!EKHos3gh04Y+A9jP6)h6YB4kkf* zdmzy(`0}LMm;`}QcilJU{DCXJ5Dx8Aw6OtLpk{RGLUuT(GJ^IcLTDh`(5mX7eOkRk zzrq4{A??Icw)nFA=8brzV8KS^84?FD4;ahTBK0<3Ms0{`ySjo(Z!Efr>fAU`teff@1i>q3FNPq^q4 z*9l(BgTloc#} zyAvE*H{XA?KKG%@P96Hyq8*I1}%>DC>c~ z@ZAx-tSF)VK}Wj!+$<$C0!a$?Gd$=tJdiSdps|7)-u~f`eC3ARUga+xAo7GrhJ~=c z12V=qX0LreO3Pz6_kw1v)0UiSA5LPD*kSWE0kGBbtCj1g_|PC6;C767TY& z%DYSN8~co5(9J*@23FQTnS)H2;8bT5z_X^GpMK7q24?Z4KeWqhBmRpl>jyDgBx&MN z8KX-4QdioL`XSQ(gMzcLdP>(^ELS_o)xmU{%JI?tX!zZmzh5nfUbFru#|fPx2(%Ub z{7=FoZo(mti06Lnn8}74VY?&yV^9PPm}j4OoOJ~$L&PcrXESl;4gu}P79kw2hM-&d zqE?G*>`Q!%m?KM7CvF*XKsnW**3AuBULEe6!so}w!DtP5vzXDR^SWzss635Bj4!=* zQt%`rwp;16tloU3&7e^cagoLVV*hyj48b25cU_46jJqsFtw;?vt96|l;n5DThNDR)&WmoB8HXRY8N?$g#3f!wvsApCbin7tkYlX~HWwIc9~zx6B7J*LG8j7=w?WUYQc4Pt(qd46+)P z>%+TmE#ZDhm;AUJ!(g7N)d?{DKSk%^Pxb%);bS}Y&US2v2q8O;c@9n-2X%~$$iXo~ zR>xjN2glAn2ZxRj$EaklB%6%v9g31vpYPA_UwA*>>viAH=XL!*So@473RkN|*rmcC zW<@&6i|w2ti;oiXYEWrdnNT9?VM!_%fD6FSm*4)!09C`WOx>)++hX?xgYw~;9)TG` z3}(vCK6xC(Yi8;7=M4@o+a-!`H+-B#Xu(EfpDfJfG5})YZJGZE_>v9EXp@jCRn{;S z`S#!5x!2NnM5jQ#V_NxJX{E|S__V52EZ2irgp5p-fS6%ApQNs`*(VMs>8ygR1sw@(stAH#Cdzc%=&b z2ef1i%4}QEFrnr9TMwjksk2tMgVCqeN+7>sqt?M|(}U9LIk|)k0xo`H1qzPkkum&z z^+ISowq_zewJ^t42imJ34oFkk_EY5~sBr3%!D_(nX|~8lXN7l7B-j`87TRm$5 zI_KR9jo(t+LITnLzI#c6-aa@2STO~iw;7cv(!u5N1goJN&L682w*DQ_jS-8CuX}nT zD2v8%Opk$UY^~*~Y)PE;Q?8cOk|l8`{3_xeJzJt_o)jkaM|O{XF?m)nf+HI3tPPXU zI2j4}_aD2dSCm@yFD0ClO$RO2KEy<_Psn%V#uSlE4SO8VwnZhBaHjG!h+#RY{Mj!^ zMH@-!iqzuhVJDtC*V1Bn*;cr7OZ66a$1`rySf$S-)9N6%(559NF8sr|G&_Kxnc_-_ z>!DMTU<5@|mffs7$44~bSxxI>5Jbw0idrv{Nu&YdqxLVIBwuqb$?Y+}!1-8Vg@f$L z;k%g2yaTLY6WgtAJmrxLU)Jxm&Dm<;m9PrCVfRb{kg!+Ne%t&bP1=Q-t)*sYXBv#r zzJd_U5FuvujWgxs&8G+cG^J0S?FD66J?&cAJAU)!+mv6Ahw)WL8SI91O{QQAHYwj; zg$Q1MYGX6oVc+@=(&zs>o@?}{0!pVEeo9@=QE{8#>H^T(%P5`fHgEwSVVu9z*x5Y5 zDgq50a_e0oEwu&lytV$fN-v_L#tdR}6;Q&ELWfHo4qNw%cmC3Bif+a3Daqj z#9>Wn(p0I+uTj9c*$CoeQRR;S-WC&|7}R~ioQk73M4ELjV@5UGANYk#p#X>HTG0Mp zDf5+7@!i1pAXiBxaf&c2*{i7J;rFZj$p>KtbDF|ZhK^glR_~urBHuXwR{2BBtFvEe zyM-$1<=o++O6#sLdUE_;hmN7u9enwwjtdBdIbyY@k`ITB zCF}nHmYk0)-2(LAf40aCH@kSu{oxRypkB7T z!=Uy##q>Avq%!o1e89&k%zd?fz%<)@ezN#YGy+f33caRo)h z@R@50G9qi$O)_;UE-5el%|S}8h^H;D+J4ZiBAb?~u(=aHBeg7O$$x1aNCx3*pV3Jh zqSHYGW<)mq6u$C8q09F#S-(l1-QDJ|yVi5B&Q^`*fL-G~BroGd3HS7P{5oeg56^7!R`ijiJbB5QCZTRGSW#si48w_>ig2cQ&>6C@o2gN`O{83l1kJ; zN*2ELiI!8C!`QVCx_(`-Rg$VG-Sh1>1n(q+pmv;==b}3HSY*Mb4G3$K#Kiqpj7X5$ z<$I@#0rvvs%|STpsDz#z-J>|kS9S)ts`lTNDuKk)8pqmgQ|nsBH5}lJ4ab!OA#AMV#$6P|647 zqjL6zL8OVK{xl#niNddM4K6Q9pn%>?2=@OCq-daP#r_c)IRUul4tR;u6yGFKU3 zX22HSXfBv>fG|dXk|GYu3{GVlO#(tlOJSss;L}+WzMQAte)Eg-UbCxzc^&-2cDnroHWLh&N9LkwlMbeE>}_LyR0B3L zv)r&q8z}5lsf-JmtF@i{wq0(~>yE7b%D?~O55t@5>NT2d?cnH-R;os|Orkd0t;5{a zQ2~0DTC03>99Kc4>sLTqrq8b|44OTerpWq;T~}j28I}av4a)I(WG$>K$)id1!zx(H>task8IOe zd%w)WFVn9Pp?=pj8(T+gbgx`4G4Ma`=4+(#m0I*l&|;ZRhTi`FZ*1nL`H>lQ|br@&a4c{zYR|z$6PgH(C7YTi(A}8|&&MX_$cL zHhD0+L!1c&D5Q5c+{Nx@SmEin?m+{WgL-VpJNH?d5c^i{qDd9zGdP?F@)RgxC>*Q& z@N=^!a!T0yG_~pv@xasZAa}cYWB0UnkGtu2>Dd_OtQUUXt{GgQk=638vK~`nfpyD& zKs@h}Hys5~0e{iKV7a=in%nPY$%9vspZKK-%hM@@~FC% zc-!2ex&>^8%Ek}k0I22Hq2ZEnkLV2-G(kp;GEw%eSAOE{l5C0SFQ$71@&$`bl+}PT zKTT!+%w=3+XQ?)Irq{~dH$*Kg5K?4+EONh8hGFh;<`QS(2~|y}Cy$=GIgc;QO>p-^ z*4rcjonO-}!raM_3;=l!JZagIJW~RmL1tqavmwv^m~I8dU3-l51|ycjk;EkXT(DvS zET6j>4=mN9*GyTkuVE;Xo_pi(lPHu+C`MwvVG4oH&5h$gs@Lkhh5a+p%EA@P&=z zPQFYKdK^QEXDhj*(Ms&3)tvCP-8Y}fs{MK==pYL~9g)#^*_hVO#DtP^GWz)T@@F%| z5o48@%B7ZMoYSUjY1SpkHd--C-Ftk8@xesrzrqSbWL;!3ma|4)crJ~e30b@FEo_NJ zi4}Lu$7F+bTe8{~^=Y_*uQ&!{TAQU6f|%y4U%59^0ip>4UxP}E+po@AWyXUH0O6}P z6h2qo(&4IL2@!_m0?q2PO{bMX&l?mQ9;2yL<0`9s*6s4^m-v!xw+Zb$8^!W~;RV^o z7017y{M1;Fq=)2+ewnWE^H!!JykacpJBMp9hFE#e1SKC`Y8Fg=1XtK9g=3d5Xmnqt z=kE{88xav~PFySHWO=nt+~Ta9tUXTZm}NMjN0P!fRMIscN}Qdf%O{<2|C~#nh8^@B zm(NTU{-u-lnRx}@%o?+VGuU4&F{h~;F?1q5Pjahvu049=SbzO@OkxxKe}EF}%J*Oo zODqwb?Et!RU1zMlc>G@3LR{+Gn}AI7O(9cQV1@UoV`RJa;<8$WaYdW0KF&DFM=INN zi|VY`^l;FA@QJl~WvsKb3DZ=Y64JtASO=kDKHap62wx7mOnaf@>pbZgek;cZx#IIe z6w)v*ZD^dNylx<7ZPQVpBW%QNMs;f}6uT{8`>3ON8vU}%K{Ektc$!_&z2NijalxyeAON_i`Etk-D0Os^MBbg6(<3iAPqe{FN1sx^jAKA_2R8xN_ zR|wKYM}TR{UZm1c0LQXa{L+j^o+MAWjm*`z!3L%V75(OP+bZ#I4GW8&b$(8gAa-xR z*ET399oKyiS;2^kP-(}pdw&g#b_I{eL^+Qv~R|IpYGg3>)!d! zl{YLWD!1Abn$i$n%xxwA&Mxc+KU(~-IMvX>HB=5*$f+Bs($Bj3NHGk!lrQM0b0;X2 z$*8viYGaO?wQi$MX({9s8vE7HQ)o=WoVQGCmk0lm3+m6V6q~9oz0|T#)QjFowWA`rE^7_;F7xZ%8qTBRWt?!d2w1t zJwx@EkjO~=07{c8>~<%R&f6CXPSUV>Src)a=7DX4rg^?F%1ei4pLQ(j&mhl!@yxnd zu4%Vzk>yTb_KQ~mj5AzVRx7XA#h9&Ncgt|S?-29U-MyFUo0W1)A@>j_q0&Smp0)z% zFKq<>bDqNu8p(tMG(~w7W40uo@U6o${G3TBc~zqJ2M9Oiv^+esH+(T_4chX^w+Pa; zGW$7b?4lR397#uRV;D~Jf4D8_ulL>aOWLCitm^mhWqgZ9e=F9vLwX1mZg6II5vOXI z>EWhw^895=$N2De^scKfm?-nnqWul*C-bZYtD5wUici+^cc=INQ_}DHo-*hdZo#rO ziK%;?mxLO1A-z>cosB4ofwe7s<#jk7>jF8O#B}vOv8mAk8ud!=eR!FhGIOLr-2ow@ zcQ7%pESrRI5!;#G+_ z3P%;*cyaIWJqVIi|4$U z@ez_jhhf%H@CRAahq z;4Y~uCKODnuDtOZLxe&+t+Q0s*$ZiM-ZJ*n((f|yKL?>M50dA=EN~Q>9Wt0o&FOE6$ z&2A4h^4|N`TxB9(%;Yntb8R;4gCT@#EdKQ5@_%|w<>pQw8ua%;gGMCb6E+dW13FhRF$Ns)Ny#$Td|4t zJHF-8Rduc;Ra<#q#PN?Fp1h3Ktk`xg^)M zhx!N+yI)eX*5`T*T=v-#)kpwkO49FgL`4!A7w5JPm_Hm`eFOVR+5#sU4mN*bxL)k?b5FTP3C zjoghSKh1#b)r0dstV8EMY64m1GIG1Atf}JJKLI2|R5gDZe1H4B%vi)Z;}=paXm>HV zfTu7JtiUAsoyl}g?SRqIX0j>3tu8P93r49HDVL;1;3|i_ z%iNLmUdT%9v^u_(IoiF5RfJ<^ei8C5Mytb01XN8iGB*XJwr8?3>cKfxy4_ammT+S#L{i=nlGBWdQT z%Z8~cQl>W(ItB=y+WVBMmSs8ciwg&#X!)EOkpN3>Y8Gk$XWR5D*WDG$S5KbD>zI(! zL){&&(Dp~|DF!9pB}Bc{9gVVvi>wm7oqj`S#mtcj@SRVcD3wUbB1O#c=l<2%jgs2{rD*60PC z42ry~ez_JYz6kwkhFom8mpMl%3{zG0hJ{#~7=oqf@-y+*L$nl=gr%RB zOYMkzMjyImh}jEWg@IFIzVWjqg~iP%I$d(_)gQ%EF&9w-DKO^p45h(E0WEw zVby8**yGZG2sIQQUltj>uJ@5Pm@`(G0aEQgv&pQ^ij1&h3WC{&)M}@KxV$(XqJ{40 zY&@%2(8Y=?zRW~Y4l{)E!CEZPVCE?Ran9y8l@rd+?PgJu; zlQST0xoXvO6S`WG*fE3Bu5{M_aL(T z4{VF3JapaEtYeAtr>UFMb^aKy!|CJj38-|Qyi&`2Xi&E!;vD1GzV9?d1Xf`G_R+1v;V&T$JvA6lx08Z&Z~K+oPCq- zFfHR6zide3D%JMNFJMM_LX$Y0R#pwFGp&sNI^^fZTfjX(%I~SQ8Pbi z;6%0@b|CB>eMr|VE8`J=Fob;@_<+jIx6hx1b!&Aw7OnY7EOqwI%ex4W(G;IO&o)6A zQ+nE!@|VVy>OWW4n$)MDinNP$180jgx%yhzzRwjw#5Pl;X93N$!MLN9kl>4jN(%6h z7w9i*RcAe}u=aD5cj8G%o?PMp^=BBU{D@mwW4ToM^E$g4z3)yY`-6L$a_L2m@%xj} zk;JyAD^K!O%rRSAW#h{_19etsG z^~ld^En0KcC(+NY$4{97emG#82=}ET6+fdxdF5W32*pzV+IH3y%Nndm!qTQ(`wdF} zHJP;%b=VjbP?2?QOA(W%_Z-s&g|DN{ZSMZ0`YXk@)_>0b9AJ-OjC#4Kh`g@i*ie_m zt2o>GZ+&I%0e=BQsIdU2@xfkvSC>5{3$wk`qZy zXfG=){!r|ZHF^EHuL9zqo>doFo%cTfwA@VVZA&N23~oxB@FI*Lqh+xUlYQF*(P|W7oE>7SyVByMT}P%c}S(|ev@5gW*uqq z>`rHNRzhm0n{@mxIHR$cg7GoXmTX33{)uvX24c1dlJ>7loLv+`%URp1EiNI#wGpmI zC$z&mEE@^n|MIZa7QW5D2MC0@E;k|ow!{RKZOYurploGiUL?@Rm;MwwT}Fx%+VM9P z+X%i0pb&=!!((dARj!^M+W_QUuXU@715fXO34)l6fi<`A$jOgoH_xv!WM@rJM%;?; zjTr>7I=w{O`mpE`cgs;D7c^6nMRWvEy9g@fd)DT#g{2hL@ubki4bkB2lSHXN$Bf*% zqHK&uZ+QW<&ew_6T<2vr2reO*6U}#6c|0g}%Q9>!{c7j0J&2^HMzOlgLv^ zqX%>Q)(1kdT+*U7AZk9~79c8I$kJV9ovdloon7OOQ>qBt&9mM)bOn**taYF#I;Gfo z=BV%O3IG<~pLXQkRTdpfI_)K3*efK@75}>c>3?e#^X!?el&?ub>8PKQ`dy=F-tigm z1PnP}MAQ|cf*PA<9UFfd*XsK_sDH_;(UEwc$*a)lmD-AUz_{)Eg?GL&E(bt>~hn{8PV#(HkEL4ISzp9ky6H z4IDe3O2MhlmXOgS#9x>o>;_*R%x~FtrZ&36#CQ5n2#h}TAX0R9MeKB*mY{Dk!JY%S zsG!-hT{ph7g^7K-_Up3ldVu0)b7oRq-8)OLoI}AoDC-Fgn)XTYsZN$=nn7X=abXMBZ>9Ke`vDF7OoPnJ(G%x(M$&%^S)zhnVGGldjQnpqyQ$~2P( zul52F&AITz#4@PNV-OY|NP3_s8(@O*g;w>JEQSl#vpb4m(3Wz1V+_`W5y^#p(3+#n zdKQci7l>qO`9OCOBxj)%$+7+e=fx-yo~>C}3Rq?EoIOacCGUgf>%d&t6akFIU4&cf zc$y`FN)%VlczGJA6v$>jxT;|4WHheHKQUb|56OG2kII&UMWvm5YFc(52k7yXBkMmr zeMFzP$WtS}s+~JiVNP=qzAc+^LF-Ci+5XG(8vf2XN_n=h|CUSd4?NLi=53{uA&vKM zGmlI6i0mz~_+peCN!|}TGiFOV2xp;CFJW3!!MgbRv;yU*c+GB#gMa1AMnsmCV=nvy z9&PI{o}G>0qMjgJGBN~unf{5|Apgnumi8vlz~Ydfgji7Hb?XPaINM;}qu6r!!4ig& z?uKa$F@tJql+5*GX!cjkRZ|{;tNSJBf8b~_)^-64K%u5U*i@ZDhO8mVLOD9$d6Md( zw0m9=>FM-rXg;r^xuBqlf&{X(|3F1$Smz41Yr8zn?~Ms>m22H=lgAvk>nD>S2g2ac z8O6W~ktw}3IUIbYk=%^o3oLM2(wkBDUjly!m{x18EEk6-FaM~`4i`Rt46-akFBiXE z`2jiTIc~vPyRQTWrLpZ(%R3BhkygOSR5aY<<1>`V$qO&O;H@P&#SL8GwB}JUcwWwvTs4Zua z>yY!7;8`jzQ6{Hm>2Mzjc~}$(84JNMqJ^kiK~J);s+IVEw)`0bOzFS=}IGrk3I`mNzNW)^I8fyeSMlXuewL?K%98T8Ytz2quU5*E$3-|K| zjWyPG%d%%V*}@(lq`ZpkT7P`eWIRg3u_an+5=!3qGXnT^Qh%HBPs|P3V_3$e|GFxY z8xXd$;3ADHiCg_Q(H|Pz%VIA+wdrj#`O;{ z8XnK=1vSTW^tCcQA}b^F0obp#Gtg|y^Fin>J>L`$t4Nu9)qkv@p8l)%EQ`{M9!?Wk z^|s0HMrOiiXsM+#*}JX@q0iZv{HE2PRbHFJA@zw=d-k4ZB+ei@&FhR*H%4rkIW;P-jwJ>{l;lQkOqOosU0 zo&Qp%(kY0I>h5)$$nPrtRJV5!`Z8W|d{eZpvY~lLC)rcOzijJJ(TbxM2F6q4j(lhj z#SJosxg{)*=z)W;zU^T@^X)qszC0Jn6Z@`JrZJ3S90)1>(K`0dXRO0WV;K{XqBy0z zSO}}dkZE?NBP)Q8BdGWuRU&u0GJx8YNsK-7E^0?}74i5sTWPA-_XyXLv8)yan%aw+ z2#bc%+A$15C66RuJGF{GWx{g$>VOSBO|&7D5)g+}&!Dqe3RX<1ua>O*n6eLGrEC3e z|AIWvQdp!Q&rcpzx8GKFI!&MJVbjPpkVQ~z?$mLEsG814WRng&04X$Q&irp-Kqm|V zeEiO)@m+w`6Q>U|0Vz}v7f-oIcW8-VD7BQxFEO}csTc@LIo4+y@4Th4dF@ys<0n?% z>DBdj`A6X?*eUP?FLIiT=>-!mhu{ZFSjuYJ6j>3?%KGCUpo=>DPr5#8(Zi#CC)X!O z+bjAF@(Q>lX61paQDU>lEf)XB)j~3UbrF^zoW(zXan}>Wq0suIB#-f@U}~CpKlj}K z04@g~vftY7KGh3py*HRwblUqFCO5Tzide8@9~;jmVmZf2Io+Jkw4c)^tworo?!G!` z?b*Dn{Sv(<%r4A6=@24j8}h{MoqXr#$L*BPI-;iB6BT$PC8buw(V;vs^>24JRpF}O z+N2S)T&#D(ewz&#*!qhsb`s&6qonOLT_IBsGhN3E>%o#rJBNL*rX3aV z8}eo02>ixXvX~3@Cr;J4K)-jmJl_3ckxDY|?<3^?PeHO=rUMt%8`)bY2W3CX`ZFU& z8r1Qxb*$c-1O!H3MGu%mt5cEE@}Q(@*WPL!7OdCY1w1?8%%ey5+%Z~bur)GJA_o+- z%x*Nl(aBoYzhYOqe)mhLl@2h7_Fk^#XdR-BLDY*#%_t>c4mf6vWz%ZDxalJ3u@>_9 zw^F~0PSY{>1j8xrhJJnivUcAbs;KV6lYsHIMeSA}6C>aHARyX@>Z)$e!8oN><0ce+ ziS0A2^rqLK*6STz|FGdA;k5P(cZVcad9%;!YO3*vg#4Vivl&o93RRoGpA3s`Thvc1 zPcoR6r{!WxkOB_g7npi&L%7b;tg5HC8Ug=?c~FFLd~l;Y&%_oVXY<;{QF2XwO) zJ1C$yGy5tBo`zoIw7(>C&Ftto+oLs)bF9nR_bPw6sL?oQFK5+{dRB|$t>XpGzdgab z)2uB3Wx$reDhJx|IPvfkpT0NWWtCNMME{%UW&j~Jw|&KMLMxVxuq^m2=|3I+SGj?G zlKmq2i}_{kivwGw>vg5uzCjkBiH=9SO!74D6$ds#P}-1XYUTUM0d?FB%gSp{=&;_U z(hO z5mnPfQ+QkDd5vcB4L+(soBshk_NESVKRGdvx>qny92l_H8fw4c>`+?lnF zndeuLV4u0D3z^FWg^&_OxEmCdyy0$Z%HhP|vRaRNpPxMXt13sDm@5UN{OZQy$!C;P#QNr`03YD1?nYAsr}rGK}2H{C+c|HG1wc}21k zZx+62Z)t`26xF#kAHIAI7l)=Lw1ZAWaps`)D!8eY%@7!l<&Eb=9$Ib7+ttn6R}0f3 zHSyjEo)`q%)GcL$LI%LyyI->s=l*yA%J&y)(f*Ua4-k%Fh)wjF)T%_Z_a;_OA1rN?xV90`;O`4`Q2f;|yszcD74%@SKWp(D&}F$gz%zzr2+<#k5l zuX*)4IVuwU!Ogj2FsPs%hm7PdLwmPY60m#*ntpAFN^pJrUWU{9{zRM2XL%Vn0}lFL$;_Vduy5gRZlUV`_4JkuEt~Y)MKnxl z<8y2}p{Tf6fHWvKq&|iqu*u9SCq(8(<9)SneN9r zJ!~P&T3J&6;Wyjy2I>QuI8Xc}PukWLh&OPkbCb_%lzLvhP!lk7OO|G>VArrJsCsKx zPEcXsBlbRTa6<=)bxz)X+B#7qDWF{XO1C$`$owJ_uo4z z?)Cl|Gg2hDJuA#|JewT=rDxl+bO-)@JG>;C-ftRW1rkFxZ|8@6x%;Z_)tia*MH}4&wttP*|EAeq$Wkn>Xvty=8yetr=1YFQi+}M zuf_|7q6aHMSGd8oK5(1)(=^>ml2e;BwB4b-4c41ogybP88jqlMb3+;v+M=b8Bl^q+ z#2P1rBP&8oNJ*8sd?p>1M5&w|Es{LM0~TXy*Ydq7Zcqvl^7gLz3?@P-0`lJBQH#xA ztR1x4!UADk)X(9_BssxTihysh&v2*vO6LAh8iJE_O25oh66!mhz3VwJuat;*9<8lr zVH+;2MqjE>KkmW$cv4flO%L2VYS9}tP-us2!!Ieez&x4IY@I2K7LnB1i~-2Y@&8ty zOJ38MH)}7}(~GfI6ZvECa}<-Wn6ZP+=Y}ZBSDy0S7A{wm;bQ@4=$G{5w4^Qxi2QeN z9HWOz>rl6__{eLbuDwK=PO9ik*b$dUI2<_aP#Iq(K8L3HhB7{@<=?b)PvOg-sBDfW z50-egD8IM$Wj28H$OA0>YiZo!%YWRO`QDXhA{Gy}MXatmN?RR}ya|G4b1atlMBMl) zZwor(0x|ZoJoEm9#Gr$$?XC5!6Mj`;@Z?-@4YQkp?(M`3N-3@3KS}z}g6z$4lbxr8 z>fki_8Y^EDFfAQX?La#vs4>CpEcT%4Tf>bL>uvD~L`pZa!NS)^-&hLMB!XxRH3bYdOkx8I zZJaT`6lL-b&Tcd}BM*>Qf~G>4d734BcXdfXjC)gm+K{2h4$Q=#NT(7;;x!3-@;@CVy<1ivr-XK1! zKK1;VrQ{nWkHy(jKuNL#VmmXX0xR+v%ww7nhC*@pde`u5(6IqSeBjiOb0X_-Wutm`|!j)8(BVS7~g0do1;_X z&vHz)wN^BdeTY!U+Cr8{?TxW3kb)GDm<_cXB;0;$%ZT}3uWmF7J`h!<$ zJBoDTBDulLVDq3>8fD<-V-T>cn(h---XdhDuN+KL)NJ)8DH*@_{&D?WboIR|}z zcdAsH&?yM@%Unl65wN(zVmFt|l#Irmk!8meNzfaz7imzj;`U#^blu~8%|&h-v(mo! zY1mLSi?t01{$v}-2yx&cZlSFMdD-A!HZ;Cy@OwvRJXyQ(zQe{h5+9n^RqNVYP1HNd;Z~t2; zmQ~OAV6R9zm%JPA#Y?0ma8#0XvSumH zoRk|rD`XJJ(9HR!#FKY`vSg7=EP6gw)|4@wZA45L^L`oMgX&YPy6_GZkiaA~WY#qT!HNZ2~S=Of` z1|uS}-))+67!0T~Y&;jPRHeths9m-*8Qcu$tS0${j0UwN7lSRn5W10mJS-elEl0^M zj0HP$TGkx{J>5Hbm19bN4NaHY>9Hw!v7>WTQe1`{#?aD-h0kn?Jt*Gnc(p=>RmE<%~mZYH{g)~J|7b3oX_#uw%^8ayC$ucF>7y=2>24ve+6G0h?MXLDCu za#lyg--at&h1C0I@W8$OO(6rVv|!`K{h4MmT=g^^R(!LuB<+a)HasX;dl2~F!2*M; zO}Owo3mDf{8+_{O`U*MrTG!f7g**5|Ra(AEtBg5kn%jI=6XItSq+rl*>bCDriDIb0 zwerdw58<^s+>55)v1dzyg1f(?Aoo~qyw3gU+?*c2HjVcudJC5L8dbf z7`u?yM~&o}J?4DAaz;>UtQ3_Fb$CDBp!k~?|NeceU0*O=#5z?5?Q+7;YFXb_60{ey zIT$k_VQD(1ecPHJv zeM>emb5Sv$u05S8r2<2gtCbx?SZ5+UT7YE{`WGuQ=K$xw!P&j@cYTyf9+7H!W_e)| zs=AHuUP$?2E9zriL+X_H-kH$P?L!R8f`rC1-4ti{l7t=Qnj2Q_Mo@n_wxm4OCx2j-R3E8e`9NU z=J``|!~UIxpGLX0d19@AI2wdAP`S48FRijykehpsNi9_) zKVM^8ddDFBqEK#1pCI#x#ZTeCU-D8)ERqZWQd-?tB%Jr3sOP!H<-0D7QGVNI_wU$P zZ`%Dx$0SllOuSwpaEJzDKg(b#u3Oxk@mRO&ycg#-W3NA3`1{9s%B;Bjd8VCResB+# zbHD{v1+Jn2L&8U~If3tb)9GJp$|c>co!_3dNy^7+qgS+H8WN%G*3ek}hg~$|5q-%z zm7J8X;>XO+N<=~Ty}u?PZCotvWp>pn&UB?(dEs9}Yi}l6gd^{;NEp-497SbC!SV?* zi<_J4SC)BjxMKAKKYK`Ik1BDat$;Pr`W_F2mlK zeV~8zpRE({6YR45MjI3V!3#Uv+tz5`>*OA=_CyMVtG7p#a9IUQ@n~yG9h7NTYrp*; zcHOrg5cdzq{O-P3#O?vf$y-x5w)N(=rU5M!Uy@ERJYR}N``G{h8m3W+*!*i;P##Ux zQp0m*m^^0oidF15=$%)D@tSSwmc#-G(-? z6137%nD)Y~Cb8>EFE-2`M4{+;ZqfJQz5e-Pq*rw;jvFJs0`EL=H~m8mU+`dWYgz_H znK;^K5(i039S*+(qD=|du0&pGtCztMM~%AtzlE)O#ufRAt`oFBO%Mpw4KIp27uJKwp#UfqH5J33T)&oT{<@FI$ec3tH8zj5}@)p+%4KDac%@a(`00$fDg zw}?UXss7Z|6&3W*U4ENaV`mZuFiqm%$i4%<$wb?e(IzCaMdN}+`3cucTw2@QyB1i5 z;Zbjm6#1#KG=hL3O_ymtc`HZsKwFBvAydad>xtJvHS9C#)qF`v%{8E3O;rp3fz# z4`yyW;T+5Bgx9F$DplqgZm48`6iBbiKi<(`(Dd1~a^>>l3noTm69F$USbd?1UUZ zS$!~VY_W^Lt=cCxd*|^{0sKS4ZiCZhNCIWXX%bc+FK|P=zwXHuU*Dx%E%jI?JofQo zpb}^P5&iQzkL$MtM4z&d9ee`w3yhwFaw#=LxVTgySAp)}0{4H89lcyfJzU8vR$y#( zbz4M3bM#!H?P92`n|>ANd&%d1_WuL;%I4C%(A*No{q%4lblsEQc!lDrY~NOpkBv&z zHJ79{(5?3l(tv55qwUO$kRL&Tn$0<;kK!leT{*k){R)K(2E8%$ft#~t%GPqDQ5nsv z&g^!yT@}F4J79pcPAof}5oRo*haYRS8C4vYILImVhF8?%<1Otr;Z7I-keQ&pP za@jniW00J*6|c|kOuzTedp{ZP#INHp4=KS2@4#ZapZZ@1Jccbu z!B=49_99}HHSn$kUoMRdiyt-`+!=Nx62EX1)m@PtN#y%Oj43TUF7ioUaxcdv&uqlw zjk~1`p-Ux%kf+fYETuUOD<-7TG69Ym$)owC*;_)yNc+an#Q2=gu=R#-opgzQSfm;q zJA8fjz~<*T;tkrLQn!;g>@D5f$mGC93(y``nj!I`fRJ=W-& zay-|@H4?G5=hFIoxE;x%VXo39H8>cQadf)%1J0_%SO;r7lfFzw#?C03_{=?uq{MN_ z#$54MC{&vPz>n(K(Y(&;tb>~3npQen3JzT-idND*Xw%P9Eg3`WRRsrGz3b4@t&A#I zH@Itr&~mi9gBX~dI2(B+exeoxIvFCEp58W!S7TIMXEs`9JGS|al}&W^@lgytnz5E1 zjGwU<3YzN30I{l;a8t`JoWzz|O#;@I=zfWQ)HO*g zBL3BD-L^@he_;_UgeXG8<>cZsvag`|nrn|!k~P@b1(VelKD?g((R+k$E%kr>?O3vL zh++Lj!;w*T0nxMXN&U+o<#{$xkGpIfwV-@Nsgre_U@nQu9ZKx6a9$ z%1_kF=^7ihy*Odk3Qx_I^UXVx@%CQ{H;Cr{08ZQwWS{;0A0Wv;R@6}J#x~PY!VP@1 z<`@&IlIzI!Ya@qbHpgiy5=RAG@PC*P_MZ`kF)1O(+;}^==+#Ba&75_`TidEju+ZvN zfb8c+b7_^gmLsd~E|a{i?6|3a1A}iKxkQiM%ksPXANH{Ei=bPZ9eE>J4a{0*J@K%U zz^`MfpFY_!7kPtIqug(?&pubBsIK&O=*r>Da|N%rElDuh38WXxcMkKl7do!gz2hr3 zlD^M@7#WW-je+)Q7O0_1UWuP#XQrY2j3lBRFiex$lh?Eobb0-XsgVX?M92v^Y5R>!!Pe?~$cea@TBUI_*wi$|V;N~aW8BjYusb#8F)_S49e(-^U zTbp;!P2VdcB6F&66{+kAiGpREX{?3B8lI_v9dkuD+-2Ryr(^X;B=*%adH2f8gRo0h zkpC114g`x)Eag078F4yiM_u3JBYX$B3>70r)1KO9zNs!c*Z_;b-V$chY#hK)dL2yL z?YFB%6Pm+cQ_w-Xj3|53f`u_J(bLyr^fA7|f>S#&t7p+Hpqk&gbAp5V#<9;enEjHK zq$66~ynrcVf_rSZaPfhgi*Gz=5c?v|!hz|iHA63;Hc@|MrX{4-Qba1FLkja%#)DQ^ z%57!R1r?YP_|^rj_R+SDP!7J%k9p7?i0@Cls?aOztV<-F+IDZ?9BA#VXM{r4M>a+s z$nsu{hRbLaMJ`^(JR#+lZ{Y*ahq;-)b>Es$ee5%o0cT)LZaD*AYXZ|U_TYa2=!wYr zfcijXPi5lP~K4@3mDo z)#uD&bjwtXBkBVE_H+)W7mke?`N7P>i-e$fw(a^hdnGt=F?s&qP&j^+;_I2z42X8RP8c2-jUJh6{i*mYf0`Kdx?k zzStE*T^$dlnVAwn3NuN6I6@5o8zmxwK(~wI7mE!tY3Iu~7z!gmdrIuzIuPOU2AO|O zC>$u@rh=c6{DUiG(QD?XHRW_tw5k;ZaXNEBS{<%z6YO8V=h zPOrzgJrwvopH4KbLD;4u;E# zhFMd)3Y@QQJs#3GV8;-q+S+yElV$|L=c4CWArCPHDF=|y+W7mp? zhN38`7%_@(%(jZ!N;UT0)NX0f`Fr#J56|%&_vgN^>pbz_nbk9Ds1@bME|wXQv@F;i zqq&naY?EE==zsX-e?4^c)&BX<<&nz{PbT71MPT1?M%%JyeN@HC=Xj}>_H{ai(~8$N z{*nB7oPSh-1V_kBZqCm%mV(3RG*x9q#V8%;U2S1`OVS{cczZ5pHh^5FTg6v>I&g}^ zJP>UaVbL20(YAg!-qjiSML1@!tSou+Dntzev#L{+_7Qa6OXD8zi>60s1S_YH(bIV{ zS!R^Yu10j1(|9ViZbNwz)oZBl#|;nok?>l&?;)6j6SX9uXxETY_$F}L^CB|AWrKSU z)&9K(bX9gsYina=VzZr9)WD%-p!yV3^~y>UqG3NZbLBRdzZG^0|BOsDmY|2HF9yji zz3wclyQbJOlDUyT^TbTeR`rtA-8?yuHWs#YbtSIRZ`D-3&IO`(=IoYK?|4TjG7&is zMa|2D|A}6_EC5ossDwvN^S;*}UJ)o35wE|vQY{kJsRe(<1twJS5!fF_;G!@Ldg)9# zJs(yDb2C$8pcGdd5s9N<#r+!^?CsAHPy1Y8;84^&+?pA14ZZtVrPR)I`hm4?yI&qY z-_7#eHl$C-g>f-5nrTT+Sa_`M4%(RT>hLSF;d>*nRD} z4_k3i)hakY|4=lm(e}W=J{SX-*pBn_+?PP*AE#Ipjao*z!=y?eY0qS|pPls;jy<+G zM^e@tvc>uHw`OimwkCn34kn4W0qhK>rJQ|H`ko-%K66NvCFQg;ATvBOOpfI=aRI>x zlb`d~=P6wqKaCa5kmq7vVVn$Lg-p4slL%OH%~t+*V&7gwkSx_d74XV`5w#HgLF(y8 z#-~>=#5w1O%-cs5G=KOqc*fvSVXd66Ac@RE-oeqldLKPG!jx!wGrWt{;AjqE&&s7% zum)RP&o`TxB4IYEf7&H($2cgHr-br_ShQFB!B^;lNaSy_@d4=|n5C?v?1`l1wEa7A zd8348+rG3F(4nmW#@pYwZErs-ch|vM^j^mP!S~t+(tYZpXfqRs1?E!Y_?#Q~f!^qW zuuff&2mXV3|F)TV|3GP8@C_&l@6X^VFK3@F^{~r>TkVs!>WIY0AvH?;ewHmXP(&r!;d$rbwrEJ_)cj2Ucx6d{n{998hvsIQwIQ4& zN*}!tY6HR)9Xq$LHZqB&Yb>l~+?P^*#}Dx6$V{SxS%7QO2yz#_PXAfe=35AFy50Ng-s z8z7iX>RJ&MiclCbTBQj)BpB!uVN*uKv_mr2_?P0R%D>1rS_Ite3J|w4rG2nO0~!qP zKA7m8z!NKH)T3tjy#HOU%F6KTu5@qIRe{#WtvR(xQ;P9VoaB93 zSo01&#QM0&yrSoNUPim9R-65aqJvhr!5=Osjm!9L_gRH;{ z7fn_P6$@O&%wlU_)kM{ztBGRrW3|$kL(J*iZ%hApFe_pRNs|B+}6*MR1Qb8??#`PGVD0wwX>zm-@aZ{nnz z+NLN#Ac^9<0SEsuDrrFjf?zoFwE>n~UDvJzi%GakyWtC8d8Z#O*3Ap<9NHW9kDAw( zA>7i80A=O^$!D3~(d}efJ45oTVraATKSTpV_vmZ2+s{ogiV#EB9;`jP|4l{-gO0v; zPd*FBy?(gt1g|61ksfbvG1g3fV~%WQG5prcZbxgOU1rdl@dlh)%<1%aJ?w1R%!E`K zRyAi5!c>TW+OTxr|N#IzTM?wJKP#xJs&goD$R#l0VY zIA~lpm$<-)4l)Rq(dst;`8&|0`9FZhb@6nFVML-1vsAS08ZXoLfiQr7C&A%_OTD6f z<{curHQ%}FZJy?*O=D-Tdn_z^X{Eg$-#~&war_;9n{};CsEl8ot>DSDQt?`KW}Hbh9akg*ez%<;j`vNP5Nen6co1$4vdVqLz{s zJCB_Ed!BPtH*cE+hLzi%lvPuyr&6Fpb{eSy&~fOn2P$i_;m!X5ktUp*`1^>lH>&U8 zH_e4H_bLn99Cjz$=i$@3erMcNH9UQ|;HS0-XcF$BFE?77aJ$SX!cZQHzHr=qnNDBs z^Rd!=FCAzkyB8mLo~_E)FWstVb^iG)YxTWyLW{InuZI+lhksf2i{8gg)6;YVQbntJ zmU|Vy?dMzI=>UgFBUURL2|lF5i1mFW^HMhE!_!Auf!k4QSySi=-qtrZy_xPTmKhYj zGe!L}5##4lwJYp`23bJphh&PzyyXJLz`o&@;Qf_14{QGHv=C8Cs0``Fqr zu3-$jHeG~Tlf$6inRm?LZMBbgJzEEESSL>`JF`BZ;=>~22GOm7`Q`2C5Moi)=8e9s)Ki4rnVKvTJ6&1_{}tHbBqr=|n* z01<)`+v{qAQ&$%;ujpnZ579b4nlT2$-6IUm4$ZfZOc?3VazN?xG3=a}1TwZ<@NOH9 z@O@8ArVnNovZx+`78EQ*Eq^oJQ@JgrpL**CA5|Q%8vcrsI%oW4b3@p*CFL+m%35&6 zG+iXR_a*Pf z8nzPze2aT&zKltfq|W(cr@%q zo=tszzSyiSp@R6sI6kyb{C-LLTsFvSG3g)mlYSAxjUGfBx54VG$okv88>6Lecf2)HVV2+j2M`}rF{bvz`Px0O@JaeA|9Bd)#bWx;^G(Ut zkvv?d{~=QSmjVbmE$z!DkTX}Yle+!)7?*-%ColHiFw-v!qKpMRqfvF-0 zp8T(U;`YV_fJ|!hqpxhaqN${5>C7J_4f81Kf>2KEpn)TMJXy0H zvDo0>Y&eqROvVV@R1b)GX9|0&2!-lBE!^BqP*jqdeW#I92RL7+iR$S3Fxu6*&n7)~ zJy5(wy#e9ZRA{)|eUya7V*Z=0A~C&LQ2LVgin&u8;y(dAGHwg}`28wusw_&lKs8FO zm1phNVQCsh0}&Wd6HxkftOtp2XkQ@`QwlhZSf=dMmN1DP@dk|@bR}2OIe}KT76K_B ze;}iQ#e=qsteUeJ4(m2B7@`NJyPu=N7`NrIA#6Un4Yv}Ziywl88`nU1uGP0Il~g$q zDs#0;KTA57E*-V$Zz7F0X<8rhXE;83`M_GFuDlZN+j(Iq+7Ec*QcZbP8zZ5q%7WAR z$(yy_fRQ;c>`JTS9ZB2_ArL$oN=c#GsQzWP7{giZkbd^3l#*E748m`Zv#^2Ymo#5L8O0nl2~ zs}TauH5gXY_7;rlS75G$^H9nMOA@jhFFpfxQA+<8mbQ-U*7N@CLcuA3q%^7ks1Fu2399 z4CyE}kP`go0(Nyd@dF3Z^rqQ6I=qNY7>!*Yd2m{CuN;w=>+LcX2mOuR^30A}KVl~a zEl_Q@!m6zM0aK9tmX=AqO9gnI1_HWmY6N7?yX`>?f|MWLqun7>qUd1_hci*!Mu}K0m3Ive)KpVz*Bh9l6aLuB z$U7`{Clm>t{sVY`AX*6_>?a>meDC7-n39AOn))~PDLopf<@(xpN8O4SmKfY(4Xhmz zV9)Wbu>fbp7<*r;2eo3^BIXnSTVj z8n@vkNq^BNd0ju}_)_uVgFEgm=>GxoW*5bx!&UEwn-wTH6Q>AE^PJCAd6(##qh+F0 zLF*wiW`-|Dy=|QQl9eWgIWg5k7wj+k7vA62#kxCUtm<uT;K$NadCEMaqy5jL8_(F44(j`z`{Pn!!`$)C>ouA&A_2yoXY;&rUb`X-;8kWA~OG`#P5p zs+~d|*-!&X7H%vK5WuHe*oll3I(zgEUHHh^Yx*}L2wXLJOm&gHULKL#oc}!!Mys{? z_DI)^nq zeRBxqRvYaK$F7GHG?Wc5r)z~^Mw&#Q=-kj|(auZL8T%2jmusulcP}C(n#fi!f#WrH zp%&<}0AbJkwFzAalWgbDn~Z-JsMblMpB=tt3IR~gW!y3~QWMR(+Mnv89$GHGJ1Z0bt-niz5^&KuP3PM0 z7Ig$FncY+&kFO4_cGM!EtT6*t0h8q4pC;m&^+c@cJUjvD73aLP2CouDr1-@Qks*NP zMuBMCA?NS3bn0UIDKxv4966HRP=ABwn+BG?{k9#Z@8>#HI|a&g)4RHCXvdF!<~P!i z<$42*P|-T6u_Jv>auUnk`!PZ>06P~lI`*XHtO71>$`vuVc00LU|M_Ej&(&RJ?>m?% zhD=`pjrZBj@^Xp|ts66IB9A(ZH}Zl#w=~m)kd*W=rVjc~Gb{@pYp4&>{PX4UDQM)s zfG!N^!&s+zrBl`W*Y=WAuobSylI;I|wbXk(&8fsynPdKrGX`Dv#2E(!;>U9&!@=hz zzsBJt&2 zT>H>2!?mN<<|Xr>M*|<;`|i?&we!08E;0r4q%=aJd`epU9&0Xr$@pT3s-XqPd0mu< zR7RMzvXxwQ;QE&U%e$5c`>G6QKE|)w6bYRLKb9repe)&&&}5_OzkAmFs+%dZ?15-* z+3%{HE4#&4wR-K`>{R=6OB*T-e|X=Gt~Y{nRuCs@fODc*0ZSa`3#RMWp9MoQzMzUQ zl$gO4UW@xgY41-H+p@HON^IN5O!GR#%IfuSOcS}b8=(@8&i`uN%6;-B_m&k1t&oE| zXVC()u(LtS+Yd{6Q!bdnhK2YfJ)qS35w6i&+}B%6`w1(VL(}}7%uabkTMb_K)wbrC z0>_lGIU(XBH7ypbJZn9u#c=)W>ob2$mKblwQdI$}?qr6t;!g#u`~K&Ao+o$gAs1vI zndlX}DHjntuof^`LVS>gGy6rN2v@aKIIa5sU@YP+iua<)t#;Xh7Yf^vMf6`PPjbmK zHGgcsUab_ow19BKxE2BPXYkdvF|4f4OK`f~lUAv$#S}EYLl`0WaPymbWH83@i==}q zXJWM)9Zsrb;6vI#RHCq{t32)XjzERP_YMgE#pn zG_HR)hC*cu1AG%8VXv=$lT9oarlEbX`dGV%)*bL%Gwn=F_J5a#$7>-Dl@Dmd-tVVyf5 z$SI;y)Fs@WR+CYy5GP~tDJ&s2L~ah4apk%L${%KA&xd*L?D56Fs+P7h2LAV73RsV?kTpp~4~^+*IgVwP26~{n(lS$W zvETLko!-q%4Q}AYA0qPj_CehAiLzlmATde4;o^l?UkY{-wH@pYr)eke6UvNH`-_w> zu6)VFF+Dj3nkJ?&$+)d?2=wk@`xZ!W&7<1ovNm=bUKO*i<;+(Saz&UCj(~ylr+FKt zqM4SHTMoBqF@~6B<`3)1MLCNpYFNV!=j5OFCx>Bw94dIE4K}@) zFEF&BT&GLSqL&V>lX?G*wb(ftA4w$jwD^atBg+ysL5J2ydXVV9p^D8StnUUx#f`q6 z>t^^JMxC$NI7SSI1*u)4;#3KMHU6Mzfcb|YUU!iA@zDER-p0h4v%4Cv(2fq|QB)O! z^%Q>#qUpd045oA-ham~VCCOsSgIDyQVO9x@M;x?Wa!*RDoE&Y*2j7q1;x@0>yf$*~ zHHb|j^8kR<2yPiCMTf2m=@D;XYKHb6TfF0STz1^T(Cp?bXZgAf>2M>eYNzFhnbeCRq~~9tst}c zx0qp5%{TY`7c1UOO5brE?G(DRjj=dueb#zv_du;q%9?F5{h_0FS}(vH>prM zh9)EwFE5ltItA4%Jft3)7Dwb=hoxF=ae4)k)&pzlSsZkxp-wu3pz4O#nB^Mz7cG;E zOEDSAPl_zv9e{u-4Q_6|fj;)zHlC<3b#ox@piBXLdf@!S)xD;IblLWTGb5i84>x*g z`q)?ST9J&mxAvX#PiFv$RIr<%=A0(-qod6G>qQGtpb&#uid>BuUAyg|H78e-WLV0H z!gJKYw3@%loP9&iFB~ZuqbOdr7$n_SCzr@R3{O)#gn^!sJrlacRBN!~H^=AHXYgoR;Eyc=&eX(MfObzn>{-xo!c6XSDwu`+Yd z*E3{3gb=0i`xB#fI$pz8za}(zweW zUNp0t3=sV>jSi|KdPXuHm{@Pt`n1(k_a~`HR;^Oo9O2l&(Pm|U;qNke#lZiT7l`kW z>YLJFH(PaMlUHGqFdie3g4N*58`?Hk6?REi{tJxP2Rq;mA!T>#FPyIM5Nk){-a*rD zRz{?7!mxb_AJ=WBul;G$xE;#2#L82;Ki0JNoP>FCnMdL~%fjap>T!vtmNFn7+4uj6 zazE%ET$SUT=}aHV$*gtyeo#^4$*=g6|0{?5yG@=lhWCk_CMj%{6 z@Yg>ZnAzB#Npqw$k{uIUpOW~9g^-}V0)UbJaBpS8de0!}@1IGR9RZx-{{YRUO^VAx zm6+=4ax)taV7yeiPN?_tn9@wBEX#e8|h~C5@bU*$VURh-$oG>wy zyKT(i%B}4E(O7fY4<(gN;Sye~$y$7Bpz{4vTCk)=-IGLmfvBfF-qsG{z22fyoi24U z2k^3ZED_^2%|PnZ_}gKrkXufAXX7$e;x6>v%uT9>^JvSha%^zZ$!8JGF$6uR?P zxK26}d7&{iIfa;3yJ=&6mhNbq@-qSQKfvU1t_KS|p&Q`2Hb_onmU%ZKpbdH3vMu5Hrv2ofxhC=8Qh!`w0? zSIbiH_%op9V#p&9kEr`p1RBKu>dKYG7vWYJGyz~M6u!P`NF*Lg=iPCXs7TKzJ~vW0 zn&MK+N1nn8=+~QSwx1zc@Kl|M_xR_Y;_Kc~^E${NAv)HFMs^5}(Y3uPLUR1`C^ln1 zOV8Um5GqaAyNhQ7BmL)@B!?7+2RNTF6QJbZPWfCR5B+1-iYIo!aI&W*o0IR~nyYt< z47KJK%1q+Qlv?`(-r~#h3yrEHbXl1}$=&ock}>+`%pB`d>oc@>rft0J@(;vO>^wy2 zZ5iIT)Ul3kv$(7VJDRe)JI#ltX=kZVfCsnN z6YGPV04%q36ZEOIt`MnMZ-utjU&%9u@A{3xUb$B@y#4*D@nFTVe45ys%S1$IbGL4o z23xNYo_+j6L!f9H&9k0SEQajCZaLSuJo27rMHx z$VYlbNo7)8BlU02Zh#BBE!2aXb*@PVV=sUFEUOI?=nQOjz(hAZuDD?f+=f8%lPUsK z%Mw|##SvPYT)ZRR=TN?w+P_X{e~Hid2xPtbQS%DntiF{@F>EvDV=RF)%9x(h1)F+u z#TNfP?my+;NV^I*F>-UnD`e>HjA%(|>j-ov3|lAa^J;BV;jVW7YMtmkjS!f%a4=b%}E zBaOf|_p7JHQx#L1mxu`iho4VD$!W6wKo!K`TPEers@45hp)hgak#uKA>zBJRc5bVo zNagqHH6F*zhTV2#jDmupInTo^h{WI0;_8Fi8n7a!xA%vRoH6+du!hxigf@Qbkjwj| zqemrM>FoNAsO;`wN<5+Kjn(}yP6tH@XAK*r_idXkj(AlhQ8xVT5&fnWfzvlJrD2$D zCuAxr*d>euiC<3_$^SM%K zGOQSuWg$Dj$3w*y~!y(e^(WNjIF+ ziBt{=V_~!>C+)Ker)Ar@fB=bW4%kit{v1pPK#HsbnluC@!VH{!hrmv><6mC zOs{=r8r2=ms989=*Gi}LVu}$s< zfE_!etS@9A3=DQT3fnj-tYcTgqlooQN*N_@d~H0eI9qC}GIFo5tV@IE?-`t{$Z!e_ zw`q4a>&kh}XCh|Y%I8@ob-aC3a6Zq%2kL-$e%0m zYP3cSZUd9FnwxA=BXkMf8vDFSRyN!(2|}fW6BG2q?9y4=MI{~^)@znim{N=F1ifhM zo-JF!oq^pax0t$T((@Nq8<*&U4VluY878Pu>SZT~u>r zJ;>M{%~cfLUP}B}H=pJq;cDEdqpfPcUTWdl<%;(Rh?fx{oOXm6pPUl`ujwaE$+q^6 ztxQ$b)Ld~w9@GPPy4gx#NpiXs{47!yf5RL`j6&(;R&D7%Uoo$Z6ooL9f1RtkFBVl= zj{1J?+Lz0m1D4U@O@8}sT<^cfX@z9xCHZV8jo?X{joKpQmnkCvM?gtJp&kiPI2V$2 z$ygIn9+(+C)uDsQc>Uhpb??1sQM4suvMeAp5MNO;lAc5#waDviloll&LJ2&+b3WDL>WE8q9728aq8MHYq}=-V-;(4z?Wy@((_x@asf-h^%`92Vqx7td;3Qf zPwlBIyB|m2H#uU_>E4X{Q@^^s{5A%uh$h_Ehkav3>kZ)7C+(0|Jhx6CRSxy%824 z`rnB1Q8z)Z)_)0+<78b~8sa=wJ6+9TM%TfF9vD!*jy)REBjcz1Um}qx!mUuNggXVsStU@Z-`8v}DS&9={ruh8Pb_(& zp7(P6H9$np3RwiL55StIWV-8{ifqum*tiOGjJOG6VaYe3Lj1A)6qaS8b^0IlS@&uO zMgpp~DDZ*2ORDnmL6RP%wIhpFZ6v7fnucoi zx+~2Osgq8hqaJyyTR55_SA1=y^d zU$Ti(!H-86_#z2S>pS9{(mmVU$h?%1D7_%g&m!2S+Hf}W8_gzT+Jw@YySSp{+7Z|D zYV&GEc`wfQufrO%B&b_ZxOBkpAL=178dEl90#+Gt^QP+Vxjt^y7<${eg3umh@M&8I zd2+_Nv~^0H=1Hz7isSm!vqcOF`wwUFiC;JkcP#R?0DAiEvr?I(??Cm$X<-~^0DF5A zgV#Oy)-`y-&|j7E*_%U_TNH`96lJts-cKhK1K2n+NB`BdF#02{WZbu_n1Tqi?#1PM zlx017Vr6#zKuWzBQL{`-O~i<)>(8TJWB3K>?K;iPDEi7J;hC?Y?WdRpX=wE!Z#B@1 zy@yFiGBx!$F2Qc42v7o&khb5?wRyM9j&s(b0ji@Pi@qXSP z`-x+aSr0u>qcy;dMiiP9-L_Y%?^h)X+FOVE&~zltond8Ue){AI-X1nzirbE2vkCkW z^AxSmpg3cHNF@)|+LRJ!K<2b_$SAPnUXy zt!bqHQp@SNS6=XiB?|0#7fKP}RRSj?ud@7;NXB`GT8DLH1*9*Qv<#k1hi_#yx-dU# z39stV;o#Xv*w)|4E6V`^V(4MnvImK!65R>eoEwvT6UaZ1`A7wYl*c!oT|P8T%r(+G z8~XXQRP96{t7Qt)!m2*~KLEo`t8Ff@yyqa2k4okWCwK4u+Hh*^xgem#gMM+FMJgiY z@&qVVY=KjY*xJzgbA4`=-(Kp$z66QoJPwyv&3ySn;!4`~v+Gzup>A%)R~b`YeRGy_ z3SV2vI|0R6h}(yUD1|@=^E{`@f`>-SuIYyOm!aO?J^dIfVS-MSt}7$YF^z?z6Zyyy z#u-1aJ3?pikuCuQ1;t`77lRx+jO9d+b)eYV;@8bYPDcBKHEzPyDjp=gI#Op zP!rZQWUyb=RZLjpQ_mdYPfIDzecd9=f?J`Djia6Tq}{e6QD<8orkZCR6#ciV zOR-KRR?HOVJ zjs1YfY0U9ye>c5_+6Ri2buNs|Aw23^3ZkNwOGfWW9ok+ZiS3Fye{bNsY52?q0!~;e zDp4a*e7!ZmN91eH1>aLFEAZWg*ryontf%3mpU~T8H%&Pz{%+fn%Xe@aJnNx9*M4GD zXr+Mc@*xGAocNev(L6Gf1|06Z-CL{@O45-0m=2yS54-ka?y1+~9PKO0>T`UVITmuh zepmdL+|6|P-b+-C#tFd`r4CtaOS*5eik+IG6Lrxaw3|Gyk8#}KuV2)pv>`DU&+5_n zQrhH?AS2nfZ-O|^Zz|(T24F>jaR0kj8!Yznk$l_{UsXWm=I#Bv-ycprYQDn3-#x`eRFU8s`ld}gpvDZ1ftXLd zSJ~Hl0U%FUPV^=^=cd5yZBH>Q(~?Q)84NY`hg+fv19l~LH$(1krMe^70$!btrVA%Z zr6U0zrhN(8K1b@z>UJcghdZ~|Z<%S0sFsDtI~oB#oG~B0(F`ngr$P-0g!;;^tCWf_{`A%8{gaBmiX-7dMvSZwGy0egPtv&A zD^X17h$q*O^|q5WznNphx^lIpuJY)a%b#8|9l)2ScKr_!WaBR$1F3ky;M(ZC#cNu|`3Ve_9vg zeoFXVWpD5yF4b!sh9=cl1}{vu7OkyY25{vehG1Zq-I81`jFjBT4QqA%A(O#jg-J7C z<~Om^KUm^ODd6)ZNZga}I9Ey>oZ?}je9!2Hu@`jUv*6$9pzE(<%%`r@D>iQT_v+($ zo{F!Ro4J#x8V4JTE+t{ z)6HfO&9LJn#z_?tAkaJiD)Mnf>t~1+2~lnaGUctfD(ht{o3H7!&R1*SA{A-lT`YX3CiYhLCzt#MX4Li8EB0Sp@p*d~2un(}Z643F<_f{1q{pS^zq4>vT`cAa6Z8p*n*j>K|E!G`kaADUMqeN74=*^m0Q0 zAlIj>tBixk+LAAw>huK8l&t=z8_9n_6tpGyC#EP+rOy*R(p|Bg-TALDDN`xTF) zu+IDqYNT%*9gS2U!F*js&qoqTk<^2@os0pds!NH<&hK5=XA3frW}SKQqEqh!87o~> zDG1|N6v!xcrH#k;C_|-SYI>&LCa=;z-)gjDB2=~#;Q9C4!Z?PI}^-};OFe+ERn#*Nwn`xE&Z(eO7q7SX1H9GW3@59C$VERI1#h)vR_KxMB4m=g#j{w_ACCe$Amc;^|@eaLw z&YRMu);Va}YI$qO!QQuM|BW}f<&)+nt3%j)v`K>69wJfti81%Ab2A#{ zNk;v$EUNUcADaTdmx?(CBe1BO6_wGf!Ua4uI2B_HfK}Qyw8w+qK*0SS#-;WpmAb8Q z$-=ZD=+E#f25_+~jbP5!{y;1O3juV@X9RdLcFivlQxc^mZ2a(uT({E~)|RP++!CTJ zd~HaDdsXD3Exb0ld-|R2qc-h+j@FX=Wh>kI>#f#&QY2HG#`Tz%BCpxly?cpdHGea` zi!1wdW12{(VP5KfGsoF-YmFUMA8@^}TwV4L#lz`O0M?!jl~n*l)rGpqT= zx9M;dX-xjKQAzaAk{-oMFg$rlC_5S-ktzJX(BMx6fw&>kX%N}G zt96Q3G}zL+Jfa9pIc~i#i$^rk%MEVbq~+W?>Jstpzgun8E<%9p*I!N8_g!)|s`lSg zk`A>>WwmtnsK6ZcaqF+!_%tTc^q5Bt8A&F4U*mQQBDJ_@c6r0j!0}KxD;(!A1YQtV zHIngWjhcbYY9%FRg;9qvmml4d8!u4LMMCrUR&BQ>V+>M%wJFE-9Ph=wc;#v2SIlQ) zBiUBmSsO=-CpMniKIg&bRoD)JrKRnC%F>s3lZ~nUC#67rV9E9~F&*eq{Z;3ezc=%p zu5Z@7CDV6R@V;lV?FPb?aYnob1F6F`o6$_oa36HDg*bHORvC30b$)Nswqmk|r3$g@ z+97;+k3HnA$2f62<@I=sLsJ4yo^7A4g+Vv>*KNi2mc7VIaes#;2wd2R+D<&{ewS@n z?s(@qM!)XnoMI%WOlfDw%#Z5)+ah}HThNO_Zu%VMFzdoK57#RLA~CM1;4g(Hd#)tG z88g_WZ&{io6&G^)k!sK@b_t7V;4(v>hdwZp=4?HcpLG1&9{~1b$Lw2Hgmu$Rc02=` zo?!V8r~RfKQ!?Mm965nU6r;=?b{wmJl70L!h{-vAuHhfTSF^msquwuQ8#oMvWM{et z)~ffDqW#~FXkERDfAsSD=rom`4?3l7RU6v!5=?KSds#w|%5vuUjcy_7C6$kSHTjjq zF%=M6N8L7uHzz1tdbb4`!ZYU>!iKN)y0f{p+(ZhiYt%`U)dfKrxHrZwwR=wJZ!Mg#iuP`ZZl>+NdA$J4XXj z!}|5|;2%)B!gPq=r#dkElr%){7CqFS34!!E;{I5yvm^WT^vvYt(X#BKXWPc7)gIlb z+|;f&BQ~E=u0qVQBPrqxkZGc$@Cj!4Fh(W}r`___Gr%9!Uq%f~9lWto%4v&KD1XjV zubRk`1H}21bm!=wJki*_#{p7FwAWH7Rd{~2-sC{TR?Z>AiwK6=5yQYtX;Qo*-gc#T z#pFfGBBZlF-4U3!c4!@qT6hy@_WP?wwS-;|HBYh#r9O(646aP?%W_(Q{1447c}sg*A3?ous(REnj#19hPPT(e z`SA$9`p0+1Zwv-@x52uF=z-}P+xW<`(humJSZJ|-coOGMrbsojBnqrE8XdLMwLw<> zDQ)PaGUJ@^#}y91BuPCRl1##yII_hr<{V^L0oxPdguIpqHKewN{38d;1S^u5y#q+b zOMQ>kK?c6|68){LyZgXnw`zG^sq~u#0h{&7Hp8{802-EHQvsa((A5~kwAI*mo^fL4UGpLt$$U8bqlZULZ5+hRHdMsX}kGNNs)7V2Pdv# z7kd0=EM`{GJMf3 z3KI*r+YlJ}8{f-KOU&eu4}C=YPGqzfSt9H_v~5?I8G_f_rB_qhz!M81H#kKm%R{N; zgw)S6-Z7$IE01*ae;6Myn}YubuyW#~Z``c5bi1BX{igb5HP8qb^>mUW@;)cV=f6kJ zHzIte)R*P_5wyfkfgYAz0mdT|GzGx<``;zfHZ&S@Bkr>{YsHJ>MH?GSh;Uo$?`f`w z8tRq{+~6NPG@y##IR;H_<2iLZ@$hg#_eeY?d(^VOET9Tp#lhU8EN%qO@Wzn8M1 zX<)>RDYTj0yM8UXm5h5b)#+421UE7-m0K>;>OJEXd?AJYzJbd7u1g;JLP3b;Tp%GDA8>S?l7HmcCmktND!y!AxRkxeTeTGTq8fA?tSH+F-N(CYds#s>3t-M?O5NtO~{uA5cq(--i|TdDjo0_(f= z^mF9*`dIJq{rKNBH^&0eiW;00@z)xJIW#kC_U}(0vDD)fBYVbLUC4tsBqK-Z^Qmc% zu$^MWdtMkmkuQq7=SUwI+8wQ)3@CND@SzY|s115z`Mdq3FZt0lg<3_Tj6Ju;i$Fb?S?wbXd zK>F)C+wI(O4r8AmNhFZ$P0YIUNf>-R1Qs8WD;t+ai4qwW_KZErc61Z0&~OZ*;1Rc% zjP8*hk@AP2^1?~HYQmoYhp`@u!3<+pnQsI59B5Op3N!!NR5s==xI0K)hb>t5#$7&Z z1sKeuv~RkF-;(Fh39AZI(5)(VaF7!Ck;^g{A0Jh)Hne0e&SAJ^oiiryhas(y5Yto_ zNKorpBnQ6N?!FgHA{qxh?+c`}@U;yM{pTF~J~QBc$-ahyx^Mne0=W$G~&$((? zkownBI4Qd|uMW^u-@b zYpqTKFCZE{-AO4g%%%@wUoxWbe@#$Se18!l^Qa^<#lnB>gb9;R>++$0nalP`v-0Vr ziL^*7YCdeRW+ifs@8*_t_}-2;70(JPjTVF{NkVkydO6<}2_FPtl%%U(D)KCr(Wk)E z9I$C?qFKRFS^nP3EZ^av8!HvBS~N4i5Ng_6sX9S7A1UpPULyvTVbJjEea6Yu5U%X* zq5XoPzYU@P$IyAdv-!4hIEcMx)oKtUF=}sZ>?C#sZP1#nAVzIU2(fC!9!0GnRE^rJ zsNGi8u02YPqUGCab-b@X;Q8q}p69sk>;8Psv(;9jj+ZkGm7(;_cu?SbALe8rU#bLwHtqxT6-GX# zyKdL;HO{&hDOmBd#ORfM)g)f$i++++yXuH+^u5{l5qGPTPolSCA~3oCKWiIB^j5WR)K?9lFLNiX)WUBcV;xjpKQBwvGbyh_Pfo1%X zs{N)59#mTQvwjPHEb}XxBHdw^tG1o<)%1{<`GrSKDwDI<*B_K@(yF8_c@4*ZU!%z0 z(d$YaUGha$O88*|_i`qGe-u~vYDwx1 zA8Z0lz~RYXl9rUyUN)`Lac@Tu*<&&DQB zYL}(M+M}j+QqGR)GJpPCn#7u3^x*Jsw&$!ZwJg_sNeNC#|gK%1{(8rbq@*pvDOJ)gchG2vj^_2@J$f zw&HhRm{EH0p0`*TJH-mk%14Dz9#`_VpSGRr?iPHiHVJ(6t_xQbbJ&4;CW%ws@-(u;@G1jI@9;#L!H$HICxFZ8ZX#^!-4rG_DrsIw-4?FZfGx>>x)@~e6i6UNULe*Id9$EtWGN4 zfl2(Bx3yK;Wex7x`shy-9dkg&Qp5bKrv3*I@4XQ=s8wJP`|^VLYqBUcj$@2zP(#vrTHB`f7VfjB75PHoh*Jsv^=C^*_K+Y$LF3!|j(*=U*f7+t;1Us=bzs zbGvK6-CSn0mXhwiVW;@`7?I-!H6|#(u9alVvb;!CRzDj|#DM89mkC^1p z-G{!V<)6?AYqfJpUX^bpklt&ioAvD<#vXg-`}2;SpWI!3^W7NlO()t{Z5<9~JELQ`BlIZ8 zpxAETfLMfX&($r5GBctGMYo5xLq)M7f1c&@-vx1duDCNzrk4^<^@T$ED@sgJ--$}e z&}<1P)0)nEmx;l`JBMX3Lz7n;3G8H&`ss{4VOa8uljmZR za7Z7FiRshyt7^n`tL3e{&>)w$-^Fm!xgR7YD?)B7DJ)&^Jp?_T)_77rsre=%nCTEB z9I*mro1G%n3S`wPF#`0{hrg(=FrD9?u^jj}$+tIPyZWIh+s22ftifa?|GTxukgBYV zJC8^ZUV2RO>ba#g@@%G5tKwY)nGSV&UA{K8x3AIXi@d!F{{%>MGqbN!w%z6o89>4g zS682eI|4LxK7Xj4bh0cBhX}1bX0`Qo*qePc=-T+mI%g^{2gBxR>PxkfFt9k=dr0?2 z>uR>u$TwgQe92rZ>mN}LMAIrf$RQqhTjv4ZTVz>wvq77G)1d3cK_p%COS7}ymsU-E zv?H3e$q229r2@c-;h2x=3S7Lx6r=auu)D~_?i^Z%lRdoahtz4wg)%as;b87poE_mq zD{gA3F+QB}x(%v4-&53ir6!^{R=o7{_gA6}la#wwqIymf5Egzf$4%4v*U{hAFi8Bv zr?~u8A}dtDq7`%l`N;={O1k9K;Db9VmF_PqaQM7vnW>P0mwaKI_nd&MMf9=o{_t&af=S6umzpB+llRr0#9> z(s8-Y*GI?nz1%(5^*c5$icNadjDmO{v&;=2Qx~e5nEYdEN3G}0KDh3jmZ#>LwGli= zWUa>=7L%3=4LMS~z0Rq5>*lm-cPCR?9kXT%YJwniy~5(>po2TW*aK-07``gJ)6bZ2 z%hKhZ#17MZt-D~pQ+I-$B6LwL17g=`R!y8*?G~!j`k(ZSZF!l7u&KV{x!{Rnv)k+_7*%gdz zFklcWMeWN6ccYj7c6Hn{z(Y~dkSsD82xA0P8;)*E^>a;wYv=|3!xTXWg?Xb0-%(3- z-RLU>^EefC$W`=`q{abX2K_5oFu*W)(z^dB_Ni|Dul-2-NuALzR8JQE5 zGoet%yY!ZQ_Il~PuXL-aE^2BCLP9szcXI_r-I6M()s8H^U3)8jY~)N=L&*&&%L3}}3{dd}{q{I8jx&DffH^Ae z!I|!O70c0(2pP}gQpn89WSq6qppQ&aGNXYg!D9Q*rv&}zTP6?Xht{vqXEHXyUTM`I zaU?SRwL?Vgt!WUIHrr=jPWcBjKFe;azDG<VFH+}$MZ=tmijafL(YN!z*2RE?ypv#u0^_ZAu;8z+(i$CMVO6Gbb`VL@_zN`Pp zmi)_)MbF*U<{!P;riwC;kC%=%;vt~R0pG5`b#%W>E&0EYmM$^6PbFBpNQw2c=yy&~ zj$P9n{P|ud51R4LY9UCkAhvyJ>fqjmvo(E&;Riv?>fW?^^-_Dwo13es-%M5x7Uc>K zv{n@5rX-SfVQiX0{;hp$fR5X5vj{tt3@5ZAXXU%RM+pUg{}tc-w}fLO+K2<6RhNY3+l{=tg%7n-=-zO!5k%T zxgNTjcn%evs>Tbsi+e8V?RtB^pmfg{<$uJ&nV79%9E_W3WHBo4jivJh_*z=obFR<$ zyC+5H*}5ud&YFQ~pnGR-e0Y3Gn>2wctwSiIS~-z3YlSgBqEDy_r9q-mPH#;skz&n+ z*zn{Yk5yh#xYA&<@I;!zbmBX&d0`W?4(49RNa$%*sC^PPa2a2UI~$FeX2%PWcPF(R zp3X6aCqm(`okx0I*uCfg_dX}ML5291f!qT zH)xesHYgUVB-OfQbFh<2&=fW?49H&-VY(mI?C8^#(9G8pZ1CUQ$(u?2V$5|^Yn@3n z573vsgMU^i)08H(lR9d_8sE<~MxqXP?{fSzJU!Fh{-;Vp-saW}ll~a3d}epjhFM4) zcY1UMU*Pu}Lw9bn{r+p$p>FWq!s%dc+DU6Lz!NoKoe7Z}q;(ih+71vG#PEmReq60N z@boaHEF%5nzWzxtPLe{^Ry7AmgvF@G3DI=S?#B2B8Cucxabv!2+2J3NoP5;|rJP>2 zbYQ}naB{s>q%BFaBN~_1Q!X_So4T5MSNUH3t}u5#^9fnot+MrZ zW^8I{0M`Wvm!f}835>CPP33m&Ld@Pt^hQJPv2>SlEFUb^;soJKC$8eJbX=w~yaRFw zxQ{mPOc@OPY{zXapW?qoFotIt^5ndYOe^F3;x96>8MISwBWG-jes$ma8&3yMOZ6Zs zXUFhJkk!R~l2JGbG^R{s@~q$#+B=YW8-#nHhL!cB)ZK<`-;u4RUa|iq$&lS7smA32AG-Hp@_DR#a{%suAUp|Cz)3`kNBRi;&Nbdw8wxuOUP6f)=`bAppa}}*WPiVIGBYIrAeDQiGbPXiV&|O!(VCz}u!2EzCuP91u z?oH)6z;<9p<0A8HC@!!w@L*0xlQ-o~1Fmk*TxRa!l*gmjbY=Vg#-F$f=~xB|cG~5& zU3v!5*w>;gUU=V|cH~6@DUWcAL#d+4deGi43>5Oke~b?I;!oLX=zRd>G}pW9C4A__ zsI{+!Rl8=otPJ&u6EGkavb5>K>M{Kazn?a&TZRE?d3nXjgMi72Pa}}Y1O_qJD90qh zbOp9Qord#856ty5?ebA8=DCSjM}=y(fdla1hO5+JZF8vSUyEkpb+7t`)8b!jqLr-x4P|8zmv*rxx#8Lz zL^eIMQ-_>m(dQFny@;91n~7s>{dvDwoeFV+ucYtbTvxQDI&S*%FWCpDE*}4H^xEuY-UU?8 z>9m0+pNi=!o=&Vk+@%4Ga(?-0#chsK^HgS{+>$5eHpt8QXtif$65dnp>OWJg)EnyUNM>7s28P%RSB}z-3Iv zEW7A?(Mrg*R_-C3c__KZL0`t}iK$IQA%IBIPOGu|#PB!$=lIWOLU|ut&x#l6J2W7! zlx1=mwk|*CXKj$Iw$(QzVF;h&p*x(+Ax1YGI{IWaAie@deU?;xuBxk&&I`)b7(k(4 zpn196oFBTfu$NK|gc?TGBM${_jSxR05_4hX>ovHK(*Dohv~TGYZUg|0MHT_8sbrz2 z`yJ(-j;6i|v#1$C#LTfLt*IpwhdQ#~FfvLJrKDi2cOiM5ZPrfr08ef&$5M>Ct8@EU zdu{jneqB4D5``s!VnRPnExl8Q`EJ@^w&s0zQwpJMO&^W4GRdO_4Nz8jJVEcj;TSN7 zwhOMHSR`uo3T)+)*6UwY7SPsS@ATd#Rbk6-h9^FKP){4z`Z#^|N!D2FDpx}pw~=Dg z(g&YZWcqJ5MB3-w4eC1~ ziT9zZb8x8CHPdgt&uvt8(qwk1yxV8NNKL#|b zME3i#R$bW5HpY~MYLLCdRXl(6d%Ku~Q>oQ;xH&Y1Q%h=OG+vHmN<*y z0h%V0zyRmpUqVMT8$!631Kd3fg1XvgoSyrVB>u~J9dy+qF(Fi_&vPn(Q{g+{gmqmM ze$_-gw;?LH!IF8IId%RyKvl+~MPH9PT!iEnwm~;KPB#U!KE-NxNrRo~j z2!KE$28tuG&fJ@ioLiLQcaq6TlW@UHI}BW+^}tmZW*q9Ax)-mX2)F?SWpqhr&}?pp zi@-X|0w)9nbJfstFx8=^8|Da4`&pO@YVD2MRjk3HUSt(M?a?IGJPWuC*i*Dv=29gY zk0>_Jxt}V84ZAn8C~neB{JxY-j4iDV@a<4H-hI0;*LyTC5}!|BFf?O4FpA$+WdvQ< z{xKNd(wi_1V2`y;>uKO=Iiv9WKE8=eu|rTH84I$P20?~C76Yl!zjbX?Ko3|R#4G!- zK0vRTOqOV3%-Du#j|sBZ9>=X>6gY|(u6T+(7rYXeyrLGl|CEBmy_n;ee$aS63mc^8 zBovG$7DIgh3&Ds@F8Wpl;};m^J5@V3=MOQ+#3@7}AeLGY*0*po2h~g<`p0(h`J$72 zlfQSrC03B-Bsr1`vO?&SgaQ)`)wGufzhuEeg(N>})lGL`pLJ&_J$s83V$g1_C=J~; zAOMDH*j!Wz?RvWe<}=R4-yzo34UGtMbD10T<*nJ|4m;Zcn(%Bq;H}{?wLeQ11_ucI zW}e&a?_@{&SWeW)e4)^^>4QCBC)py8)S@$B{5nYtwv_qmy?`m^)RRb9i`1LERo-o? zIudf&ns6v#z9`zk69be$iF>Y_{SVO3Ww5$(gSISFu>Dzv5!21!Ja1C>%8{T!_l#q$ zZ#gXIiz=7)=yV7k6kSlxeQ#ORD)U{)=A##$Zx_a}`2{Dc6{QTkNEehaRIna?{q5^O zQ?*Mub~R$dr44{&Wn8J9Gfsn>&<;qG%glVaJbn^Ox@ACoJg#=xqhHeMNQ+wYXsvBn z_J~hId=zovDET|J6Fw?zP!v^;j{fO{lQF|Bha3D4u;**q*hp!C7Br+4{jAa?w}dEV zYrT4_YQ~S>*x*~!dFvUqD|_S;L@ZAK%Pr+CBX_K7`k=Rg>a5}*yz#2qL;aY-k&_9| zLP)I|bBk__Z+Tuzfdrcqdtbuq-}vS8XPn}C)3iP)a;edWXTN&S`SO}pKjLQGr0>^& z`9R_awB3fODW##h8kJL(Qh=PKCd+U)q64}(N0;zN-LNI1_3hA){*G%i#YNwLLob{D z-7WL_Wgg~cGtx8^BLfBmAHdUS5QWrK>9a!9-$X$j#MyOG-=kg0{^gnZ<%&}r(d)+L zyEIcXY)nNcr zdrJ^h?+|Rm)ZD* z=uQL79+w|yR2(Q$m^OHHhJM^kUhd6{tgrVE%PCcr zFFsy}kK%NpGRj^FBxtTe(V7Dh`crfjeoO zKBz4URl9wwyK+TN)$o48G8W9)Ncl6;v3*zyi0^AZQLy1Z8G|@nOTiDXa^jvFR8@5+ zres2NNZent>BEvY(-rF{uo?c1{r~DZI1V8VEIlyD-Eid97+qFNE1@%x9?IQ19JwPi zx`+W86!mx6sbQ^lQOjvmj0|vEGQs(MYv~#LV+V|F=P@p~p1gR&cLx_Aei+}0fgGL-G>*jX9?UxOOfQzn%-PVST_}WQS@K7M zBb`5n?^my=CDlEcd#C)Qx*uuaB{!!<4XWilgl7wXm(;tuLVuAp(#Bi~h>&J2u~nNs z1_dudrcIN=u?yEglZ>1bB@@N``74z%XqI1;59niCEzghm%J7agQK&;h8V*XO5Xq=5 zvcv1(6dF@mbujNz6weN+K1wMuEyc`|q4q^Q?(eCb+BZdhR;(NlfjPQXa~TUZJ?QQy zk+QOB4_ynb3$M!I>dLh~p+8=;E%V@P9KS4)u#Ple)qq^gwyYB;-RB>> zdYSr=MaKs9+h}jVIVxZzO`zXOs?9ss7Q%UGdL5tKkrkzyiDeGx!xKY5QQ|I3s@TF} zV}puC^zV3V1WO3F9~c;~prz058F>AtK_wFl!Oy>Ps|}R;JSv;l`*E{6;n@W93GYta{8bm2hSzxZo2u`nO8F)g%UH&d!sDaWd}oQ(4(SB%q;cXJ3;wHbQJ3iu=oe(9#3_(W>f zNBHy?0r!v%t?zCLnZ{_XP$ZDl)Wt{>a7I+m-$3=J{Wiu%vbJi+tOvZZqH`TqOPCz; zxXUm}{1fPHse5c^s+MwJyokx1OrR}X$u)wU#y41yGOQSZ?{SsB-%^j47oB%H+{Xm__jO)6 z=wB{X2Z7a`;0%kMb8u0_4oOqDk~Q}Qs|3)Ui#jvN!e;HBylk$Q_?w?NFAoO}UD#0M zw;N`#BTqoj@&s>gJ=3ZO)P1V});S(OHVIDTk7FE^UN@ic- zg6YE(>)!steRc*MUX$`FWAb%r_`^r2)sAX%R#S!AIuAm*clbs%Twb%PMX}!;%bu$q}+ht@Kb#JFpvOa zdMS~o|F?fY@I8azNt{YDsu(K+|6ZU)dZ9;917Gv6&H zzM(@y+!<+0znc6deB{J4m<^d0STcEwP+eD8!kZ(j@#ZL}jzl!QtcHvG?cWNs`Plm# zOwj&eIL7g)@~ym+W7kW()kxpoT%W!mqja5tyO$M#luK>M-TIa$E=8>^UUOslL+@Rn z+Xcq)WBGHdn&9q~hp0_d0g%JpZ1lIubaJs(;F7-{Q!&QKzr3T%yBpPm^DU1Mg3|il z45%UK!{eHk^Z*mO&EWO-zPTz*JKgflJw#~jMs*`rzEwYG#}u!{S73LT1s;M)1%9#M z7A)A_x^r9Aox|knf7oGOWT-8V`E5l74_dS z{ba|9G~|D!0DNqxc6LnW`^+*9fG`KU`rHTe$jSAP9ji7CW=0QWl}}j~%A__+6b36v&IAeJz2aLuS2pVI3JUq`RM5!TY(Ode z)wY2aO+#}>4RWtgGh{A9+N(0t^p#43#d(jT-JV0b=*G={TLq1nn>X-As{MsQrj*K- z=>v~@xsb&qn`Em3I0{ZM-qb5Kd2BQ8Pdg@!nFOoIW_lapZso{|VsCk9ZKFC@a~Y@M zjGXw@I1R1?HB$IVc^NwINibDNMY1Xzg`HwL<1PUuFmg@}FaZB5DCwS5L`aWj6y@a| zMV9xsu6e>H2DmGvy<RcBg)~)pw=B` zKglG!)K+z%M_Ow`!uESo#FI%mDa(tXgH-^R4Nc(0CF|&tr<613 zj5sIcBUT!b%gfZ2I0G4ghvg^P=&PL`Dv8mZNineo@Xj-eEbP{L%=cLR4={ME^%|L6 zMg;-MphXP1Po#hh0A>?6F+Ayb7TS=BuDkkpMS<@tLES#y-9U!I$h( zqUvkYdo(WB&VcyuIc`8IpaVB38S)u$I>~UD9G}l&btGXLO(|=wm3bp4QG3qA;zg6? zd{KC{dmRX4xaYY%5s?2e_@>G>v;giOo;+P^Jj`J;oc$_%=`;m^CusBF{BQloyWOYu zTX6ai@`*edsxn|w8zbIDE$J?zu>}xxkUZgcRn9+-OXgl_Lzu zxXunZPRRqY&PV;wr#Ee#YOCh51yAoOS{&fg&phYv!UiLtEvpTOBxAu5Eq3*3e1>Q*JpE zKoi;pI=&$%3T28xsh!!T?6w~?W=(4;kZ>OgWB4pZpB;2oHBq3Q@z}WSS9$!khmt8` zr3tZ^debkzQ#ghh~)&Jn=^Xi|XA9qdr^{hpq z^0FMF6C6}&ecDqWPSrS8x$S@Ocn=2OcxB59GVP$U*r}C=2w=`;qC9lKB~>I7ar{gG z`>xeTsQTS%(u@zT#JOe<*%RlnG|8XfNxTbHrXVx^Ks6 zrGHgMi$UQlxkM4-;j#41aY;Ypt~6$_ZGU8Gm1ADk_Tl5E8JqGs4O47ZFvKnHoZgvj z46s(oQ-l!9Tj+quhm3i8wW7(5!w`d%3?&Ap!aWmQ2AAe*-Of^WzB+a8xFQ4uS|@iQ zkhs=R7f=^v8fm17;;<+{2*yZxu9}>tWi>ZC<9VobpxDZXG0*QlR93aY{AJb6YpZSr zT#&e~!Z#&(D8m?p4hb08u340JCDxG#{@uc+SY42)hE|kCQ(W^-=4F-lC$-xr&odtKPLxew>=s4dS)ooW|e|IPCZ9p5V z>dBH_y;pHa@h!gUH(uu|lAtOXTqUl3-JhNK$#;*Gyks6~vC@SRu8JTO`mZ$9poA3? zLDXO>E`9j%*{Jixoy|x&G2^@~`+EGoY_ya4ddi6L3UYQYT$WT;et^uPTqTXSffG7A zcOF+IToXLF{9{KSg8%`@J&R9beAkPh!QB~!hC!GEUixG%_(4q5 z`9A}Noj2j)q-XFAWHNOK2jeG~nF+zd?t#|4*4Ef;_~A1nt@TF}Rzl}YA~&1KOfbb- zk~o?H_((il!@#^)L;CB7ETxJT$9+i7ylVSKgH}#W&NPrWlEb!tH9e|1(0H3Mkiz5Z zS!d>Tct`b}D4LeFiqXX!PaQ9^Y!}8v=N2&Rrfkq&{P84h4nFjnv8Jd#3Ujc6^)+Sk zd7T90eATtCzEt}2rZ;`#y~$d49tlcaQFXMKLxh0nLe7>I6!B*wSxhrVbMwdGxPiYv zrQ+x0LgrB<#i>`at*SGJUHLt!{133I%1@hzq{z%r<6O=LSkPC(uldzgMcJwzp7FRD zd;r~?l>{Q;u{6H_e#SR%Kh3R{KKF186qYEjf5IEYhF0I>89XPl z($`&HTS2r>f8EHNR0_LF{?+?`*-7XAKI*4-szUZ}P^2+BShA>3lAOP6NouP4BMzgj zdK)KL%>yQd3&#%AzWZFq#3nA|Wz<=Nf#KirOyw_hIL+Ys^Z;e=wb|H}*knjH0#pMR zWI3(LyWTq{S+)%FDy<~ObzVg}wbJ!ZJGBuroA{b|BipSMuY`YUW$j0UaOASZcZOw~ zrmM@SY3*WWS9yM+DDLG=%|WQv%g^@LJU7_(J;Aj%ox_n;F~}aXF;{;W4#$bGtniU- z$rt?j$QRGLA1;Y{6KfI(O8X)7B?M^FJi^7gBWnDw&f(2ms)~Hj)~g{u`1334DE*$r z4$165Dmj%UGP!cGB11R2j@}o2Qf{dYJ6{ig*dYAVfYioWA&jIDZ3_W@-xn0~cgsGq zchj6~H6LuguEE4%^(||KtBOR1wxcMxeGN?7vO&_Bw_308 z2Pur7uah(0u=`yD>5W${Rz3mB!3dENsj#JjS>8Yt9H*=s{fCw=u7z^dr5 zoTxm+K~mhmWVn9a&}6P?^M}Y`2~O1GaI7HeaMwx&HJvEDkcB9W2~hw)E0vty6vWfw z8KpDtyM-tI1BXwXBl%XUA`rXUgGpD~n7}FeH#wYljBuf13*Hpz$5k;gudyfx0Y_1` zQ&A%uu<Wgg zZ1{s7xy1?|Cv7fryJj4w-jflfuU<2VX0cI=$uE-ES~;oXYA^z4L=Ul0YiRhd?mz#} zAm)#l9Isl6sz%-l&q-A@l*nG0!$*( zx15t_Mc~xcI;Dd?%G!)tlZ~Gps9POP0D}VKxc65QvSsRT? zk1P$7T6JCaXG#xFxl`5D`PUimB-~&qsx1c-MU+fEE42H{{z#l9C`MgEH8aMCR+LiJ z+bLI=*Zg@VG3AX1kcXon%?L(dDc}_MG2bnnwe5QwUbC0iRoc+4-IMOItTNlSkK4Z+ zz*hg~D;0zTMsuXWKNv{2om(4)!0{V37oX&OA8j5;>4ugRIa^O!Rei-%>F}3^-_Vg& zu=Uq}HH;MQe$L~xcw4S0q@+q8vSh$4-^NJa`O%T;>~pw|Ytf8_&5h^5&aR{%-F5Zf zw|H@O4ZK8mR`BS7d_kwp zu_;O1AhDc+4B0r>MQzWys4ZhJdA4TMkOwa>+|&<3swB6RWRx4mpb?-GH(`6Nq5$U~ zTaTEruT}JMPIH2N-1THt*+bJ5W|RYxFk21+N+M{&V-SiP_ldRLats3~+~Kj-QNnwvBc=Ug*GeU!d*t?B1>MvV>z@iWGuGohjwCh9paF9hz3> zC5)RmMcN$?)ZrYFgWS}AUOri0fn8@7uv?M<8m~Xw6))IW;c;8`=U|lmv@6qpABzih zf?!@3wRRGS5qcn6{5R(d9Rz)f+^eTsk( zZUiP3W4n*oX=1YI4?wk? zKE%g6weQ$Hot?(7wr?;m9_b_2%=&BaLQqcbbq&$tQ|Rg!df_LMAO(O= zz$&ozZ%y{#?_DL|)I}R6(_AA~Z!I34`zUl~gCq~{YFZh`18p~j(7fY!K%Rl)(I&em z6Bd|#r>d6wko&9$(v-6;j|lhnGIddyVI)6r>v%3%*w=4Rv)d<9o|Z0!nfRj*KfmHx zKV@r@9K5o4RvGpR;RVS_T4KWz!1@}H+kS<*PCS*1W zwpcx+$NlMtZs7bPe*NK5Q-3js?|85;bC)M}VU~dz5$sTJSM{E3O=sB}I%u}E#<%yh z@~i&n_(y<-#mzj^M-9(sos_xJ-!03%d_)Ht%&QPkOQ6N9(rq&+y$+Xw4{bI4X-n~z z2O_6s#y1Bq7&^xvAb>r}*)+?dz=de3)su8H9-~iLg4IjM|GNz7bm%m}quq^_{(860 z-yIRCo84=DleAC^qNTQJ;%?$%O#TdzQlc{7(!8{0PFjnbtutQ6-YAF3_v)ita~iyu zaRxKt1=<1HG@Y-Vx?XI#)qC-h<^TIy-Dz_xp6oB=du_LHvydRZ@hDVil-<+0*$x#) zQ!=RMbi$igH&VVZmw3+#Zz?KS%>~qd3#b*SI-y!}`7pZJA;jL#G0yBr#rSSh-aj!_D_GRx7qQN(6^u=6_`?sC?_v z4!s-SHOyWSc-OoIg1evz3QFnxxc|&tos1ERW)>_lKxWf|CSu(2>6#;cH?p{-JXZoZoA>wKgZ|d5}zQ)oTQ>FZ(}5Ieeef4zB1GBez|te-1rd!{K(j`k_fA z_UM4raXetj!BDa-;bfX^^-%-)(~1DIho8iVXYlZ#r4aCoNv%oy-*4s5uZ{#eB%aj; z7sYnlMbTDBq9Zwsl*d=O&m^RuFs@)2sQd3On6>}!zst&N18dsl>Ynsv&d*T` z1hk;Z&xt!KHgwgN^vV1(!Ngir?WAeurGM_FA=(F znB@)^vS2Y@TS-JOoCLyk$SGwMa&+~M1IE$&UXfkSzZ|F=5@4NEsLUm`tKnTLG`*05 zKY6L8G~|fH`@FL6^3^~7jzA#iW-vDY?)B;0<%Z}E$8pgqX!hL5tlNZpA29-96M`T)cYqOP@b}qJAa2At^^82^0ZHjG;pvUtnq;$%S95i~=D( zx!M+l161}fHSahAY0Ycn z){Y((yoU9q9S*Acc=)Op%L%K?YPYp;tg#V4FR`lPUW%h*1W=m+{1dv~X^uX6_694_ z^FT1S%V$N-LP9o=I=A70RZG=)mL>;aDHD8M2pk^Ie zkRRMaC1K69&i1X>??fR1pZ4O#!7=H>dxi+F#{QGr5%!qZPmt3bhXQM$EI`Rl^fvI{ z($#R&%EZ$5Ltm_Ey$(|R0sYQ?2m-Cv!#oYqAWEN=e0n=^!x568)>A9>sUTFdO9xaE zKHQmDFXE%NOsI84{RK%I4;y}Ep>`hR_Z1F)k1l%oa5F7B_p-0oYQTw`EsPMj>Z`ZP2Te4J_)*iVNHxrGcMaq{vF ziI{s-mzdkg8{~XG@2Jy-)6dpq1ICx7eB@djOz&rJ{6Y(83h{nlyDgI9Wjmwg(Xtaf zsCTvTf&ZCZu@wG21-6itOp6c;!LrQDxzXMSOcqyS8G}dgl%`hT#73ZaDeUj~V7|&f zUnI>q4e?3jT&Qs|@7wZ}L{+(#jtaCSk4k|U3~;fnz(uc+qQ*;oV~QsjNA4j^GN(a& zz$z1P2_rGF2Nq|l{5#7EIJNgiQBijD^AUE_6wFGn4^MwSB%6uOWS^4u+b6)BI^!() zl$z-ApdFvQ5G_zw+Ax$WWkB4O4o{(oXE3g051)@J z{+gvHDCp0&5o>C#1c?%~YIWW?VQHL&+RD}5*+SfkRH9HQ$T}R?n@OmFKSD_D)klB8 zkKC-IW$1W?{;R+yP1`;D$iPD601dlXDJ&TnN&6i`%eH0L>cs6G&ZKYWkX6+?MY4h^ zW!Imxu?Ux0VnKGrZk;n~uH&N?^A9Pl_ey_a%Bo*WL?DGq2B6=;rS4xtez_S&G@d1`WL^d# zAA>bCv}sk;>ap#ei5LL^Bs0+hGBU2*V4CIT(k%E$od3^9oj0dnZ-9rUF=ZW22Q+V5 zw9)TiEELb$f~B;f_s$-m?DjEy|C0AkfM?j)hLO37=k7Jnj#*V}dz_KDUM?>u6B7fP z-7HD#Vb`aC&JoQMf9#csPEBH4 zz|UuvgT3!8t0ZMH(738?^eaE}!szcYxX9}e?K|(uKVM#}^YBx(c~1VMLj-r{(lpaK z$Ixwuj3yP$%FpcTZ%&(#KSzUT&81WZ9c{tHz>=GYs7y&zT( zF69q2qM4^EtZa3Qkw!-C3vJcq37mFib+%RU9AvJ@lV-`=c+!~WQ`64wUGFei-jTAx ziEE(^bsdn0Q+U1Lg)+Wvo~l}!Rg2HA;TzX}CiT8~p(VlZcz4PiFNbT7Br6e}2Gs8? zJA9|83ZMxZzc{Ye+pAZbB=eeI-QCjsm0sd|TO5 zNOl4G7dukl$1E=v2sL6S69uklD|#pc@UVm-H{)kF1?_>sR?agW_NIiX9VWe+jL4^Pa{ zG&ffqFg=vU8O)_Pm76|$`&D(sWwr6~@fKA6{_|toIeI+A(bSt8JsES(hztcqq~^j) z#rLG(XI0{v`;9S{9unmY2HQIZKQq*r>V#Ynh{$FpkxN@`z2r}+ELF$LVc+!^W{>Ob zW%HJwk_~b?>;eqvG;0eSF!vK~h1+kweGtu{EM13o%dHC{! z#3uYm1|JjNfx3@n5pCbH0RNw&^A3difBg92>^+l}amEoLdz8(ceGcU)JBO1k8E5ak z_rBwf6FM`=N|~AAPPT+dM4wW9e}4bJ|9t=PdcB^{=i|W(%*S(n>$hC)VnjNP0ehuedxp6V`Z$c?0e6Ria5PXsxO*(1B z5{u<%+LPcbR*OZrwIxckuceX!V`G}mj)y2|W>C|k^XiDHdSsV37`-f01f_h{REQ*( zl314`IlY@sZI6#9avR!h;m4XOCIO4oAjo`_X!xqZ_jlS2n@%V|eQnisTQ%{cV&j7v zue?}X-5cmQgsnsmfct!fE3P=kF9TMblFJio+TIx)AGz&TZx*Txf{g4xz7Jw zFp0zCRuNi(*@1QFxUZx`XqwYw84nolI^;M8%ST*o0ko6)r1T#}!CBS{%^xI5BVoam zonX@hE}^Tyl6(o*=x6>JJfE7P@}YcJ1cVffUzZNLg`pji;fG}D#HpQ#$_I?i2U9#7#Uk|GC?1#ZkH-RSE>^J&m+mm=ilbPBB0}hxD)I_r>GhwQVmDe{m`(D}#5_9vh zNwI#I9S8ET+^iUB)U|HhYa%K2Ei@K*lX4?TC zCp_`m7@bN|%`O>v$jS0_vpznFa(&64;Llfpk%A@_j~kb~wi#5U%bJ(@_942D3 z@!}RX?~1NGE=OkPKgNPNf2nSsMliRPY0IaP6y}U=;iUPpFr5IQ=Xs!C{;ls}u`6Tb zpg(Q84Y;1XuDTw@zESIir9&2Bq_5awKGw|zjd2D2i}RO5sT?Kfj)Z~Je}s177BN~3 zrMhxL0P9R~O-h5SDFZ4pBT`%`>3Cnndnw}Z$rOy^yO(|j#^A_gtsssDW5D}08nK=7 z##Cpakbj89MqF7cN>&NJryinE%Q>W(KNU~z8KTtOLo_jdCAv&JIT1}{ZRxYV{e=%r zYy!Xv0b!J`q2vLH&x=I=LSH|~ zFpsR$Mb?)m7IHHi2pNB7KTEBAuZC8umqUh2DH~=)e`FHDaXvGZPq6-|m;;?)$;+`6 zk<8~ex%+#2JVmIcWyfF3!SAD|ldYK}Jg*y`SB%h+;nPjp{c83T$e~iT@-V}Wr&ji? z;KAW?K-4#h&AvqVEk!{NyX4Kvku|#14JN#2u5L$%nUS}mL+?9=4<`Tnw&O1 zVOWEwhRX5N+Op98%k^N4uL;^(j(M~BzXZryX;wgQ>!*(?j+v%>3mI`q4XIg`rc_Ph!1=37{DU_fHKlxbi;5jdA$V~b1 zO`$i&_yezLJX+9+XNCA7LYMsy3K+glgl7i*quM^A z^KUYvx1>ow&cC*%&12cw;8|sKGUq~5x)DEqcnZQtKMM%=G1P=7*273_BdvF4 z58=5CLGU4JX*RLI=m%eP`8_{8EgNYPLU{K=Q9o7UA&BE}Bn3puPsDA8gb6+EpuFLGZ^vq)_$4HBB_kDos>JS`6os4LKb!q~RS^9c zQPADx&8cryW;}0oJgR1ePc`{L&q0h)(_|A3eQOoO8vUs#h1c(h7T@{V)VAw?0KI9> z?qa@RS!pP4mQ$mPcG7Nl5O`&V8si|lwGR9}3fl2`>jXjt*X11rM!BiJMnhmZl;wKL zn0J62oI@%n?useKmasZ5&XVddepO zzq&6)L)p_cALp)uXJ02vU5TT_y1M1MBg8^(QEr>!aE&mifb~2}?Nq+dsE~X-f2p`? zTq(Whr2qSqVw=BT_E1n6G%Doe#Wq*t$K%^w?s;0B)Km>AEA%A)cS*;z{t%|zZz`>miEdt4)dfwVXd$4)gN@pdPR`gP};SCA7%z)`%3P&Y7HC&3^Nk?aEIwpqqy`o zeQHBln^%@E^mByG27$-qm9hWAik7=&Crne_G6g`&H&pyeQ%|Q`(6VFF;_W`i+HvaQ5jtO?zUhVLwqifJ&P<%=wIr~cLERPR98VZKRSPy<0ft# z4n|szsvvB<6?#^3p2VRe^-&>Cw>>_tAL;y^UAOUSYP5CYL$BU*(#s{tpmZTHJ4+gv z%I3LR-TVI6n{%{c|LHJxU#ph+GtK!vd1Bkg@+R4&CWV#Q?n_i^#?pjqX0}PFu)Dnh z*Uq&1H(d3_?O0)(y|@|+-aK@f2200O!?JdDayK$}C?EYd#=?c|*)Qb&UcflaMq1<{ zMsv%W;h+m_=voPuF%bjSAT_n>KCM4X{V|8e5X> zM2ynum(3p6Y<#V_o$imf`gC;r?ShZ~g89VR8^E(iU+-Ld%q)y`8lasD#>m&0$jKls3;Te(?8 zGm?~vWh4~jTp5^?D+<%ep;rvkM5PLRK&e*z(B{^VIDVP^JZz_{328spsQ^ksB*F@vu z-Z64BzFN9>hP==q@#(-u%>X9*fu7Me7c1rMF^}k_s6YYI-iSo+)qmfMy&0Ssp!oDh zrYLW-c!^*sHXX4*Pf1FL*((;I6F9n&rMg3CHk$h|Eh(;CT&IMFl33YbH2O_@oE*tj z?+>W)h>IW~A7KZ&u)`&dQG3+k<~8Ds@M!;M40#dP*;qh$dM{n(<+b@84k1%~vesUeZsiByhaNIh>CnG|c=}vqb{2gjp1JFHfsH9X zIQLhc(zt}Kykz{w&D+QC-yg=kOpx*W1kOR(OG~&QfAmcb)EJQ<+V5%of!Eg6a^!^U z3}uQ9*{7@)=kgKkgluFZqJK&AU6T^*tAbs`4c${UEkHsdaTrhkI9rjfknPm zBL1elfWSmO;Vh%a3TtNrM}l=A);K#9B=MCu-j1Mr;t$POzNz8 zC}_*3QRsq4n~c(&umzvZ5-H^BtqbD9g;Q6muAZv3edILAK;y+XN?6#H&C}zh z0)n5HG&O$gT0E?u;;*@)x+|Qc3))g`U)$xr<;Tk_;~9AJ#7R~=q*oSqnU%P(&|hf? z@-vfpMx&}3Xw0iJP9ffUm|`sDB`wuo%lt^%i|=_MOh8s_%7InHl*$=GdPX%s7w$o( zs7tCI=QW1e^Zk&1iQcj!n*(_xGvPBjKsrU6b@~)CT~K5^lO$qlEGKoRhIJE?)HzaiQA#oToDewdmgCQ&;)CA|3Q?86SM(Bn;X`@sT zwp?^pjjv+MT_|KmiTA8=nnRBk)0+*rOF(#oLRJ223yltE7yXOSNztQkg#f@Zupaf% z;oQ*LBXD~gUnV{_`;ZN;3L%HbM4XysfX`K*g*Z1Vigm>jsY5g~?7~&0^%|5g7>es> z4XI&bDZ1(k5Jttqf{KtVVCC{kaH+2i%&;vROnwv?tjq_E^W>ldu?q;X@;ftSv)~5} zcNf*dp;ifJ?tf zaT&eM(0<-VNfkrrj&tri!BLm*hx9@Sa>4=?`jIR)t^CfC);X$nuT5z@q>iT2d5Cl1 z>MF}!zrPGNxB0C@=W{^~i*P5L!;`ntx_ELKDulDYN0x)UIkLMFxKQ7C8sXJ5@gpOaU3!b$1F*nQsU-92T5bj(hZcwHgr zkdJeSY@!(Ulgy_zI27V`*xr9bpbU)J5ZQfq_VRwTlh2B+%zK2NMMGvr1Nz-*PPk_L zS#F|!Q;C_Wv5fA5!Iy5e3Xu-M;Z!Aa8^z)uNrR@+sa6u#v72gKSZ4i=rhs+GVLnrA z2`%H%>-kciva-m5-;dEB7?$h`3Y!{yIqc|+QA7M0bYlLWV(|9P$KzKgg>^fD#M#BN zbj>O7BDK<qIrP;ZoT7iE|Lm+O6k~h;Dab??A!xo$8+Z4m^V}*b+Y&ECdS!$O>G!VS4guSUy*4=&*r^9rd6cW<-gV>yP!9Z)hBEwi(74QOeFrO}?kj91Fcqc(GSkMI zD(n3v2mUi?@0}J$pYXquW~omqGg@%GiN^&bYnLXtcBf6;; zIZ$W?8_|nipR#X_(L}!VaVXwvv<}eiykjX1$bo!o3M12(Bf~x$vS}L@auzV-e_A@u z3%U>d=64d*N1hdRqQI5IHBBGd*D?@}p*$78>)EsA*)vYjgkF>^VsV(K6L&qGoG%7R z6|{;zY0K^AcT-BpkGi3E%Q<0Lev$ntO)jw~(MAQ2DJu}Bmdq*oDWgCGNfihizN79$ z|8!#b1({<>Rkedo9AqPX;E$oaz4C!=1#3n$@PuCT3^aNYRS#U|jGsVinrHE(NB4DX7Q#O&9v!KM}?uf{|qFIFRxrX#jeR(Eh&A?y{b+*XW^u7fiAs?#>!uB)R-9@Tj1GQ}& z_g-UhtH@#!>LoQjERP|Ejk1AaVD<^c-jd4KJx?^NT)7_FBibB)t(CuR(ljSmKdX&q=J}Qc{AoB-B?kU z&3BQZd<$aX@3;KXU~4N!)U;E1JvQp&$h6FNA*93*Ig zRY#q+#>^;H|9AGW|9Z#sIC5V`y zHro?f!P%KMdzd2zR;Gd3m345B$J6>#pfi68{2Yn{OaQLO=I6~d%#Kv>Z@)IhPjh%6 zTF@|fs%WT!T5YoH`{Oyz%rrGa`5hnAI!sRCtNZM`sXK{a;hXo>X=u1MpVE;h<`aDv zmcbqW*@)BYKeuPA%Yo70?v9$#t!!5IbPF^;`Ml4_faOE35EXyx*~=(1=P+0Xqj{^` zku=XneX_!$u9kR~><}kg;Y^5(iOTpOOiyv} zN2Jz0^8i=E814vRI@>uih3UYR#<_<6ilue-$Ev?dkH)W&dFsO7C`+NE1p~3lFOx2gIN2Ibr3+9p#_px0CTmfc+K}9=c6K z>b=a3xm|AzXkOD9s70GvoL_SUTI1!pF;s|_dr{u&bW7K%zx!9Z)VDlw=G|5ANdfWE zsfksulMkp0%~iJl3Drbz=JuvYCqw8bLE{Ue*jLPpae zir~o<5D>!tj#Kld=J@csVEPW;=N55A{Y%`xStlM08jjE1U+5_4j3Jl;4(G4??TR`j zWTrFn+j)A)h%DchMY{z#d?kY~p_{K-!SInouT}iYkQnNJ0IV>QSt{&ASg6@_$8u3| z+OTVr0_9R1pRz;{@Ks&c^rh3<%6UxyX$9pZ>G-n2ZKF&`aS+xP<l6yf864M*=wzZWt^SNC>3vIfu?U32(CEi}S`szZv!(yH0s@inyZ-g*0H zzO!|L#pw zp3^!uSgf_Cfdn|_RM(a$`akvam5Y$ftx4Z|sCfCL6VWtq61d&BksS6uv<{c43_Ms8 z0En4zh!_a&Ge%r<*=#S-TfXVGY+UBc@UCzE^(ddfk?=4ZS;=u108n^Hn*Rg>;xJ=# zx8NHz;U9MV;LDMr=AdYWmBW0Q`lxy@y6N+zx zud1?lr0tT+t>=H2=0Gj?R*u)`C8EoBG|PK`u)h_n2UTfvPSSXy`xt_!P1miB3jRPt zZet;{Zb$q>DP!TL4kzjE4#iB5ryt->h+HzJOE>2WN2Li2rbm47P_Z+@J%T(4^7C&1 z;%l_cFv-K&xtppWU2}bQ-5uuF()MD^cxaALzc(-l_?2j+t1&egBWiSuJ1Ii)pPl+= zACE?RE$JEercMNUB|83&RU1}nkvM`}p{#i`1ssHCtsk&K#)_VXQ}3=m*blPY!!z)U zTH!h1j`R);x-4dbKd*Uy@5#vFUC@1cUoOf?p5(VyHp?Jzx2ELcjMuM|)7EPCyZWvMfntKn=IJJZbIEC~^xY1P;{nNLSFlE~wKb4{b06}y%= zWp3ZUJ~=t)iVJ(+%X9N!w$Vg&UAg#DO1eJ~QK;Ux>JujQt~lBb&zE)a6n$#AwE-6L z{bg7QV?lR7ArJ=5lTg}9>x4NDcsDBix`Lr zM3XJ-M;84KD?bfS*tl4ruS4A162GqB@UJTmx^qp7m3?awE6(__1dY0j)A!+P$*YG~CIi!ZTLsc+lA)ldae`o3`Kuwb2g z;9HD{_Gpv26ScgzKr2j}nr(Fs2#mTHfWsIXol# ziwPZBRhL@}#6RFe=&&C)sdr;k#TP`ko+N%$z!YkIw>tlUrng$f9FMd2yG8Pi5s%Td z2Y(XdoNmfe_h&@>570-sVQl$q0&m!(g9d0s;tP6#g}iV-NSsRSU-`fYj@6(3#e059 zam2lfBRJW_gO%{oB6qjHXo28x?J6p$j6n70xJB*oVlvh>8sCZ~F_2dCnr^-DUz20h z`$WC(eeoP?+=Laz+s>>799tCb)g|+qr_nrod4xpt;`0t74bAz4T0-bx99G+C1UH2y zbx&oTn=@U?iIME->-MV$vWH zuJB+Mtr`{c=(5vQ?@v&*dsTIv#M!Y8H$8T;VjV*lW`V{!A~O$c60}#YdJcDPGvRu7qDsB*LBsSl%Aq;lbV&6M{xnRDu-iYrl z%|N=pW?`@?v*zj^h1a5$l##b_gN0oSO(G^)A#|I95;U7K^ihi{#RYmim1)E9%ml7H)_}V){vh}Lx_AN;n40rx zSDCJ*#Rvgs>hie=%H3X2!p5>O3X0ea>&1?@g&TI$i7%}Q>cf$>0dJ+k(;4~b;#39L zLIpVQCU+75=yK?tfSRthwHqbNyRU8b#FJl}_~$`@skhW)f$YCG8`38?ABs2vCr=n7 z_7r{e$GsEBmQ4l`?$>D3!0XSlhMhSy{p5SbU3kK!Fw~>7Tl5xtC~tnf6VH+^%KmQT z1jnJ6oA7xr`^AWW!^khcS?g9Lr<>og56*8nuo;H7#g&{-RY)v2uHe&f9v zs*RZz`uAmLZHl8kXqvGm96pU$e4__DEHmhGx9i9s9@{}| z0HAd@Dq}V+ZhST+&b3F1k%ptJI@5bayFa+LyZGKiG%*WH(^(JNAk%F^bbXq&Dgk@GXLXeS*a5^1iFJ=j5bF4-nyB^Yg*0*Tyv+@U)y1^z07V6uC7qR}5yb5(=U$+DCX*6T{;?7F$1)YG|Bz=TQ{|jEwUF>V+;e)NLf)*Qzn=jmznVnPwJh(+L(V29ZftuhcsP$ zZ_NKA-0;;|ux6`H3(cn{wQ-XRdDFZE^$$vMM_eAGbmeydQ=0iSM5C@Cv~x3qwO>j| zO4h!#(g`{tU>(|7(3e~VqLN&awpwW4==t}cN>^Q*;f;KCcJQ??dvWbxUqd^uG9*Imr;I1c2z2;_eG<7&{c@|={Ok;`gDC_hGxAx;qkAF+zZ0fYX5Qq&! z?m4At;r4ywDxx^7AujZSjwXUap=aR`6{a8oOd1 zZ#jGJ#aC8GO}8lvTG{so=V{K=B;Ec8&{>&$FhQ9{l|OM;)>h?8P9^Cg$rj@WP~D~+ z0#cm=p8j^Zn|ANVd#6azlV6?K^4lE%|CmJFb4LIO9e96Qf@K@B@5l4$-dC*IsoI|2 zU3I^W-B+;BNsdrF4`Y;^J`R)+^J441H5EE{#82J9=N6%ce`E+|?R0Fu#Go^|#0-kTZaC92 z#)VK<{TqyxS1lbax+(B!jq7+Pgd2tFwf%^mU-%>bzGvb(CI`M}j?q~@17t-%vq9g% zuM9b}4_imRc_FV2fBVceH?6x|SC(j0CkcfnnC14epI2C~4SoGw1OeRv`E&H~z16n6 z(0D5Kys}%VwjplCcZgctu{xY8s;!hN1{g=LBf!Fw{pH5HR+&ZzCs>?4oIDuQ##xJY zh@cY-=v8YIaHU*|q52tSU?*Ct^g`n=0*ngWK5$s9v)J{0ruFqng=3g&ubGmbIUFB` z%$pu7l>>0GJ*KDkXMY);`$ZlO8UjUrC%lNT>_B=1e6f1*N4a!t1$Db)1eFuhDFf5h zdfIynvhC@AJd?u_Xr-1k%ggx0Tc94@lirLhT3`6AfsxEnNvQlWRQaZr$LR8yXf#BO zlJ)5QO-iHO!MxjpFa~(?=z?;L$fYr^3Z+vy080v9b+JB|f*Zy`(FM8zqq;H+Y{Y!p zX!=y3Zb}A_5X4%yK-WRp;X$Sr*R;?kEZNpIB8FHhP5+5=YMmOe9wnNKT+?fc^(4SS z8b{IJYwP~w89{Yy+t?9Abj5-gEe_3o+8=E2mTfxhKZ=m$eCju=)4&o|YuiUGy5*+d zs#Hm_p=_FqV|fk)o*3|okq2&KHOYl#p~otU@(pcd_JtZKspBDBA#pRcsjA>PRhd@3sl^bV(G5v#C?4yZp1}$P$CU5fg zu8~gyRF9R$Qt@w+8w_pTm~f42wTQ%QIX1NP`}nRaYGxu`#S;*1nZTSS#p3N)qXEGs zzrJO26R@8tD9P!8bdzsi1NR^`NJq?Nie2DbyJs)dK_h!Ee7{YwvEvhb=@ttjgtC*) z4)0x4(9#$^w;p;)i|%55cCT_c`Ru3u(p)#(HZVjcA-AgGxAkDY zZ}$m0kzKoVV1>@-V7W5$Q@>?qQ)c8{sJcj+-?G-5bj|8DK|yJ(ZU{?j%UHe<4y7eo z$X<(mmq4qg0AdogxS~)%ca961v*9pK&%h|pIB4iNuH{5cO5d2y+YawV_W11}DG=~l zhxpe_3RFE|lBvh?ju?5mtey0BxkrXsEY^#3SoAf-91XX2I4mHa<`j{r!6JaBuLfTw zEI}xRzK4Nv^t{$1Zn1#5ubt+$Wt9m&y%f+xaXP7`2EmzpYMm)w1=`GZmG?WgIkhV! z)kNxp&lTM-t$duq2hVaAzADJox*Nn)*$52gYJWBr_4%1=n;l2X4@mG3|1`%H^5ffG z3>(Kh7rNl2(nBXTcjh~lzrkto7>$FTkE3o~Ji;aB*s>zI49fYL2$}#sj|Cp{55}?b zI)@$#2+M-%56H|NMZ6wwiB|@%toWfhM2sX#422ZrrAj5ek zk_DO&`9|xB8iiP$LgVkcaV&!YY6}8!<6_+Cs#GJz9rN+Wi2lP60&1yt1bK{Ocy|cuN6o zo+;$eV?vcza=!#^<{82Nio(n1b)oVY?&JKl>zDHRWXi`)Msq~SHITn2Rm<6ds^!sh z>f2R3-L|cLsiP!E4~t)qTyu5|?>z)W+fww$+^@L#c8t+c^_oYhLY_#9{VC&Res@OE z+bR#c`V8{G>K}Kg*hYSOl)|N&&iqb1dg6DXs*i`W-|McABrcx$5N=r!D;E=5x1s8s zZz(?&riY|Rj_*A5Be}PAwfg*I{zsn^rU!h$ zJnykKAE?9qKnIK1tkG{PzOJ5hnU{mn#zBd;JubdWnh@PO{2gpt0nf*hiyAZ&x};LF zTkZ93xqv9IQn*8`y~z%oIE~rG>!)9@7w-aD==PrhedR+1Cp5O04e(|5#eUCmL!T930LF28&BC0+|bN zsgydB0c2Jmhn-g)S#BdfeL{5?mbwoFk&I{SCNvh+4?tiI%RTm<>St(P5%y;n^zQ71 z)KPECZj|~JHadnj>7!XDGK8NpiUo~x0RNRJum?dTVy=cEq00d34fmz1+AynbHAFx| z(bf;P7nWf5-jyc3t_qK{qbkmd!<|A|b&ujQq^T8yH)WbqSDmi>Ce4$eH&cQ;fUCL; zH+lj#aq{gD9rt~@q+&E9qlY(2=PNKZmAv%sVp#B6`e0F|ebP!VZww2tVxLRbcy}}i#1t+s}KjNmT!zcUNrxFk;eq^q^CVKobL+(Z@vk?0FO_Dyf z``LZ`V`L9wCdM>mS553;2qP5MfDPr3qx)<j}Do$OR6?(mL_D(w`t)kwlZ9@>Y zI*C+W+nUTZsha)@prE?(oen(9y=Lj=*Pz9_&k0hVnS&FCihHJJ+y$JXn#=~gK%*TN z8tt0yJi@vQ`YF+0zQL5MuCy(g9|}v9<Pkd>%v~O(8yVCQx&d`b7~(qE z>qcN`u1CSEzZZ-;3?$GO$=G)G(JL3sclE8B{l-7dO#a?gX;-1O9?Rv;O;*>NsM@!& zUrK4wF1<9yUW51O){SJAB&UKb?hUh-9n$hexA%oT_^%Fj6nv7o`xRmj%nQ9%eY|H+ z4}OY5tDF@0mK=LEwqnv>%h)GTt~jKd->U^%iMfVpJljRr4AR^%GPSTSz9ml^FvnhY zTbU={GMvGbS*z#a!?;dlPRWT5`?aU|&t^?QKTnknCZoM}4S3z4;Ae(0`ZU{&z$%e= z{{`QKT#QaU&LQ@M4j4qsN^$aPOZ>#gL8clVSk>OAi6P#*a#(j~zAhEyfJ|t6NUq_V zLt^y&I{|=AJYmB2G4fcvTlS0FOymd-r&pxs%5^;u6dW}cFcCi#@cYKxwK3{c`kW9_?3w_lD2)I0x68_K_1IlNK`vsIZ~%<8K- z42Ig#=W}ZQhPl(n&<@-+r+al+jahu1luhk;XIYCli4MN&@7mf~AS)g9Q`rle$Gzd~ zjM94gEn!S(Cqy?G6UoxG0*d11R79)mI^(0sW*b!`IJ`PZSGMmZgB6`tOfWq^hlwT= z%FQfB=)T8vxo_xtC0N(BJNy`K5Br2SN?hpgb7kVh^KdpN zuC6_gx+=W7O~(7#P2l+}R~y9dczFb)z9zkoiEW~4UuQaA+Y#tE7EPWGMJs*3p%k~< zx8yl)+l%D6n#Non^>0IS4&&g5wrqJ}oLJS&EV@4Pk1QMs^1TIH1*BvDNflF{%+~ob z18Y`=xRHdRc|B-e?aU@6{o1$o;Ro-E5?4$FF76lt3YW>h3%nLpu(i zk2W=LK2u(-e=J8LD8PY*ZL?O;L102Poa*fEy_IMAZc_ZvAgan-XyZfu!o0)sZVk+R zi(kmG3OtPAy|u{a23~8y)XkUxmk<5le@;w%9&^g7eg=6F(wnsrgburd+5MxB*Z0=@ zEA0hfiKCAZ0mb(RWwt9yz8h%E1?OB}jS57g_j>x+E@b(C96|n_ZFA&pXbS#R8D(LL32UwYKYjV;+i}*a|Yu=GhBIHE}I=WfBujVrooCItpDY4+~zd;xCSo zQz<6&pH5GRxR%aXG{oK#`d1UavBNAG`a#M-_n?)9ZW#kzf40YA_3N_ zWfxixyfKYhKZ_c9t(`^WUIftR(7{piprDv6;aQU%eD})DJs-n|26@MvUj8xFdNJ}1 zV;JD2sI9_#O(RMpwW|jZlz*8`YgT8xw{lvrIK;*q0N6r9Bv^0)yuSl@CqDOPeS%DD zwsj9UIX2gxIUt$gHIkkVjPo22>o@=dzn?noo@i~h&)40E1p(9mE>QZUO7DjKv+MJ2 zaPx@KfD-k91*!Cn{ga@Oa8abGHk09mPZ1-B=xn3%JLmma-CoR{{rTpQVxnM3?6{H_U zT9F}in5*j%C?UUx!J@WZcx;!GKQoEfsTZHc5@^5p!fH;OlysY7;@u(-Mz+&X7ZS&% zXOTE0YB7?l51S|hes$>QJDie zAzlWp7#2sd;WemcBE&+b+NfS-qxd>h2b=61bRa<-9dXF(RHX+Pi?H2n5)o+ceC($1oykjNk6g4+ZWVv>-22xT#6$m}(dG&yV zlS>aM<~l2PlKI*&g4?B3wdUYr@{cxVT2zuJ2WtKn&K3iIVrIPfnSkJgZqGVAXbkuy zF6u0~s6v(5`)z2<{{Bk)G*&rb06)((mw$XYK~nWoWk`~C3b;gc8;YXGj|Mj5C7#1oF3GQ!xmWm4jzUu$X~xFvZ)@gk+J+y z6~9BTzT~V_2v*1<`j=rU1vd&dJ)#}-Z7{U%DIlojZzikM)`6n(oEytW2c9$2Zd_@B zt@vxHfe_3wu{2qkYRWfEu%3e#t=}MA26#NuK`+=@q%KjwtZ9$1;KOzG99j`I9M7X< zPYd5eV=J>p1^)-geKYAsz)-!Mkf_79W^VcQNlxp*>ZV=Gel+>k)R^5<4U72G1~%px+xs0 zfZS^&wpTH2{09+vnqygQw)eQ+1(jEBs77cR>npQPikdJ>#Tv8Rfo*qG^4E-o>|Tnm z*fvjEsRaz4x>nlaN0|W{cnaY^5VHqn_VOB>K792d*g9`6JMW2Enc?imdBh>IBB~=~ zp^L#Ws?)ENS}=i1L-#i-!7qB#g7!8EIW?3 z;9MvD&%uXsvE=-aJBy}izT)QL`2-iL#Ta$kKUlMr+*tMnnZ}<+hXZy=OAveepPxhr z*e?rlm$P~~r=^Q-y&F}bBfwVXvroATbF4*--Ar7DU0eR9X)PElYiTLpm`Vl-dI;3A z;rQ0$W%}F%^DOjG=z zZ~FvyE}&O|TH?fY=8&>}CpS@32{ma(&QKb6>Bs;jC?7=KSS`Z#cCVjR1)#$Df)gaC z=K-LD-Ab(PNhtqTt{M*@-0qhnMJxEW>xJcGSej4#6Oj4(VRRXhJPt1`AIuHuf#=7BxZ`7U4fcr>Ln}1a_{}E z8B>@<3#wA)m;9ZXfn5<~x`L@GccyDcaW9hGTa@A{jeBC*!f07iQdwOiE=(grZ*A$j zzlg3WKBVb_<~5dwA8WuYX2gMJ9HEk4zg#*x30(52665vEjKe88a5%HZ}f86;o`5^!@Y~}#9n)= z&f2AVM0ECT_#h2EFp#5qn#TQ4+iTOZdB8uUio~m`H!|j5d~6^4F4>w*T=YuozXhYE z_yr|Vo5xzL%e?M1>hdFibZ7D9Jt&(0npTV!WOgvd&vG`>H-zvBIRzh2MhpdL3apo?a4 z@x3Eqz!0ovjplaeC_?>Vm$X~0=|vdOAu|#l+|nXNgGh}5IOnxpuwz6qHw~86N({PCC*2XOx2eY?)*YPc_KB0W7>3AV&rsaW6iZDRi}cOZnCY+RDo7H9m`OD zt~#A3L-Jq2ah{h3$P)BiYg*@FMYDz;D>l1Q^%{zmAaicx282r7rA&00u@T$egtO0# zq{V4#C^+KOj=PFIXMEvFOC=c$)yt1XlhelNjQ`^CiPGiw^hg;y-$Lv<4R}|FcNT?I zeSLZl-RCK}sK$+;HD$>N2_R339lKOUpX+f4zz%UExKHMs2nwb5o57&EZsN6VgRZW0 z4V`~ZS4R9%ll*lD|8G|QG-?T18ttRmIst#bP%~`IVUdN95`C_wuDKK&DU-mT3m4WX z)nILxJ61NpaKqgP^mvax@A@n%*Spf$JZqR!#AJiyUz*PI7pRqr0~G?>@d(rs`HylWtxYWwhs<&z2SRj8MN9pd7Pw3*R@j0hYI&pH1l3?_ zt7C)jN(vKieX19`Q*hiA!{&+-l*tQCP@M|;P9TZARTm+7bzBDupd!b zFO3UfM(8jFZ{6jUO@u%wIs3WpCDqg(w@7l(&MyPunA%!5;h;qWA_4@IY z1>h6?_l&ZvHepx7vUK-Qm3JRXrjd58KAW2pT9tN}TH0fb_gFMw_GJJw(QMvIz#|xwWQPum)-TqNp`P>gZ39lBgTfwV#78 z{i;c85S@}@sxZ6bk`&zyb3peM%FbMpp8(gO1}>9B#QhL_-%_7521=z+x2*RycFocG zMXlESY5Rm*Bs5n;Q5VbC_Db9Ln$XuDN#vnH>8BCp4NO~0G?*8=a4}5EwPu_k2 zvHdZ3S9p*-3F?lC(y}5aLq#y3kZr*SxSnwvkU{EBQsWnlDECf1EHd@xUc9hybr00a zios=+z=RO$KTX$?E=K^zBZs-Y<-~@$c++3?${Ud&DMEAkc`sw8Dl6sx0Bt)%K__>Y+3t&Bqzv|NV(;3?2pcl zhx`ZX$@~7JKGFdkQ1B-2T*^V7&u#A0XE=OkOC`F+6GJb4p79^xi2amY+H0Y?zT#Fz z+ViomG>Y-gr=HF@x*DCnU9dwJu?S|W6T@CbagaTr{&V1^l;H+>{_fb?a7L^`aP9|= zPpe_(NT?V@_yi8mkgw9*)>sXD+t!?_{BT_O%VaRzMZx+!>ybA%-@?Z-hU;wRA>6Ur zzXF|9>V8fmPdG=qPen~ac}*>n1NEnl;9YHxdB+Sr$)W`(^GwS{0TqisaJYzu8ovJ) zbbx0t7wjORc>TH2%g{Ms+I>BS(9`$?t8fftA?!JMd`-o2t%bH{#{%^oEiG-Nsr5}; z@&7FvCzQYS97x>eii`sT(@3;BlfIm!vStNaC!GaT-Tic$9$Rj5YyUu|H`s7=pus+};McKn^R zd~PK27Y``-Qd&u^Bmu|L@06E3s`Go3H>ymcZFQX(&}quedOtTCpTS<4wymM6_i@BF z3||uSeNeG*0^?HD809+Ce;;E5L#DWJ!UW+3l$`3n2FDM z-=mDo6Kb{R%{(dubTnzuHdh@I! z>)Wo5hxqh~r!zi-xwV0zumL|itz{JQKELqimng#<8Fo%AvucLh6Sp9uV&3AV7FWls znXgN87eb8MjJO3(KelS5zJOZEKsGf4>p3R^T$S@tDmVFPWd5Nme)Y*`>~ z3f7e0$FSVz5y1a?%mRSTPn2aosG?zh?nwuA%X)n5-;d<%UO=rb!iz#I@6ghrgd;$a zFdfdd$bO;7vnxHGzf1mC6Q;q6>F9wVHbc|$8a*UB!D8=MFdc$COej+Sv#8HcgW~O@ zvy>NT-19ywV$ry9QJ32z^LSh;vdUa1E-IL{Gn)B4O|gGyYFb{yFd{LJ3<1r%gUraM zcOCLtE6oD%$CPRzz#5tFViT3UF9;>|70)_$*T#vrmQ3;d9dXLvYmhO~G{~%ibzs(i zLIwRTmZ1|~85uM1LBW*7PrmUZT61tM(`y^tA0-4`p|F_@53Ye-D7NBn2Fd)}#Jv#l zlCHDO^(5^706icAsuOt~Z4l)lnOQk!!Act6q-Szz=3Q?1AE0Jt+4$Q-lKDNpW3#Z3 zqF&!W7;S^l32%dQVkl}|MYAx2`uA}k&3jJ_g>IaivG$jZGW)T`!*@~-8)|~trVkfz zwwC3l*?^pb=%!u%7#fNvo-8r_pT@3*yN#c$hEf50vW+Kk)IMejxR#(T!noavr@BtkaerfjO@ot-0gpir`2v8 z^Cd?0ouDeS@Y~UX2SGvX-g6+aKG#oGyRs{XU^0eQr;~p`@_!?v-4=W>!KQ~1pw-qryqnZ`wvvh zc!)(w8d%I)Os@f>&OiXW$#DL(Y$xQFXzlR)Di((U0DPU(a_#qy8a@%zQLJ(CP|xEP z5$e=6Z(wG+ox>yMca-Ib0KB_STL(S%i{Lqm!Gac|pi?acAHPU^0PFIuzT1B2+Jc7? zO&f;=X!Uc;ksCTWCE8Aq=Xzs%9f>Y~cikl%9U_b$JkqU^)9-h!!C~kv1m`k;no!}Z z$_%|nVJ8g7?J`mI=Pbr%jAkwZ^?W~2a^{vcVhs%~l{+u}R3>=+;Y?yRJk${XH|}ds zY=j~RQp&HLW$s$Fb8?FVkrq^v}6!v55wAWxnZ5Vvf$}NnLz~T-D^~Qx)$8laAz! zv6kEDNw_TOJcQ1;MG+jb9DPSkjOU>p=Wr91(#FMy{8gd{K|vCw!UK18U?~I2n&1o2 zH$hZ2;dzBuEzV9G@9D!QnXHXgmj3*hy}$ir;LB2h)xX_AoL1Uzq660&+lMimCvlHC zC+i#oZTGWhi{-99erd8&(ls%jv>>C;EkOKT~3*MJ&h zo@WK%_u$m`SM2u!nsBa9MwfMEZ%RRviF$>?4qkNdj}XNDW$Ldzd%yov7mqKsqsjZU z`|ZPqyFDCd)p z9&?GH`Nw&MWH4_RaZ_v2DCNySR^D$#8r!-!T)-@NmD+^fYvym;d2DEzOG;7h;eF?_ zR3~Af7|P_eo|koL`mv-l(7Q|ZwtG;DAdYa)G9_61iViNnNSB*mjszQ&v-gv_gq?S~%>&*S3D`U@zWXa!XRMOkF`Nw=-;>FL2~ zJr!`FsG>IS6XkhGq8(})&ne6Fsxw2Aw>!ddw|t}_*?`G!%0UqO_0iK3Nor&ceo_Dd z=(y!z2*A0Kq9Pn!NoERL@fVWQ-!%psnUuE>L1D=@=QK5d=>DyU=ggjbAp!Mi!5Enr ztu+K+Zc7;GR|ulA3X0T@J1*0pRy>NB{&`EdpMGc2{nB>bt_$HV{?1ABuwumy- zNnI*&$?hxh9IID*0&tYsu1cbTBTP1{3YnDJQMwjtHWWpAI#ERH&2~NEl~TiGbCAQ! z7)4R{KR}8T*#ZMdndkB*JmC4OYc(uqoGy&Xsz=VX;onh3z`@M8 zrp>1^mF|oU)vm)MOLyvf%Z)9=QYGWtFeoe2jEWLH2Owl1nWlM-W0q^w-r^)e_lN1j zLT?56A4l>tSl@cfpVVeG$~1v}YXiw?KRX%8O%!q@YiK@~y~{bZSX8%hZ!}jDE{CJk zzF;?U=n@*(RsF$+&y`GsxMw~*^Id@9GTZZtDQB{^^mkHvKF!(>9KrVF4sQn=>eo_x9gVt5;CdMf03kO@u9rSKjy&=T>v7(GkPLiz zw?*6NP}_Kz7@TRo+PP9q>dGz_W>0F9k3*J4uZVLSBDX4~xSfN&p`(W;jGy(5-lPRIKMg7ZxY+qk22@}(@y z^Cy8|(Sur8+&F551~Vx)CV3D%X|*gUtGQj^vVuybdOw??ex8tF23)W>77~nFlI|k3 z?Dmlax)N@_)Grpw$b;eqEt)bI;Oi07Lbd>bw?c77O1Z5?wWo}(?WoJxpFVeIp1f`n zR02e)|2>nVk?q3a#3-)VWCIRM8^em|VuZ zOtYN>i8Kr_;h|k41Ji`BVu#wbY@hUQ+`HvBRV7E`11#E`vWsmmD<6fbAD=4} z@@JL4Z|k^L;ErJ&74|C1V@Ku^qgmddOm9<(FLuN@z-aHEJHFsF7XD+RPSF&k{vnK zh>}dosw~Bip_i&V_+KwtiZYg`zdm@HTvUP_Ho~>O$Tonm%uUL?$|5toetu3#vG&Au zEd!3xV7HoBS~1%*T@>t#hP#UJd0pp({-~EmFgM5cb7tKbR4N}lDfcBY#s#Z4*Ldh| zRCz8|W6cBxEky%cbPf@KlCs#oZ}D6P#oSubBP44WH-(v11EI3uegKb2ap-w&Gs}Y{ zO&re=;N!gkZc4gOqL5XVt}D#0D&vAVL2~SzR}(FzN+DuK$p~Q@UH+7sTrqaf>?Alm z$Yy;FBgW%TnM2w}VF1iMW2xmb)Dcg!gn+^<>eRh?Hs?G+PhAK(_Y3ILP;QQ_&8s>w zqAqI&sTG$w66>5CF*g5owJJK5XEFGoa9VHPWuJ)Ldh!q}>jn_}!1!ixDGsINYbS2u ziK613GSCsLOP_E!?f~%iZ;L*$x$=2qE9l-MSTForAzb1>>uV0iAWFfg>=1m&UqCMO zR7p8o2lDt#!_Yx8WcFo@TX4(9amY@<)B5&8Nd2X0i#FYnx@hFqIDji{*+4N{1Lt;O z{6xw#G(e?p4(*Cxs4kjxviF-O_?_YtH5RBdDao169J2Yhd4Ht#83cTqKWwdQc>F(r zVb|{Rf!Lub>)ELYIv3)F&uCx=J*NKSEefDbT?}D)$)B(4j&EhOE5^?h<)Y<1ERAHz z$Q~o&@dYA)2S@(pE%JQBZc=`SIHIn}m6hZV1*E?&zhXOB5NJhPdIrxV*Q0#q=dat% z9)_8j^3<%cK|Md^yV5@f}$_g3V!ZmDss2 zAJ;&v>)a@#&NQG_xG`E7g_@sswv& zx3QT8#Vr*_IRV=kw`OU-$~NV1V@6C7$qkmwFDNc5>gC7aG)NrJO@1FG^zglO zm8VNY31=zv%na@Z`vKv8R-#I)Q^$OOq;vJ4%d9#+KTS})&82iBHoh~Yx7^b*WAeN9 z;Oi;owUM1=f@I#cTPr^(!G_`;!m=ctJY>rU@lljz1Bp|)R2n~B~-Os!$5JO z6aJe0vvk5bjQz53$h(odev+d=9-x1pIn1_WO4vZY9aj|X%cM-4_-NTE=)8c6dPS)j zLsl}fteM--4bJA`Z0-gw@HDM0qR~pQ+9~=JV2AmF%|wRjvM@{~@l#eSgd8ZRn&D6J z8Nwp=<2`QC!_$$2toZ})16RxXpB|xOlNU@g0t7bYO5hx=O0-%AgseHeVF#=k_~Lli zp@4J;=YpEd*QgDBX<#^qt+IFYYCB0-Hx0Yr%uRqVSe@v^lKYiSgczF~5%m91Z%^(TUH{=Dj64dnkt@{z~XOfOcHPf|?X=hKG4 zQG8|w2uf^V6ad1z1uXr^EJV2Mg5`k*+7;s+YhXVsjVx4bs^IcrrR6!qm4L= zxj%AXP;_k(zJn7Q%9 z3l>qsst6D*$b~g&1r82}^nRM&SY$ARFCy11H&IgUY2^ zVz1xu3QH}+A`M)ayMmG+nWNw>k&inaKkOLQ>X>H^lbw}&^)c=RVZs72sIS$+RQyOd z>n{yzrak3?=Mv2gTt?hwjF78#Z)C46Z(CEA$Ah2R_*8MNtire?0hE(wjHqL*XE7(4 zGLOW$3Ew%n%7%TsO-WS`uBPNZO0BKfTP1HhgqD)=y+2DRCyg>|+>-GJ=@TeD zA>aOz8ykY);}xkdY{rVR6>YXTme%ZyPy9aE+Ex^-1u! zM|s{C@)zEFbXkP%D#iLoIhhlo>RbBC)bhuWQo0rmGOezOe6}uUErRmkPreEig}z%6ji$`R}8S{+c@kx&SGl((!`6$?cr zuZx#lem4QevFBg&yzkYP0Qz}qN>yqB3*KMW3Vamad7yGlU^I`58_YohkY zLVlKl&lEzts!1QMdXMhy1 z@5M+q4^uRbpa0r|;`}%K>T+cHrIFMyQ%dQKZm_9H^*%Z!r23_{9-Ebz}9;Okj0$5*8XpCo~^?c#>D0;%SjA*@k|!+Ipa1$#L!E%aIoh!iFy3GVnZi( zu&{0bxot;mSKBbF4Aw+zk(b4=Su|+s#5S!n+{(aR&id7Uy;{^b^J19WV1HKGsbGS< z%GnVAbW3=bEkOqkO-Ck-`U?VC+bEkjSU$Nt#|7D#7$*%|n5H~XT;i+@L`Bp39cWOy zAtOcq+bsE&JQxDEGj3r`DtACF9(H+jpCnY^fZNqs21grRp>_@JhBMDiOWu8>qXgIGgW#`|_oP4WAY!5Csk%nIo{_ zOAt^|CzlYu%u!D5NkPAfs`AXOqB4#`+>XRv_hakos(bqLm{mYnyVk-7e5y|JoD$9Q z$WAeKZi+dB{16{Fz#muA^Os$#eyu(&UUUDYueO#w%pe)_%Hi>Y$nn2vN(z}1U&|tI ztF?Y>>lWuTY~HhZ;n{eDJbPfAOOS$+iJ~i=VKU%L5%qn}R+AJteJYPw6V-EW9Nem# z<6+kdwxG3L7e(YjH%?b;+-$43mP@9;i|#)+&TV|{*)kR)PiL~(ZeMGw1uZ;x^iDv1 zF@)ej1mKCoC)MST0WbA^?%C$6+4(3j9Q}=!=dJ;im-m^rnc)ebAxBbprCt2J4R^2f@w>;H72GIrNAAwqNx*IrFTYK$m2*9 z>0sFUYoRZ9^~mgpv2B;t-iuyFVWVNvTv0&QNJbgq+~hw>&3*TDFMd7F`RDagfqQ;7-Lj?vUydJ}vlqiD+O$NGywpVlk{FjHj|dNGP;&KxAU&upAPiRpJ&qSwbe{UaX3H(Hi99gPq4~#K1@yZ@ z|MRZ`ZYy1lJk|pAPb@-~PW);Mmv(ImIb(dp4UM#Ja$sT)@-f@Ut1#MlVdSHTCO!ohjy?2Hj zj}HK!M={l0C9rz3UELg?D8lWW=7Twt3;q8AVkHbgG*z_GLXN7A!g0lX5y3jHer4=$?_$ndUB&b1XO|Lf zxCcM{bP*d<8!6M=CQH24#Qz(4^H*g4uT3s?X% zWW1EV-!aSj*&XBJV!}QV{X6*8UDrj66^iLRP7TbHeswyQ!z8mzO8ox-c*pK%o5lvq zOZrDYe#4%;nV+){Lts;7OlB8kEC|nB{m2qPuBTX-lo!PFcg-bI04+s5AO!(G4qusWqR;haT z7~B;tKNCW(pXRxnObqE1wXo(jy`E_o7&#G@Fvp6*$I^J?akPaWby!D!wsjt{F)OAa z8}|jgUhn?yWmm0;9yM^}L*iRl=!g$+@0x&=zfW0HneWZrtIW+d#f+^>r4U`$Vs9<8 z^b8nYc$0I0iH?q@M_C%&j{yK?Re<5SsKF}c+J|m{p>()gs3KA2v6WpJ@rGAYC@vX(day)oz8(8d>D~PMjXF06 znKVII{qw*tJ{dD5|Lw0WolHv`A2!i7i86M1--9mhK9P$$u(^;F_R8)7ZKx-fLBQ8FFu4F=iZuGss9pohz!$;<1gVCW3ROJxQ-x8{q}B!n|_MoYK7OU=^mM9 zuEd4$S~fc0AXhUyM!QGEC6+%Me56>?XU&Ly8%Y*NjL{_;!5U9S#SX9*s2T^JO0k56 zYdAk1Asu3t6r;o7(uO--H+nStKwcMPjxe3zsCBP&{Xq~8x5q*k;>CREoDiyG>%9BL z9+JbW(_-9syQa2T1NxBGcu`Z|DXRVqO=*S`K<3al)zf%2dv`Vmc?+>)pbvpqe-T1x zBdJ0|G%=(DZpELx^uxch>|?6R{ew0=NSvrR;* zPUzn=My&J6nVCgOT^fjVw_D%M#zLaryQB4wT&Z!z3SCZyKJ9!J%hSrFw|p~KDF+je zcD;ji)h&1G5^Ct!a?t{8jmk?E2*Y=xO<=fm7`0y$h0&kItdLoZsz>*ll=ouO<`C&x z*k=JPET}$*W9=DFnqNk|<&rmXWz`Xgcm%F{ywrAKyWFbsmYp_o?l7yV?UG3tDWFk% zUIkDD0eSIG_~rdrG@Ix8Qjr+Z#;9cJD`$na&pqRcuE)9fuXkRU9Gn0l@WI%ttbTz}IsL}s$)QLcM0FPF0|B zirw~(e0@=&F{!*gi!Lh~5WPHB@BqHX6!)9_EN(VnC8aB0^4(m|cXuQY(~SZwDg-Lp zLNo*^p2l}5h4G8iu%Ux<+Fsi;+fHH^<}|6020kF2rzklTa~3qUV2x4g_J(pmf`Ook^dtWKHXv2UB=l#Nm$h{WY?YpTvCX zlP|BTis+Hy7@J`Jr-dR}6}g+!WCq5?7%UPV$5{pKW%6n2+{zm3^S!8C|diJym-m9fK098UtB#ayTVR{jRg?aHXrkn z3g(ywFwgnOz=2~VZUO18;W~cxt5@h;Xq6)rIa8Fc7gxtQhpU2&74jrUiLQRH0@vz;Im6lx zJV9R@yg1_jxiFFOpJ>Y5SX~u<8>P^xwS5UNQ{wPsw=ginx?#rSWqFa{fX8syM@=54 zZR($#Ulaz`aUu!%08H%bRx<-XBU!Ais}yHsT04PC@k$Ypuy{@p+I2w2&B@r$FE9z$0AhWHEPk9d>>E5_~!^M(mXQc)0e zu0SCa&L7>tN-EZu;gNAnWThW!upvDbOM=PhBdCw?B1cXRmXcgR;1PdC)m{kmbFbvO zjTM=pu3A|5kZjwmU&!ZSm3c`?#_-@+Ibl5j^Prn=gIqghTfMw$HEQD_fk0pso5wwo zd$!_}Q!PirS2|_We5c^?reWb7{#b=4??Ra&zTKU9t?Ntb=*1=F&wYV=KZ)7aj3%Y- zuex!Mdm?V4UAO>kqb*22T|Ks^K;2 zcdMs{Kb=fDM1ZfNfLdqB_jvsiSsa^>A0#(VEZcvsRWV-JZhiaeaolTm|O+L_Xnr>a@XgD*PwAFvabXC0kJwZs!@ z2{6zE#&f$6GvP?4k;P2P(#&$1{wX@fjU}MH*KeTj`OlobnpuRE!^>YG%UX8IQRn8; zZi|PiG1WWZ&o(oDs14Wct7eiWzYr7FIcW{o0q$>wIBZJroP@Jn~`$Dq>1t_G#8O!i=%J?fXHH~zo*`H^c;sY z_*_OU?VNTQc@kd*tas}U3F0YV4oeb{TEXOGi8JRy)Fa8&qxi>m z*F~G!$P|veBA07B4KO3Wh}P5IM9%5RiirAu5!|!dv>g837WOBIN~gWA67n;;svl9v zo>{sy0W5z%j++17JI9%5uut9ZYY9xfe!(?%^dz=oa-4|NE&r^-(RlAo5|SXtof4T2 zW=z^_lf2HdJO17D`Wf}06!Gx7Ik*hiO63T zfpsXh!z|8+SW!4a7@R58A?`CE0=Q+4Gd#r`?mAZzQKS7w$iN|~bWvY{V=oP3G*w3sYwYwFD1JIh{5 zAD*){k=s!Vz(gDhOFpwcV`GGNPETCth;Ic|Nw(X0>yoRxLu0FjI@S8`&ps1f)$P~8 zoRAgaLOx<93aVV~y;UlVXUr@6ws>u0(tB)Avjf$ z&sP&6$(v89?P7RSi{b50J^Sf=Yd}6{Um1+sWjDFWi`HKw^DLW67H=H4N-Y-5n{8X8 zs?VXvtAE&LymQb$Jli+08H)ii6saEC!(<40+Cu&_XYcg+J*m5ngNpNsFi+i9!a_sL z$wc0q`i%y7sL~J3w5IR<_uFIRdLsw$>%oK#=Q95f2le^kqhP;W^P=Gl<~OuL*+MwK z(4?K)kP~^^8Q@V=YnuPsfcYcu!-{q}D--J-cP*0=IO)*eC7F_WH1N%&7o|^ohJHuY z&l}b?5aVWU+5e>VXS%$?f`Hk+FeQ2Exu7y6id3~DuCtuG_bdSZ^aTsRe*^iTIX-j?trD2o^?MG=AY44K)zHPt0?geuy!Uc!r zFjBtP82{FjpG9NMRqt6J{qH?C?(e{*5J zw!lqb%e}CWxE*DXvQ$DgR7jUZfj(~U`$_YB`Szm!UE@G2-iUM#0dzC4^AIEv6G5(?Cy%KwD;5}Ws<0t<`BMj<#SGl4s37io<5tJ(T zUG5}EAL8Rkeyo3B|JEh0^ml&4(u-UJj>96i>PJ=uZBQFp$ws8B0dE#VA+?iC#XV;U za3`;2sGM^xn2p`iy;%+XEVmL!}Sa)9HZTh7Q&M% z=IhuO+HHD8Y%ScbS|FR{%;n7S5=yUfXwc3yhC6aR-A?W$S0&0D|3QPB$H_$*M zF3ymg1t+1gK6d$b61TdP_q^=mpr&Y7TK)b@o4Xr_W~RhEytzuO$~FRac~i|Ep;W## z0sDmv9F8%%)S25@Z?`n>%YRGoq}q<7%qC$?ngFq^op&V2$hNj~3*W-0u5@gz@=80O z#pZ{8#77cxW#2jyNKM9D?^tX9Fa_2M=8p-c@%E zo0mi3e%^bu+wjfxQ{J;my;~v&@*bQYZlQ@g#ay+OiWB*VHEdm-{_R!-ds7V*T0MJ@ zT=kGu)$u630ZP$obbmVRI`mg9-=nd%KO;{*BZ26T&*o)dN}A3*Pl^>2h#kv#--M~q&4H> zqTzF+dFaaZ?^u$2(ai|UBFqp`1ysqDChvR@B9Z${AcZKta%b*JwHKVQO^-gX(~3t; zYrf_8PlWb{5bjo(6EId3x*KKyRSUBF z{$6oP-_kW%(aE^2Wa(H}*Zm-vNYIu*&P^%E{?(**VE!)cw(g&5;?78Z)L>I0RBEfz z*bpWpZ$39?spM^;EoNq3&k>Dc8V97~teJZ_WvOBJ1pWPberQXu0(i#`Yk$T3+en|R zz8`^mz?m)$MR(<_Cem&eLI4pA?g_VKf66z*{|C4$Mfs@W{+ji#z)v-W7#lx=H{CKU zE0al3L{aAWW8?>U@6SBfPvh0gE_76beAu82mlVa08-<6uh^z$qDo2Bbe9X&-bf9WnYBX4H$cu@xr&GPb{VVdZuaB+W(|j!u z3$nV8SGM8-%TdSO_H4OU+&V;a#|J`wGZ6~YWM2E=tGsk7lO z6mr^X=XhK8LSc98pcLjA8*(+YDzwSg^Ry>q1;y5Z#qY7C2d1w+a&KY2DxCi?D4C*= zS+}qXt-Y&IZdgu)`>RmmlTIMDC8NGx;8%gV4D5yTztY;>DwsF#k$NT#%Ne@L&kh%E z*RwWLE24CcLMgl+?KS+piK%5ZN#StJmgo7}`)Xei;z2J>(cxCA1JR@8em3rQGkSKV zyNr4}>FXa1(AYI(is}4|I|}-NLf5=~*3M%Llnma!P-}>$0i+v{3m}9H$9UWbm*+n*d}D{W!Spsk~Os+Qo*zhgmz(qrCFl=HzFAD5lE_PcsFF@x;Y zhP~`Z{k|gf>eHi|hSm;J*+SE-hDsKajU$6>)iB1P0K&>S44K;Oj_LB(*qf>4U04jU zto9~dxO;cibh!m7ud*Sm2nYdPEnv3l==t(co{5IJ{Zu_K+)z@1e5+r61&ic1Xo@=hYwv)=@!c z#z5{*6HRBg*x}-NZhR35QR44{_jwc~mOKo(Wb3AmmNN*`za-p z_7Lwc;QPq6cAR7p()D7JQ5g80v)TnRVR$5>A*&HX84U;>R@l}jr?$uoIX52G9%Z*gDpP^v#Z^TSBe-uc=Ap!R;WfJ6&XWRSs z%0J74o|ETFs6WU-m)50_A>we zKG*uxcC;~;r%L=~@9ODf$I@)8Ir6)x_D%nd6%V`tNHBdHio7?_rd-0blm{TG}W z|6)?&qeRZ}?2__)4Kgn=qp4{No)u3{NyWDn!?d-5<9Ks9rGGhl&ZG!KmLxazQp$H;CP=WYB%wZXV_k&}{rI5x|c zECGb5gOkbo%;rJ+zf(Q22HLlblYC>{PE%@r8%#kx{5`_TlIYCfS;2mWJ~RRUsl6{^G&%DN8b(H zNy|6f4e8WC5`gmDKX*ofZ102{I0YC!p0w*r6fo5A0%@PFlYPLj;^0%jq&MytI$Tb<1h za{e!R45C@EM(+=p+12hkI(w~mv0O)*5~pe_7Bj2zW6$iN1;J$wR4Mwl-Pn#}vvU^n zy@MB8YpsSB31ln5`9;XLIMXa(wrI&`P9f)KtTfX8xEk_7+G)_Vb+%t;zS!YI>>lpN z(sc|uU8G%EaxA{!bnW*3kt?%9m9_2vQFIn=O}=j*9^D<%5(60}ASETuHhPR2AqXg= zJ475UARsYPL29s30*(=)(j_9&Zghi$f`EkI-^=?SJjZh!&vRV&b$>qR>3_^QCsjP> z^ys&V|H%@FY36|`9>)~*_z4uvh#tG~9F_*kFmX?Mg?@&6bj-Xw2i3}%NtG8@-MDya zooU4oabDTI@u*0_o;&VhA#rRg3Gv#WHkl7d7_J=LXHE??O>e#c%MCS$q;5uw#@ zbke@O%=h@!4@y^75C~1y`m#ja&rs`r%VX*yn|m*y2~d}Yk92}*DEVB`|3BgIt$!rY z*N_|HS3o$>B6Dr^(ntX0Hs_Zu$DrOAD988}a{jhIYMzc(^i^MH3q;Htgi$}8=_EyG z+%w-Bg{FOEtZSz<#TaC&@Qm-V<#&$I&yxxNLCjiD&DbSH$u?EQ$%#+ET2%h@YzVfc zvK^@ra^|m+JZLm{tP?-~{^nSMe9^Tv*-|BnvOdmIEh4gfA}1mQ2gK%et1zSd2Y&aM zq*7&3#h#L~VAl@~d`8{u;Zl_GuIaw+Yd+)tlg=?&`Dyq$92kd%mL3mwM(|sE>ng&z zZxj&BL(hi@yplwDg+&Iz_Sc}VolE(0-?VgX9i81NM&!z+z;yFK<0`*}qT8aX1Hk-l z0eN~KorM@%JbcC&(xG%5&rR`)x;5*g;|K~ef9#qomMQNqEBYGht65Q(Bpajbto&Q% z;>E+9Dj;XPE*VG|%Gk5OuBwp4^flUqjpPIJnMG9Nh$l;q>4eV;OoPo;v9t=i3N$xX zHzmU3*Nsp|Lh(b@U%ezNB$p%%KCOtbz_{v4Qkq{M8uPG&v$XC8wCI)2zc-)oMrHRa zro~JwNMbqv2Vl49(a<&C4`jbG*0O#iNMqPwNHGp?4Z)LkbGPwy&Z4eA>48krs~S0g zf!1zSpVXl+e`H^*qm^TEV@C&K29x8gxGza#83A!J?~SPn6n<2d>+5=p@3y$3en}Ym z)9LvPZvOdv%MaVM&e>HneEW}HRID-?E3HOE$*;efI4YVaWqUEK52DrGasR%{IXN{j z%{C}y;xYe;8)}!)N5|*xQNRHW^5MC0GK|ex(PGSU74IE`kZmP4Eg9z1ig{jjCQ#^v z(Z=0?wT#3bG5@~+I)K`Q7H3EY@#YF`diLsIglhomsr^<}Ul%XiO%D-9G38N`Q$hf1 zrRV*%F)3%eh{|1D|= zBPE@^cP;;!JzNKvY9Hn#j>X}$v#=R|?{zOzpOdHZ(P?z z53E5vV4-k{jDuYveQFdnA=_agb0|S7_!)AKa23xwG5fg(#wWGGt6hE*SS3Mv(%a?p zI`RkoD-(;qKI^K^nEgX&%U_X}s{*!{Xbo<}DUbt$2E}&Y4KZj)WYKTxnxkP};VlPS z!kz3tl_g(T59Uy^m@oM2P`t5Tco_O1F{7j9=QkV7zqB;j2oqV~Oh0k;%R!u^8 z+TBir;=y5{2CC&G(`IafstqWvbn0y;^;{5XXu{$JxC70}?Jym@8o9h~+HUgyM)j!q zzfwJQ!p@A@(}U!U@4uN|-JdSQXgBnL$JytqH3BI!3<(AP+gSb4_L6^5O7oYq<872H6{2S*{QGL+xR@Y z0Q=J(QVp>R2%1L<-w7HL)zL5wT)tnHwGtfvMhcC``#GVAq0=_x2*iTJU)MNn(PRbL zJ>htbvGd-g<4KSLe)V5|D>As6SVrKf))#5rpM++PF`*myUfSSt3c$H%%r5CQd zbM#Z~r{pMhostW7;9BX#*Q(;He_TsHIh(5ZOs4YpG@dU14dirWs;ZYvb+D9Bwon)n zHWF|BPQGrN4q#%eldUdJu9sNZZ`dTTuTF60iNb{`dfgOth(Q^%Q~DLll%|~4A6k`5 z7rkv7mrkw67g)CkMEEHcH+U49@9_sy&vyg!zO|t&$pWGuW!!8){!5h=Pn&(AIfDuP z&qN!>{}5-AWi77B_W4e*8pVgP!4LIo+;gCYiujLfwTR9?@`*{D@_c*?S*lZ_2IKwR zJmbf60+jPV>?PvAgv0GLk&O`&fM{#;fHD z;!haL5&!*t09N{MV6%hyj=qaGM%Pfv0w)HoV4lo*u2($awD$B@rXB@?FLLYW>89I< z0YY(>L&I#XcbfW(zVUKtn0ZSIt&~8l>DWC=Q)f?7pfY-<2cyf;ze8)E@U@CkUznSOohH7Zfu zaJIS5!M{U2fw@XOc|z|r9>_r=no=KJ36pIUtjam+){!EH*yx6mk7-CPl^lmiWa z>h<0DKp&K1!}xvLI^xfwW+%|D0Bo9=^*=x#;RiFNVEPR?HvlK##+tAGc$wzbcgJ&I zu@=55m&=#5^`19t$+*-8ZBG@;SU}~1gv;1%F4;csW`D>;f1v{be2~K z22D5R7+ev&61s9-C(qmzbWhUqRMt=yhsHp?o3n&WDbaO!&;g9W^5tKbY`=u5izvnbz^8p6l*r;5_6W>TTMQJ`5GZHTs z+W5@{=V;&u2z@AVWbB~xtiJ^>$sz(y^s>XJWNQQ*ucSMqqwv_F<$(aiKWlt|)nv^V zTs7FrZzfM^N29Lj=6A*P$v&OQCoWvqz?bks@~Juv7C&uU-op9IM!_HFkwKu;(_Qwb zi~z1IoqagIhP#U8-HUj2)GFRho{mN1Lx<-ngiUFeEZWt|K;=9IK50wEFA1zD7K&Z|)b91L$=3~cKiN7RwD#hzd{%qAt)Vw*qUz8h$jxESpRwm`u&_uV zqs;gLXF+F1nb}}oSmv~{(}}MVv^FdMdP9X)9?0X*)uwPD!OY_(Qf3MKJ$V!RXuJPW zTQd2loc}_JjBUa0sjS(9YR=eFe)TrUDT~#7#?=}s-B*EuGy3`NnB1rJBihjq@9Sc! zrmfUo2nonml-ZIc0qN*j8%fzq^7*|wN`aiuSp>>{2F(09J5^cHo5*6YNTkF-jWMo3 z$U1~_U*npnbRb7-lEUEVH(NpvBSsA|oSI`+)^|_fKPWHRwK6A!Bi1Q*I&Cb4Hp%?3 zRMDt#D0*`01B_^Ed4hglk45vqq83VTitIx3Px7`}zCPqmQB!58`O|xxMvT~-9AUxX zF`ytRDT4#4OzPc>1g+-bQo-a-xxthx;H-6N#bj&9=(`Ul8-z7yz0n!=wO*aX5u$Di zhfx1&5c^P4C0sYQ6cqdc@wSfTUeGhCa@0&aMss6N0y0CtP$gJ)r8{^5<}_v)Ka?1` zkGS^qUT`Kf^!5bN+7+T{T~0u+#>9xi|Fxru&FH3W@~5(9F+Qi6)>bo|lmynF^yYb# ztjtC0+jm}V#xs$%L6^=QxXY^bN@c}6Th$x9tv#@*9Q{G8YUcv33wz(_{JKDPsKBSG zal!S01b#2<-a=9lpX)Ex)N?iJwrE0}C;wZQ?@DEEMDIG-^>z;|xhl^$Tsv2x{km_9 znP)3s)18)XNQ&Ba-Mrj(?Rni#F~rdQ_qO6VOE(dm z`t;X#bxtpntFW(%3jZ11)7Iw^4s#ZiE1BeO|Hbv<{x5v z_6MzQj%6H7bGgR|((&s*t&G#l(~BYjdM`20fZ{L@3XQW=txD=$!|3~ZUlovNO|K$J zM=TYG#R>M`u@Jh)g*i&KwBUJkfE3X5dYkvU#zV-Oj#+h7rRB4@9ZYl4rx=zbsRb*@ z$x31+qgz6O_yx+i>n}I%m14QG$=&WPT2)Pug$Lfp1aD4nrB&w67~z z9od(zsCBWu6T9b@`M|&sWx4BAfmInrt03$O{x0SJxbvt*6zXAmq^LrzK8LM3~haFxns|qcot^NFi}Mw34DRsV3dxERVbR^W3ccE1|QR zWo-{wWqg^}Xf^zqht6n#{6;paBsEFfM$Yj(x!MYh^b@!mv8uZy(Nvd6-49ulHxiwY z1h&7_PDy%9jq-BDbl!J1M+2EbLYk!~0Jo44fE4>drPl`==fTXvIr$p) zT}z7`0=_z$3X+<@AN)MhWPWlFRDYLAVprelp@n@MZd+c~L-b{D8hTmPlUaYq768pxpBpwSwKc-^G$PSzF#YfO(q$P16Y( zW4^qgRwC=zIO0fPs`{`HsW&^NUVGD1Ti~hklnPC3;9E7Ig@Y$0Xj3Vlo%QkQ_*0<` z__wlc3HFA@{at%)VEW(;K*J3IDQY2L%x{oQJo{m-{K9gm{@v-%!7=$xI>&Em#=;A$ za2iD@;X-O*U$H1Pj^yoH!Ls%V*o;*}9mxh+lP{o4Z$2)|kO~6$>$2(`+}1R@U#-X@ za=-cUCCJ+AOTA6OJI~8e^{uh)3D)<7&tst_gZ&0qk9a*~`Q`QQ%1Qj^>eb*-G1?|I z0JEBSzgdOte2u55sM(_Mk&TY+bj?1;;zgo@w9_pm%(`Bj{dd(0Sv`a ze$h;hdtUp0IQJoXrC38n_L}e5EFd#^Td7CUKyxF|A9!u^u@A|_`KjGmGO6lAARfP0 zN{`4n#)Ig=pp(cV;W%>D0Y%lQcIAf;4fu((i_+18$R@{qIKio*fRC)1YjY0+g@DO) zfbmtibzYRLbXuc}RoVR=LwAzeBT_`WSG9IZlYlDa8x zw4UR7p!r6ms&)G59p!^8S1Z%{MI(ZbF)5^y-vwW}?@Ct;s>xG++Rc0K**W1{9-dKy8#%#}PBDMj z*|GOPfE+yoK-4m$Z@Sz!lnWNfLP3)#$ZcLzi^FwHYvW}{4OF}=w;L=m{$Ry8`W2=j zjiZF{vRHm6AxqkXj7zB@o8!msjdkH`GH!4`)vXzMXE4-#5-fa}O}F4r{hMbBQ>>EK zb#C9lTlTV z?7v5@JWDQ#)j0WOwB$>8R^o6T*@5}fMZ6w;n%v5&TtX9*GDR4|kEP3EP8e#dV7-f4 z0ROAnzLBa=PCxvKQ+bRkt=#$f^soJ>!yVvz!b3DEnSW;mb}GaNQ!lP>-9Hr@c%17o zkM!43nbF^gw!ok^tgDdxm(czLjo64Iu{UnvU}AOBTFsmy~a|L!Y%oqtv?f4 z{oQ#LCTOjnkOV3?4@+yVgYnkG%rWBP^of^I*%yNwx~O?y)3xLagtHr4b-PmhOQaH) zg+z7SU07HCmjG*+xRid%G(Z9#iY4oH<<*`yCVa7;^v zi>OrTqM4FH>1$}IZHm1xnlK^kz;+A;?0F37N4HIV)j1HATn$0NT32lYO7|0J@`KUYD0!*KpZnbkv{DI^o zBr9^B%}FI0f*WeWKFd&w4=zCStAx}F*(A)bP)9uQSXOCC$M(gfvhbe)5v#Sst0x@e7jgY?gzULh3Y)9siheu%~EdK_2`%u&thAsrAxpv!*I zuTdTp;;E%4UVI59g`ijvN2SA)4La?FsvaqtQlpcFgJlNdmganqfsn?#`sq{O%GE;@ z_iPc?_otuc-fhUaQGjE6(=b+Bbd`7&KwMq~G&?xS%__>37m@v|SJW}lC3Ya5`ukO~;I?0;3rpD$n^PG9XYzsmpo!&GhD zyL3d64y9scmDd7Q${{4~rbSZN`zRgtf>rU&IiT4g+JB)}PFdNkoZeEzUr@Y1aWIFv z|7_vg9QFLm48V)$3wh#HVf+El9=)EJzB6Jk&zZzD2{TBTA15W;m}VQryf%5G1CrA4 zAAPXFrRDy`4`mwKkR>7zuO1p$+^nu(B~o)uDV0z9t;^oW^5Nd)qw2$NFZ@nX5ae`A zmD)*a{vv;3$r|HPSBgf)Z#@p4vt;essJJ0PR_@W!P94M58Ko0?%RtKK9MD5z=q3E- z;i3n(UqHYAm&v8D{m&>(v%}gDo|a~Ffe#yUl%i61u%wt|(Kz(b5fG5YuNqTIyc7tu zJZp7gztqo@YsurxN4Wj-nx#fpr`aNm}d_Ny^dfarv@63|&3S&36b<6a}xhlZplo!`^^~b)B#Q zd|w5%q6%vD9BW}PG$(rB;}^^TsZrX!ZY{`q_C`%WybFv1ZP)twqiUj8mdYAybR+>$ z%)qisv<#wamlQ8C%rxv@Aee`=8jOQiFwMr(FM__pI!s3QsoTGJKgdGxlk zCCshKg5J-5_o+n%`glpU?T{J4fM|n^4{UgL>U&WEKFvMmXAHiW85@~JCz|y|y;46~ z#6(;p2bDBsT-O-h9p3IE*e06i6Jlk#wVtv9;P4W%ihUn|S#4?2fbsfA++Mqipa0PhSh3W{jc^V+?h#Hbb6 zpCEl$wrGN3tti@D{*sNLq(kPg@cXnnWoc!oPejKm|Ki$`PK=sTgN$aOqbQm5riPA% zVoX!p?#8m;KnzQTyUS<=+Qwnd!*leDIx=f=iHhEplaP(QA?K@D%0q5w4uoM(Va*(! zJ+%9e{0X|3%yuyN3m96xc$zgoK2*tw#LLRn&KfTE++dZ($4SHPD+h%6yllYGkrR~( zdYvNW7-yJIV$b5lvEBP2YOK)I2da8`o0Ahkzy|kk9(aysFiga*dbZO_FI#H$Y{cuN z5}$BWT(`O^ePoKdE0?s#T}SjIdZMe#=_!r=D=|1)=>PWR6SLHkfDwyAk9bFit zd`#fusu)pra#+zKW%iQAy+Oqk&@}l(Sc^m0N^Ps7nezma``5{9#6x|o%dYKZEI+s; zPUDK{cV%G8vR-q6zw~ytU-C6GXjJ|Y@mzHw+ko3acr5r|0=+DCal`WfUu zV`2&Nn~{E;mvx+;BdGfW`6tWOB4%ikuDx<;)x%+^yNw zqoLE5*hEP#!6za6k;^P-sDMr-lEMv;4Qc4DE^XM;crBwcne|H63>&uvDRC~luH0f= z7ek!AP{ z$y$ESS~VfkoBw9w#P4!437Lg^fHt210wVfe5*1ASWYt8F&{Hld`!=WDV*NU>J{CzuHa#4#lVdH0D!OgTUwpye(IqU= zWSjSgGc9Hg7r1S?bNj8wFz~3e}h|pi8!o?wV}IcUMKT+LNsPxA3LGDZ(nCT>HN@p z%W%BNPmL5O9oZ6^cz`ik2IK)=eKXtOtLR(|L}QHG!;BfvYu1__r20QXA$X!I+d@iB50`-R-OBG*pd`# z-U(FgNe;*SjE-*g3e`SYHLEQWX~i^=9f)dN>L#?`w(oAIh;39f6fOEh!cH!i7#rHR z{ICvV)V!Hi=2}vqV;t4t3(QdiE#wwJ33XfQ?_PI4+qgWfE-gJ2(tiiK&D_R%((g4L zF-6g?aj?vc3KW0I8^~fVYkQUVbx7KwPTyCyg?rDE*0U+Ag&p;kuk8|&KqC_9FD-4V zGg6xRsA2U(gP<9vsn(;b_VrUs&ITXwwC2Z+(tg2>bk(sSH=0s<>k6FilUuKzmNs5? z_S#ok`*x9*+)VC*U2s5eF;Bfpd=}YJ>P>xk+^R$uB_@EaeP>JjQ1kXY_%_6Sl30?Y zSe9dsuL%y_)zG;U8#pAN90Iv1ai19*NO*f=W{W>H4sU8H$LQDSONvt^>D?e<*_vMc zt9D)cvn}2h1__RL{Om{mJe40|BGKGuv(bPiT!oh5qU$Eh;N@+?NBgGkovY^c4{O%| zwC~@df~^a+e>H@5_z-N=YuJe{VaPj{nmNkH06;8b^ijss2&0~ZcKWORth4rC^pA)O zb$Ge_oEs0LB7oL%lJSr{cO-!VxiO>$5!N1VvMCU3S0Xs(oig9izpQ1Q&~dz5ZodgFe&P`H0@k}d(*Qv!KIsrmmWb8AW~yPb|)UfvB37<_1eO3 zktSS&OpmdKp?%GKaI+<`RN4f`&KWIk&;t=no+9~5YIRVcqXpw55mMPn4!SOkHA?i!_QFX#i}0p(F^fROj@Pc&tcnGCPse8%qQ32F#SiRe|M=Sjj zhnLeicm(7lEy$`5m}f%B*FZ?5ZE z6*(Q%rI?0R__T_c{!Uz3QLK&Fr|jd4RkIKo?kq0Awo*Lj!|>0Ks{G4GXHcNERg-j_ z$WyDDBFY?HjWL~tXt#mYLt#b{;r{!k(nXzf6QZ@*i#A?S!qlZqpICupQa^MA|C9_1 z2wf2W5-$UX#$+joey8@2`ii^`W>_Bb`^pc?;g(b4P5rZ&Hv%Yy){GdxR7VLt)U*-% zVFp}7XD&9}8L5tXrO>UcVvXVh&;)4>@rQikbVoY~0FPXiN35-#5ZKO-rh4q8l;l|X zyo8=}YO)KSUZ)}I7h!uZBBO^9S{5!j$9o5;C`%}mR|esvCo(hr?DTnvouF$ zl;-XpV%9;>kiC2HC~YR##vDO-^&(8R9b`ji_dft@Ng~C;QM;N?7)k|nIO@^dKezBG z4pK_6(X!z(Ye2Hd+16&!zw%$gu167Ln#hZzLwhb z&bc?iJqiAEG~}ho8G@i*3hd=$m_;)Pe(+h0XHh0z?|aYg_powbA)V-(RaFw(*K_`` zM^gcw?=7~ga;v%jP70638`QXp(q@dyB_u~Vlr)4m=~LfDZK1WoKg{5nJii~4!uX2h zI&dvHruPL>wEqVfUZZY(l#lf2djr-Nt)I13g?o#5`FaHoD=e_9EuU+g_r#f1@dk~I zmS)ppqc~?|#fS0}(RjOhBp`>~XeE^t^Npv5k7t!1!J>(^G5vzp`-HK;&5k-sIVZH)*E^qh-;pJd3OJyjLH3^i3ki|h4q0rAS{b{vEVwpjQEl;uE zzazfCeT{bnfetQj2zoHiLVCSNaElQBZwCkIOAaBanvLCa$^ArL9ut36!l8fTW{7bS z994pph7!z|viXNoh-y8pn07kqn2nBwhK7#Ab#r2Nu$OjzI>@jrPtw1L@_d0;EHWYf zne2v}imVS&@}=257EA9W=1vKLATW&oaq|HvOiH`K@#$kmgA*EBAK7W!)K+sw4c%R| zbkW&CP(^qKm0x=vMz4q-=7i`ex^wa$%6X+bOQk2dxdudGyT+pb!??H+tqS!HebvRK zcam!3i718`;mcG-8Li06JMR(a{21To$B=;EwecPlwKJ;`=NtocdxT)w<@oZL_#MM<^r1*t-RVu3ugKj zRMX6j8`TfR~>BMprj{~2d>~)0b%E0{UUva@xFtX)0%1ZUFfxTBSty#*O^UwTsCI_yT z3T+Xv$ie)D*-VPd#`MZ}MswiFfQUJ)oMKcSrhI-qU?eOR^U1+}W!06<>C`Sd=xf8` zJ30Hsw(pKEjxMfd);5+&wAW2s&G#t7iQ(PJ(>(*zPhtMY4mxgRdQwDBUUuUjGgm_0#FlAlW@PN^Q64svaq0b&trIn4t|<@mE9;IAc5_AVv$F*8 zuUdVa`0$1^z{lf0EratHL(vj0Lv5E<%&QlGd-U3QMZjv|@&3}l?IC~ij?2p=-sDBx zTv%iH#zAlXtF?H0y}4gL3=Hs+#B6M0+==1?%VQ!hzW5wNYO_b(O7f~~ugFj8G-f~M z!y=r0sW{0agySg_GsEx1yyEF!@y+}Aj!4|GT{NsW)BnTuU!b%jo!_6tJ(HaUZ_C^L zocB}LGq#W<-M$(FL~Z!o!{y^#T(P%&8u54!HgEo-7-5AS(?c8AQ`F7ie-i_*vvnU6 z0WHl|PUS8>CZ;I%Jv~dPGNnZ=r_Ox00%1KjjqwcmBv5>|qLynWT{~%#%sez_l2J{^ zk}oZ8!LNIP;xj?Eyg{t9qVI;^scO49>wUYi^* zTW(^_k(D#P39uaqm+LW0tgT_W zpJ1_J_^%hrG>mVB#1-u+6ihxiyG zYdgyb?@-(T;*I-?5L#D9#&UTUas7ahF^#R8(Y$3SHjPdlp*^NUaT zndHg?mEt+7kXbf&+!UkJ?K8*89nebb=G;;tOpR;ZhJufTOjaRo@X>3#bIQvHUqszM zyEUu5HZiw6bRQB;OHv9wMcdG}F$E-*u$28LQPmB|B+FwuzvC~)HH~of#Lr39=o{a7 zX}wW07uCa8=<)hQ96hWrlLKU_k=>Q5VKK+|CbZG7Y4ed!m}wYTzUYqR4CyXaXTMxa ze)C7uC>*VHh)fcetcH0Y0`BWxBph5|lkT!r^MNCgH8`+(iF= zK737apM}h?$p6*kG~wa%mK#QgV?OC=Jldd&Y2z5M9ZdOX&^td6bV$n~Ysg`*Kr^yQdqW~#j?aiFg zJui~Yw0LV7dqC-qiC=k`B)0bP4jwc^BN!B>{m9vpl{{V7!Y?spn^EzgPQXnzqa|cC z?JKO)v7q;ZuHA2$PHXLlD>z-&)~dIb@)D{vO+BL%fA`spw^B>Lv?ywW*R5buHg=|t zj0GZ+Ojs}T$y>rtJva`4s1$xTeqFyX)1OJF!8<Uo_Hl|g2dXssq4@TVs!zm*;sNKoGZ+^Oz4kXOM zL-ORlTT(a94m1>yJJz&M$w+b)W-G#zAVBjzzjb=D9F6&KW8vy#)RoYL38G3yNf{JS zb^q_nS{?mZ!5gLz;~074^YDjvDBtzm*x}ZD_256 z%#(e2ew3^}=<$!?&>>=M!E=!e7sLeTQZ`<9W$aL_h|>ED`M z>+In%3O^%K^hw~ZH=~Vx;3U%8<CkG1`U959Y!DSM=eZ=*P#F-^Jbfq4b|H9+2 zIzf>6jFnv0@azW!W^!6Ftf82X7HfTDGnb3I`pnkt9@s663B6SgE|$_aJnIpV?QR%r z!2!h(X!Ehn=Pf0rTJKXrwVQ10Ur&}c{;GWl9g01i|1kWGXPW&wkbC|CyVe)S(8*D1 zlt<}qo_EXX<`?TnwIyo}eu+6B#Z1}FSE_bO{!&M%O-ryVer3%D3YoT=1aCGr;w=}E zeQ)W%C#sOYri1Ikc`142X>Sua4Kmzh_F^->F^MIv%UgSTONF}l-e#@EJgBZMHv?qN z3!{>J=^%MVjkMdesZ(nCkRikJgN%me@SHq{yIfRz0a^vOy-`$1Nw_cgW>Vsz1TO%B z$}Y0o?ql90YtHXgH4-N6Y+&!!s}#TM-F7n+gT?4NmfS(k?;E6c4~Z4dF?DS|%%|gq zU6nMFqF}*9IdgI1oj&wn%G+^E8~LI*6t$}%}Uxde< z{kaa4eqA;^^)p^VO^QD?-EC30^J}Q&7ow!VLpXUr^7np-diV15^H}l8l#@Q3raFaqqFGK>A*RGpCuKB zYAUp@VmXt(s*L&!6t&fJ>e?LGP`@@41zYlQHjEn3X8xi}*$&?=-NA_J?`O{~)!MfW z`SDV51t3Xzn7T-NW)Rd2;WL_pD#^TrRgh8XXNDIN<#C{#0Ykr6;O=&G3zu{LU zG@-aQ@D|i!;Gz~9x*y>?_?w*Ug57+bPhhKKpzj@h6pR(H5%DkQ1L^#Z6!HM*Tb%&klZWg6*98=IHV-@X+7x>E9Km{>9QhQ^-Ke$oAiaDWD;Ys zrD!TdDxJ?6q+|BlE>&!Jcgvs}Zi7?h!^lco<3uc!EvxD#BH^XfLqYu!V!Us883oZH z2Lrc%+iv?eC+D3SNM$ zFN_URzB;Kdrt+k`&rp~bgn$v_``5K3uKJgIyMIJKkJo@I@15&^GGS5vfih(=VYsyw6Ve$}KiKe^L$p-FWV( z!nO^EyL;$}v}9mR)mx(Y)uu>yfH4w_1f*)XTO*ulgEq>=NR27mrIj5sR<^D1Jot^! zves3ys)rAy7Y}}Gnq_Ky+$+H77g!%|Dr_nFqRt!plffp%&#Y@+`uGM)R(HbjAeRUX zSU4N!xiKD>hoppYa@q7Y4n*3-*ysio!14%aF^?Kk*3$lc;0X;gn@Z%4YocoFY^3q$ zpo(_8-72b&Osu5cz$`L$SQIqzh$dl>b^Z(g!825D#LHf%YX5VFmPX~)ZYj$bNQ8kf zM#QourmaZqV%=;&K)2yGmjS!~ue5jN*t^%FKVNdTf~fA|fSc1@3PS|9up>8KZb z2*!ry%;9%wT1r=;X?(XoG;qb^l>K56_BWzy;e@)le&cVxi~&mr;{&3BM1>h9?>XNX zQVdErNTRstHuH$3wyS0y1-a{Bjz@n&GFYD|u*71c^Br@_9{lsM7j#~iE@+dLJEzrv z+~!kBTtc@P1M02AC?R>Vy54cl8TKIr%G6FuSS>M0(xu;qP{eiVX0-Pr*1pHkPj;JN zrDGa*UwcWu{WN2RAE|}TS0U`S0;;HZHc^x}pU0uvASlrzIo?ce`tGzLZ*(lTBueVD z<=5U;`bO0!X_9ZDBf3z_3U&@mObX3HYNl#mA%fp#*nZI?$GNxY{_9cX-8{l-E$%xw zNd)mt8ffe_UvzL=2H0}+-SNq-rO}ehP7nI07!mrg>BMP$NRTi&V`9lEc?BaN0+rew zzwXBWmZu_0&-q<)<=u}lhWsPJZ%vdkWJ@4^SvnNZ=v;}2vpdv-*%G~h&v8bUf4|g; zy$a@fy}W3ux!7B@@A%=QBrD^T%Qw-QB{gnF2r?39Evljf;(3@%uOG7@N zjbJO;5FeZ>!%f;MfihN@o$OAqyj8rj^C(@@LY!+T0#5BEWwWXH!@f-f6nsb5;g7fh zodhuT=<1QboKSwg5wUT(c8Nf8`QRRY*|vnlXmiff)0<>UKup<$EyVmX2T?)3A;Bw( zDKC-%W|Xx(#f`kdJ1;XDGYUqFLHd|h(0fq4O^rv-J$_w_KzG4iH{W`Zp$n%-WtP;d zVyYPsdNCxAX-S$70b8%Ld!qt@rRM!jFF#!otC?rlj&NWG>{ zV%4+m&t`XJHXXmk8;z33hom^WI9y;Zf_GZwPo-1cy34Ax^99kEU@}rx%<3vh+?dqWM}>)drfL8g~cXi zYIf7|b_QSMCUbZ5rD%+;xz$~TN5O?t%Z13Aw+7a@+NO$mYTW~^{Jf*dp39)=F5b|6&dFA#=30*cdQ!&5ZIV*`!6*tWZBp{@t~LQw(cl8hA$^@X zBxYe@VJtAltWa#`6Dk27%Js>s|8OseH^_@ai|U3A_2og42@V*MK8)(1DvMFD--23< zLPjr%Pb^WNOfq=U!8(ZcOF-ExwcQ{e=ySp7pY-RcvFvmbbT{n9XvDV@nsWz%N$36l z0eZEozoG2%cVA;W;jOm4>@7*EV2mdE+cugO$RqFGRH!!g!~IRx?Dtc(%NpgRg!@AK zxPc#b`58=zf-(%Bv);3cU5+-aB*3UYXz;JYt5J;?50uS=B+}U1l5E=5AxWMzBgl0?EcL_m;}!c$;3kV9+CSR*q?z^68YXZ^y_da5be zzS_EHQ@sUZ9j~fTXUQ*l&^%u`#o8N)-ILBZX2OZ=3?Y9SKAVTe($GhM z;xy_$M`^C@q>D%#S3C2|&G8kh+<-54CyDpL@f($na&`v=2@I?6$n)r*Gu!NeO-3c1M|gM z=i=78x1j2971F4qx%%E@Q+~F3PWc}NG6~bdER}=!J2yQPm6jR(y69mgY}h|mlD`D! z`x>`Tzq{jw!8~tR4D4bQUwAZZ^-03W$+OJ&slSc-lU zNwUu97UsZH=I+ug_$~YWx+{VDipwm?AG3l@?r=6m(q<%I36TxlQmf$P zmR@3lE1Qz&860b&Far=R5bB;37~W(2T55r)W;Nm9KUbHeT%CteA(RSPVzu+CX~m7b zUIk>$uO{vLK(zF#`_HpzLP^R$oUdVDyYeiOk=sIwe4s2hH?kT&$^rNI*0p)_7!3m2E9)dcY|&$*l3mqj;-tEVC*V$KvFQ)U8P7pob)+7R0hT(;Gc37-?wKK<5z z7)19MF5F6g0@8ye0FMZKI0mxh8FANTet~m7nQ%ANEH< z^oD5)i?Z(|w4e1akyW)YBuDACo`=j-mo_eZg?$nSQSAj|Ds(M@DCT~;dA5#qrtn|O z9y5uIK6Jxf)%D9#h)@P+u~%(XNlp2AboOv5cyz#xs&$>$R42U{w6acSXt3s3hI?E( z57L}$MP<;#xdg{RIzy;}fbw>=cJ`lD&9OlyM!OGhJfYtk^6GPhto=dq&B8n@k~x$- z=WkqAJ%l)@`6I2X7as;rAIR!gSIOJ1d#;g_ZWrl@ok)?*7i#`a-J&kusnkW$1>%>S z+wZK%AZ0uC9I@5*CcaM%a`Ev|_wG?^{jTC!K#hG6s|oc@8V@Ru&#dpbHvFOFW_o9} zn6sSPJS)d_L>>lFph#%$eW{fv5y?U#(W$t0*~(*T8w!fe)O(Te7rM~+%x(){#(LWv zOR_{KcJcWA{q5Yy^_C^#o@Rb6JL`#OnKLv_{LZ#Uw6Dh1I54Aztv7C1N^``#r86NA zWoRb78(^*N2KTzhe}ZRQU>oUkCgUVluts(N@|x^K(lo&$AX0F+ZT~t)3XfEeFeV~e z->d#u7T%bot-=_O$Kwl~$hx3lc2!j2I^SAWNB-ekH(s|Lynl!7Tv&NE`iuKjpPV?v zia}VE76LY}px)43PPcyDWe2bPShQ2`x5eK|v4_Dg+qS7ZM9)!50!PFii6J!$71Ce( zI`AMI#MW1;xgG>=OK~a}kxXn3rmIwrZL16Lv0hhfuu9%&YuT>d&7S()0WW?MYht8<^MiJ7 zGS~>Yg_+^Z->puJnl`|SP9y--B96JuDQ7j@V{6N4<$>~=6{r*Llkg9!AxJr8bA(J8 zNJN8*9sV($X(UH?P5wOqI`25yJKi)DLj`w2a-92Iwd|ju+}AS@W$9^7}&rL6!lpoDM79G8-_D< z{zFnG+`K(b^T2c^m|dZL7hx1zs=srbkG9gNvqY2wZ=3%g0H;7$zx;wFP#_r*hQ?Y= zrOF%u3!YZx>N@<$U#z<(f9h3A8$}|WEhQ-`30Nm`6ciyaNCa=rI<1hhDgv{2%H_!b zl1p*CaI7>|8+8??nx^!(6o8Es>{kF5=_HLST4q!LnFL6KAd)eHNo~Y8=(IK%*wA0c zW7P`oR-mY*dECEJl_Y}lDQi@%XkMYDB~m0v+IRQl<2ab_8@`E6e~L4E53Lncx8(fX zx1YPz2N0T-smX4g1{4w!0UHo~Q6rcnObm6MJOzLZ)(|#1i8$pSaA; z3r!lFPVKBj>JjXD1AXwez7iY&vDGlb>S-wZg6L@K(Maczz%6QhzcNWw^C|VQNE z1AJuJylx7pG~q7Hf9|@LDJUFQp;c&7QXGwOFe7+S8_1K~;hJ`VxTtaxtDU~~^~pA% z!?j8%TZ(atqJrY}OcJ00R+5pl$k?6nsy9R$Tu2`UmC?U`+O%z_E#`vpx<76xaGgap zD{Zxe$O<8}$kWL@kYvOhB3ZQm0F)ehXX>DWOR_8F`XOpEfAz;I)uz{RX{90dTuWs- zlw5FfgpekGF@PWq=h=bmnVXx)OLPu}+2H=Ykgklv^>5xUqv7dL=a$otAZQ3k*ph-4 zh@FbI1pLGo`2m|oPv5}@`J~yv{l8S!skZB=B9^GF)lwx21=T``h$I+-Q|>qKwlW7f zug?kDaP?X-e}4Fzd-nIJUZ_(vt}F2=)ZCPqC{Ej?$Pf$(6BxHcPY(vH`_yT$L0Vhe zyRx>eudG#WrPEco)CQNa(WjJcx3N2orU~wiz>q7r{m@&1qwq#tvscDZR53u87g0j| zRZ#?hr8K0(6etPa4%?03kTyhmZLeu}2ZR3r3EpM2f7ecmyuvHreQ35&78aUts?^m~ z1hm?>));K7)+RSQPC71g8sBKxyim`k*C>^X)8Y{-a#Tp;9`qgvlz6XPVs9@!=c)Dsp~7sD5@!n99w>p6h`Vv2TFE> z2a_|g#lR`Rfsj$ZiX{nd`?lWuLo1=`hE&NWsXA2Nq`(OvKu92iu_9;M1K;L66Dy;CHm+sULYuCBKx8cnHf~dq|*Z>Y7HD z1A(^~cAv~CCt#^RlVJqy?<0(4k~bHcfBD*b90P3pmiM)^hbd_-)(WM*(pG9sJ7+_! zCN+A5!Ge-CZc0d;IuB`txQaijeFqV>wnyliQs$>AZLU|T!lkFnRUWqhKv_=4Vos#) zM|17Y1^RJx2fb+%ZDAullyz6itDPNNjMS;hmjP;|AxBe^ow)qF2!c4{=B7oqe?fdC zInIz1)l}$Im#&FLRpB9R2LV#)07*hf1t-)Ag?BqgVlmNp0hn(-s|#y>N^EKC>3p`> zzB1Vj`H6ihl@tz6f{_9M*cc$5!ZDNCaW>oZTFYIxoSa;=d76L(9Q(VgwN2MA*V|rx*+D{<+VYfY>6fi^N0Ft_Z#2RQMcO2T@V!f{Ia`FNzAim0&N>e{oo^@`<8^65jmCFc@SwC+%mrXcO^PT#v6&oZ9UF2Chw z4I zr-im}pV@ROOtF_O6xCK_S&`;c6)3H@l3UdTfHr}){BIcNz3!0NJT99dVFXaht7eRg zXSLK^Gm8}rvf4v#hL5RQwUD5auS}DqK@mOuwnsaQ8p=tVPRPTae-021)%;bxpn&^K z=uxR|rQO|1q$sF>2ni7p6DCg6fZkf-7GWih!4FYwW|FzYw##AWLVp$35VU|(Izi!S zAQ7~mbH3yr9^PFxgjbK2?BDN(6T zBq9i0jUYz@Q6@Iuc*c14?k;i4(B~Ggv|uHOq(uQ0h)a&LfBMu`qNC_pJd@l>0t{k3 z`?19=g}YAf=wgfQE2iZ8jfPT)edd+3ME+v3cLsh?cGw-TW6C3MResRQ+Pd8B?Y7yZ zeX6xmqeyi63xvU*B$UAsJ^Nso@fDMcT1`E)GL$iCyR&b8;Y~=*D=B$Id{WY&g=|jT z#GVI!_|{~Mf4Bl{`YfU+wS~Y?Q#EaI>T1f0Ta`NXE6{`m6`<@-Jg2xDdrlJR8eGsv z_fQId=)Ts*~&tts6J%}fMaJTP>5Yj>F6C-JPvN-C3q|6Da zqcpz&wo=38I;iQOu2eW9kUb_95)2$NNVc0UyB$xWe+|TfoYFFim8pxsN5mAn-QbwU2f#(Yj5z*unTU;BSRB27T)TYq;kFJw0O`%HC z3~$NUA8|ZJGRr}v4mvKDo+ns6Qyjxw%`+5?rI+2POr}=g(h_xUL<2IZ-+9I^TzyvA zf8H9w&4pa3eM)|$H1g8%OKSj)ASX~MI=hJx_4#8!{G+nxyqY0J@kh)8ndBr>I2}ts zfHV}JR{Mh>4Yns~IK934p%}Xd*4Pvj6%d%^m~3h1;R z2>lg?5((_5p?O+5gXv!9Y)(3BEBgyNJEGog>9PdRd>qP zb1fxX%1a9T79^pqB3Ks~;+%C|Q<_vT~(cUcW)xBwZM27L9!PSa7>!B(6aXY? zBj$I*oX3_290T%6Y?1CQXaxOK=yXwATco#Esb+mj@?f+wT z2s+BPY9Cc4-jPL@k)<^S3DT7+NC`8r;E}lPGmQ*sXttgd193JmR*%!>CAv#3d91jm z+e&G)pn#N}#{h@`M&yGyBKUgXs(W1P6uzRX3qo1A(x^0+)>fgjj6m3g{$eI%Z~nmM z*9As^23EGZ8Z}ka(cNwce{pGg5mMDKNOw}D1f9T92e)YXj9jJLT3R}B+qzk6Y>s_Y z*_$uZG|FDAZN#nR1PYeSN6jFD5=aMa!HEL}rj(LEtaMJ;*Ec+&s#8&NvZj%z!)3K0 z4W+afk`y-zOzsSTI3y0hMjFkr&AXewL{4otvRze5e3onOwXLome@St-Qj`U`5x9~> zKrlJ>#(^!^V61%>XOUo@>5IaStTewND=jNhR``-WDwt zF0ku$3#dq}QUHBzY)ZW_s3roxC^NC{aJRR0j*6pw4^%_-t~khLcDj0Isv9Dqlq5Oi zsYiYi0#vCa#K*|se^}Z#xRN+VWUNw>vDCS1a-PXb-MP}rG(6jjN?RcA0((Z|Z`Tli z<^uC#)xJ@)*%gF_i7!{?b<*1HX{dP!OUO^05EP}7l_emJAaY0~9po9t*HF`f=TJD} z_*vpR<)AG804m>Rs<~6CO{v1#875h$bgcXav2PBxEH(l&wHji=`rp|C#4 zpnzEvO_aYVe^=dWA62rYx0)uhQsYgf8qfl?fRh9#(n*x_`;A(tn8pXTxJ`&T*dYiU zr*gg8hE#&`-3^i()vY?eDFzI4B+tvfD#&OZ7I(B4+S#;Jns*aLq&ULTl%O{%Z=Jo! zjysMpCDwD*FC*TzH7a7^=B?(_4J|JQw1S{WAw+gRe?CvPFK8^KGBTv4Zh+G|USOc4 znuQ4kT6y%4H~Jpa7y@1hqv(hLT2}U*NCvu@DBVX&0+K_aUF4nr0EkA=cg4KlvQU6| zLDjlhq(wxjOQw1>yg>93=^;aq4%_>XaMsZ^-3<^gvfMb`bu%ngs3f&Ie6RqGJP&Q7 zx%yyDe}ZWp0s`17-(1^_w^XpFg3z|mf`D|HnC~!l1W(A~y`XNmRqT_>A;uc}rB1T* zi&DSBb;lq8OsH=pa7g_@?}4{(r7#+>{K~U-$Fp=e}8;3o3Ljpjt{ECRF$ej#mj?138g`0 zE*&m|$v)uD(YNezMa`f9>+n?D1mz7?b=O?mm5exrExdj`AQ@Xdx#X86eK+*vsN=YOU8;$Xe z?+$e|)qPh^D2rKSSwBT_yJU6?Nz50Ef)MAPviFcDSWp8*je(uy2%bCPEqVN*bbNt9 z&M7t0!DXywf{yJ>x`r7;p9@fwkffzbe-e^*0Fnn{c7X#0xxf-IRXPaV2H{}=oANGQ zUQlt&tCUz_<|q-M!N!nm- zBmzO^a2O{X6iy&ys58}VJ*tX{+nrgep>+sLNTwRgfRd@*MgZUwxZF;|2Mc#N*C8f( zLmCM-3Q?6PtTmR3YW2~rDK+Gwf6Af)%)uomzUdnfIp>T%XSt3d`gBQ+(H4SuzNp;g zm8~~AW-n9^rK*}|QiZZ=ibIXa1Zn;$_lc3t6BeMd+C_u}be|F_lp_ZIO zN_9ykLVt(@tf&Lb57!J2jIxL}uX~#OQmS39tF~3TfT#S1-t&|_L@CGxKq*_LDFkw2 zHzs({#_t2V;p$aus4jn2EAV3=)U=tey z7&wbw&7|?i#Y4Cq-O*y@Q&_fdA9*~Ik4j$-&y;r}XOR#-d~b@_e;bNNyqX}a+}^&_ zii&o_FPe`p$Z6LSfEBjA9^3;PNyKi!SA}jR*IcFaRkwy~-=;;SnyRAVO+p!Xg{6PR zuVKEE5GF{&UdZ+WO%J{h`(2fqh5A|yw^dS$p+!4-l2)@1AqtQHRC+)slLxd$G1bZi zWod}EIL>>ebT^w~e`$(?m2Eb_A=2sAxhVroBxw=|{S}9nJRXWRc7fKCRIzk71){dO zw^*novcg;P*2bOmh~z-;vEPhnbJ?(MZ4u8~Sft)$JB@?zq*dP5-QL^f)&#AZS5o2} z2mqr>goSf5K>&$^9k95hF}}wo797A23JY}$R`wniRFZ{Cf0D-pEBK034&9Hm?hiO8 z$YdjTDz*lLwLx!2UU}s)PUuIR;);<>fvpaI7tp~`jt=}_q;$=0DigQ>a7m8QjE7Li9EvMI1S4#go1*TI8{HacSVclpPWqh-Tbh-n zLrB~vV9#mXe_&*EWusxU*9okF?tio>d-+#e9!ATzMYe7?JBofCwXnAqm>?^0F|pjH z2-<$Q&F09<0<)FYi%l66Nua5jqMIt%FZC35%X^Nt+XkAsYH={N>*SsR*l)O=!ZE3y zbdluI*tXj)2O9l<3aY$t33Sooyc zat~FPaC2;Z`_$H|x(6tJG*b;pB!pACN=}&FD(AV_oz4bG-@dI|9a*fW)(rJ(r?$Cj zYMu3|TGGnZvVsbKDuD)f+BVzv!lZ%iHo6dM+Q`c&q!;!oYTRjdTGr{%#WAHzzFBax zc+^mKe*o+?4kwN=swqQ3+%NCC$t(QF3Oou-DQ(qlrj-@1pe3cDC7&S)DH?w=6rGeO zPU`MB-Y_OsW|oFV4POfd3aU!&m6d8Nr$eZUR?BGtY64*Fs0c71i0wGG2DFDapQ?C_ za8x4Q^+QE zgYGxlah$|mk=1K!s4QRZ4=>Sbrdo8hsZXihNGb=29BsUEPS^m-=PK;vD5lV)HFvnD ze^o^?QiV9?z_>(A0s$M$5yx%tBXK)NRXv_hDxIDv=~ZZ5ZJylv)lBA^R@n*xF0V|u zBiJOW2HZ?zqYIAU9B@_{gJ|vOkzX&_mBwjk>TWI9Gfv`_R`!J-H9+YQq=jhZMhFuV zzAQxz%RG|0h1d&9r*5{azMH+qf0k&KD166Y6Y=-^mbqT@ai=L&GU{q5lqJQo6iq{welV49%q>46{*#JNRLL+I}P-oqIqS`j|WOl;f-p2O|-7s*XGxSUE z6je#Kr8Ed>w%VCxX&OquG-~1}fT0_~!y|il=abbb?k;5vCHDKORF@s1e@~RcTT6hT z>Mf|rDN1{dxCS8ij5EJe`tg{Qk`o`H2zchrer}QdF{-I9frCgd2T&aZan?&+U1_w zmW!wHD9g%;JcL0-I<-FwtOYsg_R*intG~mq>|pH0#9Y~k_q_(!NKim%T~t77{Cbh z{{WOF+Tz=_6*Q|-8S~j~x?igcKiVNFXH}WyJja^y z((+^_(L0shn|OZY%7sdjm;BndGy+v6P0SKI zK!Y;_W3fge)IOSUF^|;&W8!HfWe1lpsk>Y%>FTRiRELsVrdoS^L`Mg0@qwDguvCq* z56phcLm)5wrhy0wWM;d4Ybt)tSi;0J=1N>b(vtyF2q6A#&d^7EGDm6N(@qDkWCgEb z8-eV;z1k}(vlzS5(LHe~q}S&#*>SX~GLiy!0DylfI|CzpNM&!~_7Vnqt1ySjZ5C;1 zazLbYbhN4_f1OEFoHTtyF>UzzfaJXEq{2m^V>xOD>!k+wVb{>Wx)UgG9r#~suzf8}~)<+oLOO5YE9=-Z?uc`k&B z1|}4h>IEdofs5Z#dpNJr32Q_p$LNWo>DF1Qvo~2yeR|nchZ0hSfZ--5&C?r_3DhP( zUKaV}-a!^V{{TfJ(?aHM-AC^$G?pHnTJuA7l{tc_Q2URANUX57Rg?u4I`9=l=jG zCYCq3uZ(~~lQY<^*V+nJ-hH=CQj%)iqEQJge*?Gz2MW`$B#9BWBvZ0C5(gY#b#g{! z6?~*u@9Yj&Y_M*(CmTV~rk+YXr&I)uK9WK}Gpa!+Xp@3t^%{eKFVSF~`dA0%IQf5M zO|AQ5ZvE=ZF3>)f#W8t+qQ5FalAsiKGdr01Ml(In9?3V?;-g;Q%mraIxL&Uh*z0U5 ze`UJ00EIaHLxWP$8g-O~yf+7Q;1v9Op(G1wEf{{W^a zH){YR)j8A3_wFYvN+#(%$Cks%L4w^tfBpvs+aBo?C%kVv;)|TxD4OssK*+48qxdVU zt~QWU<~YzLI)?jd*?VpXk9O@)UeXeI0Pk^1qBe$agrNz6190+Q?s(@{>{N@{|Y<)z|{X;7FOM1!{5&htBB_b{9qAypR> zd9`1ucH*ZUvsxQk%ZUqpha2>Se+bnICtoC-Q=ojkfN6_~!v8!hOgYf{dZ6MI}n9D=F6lO4P4Nag)UQW@HKWKhZM+TVVeH zboP)6mhj`nO)%|MGw70ZA!p1ffF()b%%5=s>xzxQGpI!*me4IhPEd-Ef59!bpn{b) z=m_)BM&ys-P!a*)_rUYd{3NuCQKqHaeG*${prL7Os+^sWh*uyE1PCB)JWd?ibFDe1 zo9csWFjac(ueKXnDzvLw!hrt(+>#*75NBxOFjDEp91Yl63(n#Q>Yi0l)Lf`XlKdG6CH0yc4*Xf5rw7$I;-e09$=fbv4zkwBs(Nq#^b}Z0H9<#A-9n`wht4 znfJrQEF=-ot0wQVfp;o9siaAza-&mXunp=Xb5Ds zx~fWoR^oQj6cxcd6R{KDoD*dS1L_b}-?>EXSW5o$sHv-$QkL7K3rSd3@UX7(Hj^iA zaYSFTE4`(;#_ZZXd6t3pkQ{Al1qaPxf0;Z2fA;K7{DaOim|PrDi3KK>hwXNnP*+eY zLubqhb-gW=Poyh-f6m-(CON`fBzv$aJ}s@Q%C^;;YxHKZs)ZmqOrG`1U35g!yIS2NH0~s7T_|p~MW8ge(p8`d{O5iE<4=4g z^j&_q_Y`g=jUOeNN_T2qeyycwFH*z0mJppYq?55AfB}dTJK~)Ev^x~Gjpa<*9I?|e zK~S|e+Nu_(e_m5#NKtP}PJsl$1Vr$C%;Nt5^9_Xdx65d0I43_Ow=Y++YN>AwRIQNn zDrh`eh3g6cl@Yiu(vW-e0 zNbDf;K_Ee#XVQmJ^ftF@9L9mi75b{x5n|c>*6Bu&e}^cP%~JjyV9dc1M1uw(52 zNIS@pf3c7Z?}doLeg&dy%R*6PyV6$Nko!(j!wK@k>2R~=Pbty{<9U)fpJ>LpA|g7@ zdL=P|?gUaL$15qCO-74*=yl zl7e1JQ|7n25_V8Z`vU|KI};?>M}OKs@(M zk59fs*&leyR_eA@QYh;!wKV!dkkI@xl@La>tQayz>D(EP*apqC)q)S-MA>wVAey81 zf6A}l=tZ)fboXYTQd?<3Ygegc`gExi0Dx3CDKKPnhcVXgXBJi|S|jJ88}AogqHcwS zmy1dGg0ahy#{U4h*iQol;q4NA$zExDKLW+J5@}>=?P1eY9Sz~C=yBR41y<^ zj9%cuO(b_ot;Z@i3K~Ywz7U$PFgE~~e?8N`CJ8b(5x2~n?G6RfDzBQ~KzS)bT1W_9 zm;|R+w4VO}!^rQ5O(Cn{9-3Cxv@MrQn|>fG(gE-E*pK@RB)F8o&Z=5^#_DD2r&^S# zh*}i{0|1|#!TtH$33FUHR^6o;MeugY=kG1kFp9dmaMfu_eL=91vPS_^yz)Q?f8~fC z^1#b94ikZETwDOMGO=x9mYpV|l39JUkd!?60F$)N`x0kh2sjxW^MjD1Ksn&7y5-41 zsym~IrKm!bL3JRiMCyp-M)Ed++G7AV(Q`5pSgJg%R9fxKA>`JiwAD+>QE&wUr3fG+ zk_7R*M{E$4?jpGe9LABHTHcC|e~rbV@l@-LIE3j^oRuaFC~fW!VYGJR6z9BhGJ&mV zI4WUou%hJE!q$fn?K_&EC{Q8gkVpWiY&}uG`eM$eLd~wKD@NwFtB`|grAW9SG@UOk z3G&-<8iTNQ^>9cMB1h;>EP&|!62KSDEw1+CTB>TReE?dNRw`1$09b+me^4?YZ!srs z2RI0x8DYoVmn?h`ge_6L@oM8v2y;?gI?m|>-}aAVKTI^djJKjtt_WXI)+T`uhnrap z5`f%nKt7Wk4rVu)ByEU6c?w+x8x^dkk(JWbQ>h0~)P!vWkaZ3Y;v|iX;M~(@!mMo> z!j`nM(`ZW8r;zM~Ez<#ze+T3P+mrGiYge^V!p03Ep_Zg5U> zPaL1300=(hbt`76uZ>~%Qd@N^Y&zm}tuZ9;+;Qz3?}e99rF`W^8)@e%ZjDi?3w=s+ z%GV%*M$kE!_Ye*&5&##%qSl)umGfq%-pZ?11xpJ=rA!!tV^N5bM;|^8=Muw>a8Tu< z&O(Nj`bs*KJ@HFXe_DK?AnF2S%XJ!{JOUNV~j23fxgmoQA%BHAHwN$4(5YOE0=g-OfnoHN(l_sr~R5X&3hfC^DsRPzyxA6M6f7|80Cg9ISp^V;h!utJC z-I|T6+x$>S`ZbUb^ahDR1G(w3$oF4%PhX*sBM%Kp`bNs8xTK3>|lew z7}pR!PbIpXMT9U0x z-9jU6qE7gGpGL^B>Xaj~&3nJP$gHTTYfa&je+=q!snAlQQlg(ZK`;Q*1fBptEKz9x z08h*IR0%(u@6`pGE1039p|7c}O+^(#W}H)0X><~F%1Hp}gA%R#VcKZRoZtl!++kF% z4FH^j!rs>XTHGztht~6HQ8dYGUz*;d>Ga4@)7%pre6TXK0cVfhMm5fL4t{B^b*{1H zeo&{MG6GLksE+} zn8x@+Ug8U=`lL!6#^7JMPOHP#_K?@c`Bex)i*3D9bRk4QMxZwwM8W!*!u+kyII-xh z#I}j$Fkz}i(^OK|2T<>pR^ry^1-*e9QzOhw_6m?W-w1FZf;dlL1Y{_xAETnIe`S=s zg`w1>H0#PR@%BmHAaXtaxUk1K9^ng!1R-x`ih;K-*1K|1P!b$*+AxHz5J+5tJEWb! zB#D^V;jsrl*>kb#mf!`JkCJg^%ye%$il&uR^94$6_YEF|1QYyDlehrPjmOJjj8o~{ z+XkP6Cg(LcLNEw*BJ|I9LA82 zr_J>=CHlHILL~vWHKWuPl%G;bouou=0pHsP<+as(qdKjF1yt)BX0DC2vvN%%&cSoa zVJA{mFidV$I*y~sCUK-VwB%S^saze`ltQgYrub^>Lk|a#q7|iDl!nv@e+Nv7Ng!{? z+p)rorPdw78lVW}PP;SJZhT^CSWAyGuR4uINJ7=5$r@9%gS?Ty?|>7Anm0qLFb8E{ z%M_OiG}D@!ql-$a7Sie7T!bjLnIOpoLZ(a}AZ?C}#f}Hr9`rFW%&ex&Tq_q?lo1TB zoTV;2r2?f99ivd5Oc;z}e|T=+P_B)q_Uo-JEwv2aSwi1oNmyGODWwF&0le&@V}m1{ zWGyav*}+<)m^4vMZ5hiiW!p1#)?A#^^=^WPDk>aG$x%`7$vS%o;9`h-pS8~6YG$q` zGTPfE7o96@`KK-;HdxqgRR~)sbt$OODb*gOK`=~hus@nT@KKjBf7?mIWbck>cekH^ z2@Rc!CygVOwJx;E)KW`H(K~98p(z{pJ3_d{nJLt=L`L8pfUFsY^FeB=_^O(Bl(A2y znSM)QO*TZy2{1tQ5Kaw_u|aN=P{?pp6}jqx<+E2oaCvPu+E&_>c$1|`6Sp1qj01y) zDFN0+g5D98sG@S#f97Md)2SX{BBd2IfoOP;p(H36J9eLz#{$Qf5Ym|E0~vc&ZMyK~ zvajzts%`a1V8|FDx*SGK>{0UM&oze@JCWQz=R=28rkB0_8Xu(R8tGNUiQ6DpgZf3v^DRbo9 zBs*x?R;wX;<#uSIqMf8r0N=s22`MuNQ5-5kFlTZ*V<|gZ?^|O#&0h-_-k;Q_v{YJY znW_kFXhW;ee}$pPAQdDP%)puEc-Y{XFsgE6;2_{y9-F64Td3C7VReV89brn@#Vjvk zco8RJc93`2V!Zv%w&0*{lr$arO6sl|TP+%EYZZxohTRWSDYPfdWgnGeos$~(AyX{5JG)9$%cLvZShf0P25kYt_AgR#Q|fJINvdMuia zGoLXmz^|%*OGB5@K*Fvz6b47OIQmHBHh#txar|y{#bxCKQR~ zCx|AaH*{Wla-qG*Ih=%S}N2Bn6EBMwHDR6 zDjkSAc^e+_i5&w-%QrUd0$aLK)+J0N`Higk+L{4jsgoZ2lkc~-9(Fiq?4bkN!L)Tn ze_ef3qQ0uMI?58F?J^zEv^JtYGJul+a5whF8f$1^rbD1DXBm=a>j&~RsWps32EO392lwWwizRD-*8by0et(T6b0$g0jJWJ8h?RZYN{)!li(mjz@KDkhk20P13bhj_P;Hc`g!`)=q?O2qf|h9{k{oe;NQw zFLRu4n?*N#tGBSwx7VtkskNUrp#=GEp`G%RzCmVEq$X=f^}EKdRd? zDvq|f%F3!R()^R=zo3PP;Xzyty~po@h`p_#ZAoO_cOJ-knwKeBVyU-kooQtuhQ@?$ zKh4?*kRzV(aT?vuJSthJLrkuYf0%@>o%a_$XoIRo-y4y4GF2?9j>k%A6zZgN77cLM7xG`ELusr#ymod~1?RFMR! zazcnyd+-LtbIt|d<%@C2L?m;D(ZXLxM@v;)Yv@a`mcwWYsDz*-?m|`Hf9gRa40D_r zw4gP*!Xdiail!2~ZUS|)vRqYSILvW5!`QxV=?U~1SGp_xX3DDSxIgo6%4p( z(1m$xQcsw+!1Xr*Cvpfr#BG5MdyY9z1+8uNUs)ZcZmd?)vgl%=$Ze+xLXw4UL6ZtI zCU)dvQ$UwplM+ghL?~vfRTHJHXPPQ9T=20V3LX$ESAdn&me+F@;Ar%d$o>c&E zg}tV+F4|At2?@}%=DhF=NKr8W>_7u)k?+0&RvrG%eH3XMa;2=JZr@NV=;Wc++t83p zfUL++Nr@r=GI))#QJ*u}cOgOmHaJGLduFnQ#;ToZE-647WhYdoM0#hKk^$TwY$?zd zyBsUsK|@#{v{w0ae}PpL^=S)jUzh@u>PeZ1*n{q3aT&GkJFr3_gN)kNrnI38U40Ej z6NaHb4)W>XsY75CV|g+?_#5ql5rTb^4l<*iLn!jyC3|5Nr46ZQ_0ucX2@(Wx27SG| z&NKT=ce0ECLRoU9RWnY8ol`Cub>E1pNDh*CI|2^Cf=0t*e>~$%ZYGHqKSU3Y2A0%x zHxX}TOx#;7uu~t2J1By8Aeiq0M8_LqIqckho>9grsCxPuqU*?^ZMNKY3pyT3P_k9( zBd}2`uNo_AcAB-!i(v^{nDV* zYEOrLg?ibpe?t{2WER?~N>UwyK?Lo#$})bN9q~7B>0H=c8xyB+f1$icB5=Ur(BS^5fDkMse{|Sw z_u7|``|lSNmkLthDNm{t6sVGC-XLxA$3fD}_?jpRS=|!@$;nP`Or@F<*|mH^90$u= zEU4*BjnxX1zR*Afj$;^OvizDT=v5^QT$s90u9}+a@{sFDSDK`0Bhpd2M``{U`EQLo zT@$j@f34Ok`B}43+tF3!)zLKS*%4Iha^Uvg&|L=MFy!QDAbZf%C{q9=>Q1tfq2a(HNc&~Am6TjrnRc~ zf6%1LLn%W~DYT_gx!=Ei$PjiouPimCqu!AtoaqCKG0V}oQ0T9>2O2AcRX%jMV{ykj zh})RLJfO$jpsRuU5DVk9ofobSXq_2vOt>hU0nXe|#hY4N`G=tdteWE~d_^7J||rC~+7YOspRie<8eH|ups8jw>E6+4j-WPYOx*zN&Mbi{*h}4i{ zR*fo>nB4EYV=n&yYVQLJNM_c6e_L1S%JJ8Tj}vsB8mxUO$Q>N;_tBRq>bfhIu9s@O z$wvu|v=#v)jLUNLk3;5b+!0r>lAQtlbE_ zbiTosdUCAM{{WYHCZ?K!!BERq_OvvoX%y29)EC!O0$9?J=t_MsqhXtzf9n-O)feq( zqjqUla|cSi9CZ)E{(b8|LhPMLuwJq~(#Xl9&DpBoa;L9qz1oJ=q*KsSDYYZX26ZSM zQ62C*8tBW1N>{nT;iszX`D4Ief`+aAG8x%f%?xJjnPI!;e9FGHWqVsTw<}m}%9SGD zS4L`9(?v>BKq@K&NKqi1e>6bcUs~!C%+Aep^ec>XTf-lRuMl@k)6pD{)k^DMP;K|> zmok0Y^;X)fSNlT+Wza)Rd9?KjWd@)xTHA3cQbJH*m9jR-OF_zGAt7pR@#%>5* zwT6ReTGXTfxt%gLiIT)4Xz%b>9EI*Zm76^HK=60c4ENW{yz5=mJJwj~W#+*_mgp?` zf`XR5yYB$+nB(;he^9#F&|BCcq{vr0Z*GOGF20rZLM3y9Yptpuir)_18|l|aEFDql zK1a@Wue>kr&{aEq>Ly>zG)^Q_q2whFTM*NXz9mIXxZDJk9a41QWRGh@zi@v>Is ze|3D%e`Z~_&EtuVk7bO}Nasx#obA*O*VpwL#Eam!I<^Huf5Qc7U!D@TG$-NYkeEW| z37s>9yLx-V0jOz@cVBT;{{ReK1MpweZxpp&7J9R8>Q}{8XS6byxi zi_E=mbxyoXOVqTj2_b2O4JJjAvC?ce$|uO?$Gk2P)%xy-*XC9p=oVPbcAGe%N@{7d zh5DM|QmUP6f7Ge>tw1E; zoe5-R+>B8|*@L7F>zfHqOYp7XM%&>303>*W>K$}XzSl$ z38$s5qjsXDN@=91hRVrYfIUf0C`8{VIR2qol=+3D^edNGdPC7%@6b-Nb*nC~GTYaa z@0J#Fe`T`1=T7-mEpMwXJTl9g&u9I0I5NX?b%0aqLM z-=QIM{F{`o`Tqbn+Oj58q7^qw-N}jzZ91Mqe_`5(oJ(z^QpieWN&-|s6C{CvXf7ZG zM23qiyLdgxxnjuw0Ej%V)f|;)x!f#$627%>7b+%dzV5lTaG-2d)2U%Ww~{>6rPM-z zT7WR4EMqTlJpxab~8EnWxwFtg(ytvw0PeOk=6jGNQ!pI3FU z=2qHfqM^4C?Fw5}Q)y@lhSHj+3eeDPO3(^QeE3dFG2h>_)5Y1Vu_|1Ox>M>5wkJ z1KiU4yZ8I+`}Xs|%(M6VuC;cYwe~(|_CDEpKdGcdDfhi90|^Y*WK8skQko<6##qyF z^%{&bq#z^@`K6WB(maIowfUvS)^j-^mUV==Xe_Lgp*8r&TR+`1P88|O-s#sYii2i( zRa}0gD6BKcI@K5gJNNj<4$$Y)qCDsFjVe9DGnk`z!+ux|S;jX+*UNM$? zUmns?!|56Jp=NI;bMLHc%WO^8 zL`Ke9#aD0Gj7=5i32xrEG=t~#;)|ipBZ=$s@)LEop}{hh#hb{(!d;e0iUr539|InU zk#8C?cPw6}=^W_KW{@{p`5i$;+#GAwEKeCUT8C=IwI%wk%L5#{BFymhG$gqcSjfnx z*H?$ZjvOBQ2O8dCyS$3??|VmD!+@y~-YmHhrK${UZ?!m((7Oc;*8h=`A?~6|I(}Xe*ioMn#I6hRZ#ox5*b{He)D?$@9=Jsy&fMzoV4tJ@GXMW88}=`@{2%D_7@f;r{#g2iEl~QyVFX*17gLwk0C0L?;hh?dc&y}n zBp5Y;JPI+A5LP4(v2Md^jfre4<$hW;^USGY^3OxtR$W18dWu<}`w?f%OIHGdPu+ZZ zgFH;8e5GB@Iq`QYhk2Mc-}bEts&f?iJ}wIV{;sdtA^Dtt8KYE$a#ZAgQf=i3?UL>4 zY<=pYNF4*Kfub~xa+YbqhoeqqLi?z7AxT)#SieBN!}kZtm)N4B?p^r-__o{QTPaKT zm$vqYnr2DTd1m>&W|L1Diqv;8brG27GTj6^NarC0q-1(cKkD?0>x~k!#I>Dw)|6DLSfGn&NV~l zdEG*-rXGGG4ZUn98iTPV>{}=wO9_S#KvEj{=g{$UA>mX)hc|u3X$nh$D#$BTk9&d) z!^TCPvdS@rJ6q|eR{1rm%EtIg$&$QCv~ zb+4eYQH#&G8yTCJ#wDzH=fejtp~amlW2SS8WALuSu-MCEmz|LLNoxJ(!lc^|lP5pB z4)UWUAM|OMDBdbTq9qK4)IBx51H*`s>wY^z{y{^y5Z4BV7BCry(T;tN?2X@-$=V-y zr#WDZqt;4O5xy7p{sg{SZd=t9Tyn{vk-Vo=Gm>0L&o)AkGU6#zEIT2WkgNpX>krwu z>~FUG`nqAGVMqDfT5v}kP{0^mMcHz)ZeKq?B3~+4IJsfhFOvX<6(`Rz?hB$fT{Ny!$pb% zrD)^99TtBLRulW$2wSSXQrMhkwBi$W{n4Dp+>&jyL|IZ|Z_7lvC!zV}_i+5ly}@T< zCC%C2VH>@@vj!gt1rTL!mg@z2$SL8$aHu-OCpK3Jl9C9gVfBFw^womdqwXr(hix4~ z_q;wIcbq@)vcs{m*nOU`IpLT;%Zp~Ddk8Dh;_vUD@Z}e&dB;x|1=D;EDX1%8>8rD2 z&3Z#Xn?%`>w=e5@Ch9Nm-cl;u@^X%<{Zky~C4-165OZ4He?s*3jKZgvYC=m&>vG3N za<%RD=IKwi!tPQlfF8X?w$~mx&)St44XpE?SXW*V_I5ktC~Nk7Z&ad<;IRx$w=54+ zhCq4?*#;DQ!x$n$VNVU9Y9Qc9B0jhH7eo3yy2ZeYZB8zd2MYqu zt1ZPMAj<}h^>$8BC6S0!7p`2DDL8{VuF%&L`L6w4jON)l^5aToroc#+J#IM@^ryPW zxj?GOJG+0XnaHl&nm_Kj;ngx5!SULW4A?l{NR-R+GtGemRygD}zC_8RvYkje_h~QO zF_A7yNBn#=m@Coy`;O0iLqR=mwm1FG(tJa4{~D88hD^~+VB=z+NZL$5P3EiJ2Cpv$ zmNJj4^D9p4hzPe5qEkrI-n@@?Ije1alDW<4Qxxj-tOMsB);Y_*LNhcr$z7-S(RiD{ zmj>Upds+o9{4lt+Eq-%^G@Hj#CW9R{fzl4wD&MJhUNi7ccj97g(J@@kV#|~A1-xz< z6`4Wejh9ZnVq`xx?z)ssvhHChzc}__XHKqOkJYFtj0Bb5N-pu$l4n&BuA*HFUgsm= z=sQHHibyAKWa2lhWVIi={reC-aSxxgF4r6|$Tlymf2GsUr~!`< zO)C5_Cx^QEUO3JVJ9c8;(>zvUxUD;@mDQ-@U7TU%p+TUDaPX+EvTcrI)SP1~bn4MM z-{v!ioORg#x*k;a4G}3hSh6G;>mp*OqVq2O<;scV&@p1&p`+x;vEp^6$Jdv&=uz9+ znhr%i&1GifzcM2h_8MFuOsGE$tim8sYT)ju7C0rib{rboZ7;X8L07jHlT)a>u}5&vUbxv<-^3qy5v>k6Z+4j3AbjWc6cZohPMY@V0nuPXl$Iq*Q|)6{E* zX%SfJ%deDn)nSYuXO-EYo(WiAY9spmhrXoZtPKe~r8XOgbCXs@QhQ$M;=EW+#2K~K zI1rFLjSwTVyrX6C7 z<m5!wjm9o?@m1X&Ud4%`ui*l9VGt@cwtCmZ(~+sfwCR>Ixd}2;u;G zrEM-Q$t@fR1tCKv2d-$SHlD6;lEZ4H7fh~{*F&vekhOlTY-4?-KKcU>yjYFlHML4G zzeH+KG=V5r%}&Ytw-*P=N08&3busPUiGd*d_UYN$sl+`8_XhS##|pmANv-uDwvuA~ zc}4wXuk8(VoY#F5;jtJwm-sKt-J+YbHO~v24xGfrtp_~u+VyQC1ST}cO;%YdH(-3T ziWLw$>(E>fA3-s(l)*^0)@_ifXwNX^iOf=c=SIbVchh={K(xp6FJ0DU#kDh!8fGrV znWonatx}Uw`6gd%@}x*t>g_q{9SuT$ehsC{6Lk-}HSA;2tj-Z4Q4ZC^8d?gTG;rQZOWwC~>qHgq={mZbj zS#FV$w523eD#J3gB3Odnc1|!ucsex;lPOywah8vrI;f{qTHU*P{W)dUteMf}sIIDQ zL!GpfplH5*xl5W=Qek~a+$hA7g&d@1Y8IZS2HN}~9%hBv%Ordt-lwcP83?P;U5**d zWOECt`ttL6(=@nOr`a>IqS!^b)FB}c|CUYL5P@tw5{f-uI*p59QXeNvP>v1;rma}D z2Tw?mM<#jEM}F8;)M@>iE&E5p%4~kDG2-VEDFdA%nB&M++){Gk_N{DtpH13pDq@c7 z*3)&;J>csHS*6j+bT`6Fw8vdxUd2OHGEqRav6PPU08f-oU!xVkCk+Cuc z>>yEUT5zgJ)n(VPm@(R#SgH@|K}ajQ^c}8ssu(#pev`_6Y%8zP%LP`o*L(u6%g3*fK9k-@^6I7Iq;vf$a96>tN0B#^Q>_N~vG1%;p8mM1VQ8T(nhlFqSTGzJ&WxWU znPG76$81wE>x1WhFwe%v0Y+mnD=xiHiam7QFZ!Hf=g``kW#dC98mILQatf&n2pL$0 zaD&K^o*6I9wsDMstv$C|*{}ndPWPif>JM;uFxH)J3dZ;uKG)H+<5!M0cYh1oD6Y$X=8h*1+^|nEhJj2jOtWY|+RnEhUPRnGCXYep6 zblEp0yKNLEjIcH?E^*0QNT)&E)pS_psCXJ$aO?YH!l}i_{F6h>Kg^v;M#u75{Iw67 z!`qwZ6#{GP9knVnCr67}X3*~cuylk}D*1~iYr#coNQ!lKxj@AH1R=2MOQOJgv}{M> zeF|f-bq93iTAuxmK5f+(knE3VHHop~%CdvP?gh;-joJIwN+r2G@<|1zCTxq9vtp;T z7D};)2L|p*l^3c%v=@MVmm{rx5D$-i*~H545?z<(Xp%Dcd&D3HT2m*|gnoM2X{|&? zC`%`K`c(z*FNtJ4_irB(w5<#%F1OxH^$iczg5>2*=@nVlv@t-b2_)zjW<}#1N3T3K zO!IG{FFJQudt!~8zx}P#VOg1(cir zFP0edN3)gl%y07kz7mK1b1D9Ru>AeUGXFoyhW$UT{zrZB7D5EQ-5S2=e@Nx!5ZCjT z2Y!Dty&``GmwXC479osCOcs#GQo9Amr;i6=P=xcEGAQDwwkYsrt6k)XF+%Px=}q@! zj5|rkoT%zSw%Z3$K8!qs)QS+cD;zLy@6Dh;@yl#16jZol4xth&@!$ULRC*y@)G+f? zMXR54WM(Ty*Pp3VjJ(7EI+iRVx~hTaj0t13BYT=}I4m;>7^|5MU zGu}KTCT((fw24Fa!K2$2PN(kuR=aa1SoU*+t%aLsS)3f9(`;gZ`V?Z5a{aw&ACVqo zVo!<#pNGINP>}UBGnIpT3@R!E4v`peNDwIDRZ!$HVsn~BwX@q|PJt;IPx9RF;0dg& zO46w~^Fi;F=DdtKT$@O{{xob%TcnXJL&HR#D?a%t2!!XVK)T{D6)apkkP*D#{K7qZ zlY0H7JjWD*`*Y2fZdJ2Ye@RvAm#tcUT+!utY5Rh_Tp9?ib|E*NdZOt=`)%{cHLbwZ zI8%o-%-EuUyr%R@+~_zRf8PCE;=CyioxKYHHeVDFX!ZV_}Y73H9g- zO5q=52ysF+6;5GTlOvz%?{_!Iin!RWny57UjIIY1^-J#5V#;JySBk=g6v~6^AW%JS zH0XWV&x{`r1%hw!z4~y`oh%*!tNR7&{u*u=rkl|0m&_x*-ego(g|M5Qp45RIcm&w3 z!NvAQwUSFEfV~MoEO_&}m|!ulD@q$sEJlBRcg21t`_y|p{J{C+$HMi! z*UEGUw_Lt0eEF%lBsPr2s$Y=k^NvTCD`}Q6o=4}YFWct&X7lco)K(?SPlQw1^zN76 z{rUv-qXQq+X-}==G*35tS{Sc~4V7abhcT*GR6NZhz(mzcefK6SDjkLF?eMss@BHDp zck(VIae8&qq?OlQlmGKnrHr}GOlI&Fx#ABjsNp$V8u)1;u6ZE0Q|c!|sf0J52W#Of zJLQL62Y#Ji+CRk~i9YbQ_%WXNJ#}+zA6Ju(syFj>f4DCx4+Sp^th72uW^c-H_euKK;_J)>TK6KAQgK{4@}tjVCe z*AXN|sZEQtMO>-Pfm=T+4c3r&A*5SUcMFSJ=}otL*q2-jaLi}rR%O`2!`+C5uepM8 zc$DTl2g6?WB#X7_=_%=y3*m)BGm*}C-069qtny-)8i7 zZ8$dmAtt{HQ`%c9`T)@>-m@~SI0g>tq$h~5v$K8N#j5VgzoxGB5q6xSPK@l}wv`xA zf63lVGH+G<7NO{BEL~?%Zo_6!J_s?egZujCm6UYo7mq(O(3TuWvTQ_R0pZZ0PGK8J zLUwrMw#29Ont|sD&p6+EMZ{scUxH7$M~z=RVkfK@Np}-myHDiP;sYn^A1_?eB_4z( z*KwL43P?krf{3S#VV#ni`x|~oM2b7N4+oFS&+a#S_^n3B?iIn(Tqwjk~vG*?QeINapG3(}NTFq@~ zYPd08Uiex~z=N1MUD-?#*ep;8FSTVfeX51?T)I2`wCtQO5T=W;N)B*2vpMZpFlzC8 z;J=eS%sv*a8Ot#p4G-Qx6G;K-$vZBm#wQHyaMNdwOnf7fDY6i(%{c1_TTZ)IQ#Lzs z8dyK#-or|xg>W}y*{gB*7%hc`$^4`jH!LLxWyFv{eT`A6fMR+`5>jpy*G)2Ax}ezY zq_XvZZ_rbzoYyX|xm27|{c*!s?b$P|G2kwnbO4;R1(mqa0G9&g$C8A}VE*^WIf!;-MsNRw=|(N}9wkPV~N{f-qHv5I<5C zC`I6zXy|{9{g@~xKZVNqV}(uSmN!xDZe~u0r?^-^K0V1Qtgf~*BnRWezUR-~E|K~; z^sGR}U{JOJi?s>V{%(I62GdXNXWw@1sS=aWy2iLO7w-gTTH>s*Ef?(WYh}-AQXTr` zfAdodK{2tCM`puL`_vYBq7=QI`wsOkcirhoBE0GR{VM99&h}~N#qP*w7HL7D#%yZ- z?%lKa*drc?1X#$ri!0wp3Q1iW0cM(@z^4H;C(PEPd=wTNUuj4rg)J3VIl9YQ zn~W>hZnta*+Pvl`GnT5W^Supmhw6W>uuPZZG2-ayAODFM-=BZZ=T{Z&AYa6r6%!nI z(ww(Q{e$00B~K>XQ9>NADFc_-lksz*9u?LiWsFD1FAsK6@)qZ_MBf>fmtvptMPILz znbd714$m+Xi9z$KkHg(!DaYo|?`tk2+D|YL^SjuD2-02b*#^UH>{cYSa|_LAmxj|_ zY(^xQk=tq9F|2fN{>M3P=3X>D~1H!F%(Ve?Kj zq)Jdr7YVlb^ADNh$Kb?Mu9qhEkf-8QTX!#|hF46P%(7kitm8dRGQzz@(S*u4 zv#I1fbi{l)N0-2eSw3<`8}Z)Le)r^~HF)5=V8Khp91;FwLGCKcl%)$tu|^e9jAZ5S zGkA|Kk+1s!3)-^b;0;_WuQ40S_OYpuU^)&?GXnURVy3_5bMU&*D-tp-rV@v-L=7Tw zx>IiVvee{}lCIj{DU=T?$gJ-OWa=Bv&|XamGPl&^TlU>T`t&xW=g4xhR~mSF@~E6Keh-zPMI?j>04b6SwcLtMriUm6mLMP6RK_L?e= zI;KqlexkX>)o0a~H0QIuUvRWF3&jaHq$%UqFYSGPw5|7k;=@yM)k`TnxgZ> zsgA{dOnmcK-&u97+$t{E`>y0 zay@&8lE?n&^J6P)$K&Z8TXVW7IM=Tq?C?AZ*Nu!Yzl1>+F7n$|w?985L@R59$7ZkE z3y>?Q`*bCJ7|BqiP#4K3LJ&tbKQO(s=uytz$QAmfDVlOwg}i!!m%m>Rg!jb^W)vz} z{ax01DHwf%**FF6!PxvB<24Z#MexIwlG{HLfyawS3-fi-dKt1z_axrx2I1)H2#&Hf zp1u5b54$Wy+Qy^{Hh1w<*I!B@Fl$XoC{jRA{lG|WIZhQ z#HE#gk>l>WXV6Ru(}R2+h$IZqp9vQ<*Q=Ko`?ST z2a0-I?>jri1$AvYiy9TFeLcl1U|J@|GQ1TQrW&XAP2jT?9=7DWODa*=IMM}7DGD!w zyseO0n88mD9$HDjIabb~M=y9Z*?Vr;(bjNZ1*JQ#RAs=(T=r2C3XxV|#js&P3E8Li z!17q6!1Ex)__kJ$jp(O9U;c==jG6RdxOrL#%rsk5)5aH` zUfoFHBGz^AH*CW=gLO3qtN!Y+xN}DU zLJ|pl7cqBLYNr=R zBu7jv#M2XO{3Iv_J{Sn6e@jZZ*QL%FSO_Q*82?5t6z?h%N%%%LU>X>o=I?~-PZ|6x z05UiCHR4|08rrfiP&a8D5QyqG;6osCCn;f5T??n6+zC>{18_osoBCZK3gL~w8!fWzN6 zZ|wnX;fe&{@BCx~%bEu=s9R)S+?& zKY%9dQTvlsYVj8={u`DyEBN~|pbIYbC+nU4U$6wOSroh-VI}^zK%ff4KfC9vTT(Xb zb@$*S*vM^xj5j$hc{e#N7uaOi zT<`oVE+X(3HrapC7FckFg2#aQkh2S~m4Q{T;5%Se>U@XX^(djFG^^$Un;vo=9L`iUy}BG8Lf99s|DVcMrN- zlccV9FX@dL8sZx=z*QdEha#xZ0B&GY(yItMggzP=pW>ZZlGHum`UC?b<##@`^@@+U ziwY*9&`M0BYXnfh^N~ML#c!@r)&L6C4Lll)2toxkWWBr2ZMfo&33rP>04#j^Zx$By zUZc>_0F07P5QvVaSb&HAZTu9^T%&wYz{C`7T@|%%fGj0I{qHEYuUDufd>3@Y zClsK;;ud`R7XT!j;7_e{->>Ddq5zW*TQtDXUq6xpqG%AsKszJOuQE_ASuW-|v^;>CdFyE+S0JCpVNN(`d4*Co+Fa z`M+*~ES$`*m-3wM)*cRKj*o5ZIc%N(j{oPp>Cf8$e-{A)QE*@(zM+F@uU4S=z|7JXb=dGSN9YCnXGxR5ZPCde=eawApC!p c1K;rZu@G|@;Jdg=ASI9$;6mGluUg@M0HMczz5oCK delta 757183 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 lx$`LD* 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‹o%ge3Y9SRc*CaIT6z-6HRhePK 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%0A8UFwp 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

    dx6u0c;X-Wi zy}NYXB+Zlm09}6#T$YIB-JY*&aUqDda$_JqI_)Qe_;jTbCe2mF!fyZ-VboT~Jk`&z zzh|!=t^5t(jYYrGZN7VEWA~A|sP|K!z>1oXx;Mhr=zUV802|cf@x^kbW4`5~&&&ld zBqNYWr-!5nZq|cFnde8+Dq4Y$&#&CJ-K@Adb2s4qM z)D37t^X+eziwzM8!8ko??P6?NGlk)K#(zqNQZCzFhdV_BC6ZBsGoF<x3mLy}0 zj2b~DVcUPQK^%%;k$xkAlR%kiF`N@Z8&@>aIOkIZ+6f?GhE^E_9E=g^N?Mf(SorJW zUxAN+^&x$yss75lV(EZ!8+Tt|ct4GF;p*E%mls3rB0UoOa8Mh8UX*2Yc~v28PiXKy zjW>(6D6|_Bg2WkQ#|WLz*BPml`BmAPT+IC$@V|eC^#1@0*hQ!5kt*#UGvnrBdXjqA zlUA=YJs3en9YD)g4^u^{T3c0=9F9dlP)Oo+jTs&?F`Q?$3`fuYCDD$TKlX$R-wpuk z5BOE4Qf6`$l>^3i2Ii?6-sFfeoYG|q=t6}p4?DOw?i?;1QS3JX9ss+XaEO4I5=G3Pz1aHN$0%)Op=8kFMhvTZ3w$>Ib*=& zezhA8$I<@)1AZJI6 zoQ^A3yZhNaJNwWmv&ei!sD%s(81GudnP`09<85&jWR37pgOGY+x~b?xKPx^x#|?$a zyU~s#k%?p;r~d%2U3}I@GN-PG%$8P-b0^Kz=dEEm9hB*w;ozSOJfs@pTftW$faUhu^NmvF^_-q%`(!mBvvHtUgNC|lF;(F1P`rDSy7G43Wd7% z#wctYNj$JHTm17t)I};39Abg6EEMh>_vV0dEAC&t)cRBsJidNnF`9Q1AG?uA+Nefw~z`#^CdnVS`Q#nL$b|AC;PKi#5O5*T;Vvj)sM# zv5w`8w&akq#OEsG8OBBpX;v5298{{fzE*yect6H^Pmi?7{6*pEm7#IENcVivF&Q9^ zwUkz;cQQ)nE8;C%`%dG@g#Q4e#gH-lOEp1R)cl>yLU7gVosd-6Kl^K#Djx?OA`#o5Cm5KMp)6 zCZ%x&v?-G0bC0?^llfO1<*DCFHa_^%Y@*XGqp*Q?q9_Lgt!WfFPqB2$2Vdf=GLaBq zHuoI|J;xW^qwHCC`(acuH>j{cOHBT2~Mcg8BL1%3!QQ`c)0H!9Qt@Txov~^#HAhx{?cJ8RUZ7n0xTGt{msD zu7~6nsQX#H{{XFAqGX+pWl>1vWrteNn7&hEOM}gsSJZ$%m1Tc6T0Y-kE29(QHlH-M7a{?Y5s3n>GO-mPe3jwP2Hop!u)v*oEXsC+?^NbE#QKO! z7l-r@H!301;8C-?k}v@GW;8-P!l|L;Hu`+1j4sYnA@J#0EHz7^ANLvZKPo4o znvKs;@ZZPp5zMA7Qr_C?2#yr8jm!@iCY)trWdwT0i}3?Z*Y2RwA4rvNr(h9n*d9+( zM_dY0t72n@=h*ixOW}5R z)fCX-Cp&*nQ~f9+F&`NW*lzy6)~OAls~}|qBd1JI*(nhj)H7|*AJU{mq165U1pqj@ zfywv%DWn8Z$)2NtC}1gIPyldv$?r%7R`Sl_$nHB(1XA4Kk~ke`HAHOXfesH85=Iq* z?sMvM_3ceE1;cbv!S7PdS|gAc!BNW&D$^n8DzSgS7{&+x09vM7jXRLB;F&w|RV@g$ zfr9~!fajCyDIh2E$pa*gf2|FTp#lH^$s;E}%BJEK*+C$T0nRFrBBLNrn1P-@{Zud` zD6P97XPjfTB9gfd(4eyMo)7rYE@C6j3i-{uFAeBzNN$rXo8JBMpORjyWe6d?vY#!|+Wd49wE$VAcSsjF1 zSQFQr;<~A;9Mg7XmXRl7TaKGR_p7mE1*^xw>97b5X1sjjnu9~o_7gHE2yqs0u<_xnQ6y#&KUr|+ZVzn(R za2p$m;f+TzT)LJajz=t8j1oP_sZtG#vBaaDr1AM;sBuPugPgYj_o=e5_GPG!6mWkI zdK!eRUG81L#{-ojXZldJCQi)vuYl)vk1U{l>D`GwxB|S)POS8B z-wEDdNt>5-I48Yj66AR|j%N#QP#$rfe=}aL5+{*~dY=J&R@D!i_7HlEupgazcCnNX zoV9=6tTy1}VUB*Lv6OCgElzUOsJukR3Cf>vMRL`89T1I;OEpBif?>payt9AxVln)y zf~(N!q>rvXAEx~(XFLGYWPJzt8t`gqKkK=&S7!(DN>ZK})D-tvm!JCThxrQZ!asP4 zyB{)n#q@9i;xf_g9^^1TsjouXg4CsKHt9EQ)XOw+{v$2?s%q$hI-p__D(D!#8rJrQVq4PfS;I zQ--Ea$(+8aZT|oYi^S1BnnbZRgNX7z^2(cY`SV>7mppYG=Hs@9i^VO(_bqQEg&Enh z#ODNLk@T%26ryE&_dRpq<<^a%>d&qCx^o-D8E7|T?J0q3W zAc8yTj+RT>Z(xjjk6NXnq-Axfir+E7>?m5AtqWGr$jHSy5x4O)nJufGuBETt+-Vlt zcBydEHJm2a);#ePMfZP@2e~BvH8H2VWpmu-wY$%@YBF5^00XcfdJZ`JDx;>vrJ*PG zjl@=yTEOLP?kC*q>$3%aEYRuP8Pw`NJG<3182mS=7LlQu9V92JsA07Jf6j_@)LEUb zU(s#hm&1;36qkF_fR4OJyB|!}QmOCQu3Zktz`6uB7V+xyw(@_-ZcJ=`=?p|*{Z0v@ zbsKgv+~1DjjjWR^W?7$WXV*E&`jcHWe?toGEe_+u^E%vH$!dJVzmPe}Ur)pe^(f0j z&YX2VviMJT``<4($;bzcb59Yh4p^&C=6$!}+k&b`xa9j+&s0`D>MrQg_<-hb1Z#HB z&={D1-(r>@Sq^`CCVnh@S<)8j>e}%JCTQ714^?B=@Wpy|)aQoBj%m|*`=XE#>TtmI z80%KeoNkV;&Ub~?qZ#KPg-11k$3wWbm0T+!{n;4DeD|ZAf>{)o9$CV+KdnpD2WgY4 z9Fvj=6eVzK&gVsc2$ms#2*jDe$ERG>mAO(Yg2R4!tx|s?PfHt+xRnHn!R|ZNlG8|& zcOjJHoD=U(F621$A&@oGnG~NjBU8uSIVT^=ui+B+v@ov~gBdY`y+vANOvRG)b?@KU z_Nur>H##jFUu2VO@T0zKIV*yfD?K2HHH%`-2H*}DR3~Eexx?LBm~tNn8B?BrDzao$ zv9yL6gRy_Ym3|LQm0 zZe`JVDy{woc)F~q$h!xK@sl7L5XXy98Zn3n~2?eHx zHY9Y(QJ>be-CWLav8S6(_5?h()42Ekl`WL_ETabbT|hn0p%o~Z>`e)QdB@Fiq|Il z#Dmu#jTS?-hi@Br*Cv$_NLK zedg+b;HL4X zRJKmg`D{SoMyn*b3Qu}Xg}jXjEiU8;wpOytSOUIUGxB|L zS-PnjLk{K8@3h~8zB%y#M$+`je71i8mXH)2_27z!iAO|mGCf~M{g3=hs5hIdUt8J4 zI-yo}{VSc~mqV#wd!DhNe#f2{uqyi9^~Kw-J4Qe!@imOGGCCoIianP{_$}aV46E8{ z5VV6Cc^4#~&a$0pGolou7i%91{?xw!CGf1${6p}P7tyC}*H-bXW)?kIb@_iu{&jRJ z^6qouaQD_H!1{}X^6nug2j&N!E4^xY@{Np*Q^cB`+{+fRbv@9F5yB;qutd)aGxexS z%zKX#f~8n-%AEGiX}FTH7LuM!jT2<;>5p?*Nm$h#ddC&oO{dI42^ZyT@(AQN;A<<6 z)*R~>iFC-;L^0~xc6C!7z$v_x33Xv97Tdbprx z)}OL|x&4drFF=+W|%l!(zNX4%fMD^? zDX|Jh8y&r97~}GSy-4Yb0G2ht!0Sk8e*{o5i}!w9;)bpyN_rge)Kf~vPjFrcCxUT` zaz$Ke$Ok#e6eLZ_3Y>hs{eK!vq(wXe<_REdW<+EM8QMtdDRSyG&w+nwUx8LS4v%f) zZwNz!XaqOI1eaDkNPU09b^ic*yKq&#oUG0)ejD1ynRNdEg6@0@@st@OC)&N(>Ub_T zE3hXWhDI^zO|oo3HdR9@8R|3N6`PVS$E5fJ;Qs)NJ|#-9cvi+kY|Vzcl~_iHJrKw6>r@)`JZ^MMr@8Iz^n1L+ynW2X44$K&2 zk4?%jYG})q*t*f?S4YPm5WFuG`>t)*5&Ln1ImhK*wK<+dRQgdV26ay@^$ZDZyb#udF|&tJgTJY&r(9XHVXi{ZKi@V1|~?zBw*0A0>aX<1p= zGX+Xhc@yrLBRY!!nRtN%^fw4sV9f-q1QC*toF_vW2sPi zABd}FY1>ouvq9Bk*R<r4ipo2PnDP!XGMPCaR$DaZjGI%cF1T30GQQIaX4vV_5i-Z(ftDv*q}kh2xec|7`6 zv?f^c_6`rtn#@T6i{{3A^`N5Uap#xdjwv<;xPVjWK+OygvdO{6Q9=Tco6vgop@oLM z#sLa44rqT!3UW)2x-*(%Zsk)a93H==Fi5V>bA~irZ&5dP$68#%u}*i|Fby_RGYf8P z&?fF!jmnXZ)Y?`9K|XG@go{bYBzt{nBSy3}ZN6eX`%uh?_3aMR#P$;CdZOkTR~gUD ztZBev!R%gTyq+WPGRF}iLw-ZFiV-7>Ecwv8Dg$mrt$CHVo;PgJ%{hh7S&rO@e z5_55RbjY9XAp`UO06pq)Q_{vXA=LXXO}aAbc}S*J1oDcE8>s1@)~3PCP7lAUnHj?X(J&}MA%=M#yx`E) zw*=Ic;_jZ$T~|k~p1x@@VwGebVw|G@N6>%Makhk0sH!C;vsYg+=)|ZeBiVsczff>N z_B4v7?yqLNnsIB^F3mpaq}I%jD=r*v3d3@O2tP6I43-(_PbAH2O88=m_3w<l$M^1@UIu^ z{{UtWyCZ1Yz@C)i?r${W?Dsw~_@U#IWU{2J7DdP^NEjoi<085vuEsSJi?o%R-D#uk zrPtirJ|yuRGwV0ka9=vgW0rqNvl+_d91;&4am5tt`$(xSsXcep?#5sxgRMFeX}C&J zZaT%dw-(~`x^~k=p~YyPAH~zb8;PQhMpcjw8C3AY>N&1@m0OOg&$n+QZ(|75Y7$b4 zZAMFJE9oV^l3MP4(eS_F{{Z$#I+mh@Ix$p7U8EH_$^2`MoVn6#spx;#q4jyVJEs=Y zzWO_Awb$m)Z&z1QBts~`Fy&7N-AgI_2_A&j*0zuO`|SSoj#yPy5|nmo>s0i9aB_?F zjHMpZYf>m2%L>fO$-P5uafTTg!5xV2RW-`mGoe3g1v@o#ousWLb$dy4YpU*A04d!Y zZ%mS`JC30KH46Prmo0z&$92*7T_4P7QtBIFR$vKI2qV~n0UwA5+J@3()02`-rk%EF zro5VxQcZSgKIt)XxZTR1LyZ17B!09G4*Or{zs}98`ZwyqRFRTYk<_DZUO&2UGCd9k zX}A47AIzw?ZEWB7Uo?O1*;#W(v$DF@$ed*}ya2fT#&!-I_QN7MuPfl+&{4w+MMc9!c$zW)F;pWc)1ks$?tcP7xw!6!Ktqjsr&9qi#cE86A!fOwr2L`-_?~)(+|H z?Q5=%&sBBMhb~oCMB2m+>yU7JjEsYiQN>!d^d_5=Ny%B;Rdnq7tH$Zux@|s!ZVi@B zQ`dvX;7I(59`qL}CbZk-{{XhRNA8ndn_7rB1Q`Jd01#_Ht?f8a8FN4mWxbZIOmQ*G?Z=(k)&+#)Bgak zNs^ev3~~DNO$o84HW{k0T!(j4-}=;8Y_Yg8#(Hu1)pC<@JkWdcC}_0FgQAVha0hSe zO$m(NI-Y;j>`yTp$VLd{dQwQIDw_HLT1B@h2m3>C>mi5uWK~=#ia7XrnoVb2MZ$%j)%8Dr9>fiWm2V;kEoVX-zRf}pL*-IhYiVH zfcYDq{{WR7w?T8}?~cAbZ88t|MRdsr+Gax2Z8(40q!I_>Kb=KKWOU)-%wv2m)NM4y z8cv_J_rvDNF#b2)fS~#T{Oiwat36GlW2USS1s4n=klio zsghS#J|ppVwqyH6=6}*|_ocZ0KnS8^{q${WMNzCDwd?N$@6jB6(UaKRNw=i0IF<4V3JGp?@}>ajBUXH^P0Pe ziH;7@+;seEhDo%y&EKAX8iybs!l*oF6s&(CrMcQUDBk%$KDh)}C3~}D2p*BE$F~>@wMU9e0 zjBjEBCXO-_(S2j{??f;Ws>1-#z18l13uj5x~WRX9ch2+ ze1YR1+2`U9hjgiYPpoMrEMmcZt(H)G?Od`pN8CDeBHGT}5wrpP&1Z8|XKEUSwahbu>$~S!19rzBl~iIm%R|kk@wScO z_#lXtfn_Id7p^^VPL-jc9Yk;!;y zpR?SHi3GCAGXlraRB`wYDkmLCjE*Z>o+BHyP8kE0Vmf5?AB7NFgr0_ccWCOX2-=H) zE2o;qDmT={ypgAq%juE)s$8yXYaLdKS25Z^3rgf+2U1NZDI-SngK}8>3bJHiDwL+9`Lp7`yA1sk6&t5wHC^K=fi+ABI zGWAN!2?UJr#++qgdnF^1z4%pOI3nCB>;rTM+OOJ}&kUKv>OTiaOdu?Izoz`ru>Jl2t@L!^JsGH(Rk*@GnU22yy#WS_#cb&-pv%940~Kyd2Ik&F?= zQkrB+ETH;aw)kvtI3vAWWMI)wSfz;ktDo?zy~=Arh23ylj=8D?IL>o}_f7!MwrM6+ z#fZ4j%1B%s$H;#@IG{o!ApZba zo;bjuX7GEJBCJZXe)8&11-VhkxdiIOVuzl){qcQ zjiOV@W10nfjXeCMbJOcVBUAv`Kd-r_-NuPB5P}9&fs9fRjWJ>Af&FMTL~PrafzAqan4lh^!;3xc~4pddNm=eMpYAZozq2-?D#42J}tEOU;Zu4n=W z+_`O|jBqND?_#d-Msv^%`fn|ACXKjfA1K-}{VTaMk-LA0K>NAr(=|;_j(P2=WF#iBK zs!rq@DQ*;e{ReMDiisK|UkZp0-^Q&gBPJ<0$Zk~Oaqn2kT-Gkdh}Rfq;kq7sRmF{y zhTIuYV1Y_b#x{R0tSS|A+;jEoQ+tKW(4r#zx#OUu^fcVMgl+)$IODc@(i7E^pOf!( zRel?oVrtDFcKTH@OM~*h z!WW*I;;JmEE9!j{@JtxIG%gR`c^moHmx%a}M-T9wZS0@CatRsg1w>Hgq2YfK^)nPq z%yz1;Q(k}04`af_OWtSaKa4M4{`N^Z`HlduN?R349%HFWib}8Wjf?Ba$*w0W9kJBp zLwQohc^ExA*DXhLc%G4U;Vbww89Z4o#fmmYM9<9J@yFp_W2t#KoqW8i=h8n7q}}1Q zkhXlqo=l(i$v>w`@+&r^#~B5=VC z$WA8QmS1Xw-@s8L`G8E|;BZK&Qw@wp5#@gvt^w$ATSh^uEK4kQ>XJnv4ZP)l+4cI- zC4EgHsf{CfrJ0UcoafgxZfKQ;sVyMST=g`Qu&trcY8GP7%F)5%SCxc02@~VxVX9u6ajWl`T>0Q9$;ZL5WbV;~Y6We5iju zVfo0Ow2c5_v`J6{9q#@1M_l`sQtQJ#UYN&4|# zgidK6WB4{@O<;w_**3VxOfUzE+M~Pi zfT`$6KGZvt)Pe>MLpBKqKZj}~+!@sA*I+4%ZjHx3=h}y;M5TXeE}l$C}*V))F+1 z#Yjs}CfL_87Rz+b+Dtm0W#Dom(vFz!WgxmoK=KlaaX{BOg?=hRo{JHD> zGARv4%&?EU=WlveEp7#Y1xOj~k4k28W5S0y9da{MVJ$-&0Y8uBOJhjrBL%@+j(vS< ztY>{lUve-Cat{OiX*5$~jIAbf`O{3Nu=SaNIp6>YLHE95n^z=-n>a6j*E|oy{AooE z4US@@oD66Db3+qEk0=8HbB^cORF`qVO9E8j=Zt<7?mJwC;w#2@>}jGJu_LJiDcghm z>9ulM5OPjik)A&aHU+3i;y_CN9<-CWQbS7~3F)4-45;iUnZ|u_f%wtQVe(vsu3J1D zARJV-RkbTgFd6405CIf_AV^|dy8i7BdHl@{iq|JHNXzDv+w-WoZP<;rDI!M6BRLVaEPYkN%n;?i@ErYjj@*F&a%I2L-ojr$#G(Ww6b zgpX5c+o@QIQTc&byjwbEM}cPNEa7CGzdMeG(AI2b(QlGHX4{$Z7;VZBIh z?V;2y<T)>~lGr#LdU0ANX3;H%t!^(C5(q4D zpMJu#o~1_U@2_-Ys92d87~?E6FHQl;!S}3rP1`vej}qE{=-aJykY-|`U7w*Kb@u-N z>r=JJOuyjY5-d0H>Nj6;9a)Amj2zXqphk9QpzAudro9^9**mhW(TJ-uiGhaY3Rf^+mo z1pbx0G*&ZzZq0h1wijQu7liG+cWv;QVVZ0ErHl!oQp&PQ0|h+#9G*C@HdOU*)bwLj zT_fnjz~J&YtWKMgu5q5({&kxiP~+5po|RDsh=T6v^{TyuJg{D$=QNg}orGs>6)P?J#tlKFrrPT^w;D#EzGa=%O$@2*!yo>tot?{$x_?$b8NM)h2It|wh;Dp4s1Oi4 z7#Q?u^N@31-UkuRtoJ+|ZXMH?kzc@H2E14C9%WAs*gD&i0lAwC8joOl*0pg82+occ zRW?3<`1o!6Ab4}a-d>~QDGsTqCJ&dKLJ#}6uRf+Ny%FeB!KlA`bL<-nXmsdO$4-eY z?bK~li~s-vxuqt~n{t+fc|3Q`CP{ucLIRlXDpDI|=;Phf{Pm{vGLgyrMDS&|j`Rz^ z4&EmAVdg@55hC&k{A)Uq>Td~YWAg9Cnj`6da9wDcvK73BU6?!*jEd-?Qs*UlcG&qd z$9@-<0B0+dJ%9TD0F`=4b0g1EoR9bmeuP$a<8^bd z4(zObKCBKali|f=t;#fvAglp)~4bkXXgxiQwt1c3NlVf^{E;&q?eJf zcO2D&DaaW7iO%kSIzk{@a~S!69Mv~}a4*Ad2n>IV6)leCg|}RidB^zDxSP2rmA8c$ zp^YKiDG0A1;|7s-GNp1ej&YjMor;Ywb3n#3j9_)eB1){>Wb^`=TadG3j`^SjEwo^s zXeld{W|t%8{Am>3iUTXc@@kO{T)7bdXTNGpB3y*-`@9e-4I@e~n+Nr!u*>j&pXE%= z?rKChByc%7`qVaPk30CI;C1n4p1OsY#;0Zb#2^g1V+@)4bNE$Kmm|39)Ao@f_!q3Q z==PSA8WJ%JhUXrh^$|sGS7#rm6`-skUB56q^Pk4042)!FoPpcx zLqIxZXWg zii%vRDI{no8*EvA;~rPiKWb|8*nJZn5BbaG&+9l;p}oTB3F%&Aq4NU6cy zG@5HtZ$~Jx64hB8FDtVl>eS4dG6+v=F){cvp;j+lRiglH!sCuO#~rGtd%N${=EAr-adg$AWy-C~XxmSBOKH-|+Y_z=@ViGJFC2Su z#V5I~1!SzP<=e|mH1Z>kR-6f?KQnT2Lvnq=ApJoj(9@E(feMa)qEdUkcT(T`(Q=FR zjGB9<)}(YBI721pGW8V+5P&SW)Be>^rKP=%27=##o08PSA&!uont9S`CD3^d8q0U ztO(I5jxvC%71&f`fK=lc^zB5V)Scbk_uujAP8Ly>IJhSi;;k0BTvfD-i?fSMPFpK% zcow5e(P=oY zUY1&0rpL&?61;XTqn1e+qw|p5Fh2hNwWT<&heN3;>no=9YF`q4dA$4ip9J`qT%W|( zTM&=4FWumdK7;~4D!DuET^eaCM{b%mr=v-)Mw9X`X}VdwWV$(&xh`eNC5h*A6VE+) z=D8c>T(-4;w6|}#?VU%6lc?n6myV%95( z0Vnv1oeKde zaqQarzHjq>qQ>7SJOhK%Khy*HfPJaR$}a2vAN5gxdQZAR44!mpGYzGHY-Ai{bjaZS zMK-xxMtFLTtQ4BH(ssIby4veU>a=|aMt30dc5c8wD{f!GyN^TOhvoiXfpptxH*4Eo zSIrxL{{VJcb1u@dy3`_ZaS~i8E4T*QagmXpagkFv^1Bg-t?i(ulU&I=J=N9qwblI_ z^(-F|w0n~pk*K+#?-#0eak_gxSE{<`^<6}haxqpvGLjEo-(G1ab#qz6k+{Bp zj@^G-Kfh6tGF*W6@4hDG9C5i%L->kPO=$FeP@_^67d1D{7p!Ic(R)9d)GTfm`r13S z97>Ad9@!bIsSZgv_I5e&Se1&U3aMM3Dpu{xll@C*G53x=MP(zQjNAd-KDesr7bJf8 z=s(Z&q@qp7d7$GI`ANAMpOABkb_O&G8DN7EP8hBR1zE$cg_z0bfiq3k1_bS;Y)uS_+slpxgi;yB#i$6b(HW&>z}Q3 zQdc=KZ16GJR_B zlIk|ZzOC#j+REj@UD*7_@t=rpbz9cCyI|KhY}3AajFK^2^LIPxu2PqWd}}X-r?$9O zW`f=K6kp=bMi2A+D;YrORS#tNhw*Do@g1BRW}M%+bQ0b$1Q4t97{UJlXyAS{Q;9NX z&Fyt2uXNY<9PT*_*+-xr)zK4w4yM+OtEpdoiqw-7LozpFbHJ#RG>PoCI&_xz5lX+cl^Y zV{pRoDmg(rjabM8w|ZR zZn)?5qToh3;Eo8%`qd1vkQ5wqjzWdX+?~?IF@w)hO`Fq^!~8t3d2f{@ zTo6uvwaF#W?MJI?{{Rv#bZf};TZu+WkDELx9AMM-V&**KS=UT|cXLCgIP$M@&N5Ey z9#|j5im0HIJd<0xZBFALf{HdM?Zs%_$VDA5S=2NM#m1X6BdO#Qka6uz1Jv*JUyBc` z*uAyYgi&8?#CH(UfYqXQt|^X&FWsEPjoMt3XKlyEAX(U&8+k3NoJCO6!?9FjeH z*3p_~bBjfPNo*N8&PGlM_NwM0#Rh@X?=L}&`_twZDHt*#0|$3u{OLAb>^IDjKJhsj zr*Sk8%EaLG$RuO07^YG!iGgekvBo{Q;)~cw1A@N!{JSi5;Z3as z$3)71S9GWD@-gjDGhQ2Oh-~BAmq4Jqd$&K#)>QW{Ye8e3<6Z0s=Kvp0hPrQKokW&r z%4G-5nmLNGRgtiE46w)Jn!aHo<6EMIb(503t~zs4n1)EPk%*3c{c7S8*tZPH8hJ;* z9Qx*)L%xFTVbB5xY7rZkV~Kzy@CfPeR1=kdizEi;I42pVjMT0~BV!`$W1Q~5?TW^x zhKZKM005`2dLmmi*J_f=2pBzS+U8Bzv<~65hCS&uVM{{9I8t-TBC6LEWJ%|eN-xx6 zhJ%{q=uQEDPH9+e7hwJ0%&Ws-aqmg8luaQBi9qVP#YN35O$+Z+o}AKSHSHm3NF?Kb z6*6ICd<*~*vTW5N%<`m5uygBE7F6VOcNZ+*x{Q;7fu6qq0F`Lfh)l%Uu z2dKHhAb@fywo8qKkm52&2Pc}F4WfiGnIw`{&kPg~L5%hK(zwyF1YxtgfG|(KYSeBt z%zqhNn5;^sHnWbN^pdeMK8^TB+dL(IZIUu&l~3Sn%CGSrg$*Kf7n5dJQ_8MBoho3i zIY{}p;~nppXC#PzX%596r1kuOuWtm860*FHg0*=@$!=TlJ@RX|aD{#DO6%_BK3RC)Kswj;yFE}-1ot`APE5A&|f z8npgIw{&#>S*|9!e83&CXu^wkQP}- zRaM77=hm>VTa^^GXSDcoDZD9v1o{*cJgQY#$o)wNj8~shSJc{^Zp>dC_y!xRt8Eh8 zh1KN4N_pFt=%?S4TTrgqy;^*%=Op+)2Zgmp)4W-9-fCd%j|5?cbDv7qRk_ic_gULR zrTjh9?e9eMSxbvBBrs=2!cvGDrYN138V$~ozhMN@=-o~NBRV$@o% z!h6;bYC1rLTx~45{5$bg9%LTY#@?6ko8ZTdGaas|+Fa*_+{YQuxy55!5jZU`_zpGh zeL1Lp$69Wu;q$3@Hajc(OGpWo_mIzlo!k@cn&qR5lX{MA^gk^=B59{j)SpO}B#K*R zC=ohfo{K&2&-l|(;92^hpT`D&T4^xLta!6MAIZtLbRD#V59?Z*`~ zE=-Ojax>eou9i)X*TPC?ySB9c^uH)Rt$|oo_hQ+cRoV1EjC7lS-v!&*+4z!C=Fc0- zjDG3M5Ha{-xM(*r>O+*mx)vJ7nD&s*7T|%@lgKO0dK4o0j%u-18KAg=C`FLm7 zy?RRfo^@Rj_P@icxi75jt{q42S)yhtr8aok#dmrST!v_*wZ~;;la8SAt7>B=a35GGGqC9-pOp zvN))oJPD0JPFEn1eUI~|bv?`tMcY7|`$_@+jUmL?87f9_f1Yb8Awk)lU|+OEE+XVG z?ay3ukH)1k+qt`9-ed^l4T!-QKHSyrCM~=m#pfvFZ+}pK1thE{O%(eWGIGR?-1}49 zly#PO15t&v>x>m6Dtm*)GLyN_ru%tb)xiZ@9>jM40PE9IMlvtk$&Lp~wCpQfw-kY- zDga-RNx|+(qjFlYB+a?}_3nV2jPbktXj_#n5khNmDwO~dM?=MEMecGJdJ7+(-0|o? zT4{-n)0%64Ne1lXAJkK7p43i$8*cHIgPi8b^RasKF}^yf4(xreqyGa zxs{E7u@TWTx!8Hje7WYeT559>#lQfMm)F*-aW+n*F(n61fYNMfk5P_#41X$u2khU$ zRb@NPkt!5dyHf|Ne#dm9QxGUOlQxZ-Qe^6DcpvMOBl${bBxnvM4iAO zs~&mh+tQ$NXo5g7hQS%n=~Ree!30OuO%0TPmB7ZW!RUSapXpL)ksF<(<;lnC?N`vv z=B+~nChTn(+=SjJZ{5bvxbwH>$K_J$XdcO(HkaXF5qO1! zdOn$RDr9Y886AGLkJb`5r-pMqd&A$eKaVx7t#fRaQ6AH<&$mO;vz{d*rC?8B(7$6P zR`dKvtG08Juw$QIwUfr%p}jmB>U#!%h5Iyk7egx}+sSt@>e7+TVJt&tj|&@~yQX+c zLD5t$m#16A6ySdCN$1}co2t%;(@5wNR$d|@7tuf;%B8!G$qLeM<0q%BO3#0LBH33^ri%* zurhj7v8H?z`$_4L-|IKlw+bC*f+7L+5e!xoq}ACKS28~*JXfMgqg*s(5g9noVb3G$ zUX?lA^Q8+IP%_0ENDk!(ZFI$%N+x~7NUW3XD8n0D9dXdokybS>yho_&as8g|;o2Sm zLBJRu)P-XlMZq*ABSTA#-T0PDNnw2B6flFCi252rP&*vamFq5CIZY1&7`^Wv`< zFqGV*MQI}(`EyOel1@n4Fr({J2P6pwQhzWU4AxB= zTnR3A)h!8ZJ%?&7a1orJuQW$NT!=~A*Pqg?$?6~goPIx*H0&~H*y9I*ibG6u0h7D$ zWDI&x47RE|cLS{kcO*Qi9gPDNE-~wh0lSRaPc zz$4psdgJ^l!fqQ8QVLpsv$V6ehfj%Y^ytzE5N!z>g#dmPQlB>ELMal*AGcGQNrat? zv8nG`Sj4{q0Cyk4nE8vyJ0DJc%>*~8aU%ofIl$@o)Cr!!vNQzj0jCSBOa;Rg+Af9>m z73$Ndu6b4I^*%iDU4iiBz`9X}LKp%%_pXyD>7n{J;hlCL9Qb_=T4+r{wRjX!lRyrF(LgDy6 z^-bK$*E{cqo+Cbg5%Eop`!+4*f3wUC+mu&uB=>V%6^e6j=j5oO5t(kZ8Or2 zs^a;e4ZZ0gV|VkQoA^bMj^LOEfBO5)hCoB`N+P{paDjm}4)>r^Ic$0i2V=Yv_eg50)}HZmh|1)(rHU!s#vKZthPf-N6E&gpuf!`qE;m-`f<;9+ zSjC?cmBQWi(^2`+M26PE8nRy35Ho!+ct9Gs5a zeiS2rCMFaQuG|1H0384n+q=6R8fu(WVv~+}+vw3;Q}~i>7!=E7G`<_Gx4Qb^z@kpsduca@R@=m1vJy z)#poSwhk0<0PHJf?sG;dD=jQ|AB(l`AUF(vJLfduu0)TH{w4VOD;V9LP^1H0QHc*z z^V`Kc_ykeSUG&49P(=eT zb7Y@RF+&_hE!(i5WZ`q4r7M7#=Lesq7Xg94`t-}7hxSb z@r@s6k3rJzpYcL%O`s#*+iARV5+<5Jzg8G!kgtt*MJ1ToxmfGJ2^$TyAw>q;Rl zP=xYW_s{24OhX$_T+zB2p<$*rs#+YCU8gKRPtu$sbK+{-V#beS4xU=Z24{{ES95j9 zt(vkt*~YPf1#xZavHJlpNnQLvIqOTfrHyMPh(nc$B^hV zu9^L#tv&#ST#xsw4cXnzq4T`=FRk85dwRv5M##y{Q)R_ydS0^vX!d*tBL98sLn7hr>@N==P_9>K5p7A*(DT6c&h zQn&YaMk2jFO@#743Q>0yv^h9!M2I5v7$08rCMI zH({qIgU}q%Fc@BcasEvJD8a#gywF64@+b&IYUM!OFenD>IZiSMQ{2=fRr?4=4OlgC zT(=qHsQjvK79)}f=J{nsVbcT*Q@w$!nRhw{opK0!bQ`%PMN(#Nj81a@0O9q8+O$YQ zXFQS9)X^EVX7K3aFTM_>p}xwh=d*GTHL9-6Cxf}dYCj2o?rlL4Z&p08BOqg^=UPIw z%q4_p3w7XaLfjWScKQ`yf0b=2sKQhlXE}MITv^~rNFeM4@9fY?J0;kVgk2 z9cxCyD?%e>CVzM6P6agXMXX2mNu&9gbUDpX?juC&mE?Q+(!Gg#jEw|&1mK>$`cZI5 zm|;VDbU)UAh?QZ8*!fg($3I#wPbnjn908O56>$PLB@RbYf6w!zz=(hpbI%kYkst%N z0D`oMXbCvRdCB0?V@l*QHvxN$eJQO;1UMj(latSCu22?3zyqKE09``@HgHDHob>d~ zRgD&cZy4GS0C7noY*!=AJOFt={c2Vui-v5Dyd3&}Q!kW-_Z)NEue~HeUPV!W4p`*# z>s5Oe5g@}7K2gpO>rLz=^*TxC;h7xyXQGcvh?+`PLt?mr*KDlJS37b$cl~PZb1q?` z<)hpa8(8z-6>0?D!6YEy z@JQ=_PQ=Q37QR&&>&_~6CM}bMW5W%+@M(@(fd~K&dL9R@AthoJW!6PSs=}~){w`6I?r1Q!7vr^+>x1p(RYrKH} z0Cb<^DKJLSVHh~Tz!;=7$wj~!4aXe*H4Pe~oz2kLMmaqyBDDt0Lo+Au7lYIDty(fG zrsp7cG^|uuHVFlL{{Z^vlDS)uHNfT&0m))VvnUA?A zit;N;@;w?m9h1Zyf3)3CU&fpriJIj;J^0~!i=$x~!o$kAo2VRrWcK!~9*0UQX?O5iNM7YP06JGSWu}JkS|3#W zDEONmg`_Z4RacTyV;Oo=&XAC*4TQSuHez(pYV-pms3e(kd<^|kCBXjFg~8# z*P`WpOdPp%J#)a`9+$(iTrQ%4yv0CVaAUy?20HCvPvk4k#7^ea-OXJ}*ASbv&zPti z1G&dFhcVkrLl?xly6b-ttZuDa5zTdC#Z>SWQCYb5=DK4~lAZgHoz7-oiLGvRU3XE` z*u2n2!E?zQ803DS;)-vUCAwUH(k*Mg6E~@EH-;Hyovo4XA;`+R5I7$EAI6+2qe_@( zZ4WwRp4pz-=rTxzt1Ao;RP?U8b4?yKdTuPIG~Q?MfO!>Hv5cdkS_^--T*YjF4bG}a zu$iD#l}^7&T?VKGGHM$x$LE6!Ba^hI-6_&dgbw-Zfs=iWJz zX51OiQdITLdX!a>y&k6xG=~9{?I3fH!;0yFuH^+Ajyv=e8a)M*A&w7DGANQ1L@vYt zdS@bqpzKT4ewAoPMdAHPEbeW@q#`WwlP7f<=lp*PnyT?+MOobR?}~mXx$ztpe{Q(@ zN zXLyFv@qub;z&~xvaNF||e*N9#KPSf`Z z>smblJvAu4*hmh4xW~)KsHxlw*7F!j;E;Id)~Re}^w{cAQ&osafO&v$d-|FZux?^9 zwX|bWMjyG65ZNoO{!~g=+y! z08jA}bN&?fM3C)b0LFWMU1==}5N<=a2cPRyn3^Bv7vPM5Is8xf(B)!zMio32S3x$U2CdXcwc8DJ!UJLJ&N zCQ*{ylqiY|SWD1tck6{{Y@Oa7UX;`MLX)WW3zRUnC z!T0aq@vNDB4GTNSnC_KE;CcEAQrMJuuAy|cUlAno!3lS4iU{xfq0hf7ipqqn+B+v3 z!1S>BA2{Q`^sbBQaafoQ;I47~5B~sKoy5^$Tb;*$r+iS|!U(a{b;f;t#U!pNJx4GY z!9D)~QYk$FXhvA0oSbulezemB?Wqf%6}_+rwIg0txf@D%4UO{jBj2?GngbzaB%XWK zT$IOo$EJGqq?N>2l0xI<#yPgu6C~c_3!CZCt~e#4?oPpjBW=ep-8?<5}8i~ecp3cOIHyKu>g(^DO^eb z2k|#k&*W+gLmqSlD)LWJ?^2$nScA_A*n8*JrOwQ^3-mRtbUj;D!fEz*60?k{NLhzp z^O}CqC95hl8$CBd{hxewukCw%IpRX!F_$QRO8WC$^29{mI97WGk^3BKmkg8Znvz?f zOg zG;2`U#_1yrezk+B`<)7mQQpNIcHk|fQNp+!MuA82tlp-HSP0y5-0?>+)}pA|HuKJZ zc=V@hm9WMbCmrcDOCARq?M}raAPLSoW|}5WTqw~#wHyi2- zM>%^Q$yqw`aA_iJQosN=uWGokX5FU*IOer%#j72rpRZkLI)oQC>{TR0e1p#ABxHIV ziYe&HsPxeN-1rmm5B?Tsgl#pugPZ7=?Du?veAF1+ano?;kzBaie6H*I-1IP&d6m0p zdk8(pPUg7I;oy=@8;Fsyk~{u?wN|nue!<+3YEuElbBti|!KZO0alt_2v7xe>9!Mh# z)Z_|RGPa{Uv64WlF2ce|TzYZ&(W7A9D$0Ei6*5;fqbomC@_*vjgeCAlh%Y=hb&(G; zTe0Y4Zb1jXU*}hbsb^z6MJpUH!QX;*{{R;JLoUDKi1%oEcHG2si6uXEayW<7kT`YQf^U37b zDbZlbew}}v0s+roYDES`GDq+R1pr144tp8^QOC>Pkx2&Z4k?L_5^d-++LKohG^ZT( zrjbiQoBE#JX#tx%o}AT{V=_yg{{W={aaUCusiwYO3S2 zAl?@TttQ4KvW6mmge{1(k(TtL<12vDvEv@U(wLLEbw<(7Ii+z}wHkLldwz7A8)UK& zy?P2lB91~%I*~xFV^$1``KQh|Gj?Gn3o$pd?G4 zIQ1E%!7&xExyF43HaMZ#>M4#u#~l4JNP!%KoxQqH1&GMq$3S{i&tN}Jz80d`cuz@( z7{#1T$Ez;m`kKlIEpsEqn&Mg`0>BV6*18ODbK$>#ieD2g^w{NTB>;`wZmp@t#xg%T zJYnLy&lpb28!)!d13a7_ze>~EBsy`sAEoFg3%N#qorg;2saEHFX&$Ab_;Ae2wRt3V z^{!VY&Wd#Hx$GKVlOCFzW5)ggKhCsB)#z=E5tG}!XiG$=1QA(@E0Ku#+&!~Za%8MH zw;88@V?hoNPP7m-kK=KS&;pVaayS&2n4yagPUe`>xgb%J0l^rk2CN}bj(sY?u_EAt zDhi0yBOG&snq`ykR0BPS^Q1~v7_$I#CrUX+*&9ku7WOLGlISJb|*wPmvNI1bGngRofsz~6)Rknwewm`}BJ_gO!CV`JN)u4~xb`%}T* zBDU3q-kod@nPDM`vO4PGQ$nVO~gwkc=?BFZHdO_9oK|(i_w`N!*<$n zTE=!VbW_~rZ~ho*^O8Xep2TLKwPq8;C$Y(1d?W-PDF9MBp~qT((m0D5OAK*0zYMNz zept+bdF6)Ue;R*Sxu4aVIXV0fehE}i;0*FWuBBBpa?XoKJvWE0A`RzTwgBXVkyFoh z3N|riu>J=mG04Y!){0gks}-ZOWM7-+U_YH4!rY0`!+_xA_4dVFWE{2_>PO5*2`7p! zG{qn~?Z!Y9CJGmSAde-Edjc_6dl|GYK+icniKTLgyv%^7zCS@m#!*_5CI;*Tv25euq0!XjN|m8BG^o*IXLT{XeE(BAdqAnhhlTn{ECoo zLdYbx3G0)8R#Y`a;BtC#k@?cNY*|bmzbWW{3KJ!lV^X6l)b;k_lM!HKp13_T_|(bR z5+1G`7{TQ5eX~&BrKMrk1(7kFFPkQQo4EZdlIlK(Pi#v76Crz^^)FLP8>-?Vw3D93 zp`qBUE_}j4KPcdl`Bb1tdd-C+s~(@yrdkbZW=`dQo6KyL9S6M#Oom3t$5MF%=~ifo zP#%4{)IG^atvdwB9eaIqRxYMAPG-B2oM0?#86)53KhC9^HKD)Z30`<1)MO{-eeA=u zVe$OA{Ay8}(CoA=5?>Ks?TvqOq_mCbKN__n`EGGP9|~FC+1S7UNTNVHbqAWpL4Jp* zd?vep2g9XT{#mn(d$0t5I`Zl*S?SSMN2p16_Gn&H{4w_S6jF`aGpy}@L*d_va~r$a zC6M)E&7V*HwS6@eXsaFtz4z*Tg|ExHN0sWl1ojpJfM9E|3<=b_gXa~-hm z8c~m2eznf_Iufz!e-G@h{6{DJBR&(;r@y>^e3eL489r>DnI4tp;vuQOHIeksgrZ#& zK(W!a2QghFEek~W4ZURUI}wWUDzACJQ9$eAo;?(QZ(Sy0v<1`=!F{A4{7I>$K8Es* zk>XKmw{p!P<(^k&Vh1IivU#sfy%IdeuOZ$E)TY!f^|qXu7i?;*dB)ZNu zZL2}>-^8#R^cNak^j=)Mxl#!v5P8W5`q!IhD6`R{SCV#r)~BdzUJuhXZJs6Yyvq!( z72}c|Z9T?u>BVtIqlS$1lvK4mN5-~)_wpYvShYlBj7X!GAYc-G$6EAo)lVNEht}to z$)v{2UOq;7=cwlu-+S(O?gqDov_z9ri7^m-rY&^qbRIF z$8nx3kw($EoKf=+#7#LZuBL$o1UC~#2e#vbU6dtrwi_N%aM>PG^aro4b~R#u*K(3B zPs`ebjT;`HH(n}}xi3M?q~POG0^j>tE27jf;UYL zp$oP)78`?i40itjT+_s_cIO&@e)31!`Z%cm^+C0i$!SeR9?vT8hTi`w2(d zq5*M@%k7S$r;rL3>KrnE$NkaIde+8m7T!FDatY*QpVJg<9JWL(q@0j&Pe6FaYe<=V zLM)zNC;aFC0If>k<6_4Af_+CB^{aY`AsQq+w*jf_1V9w|y2f&UI(*j#g;fvG=Ld?k z^d+JNMi~vqJ$|()NR^7?o}GuaSlSrjKyAD)Z^D6CMjQ>FLq+s|5+HQpM&Jl1ufP8Q zs)W&?@Zq zy&cPlLFu0S9>%1XsXTF(`@;tmn<^-pNJ=R0&lPdlhOEGizTTdd4AbI8cUEDM$s}fk zB#81rt7lye6m1e;fabH;h;Nyw!Z zhOEd)0dnAE@!F+Gq^?*7MqV(ajsfqQ9ZLkFbUqpIey`(e(W7{6KGAcqvHs{)I3)UW z#ZR>AZBC1Sm5-tHKiLPx7r;Kbdv9pGe5y$`%{*U2sbF{9d0*gvwh9w47(94T(fX$QboBTpAZUh)_BF z>0Baze0lp$O%27(jfK8V+)y$|2T{5A0r(2eD^X3Rtb76DFlKY*x(&BEqESLbtTt_E;x=@i62AUeGNGx;&{HdrZ$~*Eu^EBVn15AJqXyv zY-fSfnhHat1Q7oKj%vZ05==D+BZ>b2*F?L2a(j;7=i0LBH1sF%{k(~M5Du!ssk;-o z9=8dG<>KpukELf2xsnvQ3WFr@03A(ekefUEuK;+5L4|HL3nob2L-0W$5s{HvCQE8a zyQ65StUNQ_xJYgD=JU?dcVp|;swRC8y+32mh@(dFJpLBClVy&vpDce0$h@!ftt&@= zo*&m?;U~#EAE~Ry72>@#J;4S#XOmQbLJIUA)HX^&j(T&}q_M%ajjB3OC7~*wNfby= zQNw}Lr+S3J#=}9!%17PmYg96II9wiZF+n>LADgK4G@CP%5g2yh3P?zt6OIj7599Tq zEpk;{@=pZPBW5^oIODxkM=eblz5Q!{LOF}7qk=kirEwP&Z5iO6Dn#`pUb*c-Ef!I+ zp2mj4_ACH?ht`3gJbuzY4co@v9es07P1>%Sg_ju1N7o;LKdoZ@*wXr%>QdV^Vi)Q!=d zIoY2o>skZpSF`92+qUj|Q|h@Oui!xy$ri5B*p>A-S0B4j0RR)ndQ7Ivz8}=u%H?5B z12-O-&23Iv8Pq!lwY9jNo;-zfl07QYv7DLcUk*HCejn>GN;%V~{mlIK$k=}ZNUFCm zMe;QJpMOPl6!ERhExIRA=)<9Z2a#TUqsq@x66PKy4UA_7q^l1MGsmT9OAs7!+~*Yl zg=Rbt){w>-4+?NPP&*5p_sPaaC?6>1AkuEcFwb$?s1gEmkw~i%O&|krLUTcB8B-I^ zKhG2cGbM1O)m)aYQhSdxfl_FZP2@ck(wvKN;)37nDo(1e)6{{V&nFG0}0e<))V z$Qa;riV^}xe2yqWkg+LV2U;5l=v-Vl1dgB1ixVbUL&keli93XV5$&1^84P(j1BwN? zsS=!1DWgI>0kn0^2?|m#Mt}j6$n8m!%1_f6=qV?15rg6{55eMVHnN!Plw`#y>W$Ms z%7(46qF3DUI6P&kcq-%jAH;E#e;|O8ob8Z$gX>W0cQTy==syblOM-Qe_oI=Yy_#kY zHa>yy*Nv^F`5DF!PH2j-uF>iCx6xgoXqX(2THBuL#?h6}n*RW3?QJ|aq)C5p!BLZr zaC3vwxoO4oSh-mrCwvOhCxcGA@fG@&lTn*`0zZLA2lcN;q`lP>o}TTVf7(Xl^K~6- z19CHx0bYWDLa-8KFB#)B647)3yf@VU07?SHo4Ch*w5~e};1Ew_G;iV~{{YoP2$s;`fBkd(s##G#NxTcGAn=}@Fh4KZBIoG1{*{b(IdLk-$UhxE zE?W3 zs*DvKf0yH2vZ-^bohu%vqxf971(ymbYa^yA$D~?m@meTYhdt|Pf5yP(TLV1w%~>tn zaxdjcj^v>;$LCTdpxw9}cKvF`-No8C-9UzCJap@d0Aq~s$G#{Pt{B`12kT6>tV%&a zv~@gYlVK8Z@*T#Ymd4~TAfLzHn;b`pdE=qYA+$5UCyta3;uD?^B7jVg^v~fz42=Az zVdxD2mB_yM$*g#HtD%!}0pi1BfJ$+=1yp6O3%ZJoKgX5%=b!o7v_7!b#%KbJ~nNQtH6e4KauDaBow)SoK3 zf64EdZbX#lGqLhMt8sCt7rVM((?8E65y2;u{Of{p<~=w=l~~SWi12zS$jw2tU5Z{d*Da5Q zBkKHV&jEX~(q1GIi%AJVs{q7_eg`D#lRVr7hBPB1;YQjJvZiR5U%W1zhM05qJw zKm*#edZ0}De+$AIBU=9eq+Bi!Ks~swc`}oCKCSp+;d9~%qgGO44fFGXf!4XD?=!A3 zvbpwsrMz|!rL+SPMxX)ot}iq7TXeys-ukh)ube>d9*SWf8_NQEm*Wp)1SP0lg$??4-#Y^+3(t< zX!|?h{*iCsKMCIW{{UCSa=dP1&-ZbGj`=45el;oGmws5>`Ibw`wTrp6JGRW%5*Z&o zK|Kf14l71;rgZvcw&D*z(z0yQ3j3a&quQ3@K6?IR6%s8Y=??|l3G5vTV8L*bGafL7 ze@H*5teUy2(HM|;^HlJ{+iQADfi2y|#L}tG9a;Jj>5i4ORguo6W9#n${6Mhr?U1{& zD;>%x^Wi6zBhVh*YSF5d&iEYstHSfmQE7{ia1`)5P$#(Yz#vdl@&#klzxYr^wH1NL zK9vhXn48G~vGx2a!Lf7BbCcSECvgr(e-r~^l{mmS;-!oWZ~Qt`+!mvo8Nuu8LMxbV zN`g-u_N@dw91QiqIjq|djO5^_>r{Yw6_9x;nV@aCH~v8W#*6m3z#+{b`Fooh~Ke>NtX zN5nTj8OpOos%cP74o}XmRh4tc1HEg^aY~sqKN7qld&R;{XCde28BvdVeB^s0RtxO| zSQyhaC?u1*ZX3AoR-{X&T>i$IMDt*1ipS`)bWdz1_eIt-3afBF2Xt|uJ|#Ti>{i}NYLrrDi_G}tF^P&3UkTCpOr zkODdHK*Z$^0O)Z*a)D9v1CqUS>6!={`UOsz^>nh<4))1f5P4i)-qfOqY|@q zXWBO(&orW}BHPFqka}aEY8tsHtj-@BzUq!BNJ2zGp4pL8CzSOpTUdm z+Fqe;pSb8i_F?}3)~`PiqdVwI>c_13lHf;axk>%xYP-FN6?kpMUsQZ)@eq)$FynCx z{x$S;HauyqPmp!#2@d_SS0h?z^Xs4(vW{?gu374J!5DLMf5P?P9M?7UXGOF-?}k%& z!qZraZ-z5ZZ>gLood;9|o~Hy?nTy0mlzro>l?hbX`}@K_0-}%X+V_udCcV|8JJ~lK zqEd2OuT%7|kgt!sc0H^4@0K#Er2%?-$*j5HVpLWN&b|oy$(s1u5Q7)RvhKjNTs-V)&20}7Htmjj1JsW7+NE$z$;XsmKK}sD zwAks~aEojrUhKpH>HzEd(1zZo=82)+YRp>5A=(B*9B%J{?@7+g%2HbjbcVfg4VcZt zX9zo<^rulHO-!9bPP)?N`#zx)!!M(ZQ;gKMe;tS*iKi@}oi;^^ z?Mkz*@2K^zm@}HDr&Hn6&beVuIYrphJ_xg;QDdYsg?b4aTh{{RwvBL|PPm#|<3 zlDM>w%wswMfkmG7JKP90AYPs84c0`*K3ye++^> zdQyrl%EKNV*z(RjYV|T~svUp=PB(LtQ*jnH9ySb&AJVBZ)40_E$L|3d$QbR&%{|B% z$XkvDGz_UR$jb~J!2Y*KMeCu;IdmNaCX5yb*xlvC84tQkHy(C`enj>_o=yDw$#s((T_|VuTVzRhK*&}2QK=$^fa30qYBkfczo}I>NITaX@3;9UTm#}o_ zj-AaXRU-KtDow1#18lpwe~nu|!^r@5z^t81>{5Y2wYVm691`yY_5^WKZF9uW zq20@-`2uE8q_doiI1DNyE0&@~r}&zC)nz+k10Qf>@HJN@Els-%sTN#Zv2{JoDHfoa z^q;{Gh-2ZVy&e3@ro#1niOw?08|KLTMQ1InYffB@{ZX~Jg8tque?r1RHMHm?jlsxe zUx(u~xRA=&{e)bzzginYa!K>5F3^zC6wLT4MeIPd=e)~mR4Sb(lZ0pRqg zOlm_ylY|^+oY7-M>=+{gnA5lgJpCz1Ijx{=!Sx@dM=08`!g&2nJ6IF32?Ua(=qaQR zQWF~z7@x1@PQ<+ie>g4Faa2QNf|Jm3K;o`SoS%GiQq4;P*F1EoYU57BKKR@?%~grL z#|6p9Y7|AV@G;k*sg{FGTou6o06vtBHzO^y{{Sik-G(#gAaw6ifogaU#!rp5-UqjB z3q*96TbW46IS}^e9s2%NP=_-)>sI90`3p$ZE_K+~TGd?5e{v<3NgbG+l?8@#?~1v@ zl){BaJKXVIUNg9mInH?LnwY&yYUh+|5dh7Rj^B?p)faOKBa*hA^sCr)6z9s2ZXGg> z!w>2`>ttne=f#~V8s;w$S&!V#qo+;)=Atgn!>G1ri!%(6y=zE?$WBg2YHvX?kv7KM zX%yCnqj+$}e{{RVgtUOt)rgWV- zw;&)9B;Ue0>x0kXT`454%qq*F^(V#KLYGloDZ)z*-Mzk2MltD%!ZN!vi)i@&0K~d< zP)#hhz#~2js2B$aiq$h)=way^)z63Tt+kCbnC>lRe@RdrjzQ`4$6DSp(#Jl|=kB+| zUx_+DkF-5ERJXpiTkETJk>E0qFtFg@9(w*cuQI$fc0I}!Q;NT1(ZU1B{{SYrlQ&wD z3;~ADaxe$;p|X~PG0q1-X@Ml%dr*Oh2t%JvDLq7q3EFTvQi>ZKIcy%LnK2M27*B&U5}Xss$qI zVn4h))R56`Ho)3_aZC$q{U`$3s2L6a0PCblVF2szNue}IFh>^H)+)c~QoAz=o*a27!kH}YC zrOJ;vM^nYVAV4)(noTY|-&#u3iC3JCthx8K?C-CF*tBEaK*3)j= ze^Co8BMt^69*3rWnf`UP?q=d_D2Dzo-Ab&a3=n(L=SiJ1!O6utA6@(j@!XfTui*V% z^Lc1DK*Z!cXQ=-GfS=|oI?%qTbR^>WU*dfc6OuOr(z%YrH6<(ZsZLA5M~_@`QoTcL60uX5s!Mb z?nzczhBtGbw5({I%&D$D{spr(22%=l*wR<0r`HIpe ze{^&2KnSCu`kJ8Fjs9W}tt;3~m!M7t>KRroB5vfK)LhM?%5XV8)G&&$ANG12f7B#X z)Ug=po|MLsc{=>uQFbS(VLoQ#rCA+IvGddTy8BcV(Ek84o_Hs<8p&b*StFId*JJqp4c7UQxmv*Rxapn3P(R@ z@dw4e8a_?z666!XQ^(_qr87BEe@CWxfA*E}29YB9cG63?g1b*Yr8zs9do-DmtXz28 z<9@I9uNKJG{u_!-(7?kP9AF#(GhGxR%d6Zf9`9#s4TK40X1gMZLZAcqMQJB-#x_NO zyS};pz3NG1YPkb%UIG5J1zZ`Az1i?VSywbIvNg+Q3qTM&nSKJ=M9qktT8dH(?QP?MwS_~G02j<2xR;k!7ZLDAb6m0|2wo1Zim3RS9`R1;~ zjU?{h*pr$HLV_`a*S#V`fPMPYMUKa8`%o(iK^*%Z^ZHUGVO*Rqe^3noF{2!xr{*b? ziAM|Vj%zVCIgT)TW32#&mMx47bBeJOj(=K!6K_8^N(XVc>fe<&pyRNB=jA+8+*=NA zI`*Q#hV0&R?holwR>X~ha(L~<1UGQte7?EQ;Z%iTxC7ppy`eIdQMvl!h9VbZ_m6y$ ziU5Rl-Rs2zh%qabe-s3SU_s7#?Lg82o!RvttrsMbfh4U1k(H{-Be!sRk%g_P92n`@ zTl(sG^4jhtSYd$Y>T97$^Aa=ft^Ama`(rq&Lr273H`d?8J|ufYC9P~!;0~M5_*PZt z(H)ptS9dUP3~RDBC+1<1?bf*#$8Gu?=C7#7V{0YV$3+}xf4>}6MG2l4uj-N%YXX0N zG4pO1e-7`ugV|RA`;%LwLy+ATB{C{XGMW6iu4=UH?;~hbzK5tbh4z0c_CNJfoCO1+ z{{SYHEJrf26)Ez)4_NTVocHe>J4p;Sl087Esivlsp>y;nz@8RQ4e60Y7ZbPz@-T7K zQ>7lP-lMjMe{}x^kG#hQ>cR92^3Fl}&|l03hcX zs!U|V9QqD_Dj0+y=Z|cDbtni%56XIh(0hu|V^g3yw)8`LM2FIQgT}WvmE{- ziZ^C$e_0;O;;W&g=ok0OcI~%i1p2?r{cCz=GH2!Yif-OPA(M}phtv-BGThz_`E$fl z{jT{SPVJA@vZ(YrsP{Tw73&e%D_KTxupmHv!t?o>&Kefpr_5TWt2Ol7%N?u09jfkX zkwIq;b0F>3i;2XNY1A$d<+Dhnb^Zy^Ch>Nue{H5B@g$0*?HtOcd^?Q^H1ahok^vP_W$KIvN z;NfO>x>c|6pyc(L|zWE>tT20KLvWy=tKE zf2oy5dB=${3)<=VBglalKKKlOI_T(R$hQh3NaLBMg7kVkxq5+T&( zXWsq-@$Hw6tWtPeW%{V|pd@Yw9FgtCR>wqVeNOWr{s4ZI8WV2MUYHp)02ku}w|Y-P zd53ObIT#20DUWe*LFv$A>zV@E5%Nj?e_u)hIud7bA!RV&? zNe=}r9~n zB|8@yY3g@6ckLqu;Yj>LqN@erf7${DMOU`A#d`~$ho}5b@NbAD320`qBxe!;N9j#g zOv+SRI~Xl=?Lhwk#G?KQ!yEuk)5mj~uV`lA(KP-OzEtytxODYG8=u0og-&BR!p1bZ zU)ft^sPXOVl|6kcOOTOXNEdEnBO;WFMtfRHgK#-h>-DE{B#NP5aPu;xe{w+`1vbW_ zF`p-uAdZ95l8`h+z$nkQDu|M>)KW*xbByso(>HWjh0LuEI2aYQB1Ku*7bK1-n6L1u zBk;{_W1Tye)cMf)FVRL<=y94w?p0PR!tsm`ty&~<;ZxN1rpJ8=_wM-M z`5C0g6l3_P>Q{Po#g>7DzL`W(IXoeAg2z2JjG9drV|+RId8haW2`&--)2rO!u5O&< zvF-;<4AM%*?p(*9PQ-kwdC1B1{{Z#UW=&YE?~Tj((y=3QI(HeW0qK>?k$^z|036b| z5;-f9fD!NSNt!5+f3mb|nN^TtG4u1#fN_EN)>7PXTAaP!8rx9|kC|uNj`#%CUd1nY z*!ol9UxzkH{kL+QMvAcm(4Lvcu&JExTq*LNnRO?fJ4yT_f$5Kbb3)i9sqs(8>?XL; zFAIo(K7-0r{Ocx6RoQ>w)}SJ7PTo!s+pMP?{lm}m6~|Xof2xFR&uH-#(0gd32Y~{& zKBNrOp`#sb&y@ZsWC0rEXvsMBJlD|S_B@I1e21?n2WjARBh*#YHKuvh*z~~v064B{ zhg1z833yuL#u~M*fn&s%3bh92=f6f5U(!LiNifJoiNHXGo3|e+W43$mia^wv8TGsIJGx;wrk6zkl;H z_5C(IDI||mNo^pvP}0wWLWWYx6nd80zl}JyorO(me|dky>-LXOzqP(7$qJ-kpySL@ zwr69!9DBBr;4-G^(tZPk1*9d4XT@8x7|k4`CzD;GxM%621nsug)Bs0Q--Y> zTIZTxeX==4mCz)wO!7$RFl)XuJi3pgJ!ZiZN75mc8|IZmFzyND{#_|I%yT!Xg``1q zsm_vG#!O*??<0)lVCJ%^K8H*x^<=*twA*#nf9_c}WI+Ncu=+j!0Yie?rU;~ga8=uEK*7rJTn|el{H;5#P#2Dd@B<0T- z8Sm9YPeAy0W8wb*4&Pl^c&Eya zfBsiVZ5@tz&m-|a*0^!a^6C9vxt#fMp*ek`$o~KyfBY0A zk`EYZsCN=l?NoL=tNwf+sH@mlx$<^{Yz~!SFwO zQ~}BAR=l#OP8l=lS|WEb;JMCscU&LoRF%eSSX=@7sSiQ&pLz@>b9IoiZ6}e}KT1iL z5Vyk1wjuKEQ~I7OM96B#UlhBCf8GNCXEmTX5zB4}FBmvIGx^YF%!xAmWP!lP(xnXo z?j!@#+w=Z)cd(?8-zc!c{op_z^wT7JZvOyQ#AF@+b0YUFcFNsVV18SXn! zgxH>D0S(jiplU$)C!YTRcORVs+>9cX=chm9P+K7L2*Pyq{P9rGCM3+PL~{YRpsVF3 za^*ZT;_b8B8$>*)XCR*2e}LokuR64CBh*RCQ z(oE}&yH^LjOCrOT=XP*%4>XWo9rWGfRg&|6jBMsf8oU^R>q2*%&B}^ zqDbTHv$e?pZVT9o&Q*(8dyqxr7_N&)V*nmngOkYTAb&2E9?-bZ?sJ;|0E;y^n5Ddn z7$h=~yz(nQXxXo@Q9RoJ09U`hVs5TvAdYavWarY8chos7SJPaH`EuC@l5%AXfI!f6mt(6~%ft-CQe-KkVXP!T_U5S?0aDq= zLH_{iqhdoH{j-{qc}T(9Fg~>IT2=v{;p%AvBn|musGE-4gZ!#n86aKXfE3dqy9nou zbQq!PR7m;3f2`WEWFwLQ1d@29fcf9!H^$p<1H{?~hu_ZDq!@M>+X!R$^IB7;XYW&>wGzWZS5pi#?@>b^~8!-`PMjy zoj7@PFg3eY0FPdBefX|uv#scP2CHfrivjD3>WRxVe{nk2jWy1jE$xBC@XCOXRbYRp ztrUoHxq3N=iM%S%5t-m(I^>2J{$h!4HL9`m{G-T~lpKIa;^SB()dgU)#TsIWGA1?Gt_iZAT6tvF`l@zOAH(>+fefXSs!8ktp{kJNty_+r<= znnkaNe{7LeEzoWtedoZ*KgzDI$0hrmuf>f!&$EK_8S>a1(NACNUB)z)OYl# zkzhzUKAk=4k(wG?%p}tW#u2-(Tu}4^ZNU9Wq?s>4na&C8=}fXx<-SmQjwvN!1F#1m zlbT|%;&1@(j&s_YGbBt&jQ8*PQhEuNw{ekFMaN@|o}QEgM4#;g&L{?H2Hk=W6`~=Q zf1-2Me;m`W($KXN0gr#_QY1>JBRJ$9wO11@BcA>H(O@j+9S;Jekw!@Lrcvf!6|CBQ zE=$H-t-6U-$5kqM{0fu#R#BCh>MO>_h1%m@64q28?y#2JDzg?N^<1x|0$Js95=8v2{ zB52b1Gf^6iqxpJ#vU#cx-B!ol{CZc^waKCLjq@{tmr{6dX1jv}b2dTfLvUC>4>=`X=*g5`cWyM<%+gwt#%|bRK0;4YK_8WLVQ0>)&K&Ot6xB%Y{{Rl|ev^26 zTZ3QI?e&XB1!r84daDiyKSNp7hbuhDOPO5TEyhMMSiMS;u-H!Hp4h7tNq2W&*0XvS zxyty*#rk)FbmrEz=h(d=h;q`le?IDpad#o;WB3I%ZAvLTQQ}h3++SeDZTv9CIRK8C zB$4qi2{Q6LV#LNeO z%ie*cHJb#ScgTbjLIZb}&b5o@o?@7{h$4$?2MQe-qSalm$>I zmV$scR0Bll<#L!LgG^Q|8L$Qh049MX3UQwOsW8~J+m7`qm3x*EumH|YRfN%DAO8T? zK_#?*UjG2nn=NW9HyHhCM25gVIrOSvkr8vj9S$l$ls6-9daD(C44g-E^3NK${{U!a zv-W6rDlVUC2@f0*gX}7le^N7%KJB^31JG86Z&B+e20GDu1(@L3C$?%>TEw7WZ5?~j zaS~^+C)Sv(NUOjH>&+{T3Ro}7I@FbG6*RH7$5`F zp~XrDhi&r)8=g%_IFURNI|(I?ScBDuaas$Mlm#S>p-)}~X5tBtO!fNGK*SLQ993Kd zQrofs$E_l^8N6h%_x(*-DO_O$kXNbo{AdBkj-r?(9dZv(T9u&WJ$jAZeZG{W#}Z#a z4^h^d4pHm}E#DO+e~>a~gW9U)BnJRtx(XO2a(ri=-Remp3Qu0X^bIXXCXD+xj5&g1jHDYB=#IoApqJAKB9t>4!^Ew861ZI=Y#D*e=UvoJf5f8gix$c<4hzj zSgBsUO$%~UGIbO$u}>?5&u>9pDOmDxGUkz*Et{^>`F5+Z$t}-5@%8Z1w7G5zauA%3 zIjtgx6Z7Lik*)>Sr!HBpt|VZ8*iuIo!&Tj$wHVqY^U5V>{^}?MpHt81DGi=U;+5t`JMMud}-`3}(sq@1B0M^F&@hpB1wn1pQ)LfGu zFhYPA=0A;k6shw)PCC^&7KhiL2tF}E<49uBb?5T+e}qK~BW(*X`@Y=&0F7-@k0}(Z z^X_}eB@RgJE1jJvR>nx{ocv{XBN$nXqbNLQE@lz_CsKTPY=gaz6zzeNX=w3%KwHriI zG8{86eEn-BT|JIz!26%!UxVTBPLB?aYTaGte=VGnTLb?9Wv-}gbDp7R<9@I99}WGI z5xea&g#Q4(M*jfmT?w4qv-4ZUnt=W0<{M zA_fm2#z(2o<;80Sp_NB-iSY!+>ruFqe>q<yjNBI?LSjJ0J zq0lw^-woa-tE4}daTy&yh-aY{GBk{=eckZy;w7Jstuq@4wFrmrVQxBcmGuXTOH-;9 z4@JU|a(E+}W`y|TAag_25F(w~Q_oMrlVvAzB0~Cxq^?@m=42}Hl8mRSoObrAOim_6f4`1({RIr# zW~p%#0noNb9@V63Sjo~%>ojlLW5wEXtXIO?_A%Gai!6T})%#XM!>)&-*#6S`KB0y2 zHjZI@f?C+%aqU`0w{s_keGf^}z9@V=@f!gKqa}=|7)j9M^Q}FyF_j5K@2vEVKT=OW zNYyOvQ1lzd>Kw$N$gX@5e|{C8?50Tb^15;kev~PPAi(<0h||Nm$*}^qI89klm-3AyB}A4pfW|e>&=;sn1qM8#oPx18F%U^{$f? z>^WGIxN=5#{*?_HA+iEndlDD0`e!uBlPsVoX^*KKP*O#eUBI%Ae}7X=6R_yiCO7uL z`eu<=4aD%g0CDX~_9d0xLK~Bjxaabu*(r}X+m;{Q~va0T4IL~8KaA=s^I}N-A91rVFD~Xj_-DJ31raP4pm!EP!!nNcT%ki)z5_G^qDf1$U)?`@5K945cMis z85uv;fF6zxG5kX-K;scs87`ztWEpp5PzR|!YFn{VJMR?5e;$V<7SP~qvQ5A5Go8fa z>T5e)++4?#S)rcK8UFxY>c3s`D)IO=DVozh-_osC-WQ55kynKS&~aHKVkS>0`9$t2 z2`ASzqhz*xWBWiRb-;1*?TeHC<|`>X8O7>y9}hJj?EAUh*do2OfRn)f5&`^0a#T9t z?0dX-e{Hu$eEElGRK`2)m@x<&`6 z{{Zz?wGC-AfVf@VM?I^Kqp{l+bM7D6li|SAAU-tJP>YL|D+;oJRXZQVWd1erIo3Cs z@~`W2=rZgzmEZNT^)|n$#|pHg=JMCe2eS};ezo&xfA*oF=KlZ^^$k-*&<>%eTZ^lf zaK27X0B}J(b>|h|mnA7*`sj0JFWtBG)cH47_?Pi7#45tt%k1$;iUE!zoG0@Y^)Q-C z$Spy+I|2+bJLPbWBSsf^(v#fvE+JiNp)+2q=i&$AD~`8 zop!xZgIuSqcn;xV)ikr_2>i>)i#BnztfTY-xN&s(*T~-t(v|*a=p>q!k8LFI-P~Kk zb>c?1XdrPtvckGal;a&J9 zx|`)VDXo5IsrZjw({1hTG#?E~<`pX#EAoe7kXYm1xnP@Zo%QCDOVIQ0j}e&~&f-jy ze=d@TKBhKh$Ko zD#8wCF}YI1sZr_anp0Omspw+r8jLsLe>GcXad8`}rsgD($<9wg4QDi(voxc4OGEB> zr#i2P?X|g;R%xM0cN5p;#{=p=TKTw3mToJh&!MRc1_vS!A1 zmK=UPe=7CxH6QizJiJ{yBjn9bL46wTTR9F)Y({-Y{{ULPnuM;87No7A(P*kef35~_ zc|Xd%Do)3rSs!M6CJfG}7+ep)fNKnPvHrZw@TsXEa_AE%ursFuC20utz#yN)74vl# zr@tLh@o&UUXZvSZy0}xvm_P(};-E}He>_*APgHTw zbLuS$?n#ku7;VVqMMXto=_?(xf4W{n^LP2U_N{{IX)zQ(dtnDGk$oA2Z>`(syTD9E+_>HT3g2^R=^&@hebt0`IQ!@1=GQk^k zXu!|V^)*6^yEybI9H4>0;PFW^%kes)<#IU4`uF_lrE@7AG!qFBAQ>l+e`@(b7T`tR zNC)O4ACRFFGo-fM2@Eo$Y2)8Le;Uy%kj|$~iW{;bn~-=OqqPkY%w}tz9&J6m=t*eX zf$d2ZYaE)Mc|9^eDxzJ%qyzxRZaEnCs<{&!e*sg4VIa@>88x615x0VVq|)UQ1TUiogUp2c~F<*)q?!=Ep%+jMk%=uFx1{`qc@dH$)iO z(v^o{u1fLSILM?T7a_h*Mh{+Cp5J&jW+IQ%c-OTl8U*;K@|$RE}a&Re^Bv_g^H6s&&`rHFFB}{ zRCGp($zA+Kw*LT^e>i1xj1uH=^sJ>=xX?#EdGQlc1Vw185XWBp)T)ldbkoq~FFaGL zUvWLtfJfb4l?~j|F}8;}B(g|%%IwY0EKM|0RyMplH>x zHF+L|qFgB0=){a|+v$@^rpA=rneHA3f9$)Tw(0HVvdWU7AHu_~KOla!l(sg5*5~Q( zhc&4DNv2xse{d0th{1IooPFSb8t0ljRIYCIlTFC-J5=u*UWr)Dn=)oQB|J zjEZQx4DZ4GDX_4w(~n9>NNT7oNjzh(;Z!y(`+;JfB``OWhWiD?DcQ*{!8?>Z;5E`Wn(K$&@OD6ajxvaY^ zJzq$?f>kVIQ7Qm&hEtF6sBt11GvTdv%_O;wDF$;WQaX3RqDw=vn?6CiwDMx3IoPe7FUEgc1#Fv{{>auaW%|>EnL)8e+qhx4z)yBoe#=!ocBGcA(lfN@JC8uSPD)@ zy#lc+w&9+hoYN$oSh2u8N9&qImp6leM@j{7mN@5)t*#V2QYlAM+%UoY4JNcHJ0Bc) z_rmY+k6DAnFrjY>+&K)xlLV6WAMTP5<}1#{(^F}5(AJ;s{p5PZmFyQv4YZ<2f1D32 zj)x$TkF9+k8kZyzTUmZbgNdl>O}FRyoCl7yXuMUXzL~)<8F=&k;5RA!#YK2sdJ2@U zq4E?_NdmpK-aglF^2)u{fj|DN)^K-5%&D=bjJO=&e<4P~I^7#p8ojX6ZV_60Q|3jx z_<%X%++*~rarTQ-qYsOg8QwNDf9;`x11OC{G>ai4jJl~&`3kylkrxI zTaxC}P|>aqOcEr>5BFpQAIOj8OBEZW%&;@vKVQiDILKJ>TroT5NUlKsblb3^ai0)A zBWWKD^rzQ#`BXSkVS_(3j0fkAm6L8;6y&0Or|^!`S@{0|;we5Tc-dKWe;X-}_I

    tYq$V#a}`jMj22r!sTLY;o<1X_ipfN#h*QwG$R7*kt#|dSXnBsL3XiklGxroQgSw zkux`6#)}k6SPqoHsAUI_e@Y3tIO+1zu|k%mp|3Gge@Yv$Bspa`&uT6vi)%hH z&lNk0D7LcTWE!ghD!##k-hgPjlI=TsjM8jz6v^`S>HaiCQ&%G1MtT1LKGfP0Ru{}Y z2T$;-uvl=Ek;O=fgPihsqRe*~Wi5_skuqWcNaMXxHWxjB=b8z)f2u(H-6$JHv}HI7 zI2p;Jz>zADM(t^iawC)1?}13mFf2B}`ZoiK=-hEG6f8<3~C9q9?Xj$Uz| zGwVPKgCiLCH1%~9{Wd8u1QfLQk9sMW^k%hq9*Vdb3h}>f%u6g=W8&@1Y zZk_n80>ZamYEUI%!3gAbH8N#1J1y8_9cWBRSWvr8-^|e2Ee_g8$~w|Wy^tPx^c2Xr z+-HpAGy>2HpX>c73yntSj``>4Xa_5bBG;xQgAt9VjOLM`aJUQ3dHrYsd0~OY1k@lW z1P1)+*pMWENa#f(qC0j5IX(XXF+ksN$vpasXv$8=?L0r>`&*i$6?djx+1KOYu%p_{?*HErucg9>rP;idJwCE zKQmtD9-WUeyslf)wOMr87I<8vp#>NoLC$}jbhz_qaq~5)_xHjNjIj8wDEvLIN{Oke z;y2rYe;@~@eQ}EOtI*|Vr$Z6WtoJ^HVYHsdfJfn3CUo=+XCQIXvtuO${opf^Oa|~c z11;K<0i*@SdG`0JKsb@k-^z=C{G0-LIXJ~lfRAwGu;!@%n*kj1NAfh>tQNV@&2Jo* z7UtY#eq$;B0BrvNg7Nv*XAONB%{XYJF`R);f9ABR^c+WV_=;(rA(dafoC>mJJx1I+YaNLKc2>olwsQD%HCNG&Du>!0w9B}XiWBF#i$}+rB zf5TEbpFV!l8o9BHOSV!;5y>%6UBoE;0mXG~69~ss^TXmMtRe)(#^Q1G6&%_dLOPy* z;LSbfnrpBNEKx}zKSec!pEEmRtdBYI5oCzMJA!lGoSllXz@%l#U=3#EYXoW9X!2Z) z;|esY#)jjJ6S=@uG9Epv3?od*gCe}L^z$Bf_s%_#fKbI|i^JxbS3ne`Z$%XcG}a(V&Ke-F!w z=uxqWLdQ(iJV|%`o#Cq)^$Y0>Fp32v^d}_r{cCD^nYD8c${V|QnKfhpVL_h0G2SeW zvPa!YoMY?9HB!*et&Jr(#=(M5H5-*J4Gkk(yzu?hdajW#mppjdz@A4OA7B2pR>+IA zevNoTRlCwoWACv(tS9YVJQ)c*j5ThR<&NdRz1dP$KH zgOQQf{Qm%jGRGbd6*eKrkmP~b^`!I~cOqajv|}CWk(*W?4?+e_NvdM(+km_e{=GKF zES&tKjMWLd06Y-GtpT{JwQ+%vYc%c%j2tdop$GD<1m$5E=jH4G{VD}}i|##Y!+(^1 z;C~W${A)Xv6g8M*pHozUpCNpD@h0oP?1-BJB`SI2Jxyr@a@A+Xnw;%Bn4me2kXUrB z&U2WYh_jEsoaBDAq$YAYgr01S{d3dvrk%vjlfs!zH&M8Lrbr?mfOa(ORE)czcC((N zKZR)~LuZ`I6v)8m<|p(u%RNqtV}Ii8gmleIMu(<&Wqi0EQ`e{GSlFcOWNTBjueC_V za&mD^=qudd^@+F&$gKH?V)R#YS~z<-rG$>2 zTb2G*e88f59*6N`#$F%C_Fl1Y0LRNCmt1`f3U(q?k?cAL?OWozAKmM=)_>ZBL~UZq z17fZ<>~qfwp2wote$qY})V9Uq9U@Coe~J^8EaTB|*w4$@SD}8VI*DM)5x;lI$3KljWmq_qYMycW zQn^;SBrIcny-wN_xcN)X!G8ukgWD7d)3}>UF%kj}G7tFCa#UJF<6Ymo&JR*gr6$Qp zf6Alg9k}`m7NFUkaz(&Ia6(AnHV3CTKHOBz8dFB2&6OmvY;loUs%EW@^Y)NI>B&CT zqJa~ghVCrDDaoo@3!dcYr2LQ2^&+W~XeN0Cahi*Y#+)dF0FFoklYeDczX;ey-k89t z+)WmvY>~IQ{#BbAOq`q$v2YGLo=z$et5y-DAZ=5~z|9g8kmYtGJ$X2$S1{*neAwjn z9R&oWS3fW-K*`4d6&S(mKv;70$@HX#v^uX0>9RR}QO61LE`L+~D>{t0kNAr)Yot~@ z$7v93cIr>_q_i72?SC4?%RZT82|2s9kDjCnm--59(kS~j(TIuPjiHa|as2BPTN!I; z_wyWQX6|uT%#V`)0BNgFuoys~%Z4e0Aa_ z%!Gl0PB`hsZC7&Xk^DRGgZR(H7TPX9(frRc;ea?;*OvVH53P8awkO!Z{{UUjX8}u{ z-}>l&q1rqeU7Xg@s>KSZNWzQ(fH7a3)~W3z+4WSSqZ=cg)Z5LlB>cuERwJPxHfgxo z8>1V>{ws^adVfLHZX#Jr7W+7Vx#p@fChu&I&bsp0H#>QLsN&3J?)?7%%=y+|jhD$9 z#T?>4D5FZuBlB5K2~{9%+t1d%m0{XQ`RPdJd`0n&UlI6r=fYBmq`A9j1SJRhsE{MR z2 z^qK_%@9h&ME zMog13bI))OIQ%QJo3S*`mqx#~(Da=qXjV3oTYp=brVgQl7>v6?&q2T+l|@A4U#V*T z_S)*{11TRv zkzEv*GbuKa?!OECTc>!BPmfBvmQS`?Mu;P9Z7P5dm+|Xf4mS(z=Gr}sHBNZjw&w4S zb$=zFRJrh_tO{keNT&pHcQWJ;z!P0~HDz{XifT&8@XcpMlUGUa(B;)b0y>g9*U;hW zTE~f29Z0+_rCeOLVqM6shHk@(_2E?>ZA8zs{vX>x4WuR!wn6gA>Q5ZkE-Ik#@xG_h zhC-en)qJNbC-!Wl5&iB8k@)7k8jkGsqkpQg@RU~#K6jGNah=B}Ja?{$yPT4Zk5>3$ zBExiUMnMocUt-R`(!DBcLyd0Fq_nx-L~kSl`^g~o=MDOEQBhdhn$YX5rTaUCkl_dz z`tw}v8b#QlsY&G*$5o0}$o~LkbI<2fC~0#=WAl=GM;bM>(Bw=kA}B|wh`2bazJG;1 zL?OgUG2&IhZM`#&)vQUi#~ru3W=s`iF~7I@{{R}cv?VJXboRn2S|&Kb;QebfifnDP zip{aII_9-PdYfVyEe`e0(lbpvka{MU0_zdV>Hw8C5OIzO$;YikcL|Xgq_mje zA(j~26O10%_3KFx)yVvuF2Ki*1zpOp&zV3+N0M?+jp~iT>M;;?cte9_t z*_a$Q)0Z56M-}8_D*MN+g@2DME>p9+x$w<_(R9P*T9z!}^SeI3j(6!VXMojIvq)uYZm`I37l3>7L(tAIL%q=^ zC-;5m6i;8!FLn`(gMZvqR5y!1K)+}0VQ%a$G-Bg15i%+M>l_??IQ%hK$z1BD`LsTU z2u?xgHH@Nc-$G5CVYvtVX{BI{x)CyQwv$7>ibNch>(d{oq-dSR^30t&_MjUdw{Sap zfAy*fECH}|z^fFQ5j(MtGmp-t4LdRtI{FOM$z0O+0n{n=s(-Op(5^=~^r|x?KPfo( z;(%yYUn_;66C4f?Bay{QMciByoc82?G}01bxM$q=6f`%e2gtzt-n6VFc}K>d5$e7d z@TK0Z;ov;=DvrlLBywe0hC6~qLVDPmuF+@Z&ZN>`31z${N1J})c_gs)uJs!u$8)*k z`Y(xQ(QcbT*MCmfLlBZ2_ zEZSL=AXAg0DtkNygA24_K{{ZXN zMH!}K$Rli+&p!1?2pLM89<;!o*x}a)9MeF4f_}~sv^quY@!@2-Nb~;U1N_>ylhVfx zO$zgowsCgh0o+g!mH4$#OK9doqerf$MY?D#WSyL-(>9Ihod3!HW=!!=v0 zoeW(n1BH4Po*@jDSyo*d-s4o9}6P7&bGOjfMSV&!j7Py z(AB47%&S|N?|f(Ci(d>_KbwcSnGA8q{`VQju+3#DT+c0lHH_^O6&2i!5D@EqMcUq9!P@ndBUVS;P>^36l zCV3dVKP0q0SH=D_)ASuVJVNrvByuO22!D-%2aJ)&Z2tf{tW^2*F{KV&e9wz~M`5n` zs$1*I?uw-=%j1EHr zG6=2-N0pwX`H|<}6Fw*Dp9{3psp^iec_NW-ZMX(BT@!8 zW2+yj=CP|gy$;nLSlJtUvba8`v%SF#C%;^ANvoPzMWUip|$66Z|ic(Ag;~3|f5*ZJka8JJ!CVvTma^H_M zn=h8)iOP_z(Ek8hcOmFkQ=HSe1+O<5WgY(jN@;e>x;IXe6MVk)QL$K#K_{C!RXc1cKyeXguc>3zU^^K;U&4>Fvb>6{QR_ z>rUomfckM%hV>pX_lcn~SbuX%>Uw*3%~izJ#)bs%J-Sq(v?!RU$>~8Ton+i{IvnPz z;L!EpoF0a#g4|)d4!q`*8Z4Fz_j$(@6hP0>?SR2^eo4l%|$)h0ALH3~^y^fnBaIKdsdREUUYCnxGEz<)#OngC-0cpkI> zzFsigcgNysTpF=t3<6u$qy#4fhUf>zsPdtVk zP*tod5u6dmdHrZ;b{r?% zsiuWdr>XL9jDIX;nPs0N%T*wLc>PUaozCX0dFGyv5+AjUCNYe49jQliNo-GVZY0a7 zz~lfs3g~R+J54&rdFP&g3YVcvL(w!{FucmZ;43NjJoFXEH)D0GI?o(whU2{VULmvC7RPnpItl0aAEA z)uJ(!PJ>9*q_vf2f!aA21Q2jXy(YPYpDVfd=fU5NF?fzB{5RsMk#ztu48-6`$3vd| ze=6XsOP6EQ!{Rx&K9XhI!}4-EdRHxuzG20-jE|uF>7+|zcn3N8sW1$jV<3PkkO~M~ z_Y|4|AAc%xym!S5Py*qzlhc7t;c>f80AtV&XxtmIr>E*aV35Zm?zeo0Ut!#P_5A5H zXE^J=3#Hva(n>$B{c!D@U*sOnPda)T*i zs(;@vJ*ydLbwM7(;VV_sbX`wSk$z>iWFJ?+AI`FZ)Yhhm`Ip7oxwp9%@P%Wu=RaDx zM&-fiaU)c8&edLhd93}JqIMf5sdFGIWFb#w;+m$Ao~06AQr9%dGI(D8U$j47#(z9Ymqj-MM+kea;lcOKjv70W|J^Mhg-VsMd$Lm*jCZZD@#;E=yuY%}i}4oyE;NAJdT$Lr#XA^x00Y*xZ&QwL z$EEyL)O`qQ`pH7tN=**U<`aN+FFew%7CCa9*mxl1 z9{g0;Vs;yT^-z+q=0V%mpltvJhJ9*DwThRQNn-@JlAI(+?nw3-tBFrz^Izf?w%Wz? z(zzhW#hX6;t7zzPO`b8R+z7!)cv0WE&1#v9q;hvN1xApP3wHX^Yl$6+2(N_w7j=W{Uclb_DHq;@R} zFyN55CqLs^T&AviPLRe6LVZO~Qd+UgU$J*B*X#a$sj`%8jtcruI%0bPinN50TRanr z8E8S1fICtKScB!u9@GIg?SIDyw`xs^7Sw+ZIH4k>PZJ*K=m%Y;qt09w=b-jA z?Mg?D%VF`R)#T)`{CT8Ovn;6O`u_ky(w5}f#L*x)cEIcXX`+;ii+`N%$idHE)D>_f z55N3b;(?Fz5x6{Ksrvr_g$7L!IR}qUDI`sXWQ?ay{{W>88Z8DFVbkv8pRF<*vn+XI zfX4uil+h)ni_6B|p1!n-*t>2(8#|s4uQe@|68f-gf&dHp(i3I$Wh#3BYGe^bk1!5b zI6dn$X<}@I`H1P7Qh#;`p=EqA=Psu?9^#=pn-j<|8#$)Tk|a)>j~%}%V8q{_eA0Re z4+jGzbj1jE968|A4T)n$xoF{pa$BFqrMntMT=gaqXomb*&;1&-z-qC;fzX{(qH?M`LPd)T_h`3?l`y zaqdYbvxwy_PUA+g5W=|!emVM)T3+PISorhyuCsR3^!eKulEg3l`<0LKBBoD3gl>FU zs!GPj>OA3HN@Lubg>ev0Z_i z=y@2mc6@8%G=B>#dUAgZ*Ii8spzopd=j{CrwuPZhsm~Z&>&Z!3G02H)V1xC}E9V_9r>ROzt$iZdM)uPZc7mDi zNAS1v2CH+es~#comsg8a(e&>NN_??(aKy@ggrc3lntzj;^)jkDxBYZH+{RXq_2zu7 zH^YltHW2DsrsPnzJdf(MitJ$zQr^Le@Gv>xAyCaPA8DbB^&JRz>eHp0sLa#)8Sz;pcR zD=|h%m^#PXAV@UbM5%I#D*AxR6+!L5AFXXpCXH)!dq2R73r$1CT6-z-#8J&G>z)XW zMt{&fa>QrxuQxPa?flP6Esr<#=zDgPC!O&xRJ6LmlH*U2oSww6C-K-$E0!;ontp5Y zHE>Q(=6S?3C5EqX1Yzu_E{La~51xLWmF!Y{(NECwD(NTlJv&0y^h;X=)7Bvs+RDn< zAA1~RAEqnQ!zRxw5hRai@az`;Om|kz^M6R$Bh+L60IyStmro-+Iz2zcTF>@3h3}n6 z5>C+Dr`64Q6(g!WSji=+@pNp0;qAF6b_PDRs(iW`I9)%P?tcs{mTkgPRS{7GdTuxs z>A|Zb&q~bqtuRYtIXDdy0kry)*EFZ8v`)WkOw0Yy3x1W0MOeUC!*D$@Meb>1(X_y~vHh9;XFPv}5qgs*TC=>l z(k|h$kQFmCCJ&%e-<}0&Yne85Q-4hqpq4mh82WpP>WVquthF3sY;9~Y#+8&^Zd-Wf&*1P<7( z7N!;&;E{&spZ>l-3b@APv_@PG8=iVoVPaNr6t6fZAB8mRG8}Cro|R1#Ykv|Pu*&o& z^%WyS$`E$9VmY8`5$@oY>S#xsQeGq zQ;1lJVpm)qct7D(F;W=vK^<3&e!raoaUR%4bN7Y^PT8P_?o%2gWMbwLt=5) zLvO>LAHVTNrxt~!F6rht&VM*jjFxXetCDLf^?4)mIcgh*#11Rx9Ne2{y%;39Pc+rCT<7lh&*x1OYdaiO!mMP?CI~zM^`V1jGjyjQvCCB= zN;1dDQOM0V+%9K6M;)mraJ9(g0i!tM1b>Az4??2=4tvuSbR(ApV}H_unOvqY!>GkE z9j1*w=TfJdmQ*x54MD`VqhRT~Bk|5ZT80uw5kKDfeQ;|*$!JnNk3o_6cdcoyPI{Xj zgKYdOcmDti>GCIl&wgL43mXCx4Dlf2Avx%rUS&Q@|pV zV6`H~2?NyrU;e6Tfd2p}P{hZP(`m@-Qkc;kjk`ZmYLE?30XX%hG!+cd7``FV6U4e@ z=7%zZw{Sc|BO@#@Gx*kR+fbA)n(lr{YI=0~T=MCcs8V<(c-RqxlsM<|uS%4;k>buA zva!SXpTm*(ihtac3mwYxt_SH<-HP1vj}CZ_>qD66I~ztk&8hW-{{Rp4G|;E;u90O8y{xen z45&8-11j0;*1X!z=cNdwtbS{Fr$&7?S*-4t4HGgjBY&nir3q+dD4#xSHt%seCUF|^ z?bkKe7oo??sljUY+eXojFfcx~v_&(@_4_X-K{9>WGJg@)wMI{Knj;jzN&rxBb3h-W zpR=Q%_(iwJ&zpBC`r%Mj)s?JqJjiUW8!>no-)?Zu_!MjJ9F#JO()E* zbV;560KngfGW;#^Zk^(|S%s=fBDzK6d=eZuIpg2zE3yljIQbZJa!Tj#&8_4*oxECw zi-)$I7FgYR46ZVyW7@oGkh5v@x$M%Z&aPY|AAcuqd8kW6R_-}L!2`Z|pnD;MBk4Y-BchVbZQF(kPA20LMxYG( z_@C)aEL+@9JOX=DC8ARxCo9-?tlBOv$A8Yh9efi8uW$XN@b9&{Q*C+|(+6w*LmBoJ z8y7h9qw_~qd(R8r&EdU5cDd5xc8c7SkQXN-^9Hw4<~+&6mDts^hfu$_lTYyV$kVMR zQNHLLD*BB2u{FImV^LWjOMETx9-Hv{MvB8tf3-V)_Isk+x5(p?4{UUs=U$sH+bJO5XG8eU4<~2a}rfxsO7^gPu=p(8zm%Vtf5)<}DGs zk@AiWNQ&oy&uXT|hCAbq-lyJ`%PN-6FmXrDYDp)g%QevwxB6oYG@L zDK36fka?t--lU{7M;ZSBCaI1rN07G*!QfPpElI#Vk2PR9h7TPnAS4fxSn--*IAKN) zQ9u-3i2Zq~xa>V;8Tq<)su5`>+6GTbfEs21U}rtQodDSJHuKk<)3EMaj$_l;{A%rC z7uCaHV-*r5l9#~FdeEK3gn#pToaY^?tONYrq#t@x1i-#CkF5wKIh!Yr^w1Ah#xQ;8 zCdKHR*RTHoUV&J$tV#6X@%Ys+&;kO zsH6zS)#*@H;^5$g@6xFX~_kT)FgH{?r-Ja+F0M|(}qBm(LIlvjAvdIS33%8G2 zBFRW%jP>i!^P!YTR1@;jWDRb(&w6O9jRTInde9_19!UDpVe=C9;(}Wm>Ilz#P{$H5 zolm_>(5|D3Zv)n;1Ah>p=z0pPf@9Tq1mir^ibz+%>Fd|&K`{_N0G@N!fi}hm;O?qp zh`wf6vh@f50IyO@cOF~Uj9>xz)gdww$4a8p6L}*8{NU0hyNFu^|y$C)Q-9xMAu{ClE$VzDX1Tdzb9RX#&QP#8ADv93X-!z*d{wB&al6aU z*zIswgP%52kbkN@hb{P2)7;s+qt0RTZkUt6W1psbeihMT8_?^mEOvmP4xFE-AFV^s z&KjNWmtYhuU~`^nH*)NKA@Fm+U+|Rb(M01G*2m7Aw`f53^waZTNw)M@E+^a&Cn z8rrOD2sRdpVL-ErUr?gWc;oJ|VJ{5T9UMm-bynSOlH?gkBt{Hw;+CPZnuNB2tMs`u# zQ{B!~WPcup^qg7rE*kz2Ow8um5|an9WO~IXvfXRTIQ6E zV1JKF@de80o*sKu>nBm_2mb(Gq7LQOXT~~(rR4I-c_d5~n4IH`RXG~LXk+(r_oT&hcS^J^D4TD~A360sg-c;`t+z%5Zy9cX5!d4Ng81Z&6XlY9yHzF?iR>;*T=y`BvvVgkQXUvUvOrGpd|yu6+;zJRbc&It29} zoD9$r9Gx;3g9IG(&rhWR7CfA1wFO-f4nh1VC~IWok)G55w=uh#%6NLP+KHQ?@A^sKGy&ts1$CTAU#Z!+UdF^Hw_+sI_mLKk_9509oL-GuoIx#xo)R5 zHxndP(7=Pf!QSe=p@;&Kj>e)bVi?xf#?)5Mo)*aCjBk zV3myks@PN?HhDix)TA4T{{SGzd1pMUV8<*~bR3H9}& z=0kvDPih8*E1m)QvN=BVu3KWZ*ugA*ToaGhi0T>(BoHUZD<1kTG7F z$MWK=l#B48QX7>dWK>*b!A3})B#<_C7hmVZKhgb&Z^D;c|#osXX+~8z{b&cSr+*sl0H3V^d!yuU+QKiBN4*?i%?ZaRs<8fMp|eVRpPhP^pt75* zZ1R^Zgnzos2j^U|TAIo>XTN+aye*|$!RV}~{s4CW07@mHs#+UxXiHNgsDm$Pz(fZgwksiRho zhey1;)h;AQV7~7tDzgF^M^62E(v!L&=vcS2p6PtMblte}ao0au z&zUA%O@E7D2w}I(Wjd%AyvqyWZP@<+ zNI}!7$N4n5-HU3(H=ZAw%73z#ie0#1%G@3YPkM2lgr&?{lFIHmR%xMhO`~bsmBw?| z=|?gxE>o)UZJo{k0Ee{y03b1BlHrFL=o3GsWq(O~#*t|sBwXwF@;OsGZ3N(Y4@&fu zEIvfemTP$>(qh%7QlW60vBLsRDN}Z430a)Q#-{0ovUiP6H(=wD(zWHezb(g|R^^8H zrjQQ!W8bX`nnrPrie==ynFR7=@S&TW4A#jO-I3~l4KGu|o;I*D%pMqS+82;;tgNL^ z;eVW0HZqsAg^r9RZ)Yo>vEaROZxH-J)-_0Z^CGzj{{Y=gg(v71xN#J@DI~kE$m@kp zX*cRks%iPVlIkIdqXkrsg!ILBVcnv=5y4(JXJ38c3$YYBoDt&M%_3WmQ1auS&#ilS zNvnTeM~R6|Gu*r<9>}3UFgw>SDc(l7Rexo6UHG}E3vCxq(*F0_??i_kaTq-QX1v#< zI$P#v%(@1ol6amgd9qO&StJ1SghqUQc%eRR4JGa?`5#YwEP$Od`t$CzZEgW>c~H(r z@&>&nqDbPhdY?q;(Z*NEm;;lZ2dAgwM43@Wp^L~nNx?bU@BT+MklE+=8r*t?g@60o zx9@H3=MI_a#|QDIqjHh?`DY7h*1|Z+Fii&-9S@Xu4{uMxs@5vaosH71#6D(n8#w%_ z!D>XA$=yT%X#W7a-|A|*iE2k1wXFg~r*Y{*+^{$#|#-@m4N@M^?K5TdC z?_0EUCSSC=`zHu9gOGl|{;FDoXzJ|sNUi{Rfb$LpM`6cNSxFkxYUc;zdopA5qwEgf zuWG_iQ&g_ba@y?6ZYLkaILA0W^YpD^f=s>~a!~LND@}};ti&b3M6c-%G-vpHdqF;!r((&*A>fx-U(3Wi?CdW>YW zkY^t^{{XI&Bbei7Exhd@9Z{N6$M{llWIkW+z3j$iu_s zfEkYF5`Wzxm#@^;HGdwa$!KyGm}~+zgZ({aq-hO}uNlriTEu+y!Z+j8M(7L$#t!EwVZ5OHfpQUOs zYL=GzoEh@xjT{e5jN|a>S;<+QNnE(koRh@>K*Wxn>pPT@34a;jbr`8;gCyhT&m?du zA*W(gA##TR^Zx+Wp=c=$$Y1mL)c~D3`~LtsMA%KhpITNMLYD3aJ%2h7Yz#BUerRZM zWNy47| z6%AZEp8@{SK7Rne9xhEw!}iio{jC^xNcqIT?PmHg!8Or_sbhx~MYnWmcn|hkz0_Sb zPaaGy;QPYb7t0?^kU08QwQDVfOAlvucK-kxe`TKz_~$`bJRxkBTGfgN<@ z={p~(R+o0y&_$?eQi-i5P|--If)DksS;x8P!QE(lOZ!83Wa*ld>JX^%ZlW?N&+!9; zT<~^w3W)g!#2PR5ZM;%vEpZo^!1g(=n7f>|Ja1IC#^zJT59Vul$mf~o+ReAxA$Zti zj#t=^@qevTGH05~n@&6CvMmwuW(?{4J$ttH-KA^=l?eK7 z=9K;y=qhjCM;Y-OLrpWs{v`@97gC!ajt}*zj(@Q_=c7I<@xQ}8ds)`6_3Ldq@<{F` zF0PRlQaBkOl{hs7J6z20r^7v3`(3cnH7F&53z>quN}D!;$?M-4#cxh&YGqn3$L&wS z&0;6gzu^}jE9qcI5IuaK;pe{IpOtaqT5jj1gLaLNVb0@`T*qWbyK#ZukxW?gjP=bH z1b;p#+F~P(OFNJh0ZPr7)SZu_JPGjqG@vz2RX1G`@+NpdeZ6Z-Sm3K(=c!&@!KPcu zsNX)=qZvQX6*6X2;mpsIyj$X#{84(>3`*Ol%N%_%$>;H@TAr0UY9}YXv-5Iu(x}xd zj|Yv%wM~n#Fvc>x3J`7~UgY*7s7(mCQGb#5xd-`*0CaDb$4=A{C34D+Fh);mXw4#J zkPMQ3Yzm=rk_Q0i^z^6|iDD(m+V5 zJLD|^?}j-APqE^nolEFpUY(uK2)foUJTf0e)Rf6?95GOE7E>3olyJTr`i z2F5*l(@X^tZNVqz#&JU@Vd1badGA6M?k@ek4KY}=6P)wL0UxacMSr-Tu%JxP1fE4E zA*7YgI?)o7(T(ks_|=)(>f}z@$X}&08W;{RJD#7FArmi5`icP`AQO+5`BWWba!HN_ z1t{D=*-#g^f6|&1qhStu^&+fMB?CV*4r?$Y+l&LyRek+dIkLK@Uuj9_%hsx1i2bI0TKq(ftKoDh17V~En*e)nobwj7Ltdi3_7 zpd4`gbQA!>GSm|yPdD_U!{!`YIOq>*b`*sifsd|f6eDwzKZi6EA&DEY5g^MGfIVr& zU71vuDm>TY$A7>Gd{?4Nd8EZ9&xvG3irF{pL?$-LNEJTKQvgmQfcP~**rgYPkS>%@2cN%QZ_OvEKHjyqv4E5{HWZ`q6HPGF< zy*h}72v=piL*!B1;~74ukJh)0Y>XVu-9FR!m}5Bret$H@DQI^3b(fd(F!bZ=QuP%z ztzDod{{X6U(2kftjw()Suqo;qd5{tY z9Co1N*yYh49K|67gUuv$(Wp3QIW=jW3EV#6+J8k@F|0mcm~elmGz}H+Ef(%3f>Ko& zeAw^pQMsJ;8Et13yha!iV^TRd_NZvj*(M;e0fee>cJgWRmZ@0uUk}D6xYOa6ES_v? zN$PtV)-LTYG;!38u6{uHu@}T1GS_tiK_A)|0Z*^YYkKmwgwt0nN2MjO7ZV+$0~zB# zN`K^Xx-_xL_}(dQQXy}X8PCi08K()@rv}b)-$gKKr|kepfQo zIlX5^v4R%VHCUtal?MZZocmUZkz*Ue9uM&U0E)FiVJ@TgC>aZ`{9|@N3Q6_NX?+aa z7sQrU8g`*3k)zx|J(Hx%mF`wzsP zAhY;=U^LAsQMD&iwR~e_kjwOpZQAPkw)$17qVE z&OLY^N{KR5MP&m7b;zLujfBeZqkob*8mN{^tZ|Qe8USI=an_jlkHeM)aG-YEN@@Te*-=OL}mF|~RhO1KG}$p9PyO@be@AAzNDfE~Xo0hgUd z6fdVWC@pcIo(p#r*wem+xPQPT?dzP>jyf}46t)QI-|JF>Mvb&Yj2>{=`sSU)j-JUv zY;(vQAEiv0O&*cq%ZAeAN#gsYVV68G>s!#R$j)3v6;U3{9dNe_Lq{TqTzW9${43t4 zK6P`)s}E+$1jWhuc=hzB5*xB65f?ky_aI~IO_`PzJq`v>1HB~8QGYUb=Q-^|dV?Tu zo9F&Lyb7(%gUuf>1Y-m1L(~%(SP-$PCxM!gk}8e?8OX&emur?4Ix}M)gXxh>maJWc zhhC&~`ch*>l$*;tv7X%2p*W6fgOD-CPXqF*NEjIj=aNo83YiKl(uOiiNg>Wh0;80t zBUU)XL>J_aIHh2TVSh5Y_uy2ru1-*6Baxb88V2G+ecpeMI#&X%pFg7x-nOm-}9BS^h}DAHmR{$AA1Q0@^;Tu(B5L1spC1 zw_a)7vqlyKj2$?XGyed@)^b-&xM%{E7?c#SvPgi(NZAIiJ% zk5qa1jZc%jNq=r042$#xaVhAG~dspX}q}0#1 zqOTL5zwrf+hIFYfb=egow+DhoTaFZGu6k5b!@9Co3iZ_(HvV66@IQ|Hdwt_ejLPjD zjCok0&&m{>1IJ%)t$j`x2&peK=CL@pS*Fi3)i%v@x_=R$kw^YI0sU*QV<<~O=Go(5 zw+L2DXCCBMTaTfWJUE2E9l1I6rx071N;aN8m2BGQw){M@x6!Pd#TtOhZ}QlGvbZ?< zvEsNZd(OzHvwKtVE{m$%TwbJ3j0tRX7(C-2N|?o&$~PmA#2R3XpqNGwZt4b4YKcX$ zBsMP{SbsnZM>M-sZOF$?{{Wq2>9X7|bN3!Dzn(^yO_Ti<$H)l$&q~%bQ{2WX%(bWZ zw$%WKR(VCh+{7pcic+FeMTPNBiE_p>Jj8>L#{&b>vvisWs~sMT}xI zmK==L@^c|VRz3d!;68*WC3igz!Ahr`P?78e*yZ{ zVP|~|u^KW6F0M7p-R0lxrN@|y!nOw=mNQ=E2`Hn(#zyD5SwR$X?zH(~*d25321n;u zVkK~(osr_79rd#wp=D_s6^6#s&Lh6}aDNx^IIliuTw!*2&x28<*8nX+(!MV)WM47k zifrKHCO}uO<3$bEsdZy?edX|%Pfz$pE+=IlzPXl9_zJ3^{5Uo0H+FDsbJA=jAa)Kw z&OLFOsUbz1(p<%Kzhy}m?FhTod*h~m9%~yLtxpcy6f*0VFa}fhDb>{afJi?=xcz8~ zusDD9K1|f-iq}XwigOa6BX1`x06cp0RWn%XiBjN3y8~`qwhz}CrjB{;WZVFxzg{-; z(AAFS1gzGxiO}O|&V74PdkrDF@(IG~aA5AvKn&S6G1P$!HnULU&4}N zaW*vT-Od!g+~DKZrb^>V#>a^5TI$H|&m$x7u4zQ*rq3PHZW=q5wFhicgar8evd+^*3byN9RJns*uZ zZ|u+TG3I#wA^5r?v93*>yBp+t#Tt+g(Bc6YiYeGt5 zHBp8cG(RDs3UC1Sp#{w?Bbj#eq3BaR7fO&#Z*&Re8w2(K01C~J&R$+yYWf^i#gb8# zbDg{sTEkK#c3N|Jk*jn8K*z0gSiyBVTf9%AUt5qfvNiz!0J9>WB~cew{e^v zbLrCutr056MQr4ay#_FSyH$TMJ2)L~p+k;HA-#&6QX$6YRiVgWEAxD-{uL9A#}n9e zr#9~#>4JogeJh=4&AMFuEBGU?e`|PgEhOekH}dnIs76%&86t_Roe+0NuCV77i!4^> z<*BivBOqsk#UMjMgV&LYWdg4`q(fkRI{yIrs2VF3B=zV20In%FV?=+n5Pj?u#~>OL zBzQT_?t~A{nGaD_!?E=P`qL|7xsx9<(nTe4Lm$GWveu+SB=gpSnj|?KA4*pTpcf0k z&#g;krD8Q>_m3I>02)tGBrbU1eQ0XJ>N6XdO5t~@!m$H9^}(S#7SM$Gm@ImaT6Q2e zg&?WHAI^lzZ24#QkNtn0tiCQ-HnXB4L*h$um0%PJh7MJ_9OI|bt`e~oDEmdG=f)ob ze`sA};GU*@2jk_Dv_ThAQPFm1-(MIkZ2WKGB=Hu5G>(;m`!NuJ4Y0XU^pZ+ZdRt!NqQB(ua06+TV)kA+{nrpG*nx&`Ac)=s^ zt>dYLk-+K}_{m>ze>&YWHjZ$t8hP`rVFqlH8GtzaD!GZZhUwb0lid@3!^>_!=oE~c zflWIPmzeZ;?PD^VmD*!5<2d9uS{(ExM^m%-KjGLlpB71ISgWO!va1fwz#rjT#ojkL zt4CAbbgvhSJGOuD--RAwC*(M zdJs>}bJTzPaf->Fr7CJCn?5t1;1AZSCqmR4CE{)IoJRiWrwWm_#`9icCAg^-TVo|*o& zx@t!|q~o#VU$q9aZFk~CwXv0DRI{~4Wgw51F_Fb{!RpS-SuaE9&kyEZO4Sj5V{sTz zJ$H^Pvk$qARiXVA{>vW?hk-mOn%1Qr-CKWF9(;wD46z@$zS++2$J(>TRJXdnt;@p0 zOP@>`a50{1&sv?fu%>dkQhl>hF@Dgv&V8z)OG7@BfC%8;J=!PI#yW22A(GSXhKj-1=0pEejFJf-rm4?17q4w<90tnn;#jR_ltShB@CP zW2wa}k~kb3AHy^)0AO-B%^gKz+P;5!_Mwb!{&C)f1%z$Q%?u4#hTIjYGbU%+aysu%NQNO|q~nd%NR&jawR4_2P{h#^l^g?1mRUyuc`C#7a}HDPhP z<|iC<_ovJ>>?UwFj!&goN!)N4InO47Br%UCAA7DSDH5s3Be3aG$|N52fe(Kz#~)gb zqhoS9c08JL0h_?>(vS~k<0rQi4U#;Af_Urv=tz|8RguqO$2CeIw)-CD2c!xVD!!^kxn8IIv#LMP)QP>MXbq0Y=@_62O?|}ocjKh z2!sNDRvd9cV1|XrEBI9*$Z~&wbZ~J)5WJ2@dJ$Jvu+#nC=9v1}=EdPMM}s z6FYgNNh;v+$5V<-1{L)=;8AcRP6ik5jwz5UF5*3@p~y@gr1k4adkm26;B-9E5?drp zWBHnFaR%Gh(vYU?LBRQk1bW!IM>Wy1ymha-{A9JVx4(E0br zKMuSd;$-r*{U+62)wNMfqG1`9d>sbLFG4lF~w7^l^xA}kRR0N!7obW~}Y$2eJ zy4>SAp&^U}bnVW63ZNZ>_l7VJe|iaHS2)SXx934bx%p3G1~{l}N!$qsfsFMuEkHi% z?gs=Mf)7e;Qq=Esxz|{Q-LdwF{_yU~d90b*LT(DubeN)AOu$G>a_iupqQ8FUp}979D|HXYhZa8{FjOl_9b7TRUQi7RP<7 z=}9d|bIJT$tUKCCVK^pIQCEz0M+XD|;Yc07&lKAdM@1At0U#5D`ku7X z1GDh{oM&Y{eqcr`IkClPeXrrKhyMWaOuQ_LZ$f>ib1Bap?H`7JO3$Hf-1o15UjpuY zYVqqD#AbgzCp-sI484dR-D?=GW)hbwKK<7!uK~ zid^T-S69>D+&%U5hDoF)n6d6pLG8_Ij)=m=W;oBF??Yp5!5WO?@uhNxHzOXRsAPkw z_sp8TX)Vff+gJK;x*O54t_*6qSiU!1;f>b3o!L!{BGIH4j3BBd;80nq)|6 zZJ=a#{*^^V+)}w4Pu=#ZLt=rsao?V5SPpdyk`7N%O&}sjwv0DQXieC8!UEm9)krU4 zGxKtI&L|R{V`KwiB3Y3`q02YLjj)s>IP+M_tELLbKl5zq%pH|>_5h|iXv{v z{K9|nj@q8Oqb6bAF35{Ea!6c$H0@&EsOIHO zq>+wE{S6klqa!`=PFJWreieMW1dp)%2m3qt)8b{Vw7LzvcKUyj5{sLF!AaONfGNP| zoa}Xf5kFzC8u)iWxbY%i+1)+34DcrWx6*&KdZKC7KR>0ln$lOZx<-z4;p1_F2>RC~ zqIO0^_TPMGJF5vBCv!troPwLX4xPO#I}c-y)TQ&}3OGp)`4uxC_>~Y$@Tnd3Qp#{ELC&uK$|)XD42zlu5y1k z^r>PxjXnV9VZ|mpotB)1z(*NW&CdbTi{{Yvk8bT$< z&BkzRHpVLuSQyR*D7g+KK3QT20~mii_s(dzBt8WyOCC7+zX};imqAqRJCe;fpdbZqN#l>DJKW0l zHDf4x_2!@&u`ncndVlq)vq%@*2tI7*ujVT-Yy)luRA-86C677#iOzVW0VaRQ(8<$p zQ|JNWfu=wvz{u=46(}ZkehSl8{`6d2U_}Sa#QOtEZ=rP6#`wct{?WPnDv}{W09^1v z9DX#}JlAJ62m~DRdj4jHIOxsI7fNkj>21&Ypuw2?4z&|{7fot?U*St6f<%n~5yu}- zrYoG$?s_%EhX5YqABRd1F}r{KxY&-$Y21|082I;K*Iovl&o6B7N>5C4wEqA)hV(Rw z)ckhwrHQt>vvmadkuq*??;#`lR|F+?&q+r_dpE;bgmXeSf5*kNGJ(^e=khhAnKRnQ z(Av0ZU^ycv2R~3VU3h6~abja+c-4=C&bO;I-Pqe{Y(t)LxwD*oKgNH$G1YzBFY9wW zx{c?|{{XE~>3$;dRfmP_n^V*q3KW%5)tjId^2-YANcve~<3>9CkA^&T<4fNg-W#j4 zve^mpq6YvB@%1>xd-!Z3qP))vz9v;(tl{1=@d302%Y4VVm!T$jD z(4d1_fQgeHd~N=Zfc)ZZ#ob(Bag@y~d$) z<(XoPl|h4zqZvK&DrD?5&aUgidOF%k`-U!{VaYz#il|Z|u<(D)iz$KP{n^KUxb^m; zQU@y>&%_B}(eIN-vjHQD-XeB!%Z&d3A}gYfu_o7dIE^+#ajC;1l6SbydhPF@!mgxj zjU;u~_PSJa4>B(*6<{5J$@ax_+{x${9vah`7UJIE#$+I&UI!yT%AY-rBF$TE0BMbF zZT6t}Vo)yx?&N=udX3%1P)$1JEw5VY5w)1%kGE=bS2E_Y>a*P)S4f)H2OnvPe8mKJ z2S5J0<7<_jG~Y70^S-_I7m8bZHa>8_lK}q!agcu^F@ZnaP?O zd}$ylH>b;0V;PAo9#eT^CmjuK5k=hg--N#rSHZKjmY{#7^y`8QyFT!3yl2=PX1HxmyuVtb1vRucj6MJSuTd>No>5Tq{xhPX{b~dR#eNOAZx^c=POtNPcYFLfLfk2Z&^e`Y}wB3cm9`G}3*8EWKp8XRd`M0|bmkS*+*hOk#~p8gv+ znEwEB-B^FN2mAz9E_XJJEMs^BOGBpXUL%!TXqFfehaWNdkL16dZ$Vv=h<1tg*TS2K zq0lVtSx8AO$#8m+DQ5mnUY)FY_PN*N?C#4LK3cW`^&3S~dJ?oUuk2=;{A+q#zFpil zj}yhlB#oOqd#N9-V9isx!CExSVXigv261O12?u{Wl%o)H?VZ1c5oV5BA3f?i8tGS) z_-^G)mRDaidFTrcNB#B4s%w~-yBsV~Hl1-MnSmN~!MnR}O)MpPB zy03p;?&R_K0bLZ{p;cKPhvEHtEou$2ukYjQgU$yT{A*UuRT~L)eX3Z`A=45&m_b%C zxx+6U;~$-2IkZ}ek$Xq+eYNW(5|eFt*UOWS$k7^|36v~*96E@-uxoi+_mPeVay_V< z9W;1uqD{5YXo*$~3jTEvdYVgX9mTEB+7f>`$ou0zj&YB|x{g~}le-24w@!l;TEQd? z;f4v@$?HuL#;+eD{ocQwP}YN(o_BW6DK=BoQb7QNj{g9KE@3#?2*?~{9=v}#r0zAU zA|NYcw^3A>606{l2l>THWD|Ng_2clMX%b{~JwM5+C}fN}Hw4s>*xxJ=LF*~81y*1xWwe`@9R`f$3HR!C%+>U49;=4 zEHR#>ngopbz&QgLq!M>B-;bB|swKM>X9pnT9CA;ws~H0xf|3Tv^WWB~gi$4|;u)3s z#($k6w&F9i6OWlrN9WBih|+%=A7}D%TY_;?YBj((!RIEX*AgRH5b`+BT1gav(;Ob2 z)R}i8E!cFa5XNKcj%i$^SI*Tr89g#7txHUgaXgw#9BwO1oPas?qT*2_EKgpvi{%i2 zbB}s91gtZVah`&LkeiNppm!AyvgCu` zAX5`$XCH_Ij@)rg6L2G*J!nGQZg%n0Zhu- zF_Jvy{vL6R=RbvXElzfET7+a1j=4O2X`vk3vs*IGgOEWZ+r3clW751oE4*ex`<6rm z5_!s!Fnz%0qDWEhd&lhWAD!auLTNfKn%MTsfIpe7*TMaEF|L38D$2<8uxifFvG2g+@~$?nk5VhCA|K+Z)UhxR zT5DrIq@x@b?LmJ{T$0`iFC<%AW!)p306k4qVr5dIiS%!QybT_VsegO~x1eh#uTCLAmiZ3lk9PvYEGFLoX;=}P>SXd?hS#^(;#?I zSduUe1GvdJbU@UpOoDYt=bsi2Ng_ z>ma)yZCxtEJj`?OMhdJgys<0sb71o!sPEWBP#A$ize&q*L!Xkx50Z~BUC>Q{J1$lKR z%6!#E&M~xpKb10(N?Cw7V~o%i zxki6kI+Ab(O-p5{*smAHWDCc9bf6gNI(=!PSfKiMp*xde zVBGy_4Iy*4IilpWPLgyPs=f9OQPIe8yYl9mb|OewBpBqUB{+5*tR zochuMn}*%Slz@s}75m zlgta$V0zJGO~_e*@9Wx_5wq<)bJC{Q3yZ(0CxK4Fy~N+nTe+Z2jJe!LVVbfC}9y(trHRgPntp)dNU??hSvCGBd?! znGFsjjN_U?A`+@P=b`>|0zv_tt~$^OirM}y{i&ir1#AE^F+rq3i2LPC=@wA(-J z3zWCURGgd+n5`+pnVk5FoQU;HnN}Fq7>3k96-Tvt5Q2%}RjTC9M*8z;ZO1>;6{U<$ zA5+wDSZC$w#Y;7g$C>L|%Eo`JTeoBBOO$bu^N)@^T^+heWjIZyvu?(*S3Xmcf9+eg zyXqYE_N=EXolsV1s`xjXh0^WumtPMJICYn%bN@l|pf5=Pv3>Ff9kpcUMo_i9jtau|OO*w5?DIE({r z&N0&zn1GPP?fjf+4z&Z5( zv=ld|BzFC101LR|-hd>|4m)Pga?Un5Epx+d6aBW-fg=OR{-2Eu z!o^MAND)4G11Hxb{Apgs)aS~}YD4rLf2C-d*4@S22ON_?-iS8***tMnkVjETUYzqx zmh5C|#EWvuNaO?WlTc?pPm;fA{{RPC_ThaJEJ*l<{ z9{KR6!qIA)tQLRwC-+eXmHGY^9X}k_6E=>=>X*YGh3~J3@3koQ*f!D>92WzeeL8*= zk&NYI>dkLi)BYZ5YaP0(+^l;o;8B1uG5KbyF|nLqG4j5pe>SCYCZTxdNu@a_^y0Kk z>4Zup0l=#?xVQtYO~xvaqXVx@(i0as9^;B>j@B21ADw?tnz-^Yk`7LPkf4UFBX=X5 zQoW0VurJMp>^holjjNIj4ClE1R0`GB*orwk~lxsmC8bc z>r@vPc^-em)~3T+kKpog&-hXi;h!CRK$<><{hJZQ*Ddq^0Jyz>GyJPsdYD&sKRh)% zvhKtjvFo3%YeR{b%R;VyMxGzBk4Lh%((Qj2WH#|f5LM~&uRpKpQjSWjukj*t zZQ+Zf)W}souk@=-&Mf?k_}}pI&%}GRO*nZvq8zgh1b`pn_sKOfS34=p_^n}*)^8%= zc1nbTr=EIOG?CRA8QRs^1S0ju59LtdV?^$Aq@40P(P4}@@6ggHmmFaG&_iU3I49E| ztp$IkJEzKcUbz$kEFxp@86V1%b{^%(!CqIP=|j|(X~K4V&ChIpIIPBO=`LcGP?NE` z`(~11W72=KTF+~q;2&dB*wQ*pGCl4%$YFy?qiE@|^bf0!N^<5r$-=`HG7iJY{{SMiW--*10_Q1_%`Sv&$zqZ?!C5(M5&3tl)Qt(7 zF_NFcJNotJsj^69Bd308re^mbLf~hTJK~wGi32JOj(~xV`RAI-LQI%DNC7?1C)0n5 zB8K!YLlawq89gg#VO4)4DPkR0c6r>f<%;#^`P5B<)Q4#RAw9AOxvUwlE~FpY zv)Lq;F*oim0*O@r02b4c`BXJ?c<6Lq9MzzP<2r~{g~3yvm~|lI-Ki=_Cnc_M4o(sat2R&Qeuv!O>~H@<%kk{40?ZNlvT=0Q>a@> zZJ~zpSjdQ3MI>xT1PH;%KT67SPeN>VQ(rP^Q{7x(2aYmH?YWk@sHHmDewrHc3 z_mLpR<>)*A09sO399`MUd_vHY;^F*9Yi}gGRv=?5k+dLQeweLr)h(knlCwP1!>b}{ zklaZVi1#)@7#JXm-mHJqS`#FhzvCGZVKJ)gZZZ#FV^IWV-l*uTZ3WQNAZWp3W*h_9 zs8BycQuhr#=QD6irx zjXCpd#ieyCfO|Jw)An4=6&GZ4l0C1NCKER<=1t$-&u_-J_+5XBPUd~$MpOi1#13lH zu%gOvBLpls+ggf7tX9o160!MablM)heZkVGu&*YO+QY% zxwvh&7V7d9J@9|0AFX)xWOv11L*s9a4GoNT8b;#sT3JnhHaOii!BhkAIs7R@Q%OgZ z-n_N{0EBnpzKvqPCDyTfbEq)J3r7-&Bl?V!itWS7%;Ckozpm%ho(qj2)BepLCM6M} zC!8QCKb3l$qk-smHk&VWrjivVP@&Wwrz$wdV_3+$U1)!CJ_*<3)is;_4)r!oWg;YO z$CnbvxR2?NYKN#&V?0&i_%uBuUW(K*toD*fr#TAGyC8ZD^!m`9j)xAXi1^=3eNG0F zJc&a5g?J#Yc+Cmi$nu-HhM{gXIMf@3{oJe2?p~+*)$Rv7bOIgS6pz-a12P1KUko_f zf5w>6N@#yPxfl<+#{=u_QOZ&=W;=3N`hHX*+Ojx(Rw&Y2fP09SBdEYX<6B2UWvR^R zI_#Py;@v4GFxYh;#43609?zK`-97%5sUqAZ$ChOZ`Boi91`SM|$xvvq4r8`s}x(De+Pr4G=`o+N*a4B-2L{Hl}YDJvNIiwmg)>%ra5 zJ*xHujZY5Utlnjmgzkv$UVAbAhPI~eVNy0{P~RvG*mnFnR<<#du?r|T-^pNeLPHwB zs)f%7kLyk@#L1FE#Qdj_S09xU2$QeOyGKI&kMDJC06OIR3X-E6 z=zXv72ljTGSZF+NO6lr zc-fLB?x!EthKWwayO!KpvB@HmK*}c>&t9kNn%XGNM@gkO?y=A*BR-w$sw(F@(Vdo< zN{5Vp8Zv+1K#GYD4DyLCB!CBloc{nS%1pjfrn8&?zH4sC58iZX7myWSV#{Ij()UQi6hm#JAZ$IyN^@X-m#obDYNJg0eFyjdtTGEK`NsekOj^& z*p7Wi6^%Zq=!-v3QdE!$qWh!*K7?kXYR2nPk0xqZ)`Tp5I@F-tjokCM(}PXuHmoN7 zr-9ow1tK?-94$*NM1ZiyGsph`UWK7*BO9+6!Jugf-t-jJhUXmt>5s~RSXO^I82ZtB zj>B=+p0o^2#CE|ZfEo9RJ?IibnLrsF&?d$SH*$L86j&}a&D6I5e~lcWa1#u1-jhVO zHCsGqtyDoV-eFu|bIv~sO%@`td}r9223uADhF+iyRM@2Kd=2|oe$Mf0QO)r?!O`u% zj01aar->JUTra2?@7lGcQOAEnn-xJ-T+4KRc=%()_g)i|Y6gu=nG|!`8{gZ zbiI>E5wbIZlXSomHXG_;*IrymIhZ-C|JEA1XyZ zaj|3JC&5?u&l2Y{d7C<`bnQad4vP$ zT(+^_eF;(W3C}sFVJ&|}$s?Yp(v^xMn&mCgrI?ThZls?;J?K%n6R4t(qWlTrGh-B2 zC>7L6WC)nIXsG?in1P0mcFKr^|CT%Ly`*gNz=Otzb;JBvZMDN=c^sLM+pbx7)Ywa7y&PI6tD ziyvH^{{S;uqZw!q63Uy083Uh68zkm68%2x|dN9Y~ThV_Tc0TX@kA5Jok!U;>aQL=o zVxW`3V~~G3>BYyIAJ=0nJziPczxkh`f@V_LJwK&*(v`GlthEN1{{R;_;7}V8JefH? z@qzWDVWd0E&m-}mZCr1fI;|-*79e?cgN}1jnMoPGZ&p34LeTfY&OJ#r4UXkz;f~A? z{&$^q@cqINi?_SaD;+dVW8JK-)r*{D%|`509blCsC#!H#@p;anhLL zIAf?h9MBDpyDu311ricR$NnqVB-U>YvK+*ugP*Sz z%Tb;5VWAd@WJ7ssy$HwST(gnW2wi`le|#J8AkZwox37o#UBDh+`zSxe{{Sk&IXuC z&;wh!9r>UDF>jl-N)YBC@J=(Dp=>olA1UU7hxGZ6L)+e_!dj059P^HILlbs7e-3I2 zjC7l({{Tmv{D=FFM+fPeO<2yPZjJfv3CvRtN8b9@S2)@^8|^!0QNTWirHSZZvYT_| zkV6W!BYJWb9Fe$ot4!%m;_iRvj=biy3s`mu`G;Ql_MlA}+MYhn$a-XF^{k{OF8F6#O*2t}t_SYHV8nLdoc@@s+B;~^l^R|(@i+FG zzM+0Xpi&hFW#obVDWf?{nV&KEn_QCS(hErPKG31vTli2O0RI4cgZO_|h)EpniX%7@ zsQ~kz^Xoz+>237(z?Lz&M_;@HL&Js6d;XkK5s;!hP5LnBaeCw2~o4(laKzr0%VyAPrU@Fh)L(T9e)}G z;wtBp_~L+w;J}}suTfKC$qB&7=qRuVr+){w4NCzr$peZITElg}-%c`<3S)k@t`1{Hu7Y z95rRB;F=$Uwci>{Z9FTc+}}*x5|N#w9;c2gV;YSk>Awa3!@e%o$h+~4+*(zu;OtNt z`RX}6XgU3%?zVp)ut$L68}(beyO{{&j41smNS9RTN9--|sxg3$)>tM{#K)PZ*GfUC44XpQQ~H>K{^BN4R8;8*(UfeK0Zp6{?kqin-vw z7QPXUZZ`23hnH>g0%eE}Bmi@acm8I(@VKjJ&p#W4y5@=T?3T>~GB7D1BoMe8xBjgYEuBG>f@*)lGlN7U1pLydLJ1iBD0IZI1wCo`*iw zoyE#$$9mD02s;t&*0heJZo@;D0h{j;k_T$3M&d@5vNVhn9GZlzHgDVfk%VE+GEZ?& zmV)OIoMqf!Xt<*Ayu;>`OSPqJN?wj@UQW?oM@tWvSA z=b=w_^N%uovBolc0aQmRRaoxr(?6~#6cw4&_+r57cZvx45M_;HCR$pbL0KmAjC{Do zV$O){dPj$2^4<3EHgbR9OH*-dbp=P7TkwCTDHadz;$}Ut593Ld4NQL!L@q4lh<(;g zzg&VSeS>rIZ{kLrv-m4ouo?3-?M4fb0O*gH^ZAP6ucXfUGUkoD9Iu3C4P~nNYm6
      aDyMx?A0LKqCdu?Kq3(8cK7z9lvwp^We1n+$H| zuDc%%87rPxq!EjOPFZVW2$E$yYIRXz&~9&E<9z`PZ)uHy&||s^vzHVF-HDchq|kv% z6YPaug<)uRY)GnD3-9E~xn?UIR_rHdcR?N4c7$jBj>tIR=p5NG*Y1Mpe-R*nOa(TP z?;jk~JDSHaB1mbudh&~O)a%Hrq+6jR2t5kg9aY2-8T1_sOQZ-Gj3sy>b`F;am~(o* zaNdlYXN*R6odk?k0zA@@QImFg{>~f8Y#>k>1XY^EE1wpvJa*bN`*zi<+3?GBS}i_t zGIRCp?sEB`q;3MiYZE|Ne?H|^cR9$cczO@}81jMx5PCR5ukugw=~H|{9H3iYCHce* zv=zu$gVDvK+QO<%gOaE;czmddOxXBs>|l~D0hWInwaR3uBDjUIZ6cy!4OxY%<}B_4 z2KM_`1w6~9pUs2T1@IyZG(H*{s9lDCl)3pF317trBJr$OM|y4te@qV$k^-KvGIQHr z)u9oS`5YYGy?fcq>Q0Cx8$u;)3Bv+jJX@ZcIXMN0+ zp!KPcI;&aZ;{j{L8EcHL?496L$>gIle`8VI+!@DC7k`89vJ34>2)>!RkN^nAA8M zE3SXAh^!-JQzdqpxn2}szS*cFuQsZ=^r%^P@2jDTf3>J*omy(--Gl(oQqd%fNWWBPp)K#(Zp(Y!$Y1N z$G>fWbCjC985*8DO|U#|`=ds~nq0uQjD8>1woS9l$e0ykzhPrkwN+1BT>XU2gC<>u z_nC2FS$B6Iq0-cZ%9B(c2*np+l_za@V!GLef7{^C%q5>KXBtN{rP&;LF9hER0SNW> zFnvzuF|A>h6a6`x>GLkb$Cz}P$#PyF{x?{TH!jpOc{sH6hlFMzT9HQ&MD;k-8TQhs zcag@m@D9`Z(8Xt~tT(Lb1J3&!7LP}jd>ZZ#Bqxp}E60OFe=s=oM}otr83qogj{%2| ze?0)KagRQK$`TIT>*cf}zD5ZeZ(*Jz6(8_ad&634gQ?~*USdFpZWO$qpT9}z5`lIa z;hzR0-t-+#hI>$m|s$$pOE%Ht#g9P&F@WtBJ^3(HHJjoVwEX`Uo{ zP7Td;Z@%Be(Cn)tT5Et0fAk=Nbqfe(f7JmVUVi`=F98Hb-)RO_ZRruy;bVky;iX*Q zdyPTen61IGu5}4?f?Lt$0%$Z{@0RrL1vxc~TA!7y^fzGn@b|5Kd;c+uWOgUuh^>i& zf(8BNH+jP>&e6vK$v}QXLjak(d_#}Sob!wp?>|5q_EZQ>aJe;TE<(eHKz=`Ie>lXO zK_o6bhAv}dMK@1bqwXrlql4_SCS>jaL2eybZ2Wy8 z+5N8B*NOqVyHg@Sz=GoMZ^7Upf5AY8gKrBcrnl?|0!Ww~2xj#9*N0!*>)qb7-cE`Y z!#q#>14(g_A73o1sH%}Z#NM=8dNHx&9l|H^1Xvz8ETQB4B0?U{CLF)MRLv|6V z4)~PC0_}T7$8{YrL@mJj74~|1pJ;GN_c0;nc}!QbBFsdo@F@Z#8wN1Ne=T(I-OT^F zz&GlFv5u?ue|X!9m0o!7BdEk|R8>i~mv6lW4tx_7?i&ryBrCw9L9tu?%vE~PWX@O* z_hgM(Yj{8Xt_4K~X_lvO{uk`5+{A8F8(Dcd(p0uz#kIH<3y#iVR%en%L)Pv6-!s|8 z!WaCRGWIh|1rM47ef+skf6-JoQ?@3oemt^q`Kr0|^vaj$#@%nXz&*}+F|UO zOm?a2c#7EeZQ|_F!kpEEf2Lu~iYE75IkqU=brIRhI`ew+7mj#ee}De%$s%6uESx`c z_eCZLzfKH&efR}qXlZ)To;oxWir<3jLxL)?alUS!%Ol$O(MUXKNuSW6uPNcp)@>?0 zUfQ2?0;wL~`D`%*>0W>9xHldbC7hEN`1=*^Ck6y!uIVRT=BVQZ&1_)6g&VJNBW{Af zfn=V`IYSxt!9iGne+U9Xpy{P*5t5XTR7$dIj&cS;$R9ohkN8c*4Xp3z1ZORI(?90~ zH4)bqmW5SC6<$k>aomziiX>bD-CJDN)I4o1C%DIz04j_5YKZ1YSPAV4HJ~nQKlxZH zsv)HipqqRmA3rjlmRCRcMx(8CCw~Vw1RZqgZ1m3HZz%wqe_}Jr&Qk&fVmG4CUQ>!_ zVQXGw_(83%b0T_kltDv9r_pw{)VCVgvkftKqY@{)mvP8onIqTgn-d0eXDcu-#$aty z_EBep3WYFl$YD3>;ul1Ig6+oPlC?FsR1jNJnAKGgLdqJ_o0T0(_U7X=X!t%&yOzNy zI%|sg`GEfae_SGZE6nxuZjz~VzuNu69K-SJ951Rz=%gwqL8__DBc^5jhA1W<#yNa4 zL4U-f0t03ZCnd`?A7B5e@a^R!ZJx+fow>rFqt$>jKp~9WLlet9%CgP{Rz4|5QC5i;p;qUL-h6cx%ynp z70h?xa1mu4WMC)*)LM?2)W+ zjAXOL+3bdEmSOQx0kOI5kB}HXby)mAItqBpP}9RV z5S=y=MQxuut#+suzf=eTP{q)|>HW()f@#GK;a??0TCGw^6*t(Xuz>HC95E4B zS`*PzCS;J6@tE`*C*3ucL(4Xt7M7K0e?A|fXTMb?GXhoXOq0q^-4g7vDpx`bX9Boh&YPF{K;~?H4I4p@vrm8v;ZA^eW}E;Q!s9a47(oy4W8F74xklF<()f7{`c!@i zijam2yQ##y;ZQQWN8DLlO@-jL%%vnFxR+q0uS!xDrCrq&ae}{UoV)t0@!AT%e=QB; z$c?9av+-x&t9a?S2|3s^0`)}wCgoJV1CutW-)Hj5J|C~$nz;r<)i{LV%tO#Uci1S^ z$fhsC!=Z~K9lQguk1LC3F}gdh(F2iR^9aFLpsOzom1!A;V~6^>sznnfBeXs`wbP05^mT#X|L1A890bQx*9w`wW{}f<#!TJ^YCdF7JJFB{ z77Mb$txM-L3gE-rsXRDIe-i|>od~{=0egsOoB_*a?F-yD#ext)paAFZYzRN^OQDj% zaAe(5a*jyr!j!~{cnau#=|X=32}Izg)<)D`ED4`(Z5(gB-ZB5f(w_#5)_QlHdxwn0h3~Q3`evY^%?J~Yd+Nx2UqpLxCq@+CNuP4D& z`=#8YoU?pVPOh~kf7OJdTdEFKTTU_?55Z+-Kh-DEd{KdhmzuWZHd0lm4Xjd1{k0ZW zRSUyUF@*DDsXi)LV8t*MQ)rXb_^Zi6j+KZY*ef6u&!2X`A{uGV*;TNMhMkLMgf1^=a4OeN=9!J8#Hq2wH zPLnbNCS&9_KbnI5`Rh8I(l@Tn4|RKLb5RbRlYXOxB}F3#7(_8{FC*T@y0-5fc#W&9jgCn=~}8$PnQaxC!n3$pPtr$+6+n7 z$zXnM$H-woe|4EKrVXQx$)h0kSsbAz2qZN&QGrR9dI6J73^5cHdYMvzZ2TwMU2u1` zrUt0>S?w3qb!BQQ#m}X`v}C8Fp-zla82rmH-N+IQ-sls{hA7Z{lmN=4o>R*~vKi67 zPU~Aul-7szc-6@GupS1}ct9723EZ=Dr8Cdi-cyaZZ;$+O)j3-PGXxT)?~gl)nu!A~i%IQf zEtUgR!q_eUyDYs-ICW5SG|5Lfy(gidDs z)U<^!f7>M&X1+h|XiSgnWjU-$rdz}g0qLmnEA@>Ij6z|xwxRKdc$=ug;}`pT>iBiQ zH`b^3El@SRbl_zf)a97tDle5ynge%ab?xe|>wW4){%`8%g|70MKMQV^JaDz#Dt&jr z2pD{-@nxcs~;)_|cs2nqAIHeq|YNeR+U=jrdAIGTKDJcHZ(b_QzX3f(qZf%&l zbuu_~)vx=QtgVMY8y!Cxdo`S>0OBWPyNqV}go`AZS)QAP~?dz?FQ ze>~hwhvTLazU6!a;)Ti?h?PJrEVIAdtJFZr6k5F)OR!-&uKJt*OF`U>9ejaQB7eH% z6MdREr|}+tGDUoN2XH!*PQYG7Fuz%DAH!H;RrU+aq1kuT=Y)rwAjQ08S8dSerNh+VpdDPC5VbKT}X7bQG zei6LiM_*W%l|!V>$m|yK$v^TpRFO2F3PX`2M_mZ#=ug%^6S5R>?so;fPaE@_2UZ;u`m2CWb4R7C``R)5n_$`A z7m6pW9Q@4tbl%3v`9%R+J@BLB2yhmC>}|@Jpp}i7^6S+mE9i=W&6bU*H|nUb!!S^9 zPjmn`!h{PWpMx?sa?nbfLQ!Aze^zC3cuVOQ7W9@ISoMLuD{wJ=#`tS4Fq~Yq7i^A>v(#bfZ2!ZS$4UkOiZX9wZ1j4BQNV$IJN;-FT@8--CQYWxJonZ6E<*uxZtB#g zhL@NbF)CQjzdsU)ASA|%rKM$()@2*!ad9x@#aK5b5F0xoCxshH7ABqW@L;~nf*gu7T$8X{7xQeBZ6>k5sv9)bPNV=Yq{_U)&mxUaT z@(XN1nk5lGbF0QRPg;i7&}s?wVnmrA2BMve~-p*VE0}lFcuCz zFAGHrBW(^Jw#h(xAeNWl8WEt!tTEEKwhY46_|*sa!kqD_@>#@r7xAn5(Gkolq7ch9 zZiMLq5!i`pa<9yid*%Pp1+{*k#sf9G$92GRX;z-LG%Jr=nknIA<$>WO8C>#hNH}Ak ztB+hVnu#B3J-Z3~l+}PYcJ%-L*VS5boFe|?@T832tD8E$@WYd?m`=7Vl`y1h%pZx;Vxi+}yscN<4XryKiQ zr`t!H8}GJfe=(rn-^+lo(iWiB?rk1#(_Uw~Z6MY+!}vOe@%_CF18R)gO>EO25w21Q#LidL0DD4OyVn6d$US^KANS+zMRE3v5v3Y)T;$cI^{p? z9cxqTMD#QNVyAZ;S`88I^?64e5sIR4L0WtvvZtQ%i-d~|qe|8htfb|C}WL?r`)v^C@h3s|1Qpfb8 z6*4tl(N^gJrB7052CQoOE00-Tvu1Q<$URcb%1%W%o8aEY&n1%A@~o9LG+vjXlqd9a z-go*1WnF=zS(Xe=<1EhG;%am)JpO8XZba}Q0G?&>bbl0Gw?BSA0F)A65LXxvm8&&H=+ewn|@*G z=NG+azu46=&QPKPHQin@=~uS&L8G{BE%o<0V7z5MqPUASuM5hJFYN>qq89RbW5^ec zA>V5ZsY5&$%B*p4;G98G0;TN`3f2Qye=B4Qxnh5p*JfpSfPh&gvb%DQHxm+JECTz}<>%+j!rD7V*rTU2VCzkDirse8Amf50^O z|941?y)Im9Pr0T;==1`c3y-6>e~Y3|V>-%#OT261yfii z^4ta2wW%KRe4VmMm+P;^hS(CHII1%pi$&;cFT@pAwlfRYG_3u?CrqjJ{O_zfd1)PK zJ(w#f4`Nlw>E4ClKo}*u-o?TfKMvW;KB;zjV-n?%{L5<8#46bN-+DC_n~=A}hAU7- zz2@rZRD6EvSmT_Yg7oe+e_giHYN!iL1+A=23sNkFD(Y69xAQ}7^`b0Au&RC;dOlBIaf{Tk=PRjWR!_%o z^PEBO_0pQiIyV*3$MnRh8p~M7Wjj_sv0PkJDo2}@JrQrj-_PiDf9ixf-O)xZmDU|!!{9N@Qs#R}mPg}3d=zPf zel!I)!Od`4U3FpvyF%5%JgiE&#GLXK!5w+f~Pe_Rqe;*V>p2SrLwUNs^I zb@|R?$ptB^3HzuOg6q*rJ)e4rNwjp&dgkx7B^dDFQCv z4IB$}Jc{9%NqTI2NVP_lir{CDqFl{Cz^m$IcyP2|win~Iw(-!JTz4#~j#Pi&k*iODCG2GXMYBAW zHR7S9*n`;LmT@2ZkB_;)y7oXq%lqUCErx$1Y@R1Me|?T%H)8iD8ehl5qi8(CJMULy z1N@UQ(`)*8QU3}U*hS%(vtpvCA4?%?g}>PD)$qXP-2RSFA-B3d+kSUw1;v@94|cj0 zIUfF@dp+M=L9y`fw^b7R9f+-h);-<9kEi-wiSrg{zxDcIL|uXuMjk}dp|`apAy+7D z{+5zye-&l(ML`N!)u=1WO9h8Rx2qGleLn2eRNV*Lg9N?!MFz6MXOMc6VC9zwI4H%P zRGIy=YG(rLixoia)k9e%nhG#tqMORw=q2+LBCw)h!utIpXgT@Srh9n zXZS!%$1pRA9b!d9FurJE*>oy(Pg??djH!qOe<$%g?Q9x{>)bKb!2UuNL&zQH=5*gE z+$G0c8hO;irYa%KK}(P-_2py@lWa1I?ofRUflm$utj>bTQY6Z^Ea4LZ7H?33Dry<@ zUbrG~r(PL|RjrSAxn)J;G;`Y&qf;E}^bDfhIE%+L#fny_7mY?dH$Ek3r4uuyQ0;#} ze~iy*AwrA0pTc~4>nTZAWu^IggX3A+iz(}<+w1Lo(S7+U{?)>4Ns6s9A}{-?na>yg zgnkXg=Z9zAvPFRQV#3uFqMr(&CA26@mS&EqpO0qo%49`ik0316M&~3Vw;@@gUBd8A zE)0~%Z4K$hfsVVL-W^#&80!nb4X~-H5R`%K_dwnO};W3iCL}(FO|otOEI$Z5@?=% zZwwu>K3Emau~;EW7tQflBT^ZFXAZ7*z@-=Hh+mdzpQM=$ZsOr=6sx>8`%h0MPjL&~ zeLx4zO|jk~^L7UnyBWa$bG~Aje{p&Oy*1kp`JMWcm^_9Sna{0=jpg>NI_?h{uAbKy(6!OjB6mHn&6`EiRdxN+smR-_XW3 z-UTxaKBaTp?ny_fESMoki5kC=$b{m`>rdY?HHlBzMW3KV&ne6r5WYXoe_5kZ?x zO6+|PEfa?LQ_6DgNvJj6nOtE?MW@cL&Nx$77T26($!&6GTdce0ib(86V>(s5&CsT^ z*WT(Boz=#lThQaL1=gV+opmZTZEo8^!Jtx^1xhR|>joF4C^ofxBvO=#_;!-tg@PJJ z9Epf>!PEZ^`!(k5FVij6e*aQ8P|k;}lBI#)jrHK-GSDf{Dd zrv9#@M?Z%|86hN8QZD#_kWD41H|b^6XNV%|k7)`x3!o0n=`#D$iu%kk9dU z0b5m(!+=oec)aLf_=xYK5uH@gBhO{8hgHQZuF5KO&+R<>^}e#R>=ncAb+P#PSNKw1 zUk}QnOTa73JM&u!XUNIc=mCE83BH0N6NhPp*BhN&c|#xGyekHyD9hq3#3Vug zeD=pP%(>?*e@fbR{wS$`6T6W5#?fpxiKj9N&2^h*xk#xathk9`e3gvjA>C!1fYTly z_qvt{2f4TbKZ3CL(j*G;HgO%KW>+YATQa_hrwJ|YKt2Q5>N3>ja!|1%pkt+U?Or^{ zGhDL^DQbVUh<}R*Gos9*k<@#;y>OIXi!1Djw!tT%e|%Z=3&?*BrovK=AgN;&;8mK( zFX7+mEiL7_OK0NObT;Cvk!QSj$I`!;jiIa=!9~*;q{w4hZ;WuP9kZ*FB*W`leA_X} zK9thz(!}YCJI{)~Jsp8)33`-_!J8%(75*Uq%a1xg|8naD|hiL6tMNaa}6wc^esyossKyNgnoQ<+SrR`}%aIr7{4es3PQG5osD*Q7KOqJ-ack2vAZA(13iBf3Y~?z#LW~#6v*gL$bJ|F^O<8&~ ze+C$_RZdQ2wd?ZSMt9&ZaZCVwA6qMhTnOGRZ7(lY`<)w- z!SuFnQ|vB^&!a5nglGmLO$8m*qBeSAm+fFY7|n*

      B)Tse2a`fBIgKQyq`xe@Ba( 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 delta 985 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 ml)w8+l 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

        uz{t_QRP=fgpDx3V!pX*FP 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

        ^6e>rjrf-O15wXb)zG4elczZg@{wItDmc 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

      1. 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 Np_Cg2MmYii005OQnfL$z delta 668 zcmV;N0%QHo`Ut|Q0Y5%8_WNT$G-jtBw(0K^3V02Y@}_yHAvE^KvSrBq#S+AtJ- zrc(dIm0xNj7Cy9f5)uyxScO#RG}yzmR+UMdU@5UH+u6&s|32FZU}#!_`Vz(Vx#ygF zuYH;L6LFDB3^(m|8x{`_s~JpxEys)b1m?@h{m!8-a*&DL(FrHGv+Y{39f32US5QNlK5<`}*3 zpaW=yNTg+{V&=h$nNkUd9v0NZTa0kj?h-_Xy4>J?=hJ|H3^VtO9v@K$brEriB%zCM zJZGT`s1N+Ug|~PLLK+D1`u7p)3CxxW3vC^P0?d<@2$l|e=nkq+hOU+&%q{+ORC^BSaMb|TJ>d4 zakcjMv=Y6n@|ET}*XBsFR`lP)BY7P;vac{!{Ke?5pDJBc;|^KXxbUGng>WLFM(Q{H zlGE7Na&OkxD<8c~KZ;IwEw9hVcl&hSvE5DC4YQdL$hcsLG!5qcK%On9!8ra8w>9_y z4nq&{t;I;Dz?Y5)0ssKS1pt>)I|4NYwz@MJW0#CO0zCq$PnS{n0VbF6I|3>L08;>$ z9y|gv0ts@Lu^Iv~mxDY4Dg*Fz0GF^l0x|{0002} CVKx5% diff --git a/Moose Test Missions/Moose_Test_DESTROY/MOOSE_Test_DESTROY.miz b/Moose Test Missions/Moose_Test_DESTROY/MOOSE_Test_DESTROY.miz index e110149cdaa759b1d60fc6dcaca1694b826fcad3..c39c2dcf65893fc69933c433137718154b76c095 100644 GIT binary patch delta 110308 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
          aDyMx?A0LKqCdu?Kq3(8cK7z9lvwp^We1n+$H| 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

          B)Tse2a`fBIgKQyq`xe@Ba( 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 E0RKC+p#T5? delta 775 zcmV+i1Ni*<)(Gx}0veWp_X!`}rtW#$;Y@Sp=|g-E1j zsbc2AikVUghaMKx#9NGT)b0{QhPvF~e&^GG3^VtOe;yxE2Xzr~i6o(mZ#-wA3#bqL zzJ<4V3PKtP@%r}>>Iux22@7o^oAfD7F?ifcPc)m;UL#`KGYg^&H>kDkx zp=a4{fAZ~&DMZ6`Vyy(3B5yI<(_NTxl5|xG+1(0F54T;^0TojZ@U6v2 zrofku2m$~A#03DCfhPhr1-7~~8Dp2bCjvbJ(JPa&DHN9uC;~eJF)jd?Oeg|D0vIos zz}Ep8m#8QLDgyv80GHJ$0x|<=TmY8}DFQMByJ7&BKPdt{0~})jmwqV%LIaFs0GGol z0!0JUbpV$ODgrwP?{)wHR7X&k4=Ms3mue~k8UlHDmmwem7?++Z0xAM?c$XU?0vnf} zDgqFf=OF?R6951J009610000@c>n-bNJd{qm(eN$B$qrZ0vZD(dH|PMD*_t^zI*@x F003?}OqKuu diff --git a/Moose Test Missions/Moose_Test_ESCORT/MOOSE_Test_ESCORT.miz b/Moose Test Missions/Moose_Test_ESCORT/MOOSE_Test_ESCORT.miz index e441823aa683d68cb9e6742d0816c98c450fc949..1a58b2ed69415d0d3754180cfa0f0db64b06a27a 100644 GIT binary patch delta 110405 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

            aDyMx?A0LKqCdu?Kq3(8cK7z9lvwp^We1n+$H| zuDc%%87rPxq!EjOPFZVW2$E$yYIRXz&~9&E<9z`PZ)uHy&||s^vzHVF-HDchq|kv% z6YPaug<)uRY)GnD3-9E~xn?UIR_rHdcR?N4c7$jBj>tIR=p5NG*Y1Mpe-R*nOa(TP z?;jk~JDSHaB1mbudh&~O)a%Hrq+6jR2t5kg9aY2-8T1_sOQZ-Gj3sy>b`F;am~(o* zaNdlYXN*R6odk?k0zA@@QImFg{>~f8Y#>k>1XY^EE1wpvJa*bN`*zi<+3?GBS}i_t zGIRCp?sEB`q;3MiYZE|Ne?H|^cR9$cczO@}81jMx5PCR5ukugw=~H|{9H3iYCHce* zv=zu$gVDvK+QO<%gOaE;czmddOxXBs>|l~D0hWInwaR3uBDjUIZ6cy!4OxY%<}B_4 z2KM_`1w6~9pUs2T1@IyZG(H*{s9lDCl)3pF317trBJr$OM|y4te@qV$k^-KvGIQHr z)u9oS`5YYGy?fcq>Q0Cx8$u;)3Bv+jJX@ZcIXMN0+ zp!KPcI;&aZ;{j{L8EcHL?496L$>gIle`8VI+!@DC7k`89vJ34>2)>!RkN^nAA8M zE3SXAh^!-JQzdqpxn2}szS*cFuQsZ=^r%^P@2jDTf3>J*omy(--Gl(oQqd%fNWWBPp)K#(Zp(Y!$Y1N z$G>fWbCjC985*8DO|U#|`=ds~nq0uQjD8>1woS9l$e0ykzhPrkwN+1BT>XU2gC<>u z_nC2FS$B6Iq0-cZ%9B(c2*np+l_za@V!GLef7{^C%q5>KXBtN{rP&;LF9hER0SNW> zFnvzuF|A>h6a6`x>GLkb$Cz}P$#PyF{x?{TH!jpOc{sH6hlFMzT9HQ&MD;k-8TQhs zcag@m@D9`Z(8Xt~tT(Lb1J3&!7LP}jd>ZZ#Bqxp}E60OFe=s=oM}otr83qogj{%2| ze?0)KagRQK$`TIT>*cf}zD5ZeZ(*Jz6(8_ad&634gQ?~*USdFpZWO$qpT9}z5`lIa z;hzR0-t-+#hI>$m|s$$pOE%Ht#g9P&F@WtBJ^3(HHJjoVwEX`Uo{ zP7Td;Z@%Be(Cn)tT5Et0fAk=Nbqfe(f7JmVUVi`=F98Hb-)RO_ZRruy;bVky;iX*Q zdyPTen61IGu5}4?f?Lt$0%$Z{@0RrL1vxc~TA!7y^fzGn@b|5Kd;c+uWOgUuh^>i& zf(8BNH+jP>&e6vK$v}QXLjak(d_#}Sob!wp?>|5q_EZQ>aJe;TE<(eHKz=`Ie>lXO zK_o6bhAv}dMK@1bqwXrlql4_SCS>jaL2eybZ2Wy8 z+5N8B*NOqVyHg@Sz=GoMZ^7Upf5AY8gKrBcrnl?|0!Ww~2xj#9*N0!*>)qb7-cE`Y z!#q#>14(g_A73o1sH%}Z#NM=8dNHx&9l|H^1Xvz8ETQB4B0?U{CLF)MRLv|6V z4)~PC0_}T7$8{YrL@mJj74~|1pJ;GN_c0;nc}!QbBFsdo@F@Z#8wN1Ne=T(I-OT^F zz&GlFv5u?ue|X!9m0o!7BdEk|R8>i~mv6lW4tx_7?i&ryBrCw9L9tu?%vE~PWX@O* z_hgM(Yj{8Xt_4K~X_lvO{uk`5+{A8F8(Dcd(p0uz#kIH<3y#iVR%en%L)Pv6-!s|8 z!WaCRGWIh|1rM47ef+skf6-JoQ?@3oemt^q`Kr0|^vaj$#@%nXz&*}+F|UO zOm?a2c#7EeZQ|_F!kpEEf2Lu~iYE75IkqU=brIRhI`ew+7mj#ee}De%$s%6uESx`c z_eCZLzfKH&efR}qXlZ)To;oxWir<3jLxL)?alUS!%Ol$O(MUXKNuSW6uPNcp)@>?0 zUfQ2?0;wL~`D`%*>0W>9xHldbC7hEN`1=*^Ck6y!uIVRT=BVQZ&1_)6g&VJNBW{Af zfn=V`IYSxt!9iGne+U9Xpy{P*5t5XTR7$dIj&cS;$R9ohkN8c*4Xp3z1ZORI(?90~ zH4)bqmW5SC6<$k>aomziiX>bD-CJDN)I4o1C%DIz04j_5YKZ1YSPAV4HJ~nQKlxZH zsv)HipqqRmA3rjlmRCRcMx(8CCw~Vw1RZqgZ1m3HZz%wqe_}Jr&Qk&fVmG4CUQ>!_ zVQXGw_(83%b0T_kltDv9r_pw{)VCVgvkftKqY@{)mvP8onIqTgn-d0eXDcu-#$aty z_EBep3WYFl$YD3>;ul1Ig6+oPlC?FsR1jNJnAKGgLdqJ_o0T0(_U7X=X!t%&yOzNy zI%|sg`GEfae_SGZE6nxuZjz~VzuNu69K-SJ951Rz=%gwqL8__DBc^5jhA1W<#yNa4 zL4U-f0t03ZCnd`?A7B5e@a^R!ZJx+fow>rFqt$>jKp~9WLlet9%CgP{Rz4|5QC5i;p;qUL-h6cx%ynp z70h?xa1mu4WMC)*)LM?2)W+ zjAXOL+3bdEmSOQx0kOI5kB}HXby)mAItqBpP}9RV z5S=y=MQxuut#+suzf=eTP{q)|>HW()f@#GK;a??0TCGw^6*t(Xuz>HC95E4B zS`*PzCS;J6@tE`*C*3ucL(4Xt7M7K0e?A|fXTMb?GXhoXOq0q^-4g7vDpx`bX9Boh&YPF{K;~?H4I4p@vrm8v;ZA^eW}E;Q!s9a47(oy4W8F74xklF<()f7{`c!@i zijam2yQ##y;ZQQWN8DLlO@-jL%%vnFxR+q0uS!xDrCrq&ae}{UoV)t0@!AT%e=QB; z$c?9av+-x&t9a?S2|3s^0`)}wCgoJV1CutW-)Hj5J|C~$nz;r<)i{LV%tO#Uci1S^ z$fhsC!=Z~K9lQguk1LC3F}gdh(F2iR^9aFLpsOzom1!A;V~6^>sznnfBeXs`wbP05^mT#X|L1A890bQx*9w`wW{}f<#!TJ^YCdF7JJFB{ z77Mb$txM-L3gE-rsXRDIe-i|>od~{=0egsOoB_*a?F-yD#ext)paAFZYzRN^OQDj% zaAe(5a*jyr!j!~{cnau#=|X=32}Izg)<)D`ED4`(Z5(gB-ZB5f(w_#5)_QlHdxwn0h3~Q3`evY^%?J~Yd+Nx2UqpLxCq@+CNuP4D& z`=#8YoU?pVPOh~kf7OJdTdEFKTTU_?55Z+-Kh-DEd{KdhmzuWZHd0lm4Xjd1{k0ZW zRSUyUF@*DDsXi)LV8t*MQ)rXb_^Zi6j+KZY*ef6u&!2X`A{uGV*;TNMhMkLMgf1^=a4OeN=9!J8#Hq2wH zPLnbNCS&9_KbnI5`Rh8I(l@Tn4|RKLb5RbRlYXOxB}F3#7(_8{FC*T@y0-5fc#W&9jgCn=~}8$PnQaxC!n3$pPtr$+6+n7 z$zXnM$H-woe|4EKrVXQx$)h0kSsbAz2qZN&QGrR9dI6J73^5cHdYMvzZ2TwMU2u1` zrUt0>S?w3qb!BQQ#m}X`v}C8Fp-zla82rmH-N+IQ-sls{hA7Z{lmN=4o>R*~vKi67 zPU~Aul-7szc-6@GupS1}ct9723EZ=Dr8Cdi-cyaZZ;$+O)j3-PGXxT)?~gl)nu!A~i%IQf zEtUgR!q_eUyDYs-ICW5SG|5Lfy(gidDs z)U<^!f7>M&X1+h|XiSgnWjU-$rdz}g0qLmnEA@>Ij6z|xwxRKdc$=ug;}`pT>iBiQ zH`b^3El@SRbl_zf)a97tDle5ynge%ab?xe|>wW4){%`8%g|70MKMQV^JaDz#Dt&jr z2pD{-@nxcs~;)_|cs2nqAIHeq|YNeR+U=jrdAIGTKDJcHZ(b_QzX3f(qZf%&l zbuu_~)vx=QtgVMY8y!Cxdo`S>0OBWPyNqV}go`AZS)QAP~?dz?FQ ze>~hwhvTLazU6!a;)Ti?h?PJrEVIAdtJFZr6k5F)OR!-&uKJt*OF`U>9ejaQB7eH% z6MdREr|}+tGDUoN2XH!*PQYG7Fuz%DAH!H;RrU+aq1kuT=Y)rwAjQ08S8dSerNh+VpdDPC5VbKT}X7bQG zei6LiM_*W%l|!V>$m|yK$v^TpRFO2F3PX`2M_mZ#=ug%^6S5R>?so;fPaE@_2UZ;u`m2CWb4R7C``R)5n_$`A z7m6pW9Q@4tbl%3v`9%R+J@BLB2yhmC>}|@Jpp}i7^6S+mE9i=W&6bU*H|nUb!!S^9 zPjmn`!h{PWpMx?sa?nbfLQ!Aze^zC3cuVOQ7W9@ISoMLuD{wJ=#`tS4Fq~Yq7i^A>v(#bfZ2!ZS$4UkOiZX9wZ1j4BQNV$IJN;-FT@8--CQYWxJonZ6E<*uxZtB#g zhL@NbF)CQjzdsU)ASA|%rKM$()@2*!ad9x@#aK5b5F0xoCxshH7ABqW@L;~nf*gu7T$8X{7xQeBZ6>k5sv9)bPNV=Yq{_U)&mxUaT z@(XN1nk5lGbF0QRPg;i7&}s?wVnmrA2BMve~-p*VE0}lFcuCz zFAGHrBW(^Jw#h(xAeNWl8WEt!tTEEKwhY46_|*sa!kqD_@>#@r7xAn5(Gkolq7ch9 zZiMLq5!i`pa<9yid*%Pp1+{*k#sf9G$92GRX;z-LG%Jr=nknIA<$>WO8C>#hNH}Ak ztB+hVnu#B3J-Z3~l+}PYcJ%-L*VS5boFe|?@T832tD8E$@WYd?m`=7Vl`y1h%pZx;Vxi+}yscN<4XryKiQ zr`t!H8}GJfe=(rn-^+lo(iWiB?rk1#(_Uw~Z6MY+!}vOe@%_CF18R)gO>EO25w21Q#LidL0DD4OyVn6d$US^KANS+zMRE3v5v3Y)T;$cI^{p? z9cxqTMD#QNVyAZ;S`88I^?64e5sIR4L0WtvvZtQ%i-d~|qe|8htfb|C}WL?r`)v^C@h3s|1Qpfb8 z6*4tl(N^gJrB7052CQoOE00-Tvu1Q<$URcb%1%W%o8aEY&n1%A@~o9LG+vjXlqd9a z-go*1WnF=zS(Xe=<1EhG;%am)JpO8XZba}Q0G?&>bbl0Gw?BSA0F)A65LXxvm8&&H=+ewn|@*G z=NG+azu46=&QPKPHQin@=~uS&L8G{BE%o<0V7z5MqPUASuM5hJFYN>qq89RbW5^ec zA>V5ZsY5&$%B*p4;G98G0;TN`3f2Qye=B4Qxnh5p*JfpSfPh&gvb%DQHxm+JECTz}<>%+j!rD7V*rTU2VCzkDirse8Amf50^O z|941?y)Im9Pr0T;==1`c3y-6>e~Y3|V>-%#OT261yfii z^4ta2wW%KRe4VmMm+P;^hS(CHII1%pi$&;cFT@pAwlfRYG_3u?CrqjJ{O_zfd1)PK zJ(w#f4`Nlw>E4ClKo}*u-o?TfKMvW;KB;zjV-n?%{L5<8#46bN-+DC_n~=A}hAU7- zz2@rZRD6EvSmT_Yg7oe+e_giHYN!iL1+A=23sNkFD(Y69xAQ}7^`b0Au&RC;dOlBIaf{Tk=PRjWR!_%o z^PEBO_0pQiIyV*3$MnRh8p~M7Wjj_sv0PkJDo2}@JrQrj-_PiDf9ixf-O)xZmDU|!!{9N@Qs#R}mPg}3d=zPf zel!I)!Od`4U3FpvyF%5%JgiE&#GLXK!5w+f~Pe_Rqe;*V>p2SrLwUNs^I zb@|R?$ptB^3HzuOg6q*rJ)e4rNwjp&dgkx7B^dDFQCv z4IB$}Jc{9%NqTI2NVP_lir{CDqFl{Cz^m$IcyP2|win~Iw(-!JTz4#~j#Pi&k*iODCG2GXMYBAW zHR7S9*n`;LmT@2ZkB_;)y7oXq%lqUCErx$1Y@R1Me|?T%H)8iD8ehl5qi8(CJMULy z1N@UQ(`)*8QU3}U*hS%(vtpvCA4?%?g}>PD)$qXP-2RSFA-B3d+kSUw1;v@94|cj0 zIUfF@dp+M=L9y`fw^b7R9f+-h);-<9kEi-wiSrg{zxDcIL|uXuMjk}dp|`apAy+7D z{+5zye-&l(ML`N!)u=1WO9h8Rx2qGleLn2eRNV*Lg9N?!MFz6MXOMc6VC9zwI4H%P zRGIy=YG(rLixoia)k9e%nhG#tqMORw=q2+LBCw)h!utIpXgT@Srh9n zXZS!%$1pRA9b!d9FurJE*>oy(Pg??djH!qOe<$%g?Q9x{>)bKb!2UuNL&zQH=5*gE z+$G0c8hO;irYa%KK}(P-_2py@lWa1I?ofRUflm$utj>bTQY6Z^Ea4LZ7H?33Dry<@ zUbrG~r(PL|RjrSAxn)J;G;`Y&qf;E}^bDfhIE%+L#fny_7mY?dH$Ek3r4uuyQ0;#} ze~iy*AwrA0pTc~4>nTZAWu^IggX3A+iz(}<+w1Lo(S7+U{?)>4Ns6s9A}{-?na>yg zgnkXg=Z9zAvPFRQV#3uFqMr(&CA26@mS&EqpO0qo%49`ik0316M&~3Vw;@@gUBd8A zE)0~%Z4K$hfsVVL-W^#&80!nb4X~-H5R`%K_dwnO};W3iCL}(FO|otOEI$Z5@?=% zZwwu>K3Emau~;EW7tQflBT^ZFXAZ7*z@-=Hh+mdzpQM=$ZsOr=6sx>8`%h0MPjL&~ zeLx4zO|jk~^L7UnyBWa$bG~Aje{p&Oy*1kp`JMWcm^_9Sna{0=jpg>NI_?h{uAbKy(6!OjB6mHn&6`EiRdxN+smR-_XW3 z-UTxaKBaTp?ny_fESMoki5kC=$b{m`>rdY?HHlBzMW3KV&ne6r5WYXoe_5kZ?x zO6+|PEfa?LQ_6DgNvJj6nOtE?MW@cL&Nx$77T26($!&6GTdce0ib(86V>(s5&CsT^ z*WT(Boz=#lThQaL1=gV+opmZTZEo8^!Jtx^1xhR|>joF4C^ofxBvO=#_;!-tg@PJJ z9Epf>!PEZ^`!(k5FVij6e*aQ8P|k;}lBI#)jrHK-GSDf{Dd zrv9#@M?Z%|86hN8QZD#_kWD41H|b^6XNV%|k7)`x3!o0n=`#D$iu%kk9dU z0b5m(!+=oec)aLf_=xYK5uH@gBhO{8hgHQZuF5KO&+R<>^}e#R>=ncAb+P#PSNKw1 zUk}QnOTa73JM&u!XUNIc=mCE83BH0N6NhPp*BhN&c|#xGyekHyD9hq3#3Vug zeD=pP%(>?*e@fbR{wS$`6T6W5#?fpxiKj9N&2^h*xk#xathk9`e3gvjA>C!1fYTly z_qvt{2f4TbKZ3CL(j*G;HgO%KW>+YATQa_hrwJ|YKt2Q5>N3>ja!|1%pkt+U?Or^{ zGhDL^DQbVUh<}R*Gos9*k<@#;y>OIXi!1Djw!tT%e|%Z=3&?*BrovK=AgN;&;8mK( zFX7+mEiL7_OK0NObT;Cvk!QSj$I`!;jiIa=!9~*;q{w4hZ;WuP9kZ*FB*W`leA_X} zK9thz(!}YCJI{)~Jsp8)33`-_!J8%(75*Uq%a1xg|8naD|hiL6tMNaa}6wc^esyossKyNgnoQ<+SrR`}%aIr7{4es3PQG5osD*Q7KOqJ-ack2vAZA(13iBf3Y~?z#LW~#6v*gL$bJ|F^O<8&~ ze+C$_RZdQ2wd?ZSMt9&ZaZCVwA6qMhTnOGRZ7(lY`<)w- z!SuFnQ|vB^&!a5nglGmLO$8m*qBeSAm+fFY7|n*

            B)Tse2a`fBIgKQyq`xe@Ba( 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 delta 850 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

          1. ntF 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 delta 684 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%0AG#%(ZyJgoJn4xAE|t6_sd|Jp!EU-GOk zp4y(un?f^f5OJAK|FI3~0tRk3G@~;^u|OMIc_74!?bOH=UaMuF)PXxXwT9iVHnxup z7{l;iWZos(rUp%tfANF|wSf=t4Lhde2^Vi-dLy4eRsBn1I*V#z`okgx4o@!_P>eTsHtV*X`{d`#7aXq z%DS@1jT3(h1dGSE_R@hHmGTsE8}-N3A38j=pe6o~VH=ISe?&BG5VapIX4m^iGw;A@ z`Zqq(z(-D!QJVh?9mO*6-`T?dN9M`uyy7q#KVJL3($*a%UEx?8EGBvrF&g>CqSg2* zg9TXiO_+EDSLjDS#m84y%T(aMKT=3xSN16&mm|K377blw(W?BE0YlmLP0U!iLv+X2 zxXJ%!mhYv%e~y=_(SLvFaAjU$ccZYV_Dw8V%yky6>`xg|3Z`DA_wa)4H_p?|8G1KqzQFM3iUvPX>8mv!=b%2D+428a@xj*1)WoN( z@2hf@FAx6DmHf-(3F`Ql2Tx$R|6{fOGFhg+J!P$4f01hxcG@lEDE~DlI2lEE@w7Y6 zW3bUvRQG~0R%&6|D*493XyL;+`Xzo+3zIP#Sh!^CpLchZk<;7KX0Dm(nrmjP!y<6~ zuf0*M_--h;#}jl*uJY;n_wnpTd3>Et@7f)_A4uM4qY^_Zy&)?k1+#%wY!``okZNBk zfx6fze*opRJ3g8TyFR9Mt4}3AwOPGot{(7#P%VC{ch`^*bD8+*zI@~@`oWQhcM=;` zejbYHBrIV%CB509E4Ce)C4k0uCe629H3wFYm+WcB-JYD{Xa1uGf(>7JBq zyaop4?QSI%=R3~Ww&6-aSSBY4#lZ{PT#+_5e{2||;xc5iGNBr&)s;BS;u3&Ua5qQ2 z%05z*N9DJ-8A5vJqE?k()6tlQqS}U2o_bzJfPB7@SWqJJ)HLGOB ze`DXf<3TjZW+Q!XCX`yx_H}U-k7pvg%kuaZT{D8>os(sNcYgATVK(N3cLhOfoeN%HuBmJKuoZ5mK>42J2YkTi52f+i9ak@-k& z5O`-gjmFn8p1CUz|IGB!*1I>!XxQk?e+57x;Lt6IFzKc=>QU!;<#H3u_1_52{$U#g z&liE^03~+Od7gQQ#WPNpFqKxa^5vO0>Fq7lIwYZ7pNm_}RmWV}rZQI2bbVuS;qg5v z;}(=LsWYjvYK0rEC07<(@h2tgQ_(#f1FB7~P9bmPK22P-%CT;fECVe_9b|Zpe}{ao zrnZzulG_Ias8b9%KiLw=-<;D*ojy#< z7)7?=R3>vQTMi0kcsdQ7-nD8&eKZ+5!S3M!bas2RbG+DmUvQ>Zxvad(e+p*7lvXk; zA1j)>uq5MgA}(P9J(r3VCEh5|E*a?=(prAVJwM(Eu~fjp;yf_kn0wIc3-6xvY`{ST z^Wx|8=la2(1BS;nIJxFff2{g`mxA;AZaUA1?dTHo9sEq1#~c*lRMYeFqF7^I&A_c= zCER0WO_*;)hy*pqj#ev_zt#gy|D1d@9Hj8!lDA!jc3u~K!#DsN-ItflIgch?XZvmo zel#uCu@Oluz{t_QRP=fgpDx3V!pX*FPIU95KkaYcKf9>qzoGaVpGO>WS zBg?{8cCd}f+>irhDn^ye=-taYcZez(wf@$sW*tt+Uh;J5*`@A7;AnsHOFX*cG5aL5 z!>=9T{gAy>Kxa9m0W4QJB6v`ypv1%TDYzcW_V!Xe_N(tKHRVC9Nc{4LiX`!+p@k-C4Rwl8TeI_h>^C zYZHGFeI1VJFJ@^Vc2HxOK8~t|-Quu1xNgU_Ocz<9=FG{Lf9k;w@LadLtOVA&j5Bph zp*-u!s%Tdg@u=VQH9uRVt17&)rFBVRn%j4G9NDg-(2ZsR#v+NVP7Kn|wH~$*a=Qhk zt$z6J=KZ^H!(Vl``jr|X26$F?^`8f*^?%jVR;r(`ZGI20`|j(iO7(NgZA%8Nz+!H(y;QwcY{zJ60~kR!PqebIHjF8?$K%Q>iZZ zNvRFalTsVJC#Cu>W123}>kj?C9+a4}zk0DDUd$9Ne|QvPcsU+a_rj$3D?OI!dJMF( zsO6eCYGK31g{+XSe_{bjsa>r=**-MsXH#y~JzvGusF%l=9{gxsnc6y}ZdC9)52FJI z(k;s;7OdwAiUsenh+;u^xsI~ej{2pHy#vPFt%L2qc+F)qiyd+8P`w?3VKb%8uEVSB zKKz?}e}R63{s74haSzPz?bdTgb8jST=%iYyp|fff@DLxPkAsnR+DkEH!))eGdVcRQ z^&cEMTL#XzZDf)Oi-k#don|@vD|FQ<51ecy>3{Ey)n|WsccI=eM54^73Arxb^@d73 z8uE{g{b{X4WvBqp%XGEUrAev_b0rJXOfkV!e@+#2NTT`(5fW1MraD`%Rz+DW7*agQ z>B&(wu^@*zV4G`-DdK$lcK@6JX>}%}p(sRwF~<%IKO@Gb(tw!99+$dwP*2i4eadt{ zsOq%V55OA?F;5)%Z@zi-*eSM(5fk^&SbvFHGIy?ID5KC89 ze{{#6@a%Opx`HcvM7oAcpcogr)X?qIm9<+H!=l|NEJQ*t6vco~JxX_eLpe+(#|W?VTl-_oE)=yL=q6hK#v`Jslzb)H^j za|(MyNOb0+c5={KwMw7oK;md!k%L9*eReYa;TxmaW0CVL?0GJtj{7Dti({>g5E3wm z^df0SfqBoe1;BswILj9f1Um`#{W8mW$l>>Dwi;R57T#Vr1}q- zdWqY2bkT}Sn6B|;5pp4;o{aUg$0l`xDsnR#f28n-N*iV9VK44X zwkuiYu%4u`@LH?*{2Fy;M-}CP`n@-K-NCP0O~Aq;OzOP*taO4YBB??>8T*5op?2ahgh<$JAZ$NxI_0 zvyH-T*&}sB!03FPEf@+qo?dq&wzx`y>%et*b)J^L`2;>Go_UH*mPUQA=kKc% zBoGuT&Fu9>3w@F0JP4D9Q-{-p(XMfAtaet+VBMoaza6V*n=)3M$u&CwwFKmPf!s=6 zm+Hb^&7p*A5q|=41smL~#8*f73t65>&#mcj&ljssI7; zqbL{V#V<^v10g(J@H(X$>0Do38?iHvrA}%=XI+-*xIEA5{j8iX z1tX>1k|R{Vbpo)%EumDsUg+)hPir(3F%^PNSexN+Q#cQS!yAJ1d9ld8Ld=pB(We|t;d*nW&N_+Qr*Ai#c6wE%0PD8`&t z;M**h_?HJD=VmfkuZGSTG;XSBjO(4apSTU_52piMLR*kMjN5w^OI?RP#br@cTBWuT z?H)x+Uw36Ax<<^(JGw^gjo9iJ-I4qmS^6#A(ToQz-LbW61xD-PSe?*f0(Z^WaD`La zf4MH}Gz;K(m5uucG6wROMJXoeTwkWovSMA5@o6{2KhWyxVmfD^Nk*q2Lm?<2rD;-X z_j)>PJLH}hJ}OEGQ9v?mX5zvErB|J(z>#WFHn)jjeBDJQoX+d(Je}-9>7aa^k{Z&< zUn#9x1q8JS^aJo^&RIsXVoWZCwRq-Ae{xU0UxXQUi5LDtimn|Rf5`-N>#P6`$gXrn z%TmwNyyh9h>RP2ySt7w&Xl@Ie6 z&&nPABRqq}gLzo=%{OIn?$Qjr){!-!m8@_}1J87Ah_LHsU92!*2gMnQ0@!g-e<=QK zYnXJFI)lM@e)&UsZRcSpy2ODQ{Zz^VFEKqV!)NJ2Gmscp982_^e^%jmgvb?us)7o+#YHwRZo!lLQGypY3~1&Fujch@ zt^w}Z>^{)c`~WzX^6e>rjrf-O15wXb)zG4elczZg@{wItDmc-%fmJ?F3G(xZP=ge}fTPj+yny zcrxSA>4oJq@3OfOXL+5V&r@SiV@b|GZ^^oqiW@c{-&H!?+3KR!U+7$QN$IHCcl96T zh{=uYm4c-)t+ESrlGrh8tYVZprm?Mx6KqyD`U(c*JK_JPs5_D8kQ|^LT9cI~O`lnq zgfPvoEvVgV)+K1}f`;&5e|3p=($VoqIKUv-FIyGMYuFT8!Cnpdp{AyadL>}9?ox08 zoA-Ebx&~aOdc4e@Ue?AHyY1alGd10%HbQyf(tb{e@RX)zDwT{iXwNF z3B8iU?uuOM$MNxr7s)zx#e`ul$!}z~_=TDUR0MjP

            @I#&TRN^WAup2oyiJOb~JO zYbb}1t>IR35CF#Ln(y6dZA?^%vJWR)`hJAxHjLz;i$?oi5MzW~H!4&dXJ@t1 z4rxO)jcfE&E!ME8>3D3<78ptQ^i3NV1l6$|3j3WLqLD%pe=6OeNur{=&m>6Ovu3DK zR{684AD|YoiyU_Z05$H+zKxUpgpY|Zi~XP@augC?<$9h~;8&%~O84UK-g!|hb;>BZ zDU2C?R828s6q>Y{mu)g2uuxRpOb;~H)Cwr#yPv%aj%N=?A^g}EUy!v$ge1TNzD3W| zURg;2Aru$5e-l6%=u()m9UM9iA7ZI37>AV}2&hnHn$e|pHk0q)^+j$k>ce_C*S#uW z!p`Pt%{T9dNbI4aKAo*0S<~8=Az7S|9l?J69|>_TyjVK0^TgQE*uPeq>tct2ZWZ1y z)9P}hkZ&b+@L7gqgNM3t8Maig@SEIpg!*WR>EeFCf7G2#ox9x~ZJuC0I%qR`26l&1 z>(Lu+rHwJ!CP!T|C=~Ze$s59QKTeHYy4&&Ij>G!_sz>Tew_l&&9sn$4<~kv~`GPbn zQD>LgYLiTW^*gkao8{uyNzS_MEI)-hHGy^96L>fI5YGlYunl{Vbb(8B0~HXibQj?@ zVgmQrf7K0t_T|wDK_fpc*v;;h&R4sTUq1z~Kfg9;bg%t`bhpz%|I{7_sWs2;&4NlW ziE7&F6FIamOAjg4)!LAiOOJ#V7HcyRawcr3jQ|y_?_ilt`91S@k}cHCLrWLnVz5cs z@YaE*hD)DGU^zzxm*Ql_l0*D2+pe27J&K0lf6;qm{AmCp@dc%0;c?b*^L}@$9!>n) znY~*}-HX?qbK01-3>@*5(|b9xt+Oysb^Gx&UtgW;l6Wdb``MwRgO|+Sql19CNI}e6 z28sYBU{FY$znEgXeom`1OB&`w%nD$tjh zSk=%U!7{OLxP&0@dmy2bN%~MVvs&^>DVME%lS&~FX%zv^yi#3@J^vncf(%ciwy064 zL_t}bDIB?#p4f=qD*Ll*_&nmBtEPaee+WE$O@Q)ZwCvoNxPryt!NegU)UDz^gN)H; z`JzmBCQ(YoN<(on9Sso*a40{Q-e-u8db)id;RQ%B*^ZwcsL1awP`{FP$AAI;5&7D> zV==p&SlUt1Na&K?Q}&S`QQ5(?+Ai9D!r{BnW)c3*ak_e$(lCau3Z)=)gabG4e?|6O zNTdS6>LI24v`2s5dhh4J187|`j0gRyWi+o|8@y_;JE1yEU1R0HQl!l>u!_gOUYtd~ z0(nS-iv{J_T-gWh#Zg>`apm{qXT;QBpgPHZnS7;Gsk*^l$%uH|DA;DTyaxBxh!~(el42g>x9)

            8KiInm2qf36{3n< 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

            Pyj@oo2 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�MGP;&3F%W;l6>_d2QcjEEtR%5DS; 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 G0000wmz1>t delta 690 zcmV;j0!{t5nh2}O0kFmw5%8_WNT$G-jtBw(0K^3V02Y^@!T}Y3E^KvSrBq#S+AtJ- zrc(dIm0xNj7Cy9f5)uyxScO#RG}yzmR+UMdU@5UH+u6&s|32FZU}#!_`Vz(Vx#ygF zuYH;L6LFDB3^(m|8x{`_s~JpxEys)b1m?@h{m!8-a*&DL(FrHGv+Y{39f32US5QNlK5<`}*3 zpaW=yNTg+{V&=h$nNkUd9v0NZTa0kj?h-_Xy4>J?=hJ|H3^VtO9v@K$brEriB%zCM zJZGT`s1N+Ug|~PLLK+D1`u7p)3CxxW3vC^P0?d<@2$l|e=nkq+hOU+&%q{+ORC^BSaMb|TJ>d4 zakcjMv=Y6n@|ET}*XBsFR`lP)BY7P;vac{!{Ke?5pDJBc;|^KXxbUGng>WLFM(Q{H zlGE7Na&OkxD<8c~KZ;IwEw9hVcl&hSvE5DC4YQdP$hcsLG!5qcK%On9!8ra8P)h>@ zm#PZ_8n>dt0j5X~@U6v2rofku2m$~A#03DCR|^6)1-7~~8Dp1`3j#d@_!$6~(F+1g z1DP5CmmdrQG6T0o0GCt@0x|;%OaPaO3<5#}dQAYA&I|%YB*9()0C!<>WoU18b7gZ- YO9ci10000C01N;`0{{R~VE_OC0FD?o*#H0l diff --git a/Moose Test Missions/Moose_Test_SPAWN/MOOSE_Test_SPAWN.miz b/Moose Test Missions/Moose_Test_SPAWN/MOOSE_Test_SPAWN.miz index b2ecae6e774cdbcd30926b2f2bd1dcc7f0b019f8..7f8f70cc7bc697a05fdfa7291e5576aaa2fdf547 100644 GIT binary patch delta 110354 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

            B)Tse2a`fBIgK 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 delta 790 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 ml)w8+l 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

              uz{t_QRP=fgpDx3V!pX*FP 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

              ^6e>rjrf-O15wXb)zG4elczZg@{wItDmc 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

            1. ntFwws^>8$z|0V2!e99cPq*WNqW)eA1B4z<&UAp(@}V;3ITO ze`RmT5UrC7)FHDoUbV}l6s*!j*njZ~X=v`iTdK*YfTHzLW7HC5Fps;H8<0LL7J?KY zbRTuRQX!uDAkKisu<|0YRU|_~+=Xj>Gw>!R)TlaVM>%^NN@Hk|q3*54qF;51&g0KpppceHT{w1KxJZjv}~A}^adCK287xTB9tpbxtLa+3r? zQ+e4GLW(I~zqzB1RjC8~K&RKEnBqKLuVQ*f8EaF#L~=cfe<@DX zH7llfw6QjAT$5soGj;un=^cHnO&`~#nBr6|ub9$NdGzq`qr*@4v8o>^flnFX=da0F zUiYS?pE8)a6Lc-(<7PgC&d-uTI!XsLvK-4HbkX^AKM0qgt=gaobPu@Y1u~G*CY%9T z=QXb~Zj@%XI^G@Y`_n|PS9|a+e+mD|B;0{%ej?-?TnOjzIN3;2BS_{0+8l-meN{e! zF@yUN7(RlI$7bcTRc&7>NfPC-+M_LRpRSxK4(7LzzhSU*Gz zjzs;>R);Hd3;G729vgYbXmal#-e;g8+myW8yW&_{sShC4yRC@nIMHi%}9!g zuh=Qa#DrD_JH0}WpAr_-f1ZO1_$S=%=-MGdyL|_I`@a8-M!tT z-VaS>V1S4fgceavsF#kVGC@GSWGLZ#)G0&b;{`?4b&;YL?bJ)!e^P_tm9a3h{`Qy& z6L(zUTlFL6mSe}o(I^Jl(1K?&`cn?HF&_7c`_Y@D_fvXCKfXv{Z5t=K7t%4hPpU-T ziszt&6j+PVIb?FsoI136yW6j0lSgnt6`mQJQTxaJ$uIl^5GXf4208SOL*l()U>;9F zSpM#>Pm&TSUIrKVe;8$`fsyB$@k^41oyKGdVCaPmdVU*{Sb?I;VWu(o7B@8s1|zTh z#8L7i>3-=XP!q}dbD98|(SYX8pQ%p~N2s4~ycYdN8k!U5(VJA#HqMN%u(P7Gl={J+ zNQF;=rP{EWuGgBQi?$)vPMK0Vm6O(~7}!REBfS;hKD8OFf3mKDO-T>9UK1^DkYANt zRfU}?%phn{9SSKKr0@!Ahe8ww0b_)at)mYE*6R~ei#!($)-D|EnoFt)30l9B)-R-U z+zvkiQ8i}z?ftO-1?>5L*xTRT6Yn9Q@n4ZY14X1#ue|>s**xQfiun^VROZvktt{!T!oaQ?ca!TBtq%N#&=tJm}SM;taY|6=& z%arA0Q=UkrRG8ALOICm`(&ZVT?d{{ky~DSnF3C@vK47+pgdlYHWnSg-(v!t5(lI{u zmBKcZ_9CqCdK?>paO{tr^h{+_D?#2U`VL&#xu%AVKH2%=rMJ8)5; zIfIS@iUdNc{mM5M`ZES+Kt)hC2mKj$jUf9E1QdM!g70OV1H>8h>m;4=!_9FV>(G++ z7f3O26t&_C-9~My=RjI3{p_oWwv;;1^THg1lo@WBxvxS27`#J!FZF-brUHo%ry7{t zmPi!(e^R0u2&zu8FT#)-LHohV#Gtg{63DiV-;WHaKK!K$#G{gLuegP!)#+b7h+QLr zq?1i3iz!*TCmbhcuA;f&_j_@q7hjW1P|MH_yaLpr;|Zt-hq(q?y%1bs;&jzF;rVgo z?AFEK@z`9uJ8=zSKsvKgvGuLZ#uTaCoS0Irf4a?xQ)OEV_ZlOM;Xnw zA5FFn3efBx%J7=*1=#4iQS1b`3`IlkrxW;T?iBoZw>N0KH`tcFfuSPH)ttBT{s1O& zjm^Pj>`>}4Fm`OS;|Q3w*mxLzu2aCF0)l0&cCXueynB5Aqx~azlABdTf>x-EQHO`3 ze_d1O{uE+F)l^!bW3xo&dp9DJmz5`?>^)0=Lk)86^~foy&*Gn8by#U-(%rAHHp+Q{ z%a@}-c^QKlRUq|GF;#aI!dG%8p#6yJcx1h`FZ#2-TqmmDHp)&yILSUN5hURQm6*KM z##c+!N1mi-e-pq^>j$31LOM`1aB(FrUC2rM;~JE_+%W#X z=})H?>UOkMoA*N9=)FYueck(&WyJl6GU+G)?%f_SD8j|lt3k5RtxNdbvk%7G686$+ zP^RtQQ3$d;9qgEtRu`gNrahXHT{89TlGWyDvK_NvSxq}*09G^evlnV+TB=?%e6+dO3PBIg#uFxN@V;Bk-2ymD`2d=tlgw8 zwM(6UNcLcyBs2W+VIMOfdEqHp-A;Fzt*%3gNQ>~u<*;rh2V?`+_H9{0f97>Q-&oix z(wH_X1C!6$7n`NaP>Yppl6_g5QdeflRd4-0X;kuYSqVtFjC#jxc-|c4GUU&(Nrbi; z`g0g)=7>xEI_j(ZX)1|-NBy}TFKk$NrJeSjMi7Fm=bIZ<3h;D8hyu?v?lv~?;bro zjQTUrd(rrZs!E|i3*y54{e0)0FqPtJgj$9|wYml8)oK))O?xkSmFG{$!N=e~Kf?v_ z41OlV?Q{CTzSAp8X0IkSYV{6oZ1L`Fu79NUi=+{WQZc?Vf_@7;e@Q>k!$tboHvQoh zkyF9tOP0&i^Lz%dBzu&N;SE1TX&)?C$&|F1x8f?_-@^%b+)Rf(bPzmZYgW!yU|#Nv z$My$=H47&3I?g8BCs;cf!cReLnkG|EaL6diDyKc__>J>&v$At%TThO;@=w`#NW`x% zm%%UgUX)={%=FbXe@s{Zxmdu~dx=`l&W&(oLNbFfqi%0XZoOxxAdvzsk+JJdsp#)cC-DS@X&j@~>$wb#JV;ZFBISYajRE*S>>X=!e;Y~hbEx7!EDBU)Q1+aJ zqrgQd6x+E75<6wt1PE8IwY0LA$XcV7k`t8wJN=m6p4r}&R(5hc1DCAk(bLn@)6>(_ z(*rMTNstqQJaEHRgaBo#gS5q3G}$>-02+6ibDsT!qk*{41nKy2p-XS?eq%gZ<-L59 zR`Jcj*6!%`e=3f+8y}zY1O&cHXuPY^Nf3}8fS(qb4R&lxb;K0>W<(7Yo zHXC@LaF#m9xVqd+lK>J|5+GhEzua;}FQ8OYUz3tjn~ofBGtOpGMZ93}KNOUn21Czi z%;bfXUX-BP!Y*AvICtSHW`(^LO%%@E29$WwV$uVzNGZub%{dFosXfq(K1%WF#(sRy z0E?qEf0^sRGAD7gUXco+FB5~4wJ3NHNI**wsYHp~LVQk~^gbLrlsQ2tE&Q{-f;^m{ z&Aav`#P0g)F)K5e*}hG`(sQxhIKx>HCvf9yd4ZWP^Es)PT?h3+?aTdx17tQSLWIXn z!22iPs_tNUT*?En+$Zs*Z^`YCQIAzz-D_m+e_DukJfgN7JVzJT`(o>{H1&CC6^pGw zypJAkRUY@N(YN)3>b|`}Z8@eDfyFfM8mhmeTYZ%K;WFCk^tPcHW@3ZNLmG}!0R1Bh zLPk1=LMP`qg}-TqP>!+;r4)N)S%*8gN8P()*Q1>#qruum>Lk6+Kc;q_GWr%RMpy*a zeq!WjBIjmU7#F9F5)9x zC7{l(rWy7skyqBJZ8jX+>BR~Mij=Z~e;;|0Q&js53OXG08sXd5$A7A~0*=$0X}-d^ z*lGx5zod4?K!t5=e{8=%7F0~AHB46XUI2o>8!dg3Z7qEa8Et#qqjZel%UQFf@1X2C z8~d7$8I^Vye+A=+-1Ub3r&Fe3;a(dC3i5uK>;&9)l<>~pQLSW%_iQzN{!knEe>Q?G zbd6W+T616MlBU4O3^<~$jD4~zOLAFjf@|qOxyI!7V7*~%on4GE-DDSY7O{MW#Mo#U zV}|&5GK}e@`yPyA|JJ6Yv!l;qOlsJJTTVaC|JyA|rr-aywj|Tj|5|I3#;*wt$g;fk zqRa^|)Br`wETC8l5=M@i>O3({f2oWxSrCf`5)l-iPw9#yx8ta#WCBhm4h;Yo*AK}s zsA^!2Cq8?;$T0TDs)f=!UR7YhXmuOkHt|z^LYhwZ7c_ZL}^Xp=>8_ba-j`2 z3xHqaHX?M?4Xf?6(f&WbiP7J@ipJikwWs4orJb_}vp{D@B-vZX6>?hTeU5D{c?!&LZ!5Ey>z*~=85@}410J$k1D?IS zZE0{rtCJik z+{{PZW|Q;YHokjD>bvJ}wz5K_8rt1fz!zN!9l8@85CxlFM!b+3(6)r43G9B_E1e&j zW+Nu{0z^J%{KOD4f9vyi+{S&Gc#6ay(P>VD_=xxY=HaI%yQ6vW>0e|%WL|UjXb9UE zcbvtcog<-}z3CXIF9zfMSD8WU`!O5;Zw8CJv*;G#{bn#64vvrHSJe&AHZz6IP(1 znLNBhSC`JHn;dgW#zVjeR~JS}=M-2f(i!v}TYQKjo0DN?gL&?uD;jgVMRe{yf|GP$>}`1grETwom2DV-igiCnnO@~#gEHmzJwlM)#RRL*XaN+*1=_%3euNM8D>w zhdj}Szwx)BQf==|x=2vdZF8=NX^l}68-$O9nN_(X3^Y!Gg`KFuU}pI^jt=3*p0FG# zOxcIj)x^mQ(xy>bU8IXoDZbmwy>|Kr{6j*MWslXn1Q@ZaeKfe##i<*V6TJP4!euU| z397)Ze~DNfgSAP0hzQSa@6%+J&Wl<^gg>(!NWS9j8Ry9nrf7Yg8&{~~(3Hw@`xAg% zCv!UT9;TywHpU-Fyv|G5doMJ-6GsEmOegb{;@Dj$d^d@&iz#Sax-o=&I>+?URh}0q z5=BA@&43Od7z-fG6=2J8f=QB?zFMKOrmspse<@4ioOY%&eiAcrRE_?cXEOk#OG|Up zIwjY&J(5C5I)Jhu9Z9aWW`!b`PV?C%E;UW`93@x^30I^u%AKx+DXuFNjw9GNx{yyw zM|qu^`wxRRAqEuvOOeIAQF?<;8?xbo{bhntnTl|^-`6Sx&$7TEBJ>UaKcI=8Lc^2vll0cj0hT#}&~pJZgo~61 zXRi-WVpxA&ZWmPaC441%_5ojcep5sk5Ez3!9N)OROUV>}YPkiM)AtVY86-{R-Gjhk zfS|!&Z=xcj9d6F{5f=+I11TiU#MlZWe+AavJ9Ox60*se03WVb(E%gIb?hG)Sg8EF7 zWll>^!94LSa@7dQF^Hd8fx*-l(3LDL{P_8x0wwe4WSJFNFZ%t*WPSzXO$_-BjAMZQ z9q}K1z@a`!r?5l=@^%mgID3GB9OGud{mbc8MnGr|q+U`b@S#abal_pO))_Nsf8ZW$ zAj+-ZFtnjr&c^8?9RVEz?G9O7$VP4;(gx--B!P}HPSfD` z%-_dj)1Q*nO`bvW&+kvo6WH7@A(UDQLcnn_avp%FWr`~b2|7vvb@U}dW8*>|`XD(h z!yLU!QAE*I_zXK>iOG1+q-|m}e|~R2xmhgvO%uq>=a*R$1JnrAT!|zH&CD6|tL*wm zaD}jd3OIbY7_P7+k23S$R0R2if>~`Qa)7v2&Gz2DSv70g>TF3W@^o(BU+@ z&Sp-i%J3p|?cIGwmM-0qBSp=aI%|hIOz3q)k|zg$PcJ`axa$8tDQ>bJAzmOvt%CrD z`DHSjE-!I#@G*;fjtkBIe^A<}5coXO)J@bRXhhe=PkBBrbvT%5a5gX{(_7U4m}g^u zs6q+Ka50}j#?kM~=?!vtkxhXQ5)cebOq%>`?M_!|fh+0^)g{PV5r^FXKwv?ZzZ(QE ztlbRi1N4;c7Y7_PPzpcMZQx>xf3|;dZ&_dCvYX<2ws?^03GGlIh^`bE3+ycmQtEhE$LZW zD=Avi8VRaN)(6Z64x#iS%6tVMW}FE=>i}Hj`Lt$c42pdz-}U$SVast~&>_ofe}Dh@ z&D+<5AxO54!%Ra{e<@0f+{efw(Aa!UyS7=bz}e!YUvzgiQwn4Y?BMb;eE(t-nU1;i zc0@Wp`sNtSUhCrtLMWqEBSViUCNT=dzWM4Nyye3ypsMy&P2LtkF0?`~5 zFs!g252PoWBR!T8ml9!tsF@`g!*J5#ER|6!WY*HAe={|c*N$%vY|w4+RO_QX#jyyU zt;2Ep-DWHdkLTtl(ZIVq{s7kd!MWhxTC`1BFAmplqFoKc#g!}F!hZP$9#nfRlZ2&4 zi>A3ehY@3-I?fip|C6Q5SNCZMc|||$_2A&*Vc~o*u@U-Ba5NtucB9iS9(YQFVW)pX zM?gx_e*xFZ3WxkDGbfN;tN{~Vg;FQQp zNF7r=KlNkDxLjyWZC*u(LtzaHHSa;5bXn2uQ(Vu}fS*PdL zf0f%_bGb|Oh-g*zn~z~ZDo20QmyD)!bal1ZFpH$^Rw)a0x|~v>%^)w_UI*uMQ+;anXOVBFU;CV*1k8%w$cXnh!KHdcF-1 zs?SYpmJhj^BFN<9m2YD%tGK8%p6Aoxf55l93<_LE1~bf&dq3r?3YY~V74CPGmMmEz zx-biN;)>6f^JyvQFq*sRdYueXK=ZDZ-`fOn6^c@7woJ z>GlsZs{#?i9)T)4QsR=A1G|z+*GWt}ORY+`IQHNySY?b8;{3Qsd9m&fj%QuNe+#V< z$LlrGj@L}vir8b;Lba~jES=^rrc1!Vt}w2ED3E9i&*w82hWST0z_bK!gFP;FM9%p& z#~Up#bCQm0Izvqr37vu9VcMzy z=Y4qxdEuUJfg3a#A12UQVt^W~f6aAd*aKepK=UvC(T{#4*q$67tVOnN3gN{-l!new z2HDUJIY*Z1j3ExTpf@N5JQ+`%mz>lUcu1n8z*UUS@^~8Z!s&6d^A-=k^;5s(L;j`j z?aoU6n~v{foOx(fhv+t~gms4+rgEr`)ER+7C%Uk_ZXSKMVDYBDn~R)yeYLKY163jN2 z{h({FP^Tvkdw+PicsFvbzJzl!5zdc5+c|sn_{poEzB)dA%p)fbDo_4>SrH^kiCEXI z8e8}Hr2pn^rOVI$%e!m`fBETud5>!b`RD&hUA7WaI}ZPvhm$4oHfj!C({zfcrmXk; zuk+89cpd!9p6hXXAbfE!qQuC_`fVugfbsDQZLLlMYp(D9h{V%pHMoom;GGopSGn3q zT=@TxhEolIpr_?1fI9-s$Xup1m*P5lEK2Mt11FH`1~@3FeXfkMe;F+qCK`AdndV|L zSZ1vh%RzMqP(O0&_30d|#Aoz+IbCE>Q@|DeU4{^}cu-?GsSaBTHFeM$AN%(R$hwb? zr2!mv*+4y(YLEgfhLM1wIG&X5+Z>X2UCiYs8PsQAkbFYytTEYz2sN?k36CTG%);mcv4v<7XA8hS4)VbFWK>5^e3bC_gD zFL+4<@LICdt1a?$bCG9$k?3|KIz%?%5NoG*z& zw^}B!W5oYY4eC^%GM|$EW6eQzm%6loBHu0&V{nGY_v(TWXbNu!qkeRl6nf!Sppnf~ zwOgwqJNONZ!8I*Agxo;tiEu=5|6zAc(RlI`ctd&o3I`jLhcwLoxC=KV%o`ulRlH`1 zi!~!$f7lU**+bds>|>nGCON3Pj#1S52ery0!2%4pa=@vt`MM*{pVaEe+LU3CK=GwA zZUiD8g!k|1`LlAD<$_qyeY-sgT;OhbPbMiHSQVH_`@^!DixKw~{uQMJLr0G;bi>fG zqY7GFK{~^4xqT;lLTctCvKXAChTsV}w}E~cf9MG#7p5OKU>_g;@o@j_6nwiB9xrQO~v zI)3rH!~Ii7Nxhg^pmx8UvS{nSe$7ix38kpLL!A{`4==wxDk8iW4perhz%akEG1f6d zf0!&6`E^3B?bDS6q^0xXV1i7Spg?EB1#~@n9P7nr(@AsH+0Tq6LBIn~SIfA-B2q#w z9cxPYv>YY+-aO4Y&U5L>*P6vwFbhom`OkMX-4*@XT=i}2jDP7@y8Ii#w(%ma>Gx0u zvJ{%`I^&lcMQOx3Vk?OFs}vC=gq zis&zMOyNNT{Dk}xctk?~Nx9I&I($e(25B-)E+u9sD3X9bz<_Q9mri?ZCE!WsyrvR# z7m4Y~6oI4f=<_)yTNhBT5(Ne++Ve^29K_V`FQr?j&c!zBx(>O(4_$d|6fYCDOf6(7kzc|eyn(5bge3{^Fpbv6LlFu_R>*{2n(jMSv zwSYO`t(N*ZmLgUSXqXfM)l3LY{)hS!_~4mrp>S;hxr~7#cNQ?IV^LK~d9PH*o}mMq z^vk#Aaj3O4z1h!iR&1l=Ijcr7xm%2Q5I|aD=_dy;fMa6@uYItJv+t+@fB#I2SX%Y) zwY7FU#Df?NScp-iyH-sjA8*Di_8~rBgG>uh%tIE6Ez<&+?~$S)HvP}t&>-Cm~ z&S)ygU%r@uuz-BjA+BKTP%@EZY`*l_<*T;o$9&4%5?zPXx66lwz8Ci&1Seu&PhmxT z3mn}6N{-A7M7_<_2&kD(^bK-3%nqe#jkT5d4GH~xs%~u?fJ%y0m6C>e~XU+hqxjJxi}w}#xA@|7fdTfrx%pu<7`wrIP4Bd&rU#s2SIs# za+dw2#TSx9)hb=+(Oge`r}2oddUB`m`Ae@5DEC~zCJoks*>okYi>A3Tg=i>p)?g+} zG=fnf+;2!JwMoZ~-NK%K-hORjgHA0UblkOp8cygqR_HYHe?o^z_9eN28VKh{I4=~O zE>@Z^{q^mdCN4AosViE)dMPqtTXw6SBMB-EMU4gb&efFbykTYhbWW;6tRdK#?5`}EU8SS z0QK+!`gT0uj^mlzE8P5KcekSH8sgSV0hQ_}DUt-aZsyz#I54o7aYy2E)U;97(Gp<# z#yP<&428|UMsa48H*MGJMY(tht_c6}QBDqN1R=eFEb=d5iCEGEywmRkrDUv+Ri@?|GGMQiCYBkEI({u#J!C3o) zhNuZf_$z_6MUgH$(PH1zx~L&=SeUCEEVqsfg&c~-vDb8~cKAfGp^|1c-bSP^k|q8H z^C)K}e@3V(DvGKnG6cp(7leqtS)!}q2!*toJ6*w8n#S<>syQjVPoBXl8lVbOq(K4Q zXtU9j&8NLOq^^@y>5+8>v6E2@4ha1sCBOw%%TyMU85fO|^X1G?gZV~{`>|e|RWoGu zqDv?+{dgBzfanpT&h*nz4ay<{Ndq-BUN)r}e<~Ghr~oOT=!G}V6-5OSTv@gcoBH>! zgHvW`oG(oq$-egNf~xVkMa|j~>Sc7N^>Op@#~_G$Q@CVR+?s3l;6(AZ7wwWa2sgB$ znKGTcZz!tnHt>;fA@%Z`yAUtGkth&r@s&{);_!1DN}6?*i3!$1r!it4`HzTaD^M7< zf6B$t(An~0r7kMuZFz@Kp27VNwOM&kH^=Lwy7hm8dpzrleot{e*I^LG05x2@=igis zTJ5Zx0}T}(G#*mE_tnX7)sEd*M^CZW=Hn|;07EX$0F#1tj%#m!;22X}S}}!{#Mt?6 zXpv8R{y55}*+L@zv3r=TPPlI1-GSLSe>8r_5w-460vu{?D~QK6zVtMJF^Iy5)UIwY ziTOz#y}+&2eHX>3mMYe#^zo>M+A_aAu7e&O%#v4qk%XoQNzr9>Mv}Ra(tEtf2tFq;cHEEYy%Ubm+IU1%@eP(F=3n_owwuBmdU+7&GqIGD4sp2RulW z2n=Mg2nx+$R-4M#mQ*`K$F|c3|uuag> zP-xUdr>9sj-#z-umBgFkY8h-M;%*>5HVq0Oq8;uTS8z_jFO4JK+^iwsb02zLZJxHK z*#MRn;VfZE-s~6Nd3+&?$I1(F~Z5`bQY44wH{U!cnydm)(`N4P?2LOc``L<9_#3n3>)`v zGEfWQLvQ=o+}RDMB@oOWE%)@Op_Bce=?OT;tM`5#E+C!Wk|;A8pNDh#b%Fo2Ez=Mw9l@p1yyX690o7LOV_ipKDL06yeCe_>BT$?g7EQ1 zQ=eW9HmeUE_QZQZ245}G4h@jwIWeE`QxG$K$<=FHS8hfQk7xS8X;2+^w@{x2q1?c~ zNs98NCV;A-Lqz!^Suka3NHh6?S9EyBlY*esDc^4f^gjT?f57GPa>6*BB+DtfdE&@O zeLOw_T_vSQV7?YH8*apfa3+o*{D-5<=TS^Rt}2tIpUwH%kmtg6ESdiiJ)+;y=>-@9 zi|kQP5`Mp2B$xol33x-sZDsSh57kww05u?`zE))5wqn>cM&#P{x2ZvCWs_cIvvb#1 z^P+z=!sM_Mf8MQ2DJjpKJ|ZrC6vi9zW~P?cpvb0>BA`#3QkwxXVH@FG4+{FHY3GN3 z0K4qLVEDFw3Twg%I7Gk5=8G!{@_RfZ<1eN0y39S6IQ6j`IlYgx<^)WDR_pX!Xb}(5e?~1DzydbW*E3Dz$8jnKKqiTYBo>$VWH4HTmnDot@&3GYB7>@{md(Hf>pbfo z;$OGl55tx132or}uIz?YOK!s-Y=mCVZsbbnL+JTGEVHdIs=VfBZR8~7A%$gtGY4s! zVIW?3q=P<37ejMQ$8k!KhTPye2hchnzB)TSIDU83JXF!n)-X@|C#Pp`*MVf4e?kk8 zuLh^<;NapG%15K6JWx-#rDKj@4wo>QpaD% z9++iJSsk^KJw9VA7R$-R-7=GKe>Bl}$sy_y15|ut@a3M9F2wzlOK0K!!)Wn5V4a@( z;s;gaN1&lYpWTYyaaRXKG4Hr+)^E=*=T>#+QK#Sus4eZ_vF#X=vI$uEWPj~$=VcfT zB5aWS`AvJ!QlQn^8oCV)Dps)ZVYFW>|F1!OypIMEMU69K0W{pj3+W_YyxVrzBI>`}MARp0g$9e+qxy|o>z?^#dAh_bmnk7Ue{&xf$| zIG8$rId6?|RT`>nm&Cf-e{;R(O;^3GbvJ&()`xmSYI6$)Hb63VEi)SyVh_4X=-ALx zAnd7;at2Qn@$Kh(HUUv-l6?XGS52bLEXXE?--LZ2?;bpAZVP)R349W757xW}9rO`i zh3-WrS6|bE1@bGcZVK#ncf_dSchJI#e!UKc;;vh1N7_BvMe}oTf3+Q91h$+HSXm~6 z?ck;f(RxxyGqwSp752%#kYi3S7h7`-)cG7717Ix2m`uYkTA&TXU@^-un)w+R2B3Ti zhEcGM3=`dtW1xkW920thAcf3X0lR^iZGih-Ykv=RYoFf&-^K#^kJ~l{D_W=bYunml zst!}OfzrmPza=zGe_0E$w5D$b+s0km7Q!32B{BBnOsO={ImsNE`<#bDrd4;E%;?1N zTc{Bgb4irX@2zAcZk`ePGP^{#fKGl1t)ns_DXpD~(QaE4Jr5R#7E8@m$_a6Y5i1r@ z9d7qnEN$PV@csI})iPV#cMC{U+VoxLL2&3cT+ZR%9>w*-fA?l3G%hUg;2YcN@%Qi* zL<>HCcmA$_dUzsF zDOIY=m#J?Se-Wt_PC~cZv_qCX+O}!seI(#>sVpaam|h2%8O^jn-{nb~eV-`h4BUXBZsjQ?jZ< z|9;rpU{Lx|Ityd1!nt@SbF^w^3-Uvu5E$f$Jk8-Zt^MKBj=B&TF`HJ11{n%T=o4)w zrQ~#XHr1tfcmM#s3zS?G-I_A-cd$cWUt+bff5hK+j99RE{91jZq^zu_!7fS)HI{PG zKcD<^H~O{NwB2zc@#z{JxWQo{UB#HKuJd`l6#x9QrZ!}nbbRABRZ3f81~L8YQblE2 zd-QEyacZVe#fc1esYGYG{K5g2w(|jl$mB9OGSgs(aB_O6TLW#-8pc=$Un6q#Aaz0k ze?77p!jGVV9v>Au#No7bTlckQ)WhA3VC`$qJ0{eVjq5|Ve)#HslFfLJ4*nSLj{FNX z^w*OeFpH6T_>cTdRv}1YJ z1b?`LV&Ea|41A#cO5(0VzKM=O_%;(qxLVr4Bn~F!Gv7O^Zrj!fo5@TcY5{E0@7Ps< z@6s*slvPymUg%Aqi;U_X${32{JA6J-xP!NL2q)no8;=;GUo!NKiCGdn^olG@0 zl6F84k0UwlU*$^}FMg~+9+oi74M;F=^Ep4iUKX}ag?gAzdF2RTz%ZXbxu>u4Pk(rw ztVdJCR6vG>ID<(M)I_!d_!0$?3Q()uah6&Qh;gfI4&vgI97Q7)=TD$G7KMK_W+kI1 zbWbQ^;$zeY_H?`=d_QF;#C?jY(4 z#o>dQscj?VbB@I{;6<>+^70=`XWZjg*)?8gbTdkN@Z#|0@yQ`hHl}Z|_yLUB#u*0tvxg`)6hG9avYu}mAMC=^K3*8UyAF~kWo4@Y=Rr zlR^>EEkHcybH!J5BYFTCoa$ze*tJgdF~N?tBRJvaYC7LFE@HuvB40Mu^0ukvAEX12|P@S+ys?`GChnOWNMwsXtD>N5s9rKVHX{k<1E z0TbCu5V<%WXg+CZeSa^C%;fSFw>{D55LR*xYnNe4CI&yQCePIsINNZUb}XvJbpNBA zY8yYHH=QA-HO6L00gEz$z|S$YKtw`~Y#k(?*cO;b1D9>MUNyH&`5w~e1f)`%%A^?Q zJ00^1uilN?ge*#N4cX6T9H;^#3<0VvEpUK>msoi!~dfKdT zwkoMQ8)*)ZFn`*#meD}VfFsu^P8Osa8t6kNp7pYkQr2i2i^$b8SqA3j?kzabx{0!vcCLIPC_3b1YzHz~#N zny#Aq@)G7F+Nh)}{^a&mg`2#{MEy$u#@W%}^tK5oJAVe$g3M-A{m<|~uyURM&|nCO zXkdphA_EwM`sU>L?CnGPo0K21BM>;Xf+baJNm@n^a5Y%+_@jfRqy>RX`g0Dma8CRC zgy*8Datf3?Cv)oOJE5v00bw>wsd6(zQ$|e<Up3!m-|5OJ5ihjS451Eu~f_E z4hdS;<$n}K-)lgF3W-I4jk%Cn@>VvNFfAFP!zDH17r!Oy!t>GQMkD=)x*oUmSM1WYd8{^iPyEJ5?R5mq4C zae=4&&=7N4hGHV^2dJjZ>Fl((^;!iQ3Zap7CVvZ^r@a>0l(iIjDmRS9hY0ARuFQ1| zyzJW{@eE22jCN^Awb}5nN{~~HQyc`_xDV^Jf^eDEwcKN51~ zPUD8LaG{W28ZeAg8^eX^6YFKDFfUPJb$>AFL{nxvR%0>Rqe~fTUA)bLXk?T_zGQXK z`KU;96{u#B+u4R-WO~4oM6`x^vtHIJ2pJlBoDpiqEprVm>cVH!Si4rB1)dq)c*UX+ zMTem&*jf-Zh$u>jIut5Fzj)Mb@a?1i=`r{}OtVpbL;K-$cA20VQ3Lod7BE+6Tz?5B zH+KHw@cj3E2+8%F7)pY3zc`G3-+%n|?r%@}Z{9xsh8NodP%>skig8F40q1J>7I!Qm zkPfAF_-<}!wBb4*lX-@hV0FLfE-;cV%$p$AK9pVz^x=3s?&ukYZpWm}#F#R9w0z%p zMYWFZ*vWgu4y%JGAsqy+WQ!X){eP=of6ZuRldx_W1gw76)ue_s2DmN2wKYsGohKiJ ze|T-w(-tvv=abNMpgS!{#uWtqySYhmWMKG4PI}X(ATC>`Cy&S@rM~5T@BCLNX&!t>JOoB4Ts(<^2#hdW8e9GGp8*$rg?BUHBgC$N3z6-;N;UMJuHl7U5qqI900s^7jl3Nn^Q~L8T zC6c41J@hfUNXDo$V~>G{On&K8aRADg%iSz0^fgQzXe^j;Hr5L>#EUW(p{v_4MbC6Q z5aw(z4pkby?SC!fOBGjuDBexUeHN!!klPCK_h-W9Q{ibOD^X$6*tLeWvWb_(_jNGv z{e(kjFeYg_oX<+c(>)t5tHlB*{s>*=f%1Ri9uySyv%^2|`A3|HzI zf1MyWSF1CNOEY1`bb~~kH}SI`DI)l*sSlOH-6bx~iGR|(maNx#>372Iibnc+H&5!> z1wfGv;KE70JL~vKv&Y18Im`(kWB-^G19N3Jl$==<{3I&oH#ew}0q*rEBtu-aEKp!o z%u~F8WZ!%}9wxFh*vnloxKN3rplEQh_0TNymhXH^9 zGn0>X+Zkt{|N(&EmO$VyD4Je7Q)2!Rs!mb)t zXC<#*#|sPYr0BUw4yyTJa6pX6U(+)MZjeWe$A99#kZRka7XVsm_97)ioeB%zkj1Ww zs?S+^JqfK$>K}`5Y^|t+yWMF*W)E>u51)W3tvc^6c*f;O2x6;(^V1Ff<|hnRJBDsS zU=)LjV-r z5PupLr|hwqXxC{n9cL*y-KdM6e$FTAv)Vkc(`1y*3mMkb{hCCC82*Vj7&AiQ0Mb{a z&%%3_kxw(2qh#zMbQye*GdY{+X1=068jbOd=u@#lMxI1xF^k3*9Rf3uW0hXCzXJ$^ zV2%2iX#-{MD{=H{905Z}o&D%Ftn>coeSZc1WeM&9DTJ@k*1?MKg;Ek&j_}BFFJ_Iz z`FgqO%ce>%@egDghtGC|xJm|p=dv>=!wt}*v|yYSOtlhb32gIVXJ^Op#hq{N_d-u= z-ppd^!tQ9Maz$*!;TnxS&hEI!wS;LmyAVTp4BlMBmr~WPmo#H^v=RJX)r3)&27mku zkmrr7)1FnC1!>&&G#q5LB^^CMt_L9r6OoYw2;aD1;O$v-yoHQ8U62g?8Kx|o)Md%N zNC8eNa+GWo^e#&57rrAnF}GV2r4&LI@9_K#Q4lS9!K)`J9~Y`7B3$P7W9X7hhFal< z*w1^acsyZgfcCgi5&I{16&vVpIDh*orIV;2TcoP61V+!`1t-qB6&=aFTxOlqjmQBf zM+|R1D%?DL`b(p-$^CF#?XA)9DPlX+JkMm^mJ>C(`@_d4u-j4}cHa-N| zTguTx>bNBQ?kk?V{nn$i0LE734NypSLM4pkr+8yk`sVsIu%l1Y%h^_J%YRR3-`qkb zvmZ~<6LG6<*3zOJ;!%hpZ%6h8jN9dt`ao>7RcH=LuKViF3tUSz$X>81^$Bf3gyHkK zR2W-y^W6v0BekKp6I?1MI0Qqv9a(@eZC9So{Qd0F*<&FZSTQXnck5{Xpsw(hy24lM z3SWalLZR+2TmAJq7;n@SzJFO)_*Pxv?oKxxcI)T>lT%yz3Z(3;CGlfq=0J6*=XX8! zLKiN1=bl_s^^o5%TJ5V)XdYhmOs7`;K&9>#Q9tSt<<+$URj%~cBTK7&1+G}kP=IU8S2ER|CN4Z1uJF8vz7OtC*|Cx3)!~i5MNUEYYg)JM90@4-CTR1yQfS z=t$14fkn`Uw8eBJPk+_>s-_X8IZs}v!`b6CrTU#PTws_7o%yc%ueE0HrW zt~CDQM({=0Z#%eW@GPSou6(-XUMki=T+A6Ex4zT9-lpeZbMOf{=u$d^vQH_ zU3~v8ptbFABK(T2P|}j1+%wbxdxR@`Ai zY09uFhu(T@+<*17sU>a=3}dOM-zoE+za(Yyx-(J}WfY~BBnl`JQ22fb(jfIinuOF~ zNe`N`$Xhykk}!@?7~d4V1n%CjUH09Kye8k|}GI`Ucx4_ac ztgeTAXOk#fO6)^=sYlhQ=^Qr<`anxPgU;~df&%yX7k|^?F<17*WM&>37Vsx`{Ay>7 z_mA|BD#s2MnGXdpA&D>LXhV>3`BoL}xXqQI(;(HEbIps0F@O zcVs3Px}L`v6mri!@Yi|BhEUMHi}EMxJE z7JnCWhW8cT`i4bc+oG>ni?vnD@;hAaQxs(GCU#(BzgsB`G->NY`HkQ4cY~0uEgH}- zKUWTi2oA^Z{Xz-vvMcD!qipei{tl$^^OXbu-r4u7YJ6xzaw$}L>o3B?Bp-o4`15p{ z=QEt?HY5-hAN*VcUC6pfn9&3q6$e5h>q&7=6C7TD!RB7PqM0rsg7*3G5yD`u9ee{MYz#mQ#+Uh>B z?$hd$JB1bJ9eHSt;fDr%@NED*4Y&uC93(-fu}?aL-3JX2OxPRB0ZRjWHdLCl%YUSQ zS4=~I2IrQmNZv(h@)`Qx4JqtaWqd`vzvyq`R7*BT{)4UcbsLlOHg4>w6E=kVvayhT zljfr$#SrK+XbG+AN6|QW`0(tgm92t^!eOeSb3fi@7??T?Kcy#Y*zBt@r|eM?sMFfK z(O@b!OL}dfpGrkXi%?CJwL=5eobxU&?lm4#(Z`sR>T@KmXhhGzzMtejf%O8e zC>H6gKL|BckrRaehc1;NMwp|H%_y@=znO|g4%W=j(l5t zSP7V!;Njy+Ze;r``I`?1c0;NNtWqP?6Ts>w%sNhk1#?qfYLON_o82&q)>lR=(7WiP z>uRKJyHpLaO~0&t`mo4S#V3H>1Yz{Xd0H z1pMZ_7`P7V)-ZqB@Mfoy7Be&=a5@l8irIGn+$hQ;Q5((>8&+tLuUQJ3U&(A<8M@ZYCi842@9VJ2R9r8~GkBOzDVTom z;JD8nYf7cGNC8-n?pFJC5Zc{w`u7Hu-|gJIGIsJnZ%@_D+PX|Di3Usi`9d6CsY7*t z<>4jp2iD0?P-p* zGBd;B?TMqPJ0gODtxVJF>U=Do$^2cl&==>w*-tsYA}%zofZqAZc#PjYoMBeJJ-UbYLFyR=1B+=y z_BJdG72nfE7uT%6@bt8z?roXlUcX9$b)0eAM82w0r$V^xjd=AIyv2YT9*A07k;Fh& zCyGM4^K3-Mjgp_NP2m}3HkJE0WNDzcsuBW;55cn>o`2Mj?7`NC-)9@a>JzO@M=eeF z1e6)J3D-ZW8T?8-^P6sHMo}Z83@h|PI*>$-{O}Hgm;rSIMb*4@;bD|JuqGbVnUiI! zQ`MYQB%|2RB$a0c8xQqys`Mh)w)!P_UHpNvjD+-8J?pk&B54_dLg&S(;)ITTwoI8= zItkPUU4Q$)O2EW@G}#@=%~ku?br5!Hw@Jfl0Wv*1&KSL8BcJ`kI>EBARNA)?{o0le z;#d?#8I511+44qM*O~dEh*7cvsrkl0gIy)S@C7O;6?g1(>+Q0N@5iKj+<=>q-$K=sj+cpGAD^-8!M-XQsb zZKlt#B|)RGkYW~ibf+`<9K4$rrO)QiU|I*h=3-@JWEBG@m(xPpEkk^4^&I9Ri9Q0_ z<1h9OqNm9c;{*w+B+HS)B6YhlOF<7Q+}07U~~L!-l6L=`{oCKwcw8@6CXT4 zoPTrz|JlQH=wfwz0JfF(9=f1PeZ36vlc(xKRDJj8qnK?}u12dQ5J z3TU4|FnNEjgaq`d?2B~xpy%08^-q49ca9;cLTWQ^<_YbOrrSb>NyU=|RYA`guA8AE z0$NAa#>7D_pl3FdjdFyekf`whW{|t(Uv*U$L6t>am1I2Qj1UbUA7d7bY7Mq_*?&VbqkY3Ae5JxBT#$#^bU02w&kNss z8zdV(`QcSD;VM0a+$>hBz2(F*aME_AW;m zE5J+R)!-Iwz%8QwN)Giz_0yOn22Tx02iGsmLr%(Up3kSKFmmZ;wN~j$S(!=4hyK?^ z^($XUV;_g0ix|*w)lP=^*J_Bv5g!KGqyRhaGFgp5UKn2eCeXz%#@<=^zJCS`)mpjj z>ElDqw6DH1kUkHH@EqmP(@bDCXjB-(g0wh&is=mBpw#j+ET%+woYqJ@z2>-7eLfkG zfq?rfdxK7LOd1cAZe<5Ahedyi&IL?O=d*l;>PsLrz^$kKp3xbGE^R8OvM`>6<{e@h zcx3!L>)LeSpR`uEIagzk$bS`wL|aS0UIj&FOJc58 zaD1RZh_+1^rs?9}px6AVJ8r$z&rdFmav$Vo7)E|DFtHVIJK_}0Vt*m?TXD?vB4s}a zjcnQaJ+mLlzNL$=y3%P41yg!1tpA#5iR*VwKb;)5xk4r2JEc!dGbrQ`=@n1QA;+|o zJLa4#f%L!^%lxg47E-gHAM?Ede+X0IaM=1{nJ2NhBZmVqGaP=tqi-e8edwMmG2|No zh|{IbM52zw29mAo-GBVqt-RtR<1%70g$9=-sX=7DP(1g-&MPC4HZ|kxdr#UF6c;ny zwNzbMw1tATZNgz}1nT(*pv>tzL4H-=AwZqaTVSLrfJqO8uOR3b8>K~Mq&orDe#veg zcC9xPjrw9N9eNJImuM4@#h%O^84VlsMy_ZT%$U{8FIml0jenfs^2baQ{2H|rcgqiO z0Aw~5FD<1H;tAHC>Ku_iH<}i)yDW(GsjbE2d&qWfkFl52So| zv{yL67+3FgvA5wFE}o=6KRqVKn7_;y=qiPwm<#5&e;mVpmj3*w@~hzq`Gsd2%g|w+ z|0-(-j6F_5>3=NY6*YyNo#jsxUn;fKvh1{4rx0^m-Fxi1V`}&7rnK6WoNl&v|FX%f zpwn(b%^cPf1?MrGTB8dtGkU8e=N#W?9Ww#S(lKhX>gDcq~PlOovx4dE0Z_*AQorG9(#>B9NG$K%^B{ z7KR8qId=T07?X!@F437~=WFFJ;UFXC_-A&F;G+v8-*9%J2Haue?LK2+nDnu5DNPWv zszahD*nixWQw5CrMM@D8AO9>j@pQ22S9pu?I-_CgNd%4|!>gWc3vTYu4PM;d1TWBH zenAmawjTtCkpNy_-=_KHfF!I^FS#>%zn8Hjib}OKS`EQ+tX^d~y3*i$0^F5t6;jE$Ep|@-v0Au!KChc6f@{46!ap** zcHhGq)jh99Wa!aQBKGr~N(wD;*EMtw4{R-uhV>-1kv6Q6JwP2}k5W3WCGyQ6+>plW zX`T?u1428^epw}QGg(z>P)RGhvc7w<*?+peUSf1;q)&2OII)&39L?Jp={tZc6~(4wW_hpKvZV4n?(ie(ZGuLx?_G4%9&jx+au5(Ww0j|k0Q;-yA%A$R zMG&wL-V=8)sE`=Oq?eJ5ugq^}s$i-b{Dc{TTX|l1m_Nq~}sEy{c_99bB-GA&)*m9wp zcqY<*mH&uoOUKaT5wB;`z?Ow=RsA=L+SH3&K$z&gM<0H0{8c2!gB7eVyOxv<@aE&Q z_hqH4SKH+$25dY}t)8oU3pPwI{f}y2z z>x1Ld&p$o*?1%<#F$XTTCw~)_S*_h0eYn;|Z&K@=V>yr<1Git;c>oSO(r=b}jQi$xX#p1Z4x(^lqaqF|dR#SIrnpJ~GA*6tJKZR%OIoWZ z-{B$cu0CkKFbo05(dyi@&2=>I?ee^`{^QNYs&0XG@bzBd=IzC7qJMoBKs?vXc)r&+ zu3D(xf;OD+qUZOry^>t+E#gWS>)FcnhBW{MkOo%+X5`+gsdy1Q7go+!za4gqmDnww zDs~d;47!+5vYhcOo6SclP9UWf%R%qtO$kFJv>R0Ulv8_ArZct8+fL*0-P9H7yfgfd z=l8vGvf1;yE!agnuz%tK-ss{(16n3UIp3R1R+w0rW#PJRZ5`FfmPW9owGw<{(GB_XogzeRZ4L^6k}U;x2)A9e1F>5tDD4>5e>@>+H2?F z=qgOs=tke^(S9d`fZwd)XwgW6`PY5bApRaariJ@~x0dkgi9 zT14L#*~I<+)_>JpxSIL}w1)+?l$wza47!&wZwEAZkwqf3>WOe1^@543ynBDiCz3P= zB$hT;EQGd^k40-R^;onXgd^Pnh75u&rqhZ=QKt+ER1}hSgoBb!nHdHmM4`P=|5B<^ zZ4?!vnA6j6w2)7_Y%We*l}@{J7I-0al4jDqT|>)O5q~vVwvd2kyBtt)j(-G9w5M=& z-3!+;;JY&J{j=`6%*&Kg2JWmQxt(PGT{ADQ53-T1*9YnLyH1B$+xn#jqPA4s!Mdq0 zPOP<}`hw0zR~zPlSvEvk#8FbXbky^L^NbdlV>20ZmOY!fK;L|??bl~1F?}>F1|xZUzqYpe@%tbxqCVIv&e7YAtzK*%4gAJxqx^ znW@)MkkNGqJXqh>qJxV9O8p3HBjBVm2V*kg8vqS@g0WI&8p6ZL841Y^lZAgI>49+o zxj_aHqA?uv*ol(y8}ME5ET1A@R?Dovtz4TQVZ~Pdo7Ham66QYuQFoka=fr8i)Kygc z1AjMjnkmL`FWQ9pY$ia=pICZvM$MD7z-Zg&IRue~>zWfLK1%UxKx~hujG@*H3yU|) zy#{1a_KgSwDG&~FlLZ)kofGd@PG4P$Ic!%BPG{h=Iw0&BXn@-qtcO!{(=AV z9Bcygv~6}7HpG!=iNN?YyM(@R3*Q}ZEVz4INtDRz9#_)#dMk+tVpo%me>F;H=xYPF zpbQdIU2|^rOI$>ftd}PWKc)qTsE(;vHi8c|a_tk4`0146+>4EVFbMKQ(2l~3Hh-NI z^QnuMdzx<3a)kal;CNQx2E^w6aWa7>gs7xmwjy8#b4|6i8bPXC^O`Q`FI?}chZx_H zR;yjx*Dggjz%^E*&v8Tw40Nnl;G0s%e(K6_V~(JF58TEq(v{O(bo-~vX-J|wu$i%| zMEliw^n52o^y#m?tT_4^DAnsz`F}%lup9Uutz}h=nkyCL>i`2kugSS3;I=%=+~io6 zI97*YdDZZt1i=Ye*nZzs4bcAx{|&QsVY&B^aK-bRwy#9$hP=0_36tQ@^$$BtzqbKA z*Su${L8bNfgW}4ilp48YW!W@JDSKEEiCAB* zEz6dBeQ!SFl`E0=31fnzazXMBiEvnYJz1n_q}zg)xdnW8F%XXVX$yoX`gcf#kZQ7- zwG|C^fwxG<_jJ~I*wtS27cY2g_~Yam$$XY$96$WIh%OfV8mb{-%rPGC!~D)a<Bsx-o@^i0wXCQ~$u zfYcJJ>o~ofc?qwES0E!~Fg%CBs~g&+8t*#Ujy6t{$)lS_;<)coSpk@AWp*85dyNhg zmf7erZb`HXH>Li5jRi~jvg?~EK;ys? z>6BcFCqtC3WuipV$>Jb#AwLBnZ^A{FC#W~7a= zBAH|p>@!M#PKWau8)&BJg~s_H4?lkt(Y}V87ko!^{|GdN+<_jBlfp$39m{lRzNgB> z*Z~k8`9x^0+g8*YaxM($7O%(_Fr*1)26Z~8o34|GUmTr4ieD6L$CPp_9ee=dtp}=r zbAO_v2{fVsYkv#IoPmK$BCH?zf{%EC(GKyui}ScC-!|iCpScxqheXjr>Bvv5_;D6e z?Fv|9EUwZ#Y~+Svs!Zyu(0s4|Yrzl1VMDw9jsF~-KyBVwQaXnxTvcue%1=FXYcKj# zu3hpX;IsN9)r@m`uXV8qXv6wxh#Pwu5+*0|23<2_5`S=>MIi`RQeF^jXwPR997jlu zGc+0SEC*iSI>|N}=BF)rjxSnrjlIEZ_GU`jEiMY~^2ANc<40$YKZor+&nIX{6bvxG zAPTgtM`zJ_GWkAob)ru}9odR)`AIe!jnld>r;un;njC(#{puU>1B%4WUL@Xmf{qPdG8Ls+O;Vz2nB}5{kW6c(E z8+NvQw(XDI`T3PN*cQ(SmNT{n0%|UcE1g`Q50+9uJmEeknJc}rZ ziVUPOerEUef%d92+4m__>HbijX41McYXSL@SAQhScuF0HEQt)u23~8<4u@&Gkx^dd zKcSEJf_tG3RG20RP)DP{f4w!(Pt!|`(@?M;PUPTFLQ@j{Ml3za@iQ-N%@3JRQ5PKW zwr(@B%grhwWHSG6;Id>6Js6G1+~30^(ReiA6Z#oLeEi<=>G?--0L7W^6~fU3`ICSY zJ%3+;HW@UVvwu=5Ng95TEV00rfe;l6pf$E;A=^G>9cowsnjc9G=zH`EaphaDCfg|$ zfh;jPDm}v3eXzqT+Vs;kpDICWMWOtrnLug`nxv)fHD*07n^DTf55Si)pDm{)^id&Y z1+$ykTpo8`=sj^kRxdhJ^K$qpovKfdB7YY=&@LcG_jm-nKFl#l&P732sRNWe2q}2C zt!ff01*B5?ah{S9?0gw)_X+;28>FrjV&G76yRzHAv1bBdH~^=SYV0VrE7SNyi(;FU zX;y~IHb6Bds3}$Zoc2nu4ON0+f;9c*Wl6I;6F*3jJ5qUOn87Kz7F!=Kt{6VkD1RpH zt}bEKO65>=e^b{d9PBI=@B_h6n%DXb=n0emU~OM@Vw^7fVT~f3210Oefp-9xiIb24 z%XRMnl@V?h0?>$dC~OuA1E$9i%b^12FXdDC-$^9spxX+Drgf;x5Mj1ng?C>?_p^pp zuOPbo@34NzFtU2B+@DccrqweFM}G&%Hvt6xC~28lMU^7>PL!!*mPWg;otrqS>blk! zlndm%#79g&M4+M8JJC+%ii5k%FOmx|E6mV=xMw1fEP2Ui zx}Yf&wiV=+$%5fvk>z0SUD;R1LM@wu*jUiIiODD3z@(&k^U_`)PC@H|E`QC_Hlka| z!CTruD5ND+nK9BraO^QeR4f!Q<1X3RD*ugUZSolw#q*IqEkApiLIw*YH2ua6S zs#(_}L5k+x5Ws;qcP?vQk+3pFT3LBw1xDQ^1-}~QzQ^63D}QbrfK?NpVMkDa z+cfCSl-D%|odk@yaAi&(cA?XMPL%7V)TcY>L zN87If&EbEq?0)Y4e?b3#@Y>1ek07o0!Rd*#EBa*4hwex#BwrEFPXs$kriI2`MaK}( zSQCE;;zM$Hg|`Z9`?<)_zQyM^>5CxHk9G!VOLwMcXp5GQ@PB6+2`dKfrdBRD@(DMu zV((d}X>?&u0Yak227GvU_&G1y_i0AcLcY-N5%a?790s0D5GSyg%|P!;s85Q`#?6!2 zEE#^!6rqyGr;i?kY<(aqYJUfo=65pg)ldT=)1GO*e^V*Jt+P_3 z+ox>63Q9J311BvIk}2dpxZW~(c9lD_4rn*R-@a+G*+}?)IupZbG7*`=X-xqJ?T*a? zWDp%s-0d3dF>&oe2d9TZcj|&RmN6V(ku?~8HCbPg%6~2v@>)5vHs?p;K5EBqQs%H` z>hNAzd#DTQewijWfRfa7KhY&-1i!OOJ|g`@#VlUgkWm99=u(T&qRsOqVEEn-$}37B zXeH;c&G#xHq&5%W?1WK(Mi|&(CeuYH!|HhZw3rPQpfYVjo3NkNeUz=J>HEQlC);l}w&o3O z>DSLU*~mznQab!z?h?GsGNHzLE_|G#o)DgBqTX)2yF)~bxI}IqQ6dd#yF)5sQk4O}s~c-)y?)4UR9FWAFInXkg?~88>DPW;6FOFSZP;&uF&HQYO2mFM z7^ZKvR9*J!8ltvd+oXKlIIU?|IDNG?5GEgVLaJy8%mKCa&*=5iKFC2*J5ohUh4%+| zfh#WZYi&y*Hmi+NHJBOj^@b^fwD?n-gDX|ok~8K7D6-#I4vgZZWhlW=egCUq4rw`Z zWPcD{j$}UK&spIXRSZih&kNXQ_)Flsi3NNwyXg)u=*EOc5BxtK8}R?7%D)-ia`O-q z2PX{0vm3vPp>}k%N}QlIEzv-V()#C*LzFLpm#TN{`o@Q&er8m+=OoTMD_RZc08``T zWp)azNKyW|xkIpKr|{wT`;plssGC|Lwtq}`P^+~B*T%icu8liLA^5Aj>!eD|yYGV) z>AY(rUS@ENCQ{2WUGl? z6Cs`Kl<-3E|Hc&y*8*eF-5H8BuCs3CP9spEj-6dJ-*${KJKc`}_wZ`RRL2}1&= zjl_7$0^{`P{YG)IuC!<)F1pH#b;QM_y|kDt7Z%-RMJG|wEGZfVMU$MkvwxWAv|{TQ z?8^1}^q1?TX|?iVZRgm4|J4f^c)C{Rgr+<3OAwM#T7ZZ23_h@j^d((~u#tr=Ex$f@ zbawdg^!(PlMcA+WC8@VeZT1B$5H@*1;S483HtA^Bh(|v05kR{zTZ#l-M(HRS`t4|v zT*@eUiZ9nS2^Vg0ZJdpg37;^<;d2J;2c>V|LPNGr^z_yHh2xqo6evi$mj-}pOa zAMfihJXbPP&*~ig`Q0=WN}$t&_m3Y&a6A8~2y%I`ul{JSmUS#ENdoBv5Cq~(7XSm8 z$k9@qKcnQwBpZ{hUTC;iV)7YWD?VW>_Vn4M?{j*TYTNLH^0GJ?DN7hl}` zIL{{AkN95ugB+O~eSgV*21ddO+uVEcMVjT*2YiWBb4itv(Xc^sksHLN@E z`~F}IOhR4AT`Kdhj2~Cnm;-!;2o!J%hCZW91R%E;U^&1)Cg`M-PlJxmuJiBL>j)dx zLC3_M{Jx&*_;2fV9xpYS0Hu9_FJs5v%48qq;F5Hc7nzye`+u3>gIUR8uzOQ&q6FTe z7k0$q#9ifJNx-X2o>!P=d2b`*VxkHD+_V7D5MOgpMPr=(RapGN-mx~fQ3Jm-!+$so z3^p95DUV??zz|3pGC&1Mp~ldaPEf z)$U4Kt=v=IB!3-53^bFvzC54FkqB3G^_6WdoK0kFl9^)!|M8aP$Upyo|H&mTR3GQy zLIgGVB6>dHsv>9Hi5Dc#OA*BH^yPGFl4sL1X-vJC`U#j~IZK#czsd~UB@7LO)aP69 zjJYq0s`!+_NLI*FOc+!Qbt-W6w3I{&)$G)EuS4@y-hW4L#$`BEWN`dli$J}gE39~c z$`Q;!sb7*>g&^Q0Dz1vFH?dzvE*8_}j?#HX9v(1UL*UuvcWP?ME1jSlSYZafyTw#5 zyn!!-8Bo6yI77-Dto8xRZOYR$MNbFR!g$ZZ&@>B!;P8+|&=S(TD}6#!q5zF8T33ci zbk^*=tAEpGKflU3SOw2_cf3{%Wym49`ve$$^45Gpf72aVe9mP~4lgtk(gvM1F&?mI zjVIiMPbfWpndgWi3=A9cd^WAUUGdL$dQAZ;g+&w+jG-HWQ?C2^>;1Y0*>t7pD1D)7 zVmDELLR(0(kj^R~M3nnc@N;1GnfF$$w3f-8M}KWLXb&rq4d|MLa)MUIv``7E1{)cW zQiCXhPJgH1w0V&|eX?}fxFKpx3N}{NNQdHNRU%B>jT8jN<2iT)`$xs(rb1=WA+sQj zpq?*R+6R{S+-oA%}EvfQ)eF+t8b2hPdt=-i|H zIZO#`6!u{1`=$%13G#O)SA75r_^MFqtA8?QYr0JFxOO-sVfk}*340FZ3ixxVcZDJm znqiNvoUIiH%?E=<^U_fQ?Cv6;|B6MRoV(v#u^HJREuZ9o4#RRqB!88W8X5+UVmZ{ z^y}0JOSF2+i|}ALf=&3?_|t4bucr|1x~?G?7mhmy(1EDg1S}BfFlZs#|3E8piDWWZ z!12}SoTLr!%ZLkVjr`#SB4h1T%cVi~3OE~PfplC+%NsHXzl38|W^2CTQTEp^$)SLF zAto7m?{kz9@k12tsvAFjaMrqZ@PEC<)$5fKyW-mDpmLUgWr9N$+K+n~?^-{&Mq`Q+ z+5h$BPro<<7pLn~BoT-@cF)D&1^JK&1v_kp5F?57o3$f_ZgT-9G8D*IG$m!1!}nIw z4G|nwR9W~!pVNXDMd`LwM6oKld}^UB%{vWyGoNhC)3d^?A{aSJVY{PW3x5-p*4~Wg z(F3;lvSqFQP<6FTN1PV%-Ta_ZK&3Q3l=OR{HqguYeF0y zT3&@{y791|fp>009_fL)jPHs`?%jCs?l>@|8g4moGAxlm=mhG-b$^!A{8FAKa%CvR zFCs7HayI*fYVLCAj`t5-5x8uUlRg1L=aumvP5ORqc^8c}!Se1K)gBFmM;}$QWepd? zIx7kcVUz?y24eP*+f^FwC9!g2A+WqEdJo~C|NALWx_ns=Y2mPfPH1rn#!2|=8*-1w zU!#(zL4oM{bQA>F0)IZ(`}Fka`2HjK@ANbHI+b>u#SS4FY0gNarhFt0IKy5>)%_@7 z3^Vawe1XT6Pe_v_xH7|8ofI>aEBGKfP1u+aQhlJoVnxOdZo_`8)my!RL;&yK`fT#3((mmem z3$UYIZLlP(><~U26J$Q}>X-U#%-WIx*(@g0Bwgfzm-rUGmya;4VSK|400^I(00_t2 zu)!8UGj~+^p9Q%Nn@$r|{ZK`10-o*`z0|P1opX%sH`#*pkv=}u z-DxT-D)jVgw~v3;?X4_#fV;!EIox#+{X)yvEEr=mtt6H+(~_UBc#SUVXs;;swWN#5 zw*GjGTg|R+4-H5b$S(mTd5#%2oL`&f4K7GtIoxjL4Ha^~!GT~0jGa65_nfoc29T_s z-bm^Y{$axASOUj%X~o)4WT5OtIK2udK>=w4H-p%Gya#{OtO%|0uzKT51mOl$gFVTY zzXjCgNC*vicUR=Sy&~@&&eL48tAg#~6=qYeb|VQ|t2SnLg0z?xlzkVE7R${PLzBSV z>>_Sj%WgeXK*9|1Q*;&Yr5bC$+sGi6MPwb00Z*;N3_21q6NipL$vI5#4DtrfsH>h$ z@&-1zYGi*?W^~x2SAQos%ZxF}WQC=Mr2HT|O4^21C_9nZ1DQ#lvm=n*Zj5JnWk6{@ zuxcbxAKEt3?x=)yK-Yg;&#GEw6{V9`Az52CPUv^EMklSp3|?7Zg(&jHS65)oFl`K; z%|%7gX)EjNeE;(5{5N)f4153R)8j9{+`GTuNQHlT4>=aaGM?!=il?HOA64*yIDNVz za`r+RE`lIcezLW@k?yxsyxsJs?QEVgqp8_9CE@^%iv;>4?y9h-e9miar~?|%9dK%n zM#C5Xk{H>rbeOx5c=(J_I+i0AEJu>TIrX`7bwOR_h9ylgJsZjXzVWrg^E%b6u)d$; zrCNV=X6x6YNj~T&Op_)Y5sh*!9=fw#ObzA1Sqx^Z#&U$@MLz2_;Jow#N&)wbyqSy? z#Q|ePut5wB%?H)kG`Ltm8{%{c5cvSIb^(i%2;Ir=k*9d`FhMZYQoUi=UZPVn>I3~s z7$mmGe&_tu>tq=Z4*En2YWB29UIoH{W}bgYObl0ypX`=$y|X9po6@`2N~Yt za3slQIC+ToI;r%Gh#`;4ZUhVG6n=yh8Jva+NqFEn|COL6NUX`u%4S`#u=_| zC>Lc*`4v1v%4RlNQGy9gA0>~SM}~iNlGK2f<}NKMA0f@Iv!^sO;ml)DP>q{Ewzy1F z89Y-!C#3tOC9dUXZ>=%5p*e=Dlz++=+rm2Se?#nlL#$$m6_XrL|KA?lz#il6sQ>M; z|Fk{!F#lOL<1V&nn)zV=x6)#)G?|aF)|!-WZM8{7wca8M{adX#M(!Uou995z4tMCYU;akgbI z?cCYWV0!!cu$cC?Vf3M|(ZP!>nnC$RrY4~8x z{W(88Lvv^&JEfhiB3DGbs2hK3mT*vv7-Ph27?Fx#h$6^2Iy+wu7X86jj7AfUJ`-ig zY*9bnzA|Dzkt(jnhh_thfb#G12M~s<7vk$hxL<+DLA6w7X?_L98t23%d9|(D>_|#T z+bz!h34GmYKN<x^8H`2LyvvPYn zHw<1CXuFa?P$a8Bk8yt>XNlD&ftOG#)4hJTPcfQulB#xW;D6PQ?w%W}_I8WK=g=+i z2J1P$631{07fNeQf|yka!VSq}3&a`*4$BsH0aj?X3z{+7ie*qTw)G7};8-U>v2c`S zfRk6zAo01T&s#7JmOZ|$J{!}(^cm3599K#PRHvfG6>a8KF0j#Ds_Yqp;b3Wc`499bynAq- zW7K_VTnc{~z0$w=9a(du)9eT|hn_WI>yt#NGb%AU;Q}ub59ebUs$oCx1GV*jGHvLX zaI2m*5|rkMrTB)eorz45JwY&fz1+|>J0DwesAbMFr!a3eB9^e#-gsP>X_-uSk$~Hd z57zqB#P9*YS+zZ6@|x`x2By{kF^~-o%Xzk9^uT`|A2b;#gjVx4e)RalYy1xi81u6+ z$h%d$FIu7XdQhX-rZrGid*Mg3o)T%Ed>GNEZqKd=F%M@CziL{()CrbF5d`Cyx~)jY zRW>0S*ZiBvrf6Ei2`WH3+BR-aH;5O}j%rY0Bbq_Izl&mmqNNw1LDXsvj{H)4B60|2 zh@gKQPsU}H)`Zk}&3^+amuN;2Q;p-KplFVGYO#2!({7KWrLL05iWpAO51@DxjfFuW zV(#n2Xe|e8L(R4EA%|;L%Q-FQ#kl79YNh1X0BCXG;fgouyLEHu^nM|z)y|=21eXm=a87wWwR4J*LPOHWOJ{$On?q3)eZV2d-BbQ8sTx#nEu&UOO8LLxIxo?+Bqo&P`4PoyGjd7* ztXOJtMb~4g+?J$GQSkpp`U>jNiAwb)Ry8D=8h5} zVjtGTpD*JHV5J^Ag4=dEy;4}V7fpX@$-o^sbESs+svE1*93Bd{A&%*W=CjU_d^xk+jn$3R)If4FU z@8PjwGe<3D8lOOSyS)n0PYWTEd=rTnl#odC7Gd7P%QNKR!N%D_?Zb;YybTz2>58cAl_El(}f3L1bC%K-YBX zA!@U(pw~-!YvXQqsGGFc@7;gu1F^kRiB6gHNIq{Sohwn)o+ANG$#QMdHZ3_?c-QpB zYds`c8bYs75aE=drmak2JneoSd6hE>fs`=_2^DUV`p>RL^Pgf zljo0PxvYQ7*|zWJ{v9TrJlFAi(y10?_g01}6y8lbX)V~m1Pu?rKFi0W^WqAC`5V9i zUmD9;Kl%^mc-sSdW)k2mc@Tc%c(o27XDi-p9_saMwsPKrIj8O(!0#h6Qy?UAgSKH^H0)hGKhE^gTjDJ^ih0@^g?!U z&^Xz`OW*5Gh?%tzn5XS(rEa;h9JGI6O%nEEN2RUBV)q0HH0vs9ttIe?H>m?|ld<@< zKbj1SZt|Kd^jd!?Sh+^Hk>n@`RFUoc5LCyfER2pm2;$Sc7s!`3qrpX^*5iTTmPFm0 zP@>&HKe1aRYpCZ$K}ktQ4NYy^Hl_x9=zph%QpAj=X>zkz``k{FMDJKYNz2eeOWN;; zU0r%LwqO_B*>rUN1QQ<1o23A3ngb7^SkhBCxg#u7uJV5tWRk3q7*Zms*8`MoH36kJ zOYzIILIF4E5gm+hU=(x%cpds3P`_{(=6c-$G1qzRwGNmOA&6`LQ}Y@O<2zEIw^nsJ zJ=0!;GJQ6r&W&l~QKnXXA`L<#<2hy{oQHdKkf4;ZM=@x8{2SP!U2j_s^klH!J|Z`1 zw2$`Hg%W=;c&XtW<7PUJT;HEd9p_c&VX!E8MV?#T*hV{YzSWVoOq8aSqSobQLutbR z*UB6!Cbq@*00OQyjDRn9`PIN z+InP*J4wu2&g=*b$|iKa7T0UuxfaN@YaQWm_Aq}uD&0%4`4U#-v&S@W){RMEQfI49 z*0D3lxb131BxDqudW@=-s<-?#LkY9WOU!@vx4H%2O*o;!MXQ>7z4|WLcm%VehYmYd zcu0Qm+>DTki}3Q(Rs~}5FK!8o@lXX$!eMReUZJc@_^am?xLPU7hmvA$On&+`0g_wk#E2mIap>2C6dOI^6sMUeW;r9Pw7Uh-3Nr~huX*Nh321guQUC)D!W z@4+G9TTlRCypFK<;R}xkm1ksr-lZdD$C;fJAf!+{g}N!Clp;PUHke|2dU~vF@_@?N zR`S-55wnhPQ8n*wJGO%MEMFoRgS3AP(V-inLmeWQx^StBAoUrh+93)%&6r?GJ4A=U z5FN@89j+T9q5_N%07#*93RP3YC`EMe3x8Ed=uO~~YM$dx$-*TqT+$*XH_zc9N3}+X5;OrmTO$N%KiIUDS1F zo+f2MfrOa-;K3sZS~t2HFECT*7+qpXF#zWI1%~Cxf4iE3eVY&TjU*5}Wxs+5pOFU0 zj7n)8G62Y6bk66cWVjmIYD}Zyc!7Uq=a5NvDo3-D@$y>b(0elK#c;XJGn%k72)Dv- z08uFCYzpg>V*dCdnQ(tJsEh1ZH|1e^O~ETF0caFC2y@G)qpLg_=R+zxMWNI0oAI14 z2Xr6j`dbxtgn{L(MNQT-&U$9Dc%ZGwm?Y;`IBTbMxDNqrMKUVuA=ZHE>!7;fkN05; zDGw^|aj|D!F=0XhtQgLKI*&nPXUy{@x$$C?X(Cx=5OFr?)oFh$V0O?~G>@*EN*r;C zqoxwjD3rjqjbi&U&&v5!nMNe6yhkfx!mldgD+7<&udZZl#0;R}ev`F~DtsDgPF)14 z&p5Se288@9!;4fDmOi0NWlxEV%h9C_el}AMaJjSWNv^>sX(qukeG2b!<=PB8EN~Dj zfGfS~RoDd$FM59_sg@Rm6B5D@=S@gse(ArH^x)sO2vpUk5dcv1jR2@#KX+w5Fi#0d z-8;eU>5vyZ81yU-!lfosNhoTeM^|Ntv)fa&7fF-=X#e+N=<9MDgQU6tRfa zWEE*@f7b3ooEB)m5+6CNfUIx#-%Ie`D_&b-ZB8%H zPx{hOYu`nubEOb~UHex6S>*eVJh0{W6@-86t1Em1dTx`d)Ohx|?H3d|+E0UTnV>-pKP*j_ePU}L26B1W)+j{vx=PNFU3XD4DzTHR!MCY{U@yQ^@t*H zMA!HtD{)mFU*U7GG2vQdy9!Qb##chLAbLTo@?U@FK*P~&v8v98by9*s2(j&`D>wr> z)G_}L-xh|CHR}4AD#0yK7n)gT_Ihfeg)l5{tbq}lfGZIs+t9WtrlLYl)&W}716s5O z^sE*T8>Ai>u}$6X5{`@I`)2K!t`LW6ONFJ>rV=Hfr2YVm(07e2m)l%*+VlH5G5wG))hlWdz6Bl^cwFZBmjd@LBQDLsvQ`Hi(x^)FpJ+Du)G&xIpVxnh# zohQkee#im7MJ^w-z)i#P(t$5;56#c`2?u{!pE65Rnj|qOafS~LToGhURPozUm+qQxu4A^)}I0AoItTo(h5x297qeif5CP!2Q{SZC(mZl;nV3*f&pd#Yo3i;W8-a33Up1X z(>F<*@TypKZMQ0=;w(8^srIt0S1j^ndHH8~Nhd~5S^(E(wnq$bSwF%h4e@^u6Ob*e zf^3oX+~3l|t%~OxJZ@64r8t-ExV0z|)walfu?(2hcDNp(y}!mSZ^(F#^+M-JOT+L6 z;@0_BIN0*AkuNr(nGqXMX}MAkxApCG`2$T~Iju24fA}S_rqI&O-naX8FDs5Fu#p66 zAfZ<-cbn#Cx%(KFxLugUuXKOXPN#>VM3nmj-(00!E9~yebBg-t)JvW9&6te`q-t#R z<78#Q+QqhR<2E;>&e7VGZv93qoU334MHNVkC3FDHETRqI7S%tDFRKe`ZBGVJlgtD$ z?$X?(b2E*pR6w0BwHQxFTmx#Z{h>DgI+awd~3=Mr-PT6Iy(r%Mm76tTiK z2?c(KRxSr(veXxqktOHQGEj!qMoNBZzZRoGGRQ7LuETfO0DD3l&0wPxbs6_>NZwsO zakDX;eC;j?3=T7=Q&90#I_zDNQ5UF>{C*xjmP>DAT+tZPGsb^laZ9XFLKFl6v#oj( zDco7{G@A}eaeX6?*0L{%FlRWL(>AZrWSjx^7kQZi^z-o?TSgU@LEfOILAqaAx>`_H zs(A>f4%^_Ki?{3ea5RQJSHC;S9%LyzN&^hNH*x zDQ|y&=^&iqY{`G8{8|a+{0bc^=B3*Rr|a_qng9F-v6#*&jurPwo=O7P;RH!WG&u%o z$UWrmTW|}EJE8^QnjTU*N}kt}H$O^VJ0?Eq-rKp;;{=Dc!y3Xm35H2F&4Hm|2(iPm zWiKqY>*N1AJoX?)((AA9Qgh_;DFgy?kKF`bvQrY)OOAghSoP$hcp6oDIE3Od9JU4* zrD$#V#)C-v+y6zXOAWXZe zJl0k;4L4Tin){@G>IYHEJ0(?V^C4*-#k91Vv#NhaqLXom9qsFYhP~JZ+)r3v`sj)d z-4fsc-VXu$ZySqgmOJ}y0%(76dptGLWH2W@W&Y!f{3B=9jV{qZ z%HM)Mj8PO2{{}AB+4=b#DlXtqeLe%bf@R8dR6YR{hAljR8C(&t#so+sWZj??pgt_B z-Ne_M*#&*jPl7>s_YU8zpb_96hvH2dRbaCsY;aV%*Reo@gXGJ`SVG{2L%wt8mYQS0 zw!MGb>fTO$|L)#a|L#`%C-!^Ad_z7b`;3^3ALDkm)Q1uOP{B{}IY>YVSpI1hJUP^= zKe=6C^V_+BM7V9R zL}OWUX_%JL1Hf&t;Tg^PY=^dOij054$QG=vs4T}V4kKDbt1h0Sow0Z0R_XLW+T5cD zos88d8xQy{G~UIeG~L(m_8cz@ycm>(TNj*_&0)q*;r13@%5;&>*=y~Hc9`=1J*d)E z$=@?M%Zo>piC}rNGVGSO&G|8TE``~g0Z&Eec;D_5n6EE?vUhUu;tOFh^dEo5t=LZy zm~-Ijghe{AF?lU`h%#nPJDNCkpm%aFKzEH{#Ef9z0s5xFP|q|j4kniQ490cHmkD{3 zDG)b(03T~aJ?uLdbBqt^9eSlDOtlGn?V`Q=$Y)eZLGimzTjW_yA=oeyHx z4d-J}5dOj;#EUojlTW6je29NPx*Yy88~2iLphqOput6BmeNds5&=@np9_LDG7Pe>r|@?4lf2OH`oq=@%SWGv*z-J=QYAdF`6MhK=6 zh@KzsMgi&_JB3UKeCoWrO#g6M#KiXQFXvcE9`rW-2!m?e@oG3ry*gO67Ga%^k1lH7!K;S3(D=;`Fq)f&D^d|^(?{rV8 zxC=4`5SG~cT9U;N^j;GBF2ySYr}{w&`o{Lu?Um2?_?MpWRU1)%R$&2+`Oki-i5@Cf zpLsUp>^lL-A$B(`o5Ftr49?O%JAjb<$v4Ljzu51&3b+do^nt!9rrbuWU#Pby9<0uNLa@$|w94uI}t3Xp4W9JV_L${Z8Erjy{7` zNaA?nx&b>V(h|MlaLf47iK-x2i=^22D+fjjMGs7{h>9Wt?^k037D{yY!)9f8*5b&! z-LYtL=`CZb1J#IXB(rRHxac+n$&GMa&HK1j5h+95 zx!e{|14wbo5(~zP4>|tZGJdPc=XPOYN$84iiHr;_((Z7Dqsi&YZ;PaVb$9H&GX$}} zeTxl|EPghgiHLu^iDx_`i2S(433p-vh&UaGMXg^LG~qZM479g6HII zgr1ALh|YUB(M`PUjo`B}IO3ZyFQPmQP7JV{s!v?OQ_eq4V#||9TrA;_nTX#a@iRnT z3^2wJq2GT;x_I=6ua8HM%-+ePNBq5Xa`Nc>tUT)Hx8k%f;eeQdxbF!q1n+!O7Er!TEPT!ioF)Ub|~l|)jH zDEE={#wP}2o1z#K#YdE1uK~aK-2m0$@3e~1V9)4hYFo{jfRgI0VsC0yW2v-y*6{?j zRY;^tA7)LpJ($^^_l^M;OL^nv9ZXqGEe$JABssR;nL<2(Gp>+19IsvAKS%Ii9hyJ1 zNrHd!S68#X2#rJ%y!(qj2HsCf&)4g>?e0oj?*i)p9Z8V+1Y-~uzrz^siCPm%zpvP; zvf!)d_$kH$TFW_XJ9qD%y-eRFQtRhUG+3kbuo3&}1+ZJ64gz0G;;jK3$og?4tHqF5 z9R9N&A5&#StuM36h{9ZJLaB_{s`Bcmo>_lJ4B)to^ti7bH-1fY22uY;iQ3j%XIp`p ze^F7GMJnu~VylW9qI%8=jB`=xadcJ*nMEZ2h94EWDzFF&mL+;r9*>Zl#xW9myBU#6 zjwL8zK`X#uzAu(9m$B@{8E%v=wm{eN#SA{D&FpPX@5SwU+jKtrwMy>$}oQ? zD7j@-t=dJD5*zY7Bb$E;2R=)-I(+)sW%`}5H{jKdQn3-g&hfa{C zibEDvI^Ar8GkCO;30EYDU_1kc5c=nCDyreqYXKu&jAe=c^(lJyclZ-}C7PFSI=aul z+b4KyCSrDaT~Sm;=*jHyRP5W~33h+ReVq{gjon=QJb!iT-e`5dK_lqlt_?9Q2ez`T zd-kD?OkkB$JBY&w4d##rK=Ws0fP8Rg6$8@Ve}{6I!CxDqMkERVBQ^(9YQ=-Ay$WO; zTWa)cdZa@2JJrc;ovEjaPHNMcUvLC%ttc63$ySe;o=h3ZiEZGMk^stl{}q23QHcJC zgiLgO-%>`nS>d3U7j^23k=Y6dgM{A#{=U71soct22Ow6f!sK%p)n7mfXyZR4HT9*ufNJka%#GtP|Q#*APs-T zV@G>auk5@(Le#aMf|xNr4`WeWur#&Zut3uqGY7G_X@(v;Xa=|<&1vtsQEnY{#fmVF zZHzvhga){5l*l{=ABQ(u!Kf@5wWWl~DNpHvb6k>hCuI-DkzSbNOtF6t`p`9w#z`2r zCx?Kmo!okIQg}Fr44y`r6eMWubhr+qF9(Js#dk@4z_8pQqJL zYISM6YYG1{Q~?_%?fQS=0@1#3$q26s(Q|ntmkUQVf%fx|Q{i{Dv+$jfyX#LMUbGNG zjbexrEZ)bAMdbz@rQbB7V$<+pyZatG&(QG^4ekqgUcUTFndw6@T{$eEP(-C@51^vW znUPS^5lId&CQMc&7k~%l&JxHni~NFxS*q1(s3L&+fPSq|IDmgl7>PfdS22`#p6Y=D zqPr-5fTDWF*UOrF?YsAH@h&J`3wvB5{B#4^1R+*D%QdnLVqX_^t!#)SEj!#!B2Z_g z&7@k>)rvJ)<`@J;-Xe;z59Yh8h1V#e9h)S;ce*e#Ol3nxa{Rk+{dRx1Hw^-;d0=xY zq_9@LrSbr;yQhDjon0)#7A1aWs$CB>ZYV|Io#?+zrX^Uo`fA0y;1y1t*ASC_f^xiH( z3dz1*;uC*zf%}B!d$xCX@L;~`07*#956i;}Ubolz=G%@b`XbASMP~6I3Tc>Oc)D=@ z0w=hq)1P~9Jv1AI&{h)l|9AMs<=L3+XWOWCG!{J7A*`p~vHEP&zYDe&MHJcK~Y zvYl=F7uAB0!h@lcop^#$re1mSX=l(hRr4`?NalZC2u;XmE^*N@He7CIIz*6_UK>>dQK9eE@mAp87;h=h{Y8uXj<*RI~YEJu8< zxfK29AwD?9+>J30Rj|Y0T}EAIFCu@6GavjCgkW`Vjm@;G&=^XT+lAIY0X6F z0njd_V}Xxcfqgp|(DB2%gNciJ&9Vc&t|$>m3ve1ubq2z#-LmMprz!WFN--2K6YEBS zAlA>K1raH~CgjkC0HvT!@#vgxWM3+S(R#u#k^@XJva?Jfw(#pRWB7S1)=YoU>=@U8 zZa1vo3Ef$=ykF4tX3+L#)c9uB`u+>eFMS!ici64ia*}rCKYAM6s>p5)S!?v?a46YxUmY%gK%2U`0AFV%~ezJAW^FM>%&#m!G&X70j?0L z0^kE)86M4hTh3nF->rkiM9y)t;$ms;RAjE1(s}JY+(3r^7dzo%8#aCir!&tYK-qHF zABqF{BauFjIyXFrOJsD=(xa?bxj)_8uMuQ?j~{|RH+YJKtab+v9;_N}+`4u5Vs-WA z`Rn&DTm;YJ3l)|^0y`L*pR?#1T1F3mZN^CN|I-4LssRAenhBFpVKoIJIOMkIlZ#WoU18b7gZ-O9ci1 U0000B01E&I0{{SH2m$~A07cc92><{9 delta 680 zcmV;Z0$2Tjmk9L50kF0h67a3XNT$G-jtBw(0K^3V02Tn3?g;`If2CAiZ`v>veWp_X z!`}rtW#$;Y@Sp=| zg-E1jsbc2AikVUghaMKx#9NGT)b0{QhPvF~e&^GG3^VtOe;yxE2Xzr~i6o(mZ#-wA z3#bqLzJ<4V3PKtP@%r}>>Iux22@7o^oAfD7F?ifcPc)m;UL#`KGYg^&H z>kDkxp=a4{fAZ~&DMZ6`Vyy(3B5yI<(_NTxl5|xG+1(0F4^T@31eY)h z0vflH!vQ=-5AdzUNT$G-jtBw(0K^3Vm)!{hH3hc1GZ|x-7YYJB0_Yl-ki!8gmw*Za zDgz@O0GF)_0x|=mMF5xL3IZ|$_Dh$Z^Z^`~^#}qGm)8XX5DfqT0003100000JzW5o OUkd^o2G?Hz0000mS~Oh% diff --git a/Moose Test Missions/Moose_Test_TASK_Pickup_and_Deploy/MOOSE_Test_TASK_Pickup_and_Deploy.miz b/Moose Test Missions/Moose_Test_TASK_Pickup_and_Deploy/MOOSE_Test_TASK_Pickup_and_Deploy.miz index 64d34f825f5a7bb00da7d6a0b276df4e20b1fef4..a34ef4baa0cef85aa605bef99d47e9bed0098344 100644 GIT binary patch delta 110251 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
                aDyMx?A0LKqCdu?Kq3(8cK7z9lvwp^We1n+$H| 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

                B)Tse2a`fBIgKQyq`xe@Ba( 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 delta 740 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

                  aDyMx?A0LKqCdu?Kq3(8cK7z9lvwp^We1n+$H| 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

                  B)Tse2a`fBIgKQyq`xe@Ba( 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 U0000E01g200{{T=n*aa+0Geny_5c6? diff --git a/Moose Test Missions/Moose_Test_ZONE/Moose_Test_ZONE.miz b/Moose Test Missions/Moose_Test_ZONE/Moose_Test_ZONE.miz index 67c9195d167e6d4d5086b6af8e807358f84144fe..493dd1dd33981112a5281896ecb2962cfba3b181 100644 GIT binary patch delta 110407 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%0AG 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

                  8KiInm2qf36{3n@t(4c`Y5$D8tz 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�OE-&_zY;$&yOg>N0ne&Yif(CX2Oxa5;Ncq$i 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 Q01W_;0{{SS`2hd`00->Mr2qf` delta 808 zcmbR8i~Z>e#toTb)4l#M3T%J!m@z|WIxC1-@`y2kak|ep#xCw<2d4LNGBGe5VP%-C zFDYHWG{iSs+EBpOdcuE$7eXg@d}7b#;hSAYhc-DC@1lvOY61bT3a>ztctuX6@Nc-d}T^I-r8E$ z=g9c%s27WSyX_smETxI>Q%~gda|Ee+b2xwTJn6IXlKF+mH&=YU*K%B*rQQ5mTJw$X z(rN75)3#+?T$IG&;hV+1y(d|q^5gmg{X62GMcw9;kBQH-_W3*iZGG8&*>zJw8ZL%} zxjxFja?-^4&6NdP``UJ`+k0V;;_fZne$DFQri(B06n9CRnlEpBaoqI$v1cxu!oKWR z?^ih^b30sO^`EmZ_TAU2EjiE{+N)Ue;>P->&r*IX?|<};D(-)J@3p>V?Ymz&qIZ90 zI`5NXIUe?R-{aq&H}yB~JW+H|koRG3cjf*G&sRro==;yK{oY~5UdGLtV%wRvryphf zE3^IDH^v%fPp8khX8Z}$6Lyn901}002dBh1poj5 diff --git a/Moose Test Missions/Moose_Test_ZONE_RADIUS/Moose_Test_ZONE_RADIUS.miz b/Moose Test Missions/Moose_Test_ZONE_RADIUS/Moose_Test_ZONE_RADIUS.miz index de3cba3813678968651e8f2c8156c21f7df3c84e..efbb3e6b128473c31b546096c43077d97f2f223d 100644 GIT binary patch delta 110426 zcmV(-K-|Bkqyg3S2e4@tv#Kt=0)K#Q#z^n~(*l&L0RYjO2>=!V003+;Fm5kIMMgnY zOjIvTZ*OyDE^KvS>>X=U8_DrAsk;9#!IhF^FUu=;Ns;3c4ERiihXeRr32~@JTEWJW zR@q$v!bN_2`Z3R)T}eEQNn*|iyFESKJw4q$@7Z{8876~n+7ykKFJFqigMWjgZEcJer4s^OVd0SKgWYOi;5&2h~uOm=S9>Xu8EbU!1bUfPa&;w*wZ>*Dlhi`4vX8g-Jvxs+gDgdyRD1rW@_^SIbJ%aM4qC0gJ8 z>bqa<4BEX>2kCsiwcf*bQGam(!0u?!MuD1uEQDajd67Xx zqpTehauye(Y=GEn{itYPH0PV)%f;4wYb_t0HJ5{hmDbuhKFQNIfd3*wh3OVUv;vUF4c zI7g`XQ$OvDdT|LDjf#sj6K{IS`9;xA2St|lfFGolggMTlHVNY=?ZtT>opYj+HIIw! zEK4()_By@Z9z27{u#FmFpN2lLA^BnG#Z{3NPu{%6rDw!wtn}J;if^gGHfR`{yvtp#IOXOh-KkM2#H8$&#p-+{C9jLRLH@ zNeA&RydEh$+gOUTUP}ldtf)|3 zDmzHs8;h$n`;-f`3Bt;MjTET*%cctCw4F{jRIXKgl2SuSa9m@{CbE!(vR#$G^alepK(A)^uw^E$#AB|-`*aegrBpT(K> zZ~TEYmWv;ZTqlhw7)8ppPUNRi`?yZzIDkND`lGxMXEB%@6Z!6;(vEYGS}M| zdqfCLRy!)1vdFEwu)g>MzJspa~6?La#=n{yFXgG|a zSCC-`@sAUW!c?9`X$aq`K0pCp6f#avsmXL=#==4!Z-YM_6{=ETv$O-GlfftaoeTI! z%6|*Qj`%0Wh^T`d_yjv2ssQAi6IFX!vMC?^;gZazepO|6%4F4K17Osx+W*Oo_ie-K@PE3MC{bIg*K8qb;SkAmKIQM)exxosW}DoT z#PU{jBj@v|8#C*9LF&}n_s1QSUfH3{kvSM*js^%(Oj@2U-u&O;KZpRj+@`tA>l(}4 zZ7Tf~$-OFx^j-nSAyxX4*bUcU~gG_G&uHSHP>=NK45XRQyF-1yDE8i61RW`F45 zRH&{HPrpUF6`yCZquB_%-&WPq`^)9uFD(MMi*T4Iaz3#`nCXfJ(}_t!i$JuF7>saW zYBs8%=2ixgshHzi8sR2|xQcQClVl?p(~ehsKI(hsleF zqk`ZG$V{{HX&3XQfHq8&mZbg=v8*zH>#jJW*3CTU$Vr%YU;h^|gWpV~AL<3nDU$MqQbPx?)-ug9wTTv~%`srU+)Zz>nI^ zm%y=2`i)8_*T1ihR%h4Is;i@imPRIwO~QDV^2sv3nY_Mml=O$a_%IzoCPas1@WgYN z3cdu5bcQs2nqe}I86xySw8Bo@PWs>=H0g^)%oEH}!tR1LU4K+Bt`f2xQeg-XAY&+q zT1oAXde}=`UiwE95~!h}R8}XuXBTE$Gt4YrGX5*E6n@_li}XfHsh>vg$UeU(ol0;= zIcByRR(CRV-X5$cGNv8`b;~VZk&Qr8-Db;g$Y?o_XgQ&e1zz0}zfc&1f)0}5s2A~6 zx@|>zJ;^bxsDI;V7C_4sy4V&?8;USAyjS?ZW~YE-2C~U1;Ee*_+>)doV_2@f6XS&{ z#tT)97p5?VT8XkfsPPj2fXtwReR%y6Q#9vrEZ=YB`whKMoOT`$FtbZ;e-i_3i0m;fURIiQt%CWB` zqa|FEYUdv-T-tD~pKkuK()tHDcO^}XzwZZ00WMP_ZQPdGmL)+PPd6mPBBWXdLa)X? z@Kw|lFiT-gkcK)XVO9bR4@KlLWPNcjpq=JT#?sEf39uX|6O>pclS$LATc*ase(9z0 zsVnokiGPaP?FCc^K8#@EZHz5U9JMdtSB|lIae&<^cnAfy?O@2DKN!&bHo(T?k~?DHsB9~@z+)Y`&Wh+GKSwhqe=3n zjFu3Jf)P#!CXlMy$|h0VmWpX&qxk&-mJ4iQseeVCbwNLm#EE*cm8`sO`pF3-u6_3_ zXj!-R)>OmKeG{xw*eEh8fCp^SL5!mclstxM(hj08z`pW%Qh)$QDg65FO1Qcr$ht5Gj`Kf$tgw{bUE5Bebq%07ACRpCC?%9rM-E7R z8-Mo`!oUZzC4`EfEK`zLI1#+xkd{({A2pQrhy>DeNWi;7-Bu(@@DCOVB&`Q3XE~OF z!`;A!!fUB8TQNpL(}9v14Z>c66c8*HWQNwuAC?Ril)OwuGBOB~3W~FU?~;lvJSv$A zPGg=9O@8KqvX+2`%*HO{;wx@6*p>20L4PrgpIm7OMgo~~9bxlOZS_q2z^UjopYF2%a|!Pw25F542nx+=m23V>^~k)~HchoOd! zRnRgWT`a7nH(9?pDl)9eb{0e9N3P0|2P2k@MF_zZRk3PxFsEYkkHFa&#UOQu5q}{G zW!RxV{AOvT)38=mlu%bmhxQV#idRUP=q)XWtIJCQTb-zY0YJo97$<%RNVfPof`L&L zBN;v^2Z!^}38&qL){JQ$N+Fnq4U|WjP+g5DYmf2%UWsW$45Vc+_B`UMxW#;gXqZ-F z0?%|Xn{4UeF0!QqS2hz$WtelKfPboX-F6r!uk#*GWoMBNIRTqfeb)kD*(DgNT|$RX zeyDM+3OWjET#M=OLzQcB`S0pltg`#L7UX>z*8)ag$F&UOvU}Be%tM^Ta4S1Z$p`#C z6-;ydYXnoAoi!2R@GPSRJ=!}iOd3sNK`PH+p|t6+pt&l@)-x%hiF5Tu%71eX(0!(b zTCj|9I+8npuc85B&{R-Tv_gj%kb#1=fgaGIISoXGK^F;tZ8fn=a5aeD`jmf|fsNtZ z8PsjB2Pjw380Oh;a z(*ro0A5xJ;LDi^on39#2uhm`&%3UooX?RJmir*>kg!NyfOPVju{%iNv-Y{W;UD<@0 zYsX-O^ScxZ+XitE$FL0r6~)#|Lrb%2B^M^tE-oCp|3U8TMyH^aG=CIS;jPOYV*{ia z=+fR_HLQT7HuMNP;qF0^?(R0-^#&H^l!iVAa~CiVuvx>VfvA{S1AA@4%53I@aeBs1 zxYh~REoYjMn~Vq?7aTJB?pL%?8o4b?qP|45{;Ix@L<)h5OtGO|y(Srl$3P{wu_#{{q!=fD}B;wse=fg;&GtLYj$ok!`RB6%Toyy zoUNk6ll{7ms(-LH^HmT!0hS*H?Y%-AXX(LgT%$kb)d#QRL4gv@S?v;{(1$HE#>785 z3t%QJAA%(BFud#xHj}K~i#fst)N2{#0q6lv?;X;M4tqQmD%Q>FC;!cWSlVxDJR|~G zPMUb-zEdP8#Gk~n))r@6;og%fs!bN>=_#u%Al88M{(s}TEQd{4t~NAf%7RnGm&o~* z4buGslUY%HX$e=`BK2`+gMhsqS8=aLM;xF_Rb0?i?_zb+HM{Dod$TLBLJyRPf^(;BWHrLx={_7c`dUp#W>pgGW^~rAk_*#Y)R; z4AoF&Qd9zAvO5vQ?OnXjHY=JFlw&E+M6yd0sbN9`Y&LF`$eDpvFTDcSL73Y2 z#OaU`_PL#Au+ZOtM$mx@f+}t$b_bAti0NwF7n@7#`U>jm~h4 z?I(!31PQMe;1HNpa&LoXjnux@D>K1lMt?sY)RuOOlPj}c#r+4>ijgh2v;~9DT zz$-A@C4P-n31S1$p<}xi5{^*|A2^FW;3G8z_IX(a^fOl2u_s~kUBbDs6& z#Dc-{gf!D=51EKn1J3zm|3M}^`mJ<14Rft2 z7mjt|u4olh)O)BJHh1m`v6-2eu0}goReQ|4kQI9ert*p7^VX{!lJprk0R-Aga6S02%<&>g|+RY&ANbM)6yoWnyZ?E%`pgSw?8 zcT+VLLo4}CT1NeP>gL~6-b?hY9lBzYpPeGRq`ACQT7Pvhfu#-dN-lC)Q74+RcYCH9 z#2CR!%dWL86@`(iMhYWTO>-aUey!bJQHJUkhLWmV0hN!X{tD6lu_C%N%v{$RnmypN z9_}0Ozx!21r_0;+(3-yA07C<7Y5*OI*>@k9VfX;TioN;ZJp!7}86yx6H%Kw=$?``% zWS2>1BY*nQ+k^MJTev6qJWav!&PD}9E=tIR=p5NG*Y1Mp5g>p}1vZiI9~{#=n#VCBNNKrx@{4rT>&UC5TcIQf zJqp?#Rm2b(^c@RJqzD*{C3qor4wnd+b9%mT-i(`Pj7D~y1dLSzJkpU-lXiLj&Kt>W zAb(I91XY^EE1wpvJa*bN`*zi<+3?GBS}i_tGIRCp?sEB`q;3MiYZE|NKIK(+ImoPd zdJp>;@`3{pdN@L_@=x;VQ+z@kpj%%h`NRyg706hF(Z!?M!m3V#lBhIze5i>`*!XSi zV3I8XmVX+x%4Db_xP`H8BBEgpS%s?REPw6-2KM_`1w6~9pUs2T1@IyZG(H*{s9lDC zl)3pF317trBJr$OM|y4tOb-x}0-mrkbK73kp%Ih$930)fd*xFfe&>a}U}S$U^lSe0 zA=fMGeaw`g^{J3Lt6AgY0c*q=YmBb!o#0gD;Exz+ z|3^IVUa|LC`Pn1HcH@*X-El|_b$^^uL!ZJCnbR~UWUNPU!_vh?;*hA2)~Not1xyAJ zwC(B=hX_nQf}73Mbq@-Tx8=sL={S-=X;=M}4*VdB8mpQ6-@=JKD8j~)&d|Y?7h2gP^F_Uvn^mvjPFzkVBWJ+WHGj^U8)lmo zxvPhaP_E;%o*c0AU<_VxMwrSW2Ve#t65qogYdp$>$>gIlYJA6G1U;;&@su?IWZ0g( zFwbfU1|i6s!`hR^BK#(Zp(Y!$Y z1NXU2gC<>u_nC2FS$B6Iq0-cZ%9B(c2*np+l_za@ zV!GLe+u+a4C7&&48b>pw*&KN<1m6e&2=(?beNN^vtznfD{W+WI^De{3m~@%Ra$X<) zH&~80F4Qx5IJESKgk~UGkw*_i^*GcS_R^?#k;b*~4%7P3#eZk3tT(Lb1J3&!7LP}j zd>ZZ#Bqxp}E60OFe=s=oM}otr83qogj{%2|Jpin6k3N6O5)Rz!<+LKcMhO~kVV)xu zAMjLr!&+*Cspc_WVnBy(6uh6Gze(v5fp!|z~pOviiH(>ej_pN<<|1pbXb|>J7t%-ty1^wnXd4Iz!&e6vK$v}QXLjak(d_#}S zob!wp?>|5q_EZQ>aJe;TE<(eHKz=`IIK-PlBrZILE@NaxH&0ok?kdNlgY2>g+i*r;qI~qWRZ2fA;HEPw1n&yLa(Wo>_(SrGo?zde9K<$ZNl{ z7~j>kAAbNO?aOue0(ua=VU9?h=q!O1>2Wy8+5N8B*NOqVyHg@Sz=GoMZ^7Up!9a$C zZwn}ZWQH=|M|3PaH=`W>iG3Tb`hx#_TK-H|l}0j;r>6c-xAVUU=^#sKjhkRY|s& zZ@mT%d=nJz8x7ASE5M^cv0MGjReI56&R7rkWQ|#Cct8EF1w{sFmZxz37woLu#BNj@ zS$}ys(p0uz#kIH<3y#iVR%en%L)Pv6-!s|8!WaCRGWIh|1rM47ef+sk(Ns56wkE88 zJhE~5s=4#@%9rTI-EX(RJ6S%t7{BBl9Z2B zO0sK?at1-jA3g<-_)WwOtncUqXDxZtKj#EB5!V)$g;hlrUQ3K|+>%R*BwPaBTU^%E zJZ&u}xW|D z!}04JFRDlAq$(#ts;SH)re*zxC?+4qIeaoff5f8#17-~;CCfD9gk5NF7r>_S6r!iT zF(Eqao&%=LIqW2!Cz)m2pb%;K!O^YXfC=&*RXiCwOZEpXDP%cD3Z%vYW<5 zF`(*$82TauSKl{pzF)!tC1r#H|WeNH$^>X9`D?c}!&x}qLG z>)wNt7^=R+wU=T(lu?~Ty9@m!^F<9QC0tKeGH7*#tt_U#v(Cf5sei&Y*Vz5I?xo6t z>A7B5N?P{9GD%&5Y)GjvnKVs|#CYjs zTAPO+VpW>g^!4|-`drKv%y;2%5oH}@U?>CBT8^32#_YqF5Xl7T zQqIY3O(5_OA>O0inSa{qNEFW~O#1U{cZ8^HcvzbIHa(bk=Eg_R&qLcEA%E^1y0{H8 z1ZvtLp?{u5j5FdqS*WvJr()DFQ(I(bkS&q{kfZxA=8*%-J?ohq{@K;wbEv(V2CA%n z^Dv>EQkiCp{q;?isqni|wA-ta)RWpQ#p-U1WV6ND?1pQWVSn*a0kOI5kB}HXby)mA zItcBmG=R0si3#n8a%{mVOo zX~hlUUnN9Zvwxdpc>Gw^6*t(Xuz>HC95E4BS`*PzCS;J6@tE`*C*3ucL(4Xt7M7K0 zJ|CfHzf~nO0#)lwlgdur66~=mS3(SD0>BavadA1$o0s`O=4^cp8$ph~xrz`!xmvN%QhsOr61Q zH(h4jhn}U20Hocl^)bGohkmxMrib=R#3pwP8#d}=hx)pzMH40?v_3ku(~0r)b%Edi z=YMIo90bQx*9w`wW{}f<#!TJ^YCdF7JJFB{77Mb$txM-L3gE-rsXRDI69lxK2)>X3 zdx&V90n26W3*0xwf)GKV0O#*)2tV&jp_0LHWZhD7j!5gml*Ed73g~|6LVp4YMBt{@ zM$}#`37>9l9B;hdINA=6<34Oz!@D6!DS!Ei$@MYhXLHvi{NqonM5hCE6ME`6mJNM* zbzU%p)E;&9t?!LARc3SY(V}P$CAQ3mX%!Ri6EYAwRCHE2A>XqzR^O4ZKGL94hydl| z!XWT8=>+^#Do&ZMEQ!jTp8b=)5XQGte+nzrONQdOr7tWrw-wH8)Y3&T$_g!5ymJ}OvX#V{39Xp`0WtI0x+ zw9cNYtc_2q!asOtd~pTtoyD~C6@R=G+KZY*ef6u&!2X`A z{uGV*;TNMhMkLMgqfuH7S8356N5a82%wwuflQIJ)W8^kJnu7iL>pGm$H?GYOb$e=a zQ4XDxexrpYMI#3oL@{nJBi_ckw=LRq2)Pf}d8j?biUeNlip8Q-5 zfc#W&9jgCn=~}8$PnQaxC!n3$pPtr$+6+n7$zXnM$H-wob(t`x4Wo|9qagKJ9HAx% zBsDfsfk~Ho0h3J(F%%VgnNopl{3qI7aCfz)2B`H}?HAQ`WojzL&!xY#WT&H{PK;6* z{L3)i$Px_R=o8C^DA0VA0DsD)o>R*~vKi67PU~Aul-7szc-6@GupS1}ct9723EZ=D zr8Cdi-rX1QMn1k2{H)i32T*N$qAWmIGA6*e(CNEWJ!Rv40-*l?2LcK`^CS z!Z}Odb)!8eXUm`NFm+>CW5SG|5Lfy(gidDs)U<^!+a(ufzCZ0~OpokkIjl;iTf`0l z>8SE6^^FdULSePGq49@!o2bI$7yEna_;tWH)~EL^P&K`D;AI)q<(T6tFO^N219xO~ z?dq=UedJ*S2n2LpkxjWV64`&Cn)F-J9;qKP=-i&?X%95ZJ)r5vql zrI_+y5(Nbx$EevUDE`vX+A#`d&C@JyZJ4@sGB|YAulty+t$&9=8y!Cxdo`S>0OBWPyNqV}go`AZS)QAP~?dz?FQJlsr&kv%lP{ z)IiA;TD=%cuwgo``kVhtLEMZTe1TLVf4bxoeVRC@@g9FNMSOS%a5|Gtz+OZ!zgcb{ z!&qWf_6y9R*?)J`RR}_Lki~Y8z=sUa?shh)9^j&E zOu>(g_WAP~RKHwFDxb=E)XtJ&(Fho3^3Xee5xn0=Uw>Gal|!V>$m|yK$v^TpRFO2F z3PX`2M_mZ#+ zZOWLSm4A(x^6S+mE9i=W&6bU*H|nUb!!S^9Pjmn`!h{PWpMx?sa?nbfLQ!AzR%LQ{ zOX(LD^p+b~^?|)Ba4~(x_-igPTF)^M-cVyQ7^D)gr5O1t#FZXWvC2>DOLj3AY>tkz z)M4pu0Q}$4X!WvF`gBG-?%sMoU;c9rkt=YNNB$4UkOiZX9wZ1j4BQNV$IJN;-F zT@8--CQYWxJoneQx&mzWtbDp=0HKN5%_B*u%SrDc-VWgF&k zaepx6#aK5b5F0xoCxshH7ABqW@L;kH&9c_g*6~77jiy3q=bfZ4Mu{$v}D_mY3if5unGcG19oU z48qm;)d%>(objmgS;To4@vHjL5zH#05X&`ggy{ki*okU#ugsEr<^RzIwSJ$*1AjHU z$92GRX;z-LG%Jr=nknIA<$>WO8C>#hNH}AktB+h!S`+wcNN~T#*c~pt+e>ezj<4L*s|8CsJUH*@25|R-bv^ z$E(j!&1TwVokFXUQ!xBX@r9xee2Y#+bK2+_kXh|da?YQ!lzB0wSW+0WHQ8&d7yLI2 z3$>wzwV`Fzh7ycc&3`~{ORv5t6Xf}$2qO3Umkt8eN%Z1TB%1SiR434TD->vvZtQ%i z-d~|qb`#iu^#?0tUD9UNvHx&|>~+IZ$MmBWGBsV%R_OtyPf}bbl0Gw?BSA0F)AUa&`M1E?5)ig z!&cz!Al3pRqYifx+)|{o98b+Rq6J%qq89RbW5^ecA>V5ZsY5&$%B*p4;G98G0;TN`3f2Qy zD`X3~Vt<#{W@UKgLT`470N{$dY8ii9E#XoLVU`SI_;%Y1WKOGhwgEPZ#(A=Vtt>b` zt`Est3IN35Cnub&Rg`Q|$tneF?UNj$<@i}pq6|nP;eY72gt>fPh&gvb%DQHxm+JEC zTz}<>%+j!rD7V*rTU2VCzkDirse8Amz%=;(cSwxAE?jF*xu!$t^a7g;kE6GLi=t0s zI?9V8)*|vbjXI@!J4WUOIu*eDa!g~~6MB%xw@x`qN>D{x3F6(IyCIG*vvd^av0e$v zw=n$_Pk(akv`%BZ+!_7tY8u_rOXxI=yEkc?#Ruc7i1ui;ML!;q0#By#Rq`9%wHxTf zqv*H7$=$Tvt<~{bPnRwXnW$xdCG>Z3gBY#~FUc##0J_8YHw?g_r*H~dPH)?|1EZ2S z@U9iHk`I4wSLRcXpqe#fSLZXj(Xhvllx~gQ=zolTz}LH|yxhYyo$%rclPAklSri56 z0+2-OB*3pX$tZSN@X~z;p@PLZ@pvukk+V?p+y&RQsUGrtow7-n>#xOz*b<*Osxuvn zMd)lV#1&SyGYi)=to_0#OsVz!@2om`X&q@jm@6m`VpYiL-i6>m7$v&i#ljaq4%y2- zseg8PV-n?%{L5<8#46bN-+DC_n~=A}hAU7-z2@rZRD6EvSmT_Yg7oe+UAEF{s0&O5 zt*lK8SEt%qqQq(dx=V7rHq?YS1Ro(4Ba3OP`zpZS5dL5#br4v>QWJ}N%X-J&_2LuKok}WFJXHAX*rvls8!O~~4$&6!$-hjF zRpgIfxn5)uqb}ln2#1?giIZlwBGr4}Ip^KJOMtlimfgJ|ehpK$K6?theF zpQL*GmXpc{-RdNBvblK2=^@(?^04%`#Rhbn{fv&!K!5w+f~PToO9sk87$2MM_RyH6jOf`Oag>1u3fu`=}Ly>(O4Dz1imj-sTW5 z?f}9z#PvGsO||0=WmaRM9YZX))qTb(0xsVT91CE$zu{a9;q4Z1f zdjL=T1I;bV^?{uEuvP4ltA9^`CG2GXMYBAWHR7S9*n`;LmT@2ZkB_;)y7oXq%lqUC zErx$1Y@R1MeU4x^V)rH*U&q6vXgtF^?^k34{F5=$Yx;Om{|Xq`Md6sUVxp)YOCf88 zzu4~8@WAHW{*F%}x4J&tes^dE#hIiJcDfZg9{!OhGvGDJ=Reuuu9f+-h);-<9 zkEi-wiSrg{zxDcIL|uXuMjk}dp|`apAy+7D{+5zy6=m~9K?+#as4L4$1&2eos}s0= zKJ3&~-3Qx)1iko02C~9ukb09~<(CIID8-#rngQj`Coh-Z%EWi)e$c2w`Nb-7g!Mbj z4WDqW3O^*bF+Ctbzkgijh!utIpXgT@Srh9nXZS!%$1pRA9b!d9FurJE*>oy(Pg??d zjH!qOC-FS(Y#N8_+%eU_{z4T)$Q|eAbl)i4CC6MEdDO$EDk024OOPt{+O8eefcW>)xvB^imfstFZ-#P&lmoLehtLuhiBcgMS%8V!qpU_p9-KQv?xoK zW{#+zk7n`8WPe3sk0316M&~3Vw;@@gUBd8AE)0~%Z4K$hfsVVL-W^#&80!nb4LxbZTE9GJMr%Q3Vd%zT@nKPz*Sy^dC&^zYX~sQSQX8&SRqOm&GA?xQW=0}4z6~< zr5EUkUw@WqpQM=$ZsOr=6sx>8`%h0MPjL&~eLx4zO|jk~^L7UnyBWa$bG~Ajae4y1 zHQNvQo%)lQ245H;2)KCdl6Z?=r9--NJPayF?0Msvm4r-axZb2441ZGsx_6-JG<~m# z$AYIobOMJ=Q&{3Qw?rN-E}5H3CFI86(8f021%ERQKBaTp?ny_fESMoki5kC=$b{m` z>rdY?HHlBzMW3KV&ne6r5WYXoS))^*PLU?ZE|K?th?rlNbE*qI#s;Q(5AE3-s%*c)yAJ&(BrQK)}bDqbt*M&Zree@ zpnp=C1xhR|>joF4C^ofxBvO=#_;!-tg@PJJ9Epf>!PEZ^`!(k5FVij6Ct5rJ*Z%|86hN8QZ zD#_kWD41H|b^6XNV%|&W!P&1~{R-*`V0mH$yh%TBz(bREdg3uo>3D9-z1` z)s!LIj(wvUhH4}jO}#b4mFG=!(fpN<^iwt7)=ksz+RtzF?~M2 zM%vfzYJ|}5hw+vOJk5HAz1Z2yH2OkS^8UJ7$c)JjGfZy zG$des&zXcq=!H-uiFnCKN}9$N@P8eP+b3RJvrMGDp6%mriSS{(o+$HXm}Xv&WVref zms)sqcSc~QW(Yzv_QQnxL1*tO&t&3|&+&EvTUC+6fKcdoyy#%~i0`5iom9~y&thN&c|#xGyekHyD9hq3#3VugeD=pP%(>?*O4@e*D5-xFyO8?E(QGz} zr!oo6b(?0nNU0;NxQStWm5k#d-DRAB(;gr9x|RqBxwrv8g0T0}Bnt61aUG;)S15T~ zGQNqY2`%nGJ_Fe5GSuaAP=B!^pkt+U?Or^{GhDL^DQbVUh<}R*Gos9*k<@#;y>OIX zi!1Djw!tT%d|C7h$bSu{!cvYPsbdx3Rhq{y;os>kE#jBu$W=5|=m{vrUYLXzf`=PV&qY z&gfjKJJKjXZ#1HujeoK~rR`}kSp?8Z?4|6P*i`nuQ*{zM`kk=7Fk^43s2>Cek8C6LvfC z3tzyFMViiK(bX&>_8+3~01jdY=?r2;X9UgC=-22j6PME4hJOVEBH2;=3$)9WG|yyc zCPQG5osD*Q7KOqJ-ack2vAZA(13iB zu{h$u99AL3LqOp}vbdu$iEuK|3g@PaVU>J;1{kqbPEKXD>+;-2cjA(&3e`;3*RMBF z1%Cl3>x$WNOaOczTPuZJ2;MDiFE3X6og0$D^tNtO?0+tb&!a5nglGmLO$8m*qBeSA zm+fFY7|n*

                  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%0AG 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

                  8KiInm2qf36{3n@t(4c`Y5$D8tz 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

                  Pyj@oo2Oy>}-(5uA1aDP&+^==uCC=v~8|7q}eqKZdN zeRrusKPrpr=wVs?Dhk_onRtA{vHqKGlrI_(iAE9BZ7>v44~SU19SI`V1xwFvZQi@K zyk6e$M}V%mnk*bh%_&xyQ98w)9JZUF0~pt1wgAB!0e7@<3ABN?C2o>9a3U|8Iwld_@wlUpOP~+B z|8kQALQ{F!6hewAUcb4cj#a4x{6MGIqnP46U9Vz#M;U8V#x*IXI8!&InBEb|+C*|a zihn6i)HN%nceJrKZCsOLiZgZnis>DFtW6)+rI_MWEw7l;QF-+6@T0>|_pz!UD1lEI z;peZ(SYG$0q@OaFxf66PsV(>-*D0uUC8UEq@9B$t2u?X?`N)99#(J@Hp8>QX@#_1KJ#h z2z^yPf-!^p5g0y#j>l%@vsGLv#Z;B(>uJf9Ke!TzxI^J9a%}51{RYz zNmxHb430$o&sK*ka|`+gpdK4}$7pizAKqu6A={L^+PmUdQi$^+JD)0bLgaV+9)D!p z^gs@a2atQero#k_sx#^kc-Y1K*}`KxmLFr{6yV-59V-tL3>$${I2pQHct?MbL|c&i z%W2zSK<5^EAf|&-cN#|B3?mH$wZw(0x~Q2`cUqz&sDTvtfb_$o?*0QNjt-|#oS7hn zLd{5uiLclx$HatI1v|Y$kDn42)PJ6XQg$GZT%0Q)XQF+cxzh}!Up94K3q>dasDY8^n(<4LhMmS_31H}j40?VWl30PF%VDN5_!c)c z2?ist{KQf6Bk6wWBv2E{`E!~8nbCme&Y!7I5l5(>Z@d=$MjDzE=h2%~(l*YFuduVC zvy}S5pGbvIf~DH9nXcEGql>m7)lQjGI+c^wsTkNsfg`;Y-#)b&tbekuflWydxLy-2 zZjfJ&kQj0tn4Aw3j?3zoe2?<)i zlGZPzbKDL;0#P+)`tAL&{{`&%e%RaJ-4pL2pz&Xw@>aE&GM}(-B8vc7dSRTF6W06K z;Io7QgdyMMZw;q_t$%%bc-Y&I=dcjf*-QGvEv_DFv7F{R5^_r1oun?TZRkVjlUMYv zDQwEgmdljoWK*6sjEB)-NiMEtF(DT9^gOnL=nYph*0T{ePdoT5W)usZ8 z52qTK+?Gfb`hQZQ83?LQu`j}q8bSNP%EX|w;S$KUjo*(9s6PCq3dEz5Z?Cw8rPb+Q zJ&0W+fuxg7D2pjsxhEVaX0D>S;rDxSq!(Y4Oi;_v4ZH%>q2mdt2Zy-^TD=flVd8Yv zH{tnl4)|xC})@?xz#@Y3>yKc(*rbyf@gEy@8=3%hjB> z^8NrOa*fTwW$aMuF)(&)v*QSuwb*zVey&r%p#p+st#+^5d%Sym|D*jQc#@k{M1oeR zj8TV&qJLde=l&F8MAcMUpkuQ{=6g3Hlb4kzqU=3Oe?tv&?e)khsn6n{V0Bn&WzyZR zur|thfyCZPR@>v&|nwJ-X!zFa4&-ZsikLO97jED7V37iRh#!h-RQkU_kG>_m1V^Jh%)IY0Pfu$F(|^t)2l(U(5*}O-LntI z+Y6&g)TxxYLYY3Ya zG_l!n$?(fIXO?2K5c_k33-M~p>N+c=+jCv|MvT^hE7*RI~gvNlf8uRC;L)zkW7)m^*|*MlIHwvjZJI-!b;0hsf7Yl3rb}C3X!>Z7b{?_ zysX`%F11UYe@OOVoFp^+@nIh`AbH^_S=~-|nXRrvib#v_$mOtZCI@5#*Y<5$LVxCU zKHpf_D$RSNKQLx=*;G~{>9 zNrq(eDMqt(AIsD8%tYk^LCCxbgnvrS!72v9=ZpGA@N)XXZuGc&|C7%jS2{GxE9@vw z@9!QxJdFA?&wJ7MhpI}UKnvo+{r!CBoiLT+YJ^&bLbbXD=hbQynoWBzd6nl+$ic_p zKR?3-@eF<@!|ikWz`oNfN@lMnHEQ(^Zfx=HY_5N#^^2qtiBd7XGJ<{!Jby_)(8ERg z*f#y)6_HcHxhPjJX6$||Ql>iCWGax$;lh zcu2&rFPFhD_Fj}>Qq1(#G=EH2|G8Me)_aLs&(4i-WkNE8F{5s8N^ZSpry!96Es@V` zz@F^!cSaz25er{qzX=CWOlOQFa)oqKaeG(sgj};Ohn?V#1!am#N-_vkzZ7gYcYJun zy^;w-(vXhwwrT*?kSFm3g=rk4)$6$ojXX$Gj3VWM?~MWYKkOZAbAKC2@pGu+KP(DV zWKi~;grmSkC=}bd2ogJG*#rnzuC=tXm&jV9m68*b|2zGd-k#asl~#6gJOh`k=F!vB z)6>(_)6)YlY)Oz4f;@1;RfGU#s)Mw}S~S@?RR9`ynsc80gQJ1C&;;rDaG^_Y?|x%E zTIIcblUDJ~!Pf5R_J1mlxEmjz@&p9FN@%>R%{;fBz;X2zv-e&Cv!P^RoV3Qw4Y0R> z%PMNyewS~!b))jLsOU?Y;S?m*%r$SFmo*oNgZJX}hbrXFr9&iSh_~n`&KlQG{BfG1&j5>~G=G`vz%nOsv|f=4p)V7IleH*#5J*5v5vfFp+(LX#ob)~%JCr#=C@uW6 zzJffQpv}AXCB*Lf>M<)bnAyHfztVHD-8jQp5hrltYk7g0FY`I6mt6<-LG8=^g9BtX zDMEzDO~Csn->U9ld0ff^vD_!|q;JXXk5P|RT-|GA?SEQ`c08iC96U!C*ZX4Yu{8C0 zXcddCLA;M1ZdD%ltI@ahgX+G$L2Wsv6@kSx?;5JVqg#EH`{6R$>GZat8D?UG%0n8C zQULuU3PMIYhe9XkIEBAyg;0*N45bu%WLbwhxJTW)W7ngdCZoaHMd~EI&OfGhoih3s zEk;-b)_)@UH++mOWOK2xP$ld(*P~BcRgx-a#qyHQ(>z+!O2aB zx?dfjNQmiIqj^E+@o}i-^*FE zrSG8ZIUD<$jv1A97k>rgh}`vt{-;x>Vc}jI1`6_inCt}Hc9ihW-chY&i1%zYeg04z z_{@eQ=#r+u$P755u8e)MD@$@&Yl3U(K)J@`_F%nXY@J<WB=Bsq_d;XVoYk-gIi8N&HvjiNv7ZbwYDVF)Bjp)lE$wI z4al;*^`guPFVp}<$}FH*3KB++n(90;PJgM4Fj)|b1`-hzpHJzEBe&zIrDOt5CJqe% z7uOHTFy$c)8|zjYHwLde2I62pnksZq2EqhC9ESwssE@@_LGyV9a&0UJf<$Re;^_V+ z!E&JuHVc4X<2E96)D5fcw9)=QzlqV`yo$!&sI{l#Mx~vz2eUwDM}4=sUSH#Dk&EnOwphi$$S;-) zQ5jL6`xGVeI)5bl>^Ke#Jpiz6bS5roy|^H~$*#j$&EDP)rl((GidZ1-6Mq11t)|&3 zMB7nLF&Z{UXp=XSFgBV9?0d&hX&on}RlqUa$FGlnxXAAk;;@9PeBvcqR-vp$ZYgu^ zRjZR6DBR3P+-8&W-Zs8_N9w!hZ?>{RqZ-=XR=^is2_3o<9S{YZUPio-8ql_cq6zGN z+AEzOnr0&=_5wscXZ*wvGJosycihH(nRtrCAJJ(}gZPN|{pR7PCcC3~@#$Y=K4e~V z_Gk#(7k8Y+p`9b4o4x56r!NNM{8yPl>-#Yq|8EA1ytC*Q;r(VX91f0;Ptxdz1H#rCa-~0{BLK>j)@eIV3D|4zXP+cM zn1~DeOBp57c)fP`mdWWnyM&+t6rEG^qFepJ;h)Aswez(`|FEhiQ#b6B~q&gqc;jBMdZ7frXu@!C+?jIF1hC z#-6YoDNNai)YZhv3(}@hT3w`zPbt3J%e{8`2K+-plVy+9y95}qt9>-M)WxYAloP!D zi^63trU|ORu78PG9fP$=eTWFpZtv4%mClP=M1()H97w+6?HT9E5vFK;of}uEf*BwLOwTNIHPBARS4rwPuAPmrnE9B`!5h^c*Ev3JF)FGs>N=gek5o6pka< zH@c8dN=JE}n)?rfHz5WT{Y#O>yit0CP8+h}g8gNJQJIQxx!>0+5~{y*)IU9@i^}`^ zZ}DFcX@7HAkmfG5?tBi6S73bIIM`=|%g?gFAR_b)|39FKokAHdiDWdd45ww7!VkPJsjV-yGzLwe`>h}m(%wS@);ye z<=un8VSu2)UvHu!qaAL}_7N8gGy^Fl&BWLWBYy?f-8*#XZ32v!FA9X?CN1>?RPGEg zn}YgGl4VXyPr*F#EOONd$uWqZS%JaS7toa~E&TZTpaLcH=wz7{Sugti$7Fs5<4p|t z4UA)e{vGijeZZkUNT;ww1M+qd1~_|wfgIyz!2QeVR7OB(4y0aECGeq1NpZv71=ble zXn)`yY#_?6krD|QNpHAqcQ-K|0V5*zJTSDOS0s1W!(($r1VBxpp}#ZP%YE_FDVX>c|$CDU8f z|CncEf2cwU%5X8CLB`SV%jperc#%zk4-yazOiY^mZ0$~0X@M*14AmvbTM>ud06<_t zmcJVWFRa}R>I3wY?iU9fWH&vuhw(N4URC? zQZ4COS}Q49(i#b>N!AC<1`eV0BFcOPA7-2hKI;HnAktQ-3K+i`>V^BGA};O}n;PuE5#iq+fJ*Hd6{@3+&+XGJOAH z6Pb>=^mar#KKkYu%wFs1qlnmcU90VAqpiU`%6kyz2FkQ2%v&hEHDS;mxS24Dh-nvF zZA}>0+I{#1XV!!+RJ0_EyVtQ3Z9^8c3vQfFf`)As+iW|Lu&LHlXnzRbp|uNtNxP)F zf>Pq@)?sGBD~c?a8B1$;6-kZC0@p?_3jV5w^AXFk`jl`2tkOkMo}^d-9LL}u)KQl; z@c??%kvpD-gp~cGs4Mw)tzf8P>)DAwMR~H@iz+RA#o!+4>J>R}lD%@wxk#ttYGhwG zLA_mcczP+KPcFF<7JqP&p~=%(tno6njE<`UhNI!I{|&!wDK#&F6ge$#KB+v?ICt*F@969)tG zX9Ce26)>!@9}lD_nj<}y5tkBSfvA}!7{hSV;w+U>D`eKvrhhXvlh=-K4s6hE@Ko!g zJ;kvIo~^@i`rT$M43FpLCegsVJN^LH`@y;3-deOxSuYOPZ=zid!^M>=-NJtP1s+s; zEt7<$MvJDoJckiupgPVLzWi_HA9kbDE*^MF zgJGwCLq|YL(tiQh$_j`4Ddf*%N@q_@hRSZ6oFec=qM8gqIE+8HL#6&QQwIZe7h8Xaq-Uw;-E{o+w7gB%R>2*3g>sAe(wVk!A&d#39>hO9AMwv+X9imbi zEOK2jz#{19u{j7>0kjWyMk8nPdVy3QVM2pLI;(#rLx0=zPkhBlD4F7C)^wr*$V!kx z4d9f>N=O}3Jmi%nzQCfGLkn2}2afgr129$riX37s8PQ41Q+<@VkP(rSO1U*EVNJPb zBaRIs1ZGDVI!X$%`JhX3fuC>KU1qw9y^|RFltTkLO()|J`K@3cI#_qkhG=+^QqiA* zHd&|V)_;}TUURui^oVFx_M4AkK`KXo)0d2`ZuH zSMS^RPwDm#Gphm-!XAMtI#S}2mjkxfw>b9TELdfX6XN{1NO`gD4~}PD z!+#5{5y$H_(T>+l+lts@)7l!#qIKZ?7Z-YH9 zbwtkjHO90)uAG0c%K^|IW1G&9ejrqSv5UdBU!NU*@1tbfgQWY_~<_(1b7{n3wpB-oxD9;`*SZVKVW zK$M2gPzKr14LL`a>5L%`wxBmC1w0u~oR^%`6?jOZq`*~-&hmH~^1|tHv-1`Yzx7kU zPm|UV%9+hEII>o0KSerjt}N4#-N6Zi?rN)JA2!@&qww1Zt3| zvJ%WTm;In?uTZBa4|{)jxOg{mt-geFG7-*?K-)Qc_4vuFpT0Uieas^#4k}OneOVDC zN{Lw4tr}bR_@w{lZKcc4{>!^;2Y>nLe|e8<2KndzNnN%QQ#%g-nun7m@iuA>UDI@m zsHUv<{IB!Rm3STe%bx3TdLVppFrviB$@*<5?tt;}3vI1V0&A}C{)oiWXEnHt3*em; z^;fytNL={;kcLwYfS{-4D1bWx&B$D)HJ9Q#dMrxpDFY{v>IOI{sC}-CvVR#Z873Nd z8JXr{GFWD<6w5(%2T(t9>h}m8Xx=j z2*|pRj->${cG*BZmTHg!EQXPQp*WtD?%N!acU{coCK=RcUyyu4?5r`_g$OmV=?RY` z{>;MgTe{$5GGi^HptN8wZ+|H}&eMX>6(WNR;Vhr#m*|TVFh0SvY|nT1#P1civh-%W zVfF_cc~5U0bx65IxfpR)gn6Bw%OEKk?;!fN^+t2ekX#T9v^AkiN)Y=k} znrKjg0>m$wY}_7^T{U=@%D3`OFn_PBJ@46q`0(hP!O`L2$*||7NPm2M^y0XGaxfem z9LBE?U!J-}OQECq9$x1kQr?%^&f6M8w*8*w3$!LZv+E%5va|+mj2e0`D`C)kyXlf) zC3Bc$M=y9u1Mph1)2l7=baRnsev#;QBRWJj;Sg)5d+edN&ucC;++6But5VOTREQyy zk=exrp0nsTb56A527gH*)`b@mrAAbk{$c@o2%F`v6L3bIgDR3=cb|%y#NaH)ZKiEl z-}2wa0=?RueG}U%oL=;lmM*&_YH2Q~BC{dZ8DGYFujNpC!C%b<_6}!w4fF6LAMH06 zjLEX73BDr4O+=m^1V#`Q-q|>vWs^)z{t89C8Q%n#cP4sxfPZ&)z;80j!efP&i;Au# z-hx-ZsJB`suw%skPYvo+pE944{$tHSb(gxdfFj>65@T?N$M@=j5NHZ-2cv#;m=t>9 zR-lp1RJB{HB0KmEjKMW6JA~Xo>WOefasOd=P0@Jr6L>>;{0avflZQ0S{h>JBNTz}XRhS@{e>Fi^i%_cdhyN*%R`UkbjBf$a;xN^X$ulc$o&Y#rk$l8=) zkU;UJGHwJS9)$Pr>G`vAm*s+3(0#i-30&ZAc~2%O9at5ZN&CaHnu`(l75){a1VcxU zE_B1tv7-uFTtPa+Z@GOZdqQgFBeEErq=w)LIJbd*8Gq;rBNwJ0H((zh{_$}C>=b;& z)|PU&IMNUvyS^YT#8~VIu71<~QT$QjK{rJyU$2fn<%II`=(8YJt?Kw{ zLZ#i_EINMiyTkocM@hYyS)g{moU&-^zkbb2P6?%`y+fT9S`RP3Jt`u+7YvYE*)!1`LrA*`rbUvInHzG$=902S1=1q{rS&#HQg2c+FbQ*?2LcuSGxQg!M5=t zuIcws2C@{I?mFX_8%1fz_N_#Q9@=-mTK&NQtN~tp6yx$ zT(QzMC5q@Tb4=ku1N?;i5_m*H|4F&f!#aFOLGY$f1H z=Dem7bQg)~$rOR3@96V6CR-O!uM!0YDcbW%=^Vt=?=PiWr_RMT>befOz~g{c*`b|S zAAdv<4>EFL@l*opYrX$w!)d#9%$~dHRHjcpp zk|xE1E{Jk9w$WrlZdhA~dTOBbgAzhI=e8X?_#tK3A<<`*e1WNg0l+2yOY>BoG^+!9@f)VIrrguWN|9|R|2 zUr%90dYSzR>0SyD4q6<1yJQGK%R z*Ic*;0aySI@|ltUScda)Bc-dfk0MG8-;cD`IqiXBF5liv(_P)8QrX#4&4Nr)@>6{^ zqpzd^E)fbuzZl{vh44FoLG%rBIm`~FbD_sxCM7EXo5z348xgj%5eIZN6n~~_ZX;wU zt>E`u5kqF?y?SCtk&nQ;BwO&ghVC+f{l%|y9C?3yG`W-EUhVnDjpL@CfPA<|U)<$K zIkAx#CG!-n^%p50pw0p2oHyK6s>d`>e&!D!QioE1{XCpben;&5^!g<@HFm3EM)<_8 zos|z-&X`Aa(}f_`&H=)D4S$P|0f)FE2DvyNm&PunPNzYC| zf(Jo)eR7ulrNtMLMAa%?=+RtHeW&q=uX=K)@cB!x5GeOtz$OjWf!TB=u8XF*F@40BDYZ$*joreYf8Ks=VuMaCA9UQcff`QeI9BL1@_#~yN%keVff@+s zM>sDOoGwL8DY%y13EsSjny2EqyY8s0{V75-;U#%+bi7sWOuis=^EnJO97SYCn=Hyxo+m%4LC5cm~ltqa@4d@ z*3lAR`o=lID-4CrzD99ols9eH>qWVE39Zp@J8VegzQyE7yML)))xCpn6P?46|B5VU zpMbRzv|0Q;4fiq5%p$o++*Z5Y9(CC4noS>N;A%C>r_*!< z#=%(ogNCRHM))g%wMCIGJJDj_)4Hf3a9EhD94xnv422wu#j)3Pt9JNAv7wS?Hr__0 zFOntx1@kCpC4WY!Dk_SqCo%-aMi+#Ly;-8G;RuDanmb*=SenN0_^LT6yicCNDjJ{) zQ=~xw-DtDXl+CBTI;5_XRq2s+1+kM+3=RnWA|=2DR?Actk{K6`l=J1xP=onKjr*}) zn^iMp^`c8CF#UKJT7c*gqR#ZwPz}l=0!afkG+s8P8GkAjY^VS!py-7+&J{%k5?oof z51ab;uY*%&Xq+!i8_B-*?1HNCxkb&|5$a`hr}c63@y8&DdQ-S$Rot3u_TWVEwioS^ zHwZVhp_wwByl*I~?l$m|a3S^bo4XJ%zmX^qYw?v)7UJ-88%mmWm5B+~LZ>le9{G=m zXDd(`wSUUR(a_oQVx=xB3 zyXW6r5?bx7n*$9M9yA_OzW3G1Z`F?7SVvE>*XH9ZQUF6P&H$5wc8+Urf8ZEXTv{=O zmBiTjZfKEDeEvAfrrAOw{;_+QtWLOY;N5}QIDa&L#}T#ePy!rkZYzk#HNNyTfH8=| zh}5obFp2p|9lgM=9Al_q=2&yEXaRPaLEqryFc1mL0+v0PcRIAUzNgUtXV{mRVeGgY zx!bzDJ{a#S3ys;MW!&NQGdTq1b5OepP4k%-qkGR~I2g7!OLPwKCgWc<3&O?c|1;xz zoqrh<-~=--L+s5WzKSupqjDp2d)z|qZnBEIy7`#z||1lUNY z3NhOU@Z!$=H0Wy$AU}JfKn|f1^1iEY2!E;*q2X&yb8G_>qL=F1_stWpvN2wcm|uTC zvjfMy<@Bi8&GA)*0$0Jqqcf1Y3pJVG;nOulZ{R@W1<`?G%7gLd$*$*oY(pW6%{6@N zK>g7@d-sJzN@BATzTH4)WeAYs_HDm|cH;r)dQrJF5jXm0FR;IEsdUkwqPoJ4%6|}L z^$k4H?^U7uU!HGCikcHO(Xx-_82qn*D^w& z9tS)~l;lv2Xi$J57rr4ev~H;P#9vsi+0?lsn+#t#WRs@+-*`2hXe3<4@WPbC+&2Y8 zI1W!jyPcox?qV2{t^iSw=dU3A34aD0iMmG6a@LLnLz^v8J({KyaorHg%u{sek1?=d z5U@?q(NJjAM5m`%FyB4;%9X^M;%XUeCgN@&J~j;sAfg@a8CP&l!7q&?-rTGq;By~( zU2UGWrr7|N7U3*mN#5)i-g$f>hh4clg4n>7LoVNq+=smNNNr2nbIGlk*MCyj*B|ze z&ffA9XA~+PkRh{v0%>VNHtx|JW--Fa=X4g5k+mLH6nG7YBGwP^f>4oTD0wn9Xddh6 zlMEa8Z!%B|;X`lx*xcC-rzH@~9xeCusG*bnpXmuW$E){#9WEf9-jXOY8lQ)A`E}2_ zxh#6POs-JsOKcS_<=O5orhhuRy#~V!m9)>Uss&YSlpF>x!%Nq*u|Bqdkh~{O$LYm9 z3xe?RMpK_&4K}L}9rna~K?Ywf(hd!f<2f;(@KX>oeaY2pTUTyI4v%O0z-dq&cehZV z1)1e)G6O@2J}Aw!hgW!@^ZpBog~XC zx_RQrNPRp$0$nAgM_|4dF&l2gg>WX0ApD1;%jZ!{K&~p2rJv3D*^uYLbu5|x5j~>c z(dh*k0*mZXPZEB=TqKwP#|d~t#%*QuxewJVODQSOoIWBheH6wU@n)u$*PzIzkRqT@n^KzrGGQCxTn`HR zr)lShe*nAe!C?5de+p~D2{=T*$mWYH3G#b9BjYcn@w&`CmN@mX8#%p?wB`g%fL81D zTxbvEDZ86{QXNNGo=n^3Sd53Yxm9S-KyP{?QAFYap8Mo0kbgiNK}W4fMF#Odl0^=X zFP01T4=>yye}=&^^ny?NT~^?R;YY3HpTtsrNPkE4_c04%joIN&#>b3a82dw>2$gxJ zktv}*cY}mn9M?>$bJt@I=j^xMGw{M`v%V}(9^zxaAh9t@E?8Oo^u4S&M5^hTF|c5u zPIerkT#K&Sntw(u8o&ZJ(bqFgha?u4_hc|ygO??YL-GE+bRvVQtCr2c z1nWHO9^zlO-w(r;?Fnt*`>yPURZDKeA8dqP&u-*O=tJoFKPy_+SbyT9mvCR~>-ZV_R0IHVx&#S! zzSQ9%kwr8uhz=|MCl71tz+G5@ETHW?vXH$<=JM7FYnimr?BiC!Y&8S&ivL&u*zq9) z4yIr^?IJGOX_7>NKb+TIE7(-9)4+G?G{bANr*XgcE9m(VYi_Jf>wKR=1%l#L;_?lT z2`~q-V1K|#jdwnZhwswF#o|>lBRj}x`u&I(ACu?}x6JZzjYx3ix?zP-3{>)T-iH}D zT_mM(eev@HHc%$$xH3k@S7f^FRG?aQBl>3DM*G5vx120l0sByicreR=rpiOOjcZ># z4%w+%W_v(1u_}-#?T(-@#e(DX?Lkt4g(%5v{(q>^iw`L>;_zy@IDo63a2=3Vs9G4J za#9``XrQobTy*I5ZJ;^%?B>ff@hV$<8NhF|DaJ-l#_hqAwBG>sP7v3Fq(Yw=CfMb+ zpevTvej`Y?6avAiKo>)EOviCbkcQmgIS0@>AHF&}Jve@M)I3zt&ekwb`zNPoZ`Xlj zn}0$Jkgo=(>)_zx7UTm`+ac9k_OMQi6VsOF# zf}H>bGk1@gjR*&7C(1{or94nixTRx`U=Eis$T1qqt5hWKFZQcRrtR!*c*!B^5d&0wWANpklP<*llS^me{=;bT zJYb!k`{D;xPL!aG>-f>q4L^1EUY}RkjFXvWu=TWEN38*dY;IZu(lClX{`DB0X zZs%nf4I*ri{P|6L&{Ck)+8VkI4JuZ!@nN)IEB~)Se7uha5k-wNm^c{C()q$ux_^Ot zHI4{RY_XfGD-xTd3-5-+C)A(WB>+P|gfrp`%yAT8Ev7hK*8w!##S7^qUcBHLV7n#_ zso67@^WOTGLin_;Hmmsw6f<1CsA6k%&g@aQzE$7$6div^R=u?ytnXP*#)z`HJdb3| zkk5y(^f;J0e>rcBaa9_sY?s8k+JAGs=S^3=t#vnk!q$g+Luzvi1~x!4b}cg-7Ge*& zO6b_oQy}cAk#Yu46!Gondo}@4X_9>b{#Q++%`C_!hTnvJAnzVLYHkaACJB5JZx7bI z1|9SfUWM*OCRbn6g9Y*{t!@hJc6Y?6;dju&iGIBfhT^VUX-C>U*+uhnaDTNOVFb3E z4_H|ygYDp^3DJ5|NHewpofY=UzK~;1FBe;L4Al7?90Oo1$CymRFj}Au!(cJXFq-)p z7zUtx35HRyjSLgrk7J;PmK+m$fgpv>dsJ|sNOn+Gmv9zXd1>445+7`kaxFs?6<4mbE(K*Q+nfsiFLZ(%B zn#}0L@mr`76>~|H&+n~dByOG&`ZBvjw}4K539X|tAt|k$iqURc6Fm}!+ zhY>3lP#tdfSS)SdrSSdwzSS~Y+jk2{Q`+=h=Rt7jHeAl(-X6vE!hiQ>B{VK9@ZcNU z>GAjQ6+{a@es}(^e|mT#iNTMP`5+ug|STyBWaM?5UBoChuy#(pt&_skQ}aB zOys{lEGbp0%a^Hd7Jm_`739^nYATs^(VU}Oz0wW}8RFm&5lwu}XQc%D{Gfl@M{g_) zF~mOaykOYQadi8Wba<0|nspQt+pRyOqi5kNPw#7Ev`jsab{#PFcA9}cC5?siD>?CZ z(x8HhzpF30sww*S^=Lf}(XxU7Ku*Dcf&Am8b}LY9=Pe*EV}DGnu84J%kT<<0=6$`8 zdT*1zt@E$g-QZxM@q+zwzE4DTuVMH=_8C6~mHSs;hp)-kQr3~yON&`vYF&fTUN-Az zLD&m3dT4NZm7?3SH+Y;-KW?>bDG&@tt)j=aC5F>t`U+Sx-kc#*SbA;?{2F{)rSmP@ zG`={7#V*oO0)IA8_;-pA%_fsHy29p|0mjL7f^k`BO$eI}osHIQUv@Ue)B1ef$Y&TF z=2Nn&L;rr*+h9=oQ927_t-`r@Cv&uFW()E|p%574h&;{VH?95Q(vG?i88Mqyhz1!7 zN$3-8CZ*(bcQ)0fcX$8*y$h6F6y2IK@prI8UteOiv46zhcZ^uDc>G#@qok~?rok>s z3N@B;(LbO3ayR<5*|gnpBJt@O9k{_^AYH|nt*-NVy%hiav!*s=nsj{QHdRVnVg@n& z>{3N#T6^?uUU6!sP{oN1cd0~Yy8OZcmbUW&gUIAEI5N{F^A2VWy{ z^dNOY0e?NR8N!dCfgT?fJH+9%bX)heX4J#oj9~3+&pRg6la1>`w|@BQev-|2j}HDA z?~eQnHT2h$9WaZLdianE+;WLt<$XG8RLrOp(7d#{gE zQ1cFAOwR>if60)-kf_Q}J2V_{NO*mNwL3qJ@`;Y1b1`Pr`@o3wBGCw?7DEbahmqmt zz_ep|)&zgJgJR$z?F@XN{7T}kL%xZQLHITkN4Q$rz$6YPV|(-;{KHnl`5jhE?L2C0RJiC)Vy+_ zT!QDWKo^Ag6qAv1Lb6JI_=OM(;o&DTTKpnxG9Oo%flv^F$)ru9bK=6cz@6E5=Oyrj zUY$%eHj;Kg5RW4{?O)|f7%zUTK^~Sc%ne8|Z}T}nzg`x$PKA1yPkH4CV8Ae+Ke?x` z@=t$wovcSw#8g0rg*byr5!6Js0{9XIkqS_&+;Ns#4Ty28Y!2e$lN?1O73WW&I2MI} zG-f5ECv;CJV&Y@e2ljNlB78q(C_|$yC^Z3U1*eCXmzO+KfJMthQ1q}Gr zuYMJ~Hl9iw>|fQciO0*Ow6a__Hxlwm;Wd9lGjDdOmwCB^9=8tj>l7{08OOiD36&Nk zJxC-n*Wfyy;&sJz91!lOC5!QTkpR(gX%aHZLe#uC=n{YuAMA_(%YWUJmw-NqqvhzT z=k6ft3dP}rnW=3f~ zVes0vU6Vo)(Jeqc=X1qZbR&8I8Jy~7kJz!~YNE+NLvvPYT^SvG{QS6+WlwvFQT+Qv1VriiX{B2tB(aT#*SG8G3EL2ejF z6kj3KI*H8s0^)Q3C*QdX~Q*+GI;Jz0p@rW=zP?0 z$kf_p2FI!-t5ji|@|=J?1wg5&I25Wi!a)MS=LixU%~J3{MHVdkqJ+r;&9Q$5We$zDs+05xv>YWKs|<9KkOC3u4J^!>WS7f%;zoF~FjJiL z1jbMmBNc7@r2|3^>770% z!U-%EB@s6RfU_p$VB~10LIzT;Pkc$C_8@!)Pl@rRQ=EJK(KP1 z|IlCviD+PlFd_pOgZk#=`0VXN`kRy=u_F*TwSpy8Ye`y04{$YD^7x~JrKAOcOZsyT zvv5xP`-JDBsB#LFJ12AM=R2XQBLQJHOsR4+LsLdg4de$8=IVK%IhXrD?mJPO1Xo0i zkg-(D<_-y3*5!W`Mc->cg9?d7fQ`A3S@KpkmoP0EqQfOM;upUq>caEU=0+p^hq@lO z^jGxE2fkvH4`ZMYoKYWCzf%8w-T__b#X?pQK5$vEM$e%}5gH`XI|NKF-u~svj4VO( zxe-<%*>QoV{Lm0{T83gG?FXo)%<1g3xAj^D8VaG2bS8fbou|DP*_5>uc`7%I#fJ#! zqOQz!47}{yA@K}K4~%wcNVVDUuu70n4;3XhBc+jnBDo$V>$mWkn=$&%EKqU*xL&ax zCE9zuL(g0YlPRih0@GF;&_u388SHQFMtL$Nkz-LK%Y5)GH$d#*BO@IQ+#N7rLM*5z zo$|dERbYQyH?2)g77EA=pNOV5)ZCs`vo`v2dY~Um7rsQyasD=@aW^s4y>4Vs(Eo=|odzJ62;c+M`PuYF)g|f@oxv zL%w8n(D|rHa}}s&k=xmZU}Sp0l0>wId9z;DDhL@GdYlnz#w~LVE$YH&(^$J!paq^8 z+<3*J5JiWfDcD*NHHaumhdLB0LBDv^ZSd`*{^>FJKTNYxenb1=bat7b8BqiHFBULY zXk32@CO3Be;_&?UeF(|*oES=ibH6x@e&2um_3m#^`fuJo{)QLZ15h$%MT&7q6#?gJ z_ZD|7A&?HGb@*;>Xtd!vACq~8mtb|j=q@mlF3g)C);^S84D{i6JnrZjhHl5C&BT~8 zd9-}rcSW_1?%2tD#15;2C?OpLu4IcFIsJdDUVqJKWs|UO7zC_-*43njH3qmXz_m3@ zE}bVIgnxK#)YBF*bLW%Lbf7yeNX8We{=2zJab#flMoxOurXVg`rYDccBc;COeee8N zS|-cfH5fZV#S;AnR3o;Lu=-Z%aN&fl`n6Y@IY}o|&)r9B% z@|Bopz^P&-X=t9z@?@-aa?!6tx=w!&t%@voh=Jq;sJ5_LS9Fl)EYOR}AiqhzBW{-G z?sn}=0@nQwLhoF+F}gus4NDkXoJE4Tz|E<)^} z+ahN`m4^O6rmeKfAAETCg6tlcy}m6DFq6YW7-~%0p`X{+^dH)E^z_`D8HS3XuXoxPVBVD zo99KAR;$%&wOXxq4JpYYC#Q3fd~m`WPBXeV(t{5{;cm4j4GEb}r}-3>LfNVI^gJ@j zd2(F#4(3sNU)QKt-~&H&5vqUthQ*ukwS3Ck5F2sZZ0zC98HHe{@7}>Qux{yr(IG$! zo;P-en9!xOy;uKBH9Nl(t0UVU!rL4+!_9K-)LnGrqWuf>z48KXmEspejP%=o z_*44xFeQ?sr9Jd9x=6;TGh>f|hfIFyQ*i*wn9JQPD)co>9B3?2(Z14)9>myx-y8|uXS;Ia>Pia_c1;JWxD6jK_cCzmRI%q89*KY4#!|L!Al> z-;l+wimK09dOZoPOzIztZ)~logS*{nLS_$fQ4gPhDXlv1E_lY}NC;x9g7ec2{^lnP zRy&4nL0}YvienR1RA{KqN9hkB@nuC;fExeGK_iYwlTkMe@gkg0;Ltgp)P72)qoT#$ zlKhxwqY!@@7N_j7m}u8&G970rIo+s>o_@|J>a*HBu+wCe%?laU)cu-7gc$ybHyATQ z;Q-QCq|d^8mXS|0n4@IuA#@phkTW@(=w`m6J{pbjjp$RcK}McLXEBS$7aamKkYklz zw7&xggJ6yNm}vuL?kjQhY8(MWNS*!YHLUag=Y4+#{$&a70V#y9(AL3<@P$$mSdQ?> zaW7_##QA!;>C2`{FYym#8i&tzgt$ruf9J9@C&LZUqqJb06->1fW(jQbU}tB?@x`5Q z?)O4ZYu?Oa>cZ}5rgBAW#Nir^J=(WxI5D?d6QvYF7Vq%<3{em*dcmtFDIXWACL&zs_G9Rh zOom$FhS<-0s(3tMX@K^)Q4#wmcNH7xZ#aMZDW#LBAX}uWumncW-~}hnx)mMCy9~iHOOADDfJ0$ zL4@J+xl|Zibo1Q@(Id5?xD#9|CpZK{xgA-6F>P0#&iwuC(b;1m8dxzcC3ov+|Ddk$ zmAb-L>k40kLPDYLFI)ZfIv8)%6~2F2SNK+4;qFd19CqvI0FzT&`U<4%tR?YdWadD1 zsONV*_CgmfdFP&7Q}vMFFk0=aP-q@r^-QN${XnJe6;VIx5#`mj0#&Z`*CR`-eFd&q z=TD}qQR@uIrd_3*8dn3r=xp`1_8S2NO{DdE|#hIQ#T_#hoWwO>Y!MlMmn$5^iJ_7+Q?j$z}UnUkelxqkc z!EKN7p9E}5PvZ)GjRGXY*9>gf_MKn~_bNgj;fpO9K>V0Z^U1Y5dNt}LsXOfd&kqd3 z=LJ!(!01TMu7O3+hP1_WBu{_U`>Li9rQ{_qy+9yJk(wdB^M095h>?=;HHm~n(8mq} zi{KPu(`W0oTIvUSk+Y{}?k7qd2TtEDNf)F)1qW`KNVZvE16Z^e-{n$ll4xZp=2Nz& z=zdS?i*E^&eq*`omS9PFZHIBh?6?5_qsKzv_CX2~P0?V`q;_^NDxZHoiq7WSue=&< z<13LfFs?hlpt3@`T~WIrasf{QD`sQwVx6CEMrX*j@8?z4@h!Ngj~<^rf^I`md;Y<$ zV)V&$ab0}>E}*sTa3cJQtx(dEpxk{^1unt&pXK(fc-@62(2&IIUj4(>BY}|kKw5cU-4Gd$cr{5{_p1&kz^13rp6J->omLv)&5>WVl2+|<+ zLz;xtU`Y>}vdCLHdXg}XP#E7UwZc(7eWEF=S(-6PR}xL)6q?uJ$u#BEqI|^Q+cJ66 zrnkV-Fs!bJd}os=TT1LhdZ|a%sOcOx4EjJzJ%i5hH+jrWiAjw;6v7MTwPFd>OAtbW=Smjg8uAYwXuHG)*`xB^nN|oqvtVgD=TM+N8lJ zxSez1H_~T~l=y#57(m|*J>kyCQK#*q)@6+WC{RslibBD!L3`D}5`7I^!`3!6iC16e zD{zV4LwSj{3R|=|NJXm!=-prB9}5TA)X#;y`LN=`eI%ulT97 zQ0$l8aebMMW>*^<+-=~q@}a7J2BP}Ve-*(2plF8wehPm#?O*A@Xgv?rqNbi-CB*F( z5Wn8oXbtdd1lUS6iQf1=$<{LDh*G0+1;RHR_7a54?XCTu^VjP|Z|z`s+zhBa8M!Qx zyQl@eR(E737rLIuD6uzpu}|mNCs8*U)&;PYZ#*zL5gRvCT`p8x{HBVy;*02e9$qJ- z)GTB1j23?vbB6a7-ui|`U)!RuSc|n)%kn#1?o$+G?k09%W4~J|3^Zx$L-~#0@ppre ztSuVQFF#ifhX@YG@BKmv@3JfC%%g1afBp`n@$;1g0N&a6t7?2`Lvkrpdh0L3!z3Sp zKlt->n&&f|={6(~79adv1LW(jKo$r@tv2Ui#4dmE!)ZPO^@_8yHTIxVtgW_I>n*DZn32 z5!&iLvF_9Ak~@VJ=N)-yjp2s|eDG}mJPo)9lpG{Mr?F2ugxv=X5KPz`$^lCQdp1;> zw99{_e^*RHfClH5t4Q8OY4RER-VG`2R%Lueyuavg;#5mENB)DY^>rJQ^EPhms1r7X z`?9f+eUs*+BE=BsGH3~{>POKydHC?`sFkgPh{9p2qH{mqW*C?{3_qnOYuN0oF{kWN z5vbGJywPAb3yH}P@eLnU@h8084zU%JT*-eu?Gj+^K8bB@28<|@ocq)xh`HS!{OJ?s z-bD30OuK2rI&-uRvP*hxpr1-bM~hHRl(jwABK z)^F+Zb8suB0SUsDj31&7Etqw8v!x?pPTOKuqoCeFMQz)w(Na}U?Wn2VSyyd~ zatLz?^78*XtiCRbzm@L0x=TrfeeuS+3;qkk`^;GB5*noO^Vrf0Ng0bBT*a95F1u#kg)1dTe^cq z*Wbex7~Q8E4d^^6zK1WeA$cFUl>SSf}UKzU9%qH_}ChzO8%2Zr0$uoGE zPAQmv@8G!49cxOZv`7J1kM36cbr9O!ar*ZLl;7>#yfSw3KyOdg&Dy$5D~Se6`}sl~ zUa3QMf92sN@Z>WyVTeM!8jzrFL!d0_90t;Ahh1VZr!2M{VUK4(dlw~ z((P%Ev@$cp;q8f|s5>Hpf~`!`>*{Lc*rlxAM5m;8TLh?_KekI)zAzu8YYzalO)t$^P7$#{(4J)B`yzCF5!_d)6z z1p|v|MD{i;3>DwgMHknszwq?5qV8>(<6gf?f_0p6+eE&qQl~<=?TvW#7QDrP8XkyR zTam;-Rws%=y7O#A#*LDntWDt=Wj2-jIAm#{x2h5Xi4VcE9G-vFkLU%@JFq4m z)R~iIt5emSR3xL=&m@&+1sf0bajNtp*S7j4cwPK~vW$fES3T>tVj^i7f#qz)HZxeKgq}$<0;!*L4tfYPU(lY5_7mJI)xrVrP=aESl5~PqKHwl0;&1NK!aT+!0-hsDCEmBu;S=CFDPu;2<|G` zZ%*H~g~}(t3`%Ay@mv?#RD!;s4^ZeFuZgEeQxIdUsa$^o!07`106_K8lXx3qZ1qaG z9o``Mfo-PGuq8pGu#jRFcyy;T`5e5P7NyVT&tO^yzUE?OWMmZsCYRGf+ATwTZ1o)G zB8ff%+T$Y65|93swB&i!sDDC(dojd)sr6rQd54FN?>#RZQh~lGyCQTf3@I` zClen$K%9Sc0{_{=bLe7qd;qqU_8z*RN`1Wy@sp?OLsWhD=;ZA$$VE-IW-C5J;evX{ zXPoJ|Qp?I4%}3KKCp7k_A@+$DuVa4h2)5kZv&*t6DOvJk@0j9+NYZgsW#zNvYNzq+ z_V=>MK{kbY`_Aiy8tCP@->r%^K7+GP?O)>5UB!P@?xOj>9n9!zThnWpfQYS(89@uh zL8HVFuqIJjQC6s0dT^ zE0$1_*HJ3~bI=&Y2k*I%B($LmA1I!|*wl3`^8TuU^9^@o=A(VXC48mACR~t**>pHg zKhF!_dmAJhKKbEQG2tpbh1@J)qkem2VU&N`d)HBFLm8!=W)&M-b>OxJ1BN&lY%w-l zp!P0D87sg`?djt~&9tw+Gmt(Hi0~Zc(9=v{HfU5B!-BLpeTwM}-=Ng;Gc2Y=c%0TqJiX?) zRDC`fkb!{vD|>@Za!eWzlx}4QFNZ~cip~X0P3NEc^ILJu z^de50O+TF+wz)zj;5(&HOfx9t5a|_9 z%OS_Klso2}D}nUD7t8#ujTTa~pC9wR0e=Wn;c(dcVwoqgxFd%HF*6)~zN2p?&wc2g zD>3970f^J3%|xP(#0HYB>)n6+*{!_dBjYk+GKB`0B&k7Uy-+;&!pw8by z6ciUT-L+I*S+s?MwQa&-Yy|502cXR9J3)R`-yuMq&s$)mDu783gs&jz7aOHTWu!X+ z)_%!u9(Jua6OH;}EFF3d!Ix+gkHwzM9T^Q9^hT~|70j5`%r9BZRE>X};qu2!6Z{&r z6L-rGZ~$aB6)!ENM{8!U<-OPkrPf=KZt4Or?KNGFZ1-zBw2Nw|EzuIJKP#qURb>_7 zeGjC3ceGbH!5CNXb+NbM87`irKR-Pt#+bj%7w9U5p_mKiw|^YNewP0Hr}C@e3HgO* z8_UpPo&PFp2aG*VLg{}j;T1K7oSo%Q6JIK|)UxcfTBi_mTHSl>x?^hh>!!5Yl$>t1 zcmJ}iXiK+dIS((jck~?{lIo}dB zkTEJ|zh%`Op{%P+Ha|t{&gDO9_LG8$tl>}FZbSH%*16^94d`gklwnoNgRE_vH?+t(0hkTN70h9Z!d zpFpG)R~Ci{IyrXys2G!nZ!Xc9W#?< za4Ag?vZ_O(C)j`7l~VQ{J+@H(Sm>PZBSA;YVlZ3}Mh&kbJO z-UKhuVtzppQ??%jhminYU*D$r<$^(g0v?ld78e$XAHHLgK7w1lUkiWeS{3%^LVeo6 z|7~`$KUE%e?3G{M8`sZJ*VO!buI|5w%ZVTVjvVeCYFmGC_~6CofWet<{l?0+0YtwF zuZmq+6~uSzpSxSI=@ajU%Kz&~(#RKGQ0pJk;`vP_)cuRZrCfuH`4$^$|>&3;)Wax+;~X;4WkyRyD}vDtsRzFuNTQBXukT%S)E;mxHF6LTIJA2qhXDJl z=^=l3tVIy858e}ZFsP6i_ak(J``xEQ+yJDc^|!R94?Rzl_nVNv2G$}{ti_;=l)&_| z;2-%}7WgR%&AI4enwSdrb8HjD+u=Yv@}_1e>G%&m{WKy#2|cCMcccJ=Qm%hqr|`dVF&L#OEP|UwPlIO+q;@e7p>2Er zuB@e8TE#)%vwAt#w?502Rfx2bv�OE-&_zY;$&yOg>N0ne&Yif(CX2Oxa5;Ncq$i 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 S01W^Q0FMIz05JCf0002%T+t)| delta 835 zcmccmm3`R~#toTb)46{!3T$8YkTFAOyV?WB0>IiM(BR^>pOruNTkw8{s>xTT>_Oa{K$u zmTSx>=SvrSlvXIHJ<9Ltt!dg`t+yjdZ90=#<;ksyPwS&u79adjR$%?(la*B6zo_)M zcu}J?)|{DVr4GNYb!d}Q@h+NZswNQds_;sLm#cA}TJ+l&hK!F^h$-oY*JQt|gQ$5*Db zw2HR^WT=;mt8j{ zq~T&nnCqkbD<@5y-&|R+wXbd0y1f_nDDK|E?boa>Zo2p~PjQ#DsrmB87spM{AA9Dq zDeTLB^?sEzGPlDeR{uHsV&8qO+L8mUp}mSVFK(=F`Yh$Q^8QEfsN(*o_g?E;*1r3d zBYO8|rt>~Img8Z6_dWjYc~gJ$PSF!Z2L&JIc31A7@O*XThQ9wy0p83k)BpZpl-ka8 zgt3WnbEeo{rtJ+!8J9_IpYesUh8dK!q?n_{7^Z9dV$_~~>?e?SS%YEvGAB@g2rwkYvatsaf^j%!t97BCV^m7vnf>Mj~ON)|ILHe|qV+|RmSN>!)VqWCR wFn!%mMv3V_2Mg#SjQa1*z)+r8l$w!WTAW%O;LXYglH&!!Y-R?ArG6kD09*fFvH$=8 diff --git a/Moose Test Missions/Moose_Test_ZONE_UNIT/Moose_Test_ZONE_UNIT.miz b/Moose Test Missions/Moose_Test_ZONE_UNIT/Moose_Test_ZONE_UNIT.miz index 0507589f14bec87838f821d385331c3f4466cb83..3f9ca02e128d0a2e01a7239dc9281ae49559d11b 100644 GIT binary patch delta 110409 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

                  B)Tse2a`fBIgK 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 B#O?q9 delta 797 zcmccfg?;T}#toTb+vOiJRtRlhf1j~{ar&*Fi~`e_e`c)WU3Or4A14z7!x2^n2C?Y^ zM;Jxx^>RuRmxlOeOB)KjHxaBi*E@a6clu59lHZC20Q z-Y@IdFNwXrY45_en4YblpY1hYe6iqT_cNub5_!As>gmYKUoW2VH^O&Xx28_m<@WcR zE!UV&&X+FuD6LRXdz9bPThp|?T5m^^+H@wf%9C3YpVmjSEI#<5tibxmCo8GCe^Kdi z@uEg)tT{8!N*#V(>(C~r;$1Y+R81h@RpFHgFIVF{wdl7m3>hD-5L41yb>!opf5LNK z3L9JhHeBoSMkkS*tsyExI@Ou;e%Q?9FNYS(EihFIIqh}yPP3@_R3Sdusb`K@_ZYnW z#;G)M-L{GwzfF|t1E2j{^gR8FbFE8^qUVc8dioVFm}WKn&wDu6hEyZ@0a}m!&lEed>vvevTkjZw}`#o+o`aUNXNB`R0nR_gaq2v$UIE zOKZOIT{?|@d)l^)i;I#tJbbgbxA!CqRDN84pnpf)v#8sA@-gvw*7ZJr=f5qxFS~9^ zNW;aDFxN-isHbWNwE`tp0QM#lHJmwIv5yLwgl#UffvU^jXSp<^7M|QN{gF@4eQytbO+@ zNA&K`Oy_-aEXTwC?tA>(^QQjhoq{Kd4hlZZ?XKKE;rZ&w4SoNawtqd$xP)3{K8nnJbltnMk(fKF^1{ue==%M_XYBpE^AERd!JEq`l+9cTFlN`4AZ~= zWK@?yNn{KVzzC+!YE2hB!YIN5N^{d2elTh=ap{6Y)Tj4;2XYqZP2c&Q(V6L?!SsLM z8RdZKbb3F~0lXl+5Ce(~8K(VYG~(8FWnjoJD9OyvE1u5xi&0CZ!<&JjJh3P>Bfqpb WwK%|=l?|kc7YH+%85s2ZKs*46D^@=M

                  B)Tse2a`fBIgK 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 Sl?`MGFA%0MGcfS`fp`EE0#sN4 diff --git a/Moose Test Missions/Moose_Test_ZONE_POLYGON/Moose_Test_ZONE_POLYGON.miz b/Moose Test Missions/Moose_Test_ZONE_POLYGON/Moose_Test_ZONE_POLYGON.miz index c73dd794fe56fa6511695eaa0e1dfa50ee0df3de..28288b52ab384ae2f914b105da074a1fe40143ca 100644 GIT binary patch delta 110424 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�`~Xox8zdX9MGxT#~f?jN^*{Wco~8DCV@0dOX|f%9+1>@tCWr5Ob3;YMneQxQA++1IksJ~g_#?eqi%3-oP0B|Zk>(oR3eXT8K-?f5)0+k(tBr3FqrqYYHYE!!u_GjySCnD6Uu@ zosByV#7@P5!KSneYD5M&s~ao=IAA#KnwyzO^#1?^{4msfT;FS(HufFlU`FBS1#?!# za%hU?K9y=J-ujzZd8r^BX)@b+wl8a=04|>`B!x{%5qlsk6O_@NfpuyYvL7$L+S;3 zbSkE-&npp1&gk@?4N1K&bq&D8f5bqz>OZ~s5mhO3Go7wfdnbnV0Pq;{8bOBJ-)?(X zC3Rz34Wp<2$`^NVU!G!({{VKwf-}J%pYyH>Bhiey5$Y19--s@yJQ(e5ZT++JyMBx- zGgYC_>g>oQ0AvxL!!+W?^*o1J;lnRnk;isB&p0Cn?5H!ltJrcKP* z?KX|bLBQnICPdRQF0{CH2^QkvaG>#y^)}SI*%kE&VP=T2^4=mgmF@>>tCHCrq%O*C zrvuJz{)7JjuU3rZBen4Uf1)KnWsv;X$o8g*k<)F*1E+7q)gV$TN(+4{vL2(J1qYMQ zALCM5fCOacw>;1%riWYLj|b{LKGk9H?udn@lz{Kq7a$fV@#3O&IT5uA4y(}pWAGP% zG~b7MTzUqIfM5eOnajx787KTJ!>?bRpF>WHryC=;#?iE%r-S%be+ibA$yQG@?)IkG zoNQZD{5`4MnJW_~Tz{Ul#7!alO^=fG z3w)2>9hu2u25Y4wf0j)1o5DrnzXDM`{eshfD`PHzCIq9M+^Qal`PApS0 z+yDxdyeH9&JPEIKgg;YdX(fwB>L6UjoF-!+27eW_J8p2gnU1y{7RjE)vjum z$#Akrav#-Ol(?YgU-q?Q9^nZ9?Mm0b1A{8C7F;tm^>A3Hqi8_pA zb3q8jx(k9_e|D<9gwA^Q(Ix)?bR7OP+bJW=b$twproD`kr)%vVsm?`8jmD7`#j{=8 zwZaY%ZX>=8M4gQw&OXjTrRp&1v2gJ^oR4PBVNyKDbtzc=0@JRBqiq%HAN8oMoOR7| zNm%tcu9Gy`1`b9l8Xq;r2=@+se;N`YvBg2me$_#8e}t>B;2%z&)E1diW3U_^PkIE{ z)toWTIO=L_RAe;Go}DPMcOf$u=z0#7MskpbU~(wsBbbZM3_^~zNmyLOLAtl|s#+`ChkN%0s7{tgI5A^^vxv9#s=B!Du7I$nd#Dt8m&iRh~V=; zq^uy1eyvIosGbXZq7adY*rGZ!=8FxDoC7bJyOq zLq$tnUQZ6(L#Tn4fwyhvkUEY%X+1@4Zh2>kz9U`yLe}rDuTh~}X^e2jbHrc5z#m)_ ze^JR}(4!>GU`XRVg;I&V#bLWEj`Ye-@swN19##1n$A)wBEms~nta+8 zSPBQt+!0cpz*5KtSCP*h#W7rHxB!d~#(||^S$X5HN=<4Bk_k5)uNkD!?mRJC0`?Pm zABXj+WY}`JQb(;Mfetcb<{fIwkp0Tze`))|fi-bra=mA0gE{Ct_ zKmxx_qoz90OVEg&!vyrrI}|%OUQYw3Ok^G$siXDFEbC7{Sw?nEf+AFdulZIP{=PKy1DN>p~UDlo7!D-jozDhU#<2 zBBtXE9yW{&^*+?o5hHcvaw&krf5^bcwJVGd90AT~wa9F6P7k5YHJ~&KtN3K%lXo7% zF&z`8d(%X=FlF-RuN>79^d}i3k9v}l6mSM9l08mN8mSJ%hvfuy{{ZV#6~HJ#mg(A= z35$g-w0+*x103LSuyy{F3t`Kg;C@u%jO6ZEXv&Uy(BcW$u0dAYp4Ao;e_}{jkVkq+ zSke-(gf;@Gt1ZZIjFlvgv?NbBiyu!=DRPG~8%9SYaZ)(4F4=E!R9j+zJ9HG7u6RMf z!NxQCR_7}h0H_1ffvrfu#&>!X{HdBULIL5uMIuRZN8RXZ0jm#xkRR57BIrY71Gjpl z#=~emI-Uut8UvC+#}$~Rf4H)7&*UnQhASL=pL7~5C7_}50DoE<8+RBR*N9FiN~GyvsX;ZNP_KN=Y^0ygkQe}BoL6rF|w2j1ry zrX0XnWBm7|E9fgI#tGvb&`A*(Bxk6g8Xkv@hpvB}3~?IW4s+I;6JtgR`RM@cj#)<_ z@tOcmK@2(y0ix6(vD==w0MeOIKUMrTR?|hWfiMDD+mHN)E12V`z2lVE^#w#@k;kd4 zOG0mBE~+W4Y9yTDL0`2)Q$u(R3_f z&I#+D^@QqN?u9!ZyPf6L4k}{N>(MXWehrTR+xvJ zBqew8UP@S^yyYILVZ0ssX`-`F#NAdP1p?CE%HjXF-gJ$jZ)?$E5qa;rYn+Xbu@dAg*1t7 zuHm)=5E2=<=ogdEzZj)X9L(C*K7=WZB7N2A^z^Ruth6wch0f+9(wkr@8+!Jq5CBea z-iN2sf0!aR>OQ#507x#573EP!i=bBppr2z$c z)3^aloDPTlilJOnfO1FHr6IA4^KsPkR5D@n4@Sjg8;wKq;fFma0$rmey63G@)J+j* zIX&@7fj3T+hBd%!4@^}>0|gx9(s~NSxf^nwe<=)Jd!Mhp1NLGMl=IesT-4C*zS(&a zu*hCp@HM;<%ZZmNJzz<av4L^(k{IW=PL(z`zjGpHbljn`I|?ik(HJ)_vjSJ;Zu#~!TEdID#OpRcX@#wq z5lG|`-niss`cf*^IlI*mffyu!2kG9Ysb>qV%bmqJ$j{+cj&r|TsK60z5OtUj(2N*Ri1?*W=ByP{G9HDXPk$^Lf z^m31wyKIc#dxB|ljcQ#WsSLxme`#24ke{E9Pc&F=eG72g?>mp{LWr+o;DrbxMckxd zk5N|%auE?W;O2(GZ1`vRl!1~n^T(>e7K4HS1hti?2F2MY8$j?9he`;-#%XrAz zKA5JEY*~bbAxAqx5_1I9j3PkeD&#LjQAURU3SL7!^Y zF37^yFt4vgg6=%9$x&SLmCamqI7y~y+s%-ipISvBE-j+Dh3zhsJW{DvQ^+8KIs7VQ zX%}Pi_v07CrucKLn_Fc+*|!Cr2F`FvIb8iel|iR9&lb20jIyEHf545T9zm-^vCzlk zD~Tf(nvvasfhIZpYp#_`7|s{e#J!m$!vZ_Kn5U_^%W8XTD7(Fj?RSlteYy=66OOLFH0EA>7ZAcYJ}Eu5*(~6*pyJJhBGD zbDAzsLJ1`20P)_fjw4qrW**{pO=B@Nes7XX>q7bf0lMJG_%NXsH2lpDvB#m zKCt+I@E$!m6JPPj-!6B>Y^*Rljo+ntIE;TbkptOpU13im5UCQ6l}7+$psrOW%-)Ba zc$dVs+EiwHh8X98*1ZfhE@L?>pFHco5H2s>zR84M*dM8{Vw&VZ?5=Q<$t~0Q_YLMq zc_j4Wn>9&9f7$y5=6`k0q zEe@)}%6C86jVlF{o#XghcTw%qxN0N5nT=(eo7?-ja?SR}Qcq9a#*4?|4QBL3Cud?E zWiSITJ3;5z(F0j%c;>H$ZL7c?>tyUiozcsf%N_l*P3lZpQdsh&FSR2?dDgK3ww-2C zlyiewfAbn#u!ye^P!8oBnh0v;h-C$GqbJg-3FvIZRsLRZ*(RGDRm7SvvW^DmTx01? zAxOiynNtwLcRS~3^zE9`#%Y0QENcAg8&D?7`oFC~?V3TEwTPutCqp+}y&2uxX zamIrsnDKxrWb8P>&qRKtd=&UkZ}7WG#NRfza;n!-5Hbk<07iOb_pc)pU!B2;Sf}pKMZqEaXX@e$CgcFQ@xvIEW zf3*~U-tAO~W|qG#kUZ?s{Qz9&T^}wjOBtr7;>))*dxG@A{)~3U;@we?m zr0;tTTeHT|Gh_RQKgiZG+}3N|J{8tr$SZ<3e52F+it1V%cDp?1ScPLgT5tt4Owqw= zFoz@)#a`fyX`B33v-Q0natfI{g)oV-1u}X---%%<|ifQ^y`OgZoKce>^v( zI^|+j-*Ce`9(frRld9S1`xsJoR!0ZonS2M~S?#TSRjo~bdcZW%8OdzpB}()Lxqh&e zwLJ)76=>;q=mX+6g8WepzlQXzMWe$Y-wg6?WAkSj_oneNW=kiko!oRf&k%em(rqp6 zHEkYmu-V);{{S}9_kYWteq8sYf9qYFeNiR5MkDDyD$%Dw;H_nKOIP{+&w1Bxplaxa zTO1WI@sqT*^<)}P#XDQO-|P<-Tegp@ZrY+>^-h1;W5sn-t<9muh{~?Hsr}#Nb~mQt zCI!)5PI(8Y?b5crj}lbeU7gGsZa0&aE6*9KO5p5_i?XsWJ#*Tf>`K(;e_mr^OAolq zw2xy^Qa43Ym6_-Igi9o>BH=kAvvIOIVJ%Oweh=#7RPg+8y8|V&d1PmhJ7&1*qtm4B zk5Xc}EJz2Z>sXp3MY(Z+dyzv{D#acCQljlf1o8HyNSp?oohD{ZYI-$N2e4Jklc_CF`Npqtprvl?)Cmu z>}Vh$bBv$xq(q&-4k%)Y8*!3P%S_OeeAqtV@kq*`)W_Yp=mzx(~fUOF`TC8R}`5Vc>=o1?&Lx^Kp+#mOGs1e~2`czMoChNcrq9 zVV^kU0N6i=H9HyBT*&&vM4nl$kiZAo%1C5m$;cyWkIs_rdD7m;sI1E}2qaZ#&jc_A zp_!U7I^ZIWpkn}Z7^WP=tZ*@bK#G#M9G<;s0}AgMZMo<5ptzik{AEdaz$AM5Ri+5! zwRBSxJ~_vw5!`I?e?3~&ZEi*4t~Y$F!_&2D)`pa&XJP;#LEpYWnc#Z%q?AlT2YU==sC>GFqyda$lT9(Q zJ-l((H117%)G?-hcfl0W*{Hk4i{jc{@j3QxGs2_U52qpppl-TBZX?Ac85_mdQ^i z1HNb&?Drkb050A!&(eSzI9y|(@9Jt$q$02kLH4TXLL|;Gz+i%Sp)){S`ug!w#y2Ii z@5U%VPrD;H!Kx7sGsx-AYFRsp*OAXXDXjyPeg-!a{{ZTyB!9=K9S1!1qhant)Z?~s z`Be(Uh`%n;(t>0^x2T|Lk1LLPQV}Xxm#acvj5{Ss-)1_63Vi=D( z81$$}If(_SKQQO64Ob|fu4uzU`DD6rK+nbMn(!yUM!;wLgGtZ<}u08}(-37FE`6v!ZC zoYc6Q^IVI`+z%M(_|u6lN6+N-2d7b5j@KFo_j-YYK-#fq1n@?4lUb5NI3WEqS^`6d z%yK#k%yJ$Rf=5nypb{ChX9qbRz33^StekE>nBuH~sq3dM4F_3OoH za>H)!qkwp%L1!HSIUVW%fOH${L9K}Jdv)fJg~onGJm(b3xP?OU+%7ONNRbBa^vXo7 zDN-@`R${RbIQfrSu?nOdASZ#&DUYZVh02rb%^^zSG2QbX{r>Xn$Zlk(_&vuQVVS>74Gz6ac`Z9Q|?cKn-QvjQUeXW1Hq2bs3~mV&E{r{OBlg z3P(Bm&;)G7I3AzMn$(6j8Tql#r6I(4AaG7_2kStYA~9A69Stch2Nz@X+eFm_`Xz+1 z@>PLF% zQL%|>urLqfRD$GXzlDz=3St@?sU12Rk)S+)d-fG+iRdbV*gk{$)UlzYZQ~r^_57)( zA%Db#ATLpht;ReO#1cO$h9QF;J9E?PO*;&0j9{MiTY!N$z@*TYgk&)p?b9_w9#aDc zzXGP>AA$Ez1P*F!3`~5$`%?kSf!CAXoxo{1}t5weFrHyORfrkK$6j|U@@O29bb21j0)rxA_=cOY>` zFcJU=W6;!y)zLJWwfp;R8q56jR%MH`+W|`0R_4R81(~^ zea&FbNzU%YOQG2QG>Li~!(Ke?B1V}-{whcj&gvH|`{Q&tP&1x~K9yu1eW=}FG=Gq= z?hmF#Tt<1mrF_VwKi&l7(z!_a%f_1C&E%W_IX>Mg(KAQLI-a5Zt*AVt<|WF5_|#Q8 zX(OZ4Z8o~T-PkIl>zrn}q;=9htnj9p_B&N_2bnGoeHOZC#>l#o=#G^>QM<2N-I)OA z>E9ItCHuMDcpjfhXhITt5IN8Ds(-l900|@xJwF)8EjlkO%eDc}wUXk&^c z&e69#^HPS{8Yv$!^r48CZbnCO+uoJNhBs5jIj3?YwH$CpJw|_8tCY1K7x;%-mdfQ9 z?v382nIjKTx6lk!gLVbv_Y~|KgJB3XC2?BY5uD%_IK~I#O`(rDIBrj^D}R6x&A=Gv zuhNjmq3n1A6zn9&5_63HREEbf&(GHs><#F4-V?Oit$Bwuiv;Z*`<(W!#I!zcc#c`@co&T=HNS$gLE}FGd6W2l zc{a_b%lp9}Byc?r2Y){GjFW-yP^TPKKY4#vJ@dgHIn(@qq%OUsk13B6TXZo$arDk{ zUG!v{J~uGJ`zf@x{{Vu`dyw3+oDWLU=MzRP+`$Ic<-1kfbJ*u@CK6|O=9HP74toCQ zeiGx2$AaayFHDFl*n*V=-P681pK(f7v{HWF4me}BX?EN2{@$MqFyce8nKMQ$J-+*N=8zT=$RRoXDh7#BHVjpWd~k;6p1mqS z(~1J59QUd$nty1Et_46?SZ(pvlVE5CzyWwP#c?sUcLUUS^%W7^Tb$pDyg6;+-7@3D z`hdh&2tuAdR~)J5(BitN)#YSYrm9BA=B~A+PvOh^jSl)hE?ajf$LZT9jDO_STIOY-qCOMu<0n46RjmQC z;;#iq2Ru~VWw_Ljo2E`pGNL()E(shd?bn(SE!YIAqY4gvy7Z*SVi#S@wRt$GW{DlA zg*4wN9YR5tRoj!_JXRBCiCF4ZY%z^~r2ha)$g7%AkjDp%0h(-AHlqSY+IlDykR_?v z*(gZEuYVY%TSr5rT?D>_9OhE!5BvbP^rnb=9cgXLj*1T%>VL_rUCh}(tmZ8C2^Rg!NiNxjB%0Pt+Q%+o^a?C zVDXMINT!M^#TbU@YffS;0J0pY-x*v5H5;2jnWin=FDG&NdyM}8g=Zj^q(KHq#v9(0 zq$s1Q(``P=hT>E6KOi4U=aacha>VM4hj*?zcQlc5S{e4bGu=zJJcY>}KU%+OV>rZp z{(qE~&*g379sO!kxo<>cHJ_Mz3=T6|b68PDi8N-35?26;4gl}PM5HE#pTp8y&E>uc zkOBhZ9Q3Cpb#X=OV?x`)FL8P_sElG(8OS4VBRzdw8<3Sa>5)Qr zMsHG-w(*3)7(d}n4KtRyi_3N%{i|q{ihp>{LGMfn8a|A@Xd6e}p91vH3?_=Ywu-3Q z(fMwSm}Wzs+2;p?_}7J)$=`5F=cnqo$O{>c)m;3<;CojUD7hKSMvtDnaq&M+(^ai> z=|#=na6U1_BP5$FEw^XkeyvAp;SN;L>DYQx8_TKk^N-Y{>Z?KJPth`Uz-tng*jDoKsG? zIDv4xo39lKxEEyfJLv6Fe6&Oq9DlAoJ67J;nG&ek+_R&fE?Fd>0YdOkY;~-ea5>Ey z7_MzT*%>F#mRpif1-!`^gY?ERSvGAHbDGEcJN)Mmw}0tMD#L8@Eo=ps0GxLBt)r_;XWpO^zF1gY8!Bvy625ip`W^Y4;?>xP9O-M}PCHh>PbL z^F{#2Pr{mZC99X>xGF$?oa6JRwJ)058Yw121{nvDTA5hSk~JhcfLj>I?d?GlGOi=s zt?Euk(-opbrE?PGg~u5=!N+WOq3A7&(mP`r$Q>$oD)&1t3F>UDY~(-1fIpF~BFLOi zL2iLqgURXXPQ)z-?G5u2fq#tWxTvt&KGFS`z8FO+pNRU@0D#48Rn+$WJRg3XcCRlP zS*;Q7W!PR-&n4;jA8hfG$AWu*U&g$?Ywmi8RRMZu-j|_7*xoj`=lat~OnSya{{VKh zv6E%}oN=DDJfvKlKu$BywJQb7D1`6_wNzqCb}q%i%Ju36UczqV!GDPabUDQ`TCo!x zaC+mKtAZdc#z#TWRNJV^?tM9>xL9WHxa>Rn(SCq`z6NS!y8t6{uQjL!@)$QCCIs9>4Pc9UwZ1T`W|GTynTMG7>xSXPee9DeI)V2BiUol+S@bz>~UDv zZ&wmtN<{o+ka3 z@3m2P;u}pyGj}Vz#wjFHcQMZgHOp3;Z2C;PylBSFx9RdYar-Fvr7eH7WWCeaG29XaN3c5wT zS7d!9;2#EE_&Z1P?{zfP9m{RqDsPWG9FlrwyCZb9K3f?<%3kie{{WfDd{UReu;{bd zc;@yQZX=PN*T`Vg06;hd9=XmbIodZ{p2k&%vi;}dXMfnk_&?%nEnW$9Z65l2yEsrZ zV&Q&t$vhVCUG!zlwLWt_qZm%{{Fe&kKc|7 z&2zMNr+;!qlaHH&NUNd=CF)o2Q%d68sVtlUO`=<|0DeFn=tSP*6-!p5Nr~j1pd59m zY;HFJ8z|$B`J@h3Rvgg~q5XvklN3|H>)Ny_tBzsV9&wrh3ZM*Uprl5?K4F2yF}=o> z9D|$!b3k(mgMqi#n#?4Kj(Epj^<)oU>z~eol7G1(Fd&|prdvXV$-u`00RA+HdJf3v z(tzA-ryv1I6qSSrXvaOMdXmQx+%+&vUBD0rIO|HnXSMhe`J_iK-*~RyU+vDEa*`!?Aw#?OLEe%?W4C^n}E5&#xgK@q{NlUG0fq~u6Vt=IoJ&4CWNC){-Kqk<{^#FfbE=)mr zKAGp5p|M9fE%%n7WA@Jbx{Tk3IUDfw82K&+#5=tRWS<905!tsMjQP>Ux@G zvG@)$KMKs2$oB04D?o_HEV;?RIq69gAqyTAx*jQ5ro}iQW2o&-2!D;v1qS8=K`)2%WUbgu??s=9PwQV894~O zKMGbieiZf?#yI=EDS+Yt;B_>)fMLl$?Bk^{41PKEpb7c< z^r#RJ7pH7fKz~F4Jf7WZhCP=gfOF4UmLco&aC`bxqHU<~hdW68f306ax}Q@1&z=w{ zv-ryO4>^X|AN+lX*Qe)P(vgK}So&gVI3-Ryel?lLW0uvg4ZKA4EOw8^w6I*~Zzqo4 z-^mZKo(m6C-}9-lQ8+pEb!$hNClig$^N+48M1*<09s!4KgJ!w2YJK`kKO{xzh!q+}~?Z_*+jp%;R}n zY(vqTs2}55+UH8qA4B{+_<^VVK-1FqPAe76YNBg={K|d3y(_9OLR02D%$>MBGHTKg zh@bNWy;$v)u+{P9VH6FlP_P=q{^ypELG3yve7o4MkZz%i0R z>5t`2ARIXN&-AG(A~pffekc<{XJ`dSY69Yi+zvq$4kNHJ)3162BDM%&#s@!*Q$hea z=chqJU_WMY?NU1o0APXb*V>)L$v^;O+K|(_BYz(c-__Y`EGrhi%j$72n;z@Z--6a^i)6`Rzk=yIPBKeXr3E^YiX0^MI7yCQCk zGk?;eQPA{q%CVTf>WK)t1IaBOMaa|Bcg(xKMzY~e-V|l4~KIApV zBmMoN1YUZcIOnOZY0$ep1)5Hbeb-`t6MuLQ!2TDz`*`r#ypH5;7WT0#Z7a@51EoU4 zUvo-X%~`Gg027;5@P&oS>XtqTx)SXwQ|yU?J#mj-^x=Y0xutB@brqX`c@5vh+3kGa z?4JhTxRFA6UQtNEUWbnS^{reik2>mZ?$6bpeXeUC6})6&he6U~((F@%6zjMV>VMm- z8Pn#__V9Sf(2nt6GuAvApvM^#vq(H-Cuk4O$6HjU)zvR*p#D=G#fvhs2Hif}iR(Dn%J zBURqOVzn}nWZ?$RIUIXbvW$j8ydJa=FryM!dsP9eZn!(W0j%a!O(4U$>wnELjNptO zhLyz2QT7S}2Q)~OiMoNFw2;`i47j0!10L_a*Yl#_&ys&>j{~ol7malE`S_0K1Fi=L ziuG`{dDV|EA5Px#J~~nJZR~5Z$DJpoj+aYqq2M49ARuRw4^Txkh?#K-Aauq^&1#4z zQ@ae=z~p{3F+EE$?FWB3AAkO;RwrWimJyY(MRhRsqY zvVhAVjd@^K9`zSAf<0mzMY6P558fl@`qmQE)$V25N@Tf|laK;|LnW&-p|@OM_Q0tb zyJ;WIxc9{cBdxPiM?E{z9nClihVs&2KJ4f^{{VmG{^ zuzfRKff?Cx9Hn_f)DU{mYYEu=+W4dJTVD8gG?!NqHO`fiBc3&5fKMBTG+5J`=Y~1~ z^A1N&C?-T8lDKh>IDf}(X&S({3Kwwg{;={7w-nmBRxLrLqOrMU-r=_z=ctNW8ctSF z8Cx58D_Epc77G(2ZhT`I88{VI74CIfR59DQ^0M-JB9=dbru-7vvFQCh;A>O-h&>Hh!#d~19>$h4b*h<@35zuP61Xq`ihTW znM)C=%HDhq_<^SGd)*RwbCOwbO=Rg`L{w@koGz{4ZxC4w-f1^bj+ta6bMzEOn=Vs4 zvr@5|)r?mt$baDS3NYvK6{jtMNXjs&83bfi7Nj6k_lF|0wxzapUK8<6_k(X!S<{@W zE<;Dz!SxlDTq>!#pEFF+@n^*icg2#Ix|hg==MhK1$E6hTk*BdQlmiV`%#TiXx10OS_;;8#RZ%_&^jjeNErFUy>Y z3=GX*Qx@gbf7iBlARXwjRx`BwCy5OAeB8)MW9jKshB|MQZF9MgC;Vt?;F+bP_=-ze zg6}Mc@_z=iYR2i^9p0sQ@2B5iTY=`7@T=Q%a4}Bg*tMs`Ep6ko-MGUVMjO;9#bnjl zv=xp!#gK^OXwNGBIp>;Vk>gs5NU%nekj#s)xbKbu{HtOlWROCRdj9~0LoNu z;10i97NhEOK>4WRL7b8S_Z2n>qlzfD7mXaBEPrpvszsL>{GpS|V+TCunpYx7kjMbY zEL8K8>s4zJCTZJT83xulz#RJ1Os0sWZ!D=f#&gHDTy-*f6)q4m?*|=f$&*G@#7r>5 z2aYMBNoZxrorhmjMT?5ib&TfLRF|GlG@?w;X4B_en4^>&8rBV-4;014vM26 z{c~SEQf^M{`gp?HF2&LU{ZC3sTu(y6p<$89^rvEZi%S}9boZfXL4PJf@Ot{tG^{kq>Fb(F*rD#(B#!2o6v^H= z<2@*nAVZGzEtXaUlYl?Z6yBs9r;l`{);v9_SoLFW%)EC`n13qHqAn-p*12w0X9JO+ zr)sF|DI?5vsFiYYf&NWv6B!<7e-MrOWVUITwsQBZwrlgAFivYov88i`xZOGP34g-$ z9Co3UimsapLID`b$MUK}b}LA`qbdh(1!)DTi_tUpYv4Vv_HTeZ9}p!~tQJDP?8Ni= z*3*+`n`^V^n9%hHBvL_QQbEtBOnqrJaj9~gHm&f#!CKq2`o4<9l*)c#5PVp(L8~^s&d!@DstA-+yA4cDVVr#W5V8YN*ieWh~iLdc`6{_#@%uQT~^y z3?80+Q=*AktB1mp8)xvhM$zvRQnHr%TbK^y^Jd(ii0?uH3g6__U=aQ$aB9rcKTUc0WQTZB0q*jT}L~D%wYiPre^6_}dVr9)Q zz^5$R$zj1ctrn*$Ft12&!y=x*a~EmB$0{;E`t?Xn9QE5A7^L};`6JNOxQ%EhhP4*a z^?PaAztzaUij&XjT(uy2RDUJ0_DW5-d5Cfd$RnW!xn75-BmzcbyC;q*TIHpn(nvhy zRO}=(0%bM#g$_MIvo+gPeNPDa4b2F^bHdQX&e18-K4;RxO6^$=o|r z8g~q5gTcopfRNlDyY-+Vgj0cz_^CjhiB3q!<35zdEm)@<1Jjxi)J6~vRCM;HRmYQo zw3` zejuG@?_RfLwM&3tmwyLf&PLFBaaSc{i=UaFe`#}ziANtQ1;Oq~tgI=WoO0{{9{uXB zVPZwgeA(x{ASn;^|3>))7GJew9N?!jZHLc0Fh%yRst600*A6 zDcEu&-g|WKRcn&uS1r3EKT4q|aizyW!1bXEsN`ks>BTu}46={7VErpA4Lc9q2*Ijo zwC)N(AOX%O8-HVi1IQRX=mJx?f*5*Z@Zx|P2I0?I05@&Q^}wJQ-nQKktx$$>-#I+yro#|PwC)2W9;U05n~S+v<-O=y14M}DzdTgQ z40^9&)3Kp3iWG&w8OZPJPQ>#Pq)g!8XQef%o0W-0nIInZZU%nPu(pJ$=OnjI)p10*SiF|Q0D;rinlisqPqKd(UewyK-A2ixv{94m+un;A^B0!b zC=w2*(wtD-?n)uYIKa=Bc<`onjc{r*lYT zzF0pg=zG;zoAeRWJaN*eQi{zUG8d`+YMy{mkq$6NAa^l$laU@-S+7 zMxBq9Q;;`Q9cc^<4;1VY9LfjEamHy5BS8m_xTL^(@yY2z6Jj%M{{R|bn2OW`Lf{?` zBY*l(35;hPAFWk`lyZ!5Nr-}6{v>sw62x2|x^Qz_IHrJM z0sd^@_2<%y*jBk1VT>H}(t(m~+7C2baeqU(Ao57fBufwwIUIAx^`A7ly`p>(+rSMFbWDu<1ZCT0+O3DWoJYkPb&9(vv{Y-Q96b0Nm%UM-;$z zdE=Z?xB(f#=s6TH8h9rizglU4+<%qMJuy}>{B-OMX2A-_A9trT#K4da4>_iQUUS7D z8a;aPiWZQIm*D^hkxj;hM#HS zjXn(`+=PbN0u101Kr}b-^5m#H~o`Gk;{;{{X4BP*?-ObJve*aTP{+=ZE}DsrVZ5J#R;65{3dq z2ZjKg=1BE?#^r-=GM?KClKngx?M_g5*5)euj>INvd4p+k*^~FOfBU=f{JZHU7 zx{r3~MM@mB*lRIh3jOXV64Y)A{V~(=pa-9)9OwDfZXry7pKS3;!?^4N!5wL~Awj?@ zoc0uu5+OZDT17-f$A5fKA%J6#LqH3RaN4u zj(;CoL%F+#sI11C)&!^FhF~DJmmW0J$|&Mp;4f%7eF=3xdg%deV%X0>8l6!xRQ$mZei*$hj+tAan+>T=8 zl{oF3bNN*gk$=wKN-%eFdQcB@mDC$?E6BjC>^t1x^*2$Fybedwovv#W&9Cmf%-KkG zq1-ojQ~n%QGDe9WJ+H|o=YX~yc>~pIS-f>QyEwNt{x@;>)Ex>pN1*8T;r>(95&H8} zBAT)E4}q*V%@`vf^!LqUGoqYN(eDcB?WXBAw!O?@n16Z}=lm+*5;|p27ik=NRW?nE zvwraL*B^x|lt$43$>WY{Ku`b#5rd5WwW0ySLcDh8@Tp<3VF@GDaB4uDjBrnC0FX8~ z&l#WzmGSpaart6^0KkBKdS~lE7KRC+44)9_ka&+uyU?zNQsyFnpW$qLr|>nk3ZBiF z)~D?v(SP|@t7(&Hcb7U{%9N4`S~d;pr?<6xiQQcJ>XGGk8>hI5mO|J7M6AnrK9tj3WP z(tt@E_WcD*DKoe5j*wjasEz@wWg}W>>@^uS2Y+&Lg*B0-taCb2{{C!wD-Xt-4bIlp zG63&LM(wP4ZNH5Gbyl(}uF^aHv=wqohB1RCHwD81-z&(YaJenSrezFyB%Tck5Z%ZF z1jf_WfmlQvhU3RH4nz_}cVmFL;(~W8NSjBw=7Nyp5JCYU@EhBnahgq*mB(a%t30l0 zihuSi%MhM6wZ283)y5h(8OS-H(Mb5`;+O2R4zDDd_rr;!ibIxrCvG#`DI{>o3 z@i&8YzY9**{voiM+i5v0zbW;>s!X_;(36nkqY6!fc4t?j=~r6C#Cm3z6Wm-?&DZYMM94+#Frz9rX{C-D)7PKmk0Fn?#q&<-f}Xv$Tsq4dXwe`P-gXuD+9O!v+> z!#UV-?TUP;hgF{0r1%TNS_-UsK9_A44nfWc z9PTuQxk7unMhIihKMDbr9(EroIOCz_fJ6;+(&d8XaRzf@Eyu>;btp5}cSgR@t{Y6%qi8N;&g6cy zGke_};czbyZ8>4o{B?Ae>f~*- zRt53b=cJ@%Dc?iseFhcMqZS?jvsF!?8Rc9ABZKv#QRXp|vDE3l9Fo#gsp}U8_V}+3 z+^UZIN99_@Si(-^mur{9asWMRRLtaZdX@1~EcEY4|v48tT&+l#z z1<&-Rh;LH#E*EfB8DK%BvmHH5yVfx-?lz3)*NUr;ms5m}>7$vpve3=ytCYD8U`6+?I<=8Q5}31Y`=kiYSdHWym9u*A&tT7Lx2t zyC1G9;$b~XQ%J)x4D+0OVy?syN_jXu8lvK~GpAxfLNk%xf{Mu4%731E(oa(vBhx$` zdM1nPr;>5BeMbVddt8-!*!^qx1Mu(u5Kj%qbA2AoR{RO)Bn`@}GOB)q`I`CcZEj~| zeJ%orvyQ7*uggQ+kn~erM}6v981ewANr2F;p4k5YIjUL#6!C9IPRylndU6P?>TFzZbMoWHx>>N*F07e$ zh^BM{rvjBdN}4=-S+(3Z4&4XVw~5aZ~}*K;-nYfd+2bsdrW&*A$g z&@_!BM;tDmk=nL81z54q{0M$^X&fBKvPB?u5-G~C$f_dc)ekmT9^?7Yhar5eyh+>q znh8SfR2#9|G=JF2(>DGW?vLw2DXj|60S<O(slbVwKDVzE0ze)XPGfIZMFEN_8Ev z-iV6jQ=*8U?$!$dVg9>hAXPz?$4*^PU2{-@}If%s|e^c@(LswFK%#(2jaC^Td8K_Cv4jASogttRYLP7C5E#BDR-#+=%gq(j`l z5I`7icKROGgOhp$nn%UH3-G6ke`+5ZL#L|Be1F$NBd$zV@nxwat(f_Uh2?@6#o$JDfYO=S`-MR&%8 zHh;yV!TFB8=JP8stI+-yqw9FnteWL)fZsmE5^&bM~l~Va`WB$G_`bvW<^s zjJc6%y?awNAT6E;UMLe}VVI73_BAMX6n_G8J5@;&5c1C+wKg4wnDO&fCMJfwXN|v& zHK>{xV%#y(nJHX!cKe1H{#0JYq)Li93YLjuv&T-flDSJnE^=~CF+)}bt0nyjrcia^ zxIEAU`R$HKm`1={XlMUnI;>s4(8*t~t-oK|LtbAKLk zIjXn{PDm8QE>3cK^{HWEQUN6A0D9E{9(IAACOF^(}?C1aV&=8D^3mL0J`#~gvQ4_XOqbXMiL zJq1|~L)z4I{U`{svsmuVJ!x2c=$Kfj>+MB_?Fj{{bWz%nDO{N?wg8|GYJco0NVgrZ zUMNV0?ps9|=hA^PSfVW41Bz{snQ}XRdS?`_4^l*n0E%EZLyiwY?LZO~+l&sJQF{u* zRx!{}7A&a#=%mWACf$JGQ*tIM!-RM~*s4sIsI3_O9)g)`Lc1mgdvu|)9Ca(mio=eB zujfkRwT$Vb^*mykMF}Cn&ws4|e2##QPc_bWwn)G>H*>`Vke#D|C>?=%o|H5@i;nHk zP)Zo&45{zUG&=x8o;p(IExif$?HE0%Ow53&8TINbLa(5t4y-w-VnV!p0=+T%Q$it! zY3bDGG@B9)fUp1%d;V1JFvin_>qX1G#M}o1rBIlxrAA5UC>KIDVt)@O7{SN$q#-a^ zgPirnGORs$$Q@}CmBnTVzbydOhBEH?RD0r>`V1KRta%xr7Q;&I$sId=DKjy^lHT3u zESX4A*OS(hKt#l^%Z_*y$OceOamO?v$VJE*Z>LMJm4HK z>5Ni9M8sr{pW{uCD}N!z<~_Nfu>jrIrb#~32_cL)>)#X-)q@0cjEwc5E+*nVv(FR& zs^lIpdFewyD-wSWl+ZC1z!~bt`cfQ5Dwp~B#R44LSO7ZWfE)L@9jfjK7=C>}Du82$ zI8n*z^r}cgf*2h3=|B+xM>y$9;7k-BdP5_^kG(@c4Cf^GAb(H{LF>*a0zkuoK%21D z865LeHK^b)a84*}PeDl>7Ccf+2C)QV@TS-d{{SYN0mN`eaw=A%5s2%KIID;aWzRuL zpd?|)C!yq20Uioq8g>=Q0|0m(bHyQm0CIYhoX`VXu^l>Apg7@jM`}$8hT?vdB2uuR zZ_aa`D3NE=e}4pgIrd9=JXtc2IznQ$C$bN|-;YnuvS&3(p5J$J^RanbIXS`XX`FA& z!MTtRrUgKhPIm3{k>0E%&M#BA!P(q%P!_r8daj~v^2%}TRxOVp@n4Frp@kaI2_MW* z>*|Mse+m*UJ0s_Bh`u9X8^<3T@-g-Q00U28wx^8gmVbq?Td5f}g-IQB(bn8dG>d69 z4hG1{1Jr@VWgX6iq4T}1^pnpe#n{WulG!~2bkDtXSjoGMnlQgF@cPuUS~Yw(tKIlc z@ilE8Qyl2P@z9Lt29slqtk1u`9Q;YJ_$nHN%xH}yj+}j?FjC0?d zgIZjXK!4`WO8T$74w|&)X)UL0*Y#f$~3-C-u}NzkqS=IN#M`|hTGSt ztqEK%G1%kf>M7d8xhF%rAoa-JWgDZ%eUDKjqeQ7}74Am*i^9L(yhPa8ob z(*vKoVxWWGfH_;u&B5SxGzHFH?EKqvgZ?!Q*n6CYsO*O<*&eiCKsaqqP{FqF0i>Oc z5#-(?lQFx-dFMaMvy-{JPbAc@4xox1hku(9E0NuMenzu8Vu@@}0v`kBKb9&@V61vh zg$ZI9@D2b!jYOGj`lsQ3k}mZNTT{mQRB`Fnu-%4ccjB(Ud+y+cL5y!1NfeDj)5IPU(MZ}0g6OcN4Qz}m8sxJVoK#6wuBir$y3V-rB zKz(Qey2;lEr31M)+6w3U!1^RgUToak#i}>@w>tsPU7VlF zrsc?xA20xW@^M-ubM-V8f90k}UVkX$DYD8o57d5CNs1%E5}k?wB=xNCV%cj=)7t(* zpl9a5K7z88i-c}_Rh^pHTdXQGfzQ2S-Ob{xW9qH479V(=3PYBLCX}Pkoz!(HpU8iO z1fBhm3^Ukc6cq+;+b{7k8Q^}jF-2XQw!>>2{b&hjI&YjbZ}&*Y9eQ-3D}M>x!X0L}cDb?M~sb1d)^TKVgn346an61$h|Y zdr&0oRA(cRo^kk4GF*@Wf8x*AgF+fBNn)}$n**4o?82qSe3 z#vMZ(o;&8TcSf;xK5y}l?0>(aYU*e3?5$^f>`CBxYy7cFQ)w4#ormn(@XlX`a%!5N zi9|Bo$mtEN=r;g>9mEsR@+)XNqZ*9**4|Z{=iRxFeB{-bGS>^h0)QR6Jx9`;5Yrnn z!9!jw3i1{*CuP*qtLLz4mxAKTw;tRCv&XWkS~@3tX+WM3Z|?V zG4Aykc9`S&n|BJmaY8eF&Tio+zTCGtiV!#h?;QUChf2{RTz{@r7Li&Zjs?LOIq%c? z)gf~gnCBa~JqBoEwa8cZO~}9}ueA?UQqh?j%!V`%5Cmr@G(@)U&RWvf&6G@>h9qEh z13fCPHtcp84DPNv^Z^P7g}E+?2H(&TtQ5N`K`vkwMF|ZH)8FbLmCNi1Zm? ze~6sby{;tfx%DUPpYYxMd*Zddy&2K;ur4lg2@JseiJqLF(y_)@_Hgz803)w2!+Tj> z?2p(y4tD+C)$@{i-1-=HySeB zk@cq7xro_!4Epg<)yqr*@BXv{V}j%BRtSiUd(=4GYF20GzsGGDY5pd@Wa2p;W?nlw zkJCAbo)YV-1$5DfM$EiJjm9$-sX=-@CjDKYi=G<|bvo?7|k)Az$YLK=vWWRcGOKCyYLUgYvP}Xo*mMp8u?S-BG6Hg5{+Q;m`7^Ld!g zG28N~x@6erwI2#=7V2lZ)8>ve8D}a;1HWpd!cn%TH{`B2XRT6KCvuCFQg;EGtJp?N z;1J845)DgZM=5;8PtT2qk9uj8&R+g4>wlExM?qAXJDgqia>aQ(oK+`cV(fDFu@=bd zo`SNP(&tPTr?39a{vjgkQt)lVeBcYHN2vZG{cD!AE{{(MJ<;{Re{AQWu0*VLhbN46 z=}U482sZImu=XZ?oOU$cr0z$%*RM*Jv>1ek9`y+pnUyamJq06mq9NpP-Dn7r9Dkf+ z*P1Q~kV_up$GvEYD!e2Ufq|Mi>ChPDrVef!Ji1Y6sIlE)loqJMI4LbQTD0g4|Id}{G5R?3F!RKAoXFpLF^9zOsx zTG6Ghr=41(XYY^f>+ly$_zmIc^ot-Q*6vka_TxFr5%)(O1w2JXvN4VNp8o(8epxII z3F};zxuSMHe(_$L{e!K!i2my5_o{xsd-bPIR?u@-)VU4TLi3LFbrX6P?|-aUS+{LE zR%J)qxS_$|gH(t*7;O>=(ijHSLgQ%-c z=p=BurLzqB)xnt_X{_my+$$u5bVS}ikyvL?djO+AJc{$(|s;(8c4^f!Hvd~sMa z&_rj@QcRf%y91svPQaNWuzx>FWe8jh`_kM5GIun^&O+_bbmpCjZsa-6U3!o|3S!t@ z{$GBEi(Fj5ZUFne`cl|;BQr4+orgOcd>4j8>^)0}t!AlJd+)th6-CspikLBCZ?X5@ zdzBU~MUB|hs-lV@wpwi|eZPGFfm~ejJLf#lecx&UCD_$IL1y8s;s#_LA3N^dpOxDN zv154O>1yyo$u=_9ziu{;q&|TMRA_GVaCrI2@OCdG6N_=qtPe;`(sM&fz7z1#CoAtF z{A8qOG)F5{N&`yWBU&=vr5XKuXE4UO>x;8xL1YQ(VI3)6cpo8!Z8y<#F$`QbQ57Yk z7qOlM=u0n1MWjJh^iZ(E6AJY!}&(`is+{_TT`MPc1;3Hz+iJ0c7O zAIV>3hAdKT6sP<(acD2_D*66@qX)uGzuZT=p?z1*g#ufgN`o`n4_jXXW{8rrSXBU5 zs%rb-it25nmxmUN$@v?do$P1Op~DyT`Q|05gGE-YvM@uG!uU@$ddyl3*+(#5#EYz~ z(PuQa$y1EVl<-zF$*~W+f73;EhxJ>{@Y-4XjOCDgRw>Xiep2XX`KJm&AjIiPWSx^E zn~XwO!v<^hcn^Se&?Q5vL*9h;278UASzUPHL&REetTCcZ2wvbTa{TwygZQz_VVzBHfn{M`CJ8cS*oSjFo5D-9#A5>11fB`0T4SI5Lm6jZ~^G!S=e8z5( z`GdFCimnwOWEG(my4}X93^=QJKZ;K zWwHmjd1WRmx}i}u{hOi}q|H%VCpooh!%|HVcI-q zIyyuMM8u1iIh{@fSyu_=naZ;mwWY`RGiVr%ceCbw-8n0-sk9<|jdUHD8DD81tKg=z zBFLCPCRXITzKXwF7zBm~6_n>pW*DeGmp`>F{%6kl#&J?+;(FJ#!(apFM2n{+c3L8A zhw$ZWWU8rn@dYvrallSInXghH88^Y^lew zsCpG;a{F%&?&T1l;VAxo9GYE|}MfNVG~-P~kb3-Y-yWsWf|22p0h>Az4qv7C zZJG5)5UpR9KDgTw{2m-V(0EC^{jmqhIbu*_}oOTOX>n{#w$EpR8u^A-hDCwyfc z9_Ve*qSx`@Zf+FM!tNc!eMQck$9eB}3I(2Ep4MJoA#WRa^sl~~V(^n$4Xm@|>t6QX z>JSpPh$seK#C7ZmQb8jOB${cors41F?`GBt5X2+SKjrpoIvYjjkGh)l>$v2tPC4#3P7Q+_l$;ms4irm+v zj}Slu51qOykFPfLyYNqW97+3P6jl{?cMGKvC24)1m_v;_FTU67lsGO|{s(wY`8(oF z9AWjyj~BKix81l-V+oc~l7d??s|^wYZYmO!j&$(dl-aS!N$fA5N$oLS{p|-#KUrwy zrv)9Z(!P1#^5vmh>?sNmu|-{KM0dhKogIm#70kUOQXAshJ6)ZRfTWZv9yGR#pqO7| zsVT>J<$PO8icF&G*a)5hfQ7O3{ZRly4&TT6V)3drMw$t-f}AG~cWXASn;GSjG#=f*)Cvxp4b4wwQ5e3aZCWWAN8+&3Nm{Gz5HA={zds9Ys(bT>Gg4d z`}Z0{TX+AfQx)X~YzIJKRa@_+Yz2lLI8oi0ck(4~CoTFBoHYZsLv%yT{g>O`F*QR= zL8hfjFnuRC9LTqLs-bj$RO5WN{F{pJFJg6`_0Q$2X{aQ z+&4$VQ)r~inWdYi$E>A*E1if}+|aL+FaJUTP*QPd3+lawnv@}?EhvD3u6-PJ)BNonPAk(U5;v9AVR&dDUhRi$JUdnX=q5eP|@j}Z29Zd@1H4cW-wPj zgvTx8q!c{=X*`*`QOc4gP_ova!Gq2r?b5@*9!0tX0?mDc01!J0w|7irdyNc6sZPNb z+K=C3mdK2yI@X@^&}$lb;I2rWYA*Jqq=(FN&m8zPN(Jo45pOtWCK3aq{`nfs;HFSBzuNf|y(v8CUq2?LI1zi+yGLm#;6&RLt{=lb}J^@SZ znY%78$|;cTMi`dG0{P@1d*uNF(v!vTEn|lE<@5@4#i{a{VRuSZ){<$v?Q=<8F?5^R zq0T5>^_Qla^1+Hv+ra`j^5!u5Nw+!r1?5wBYO%Br)vQJ}2DLy%{IJW zPIPCytNr*U40qk;i28OwnE4Y9=pJf-D)0b*wm-HBo%}3Ve?M44jGdW|m(Q9tPsTce zX8NEABY7by4&)8yM_Y|)05~JE?L|?t`=iz72>NkLkN~Ch&~cLe7d%Hl%iQ6U!N+eq zQk7MHAeTL?9xryNt3T$Z{!KKiWxHGlkx~D){7vYjWk;pk#|3gci?0UHnGF4VQS|xp zPuj4l`=jH(Q^`#lAawJTVX=QNbbht{r(r=gVrutR^|^TjcRD5#rM6ba)6Kiqk1V&d zi8U>FdgZOb_|gO$v1AJ1m(QAHm4=Y?ZWrAqsdvK^!=BZ!9X{=W#A3UNwv{V~fNx9y zoZ}x?O+Oq#VsVI!h>7u0Q&P~LPqk~7UcJrutUrn964@@+%g(=ABZ5cw;7&O`(fKt4;q-~c)3wga#ex~>H=~GIdX+@3y01?Q|+CJOY;en8Y_U!)R*H;Q( z-yqBmZC{i~_5AG1(BTk0qJTpb1iloP#;z`Hfp3O>9~V|}ex{;)XV zdx`$D2Tai63T((X_C&mTz!vCS?FqUQX2jXjy_@ z$tb7h$C#q}VV-2peZhq4)Cv2d?5+Lcw(`fYE8)v8&2}w3Z1VbF(v`kRx7HWWsnKkU zpTJ7_H{L*ae!l-vbf~R8)(bU<@j?}spAc>8x3R#IW(up-*rn0$J&eDo zYR?+N18TkE@C0DTh_7@X63aK~oFfnq78Tgb-I>)_o-CX;NfmT`d98)Cg6vJLjstr* zKe-@%~ggV{c;r{UHR*=`W0p3 z0Bsi**N{sN^|3V2wNTXf6z&wJ4U9CInI1LO<;6&LHXnUL$Swc-5o&*I^1-)#>?4v` zNuVCH)?H(GZWh-PQucn}E#=7XWL_cKwV>Yq| zCbS5^dhwo5qzZyAy%SOk*!LU7XsyJ~E5%w*{FNqKcO`;X+B_o$?_9c)Nv$stR3ql3 zB6?05v#S5Gn& z2|gl3D^tJWVh-7=*tI0A*ovStB6x&a?)bgiiVyE=<#}zuzsRA zHpXit@{#mn)(!f&$iKoAmug_%oB#iR=?^6(=gpfXyO0EATT=Y-3vZkwcaC0$9Jzo-eYMF`TN3xAksvg%t)GmR-iiDQB3;jlo`fJ` zcg=LSVnv-Deu^uf37{f-L-vcDoR2{Y08qo@Tn@Fe{BWgId=3D{SMs4OfIrI*n%iL#a0(!zj8_J;*}tTCzWNtT}C3oGn8L&$In_2Xbz zJYpiv(Mq<)WKbtDP4QAU2EJk}!FJd5amAPh9z7%b)w%9x?-8%>>u39^@eJi#%3C)8 zm;9j(Q8IYa6A1}E?*E&>7WqF?$f>b8@NwRy@&afVvu+o7REF5>KgaM0lo{gyqOz5&7_s0#&^a zC>3+K_Bn+n?kv3Z=t9fcyp~cdux_S#QWI5QHSB^HcTiJ`1C5X_XN=xeGIRs5iB6oS zEi?$1D@4rdoG-+U@Xwj7w`h;$IQYs2mJwcjSkdin_B#-mE^{E=q#r0_V7MjFL3pUIeN|#}C71qtKa)n@b)@@a;C3&t z#uRk<2HWDx6V)8-gxV-1YhM`%f5BL;it|Ej7hIhz5n3I8Uh0J0R&)b0Rigms*8Z}N zwBP*)aNTTf$`{|snL8!XzcL0k+z=kyL01d7_R7GaxXThkYw@wGKWu=R`HD{1=$6%E zl-gho@LbX40Q^i9|pKg{{ z$JeuHnT(pv>rg28P{_<^i`I<6)*`4fhe;6ptIFkD*yR%~4i0a|BC=~ULO#m(MU6HJ zxWrZi+-D#>GQjIMOdGZ=_5WI|X{i`|)0)7Q$DkB|su?4N&KDk-$Ok+(*G3s#t(8Q+ z^?Tz{!G5?1PRbUoLA|tJ5`$Evg$q{)tu4HKET*3iPN!74X~^uYk#Y$;-aeM@DnT&l zC$@1W(#+^2^Z@dh6L~(aXV>j&qm}U-~O9971>6r?b7y zmgN}?79h5`Vx*4zv&1Lv{R%SuNhBy*KYn;|^|1R8s&Jn%HU&CJ3S@ntkZCy-WYo1% zlnEBUjJ6Ts)8Ri(DRoorDDe6FHVgq@q@LE5@B3vRRnd{(?aTHd{BS>W2^8rU=u8GJ ztd7F4)zg!{RY?yiUFy~C-T$zD3;v{yBB*H5jl*`y1Cz?%reL3dBw5bE1RwoleKty$ zbP82i!|)759b{Z404qWzqFNRel>AXwu}X19Ho11qA=uN~Ye!Nr+2F@^K}2b_|Ff8a zE`KFeMRIqiuX=eV-b|+S;n6MX)LkWMFE>Pjc3NnJFW3oXYQO1FUQwtbwUk=q4)oM6 ziG~J;>U$K3qR?fA0xK20RZOQ_zOoCr8jPo-f)UN-6w<%1Yw;+G{yBdB4A2 zPdqDTpDnU2gj_MGOeU#jLNHK1_2uLyic28m!j9piOyGR~D``HFFcEUAXDJIyOIO`! z1nZ4h&J5VgbM3i-&*x|8I<$2!^H87yY*>-WTDj09jy|TKQUOE_K`=wWfz7L5H2r0y z&u4f%>0xs>sdK)#=>(etW;2q_DKD0?4AK~^21(k99c}I=n%w}6z7tY03x*9+D~SHrm+KgTR7;PvjT0={eYxt z75N7@zSdo-t2<*saz8MZ5-@l-PfW@~_3vja9)dv^ca$_0p}&|l-TyIFa@PU8Uuna{ z?YlORni-hb$CqcNfB0@0BGCA4+`*_;_U}@IL|mqr_sKIvnA79;$OY*P??;DBS|Az+ zTs*>qT|UIJYR#QeQniaMI$9p?T>UNMLm596+|Z)Bk(JXK1NkJo%&n1hxq7(BZ`qa1rdDXkKJ8gXdDyw<+-(7xo64|yO_JO@ zy%9t*G*{pX_4kGqYw^&9(-+mj48u)}f=utgsdCmmvC5z0<>ErJR8tepKE;^2hx5eo z5ZABk3FF|6er3UFp{mV@tv_Ow=)KgedhPYv(QKL<;SKp(S3_=_HGA`vhQxu zOm4?REx-QAn_Gz2MbZMr8u3TgMAs%atJ~hBpCE3zU*oInrO+g9R~PTsY0MRTTHuNq zgA+5g=?F5NVOB!L>{g;S{y7pTN=es^?0L)bQgOzCg8PZwD&{N;^v|gaS z-QsdFrZVW_Qo!9(3n2t%WYnnv_7aU@iv;$&D@0SWg_xP%M$3^1I-+hRW+z}XW+=cWlzdS>qb zxD?iQnD2BTb91hyro~47cl}X!k-VhLzif?E!NQfhLdZn=79TfWdz9mG!HHlSAuY-PjIB8_hrzxR&jH7lmKK{$4W^TX*BCV4!0gp zN=oRDShs`>u}Pe{V{@dh|F61Pu}Op!WC^A*#q%5%0sm{U5vB1OwTd z@P86)Ph2<9Jf0QrZZX#Oa^=oCR^^~|RopOk<5KjYw2#UecQZB8kiph~EwzAcx^ZUm z;^>v^XKWNLJCvm>KE8y?Xu_W}j!SDw#JA@=?%|_#y2Che(Ek9qEp0Gq6^_m^bS1(ACh&3U7{)vcE1w8diDr5l;%Ky|r_h^o^R{CQdCli?{zJr}7>&@nU%N*IY+y z#^16mdihA=)r%L$4d=r9efd!f;|tWt6JLbQvLF}Fc|(T(70dTSYs7+0{@2XY4RZ`{ zT@9B+%JaDGxvxoXog|m6IIy9uOZjO;m#X!_rkZK)4z_HqbJDOCSmu-aa~?>_Q@aQ!V9>; zz6K5tXq7<`00je531RcDoDx_JoP*o$5`E*6K2`^4q=AvJ&CVb^V z)sb;GZ_wpsM>cm7DZf|i!jV^D{7kEeOQWQhkD9}ozKQxiUfyNv z=^h`S11afF)Nuyin%wrb2BjHayuROLzaVQ9nr_x63o^liI_uu~n^w<>)#$wsZwVhB zczgMLm|^rkK*FP=1?}>~mA4gJ{+lpVt#oVRgqghy@k_JoF{seq;M@kD7jXU19u_+N z(YC5JC{O1nqME?Y-ro|$L6>?GUa(WsY2$Ymdc0GXBAeS;WI$|Ck_GLf?vHPKXNa-o za|>w=Jpnly1A6X)G@E> zQ%<69WU}C-Hm84Gk;6iAH4+5V*2TiAdh-?NSOJuCy1xRRf@#cZqK&0$E zFo7^*=~r!pYVYw%y#|bxLW}!9fX&ki$@ZE2!y&Ls?RKy5_r7I%$MQ6l(i~isJnuj#cHx=k zW`~>}__|P7tJY}qDCQ>sQ)3gGQheq%>J;I8!_rvT-ugoC8JnRmKeuoQZLk34ID!Cf zVVx(JrA5WYcU^%SD4g&>>Cr^X>-f)5dd#SWLEL##OhoDKI1!jb(T>NKJ?HeXuRr1r>05lk zRE|AHSGF7p(Lo1X1vi}OjjK@v58e^+`Fe`+J6yY>!7~jpHCONAn{qcq-W5g9ej(!? zP=0}ysuWXEuI|bmnFNSdEYYyR851)MftvXUNROkDeT(044E@FjLC-ikE<}udZgS>S z((skLg{ETR1pk?b`lLlt6!OpU;! z9E(W!eG5-i?W3GRuh@T z`U>2Ud-EaeaevL|m@@gm(#*6YMWBThw=Kt zOu!HczR8K8Kn|TEkMCt~KZWmq0P83kH9e-t(pp5{+P4+~JA>`$A{o+_fCWfLYYuGQ zwZ-?zW%4UMe8o}ALMl=liWkDOOa+yEHLcHSIsO zo$CO%SQ`xIX z{6-Au?iRn36RNmIL`ayp(|YjMk%H#9e?K!v2f|)eDzHV!(9ciL@44tFOq{9)fQEuT zZhwkKt2;Kni1`Q>sR9QDk^CCN&mlG`;D!iY@>W&4p+EUon`80dmD4RuV$wBQZ}lv%~j zmu@{AOq^mWhbRfk>=gAE`~MF1OGf4w#z)dd(rOr(oKpB%;}_CnW)}hxRO980h}AJG zj6(2zDzKI&_m~ZiH^jKR{6a7Bk$hhp3%MJEK4pcx z>0?e#92xoRQByT92*0DI%ufzy4W(_bZ zG~mkoEwCy<0gD$6KZ|%flSq-cQRtcVkWqqfD#*vLUOQO~S+VgG{%l4xdfQU6t^AlY zg<-=|f;@ggM$BKmyG6~pgv|JD4^ngkOm?H-6vXu|-zi#G$ZMQca=2aB7b@Pi_=Qj; z_TJdh!tf~;d4}%2%+Z&i|4;Id>W%_qpAh6#tvyFpvd@OC6|OF~7)FY~uay=G2@(Tg zX}YF(j7l{O1OjPAEC>Ul%oX`^Zf_V0ZH^zqO_qX#yv7mX&n9_(w{i(yy_2#<4Yfez5yLQk(plK**E-o;c@3H+ zCcnwhS~juBtaY}3jk+!KOB4h8^L87tWK$35^=HC?61xg8&7XJcjkvvvf2wH|a2W&0 z%db*ayqXSljUIm$ ztXT?j94DGRL&_Sm%Id2juecWlG!i#1ED!ZGOS`Ro2#6>3qqVTU?mTcN=gaJX<5B$8 z2sY{?=Z6B0c1^C#KxsC$QCv9g9|5_vO;4+=@7nP6fXF{U<An9|!o#(jWwIcU$I`ub;VAR8;RLy zto7~8P4$(P+LsT%M&(HMU_>%MhDP;-1givIeapeSNOEwJrkUECNEFWuB-<&Oe#dVY zgwXrIJ>^OY4!bd~&CuSBj}YR5Ddq%1J)iO-+%Jib5!(~Rj*=i6VVB!*ZKNJ#px?Ej**;#p@w*nH z!44}zn0+z#>e~8m8S17|wAVC1Ha2@A#$^bC>X%K^V_|f=lFOR&k^emH!*FZvCHuBF znr^{nNI)-jVe;h1*?$0XBa>MJjo{+x-y~mExj{T)sGkjPJyW>^td)C<>|0N)1Zp^g$wNYx zvlDWX*>_7zWKCx3ee+^!dJ;0f4YKI)mRC%oQ-s6U{>`wF{|DH9{^!x`=TlY0(TDiE z*I(9D@KKZT1Cx{(dwZUm?`d!>h81!^&!U265w$HUM1t6X$I3L&r818I&fP&I0K4G2 zsaJ6fyncx}wDJY(#FRR&eZLyzwCRvlvMv47s7;*g8jX~xh`0%L&YF=<*L|B+>=e(= z3N9-j+{u%^)rkZnuVL|gK*ZtK0knarZ{{Pe$T@l^w=|yvglthF^+#vuk_BDD^V^9N zeC7Fb!>ouV1-|UJ1P#O<7a+5rGpVURYW>=q(nF=AfZOqT68INxi<_j=rh2o?>HX0t zEWJ;kA2e|$kj1IJ_tZ+R<15H^o_m(fIMqcnHH~Gc*`tK+MzQ3f@P?;s_$%BzzDTaQ z?eAM4YD)v^MB8!dxS6Y%xoVBG*-Ku?V=jb(ZALsMj?$Dx{4NieH;t~Z{6%9$_aTK! zT4^C?I6Ja9pmNV`{Q3IQy-NqqMkEB@FuHSG_BCQmboubtpdDaQka zCO6gTt>O=5FT%&!I!6XTeVT=1%{8IoHL~(2K{V1BhnqvYaEls8=s10UJ z@K^Y2@PRCe5W3R5ow59)S1_%GlURop4hIQIv<$=FWl7njIY{nal#OKwTT+#ZuCGLH?l^Re%ZDr@ zlAhR-xq^{OvLv+LfT0NxTdXq5`KrgiHr7cVlcuZ2RtjB|0JN-9FO&>g$goy}!?PpA zb5PHmm?-z%aJk0OExH6-tmRm4`i0u>_*+nY8VOOl9 z&>-e}A}&BQoT>_!v=#3?V6sv{CiNDnyQrSLqp@FG>yA6?t}@ zDLkIQNlkjBQD`;DI~4u~)*kObA$wEd!SE!lNI;<@DbY-9xR>4$A%EerbTVify!<^D6GFwc!7>blN)h6or$`$1? z=|$3hxDqMlCl|MK1ZWojVunMaSmIDW#jRpbe z5@aQx{1r|xuRKBk5FTz1r(TG_Eq6$l{=X1#`Y8~EvQbZUCBLjc{qxfe=R6{a5mSiw zj(Tia=!XPHx5I6|!!>w6i)JZY%>j)y>1Ocr=A9!{fB_j3EN*Ok_kkyJ4}8RAcsE-P zTOkXpY7Beh3W&QKeQG)1eA}!!iS%9Z^6?WlM`}iJdR3c^n*nKxv;S=aWwy6SKsWnN zq=Z~?HsPTGk-;sBMZ8drj!M>bt-*sV!-x%=qN<+fI8zz7&##uDD&`YBSB|^J>)nq4 z6Cs8vt^tq~*1kf31^X@qCEcoe_`EMeH{JrRvjc>yL0aMrm@xjd7(T!HUcqb|Gpv`! zpxgbm992_sTT}si_;RYd4=d?XY)F6pC;Xe=UvBDAqR*QB<2V1_p%Ogp6N6;_{xJ5e!!NWLRzz5Z z1h^`Ma(j3T0L4u&=s#6au046_OMMl>ru)~6RZKenN-G?dY?;;xFJrrZc>&IRz4+vx zgV8i$Lz{+s167*1q=XUSEV&e1C$_}?f&q~Qq-YSLTO4RRE=;q03-TS)5 zN0!MDT$|CsROR1uFgw3_om`xoV5+m= z_PPEHQN4&N%1Jv39F}{P2A~PkprN%=G`z_B+!8oMwqU2~{bcCYHNhG3gI=;XD>Y4O zJDw{Y&RW$iaSBmL6ml({-H|)iVUpQ)I5^T~N0#tYh$&wGd3s_0b!@zlryC(K+%i(d zjC|xE&8XNfz(n9TNA`uJ|FMI(K}|%dcVl$ zBAJE683m|u(h~yl=JnK8ID=WB3(4`=zv_p78%`1Rnpiu!?H4G=DTqzVYu-8;ggMrE zYvMfC@$U+Z&`o#K#Oi1a5#r{NR8;1ygHU~LS?T-F9Zz95jY+-5KLmPD;9>3EsT{z{ z2ywf1ORZQ-gZFMfdxeUZ#pzTR9&N)iG^X154?os4+T&C4MQ)K}=D$hN`btZcr z#Jkzm!)>1PEA%1GP=G|V*tXK7^CTKGZ9kjU1Hg&{IcMZZ=Kfrm4GYRQ9YHByjusq#6nO(jhW zH8bHZfy{!^!m|f+ssIkKltO))UVF6+WOR9Lr65hy{b(8jx)7NJ?p>1wAY}EMGPJj) zO%`P;L`CI4Pr?K6%&5k91p-6NdT5Fw0KoQYIl977T-Z&W!>1S*7c$=*IteS1xs(OwPBhvQdb5d1JRqzeiWx9o%2Y8#oDA<0ZZn zPfREUzW31oMF@64hV?gOzY{z6XZECb=XF{LFyAekOfIxWV?KSo$-TTzFdbXHz|2fh z{~HHJt8ksjlY5drblVi#siN6)3y_4h00}(9hL)X#TOUpVbU85NrrekHqn2&-X6k6K z2nd1Gv51>R!woEFYunRr%H>RUWDbKC;zjwdR=sIBR(Z5kPnVUoSVva?AvyP=F0-L& zr^&iZ*LttekXVr#&;1WPFBIcIcMi-9@uLI23gC7wjk)+UPh?@*S9-sw;wywIMpmZ( z=0q36QV;_89c0l>*AhHDt?CPp80DQx;t(|u$s-!`?ogPvOp4oUdgs9KoU{P zI~g;SK1b&05O<30|9-Jp&EPe-4|%@M~MFL|5Af za93(zYPr9FM5%95R4yV9qJpRa2Hgiw&k4NaGlIIva5_NlMZ(j0! z&e2AeG@U{zuV0s#(sF3xfbdwqh-^;!Tz98KpcHnfPbJQ9SiBtVT+@T8KQxWywzm8S z-gRv;V=q>O6=OivC4<>g2!wq$&MRvil>PMyUcxG~mdPAOn~-)9`+yWS*+OGjix<^6 zX`ElhiJO1J3%c*n=~#8lVo~g}t*EuvbIBQO{8K2E7%|+$qmV{loMG&`M>(3R(Bl7l z@kJ!582TT6lBc7&D>5h>&pDY53Qt-ic^r zHaB#Yibu|P>N2cA_zV5oZ|W)E;Y}S1B^5ghi;})H*56)t>>cv_ zyEn~~$ZAh-WpoYTdqQoj>y9BbD@jIU#>qNrq>LQ}o+q`_c&^9NFz-({zgIuO{cQsK zzB2{Uy=@ggaC0txK#cZ@Pv;3!{F&XwBt0=<8E*Oftg{sYO)+!JwLpI1NOVy4iFTW_ z??0qeV?ClE>E1-qkzu^kw=iXDDm+#jv+zPU;a7H4le)XEH6G-}{TMtuz%rvQrwu=OvT}*|Po0KbcmI2cz0NUJ&xz zP9u^EOt?06*24Iu9J@5bf4TJvQHecj+{e>g-C`29i=I*-G+W3ydjuAm*iIl^$Qhz3 zQr4Qfb;%P&*p_=uIUpb0Fbu+V3HQ!_+8lq*PJerm-SgGeY)_q%`eM1`&eSM>tgF{( z#tvfj;R1hm?Nb|n;U%o614|1ywG)X&^6O$={+t`M8lZjlSBb>EfM7@YabAjgbS`(P ztmV=||F@##-1xJ!xOWf0t?sy%PptQfk*{*ULnTnL2r=~j6Xo6gUe6VOmX9oS?Z4!^ zpRc^5q?-9vV(*fTO}5blr2MrMRBNO=acNd2ulC`8?{>p&Z&au2>6jZ+;oBdyQ(irK zl~;pLqy6`%xkD5qQ++2>`v=$ee_SrSPpL4)mMt5XytVO_HXZCd;f`1UT2ssMyqn1F zV(3Cf3_=zDbs7_V^f@Hsdub~n&S{zW>J_o$rwhI;^JN#w73$UM8uigjIt4HS7#<_Z4ZnNu=3wH2@4f%`#qJ+&%)GH6I|WKhh!Sk7irI(pMvN$s_`PfKEqF)_0=*{bKv)ac#EU< z47U`rpBmYh*-#OuKsTV~99nGrhsL6eFhq_#lRFOR6^nZ{C#^8fD7XSjmX9B@&^`uA zxK*aNiONHu^Hc3b20f-Q2Pq>B$C{W3e8u9<;ux_8Ek zuQ$e>K*85dTPB`gC_);`U_+Y8h@nU$9^eZe!wHL*82KcZJf{3D*6U0L(bo)61UJ&7 zGR1kq#21#b=$1RxQJHZGU*_A$ouM5ja2Yo(+EL~4q`T?$I3NPdijEbx34 zda8105GkzM4m0QHbm*O6G2~MhA{+@WHw8}hW}|(?wU3Bl&M-%m&YO zx901zF0a-ilBm3A32m(SNBkTRfoOVFjV{wZ3Yf--zQSFS6)ofg+3#}goS;Kx3T)-P zod#D9O*fcL9c82(Gzu_eNC8LxqsylN!^YerK7Pnph`|N+IAiC{xs0_qU=Wsnm%t7E zQHbwY{u(c^a@$ddSh>Jy?aGvQSYp5MxmPE09(jPlu=TS_8}s|h(6=+nsX4t zj{bU4t~Q9__Tj@-H%vahohPTMeqk8$*ZjQ^za!V+R9aDso=a8QBtbAnx`LMDWACu* zdZBHFZ$*~ETSElXI~wlsm?H5~G-D&bh|7WaV0BJ}8T;QJ#gSi)d+eUHX)isxnoSrs z|8FGnmNd%W3an&j)sYnb;IXQB^@~ zwM*6S&HHaoa!zti&hveq=X2lJWh!esGJ-3u(f4cZ817qEg|6idDQU)p?~wj~pzdj) z0*9$nngXUI?GbQPhlYa;%ZTe@U9}5eA8|cr?&vmcLcnwcl@Yc8_~uJWy+$7(`h`sc4wxSGwL+U9ZyN#az@6l=^Xj}FtzOWG>PuZVG? zA_D+h{3rqj*@C)WIFWSGYF?B`6jgme!5Ad z4)-B73jh11w29Ee6B0)kK}rI-*ofiOM4LmVe`&mZXr{SCil;C|-XDCC`0fv^{I$)3 zZN;4BJC@g^X0SZb#|2~6S>+e7drM&fJ}Tm66~=WR=(X9{-JWc<9a>v{_i+z+?#Qx9 zcs@>%{jXd@Lf`-Vc0V7*^{CCLsa<>Moi=@@8L8ACdwpIhtM2iqj^ShDd>mCdx_*>` zs^O=i!rQ7nA@ho9xHnIvcaJlbVEn0E$BC?yz|Pg@O<4*jEI&|f!2HEn$K$Zxg065;lrpWzbqqP)Qg31tAe$89aLBRKEq-rV z^@|Wz<-~v$k@8)o`Ji!|MU?k5*bRNXzl#<|)bR~ksyQPD>=I!Sfo+!~a9 zA}U^$wW*4B@L@cCL*D~v!EF*2QO zHF;w`sRbX5t$aLThVWl$^zz;#bY^R)^8((4N}?dF${GGo>}7)EJf|Li)3%5oNT&ws zO9)GX8!JysqI`3qGG??|C#cFbBnbC{J=FTx@>!;;nb}1QwURtVO^>C{u-g3?U>>R-P4ee=}sa``Lf)_9{Z7uLa>hdrw^If{FyHt!s$aWTD6 zsL%~I(+(!XOEtL>Oe)j>AC5^9TMn6p*n5mBoI(T~25fxzAEAqMoqlR$PbmIpJi^vF zgyzqBNIlG5J3YQ6c)Mucqy;gDAEo3CiJ%6nm7U4AxILuGDB-_8yM#Ar5WG+1%9P}{ z5hT9YF25ogjRyHD=Fr&535Hl^MT_>(iK5JuUQ6^&kuXv8;Sb@#pztf%rVWb4+wG-YebSDco?>0FC-(QBTHyhSn}{D_(~1vZrZHbYO5by#$%-ShDfD|7_JHI`(} z0T_>p65=nq{12cYzCS5VvqbM9p*SVPk?FA1qBsh)FlJX6`;tl6J+-GCZnL|VTo3W$ zN_at~D^Y}d=yy=Yb%aD{G1)6Ud!wbSJ24@%6g*m%pCQ=YJ0DbeB}KIOC+m-8P$k2{ zN0@WSZGX<{?csRzOM;FE2P1ptSZx9>F*bd{Gy)p9cp0`1TSPoMq)2?%&TaAu5koo~ z6neAhJQ*$K~Wa^)4sEZw$5Lk~>=L-@wr6b;}J zWm>cgEv?cFF_Zs`T!K#I_1CT|A(l}QSg(w3qU)UlI%0-cISf-?3vp->09!-KD8V`q!-#I}>e5y5KXnJO;>c2YeK-x~2W#>`b5>$6ikjMQaJ|!; zf~4H%OPv8@?~)5{8-gJFaM1^_kA+rGeYS3OUrI3gR^7=7-u@H%e&2M>-kZzK1HOnO zmQqfNq7h0oe4HB~AQQK~U7s?UYO^g1q|Fr&IB-l_c@{(0tj^^mrp>|2A~LvoXDjSy zr69g3p||#D^PgxL+S?kW?$de3?3&C?SM8WvIe)fto!FNn-G!1g|125+dz8JR$llIa z^BdYj#(^g$IzYgUeJ=d+M;t0E<@c}lv;0T78ew@nrp^3j$xN_J= z+#`mP96Bo{OCG5)v#?`L7!A?`Zf@>Gg}fgUuDZj~Y`|WoO2)UZJMlK1JSdblCdl{6 z07O8%GwG_917F;ut5(3{|ClO~6;{IIML}j7Rgx6ul)IkJy*Z4!}18$aJ zHTM(7W*j!gOr0rh$6z}EljG+N4R>+jIvcjq3-VR~d6V%0yl;!zy`Ry`@{bVxX_Zu+ z60J$ivoHTga4S1Un)>TGnIRFUUZH5>61a1 zXek5#)UW#7(0|WN*-DILj;6MbXR90Ud77ZY$4l@f&WuOJ{tWoO`WMYAXsD%Z_>|Ju zXGD4=b4O~Z_>;z1X?^u*jpP1f`$#J5%z3~ols;RTZwXATtkCLFNvy^9iuvtZ)fO(Q zuz1tOWGa%e0KPh_CAngIJEa}tyw!hJaNUB`3YVRArPdv7>a^1ay(vt`?7vBBlKtz2 zM@$piU--6b9yeE#DkuZcaY*O1ZgPSwDy9Q9n){mR5**a&n z2TwQ2k9NQ?RbatTf6GZ1OHMwr&e`goJXaIISyn_S6&V8Y=b}pT)Q}%Ct*ISCoJINP z>q*Yyuj)nz-(l~?YG+_-UvETEL z0@y-E@o^so?4-L==9}#5vCw|HwNaJ-03{1v4gBrSc+tv(lnsi_%d%$6bat*+=k;9& zifDqBwQS763Z@$G;?Bc3`7W89o0B}rr6J-h9s3Y(atdMC%CBw0yvlD=-JDFwxaS5l zI)lPYf(EQ|f9f1Op`+cO)CC40ydS0?dn|OQ{L5sg>`mcl+>kE$7@leV%=%aFBC029 z;>N^_-_?DTYhU}_qI+a9Mblem7asD0b!anq6Z80&U+!rvEWZ^o zSAGi2GSg)!6`oV_^DUM0QzKmb%&`XZ3k%YgrG&P62NKPJS(`iLK;iGIb~&%tvw)9a ze?Id7yOM1zK6~iL1u8W`Z4%)(Ec1Er+uNT_?$CO1Vj#7GU;daS6OTS;E^iVLQF3x< zK%~~I&kU%rAU(jY<;8^j)&!m1=}OW|^1(X{nI=>bS!D6cr9$0k@@iswFz&3ulCNm} zt9&3N%ZV~bM8!FBBi7k#O*-PTj19)X%BC8I=MifWi_*kXM_9Ls`58q9AL=GgnBt(* z5sgGVGOu^nYWfPft-jwT@{SGxJvOhVdkMRrjT5`q5ycziILruNx1G-EjJ)=xx!8-& zMO8kc_34yQjd!f7>bxX%wugb)aEeV5 zUQTBQgOqk0 zeYWW|*=+1mHgt4amdH+AXq9wL5?Yim+pJE+It`o^uaM9a$+*^UBuKhAKDO{_=i=hy z%CsVNNPYK+Y_@KsRIxvR2Ii$qkrRHrYL~F2@f{GWF^Xv-Y+Vlw>dn0Wz+>-6vb%+` zVCF}lTXOSY8@C(Yuyw@KcamWdqZKFvKkxH04y0=qqN3&VVa1UZg|fsbH1TA5jfg3g z8UYelfR{iE8iwmW@88uBhm>EP(Tc;89%347s@G-uXf;O_xb!m=3|AqThb-B|8@_66 zlcQD}gC}MCePms@3a%;xdxseh|HfAf(zjy4z=!IyuZ50XL5P&GtMxl(P0B4RXguo6 zSpAMRbDY^xf%;S&d5AYbq6@4q=)V09GY4V(RAM-30y(5-#JmL{*|_h1}ct7-2F?w7#j0bSouiXgs^D&GM>e zj-cA`#XzAwOR6B-O&Y~&L`+mxHMif8Cn27}c2UOIbt-etcTq;5&rVnSGy-5DEeRHg z0j!r;wbH*k0(rx$iabW1)oISD)x;9kO|8|I`jIiLv#=YCatI08T@#2%?P|@V+~k2r zW!g(5Fx(erBDeDq!Hj5G02s#XD1Z^+NiSFC5byhIxh#2WmX8p2owBGyXj4XV>Pv4l*lyZthv@PD1OY`#W?{ z94HgkY5Q;M+n}`0bWR9v`^C`wQc=#<%q0`$3uwmueo(ODM&ShFwIc8czk(?P|83t_ z#4?X{qy3;Yv=9^IL`QfxDEPdJ{P&?h#>Z3Yw{yPx-ZO*pb2X1Y=^Mmp-xm&Y5@KP9 z`N)5wVy0?gOA8s-9vLul-;M8X3$EzztaO#M-?o1F1sUg|s-N3Vm%V(ZkI*rR_Kgmw z`{Md|_RYCKiMe5W$0G+jVq&4~4+$^X1%M??u_ifIR5_6mbFB_3xK6%mDLU08JS2P* zTaJ_CHz;IRkt|Oo?*emtoO_rXp>`j}alLOqx+gDRG}-7I(Qd5T9#6tm`)gNI-1$$- zMsi=zB+?Mr!>s%V zApa~Um}aR0-bf{ms32@J&Y(zAKNp$8=0lSbH5jw0p=YQf*r0Il@r%rgw_8gaQqVB9CwUcG*|#ny)4ih3_bNHUFm*NGQiR_V zB~1#%G7It%;g`BX83jSIMYSJwt!zkxz_4`-QjwyvKl+ezRhV5PrC zqQk!Hb0}WbAt0IGZz%q%`0_3qbj=Tx{xsqvzM(aBhc@|SRlG^vij3|s$nkJ~Q~SGI znJV`SGl2RosZ>h*ULK5qt+Id-puc6?Md{FXofVLq(@Ntr$QeE?(AUK4aohVJAWxz7 zE4u*MFRP3ZivIo`UE8-#_Pm@gb|2byP?4AmsbzJ2m)y1IW%r;DHoLf`ZHuX zX-C}8J_0>t-KdAXBR@))&a*_KKF{;g`t3^#3|=ME7`~h0f8O%)hwf4PEP1|oOHUbi z{htrZRQ{m3!+U6u39@xmd`c}(JdcB>OGffcQsWrajudZqawHgQd6MVl-^u(a)mI6h z#p=_DSJv18mqp%7FzU8~E>tBAGvEiWnDyhZ__W|T7zlGBcrR`9 z;}liN#@ysu$KojVO{Er?XC6*vti)rGJqiz_tPBBGTx$ zGRN%AKdOX!eyL?y#!Ikz=LLTp>W%JVu4YT$qIA_o5;_V|OqvU6|{$hVCMbSZ+!XEt%C z&98K>`JnHKjF-)RDBW;%LIznrHg&v9fF;RNJb;gVqP*Vy>|str=RI z0D8Ro1k1E-7e~bPVY`6y0=!m`X(N9Mq9F49U90cF%20a1`Js)y(E9iFB5g6E-6+npSl`GQ;<`$7D zL&8c7o$@s#Oj$q@dsiFUbz3=x{?nJ!<#!XqA(pI!=(Lwmxz2@LYE81)g2ugy4~bM z-Bad^v;5}oe;*+?Pw^ihN|9v+mT2!S!LtL?l3)1gnJR9bm}n=Jb;cdaYj3a zIkcjWh~v?09wz7>V8)^ez{>Z#%$`q3>MXb>9#Tg7%Y4hgq=oNxi4X2uW|D}^dg0{j zEMfoVQAUVti>q_F(DVc;c-K78f2>PPFB0`bINkbQu-7QASJSW{)F|jX3^ylBi4hHE zxK0n=b<*9joc_tsT3^eaJ*9Ri$v#)tP|Tq)gS}vg@BA!dtx85SEqp@gEh2>?pLQ=o zUwS*=OWyr5pbEQVG$;3sD0L*(qR`yql%U&|a%L?!9iPA09Y+bBzgJwzpAyae#@izw zRqy%8n-G;4ma_xRw%^Zzy-=|W98tGU9WhKygTbZemf_(a*w6uzQ-oBl|wj$ZzC zUU?!+!!d+UF;9rr$b3}UYk#BgGI;I5{EL9YWe!gp=b@0-PvFWAa3%gBt_@JWN?h$} zUE91|R_#+Gn3%vwJR>cneFx8yJZC_ z4zT9Swz#yhX0*(_toSv?lL-%0JhYuqJmA%Vj$oK!%^>FthQ&@61##(t%s%dm8k5u{ zdleYc5+Y!TXvbxD_)?VbfoY~^>yd&p#cXU-czjQC)COefPL@Ea#tecAZ{SX|Y$vHY z7vp`HJrj`Q_}o=marTCjJ{iw6n8ko(Gk6m^Y3wpX%7*Q5lIc1;Fdx5y zEM)Txa(1zmiJ3G_=?d`9s@Wr_JFM(DV5v44p3&_GGz8IrV-qo{DYbSYE$^5m-faCg z`Lm4DvDnkRrEJBUudN{JKsD=O>c<8SzsWjfv!w<61BFvk;XyQj5$AyA$~~!F4KAMX z_P_2~Q{9NY3~nr*MNOR}o7}dC@6~3{jK*CY&n*|ZGHXk$ZbE14Y94Ape#$ApWSFJM zsLY0?iDICKXd!H_Dvsy0SiPrRv`IQ0xOH&z3}4mD1l&{Jd=VTE2J?#Pm(FaIMg5L+#_F=n!%f( z$XsJ0zOA;EgQuZJo8stBQ0#JDJvYb&{-;XLLzx{O!8Kc!bfh%_fKknrPPK~+b#vo` z{JdD8cSa~tnwyVR*EHv#%4~PY43fQ{gRF@>6P;%Z>snh7m^+=^k zA}k8UT*yE!=fgCK@y(j$X@d^l+)+?1Le6-_%Q7lJ!0tj4p-buO*#wYCMh0g^EZl{H zsK)p8m_mk2$axivAif<}^0JJyw7BFY9<}BGzBZg9C?k7+q^!@1QEQ)(_wl)GeX_Q) zvd8HEA)Kt}E)@kck`VQYSj_q?s`fU1P>s?0S>>aaeAd8O6703LA6n$TcX62g;M|{5 z>v;WkR%yjmea|TeB>qxz>Z|@L{gA(txWt&`2fMGt)R9;iT>XtMoWkfJYA6QC^-1{~ zuUYh-GfuUu-pyMyQn7!ufoEB()29^6Sa?|fGWiktu3=@7>CnyiddskK);-ZMsDn2D;aklFY^9)C z)V_SML|8b?2dsiW0xB=<*hfEB@K7eTIJ4eC{9 z9P22ojKcVNpDbX(?Pp{e>qZPu-XM^vugVcM;TT;T>!iyzA7ZZ>X`brV31{A^Q+L8o z{Zy2i4;G%Nd2P4rE6uQ8;g5%iJsXE%TzJ0??)bnQNbs6E^ z__T>-@{|7n^iNI=RcL=Y)fEk$KB`x_HUxvGf29rh@1%A8as7G9gC$}So5eh;f{A+Q zt(Gucye$&u{Qm3F^A!y?*Q~oV}{1`{Im$e=dC?KxEV;L$Cq`M&}6{?(9A! z3w0j`d5<|Iz6*-5C2%p)r;IK&Y1cSb0Q_zr<_c5(f+QUG>K0dN0np}jJ z%PrKSsv8Zt!0)SlnIFo(`w+d$p>F{(8WzytdBh5(_;>b8o6Gu+`JVF}oAy5>v2;VJ zoAOG z3!Z*Y)%kP2ld7+V`F4QHYZ$KCm$xa9`a_j$Ezv^32U&Y*fIFIO@{f&!Ualm;xH}(Q z$(Gx{XG=7u?;k#xYTO=rY)a&Aw0S6qFpQ&@m^7J*r zxm?7~10o$oYgUOaJ!6V9Z()|oOY-21K|wTTMGefYHT-#q&s8bPV6W>KFr4$3oI_^P zikp9DiRE&Uu?tC}c%ZCcrxU40UpyvSwXT(AHLE9MMz&ew4=d4UQ}TR!*E2370zVs{ z(;zx#>9Kb)ka^lXUmtBIcbyuG=Ls8SvL^z1?rOI}l&tQ+GzHMa?UE7gVWHA@9SW;lD)8fh`2g-h0m^ z9x1<(y=UB8>KCC`^YR}v zchhH~vs!Me<@kU zpdnV;>+kSK>Cc$h#|(Nhq54#fJn;&Evy6?8>+Rr2ijGw)$T!1D26Bz?`1rQ?py9=6 zQY`9Qyx!l^dRS@O^kB#Dmc*))HwRYrG4!s&VT54#pK3%-5%82RVHlgY>b0Ss=g zCOJN0&s)HJorUDnrNz|(CMj3zo263;i4$gT%~fXP>Ltfd!PSrvBvluE7}r8&K}gqo z+CWk=KY!>_N(5(ZR)F7_7!OtdF$Qa;QJumjSVS(MF9_ShEf)*xAUyi|Wx2OFK9z83 z!iBoJ4F`qTp_nH^9RrK>pUs`)mqKcQRiJg?8PcF!z1FXgBxMZu`@CE_hc<>`?M;7q z_XVzGo)Lb*4r|*UC(U{Ej1$Xcn_q@gAknYhm^$@mh zuM0Pr6My}X9M^eu&|9-pclM8T3$gS^f{5dVxY#SM?&TP6xG;S_{+fjCvh0B%D_(pf z>zq^G@4mmU0n+D-0bDei^*_s_^0>fe`}P{ba^CZX0^B+3nZLdcR3Q4o-s{7t$I@>l zNvGOo?AGMYi`&-fzN}aTZM~>OKWg}`esf{yP+8oY9<+JUz>mg>zbqty%&35Dp$2s=h^Pnm=1?@#T+Ul#vk)Oyw9YZZ2~GQsK+^*-J??EM#V z*mQ%Qvj=3?S>J1bVZ=fSzh;sIIPNCm^CE2RdSUEe9@hByfAvuSF;>Q|a0u7BGBUsk zaMd)4XantdRQ&b)yNv^@fIdnlS;XVm!}%hPLr^>0CS}{y}8W% z)nx53^B(|vx%^|xOlGeBmc&!a*!>i?qBqlVoT^lxY?680L6!6a^y!!8(a_~(^KxK& zK=?wC_m1E|Y0S;j!THDLwog0uO{5?9iIlvw{O9Lqqf~GG0r#n3RQclqt-TUh=X4+= zcBDG+ndV6yX9DLp@i=X~RjgMyK_AO{RqK|t`H&c*+oz4My3d+PD-}`rZIobPeDSmR z1q{|Ckm`?MZJEB+?p1qCk+ZGj^U(9-=a`j}ahkVqvcHc-2kP~g-E4ZP67|iHS@ruN zuc?3WzUK7$_7koL!3z&>WVroI>R+?uU zNnprZbr29UK`<5Fp~r7%U&jZ6S$EBXA8S+<$6er0MNcqfZ*{w*TlZjjpbOG)uX<)f z(N)&|>>+n*MLxL(9X&fm4$`ZG*VEMo(T>_Gk-d={6;-m`J1!0TV^gb*QEQ(sCJ;Lv z5XXBu-?>NlN{y<^x^2D{7SkX)3&t7#ePgPcY1t@amQ7ko5+i;(T z*Y}QY0o?)E&oalRQgSdi4JevSy;{P`Q2saBmETvDq1srCkydZoW}+fzNm`ZDd^_6| zt#E)2LTHpob+_8haIrZuMwdMm86OY-=a-+5w|NaGyOyJ~n&q{fp7*de8t~hG*G$Hd z%u>%?mQ@sEv{m4IG^!F>9oSaO?p`~aM0|42)kHqIXVgu^TL@zSfly=t=h90@1)x)< zuR-DZbbh(%0zc6*KjlLClb}~o4V;x?LNx`m6gDn@t^E!Cq|jg6gV7={T=CwGs)y=E zuht#)Mi2kkq=e`lyIy}g=hfLqj{IHAJ&-)p7l}L{=Jh9l<2xPbp$rEg1noCiv=#IH z@@-$<)4wH%K3I9Ie3)Qb<7=1EDST?4z_r~QZ%-YfVuad4>fqBl$Gck0h3xW2ks(zV zyqi{1f@Hn2ykzQ#hOQ$X7p35`2Rz<_+%JcX7?_i}Np?->5GE;=TVT~Q=LJ=}1JVNq z4AxY~%2OtIX>Ln~^?3VDZN@qCEK>;I2xf9hqlP92mJHa^#KI$Nss!}6@2|s4Z0~nX z#8J57-AK8NN%18f5i>Mt(t64>0!g1WMpcD~Qz`8B(S8VNEf%yHcq2D0l_4EW9i>&2{ea{)*z(m9|Lp`NH~qQgy72=P?$pS?%gCTZW&trWL2A3IgG(rp}r?i5k=AjT~s~+`I)1ZPu0` zXHAln{`mY!e9>f?N8v!6;x=kXs(?sv1=b|G3OQrzqYFs0zb{BG3EJ<%II} zs)7%-AJ~H=r1Cc@#Y8jKvuc^qT2o3_$EHjZM)&!)HzRF6Sn1G=2LQ4~5cdJF@1ufj z6$AGL6R@NRE3*DkjxNBAfT|uTEp$2d44`~xIag9dtUg9m`+o_My;#O(U<6TGbv?E3 z0291ds5SL|E?O>4l{!!SvHs%8<)r12I_Oa@CTZXn&b0%D4G33p>7vV@h3h5LTNKoRlOF7jq9W z$1aq(2X$u^eR|$dCH7k*R0x=H&eGA&iz)dNLf7uh#ADnhW7>su&2(DLz%Bk$V@^dT@GKSRvSX>sCPet1owNmV){0v=(>@Q#{ct`0x{FkM9` z;KS6)Hknd=)N!gpOd&unL6llMV5Rukvz;f?7KwtLkfh9cdg#qpHxW%)$Q|3C@QN_K zQ=H8VpO5J*i4O+$!wlM2g)x#>)&og_$L55y^oZ9(_V;{RH%8r5rx%dy0@Cyf1amiY ztjCJ2;B}OY2Ga|`t8UUV3gSX%1wq0X(NA4q^}B|u6e6A#jGt){f7#q?|4`WkwPBU< z6lB(CiYC79#Ne>^OV0ZZbFB^4(PUXRySgPJLTkFjU@ zDtOi(0%q=#&+i&J(uf%~{VlbH%`Ohg1m2I<#`3QVO`qF)&Yck)CQH5LsBl5vTn z!GfgSTlF*Ta!uvOs3fE(hZnqDkRaSI^*)Vx#V3Ml_P<@_x?8IPWKWCJwvc$1`1!|$ zS!Ht9)`aJ9)>%oi=Vg?6^*s_aF=3PPG8UcV zh-tskiVe4)j07AIL{Yv^h8^G0C1H7`PDXKm{%I`wAlhT@5&aeSH_IXd9&VDC{x`3_ z3H97x4^7*(VA$#sx`iS}coRmS)z9m}ehOhM)4sCx8g9M$YOJ4$OC+l%Uh_Pb2889hX9-JA6ub4KzjAOM;ml z^zEsQ#*BVD+GiORlp$sFq)uDdw(D~G*qKp6tqk?Fkn0(ufur@{GExPi<(S?i*!$pV z(wMFs_dgMo#OQ#XNVj5^kssaD(6t22v+POaDV@p8P&;qHU&sn`x)Tj|-g+Pnp$Iao zP{~3zrpuGM7dlewDytW0t}4{6OkQrtx=CqJQOsF;!c4<^{}nJ)C5`w>#4z#t<7N?Q zqGI1U?xH5u(@h(fhIlgk)H=-*)?_p*Z?G&}@gxD1*%#?C*MUxZF=gNBT;#{w?W9?f zh{gLWsu>d+NDWooAq^%W@1(Xg;3PcpU;e~qm-lN z^KthHKS8cDXbrjVqI{bS1C|*+zCcb8k+C-UKb~@XMqFy$^{57tpqK0myTqMLilzpL zNt?cSm=_o-v~%~x=}|7K29vv(Fz~633wQcfq=&=CeOi>YXo{x*GfzTkxPMU}FY*3; z8~TToHys<=jNq=rA1yIaE5lx>^#$|>!}*Og=L()SNnsLWrdaje_=lWFy32AniD896 zP^hF_9OE}CT5ZUA!>X|*tmtLI3O6u5YjB}~9SI6PtymfGJb*O?YoKeAi}$79j?F$C zlNnfaW*eSAW8a^QdH-8g->H@_OlR*7_{ZvL3MbFpCt>fB$0jOhu0h6GmK0LQTR!{<^c2N z^^23(svI59rl(EZ6T1LctXG(303Wh#=V4qUAk$dg1AzoI_;B{kz|f!~_N1oTWyuu_ zy0aBu^$0S8p#H&xYh54@K$}EAdqr0%C^*QRXGM5W;k&aj5iu6M5fK*bK*6C*&@(lT z&mCwFgNgAAGe6I=L+B}T_$yL^eQOmu89evcj52NFOnE0HN2Vl{<=y<29}dhtt$B(& zyY+i3|27M6`}24s>Bq%*zMp!3t37FB{jaN}y7lAp$|KnO>0#y47Qf95u1|inHtCS^ z9pxfQL4Qv6IiQ6oqX8K~a%)+Q9kk8CU9f|YFa1@rV67jZlucbhmU75Ho{xybhr!Bb zcYhwCAx>%as`ko#;cW%c8H()sSVJ{qC9fZM{2-%V0q-@ zF(JGaPz$SN7O*jk4yEa$J_IdXGJ%cPZM$}-ca3<2egK1SUXbeTuH62eMT+x{d@`tf zF}Z}Ny>90y{c1a}J$N6ywWqM4y4~^fKftS2^|5ZLNWLEGgX#7w78NKeezpsKXEhWh zg<75MmIj?kM?W$5Yb4jI`i)l;F(&~ZIssC0e!?Ub_p{1sA*YC=y~q-qcN5mF290>pwlIB1CpU`^!iV0g;GU zm|;xgjuPEdCl}&%?^bGRz$BQO8;R4)MnVU9MygOsa$Q9^ZN+(&%&Fitu<6ypt(%S!!E3x~7ZpFV2zG;F!-Y7OP^`o*Xc>}TFe zGDr;zWH#XDUmIG` z*DorNSj`Zz04y68h7w|8?quChbA88S6#@T&hYPR9S>}&FNJ3-Oq#+9l#t$4qcTKd} z-kTDT6#$_N#oDdtz^V_5igg?Zx?KT-T;&Zq*(wRIdMR&gX)ze;;popDsXKVv5fuTvwog@qfnH0o?q0AMe(voF?LfcGQ z4TwCVUR!jw;*{ofcvZs8?_P{{k=6rAJ$>!P-({p-$0)xF*#pD7NrSXujZMy)dfFQr zPeAr6C%DE-#f7@X|3uTnMC%mqC^kq^2*+^H$sXKiCj35fo#jVBg?NMcU7nkVj_(tL zDP74@ls`g&57b47`yO&x7Dy#XDu3RBYsETitY=vV zvQ^EE`n3!9LUbKDbIjOj=D;J(NdE47v(PLnQ+dL5&Nqr1352ZER$*ve1)e1s_=yG< zQDpF{&qi{3=1x{}i&HZI&t8o!XK6#L`CnCcE3|g~K+NM1J3_*K!ivQ1`NtXwXg#_n z0*KZj9&a`<@Ih+&2gXT48Ih>Mu=ul=P)rCb-hZsYqXqB%SVRR>H7Ap$H-H1CNB~BC zjO2J_v1hzHfVQ2Rl@5k8fl=^0$86v3IZ(S1h=tcAy6S<4sXx3;4gjp5%kr{84O}lr z=HX2@3$0Eif3gx$odLZR=PWBM(4pe_8PQYZ{;rL&OX|1c8ehOR5%D=kSdE9>ivZyV zd82~dC&<~ngm#{ngjEVcQ$NBs@f@x+kPGQi#B6J!mCY)Jidz96Ou`>#MC$4MZY%rz zP}>E1<=`O*L}>6sOI`z>pI4268*$FhZ|+_?tp~lHBO#_;Ju_0G#L?7^=HlwP^5mUD zRDRlgB7z)|@XmE_Me}?Vdi#BZI7n3BtzXz(y;NbUAl?dZWaVuN@*c*AE@g@)-`l-d z9_j+T+_xAiT->FHMc+uMr?+(I6gJ65RsX)Pr4UgS3VM})on31BiE`WjAWrR@mU{Z_ zc8ReM;t`ozQeELag1g=Ri*iOq%%|YpwV2kn5+>9U1!1qvbrxB9kE?KYj!!GR0<=!BYstGY1+xY*(nt9@R!A4zmf;74 z>+>>ZNjk7Hm2^}g*=bG6YEvVTccc_0%sBA3esC9Ex4ixwxQ?%2 zzZ~JA`?BATjX3hmi8quurR^*QTXxAjFf?YidQMeRT21_}x9COaJU_5?so($~9>sG* z`1c)br;GX+6^B9Ao~F?=hCarm${bu&{nuu`t1wHwj(7ENX=%0@22`)|tSj%1D#dv@ z1)LkvKFjt%VAk*$4;M5V97SuahYSmrQSZk@o*8&}rsBP{wlrT?xOfBRa*gjI3U|>>SR?izn*k2Dz|lV+*!#{RM5Dh^d!{0z>Acw?ps zg#S!@;m%Tyv+wbG1t+Dz`#0DsyjQ=p{s)LvSvfS`P@Scd_z^uC;1G=Hc2f>iT0|7s zd`RwmJ!glz=BlF94%rND;XqY*{0HFPJe#dqzhL#Cy1*m;1zm@>q8c7&FL#|g)9SNM zQfj9O?8d{DtT~b|)}voC&ZG~lUmj`%v>8WdoYolWQs6Kt|_?Jk!4Do71J@Y8q8 zoIttk{;|#U3+miOj_gQTFxr8~^8z&1gW1Ze&cUNU5O4$5X`=ca=scs@ zejhd-M1vYN+8VKAt6C*?j1p?^s;X71sMw;!su7XcH6v;(ic(ayc2KKU{VH0-tW~>I z{hvIq@+#-#e9uX8-`DtD0TE{xb158ar9;0!fj7d%j;k}^2XEPjkNyW}{tp<%tfRvz|v*X!>F}GY0;);ujtc*`Q)~?jL4W^K>IR|@6*YhoJN1no?obOALXZ__ScKt z3W`(a)tg2<-%=Mmz0`9u4KQ;GueD@nU6MQD_1+U|O0MSQq+p9@X&V@;gsEfaVRYjv zT&R^8&Y+@#Fe+0R8Bad91OSe(Er6R7ql)vP`(lb_O;jik98BSIY-5pH2 zeeJ{d59*XnReY=0ssS}1P)FnknNp7oZ{T>A)SUng-<@XY65?+g-us7qsNwVPPsAp>xD?zX`0aZ z!mBA>9WA+pWeIWScW`4O*+7TOzP{kYWJ3}M8T=$flDiXN(Wud!&%;$-C zSv89Q4rQkqN1#|3l3k><46llEpKa!r&K;yXPcnL70Wo7!+K~feXLYiqX; zQ(PS>pk|3L+Q?Tk@go;g#@x~hMA zf>^jjOUsY6YgxeQqXvM7nFeB%WO+*Ia9WaS+9!~Y;>FChxRpfbXt2dw{&3vFR5iDtnEEuEfG7R9DmbL} z)~a-AJMY+S#m280*_S9ux=ewFPQjR9BDtmr^*#}*te&}j z0KF&>sh*}I1z|~+ZeSit!P+NO;J))`Ny_(N6E>OlD;m|3kSOIItwKTP^!vX3JeS+6 zgS~XN(MX)_f4V=vw4R*C_O`S4#VpP z6*02B&mPdQ18%T%8LDQsajs{v3BRBj?%|jlkh4zY>Ryjkyoc5F*n&+@hC^h?bFuz| zVqh&rAynSspFuN4cIT}_{LCFtd&rfwVayVN-*L(qz}&I>J(KFo^yNuqKM@c8<(-_M zX-Y@AWIoYG6!F*F47Td_w*Ba-JC763+Swfv#>zb?@}plv3{Om9T_fzPlOXs-1%rFN zeK}N%ofz|Zh=iW`^)rr@5jXXLwa8Fny=Y<*>ipn0d}At)4YD=K80Ez-H7o%E?haVm zLQ)=S$!(1Rn+$uF5HLn(GgEvvjZV5Y$*dJ%=Mu+B*&KLDsUl+Y3EUiivHB8hk^%F) zs#DIY#(emd1R$*z)z59yRr_cXWljY%<=d2mA!lGEVq#86YGH(HSw+gG60bRz9-&I! za^$TDIAZwP2@vuBe_4-ZJ&#Zs?h%dQXawOCW2Ea`5)qiG_MH$-`lFVE=#$u2Rx?bjifsts= z1PCstbG5+mW+03)rsyiFdR`g)2A6lXd%w4v{}9Bn1MWRL-GUL{Mh9VOMXB+!s;ftq zG@QlrJ3i@5J%9V!I8buO-~d${wiEpZbm?2+=f<{UkQJz@p0Kla<7l&yzp z*`mS(4S9qyVrH-~qn&StDc^Fm-yIW1V0@DwA)4?&u3`1g8R`Shh|8Q3^%Ud+aZ)IJ z`Nr!qYYd@ni{&kl)sWju8T%%&8y|{?VK(DYo2?`2-)uV;b1ebG;F&HaXPo4>y*LT0 z35P7NUlHEVHO`bZ+N*Pu^lZ|g1Qtqm>8dq#=BrfU+-X0V1`p!MgM@wv)|VBb$(6#5 zzw=1<+}!U*rEz#)Nd01Lk4$7J$Cf@TAePc?M&<&}St=1*wrHQ;7gaz$N-{b{kaa@$ zEC|h)oRBhmep@1ueYH>GaRo?b520O0dv6~eWBJ5v;;$%H;Q zjCMj0Ip~^UzmO;8@(P^GA1VE5*15{1?|WrewMn(_Qm)+h|~iHl7V65UP1nZoJ_w+;^$%<=aXRqw)4V*mr7G zdCafk0IuuwehF~nqPbZ+lNe0*^R8AH#(Grf>66RO&ZCD4)}#8)G|-&@FQt?$VUPQp zFd%BGiEVPYz1`q5c3y4}l9C-rAJRR>#NP3?{PmbOO97R|?OftFa5S$Zmys%)gVS|2 z2>=wXEPm%wAb9w+)`81`=<+-}mb&ON9(YuOEQ9Z8bEm#rjsM%~+pz=RHQ`ctdM5|A zO$4w^rQdq*w*jV9zbk61Gsmr6I>0DiUT%)t|hOnCWmOI)_NcX!&fYg!Uvt5{D77ZuGaO@_uUmt~f%B$&JffStwFPU?TvWP55f0D{ zdbm!NeQkLme@^D|)eLQMmvPdem!$a1Y?{xXaPonshkeTe;t2z_2j?)hYSs&sNe}mXx*O8Xc)EPJad$S!;ekw4+<6O`@Li?{*)>X z*A|8K4UDJe=lVwu+``wq5*~Jsnxwarua$Z^=s#We>vg2orpPeW6i@_k$K#1=#$nOl zg0W8SF4O2k8y+|Q5RQ%QAMtRmt-q~l`s%$8GWIRWL3T}>s@9eEmL6JisPX;5cdeM| z4vk)%G|m+9XKpy<4S2Ak2}Q&A-jM zLZ+cUoeCo-g?M|`akDiCxG+!t2bomFid6Y@@b5}*!@Z_)4w)YiqsVWU}sGJ;>j{G*U^K#hxd zRf<*u@WE(-uz8g+Z8L6NLhb^-R~=)D=7mku6aslU-R04rlPadWgJ<%1wn&8JKYLW# z<2%d_e@hgeEC7LT)$L5igIl4g3!%eg%x^XH*Jn)$ITLMKuFpgsmE3r;gy8-7@S^CO z>--Ty75r{(d@Ry)~*W?bm=9dnzt^9H?xc=AIdO&o+YgiYr-Uy);)3< zu?x#cRa5j7I2r>KWAgWu-$(__6RK+B1A7k502YXT@;<7phx9Qh%RvZ&jouHX8w4T0 za_t0sFC7m=0yH})q$v2o1be?;HT_=_u3isYw)y$L7rO_*?vTIW`37mvF7|iy9cMb! zP@w-?rH#h-qN_(Us|PynEy)v*_!(v?c>)y&*XTUV!Dt8xr_mR^R|~; zIXvvNy{M(4w*KCzvfKHcd02X1b^vXy5S8U;LRy7ZDf(wlGK+c{d`Z6s+$dk z*jQfS>VaZzd@BQnf}fpQm1NeLcB}6TMq23&laA8-X8BxZ?cAA(7;G^`Jk=gIyoi$Q7vlug!v?NTwAv@t^f7&YY0{IW*EwhgE}%3@wXBFp zedAE2B@FJW)uvx))tRCkuoqRUTuh5Jy@|(oyal3ME{-4N^bAP}u$=JNUuaz)Z!CjaC{_wgAmM!YHbc z2xi^YCQOSWPjr0gLAw=tusR?rfO>23!LU zZt#Y&7U!$rVMG{ zZU88!%=%K}Pi5{)h)SO4&+{pII%eo|hcZQ-{wTF6{X+Dk$zUSKOP796&4gKBdhG7u z(SyKi?P8eYiqX{MkD*)Et?Z$!9h_Q`>gFxnGf$-7M_f!bHr&%6|M<^aIk4bHqwy_D z`AJVn=-+Pxl`&nERH=Y4_;lZdK^kVJOQ~fwDCh1P!4r~C4-HSoVDjdj`tnR_7@TGo za+XQRq<<0&`$4NEd4RmboZ#qz` z2^yYoZm|J9u5};I9!tO=e+U&mbXws z?$FRU{hpWG4Vr)6_1aBD=D;7vDLQSwrv$n-IdUbm)_*|50Jn#quhzpY#7?MBQ#Szo ziwY)DZ*s$SNB%K+z)7AISCUCy)co2?0M&X6N6P%}+6TnLm~Xi1T{P7%o!ebD!)}0~ z)st;&YeVBmoT;Qg4Z|)CKW^EWRsbx2yrlzdkYJz_Ymg9B6a|PT4!b22A<-N{>0R{1 zC5aR@zJ=dvCdv-|AF^0-zYE9jkt{tpUp+;+{fc;ZW}rQnzoEdrr*B*v#?ig@cAa(4 zcIm99ea7tGTtm#zxJFH>!oUl|+5{Qx95s`>Nm!P?_jG+=i-^#TJu*6nESDP6O4dKQzJJ4j)iE-{kPMVW&h0&U4Ms#kU&dj>L=Ofs?xt>%A`32sG zMQkr97BXAZ_jGd!*UKl5?43UX^L=&*6Y4v?2Au$cCyV3ynquG=mQVFy2%PCLQ7{za zA5F3pX}W#qh#gHON7XaDL2*wqmx9$%MdnHkqTQqikY@;i#X^DPKMbzD~-B2EE5z|z&wNt8zJ0~arA3<{4bc9Wo) z*;h%1I{ANu^_jiQu405KP%J-omfT%vJVPyPn1I1?G0uL4Rws+=# z%fXf}KV$~Vnu;CHb>mVi$k{P|AgNEUnY|yFRO{cTjGD?B2;>UT2ho)L4`8DhGmyUk z1!HX3g>JqIBhtpVe)I?DHj^q%v>j)h##o~3U-lS`^R;+M0-P_89gzniyR@eMDj7KR5r z2C;|>He`@?M||+W)07*_y5i6KFQ#;w(!3>!!P9EVGb3+15~CfLGEUU3=*lXl*F?E? z!xwq`Q*w^QwB|}*1=(`V{c3`&Yhx5Rv_FD&c4v8&O8cYU0aW z-dzrAp_W%F!u95)alQWN&vzok$H|Uy1M?5Y0C_JC1{kmTU7cwrZJW?J`imF@&87Pa zD?@22XoTD{{-7qWTfVy}ahs^1lh#k`e%w(R*9#|tI#eztUD5FBzH~Fhn4Dwc({9LJ z=s4{Ix31B(Fm<@xPrOfDe_c!*$=w+N+tJfBE!G!jbMN;DAB}s_3%z6hoXla*u(1JD zruZLtanaR4!^0f@)kz6>YUo}OxAbj_hf{Jipm<9PB};zp1`iX=b_pko#v!vwhzUie z<}#U`8nSS`m91D{9U9RddX+sbIcUcgvCe0|2Gpc+j-bn`WmU6}8A;Tq<6f7^kH z!vl3bI4p+^+8T3%1QXo~W?hT)=H8QEJRd}LK5TP!G#<9@c$)6Qfi=^4rsQZd?*B`a zT^7h9dwhH{K=)OR{n20>n>_#062Fm3I;ll9N;v{I{Hw0V;HcVvP5eK{|Js4XmJ@;1 zzv${t&f%hl4^^&+_!up2;WrXHYDS{eymF|2KdbL`X)t;Wd~2ALSqK2wEZGI~W)MX} z!#}+Z`|x;|XmL^@`WzTJvD37?ymA-303$T(UN;l~UzW`^_Rp-ws|L(;m4B=G3$9fl z8Y7P1=4F22&*Gnit z3`TY-xC$}v1>`Lc-Zcg;#K+HHwE#HC`1v6Yz|VIZDir}7)nLm10tb7~7G@d-z*Tfk>ES)JsGVPHIkSYXKYw9FQ{!vqV#^xOU@D3OCDkn3CI z)AoHByiAemB7|TODyax$^b{_d))os=h4(UbOdyS0n^L4}RiibJSt;jh^YiOlu)3f& zk>cd7?{Rgmj!Z>i8)9>bJe+O5VBRi-gZ8Er7+Z#q%$lk;D0wDhszb)y@Zpvb%Lq?i z(c2J)UU0uE{l+v=ib8pK%dHr2e&Lb$9{?tm%JsXr{eA?0h=hQJ6HB8&;vt=6^p<2rNg}lukJqDQdTd0xU(@lLtgyk%nUO0Idu2Zo;5BoJ5CA zSPb$vk_9>W`du6|0)`$9KrsMxKqRRcH7l67{xA9yt!4Q2AW;U)$*qUlOZV<|FJ zC{yqav)p@nVZhSl%KgDz$LElL5*pggMg8BKf67D~Q-dhx3D>u(U}Q;BYivOB1HPQn z4Kv-@mW9SYsI&5?&x%9dk-1i<+J7WAyJUwBC}@m?8CMBJ{d(2m4c32GU5_qIP4Gw! z0C}x?ev%+LCV>zrzAFE3Hxd~*8#tX0>~0yZe3D4kJR#Q9XH6nf);}};^r(3AAD;@= z;q4{ln8S_PAEEm-XGcX0c>Mn&k%}2A)63r^l6f_gtSk-{4;%WKL1VXj32w z+$}?y?3><4R8A4h(CvqYuQ*Ayj)xnZqB&n2SbXKqy|cBud6K3N2q4Tl!Bti`)&y{} z%6M9eijmRh(GZ6jRcW9YO4$;-$?xUR@NxG9JRwSpyG#g1^m3&9gdRg4%;e+zp+Q>coRAi5z9w13 zN`->3$?T+8(nhDRrTy67>~`})6@SD?lyIRSGc_FPWI@M_ndx>Y)-ZHQxq?}*)paJ2 z@n}$@pI$dzDRx4UN+6x${jitERghz&5WmAVrbA?ZAYSoKW zJpUb0-=w|ssF#L3%^JiS4N24mHydk57^ODTFSL(2Cj0a|R&OlS>qxF8 zY@7BsUt>_12`U+^5ybuASUuq!+BIyppNlXuI6AN$dp~RRnidY|Z0Vn%f zv1?$|OInC}7QP69ev>(W^;t<}-;&Z2+&e0|;+O^|Y!?MrMWT&X2IVGv;1Dfr*_N># zXAp*eJVlM;{mnwJ?~>YrW5h2o7K_g+zs!sPd3sdf18nP^`Igj|w?wwBA`2Xo-;*+C zCS7HRXG+OfiHac9qa2pepg-m-9`iR0Mh*B{-AOPI<7bB(Nqo!(G*fA@zm!Y+DAc1c zAZ_?{>%0$WC}<|QqFpXu1$a{7;;$BOI^e5UT~46|v(Mb10NU3JS>>P**L2on8t}9O zAm$?QzDal3ffcn1y%VUCB5ImyFD%?6lp8_Mk;lUt+bB5}-f#lLMoHeuJ!fTF)4f^X z_x@(^3u3zJtYEWHSfB(}HAb^#@K}@vvbX;*-i^+2SIePUMGugLkBjYKAjD5-9_NdF z{U6|3+g5?!V3{9(zQ))TjBsqjYyVHu8f)y-$#?oHHJE?cRt;P_L3#Q|;9)Q4XRM?a znd;C^lmvr;#e+Q7)u8!jw`dzgJ}L;B1C2qz5Un&LBxd=f7?z_M-WO^6#Y*(WKKYKj z4sZO6k4qQRaL=KuJKvnHJX+J>FcBI|2;PN&#n?%jlR7Xqum9A9Z-KF~TBIq~ z@n~kViv7RiPO7Tz>M|MqN8j#siMSaSxX5b;p-NB{k4Gne*x%M#wE`O`crt*HREkK+5=?7tahT zJ)T18@quL2Q0{x~=ssSSF8Ji(NB2l`p&JikG>*>aVw+sFfs{udgOWC;J27Ve4HoSs$e#5`&de%=~??x3S9aB^2 ziDLOJ=pCo1B!N|r>c?gZbN&xwnIkq1%Y9nZBOiD1@Su22bUh{=iCK=L9w@(RWTub% zcur~QQ~uxNjH!2Ssj82>^g++p9?F0H?>~n+!<-E;!=Oio!MjVjNv+n9G1dOnTY2#F zoj1dEkJP;T{|T6gVTWay-UoYgC2ZRu%3R}T5c8T?YiDi}(o1`5k9;I?fS zQ`R`2O3RYSln&CJlw0I>G8z>M+%fXxq%xzwT*Y|DRklqf*GOO4 zm_93mEu3ki`lO-d$JD>tLZByvrx6RnTE!X(uA|yRycah0hF;^+*1wU_Ee@-V4;4<% zDjM~kvC&=MDhTBcyc^58`do=-Rra*XSjU;j2qSv(iv3l9)<=*{d2!;2 zYPH90bewb^I&osIh6^=ftIFxhP$mp8_ZZf;g;q8Ciy{us-jEn~wOXq?{B-N({}zE7X7Z{UR3g%{=&znji5e&bm8%WTvX zS*luP;ic-%yk#IrmXXo=R^F?&YeMtBG$rFrZdnSRD3?`fUwH$uZ=$7xeX*lPW(Dpq z{IsWk)(cIs4G;G?!61#oKPus0-|#x+bp+q%9DKr0c->#9j3_45XuY^<`O4(D`cYSu z%tkfic38z(U~Su&PF&UPXy;t|X6+hiyc(j`Y@OsAr*d!lrW@ZQJRXi?h-wBtU`cAVT?Ku1EP0J^df7EST3t8Muq-C3O~I^Y6h3}%e@K8Y z0qx!vc-SGp7;-|elhH5dLo(0oiQ1pHle50vREwK=9BanWvzc6O*|)Z@!-Sry0gzjz z=&F}8sW!c1On6KveZj3cqZjJ(xGh_VKaGcB}9@ z&5Si0#xTR4vfD^YnUZ-LNY}l4{HF0qHpLhxGt*I){wQ+K`Kzgq)AL-rTX-)j`6rU7aKf#! z1MH_3#%Pv5w(jWb%*9)27{+dLHKFv%YvZ#|^Fu#R5<}aD`3lglD<~_S@|gvr1AY33 zRD^L3Kw$($4QruIp^Socjy=#}57pM7+Y~qI3=m{@ z3EN^{y1}UReLbB`f)cfgLEY8wAVTlCg5`?aCn`kiOo(v+Al|HA9-{F`fLdF##i?Ho zOTe6L>vzA>5i`GZ!{(h1h^qb6!IvN}Y=&Y=7PX{GqGu7Wbg}hneA};oeXWarROqsgOfdZKUb{rDyE1H(vIjV|Mi`$~o?2`mg&!?a#vEmccC+V$wsX^x?FaLqq@n@V`* zp%!7PUH`gAVfY2zEWAJkAjt#wz}5(Ev!$R3R|=%sD;kz>F}MkLn!vkyc}}lln&D)?E{2 z8j=hz-IQYanenN>b*)1z@6lTdBh20m%F;Ez{>q%9ceJpD;>>z$Ixl@l%(?~59z<`JWzD+L+CF)HKXmB7wMmHz=mV<5KH zTpW1?{G5!@rcf2il8cB|FOuQfS7#*^z!F0_ss(}^lC?etn-|BZFR56RIDivdSQp_$ zE1mQ<)(SFj=d8aKYdKM!ze0>)s-zcaL`Mudr$p6nM8s@NTDZu+8375bvJa@y-%$Lc zqRtQ|mR)~u5OzoVwXOI&e9*QD$BSQZaNDxES0|&Z^^5kNQfgZ_ePl>!=KPYf@>C%T zcFYX|^4A;NPp)2VZrcg8PZhRC7Y{{kev!L4;GkBIe2ro{S6( zlHpBu3%9Jc*h%#>b3vPKwGXF!*{Hy5d*3UXF2y?79A^)I7`n3IaS95IZOvy&zWrQl zq{sj2&Q-f)FOr&1`z8; z-y-&wFs>SxQQ0^O1~ENYP^zRa-dZZgRnzge+N59_Zsnw#5Xz_N5O^NePbu*p%us+)^^gey)T{zu*vJpZk~RL+ z4Y|pKJ=@<irc10t}_dW<Ec}2S+yOFMm_N;wYpm#hU4nRVw8TR5mgw5kx|O%6k4S zKFTa<1a+eQx~bg!3_~yBI%e9}T~xi1h5$UWK?LUNtU4bIz=nF%X~qD_E0#!n)jdld zz3p!*+m=j;J5fK1H`!(~>{NJP0%lVTC;W@J0nR{n6p;fERD?AZr=lVSB0XaJ8@V;x zhX=J7Y(a#m(xB=80qPAwy4AnG(2ImR$r3z1c^m7mR{T^fMMVUG@ZPcpawq|TjT|xR)SRHy&mD&WpPhWb zF>Cj(7uCG@4GJq6fRYXU@2g2s zPRpZY58z*PzJgUn^UKC6jpiWx_g<~4U#_EI_67^sR%MCe*<$=@Z&nkG20f^stJ(aA zYI(NMqT`!8*R6~Q#KGX%{vU>c;+d}}wxlBPA>!N;oMP<1=r3@5YF8!n#`Tdx zamU3hY}Cn=euG2F{`R=sR5`5yDIh{vrOIV~vW=GV@Ur(qEgm_%^uHtea@@XDE6309 zyTL6P@T9sEDY>X2Xo9b|3;sp7I|DUqKdQ_ax)S$aeRN?uzyC8)>xV>mXEX8lX^orQ z+uJwbAQi5Y%^*X;`JQy9!-os+zvX;$(NKntqZnQnO#YZ|*%!6W&wED%W%dW~6s_kB z#VIW&KqbvaZBPpLQ=ePaHaBCZaj7<0jsARqQYwLih|62ipP-$*Ngvff-@d=F&M4O<>X&C z#KZ;dZ=vn(sBz6({z8rQZmh4o^QZ}-10*#2oezI!GLzjO4N-O2_sm8ViE9~U9N&{s z+VxbY)~;tQq_|I3ISn$@P3P%F40G9rZ={5s46NUaeAw-|;ND6Z6OAx^Ckv>I_$3wG zD@`si&LUxoqQpBKUuiu5ZZ9EFpXyd=o>)JwqWd#gw>Up4uQfy$P$MMmmj_R zOy6QOyjvc)6=5!-BnY&C)noF_yNJ?oFm|zq6v~rX7OFNw!$)BXO9Eje){ME9WM(%E zj`HUO1(XS(JTE0hsXetKyXes?yZkx#s&}+#xU_Oa2>(&X;!%>79xo+Xj2Zt2kbF81 z-JYSuTi_a$m>MOEJ?X^5wM~K22xZBi)XUuQ=-r05^OSX@lxbN)wTe9kR-;|RvkaA# z+5a17-YhDeXc`E%LV{(KJWC#bZ+XZ>H9NI@BGu=RES6Qx|BnWJ%A9q(i&{?ir^ZOXav|z-I{UoKCp-xDwNYdGBEKId|H3EROx-$7bTRe zDO@W@hm`xaIs&cvM4LEQJSaYb39vsKdnCH3C#}n;dO)lffLBEL%apmR%dYYx3xPF9 zJgV2;kFmC<-^?+kyRc2QjyOy!##v3aO2~w$b!Jlcu}RAn9m2WXb|;Ly6|vr4$cDVD z=i`fTF2#gUbEaD*ZJ6;?f8Y4q+Vb$OUikBuB6nAk zWp4j*$yK`G%lT^IAY$P+bk#GaG?>r-i~i>ZUn~1lNc?LH#u}X zx`{VM+H+Q2Da^~mT5V2@FlAg%FU|afZ_zuAVTyg`U>eQVQOMb#FLz8`&5i1ib9uK) ztdL3(5{TqmlrYS0apPRZMpP?;=>ZwjQ+0abTH&WX)tq1@D)1Qr6cMREyFFupNLwP$ zmvry=#UOs6Uonql3A_6WaH8{6=)Dz-L=N?*re@~eX@lf%z&*tV z8SOC%3rz6R*FZ-ZMU}s0KMQjAEMLY)vgU4gL$?dwq`h_#oze}t$`K81$A?1IJqjkd zn`He1qr}%m`+JRp)v?cDYtrZET$PrQd|)c^nB-uL1V6@Id%^E5E2pr29{ zxFtGJvDK;JO;;qooV;;iQ|U0Dd++)g^6zx(P=+&Oi~)3|I7QlT3rlRmWMaf)mqYuO?idQtc5lO9RiE*gBGFWW{TnzRKynfJpceIrhL1?GdMI+bFPA#Gl~sbS zgA=%FD*og#s>U*YpgW(|>p{yo8;}Db&GApF9I(#1 z?VP$ZSJvtHc=$P@=wN!P#dL{3vPvMN`l)>c=TgYHxY4?AxESA6cK$Q%a^}x?2}eW6 zJP8^gYSyvS-WA`Qp>!io^(uRh2giT6qg-z3CGbS30!^mUQ0U&Z7Bv)r?r9Uey!mB7 zip<@J=?((iXKC5Y+)ROaU5&bWfp!P+^LuVc~aEPM+HNVPqA4)B|xj zAA?px+R*x8H0|rv2`}vGp75e96lgx&TXM^oOBvcs2v!@rZFXH<`kH=kJJIRnrD3r( zIq3UGiRI-WfzA&W@6;Ks@0iYXSo}i46XkGA6jiL{dJd(YBEvV?d!8S+My54h}4Fzs8aIi`K0ND-3h@1^5OGnlvEsvH_28k+vC z5`alr%GnptBX%uDY#f2@C0xrPlO|~lkB7%-Hcd6EZ#Y)~^!q)$KsG-B$(H<{*h>);OQ^hMY|gc~H!0t#Rd2SZG37$)zi^QRrj@rMCC zK5Pk(5Z`^BT*8FxKc+h>V0Qtb{NwU&Px(d}&}g!+ zV%;79CElaW&y@Ke;A1$da+p$Rri*?$!Izzgc{r|$SG9C&N)0eukr1`PNPR5H{^yf` zwKGR$?@oX?-nvu-;XXbEBmw_kFx+~bss7EO)9XxDOYENfeJk~mQ@;^+5J-jNb!x`i z_w};I^eB3Lb(@HDPTJHE4q;-@9||9!U{iv9$ibirz;G}uqbsCn+;x-E@1 zj349f|Ap;o=BSrOrfe(+pj2PHHfHMH$9U8ZIQ3nw`bSi)-Us3->pMQ0DzZwRoLd$yJ5Shf z%iG)54DL-s3ImMhKP}#oJlFQZYZ^DCxLC#wk1O@yJkSAadSUJOm&B@NlkAr&-82;< z)$*foj=v#_vP~-OtiLH-i42GxI|z6(l5swlKAUCXgpxk!jA?vq$SgN3)CJvnahy}A zB)zs-rrBC11cGmRCZ7&IlepEQ;!R|f8#&Qz6-_2SJ-5GWSWVHu9KTCLDi|ytt@S}rzhVd z&h}x*f|r1)%T5muBtVsGk{7wR(yk%~ggi6bk|IS)gR z$)f4g5E_bj96v_wLw@*KdL@;1M=m`*f)K`eP4z^P!vwoZi8e!g=gB7ox?(Iv+K?(@ z3xKJI5M;E4J+|q708=<4OF1{KBvaA>7n88 ztNKc~WU5Bvev=(9)!&(gnWxv24kvTDRF*C*eSJ4X^YivJ%q&al+S&_)*KY zMt0)4P-#jpz>1BpmcI=$(?$RnJ-Ih?bnDBiM0Yp2Qv7~e$@Ro-%yIp#LA!UdRefxI z0zo!x`Dx-mDv(%aZxxQxz=Y90NrO9MCL?IM3bEG+oYRTC%&AHTF`If&KA*T@h4{Yg z$CWh=o>8&?ezz1MtalADLsL?3j7l{cY{&HcfYKVyA(xJd zzi*nOK@@=fr#6cTy{+QZP5@mKcp3$$c22z2eRh+UnG`f()Y>Ez7onm-s~DSs&sRT~ zs-~wty{F8SqyV_~<8@AgA^@cyvC#!-Gthi5XA1_hw(xsy zYbwt+Q?%rISJyMyWMxpx6UIkdIyycZ$`M&-=Nnw7wT<9hLc;!j!4x<11Ko)bb6E>S z#(;53oVr;*BV&x*2BPiSQkMD`6>`*+Bj4w6uR)eT8ElHe)3|HmQaW_0HT&=-V3?Xb8(*31WJH% zc?3duC3VOEuJg|f<^BB<-9D34(V^Sz>rxjhFy_t$$-f@Mya zYePiNx*;E8`8y+0>9)p_+~#B)cyY+m8f;+c z{(lsmdoFnozStTr(umHdJq)DVb)CN-=`| znYQ+>8C?_g32La^77MKj-x{_V8cG=*ws#L-!K@u0@m;yXKDyS1v8oj6fo$5VXw!ss z?7`_P;Mwv4U+*%m2{93n%$*1ORws1KFv5foHkrp-q_%uAzWJ@VP=vWmoy~}tKo#qo z=SRYFOIP4HmH(`rq@H9dtMpV-G_F|OzGxv2Gy@XMRs(;#6vE5cIFd?0wl7b%5S-8e zOl)Q;&J-Lyj`CGMI{V-&$O8VRo{$uJoFC>(DM`3RJ*bqIBy$c3uXn#j*wk%67VQ4*_?pD1+4TJe9|mdO0{FeT)UFd z(N;PByTn^;4xKQHN!ymm(DMlodYCNy!^q-}6Cr^}WlQ-fw`R12^G4~TtiO`S2g18-}OIz z>nF{KqCk{*T=qB9hddI8|TB)8UF1PZ{laB zlhuVXAZW>bn_yjLW`PN5tWRW5M-5Ww3PmF;n>KXx{nRboBdp zKyYC1$)T`0+bSWF$c4eHP>!pfP7C$ik!d%v8tknB{WR!Iz)#Kq?qU2Hn_MTid=zuX zZ=>b;2w4_|M^nD`3hsg;reNFk_X3h2o#V=2@sn^fyAXR_?za#B%L%No%HZ+$?S=l0 zsn60yznXH=0u3&c}+56p2r&jbgsbLV6R>@9jB_E^gEM zwoH>h@d&STwldd~wcZ2A_3c~bgTLNznCZ+|4XapCV0g6&NfT-|T>?x$M*Y)uV*@R} zS3idxqvhXZ2=F)YNCj4wGB0sPE?_MlVXA8K174UMZ=(@yD(NAK%7BC=Cvz!a#v=4c z<}>pSveD@LZhfx$(*mD~uY2%I+dDu1`wG<_4HAsO)o4{Eku8O!!Q-mweLT4W*Zv7n&M6zz3ZP!u~z1~{yz?N2`Jtz@F*q7hR9CM;>#+ucZ#-Pv5mMt^U?_Ip@)<>LknPKK@Ntg83T* zwf&Ii-`*^EMm!m$SULLfFOfgoEmO`zQRS;)#ga zG~pIeBa}SCWiS4Ax~Wm6q^k2*PQpPPbgPK%&g0BlhGGV1>|`1K?UXuM#-7uY;aCvj zqbfh}a4MDxkksX%g8UX}yPxVGB0MX?-t@{+JP^Uvz^;jn!J70wib)iOIvTC7IFo9fL-1ab8%ftP zr@LnelPGCZIVMZ}Uwn-D%f`8_(}W8qg6n(~jOR@??yuBCJjCx>f^OMJm7Fz!g5gt< zr)l52*UPQ1*UhnynCiOQd@;WGwxU$eslz5uK06$^ zW)E8fgS3t&u2Uh6MYVL zJg;JQ7K(~5+k5mj`1bKAFJg6^5{kV$)?UTA&>5H;UH83$yLg}6&yoO+9HI^{Cyf4@ zdyDy*juOny@G$8rfAL)I`+wE6eT^=@C}c)+(_r^~!_<4%CvKa}9JdArE-F=WTe#I* z08GYyeuYD%rTym2%PSRjt+gYq30t(Irp~%459oJ z*2T441@(wj<&*@1M~&Ziu4mb^305>a!MobzF4^q-`Ob9GDBMTk8m_oAKPln^8#C<( zqxyA$7YQ%wRpk;yqB*S(9aRN{=GuR`Fya)&c3$-1LKkZDdiDbK|6m+Rk+%+o-y)lK zQGF_IAQoMt4T7S3xcAYX?P_f1YeN9a=pDz^2a25Q2U{nNgUhBa2|f)hTvKmz%zAeR z7Fh8-!b~nBokiP;%3)bMpLuA}$XxI-=ASelt7&6#-tFfP3||)Ril~%zX$~5d{UvAL zm9@-juURH$MxcK?%VF3DYouwbnh64Lymw)LUjJ)`5*$+Ah3>1FFm`O4H*Q&}LMx4~ z4zn|YoYZz@67Xj7{nY^n+`u;sxK1)^HwJuEQQ$Rn-YAIFoB2mm09Ga==v%5!JefbJ1~fEjF>OiQFA7fOP}|HCyTA9Vhyeo z0|+~y!)qSKEPNj=G6$k-4pNcsF9dro{c%nKpQeefxs#R_r)%J{aDLtoEyR>~$53o2d~lK-g%hBW zItrt6ZRwD|XOD(mzDIfewp$cVvr z?wj6CGS_I?RgtjhP~q0FhMm5vY<^9CYkH0kkNR8+j=wzdQltP)kXweVxBp{#Y1jNf zlUkdLvC-N1)aI+y@?_&$xYh0n9Nr!+Nr9ExyTEFGWS6b(Lh(*6^0q&7ZLWX3(M~w! zKqn*-i9`MGE4UQtu15ovoSX+W!eq}-Y^CqozIsV7hnO-QaM)65DGQkDgm;laT^jS*tMPAeiXVtP3z#~~IEtF6uJo4hkU(Km z`%em*s*p9uWHqs)O=ndtskFJWDK>|S7mmx=9JVs>uuvjTkOTfG^Riz^+({M5a}AyS zV(xRvC9=@kYmTd#>ct@zq9~({Yv^;t-SZ$z#=cHN{Rfsc{rOMdjvBeX4~YCV+l+D5 zz8@6EC7hewQU-faAVeU*ddMiI z$esi`{-0^(9gAryqznTU5aM&mU^Y_9}>6ZI|y{Y0@5pw=7V9G&CFF z|CV0t$?&JRq?-J0jqsm)9__na8-IxVYAFDOG4scZ9V@)4 zXSC}Wq;=CA-Vi08knJ$P@3=hhns<5g^Vg|Y?uPI&{=dOd7rv_+>+a*qj_Y#>f@PeK zv3BYoY>vRVUF4`nWo}36jirD5mC>*u%e6y3P092=;a^Y}Hrqe(-|3b*)-pk60xP0J zSf(x9z7Z$d1?V~&dB1sTgjr1t82KCI9z^;CG3al~mzAlHsl}Fv8TcZ|yyFd32CBC5 zC2DrYdSOE5n}DkT2mkNIjLbqxvye$-F5)%dJtK~HgYbl2ZLO@{wmJ`bq8&7Xu`cK1-hBx*NAO1H$il&u1& zW;;(C@BB!je7Y%1UboJyor!bX!?*{5bJHJgW_dN8TTa~j5X-$9Q32WRHrH&GVLRsx zzy07^C#n8YX+I^#5)Og}maO$H4bFoif2}rulk$JrO2~=-akZ&hA#V{!Q`hvihl=P- z_s*vz`J%@Jn)s(MYSay^DB<_Vbe(T@Mqj3}f)Jq>XnU2TT`(vAY7XRq2#O9Gn7xi- z(nE^A%M)ay5rAAE1LyL?Jkn}KgGKM2ext8-DvB(u3U6IZ z@>p0Ce51#q=A1lL10#@wmDo@W+?Hb!IaB9>Wj}Qt`Y?)|E+g^sBMJ}uD6?2Gz2i-L zWdVw?ej^GJaD1mu7gWr4|A&0CM2Dg5)&zn~*D115LWlE$vQ}|U+BygF(sAro6d=fe zkoEWp4>h8G#TGMKeI-MINtalkXEI;L_TYb@l*=8TLdQ+3bmiNm(Bcx1a$0fqj<)_6K z_0WXgNsRo>m>#V(4vjvp9+1t?%OgV_{6pk&e#WvY$#6ZGW{P7qv4|K2eOYX!M`hJ5 z#Q;3@2^TW=v!~rEUrKV*=l98;pp=-&I6+V(CWjN~t|A8*0@dlj`$GpTm7JyKdLqdm zc-%?j%%j48To4iT%wM0!I^DW~*j*Erw}MEr5!Fomjd_wPoTd}9fC~dVtGdQ%9&PBE z!)?m#c=`fe#CFH>7(xFjV(cn_lc980@P!S1+TideplT^X#%V}DttUxp4s_HT7 zn&ujsOqKxeBdS$Nrdh-(obs@%7=2Bg?_tR>)l-&B^lxUw zRtw%+uy=rk&m1@C2YSE>JC4imt^VMZ>Gl8kKguqAOSBh|saMN09eT@9xz0v>ZDd_- zCU$i^e13HJk{UsvmnJ;S!U9z1r2k+Vz8Oxo*x)36Y3)cSe@RQ=U-6Oc5qbr;kMPbZ zJ6@TwK)B&z9R&n-b@yE}a>mzsf{ArcEe`0`G6OXH=-{K92o;vUrV98Wak%aasMAdq ztKE>EV9R+o-bM#Jb*y)~MpR`@oi}H?A7N->qylvV3r_|E)h-vka9{Q3#)S3z6Kg*-%iG2|kwENHr1y`ojm(ToX<^esyJqs@*h&(lDjP1$ zC8DInK?lDlfecRCa_Y}L|*$R}kbhKq;$-$4zh0`Z`N)G7t^n;XQIqN`RFplmY zFWnJf6yuXkxcfdSH661Ouah}xvEC|FVdeRyrI}AVM1)b=?|s!F=Ln~$XUqc&rEks( zIYzC8$)2%j2h<`66^p@J=dxXyx)m%S*AUJ%dyM>c4QX}tr!Ql#}p_Y5wc29m&_l+(lJzDR&lN_{*S{vR^+4NZY5R87Fw?ZJsvcAaqi05>F ze!Pa4wFn{xKKZOE&^vfq4}Ug#{C@Sth(VajQA_a)bNtf8NmJ(f*ZU`pfj0UVx^q%> zSukS^cbg(e@wW9NOS=p!3Dcxoq^X^qP+M+|k^kBon_@5b{m>D~-*siqC;8K_#LitQ z|1@I@S@dD~+59VNkO3RtG~!)Rr=I1L=5HRQVPVPc&p(@(ClRiDyy*md^k(mG&Lgpa zwh}()EOgBDvVkf56F#f`DM}Z=zSd#2!mM53(-tY)Xnxz}i~NF%JDZJTTK|0kcXy|x z3MY)%B39Rd2BpI-2KJn7#*FIXm_@u3L1PWC>Ijb^h3Z9ZT4H4)OtJ|Q?I2ovtoA?w zHVgv6mE24-*$q;@42Sf@iXn=~<2upmQvTC=k!xMa&$F?|F(C&x{4JSG-ErYFc zZy0BALVcv??U2`fJq+BedF0bnlMheENaYVXGA$}RxcXE?D_VmANAfi_E zZ>_ftoXN4?vw~UUUOPTy>;E**Vx~kauIRdkRaKjVo6eo5LoZw~l3W2}W`r?WxVdk*u1lQfd66WpqEMd#^O}=U8@*B?5w%}yj?yxV));TIE zN3|nscU|LDK~gdQl(a|dF;>??nJCLUKh$P2%ZG-T2ly8g@MxIB z%F#rQ;5L&4innF1+LxpHjglx{!i}q!tSyx7&+O-0R7kQ4R1tVpnB#oz z`lC1x>Bn@SvC&DnF+!-V4@H7c>CZf_kn9uFz#yl3AwwmHoHQd0(5M+4D3hAI;5{B! zLREqGh&vwWmrvPamdL%jeR~7Lff3UxVeU|_0-4_~91eZi5i|jZnY;=+&#{tg6?P6A zY-LO<)E?w@_aC!U@G;ToI{&E;5ev$=@t54%)tCDmW1$;;61mI0hULLX?zPIK&{R|jk7YB5~x z{&61n_GPO3uvPO+q34<5fuZ}?mwJ(&=!S_v+Xsu^^K4Zgc2m!K20S;Ot=WlawzeZe z-K@L%GJN%sn8S2K6`I~0HQa~g>vzvnFPYmSGMUO%sVO?VH-7)87XQ1tt9zNV9z-KP zEI3J9b#g;~H2G(kIO1mSn9;qy11Y2N*?2Ru1N9*1PnDN< z*YwWLociCY0Y#xdPV-6}mV-_+UFxaxEGh@YhNGq>441esTz#4evId;& zyR82M6rTQC;M_)i+k_`-KQJuCrS4GNeE`P* zTeXf4Ufpg<)3u26llmzwfA^v!-08rCO^cc*lRn-0)L?FTO|CY1%Tp4p%uHT$ct$S) zr+l-nrnfpLmz}xf%CH}DF)2%kt*pbp4fv_uq>1?6ptIPEV-ZI zAbkmBj{H4!Bjq#bJ==^g3@8)HVL;ztNjNm(l1t+G#B8UzUIBS;T?Od-2D32zggl6y z@%JLAc(WbiG7F+S1O!IpH2hN{DX@h`ZWxe)XC@&6)^6X`yBL=#2u}GZ{_^Mf>jh6A z8n#Rw`71~USy(Sxv~zxS-rS)BnbR>#hNp6d@(cy=CuQDkiBdCVNs_G)4Tqm+8;7IE(d- zUAbEc!m)7xeg&DiO$0X|ZDY$L9R=N=Ze{a18VC|18%FbjivIDP0S5v4g0X?s9FVsN z2WlS7R6fA)VC{2`dybMVgkRvik=~k5)WKC;ZD8A|@`~AdcLW9nPzb4!qkLddTmXms zTeVxUr~eATLfg7`E5W~4roa(o);Rl|3yB$D3POd*OwnwO$2PLqmXmJMQn7U;uz(^>jap3bmJhbX_at z&{&n^YnQi;2`&{f&H4=$>D1525un@rhju`>+JFD@D`9lY8uc__MEU+{v-QLeyVpVQ z{sBAFfSh|<{{zi6BXsX;|2LH9d$o9EDy9|`KzYA_g;apEtz8mseEBx2M+^q}R*;Uj z5X>?RDf$s8kcZ{JyL8aJT^f`l(gaCj$<3sym}+0Af1aGCTq>DC@+DJyQiTlNX=&^gS!pobMwut=mt$D zV?^?&7D-%T7JA*W8wu>HJe1yHm*ixR?(_NRs$>(>?bRB#LfW^$|Y|lVl`O1t!e2>7)3P-Nd*J_UahjZzPFcg?z^P zhv{X%ow72COh}j${*kjSMtOKtq-<~ZWy{!4(G&)f-85m+c=b~>Z8|ww8TT`0=eX9> zWOPY;%jgo-xZmPvfOp5QpGg+*i>~!aGs9rnR-rka$iYFjSf0$pm83H0>52 zH!8&1v7vFx+R_`*u*Xqf@XkTF^QyW^KT|%0;a}&B*llU;|0bLG;#r&lgNG%1pAe#+ zjLsU>XMsBMjb0C3Au`FzscaG3jjo`>qT00~bs*SPQ4QTJ)&_l)pPzdfdLf6HnAkhG zh4^iL{Lh*B88Tk8SoTGie+!0rT~M%3QCOcso^X5P@YKVrSV^Um+jdDrXO>4bOFDKH>l1g4_WJ?P;2cv%x!AIl_?4l4sbJ_EBnHlR*$le7LLl?H22f9vZL zK#ZZsYU^%B1DNh;aAXPb0bbnYlR<;sVp&Rgm_Uh|&q| zaWuQgf$6&PLU@*NyO4WSb!WgJk(7@wx_0*ZD`)cT?#ho-mOqVf@6$W~y8H_!ixfmH zxyh0^r~ZVT(Qu&Etr5)=aC2atjkIZ9%C)9fHgnCA4WhkPRjVBMX(lIl_fjw8+T3)R z^#V+?2q2hx`k`|R*NA;<)o2h#f zY)tzIeoRjU!(bX^KPb$1O zsvZkK$6sr5w!#AJE{NzNk6YHAZhd=c{_}~&NCb(*Pv+k!W+avo&!<>;3RjS=j>Z9? zRA4tf(}guQOhK%5v8RkmiZuy0)6=eE?np0ttU1hTAbz(MdcEh}LzjsAd3@{o@ynS$MQMLSV%1SqC7$mgg16ZsCb%UWv7hNZC^J{2*iO~`NJPK0hVjBdPn zosxf!#a2>}jDTc`SCT7C)i(@6d|fBarC>NZKo}DSDAOiAmt=6r!+Ju^wW`4t@DJ@O zlv48RpbMw>#R!yElx)>asufxO8bV3gu3`F_-#BtGUS7gTYaHVABY57T^OWxKd#5~N zOq1;(uWQgrqTPR+RvWDze8jI9kgj3+sYaBtn#Y(nn18*(^HP#U+iMk0)$Z;Nbw?TmWgO7(b=HK6HBTk{xkA@B8@k3RDsZz3czPntjA^kl-J%trYTg9|F>Tkch=b?Zq4 zqOyvsRg_9y{1?q|iz?OPY~5{sea^!=MXQFsG_^}(&{)w}Q<=8{NR$C)#75MU@~)=C0^4wv0lqxhr*6KRV|$y9FEW1I z2lkQDbft#NqOEsL96i20Z%Ji1^dI>bd!#YLa4lQ+IaP}`Da2nf)O8>sTj@6WKalhN zFwhzBNd9R~{f|>ZFsr`m>w6E@kZunc=A;@Ny%KSIknG?h^^p7#6Y#sXV?Uo~`C-G< z>t}o0`>S7AgEjwM@nd}bSiGF=*Ejcj=5p`%s1e)99Vfz1yhSd-QLJ?5RKPK97QURVZsF)=p!L(V z^D}fmeC8@|4VNUOM?dCl^~KLzy_NvGrYgXMIHG&pjyNd(;0_P7lsq(IFLhlJ57hr3 zs7`l&_{rl!d&~sc_3E;GOqxJU*o#qFCgKf}KS=f0$W*kunT3n;g2+#MIIK z&BgIvgXP;w4c6)g{eO#F>H1&wi4M{?0*)rZ^^p+#xMUcGWN`Y`2mRwq0P?bOaa;am4kj+W0C}zXeVsS!d}94BGV`(Y1X*%L=wQTG1$ARqYlk>`wM|EYlIG=bf43gqL5WMDJ1_Rt z^JKwca9%Q3V^rC_#w*724B%Pp66+9$(T>u*vY87FlxTaWwV3}lI&!itLi=3YVV`;F4I%)7zJ0Erz%&?yt zE^qG4engq;6fvUfNM|%+8;RhcIAq6yTtHa!H7CES3v?Nrze}Cf%w=D_KlJ*IvnwqEI6JC_&fDF-~}D&L^d9P|Oz2DTLt`hCHczXk9E3v$2>^ zF;ZM1hw`SI+MiJ`Qdh9z4|Q6E&WJz3a}p{BrVPBeuY7s4kN_`yu=?_Z!YAqe;LZ%B z6$oiP4-Ncws4hzYl7RbVsKN1-TCMSQk^H>NvaiA{w1?G|s(<%+bD$!GuBlpClI`wT z)s6|){zZiiS!jVVhoY^Q`z$#;FzF)oc{j)0Z(j`miyk%|~^vdZ}Q;_rPUIb*(GZDS=p1r)H6bIVdXYpz-MqMwr?3o;FNGa7$YZed|YT z6h}>^bR>nJPUvP_?Azvmcv`q!)aDmh>$0yCw-EJqBx%vd(sTAJgO>hef`Uo>5~Xx8 z*0iR&j_E$;-;vp2K}&WBh0Z*pzCjnl5*Ip3TX@#NYW}d(onapHsO~=%H_0VVlP?XJ z=~^!WIFC{XepOAtfoD6J#-8EJCvI6XbZ>^E<(cet>^}~W?{I$V8ApoRe$1;a4mRz* z`{MSEdiY0ojC`Gqn4?lVKj`c2>pap5(DLR8`61aDet?M;=juCr3ltEDm-FV4pfS*q z>AN5jzRUwqVgZ{a({A%T#WvW%<_89DX7TRt55IBgU64$jQgw(h9eiiYCEPfvCvS!~ z`D2EvN&@w?l1UlJ)$Y{C+D~zFngHd7hjx)hUYQT?J;Rka%}xs6d-CzUXMvAcWqVfRCchgT9({S~awp z-kZ`Z3&R~T$Lk^qH`0n73XydDgxL}^(^GFoGJw67D0av$&D(MuV&DnaJlS!a;L5tv z8(Kr`JDV0Tc61KFl^xn)(3*kc!wK-(sqvu2;KCDWtoGvjq*01PCTO)?O7?Plb@n407sFw7W99+vkt5a+4F$YX2cd&%bhLI{8GzkSV4PVfQF>H&?m$}n|@M7aCO#yZFTYF@~v=tB;K&~Kjl_5ISGi~ zoX}Wr!gkP-35E(zT~BhH-&Pag_e-*{z9aM#qR;Mr#_gM3S#{B*God&8L3HzmsIk$& zX5tc+ne%;l@7SITT3iKaDd#e2gXz)uPVvNCbHfyScosy|$jJLS$0R%Z{3DixQ_>{b zI3SDAjr&6#eVW=JS{|}LHfegt@<*iq*NF>lX@%+r7%x7`!`rWDY45B0{ltvnlJ}a^ z`)q)m-;W`J@jBGuoworKV$yM9!H zV{j+NYa_&};@?Vcu%ZWshIg8?=64DtTFqZvd21~u}NHtHq&MQE}24D3%AgFe0CLIR0x~IwSg5D3V z&xSM-dMQ5tQj^&UjZT9ykcxL1+&MG3%J%{OYp_Pd1o2gu>&wMUVP+T$*u(uRwW^8gv0E3`Wb?>}PRE?z4*0wD3NIte$(mOnL^@5XuV>kvq zMI`3G$5|H}L16d-EvggAEJRs>826DO%^a;*+R}~R*E#HS#}QlvcpPqsWL2KqK7S?` z`sA&W#O6!UqWJjRrZCZ)k+b4+E%#8DXjbLy1CpJ-2k`HvC|abPQ=s9hu(2^gz#`Rm zp7o7n>RP7dqns|bdDG9fYm`l|tAKx}sRFGKSRbKAsq>8H%Tzi)#6|AySysQ}0hS&8 zOAbwU#|8d*?+X8V!dRoMR0o#ISW-K4b?u$eVHf$Rz7_CsLuhyRsbY;jb`34+lYio0 zmTf+*r$944OKltRm=9ora#mJ5a6guN|4GdFWFSeSgyr?jb5txs^Pqw+k7Bq7555})V z5LKDtsETuSiZZv6JvONMWfbP-gEtkuvio5)8QqO=JJ{$A4sN@ltpPhO9lY|N@r*+% zy;n2x?^5=rk9GN{omPigOrtghAV%L)|HQ4!xJ8{YLcd!htz||@UT%a{Z94V2cBE-j zd~GiA4@4u6PMhdW#4w*lQn7Sdb^XDoAYax1;6$EN0(wCL?0`0^W=S8>JFY6t>)a{{ zIQvVIGWz-on(9~K$2-PRJdzYo2IY(Ys0(snKLe-HwUUHK&!RCJL78(G{mi!<2XS|0 za^jBb3x?J!HPwi*QzOY&;vQ;<&96kfHuU*_(lvT)wTXrF$!WH9${(c6kG_6OveO{^ z7y0X2%@0=*ZIZQ2*&~CceY}?FQ1{ULLf73$WYA|VT?O5gf`|t3)UQW+b4@%$O+vyq zD&XV>zG@Xx+ajix_0fFNF9%<=Mx{+saCYo70TjxV0vw3B>Y!E)uqIyj(89~i4M)5g zMW4K~OY7w{y}M;cUu1VQXGrYGYk>!LY$}7lS=J~XoSoF_9;xn`7Yv;6mN38lc2yGE z>r-DMWX3qcvb@*?AvLSr(mygbW#HO1EUb^Esx$3! zC`D?H#@wbu%lqZ(cxyi}*K72dxB9EBB>RsAlj+ZP4L?2q5}=bZeI%j&uWR^GG-=bf zkVdU4#V)a~=wBQd(Pgzs@I*ZuT{*PNXO-rN=mSbauGM|=iyglsDM!ud3y=Mchsx6; zzKe0Tniyjw@&opXa#dN2bN$K}W9bkVz7c?tbzkL`tJEnF3rt~35QL)G>rBz7ZrgxB zNn=N=Sl$Tb7-2?TY(HQkW`v(dBG|tq;rnB>r0-@fk4BNH=Q~`gcSlB2S^e-w0qF*(3BQ-&VWyHfQZn|R^uB@$y zjj0#PIQQ5&vsY=#fsbxrP4bEQ6oH2Dj+DdEb2(5gfqDzeB@{jgodO$unqd$G-5&t~ zfPjipASE$$!r6n<#1hr;otj_^vIN$@cx*+FcqBVFA36ay;4ay!<^*D$HVwo{Dl zk^ocA1>(OEEXaZ(dI!PXxF*vsEdN$^llbZgG-P$4Lp!sVV}-A0T5=oWUmdAyNJ#5t zhjmF23Uzxo5zP96SZIV7tPTSbm&}Pwnr(3tu~>ru36C<=&(5SIp$Z&_Icuuy_*wuU zC5$N(m9Vm?zegPBB(#6gsWRda5#vLnmwjZ_lD=WSp5C5kEt*w0M zVsO*F*p_!2*v!_NT&w#HKdDz>?cJd|7w4skMFgk4bN5Ij0GvIHWoi1WTb5#Luh(q9 zxd)ZecqKe}`(z+nmOmt|TYG6e{6Ng%?;k}UH?1gMdxxPtOn!~TjjwsU4qV9waGL0U z)1HiVh-i_^gGBsuE|r%gLGkPis+!_`qUq{WpSa>{cx#g)haQEFI&2#hG)n3}HCj!! z=@KJL8*2+UUMa?8Y{L!L9sE7n2xBAhuRS4L0?$$@?{sE*M`!|I5`|{LQj~Pa@we$h zBb28zUM^jkj$z7)D?=}V>~K^&?5{S*a3GiZwrKN3S)^rlM1Vt%-G8x6ahOh5tLun{q;x&a326Xy(RkvT&jJATi^l0T3GJ7?9u_&P*$ta)cT@SlhH=8AW}! zIBN9o!n}d6pMBIfJK{SSpv{(YBc1PvalV))*c8$q4(@{L!Yv-Zhc%Asi3ZzbJ;~#B z@zFDOrD5thGR;X7FbbtninpNV^ol0N+a18%F zK$dt3boix}zIXfnT|Qn7%SpQ)UiM0FImpb})CbwyIfjqF8pUP1f(b^7?$HiOhy>D? z5>U{;Q<`PU7@b~{HDo1BnzODk|XaEIUvKwL{gPr=yjmlYdS?^K*&alKqc$d zfeBD#bZ%b34{ew_J1p;ogy~TTbc$`geO;DW2G&Xs*LO)$hzk_Wy3CMm`0?#qUd*5}FcC=&^maHt9efQbBD^$;(YYzX|HIDd zA7Akt^ZXfIXzFKkTMVn4;uAtw?>1aUAJqpd))Mup^R6&_JT2Ek~lYe;E>o7<>fb@M@OVRm%| zR%fx_^1D{og3$*6Qw2(ZaoYB7BxiJd#L@M@$$UosTGr+7zhv6XcZsh&i}SBu$&uGo z)^6^*bg>D!Gl7xF<^Pad7c;_PwC4u7b#3h)k{lN3G4=q;B#)j?^1(^njd6j!n@}*H zhtoq&8%SinRl<3)dEr3yvk5dz zpnl!gI&IvQl|${k`TF(7_4QEi75nQVwLJI%;AT%7B#QC2XRtMQ)z@|E#ch3h&^fR| zye(%n(tKI3{p~-oq-#XovCPh~#3pJ99_c1T)NcP(ed^<{Bq<@D+sFZ`i+hy+EuEEF zG!BHxG6E9Oif@cOc|@;%1@CqV{tpTAOYJ@=lprYp#Cdq;EU1{deO(hYV#n0BAb`sg z3lsi5jJYMmyo44X(~p0K(6@RR2yc}}ABNExR9DDGWXKvn zH2eJ=*)NnPXX^@9_-^P)PxTy(? zq|Mn>*WF4+>lHrE{mNt-6$5Pj?-aB~0M5p(r|%xLbs0{)?&oqK56V_CIb zJ+}R%%(*JvVmJBmaD!T^sdrb6suX*9>txL6Ni_~)g}JHC z<4CHWeqDXn!?|xNH<@7F|Cu^uJ}S1uI8k@4O!-q`e_jCw(_kayXxLYlMw|bE^eE%Z zry40PNRmFQU>pfC`o{BHM^dl~wMeqj zLRAUbgxbj^lkznv++Ysw>bGovEb8P9&peshYq0&$cck@3-&5wJVuKhH8i&Vd|4`t# zUG+y-x1#0Yr4--kmaoFqPQMR*LXHC4+40$QW^q)qV^M`d{MsyW$hetqK%2~WrOMUEX$bh(k_p5WUK>V~)^s$&SZ#A50d z{qF*DtemfppY*nyjn*~u;$=fWd;_2%jkLIIF+OtcsK@V@;D(-sBU)ih+yD4b zHq5}*jGhlS*U@wvN24@~^fwKtTI#muy47#7NGrLEpOaylkRQLzQ%_wq*1 zrS)Nn3YWD5ebZPfZM-j=qu;;{`Ld(TS9X1k@561VD``e@(ZXd{KREfeSNAu5;Qoq` zXVw;Od^I+p{{p(u=OrPN;d)mQqcm2gP;bN;x-L3Yko?J3w%CdG4GUP4>~pr2w5~z} zwd*Cv`yTNeM3L7JAb{{M@+NBYXBy&Iig3%Y@E~B9Sh) z-t9=8>fcGxP^WbD`?Ku|;tEvX*~UpLa#l>?jjG3bIguWgLeu6%cQ2*~SEI(xsA2aI ze_8)lTw#Ber2qb2$y)X=*0~B?RFu9q?_K>J+uc`*z1z{bV!{|ZnUX8!4*%SdWEu7U zDt)%|z1l+pd(}OM^0-!;_MccMYuA8xkM@2!tNu=x^adHNC7EX0u5y&?oKyp9 zgBTh9S}?O=IY{W%%jU;cC4|uO7ZCXHLeR1}IxABUJDzljKEKuG;4y%y%-~>pPf*h=5a20z{ zJ`74z03auqc^<~HvC^+ThUlJ6fs>QN;j8sS{Mvc|AD$m_#dZN?3g5B;Ri%X;VQ+ny zYaG_azOXR7DtTOY8(VZsWPJ);5U%zQjktjAr8N$NbOW^wqlKH_YT?4jhSQY+$&6z= z7*}y~J&yh#PW*|sYcqUx>3y<;0(%QJjdumPjL$!5uVr@deLyUJu9ZmV^u`x3W|85Q zpu=}l^u#3qMo8x}D)U|b?X}A|DqE!Q0g4Cd(qa4KX%3VFJ-Sheu)Tl0Q9giF071}O z&f*ARJD-?F{-1HtN0lsUTk{{&Z|&`2?rDIbHLW0b3jdC)m<$*;^M4eb`#;m~8^<@p zkn^D&<~-+=vyF`*$DGee!sL`>lw)jjrrFFX$zkM}h@wb}oGZ2vLM3y|p@>B4^L>B+ zfcb-iBCCyc@49fg!R7y*WKk<^s7JcEhwB}7r-li_a`;F^dT7rptkA*Q`t z`{2Wufncc8cmsK$?2kp%=RAOYtiK8b6rA`>C$Ezo+O1`-XvGY$DM|$*=*Ze)uf@0* z+eY{0($6!RXRg<1O;rb*!SK9yA1>)2^yZUs_VNWBwmr$hyRnUO?@U)$bW5{shO&PY z50Aw*^)v3h$aByEiWtlia7z|Je$r7#mDr^|OVkRK0o7H~q8a9go$D!w?<3;5WpCqp zL}|7rd69@;2ei{xb$)N7K9^;*3P?nDTY8yF8C{>y;p**Ds<2_F0`q5Ij_(&T3)u}w z<;At3Ip!#V^|3^rz)?%>+K8kBd$fwVcacXCt`wW^70LhUje~|#d7N&DP$VZWNHS!` z7K{5rVw}fbi1;XJP{P6_a>W815`_jau205XQfV9}4i!kc4eMPMMDO~R)o81U=%`li zwL#=cTKz9M0K<((i8m#`CWE21D*8Ap9}aqWn<7VUZeNKRH$P&_eo>Scv0v2}P>h_N zO!K2QZ+B~t%Br&>Y>68^jadm4Z*m!8RMDxm(gVPLZf+~Xm?gISCZLOeNv3J>M->tg=1^`dAbfM1p_Q&b5> zEZj7<$$JL>R0_dl#`rFLAS$C0T-k=Udzc+VI-o%X%svf*Sc??~LqD;S=lzop;Fdij zYnpcXegUAep&!-f`8(I}T+u4Lw%91Vvk=T6XqR@iLr{n#zLZI^VVz+lNNJlm_*+!UY|E&5;}4q9@>XJO;mtXxI!go(qYk9$@9 zl`OtHgCT|Q)H0ek7G{J;j0<$}aT18$tN*1i6Rk)P~9j(G}5N(;=f zXSmaj_9V(W8S&TrId#ZOz*4^6MqWwru96TwR#afR<$%TuxzKrq^(>O-x1&y+PiH-d zOK5$1-CEn~N&hX&hC|;R{Kw%{o%5zNigJ-do6#>Z0DKN|Q)X{FSu1`zuRD%qTyL#z)sEn>Q&_JVj%25cgTt?J`0 zuPr0;DR&^`(Le2#uSBKv{55dn8m=8p8PHbh6q1Ti9T#%v=SKoePgdV+PUW57_p8%7 zW#}@0KIkc?t1=Do&)+9PD&=zO$Q=!WrhIqy8%|&PlWr;elts%Tgg{Bl`SRZLA1JUy z$Z}x(mesTITNh5H?(2WNTCa$WmX7wf*Gd${UAj?+9qzX*KHvz@G_?2+6nC}Rpgh6d z;I_&;T0cHB@Bz~jeM@in)aRO+>KpD4WC)sH@0B{+M#_>+Ug6&B{`5Bwr|3m|m9o<_dAlkTDZJTme-tt+4+9mSf3&kaYP) z)D&^BUrR<*o?3DxN&rhT!i=f#YC*%2g@YJJ;{NfuLrQO{yTqBJaiMdgYF0^3M9L(? zRN*mIu1sqA*1*_!Mu%KMn}_OwcI~sru{Akz(sACB)dKi2yeh76bfry%A`57FqiF+c z=Y|?!<%`9OZh3YuO1W?7O#8=Wj}Ko~KV$^w4nm7Zwq{Gt>6!NV7lq{y8Wm#NCYwJ- znB4@(3Os_(Ra@03h_kgv)NtnlvUPyl*7T3YmVa`!F=y!qPl$U})7oBgES(G7kk9FD ztsc+SUf|XHs6*a=-ix7=6@so+Z!ZC8#K}mt>wU>_J;V1Sz3nNMJ32?M$!d8%yxQfs zy$9rUArG{`P0{Nav+Cp@J^ZTMfqyuE(L^6zU-eS)PLtrbM&8;X;Z@rdH{abYCU%10qulK70BOD58e_= zk3WWSZPq>{1-7GnuHIK!ZH{XUi#Dj>SwEq4>~K@_wy1;*o^I)5N(p1?(leWe+YCZn zR$}l5vWB0Y&7R@ZvMcgir#sZdX@wscVk>8UOMAq68MYz#t>WV$UMikh~?X&QFIN@NS;q0Ifp0QQ^7pFtvb% zJrqMlC|84r?HtejvC!x>F|u%*2?8IRJz|4kp>dw?nh!sh2(*0hvlBEAEV7^T~^;&Os{m^IM>2@g18%Dln^ z8ZVU#EZ(DSzHitV2twPJIBB;9pUZ1bjJRr8GBE#F^|wo%q;cO#jy^n(Tw6ciFS>M1 zTx?z3-=Wrw9O^m(wA%Uof~1xdoSqb{XjsJWXN~tBw<_9)Gx3*0ukln?lTWqigayEh z9TR_2-W29Y)c`eXzTK*oT=_RC)A=^bJW8a4Y6!dV%~ixGNUq)_e*^`9dGkypRX_sA zz?6)}I%X-USptf|`;-NPHE{I*FL;)YvO$gx7+}{BWc2Bf2CbI~a0HVC%99D=`ibAY zK;SV4lM;|wX|82ANS?*uri@DmSE{cTUyTf0o$N66(9FNb*xNk}`;>5A$WGJK6_7KE z3d56)#eL1>geHE_L~9%j>%l}rbx;ad9Xmldm$o{NC%~Wx$$Bu8m<=*Z238q!c~-D; zp#A>Cg7Z7D-4N{=Y65X}MG+khLBlZak``0oAxwk>5UCgqnUrVkAa1_!LmI2tkW%>` zh$b{lV^vN7wh-9ghFl&eID6o{?Y35N>*Rgqu;_7%4~xaK;wGZob}TJl{D6%~Gbb+| za$RZsb{auyKFXB<$GY7UQrWlp_np3uL=mKFQ!6azB2M6&%vL z;Hu{(QC56nil|vl%4bN$HS*WZEa49t%vd=8w3|v2`p`TeWCjK?0MbdekH3kim&{<7 zSF>L*HZJ3UCeEG#Q)km5uccpF>Y9T1K1)JHKp%z>3qq3tE|}cOU#JSN7$FbQ@6=xO z6K4g1xBAFqyuo|93w~GVyGIjB1+5*t;58L3Z>tv!^x=kWvycrU%Nh3E7aG|NOaw-_Yd!zPR5Ntyfz;)vN1*T zkPjGv1L7uZYYG`ha(Rg-M%vv+ps1s=-se!cDUxd{g2ZX#wDamhFYC7$Px z=TEk2Zu4^SBLCe`PNuqA#kp^6xM3xpzFB^D+#Uac_W-77Jn-8wnfXk*``D*oPN9qR zHSw_eWXoclQVj={*t;2j-0u7pS*(x7C*WFLjSRN-|W)P|JcndVQu+OPl<=;Y7~Z{PxBdAjn;m0pqQc+Pep>JZXVIO{IAn zkOb(qt|yC9JRm94B)2?7GLpGNb2h7jrNb91^U#0evoYz9whw~V2O#0hg6PfAejRQY z?+3`*`3dBD39Bjaof`SoqVkY_Q@Nhz!`=s@U>UzbJhNw%#lA0w#oz$)v$CLPA!;7y z;HQYf4gYHBxT~l+s&T5;UW*N6Q3u14fIS;%W9u_PSRkhX12(R(Ww62n7XIQ@TcmrC zus^QdAm>O2G(wm_g8jP`+EdDJhvDf({Ss!8xBa0BR2jmVuea8>jSX0}eNiP`-I;w+ zLwGYX+eP`}mVS-d*m}t{I*KX7;K(=riUF@vG2rl8f*4UoY<-Hj$wR`Hmj&~aG$&Yp z)%eP?4G+I4UNIl-sXAQid2IfMiJs)# zXF^NeA%nr7HcPC~vDx6R%ojV98aDj1%FeHcsIC_6oSvz+1JrTA4RjzRS9`ztTTr1k zz}5+FlF+cqXNyCt2)%K;8%6%DSW{VR!7uQ0r&Pe%?cJZ+xm+adr)@R%-GJ+}c+krB zti5IUBn$HD$X%lyn4?}qe8G%D)-aH88~8H%3`JsCuf%`)Z90UGjKu@l>PN3n zUI}X$5~e;Teii?)_B=A9)=ovD*ZcnUFwd>;(cmU(;0|81Az?30rF)s~w*) znz=*!7J3nejbhxm4e9ofPGA84w%*}&QoMBVvD%NkH9hIsJ2pwvkzmN5dV{3ItDM@8 z1zI<_czKPvt~6OL)gSE!v-IQbK6VaCeK>7OhQo5I4}u?eE3PHEl#h=&yXuOMHs2P1|TWj3pP?)4Qt zdLLnBFCh`4ck&dRqy*JbH00gQQj!;LmLD_(bOW{^J1I-<1IFc+9?Zpl80$f(Nx{UE6_jHv;C61YKE(j3y&|W zPnKT-E&LqOo!~5Xt4_q5)F9?N5n?M(ZI^?aqNMLe%l!umt+k+DvZrj08bQNw=ZiBM zuIS|aj-t9rS_fwLF8k}Py&7-O)c55fI3Vevpk|Y|*5!OQ(5qt82RmMDf6iaC&99)1 zs(sUmy_|h~MX_q@s;}q8)zZ8Z`27a~ZWQef(~GPE<@7N0M zA%P}UnHUChlzULN)>?CE6X$@+B!O_sXx1Z#k-(Y>pm^AwuQXFX(J`FyNe-gGOV<|Zs~ zCw$oEGLN3MH+0?fE_-ibbyNrt`&SyYmAgbPu^aqc_h`Z2ZyHu`ynnq$;XCg|xvtK^ z@dR*oy7FCzo?f67++GEH^W>Tx>613Vx3P3Ac+MTd5}6d1%jVWD7t9#n54ka7LMi^4 z*SY2P#++i7{5KqjeBh920LkQ{rDot5PeC&J$>zdq1GS#b3%{Fs5et9-gw)3B>Vdi0JgV`}7`Y}wE} zlP}Uh{Q8RTd{bvv=b_FThxXg8>EHvz!*3s!yh;Y~Wn+*3I9{BxYH}HA&%Bl`z~J6D zT6xhh85I;J@>KNaA;%TyvZKSZiJ#Tf5Q!wVwB~DX_Co@=I`*;IU1H`N*n^?IUxRep z$4}&?+#V`NedG72PzsFC^%C!s+4^p+7~)5qQ~G?Hup6PbIwx1YfI12)(PLpBMkP!V zgWx~9@i+A%dP%cZj-Z zi6{r+=w_o|%deiHIu~bjyMS2K$i|GDX1Gl$ZsldcJ!W+ zp8A;=5WTT&%6*NK_Tmgq{`Tpt+|`glr(Wr=Ugk5A6fIQr;%B=vUpK2oXCq%OOxM}m z8s2FY-m08fKQNpK-fMENt5CScn>Xdx5%nMF+k;j;{iXmhZ(Mm{mEx4{{cHWLTgPj% z_{JiduZ1-e9g^P~Ea-V^RcsKb8(k@KWGa1AHa+L3?|U}NTFWD`W8~zr+eLUV-hZjbm|*^wor21{kQvX z>$2`b)u?vzF%mO7JU3swZK{s}MLEC6GpOUSNxjQO2-mAT)!YD!i5q%-tMb-9T@ zMz5y^Jg(;pS`M{5lDdAkd{aIkcwb2v>g;;!?{+)rJ)(e0X>uE07U7T_F)EmlfLq8T zH%eWH3k=Lvky}IEr&O2q)}ZkgRRli!NzkCT{uDv13yS94!tgjs)HNHcf@1OZS_s-{ zMeY6lT7s>V^*YHpj1znuyMf_RD`gYjWMNy$*M1wCnl6W6Icv?je@MI!R3FIL7xVpK6{`|Vg=Bel!4y_ z%GkPOuu>Cf5O9qW%3lEk%1d(@_H7_`x(VIJ9gG6Y{6FmGarTbnrofPDh41Zfie!8j?xPh?*WJQd6k;nAG)& zT;&tIUxwP%Kr?en)H8z9ma_+SaJy4kXjVpn!qp_rlVB|3!j9u-N9cy zjP`nRRk?%eWF}iHN1sJ|lsaa?d0wqtzH_X)t@+31%J8oNyMe2D;N--yxayfakqTJ; ze)Wez6gPoys>YB<9m)#Y84SHAz>#GUWv$UdSKv782yG+}=u<*gNxy0d8FivdKW#ZV z=0<2(Ep7au7QRpqZrO(YGIg6UZg8_|vEwU43b@-Zey!o8wu8jI!vVG1Mq>u(4)fvL*cti&=pk4{Ib8nQov1C zN1b$j*Qkjmh_Islu7)x|z2W!)d{i#$wb1nT zpP1_6C5*pXk&-mi{al;c3qYR1CeW4eEcCJ9r2UKRdt~vJF^P!H(A;V;<#ha!lT2py z>MK!UPiJ{w3tnZxQ!8T}b&(IX5v$#JyEK1atFRWS*LP3*%J@<090rpo#QB_Ni5ie_ zOY9T@n|Sf1xtF=@saLr1EKRH2(o$@NeY-L)o@3@u-G*Byw;9fYSaL8*EB1vMRliJO$7l*cDQ)cf?M&hx%d}s?z z>tMAUzjEVYn&`2JOukLOCq+qg%soers0;b{~Q znz-H$4DQu{Gp_T+W}p#(1mU3}I>!)HdcZ_K@Z`Ax1XfizpMb#Q6&iZVhrHV=f-}dw zd!W${)IMT`(89nle>Sot-k%_U0J%f+kJEykPbKp`Y7f+Th_`<`1k2`-7aQaA4kXCa z**xS+So$0ea-3B*QHmhMLdhAc@ry9u#UkcQLOoRJQIzW&_4?J*_VYLDWkM?o)Oc}J z4CgE998lpPFBE8?3G(O6!y-d_lC};0iGcm?Sr5y^``>ZyccD^VH{{D*>w&peqS>P7 z_G(=%w6;a@Yj%ctj9t79#!Plbdp7-TCah&6#Wjn12DITklObre3U~zvlzaNXyh zM;&@-cCMGyhes{Cz27{Ux9!NB%ig+;3b~Kt2xN;DrR%oRubmGnT**`E5{~2;)Sf5_ zG=mSGSS|nZH#AH9zUor=#^jL`?!Ndc5i^VIO18i=OUWHHoTbnME8(a$a~8|8&|U2I zc*hvjqnoQbWsuKHP~pkY{+}N)ke=^$1=O$qWItG|^UH*OKt7abji>I!mJ1c|Jd1S;SErPR8Y5S+M?d^2s+Rnjmpf?_1PN@QfeL5g0fKQ8@qKgyJ~is?eq_q zQ}H4;C_LfN4YoLQ?Kbz)%`1|zhr9|YPS5W)?X%?qW`bG1RS!j5|9Fp# zYsT$o|Kws&0^1@w4pDd4kfWXH)mfBDrgFY(yyMM{=Gl{VP zR#eO}Yh`-8sX%bP{L1Bymn%7MEu?2lZhBPYfyNA7ZO2uY95kTIW9X}z=kb{9W!7O! zTs8Go!yG;H_m?kkOx0d2@#;G-Rd2OL@v`G^#QmlW7LRv&zok+hUH0;>sqsrYVBuU? z2&`%3|LA4vookP%&Q&y(j(HO`eL5nK<-CQcb2325R`zQB zA{Yt}C>7WfQ9ufp7;CSrd-w}>3guR)VPSjUoqVVLZ$JG~O74EJ=!SpjSfsoBWEddW z@_R&{_a%{BvL)YKpHTV^`5R&tGubHXau9#B(Mo)>MnzRWhV{e1%$>@Mpa=)2ihu2% z>FKca1!@QO&`l=zO7HwlEB>vNK0jomOTlIMa>RLf~&vEEQ zt-RLzOg?@~F75AqH{@p@w>o7l9Kl8(Zk)f-ci^PiP`}suoc?e>M8)Ke&$SDkX!|+|v0y7Ta&4ni(>J}cOj1pwWBZtbHz*PyDAFUC!0E)}mz=0K$SAWD0U z;FL~43Nh~vdl0vZNAB0O4Asvaxjp764eOP()a6nj85?O2J!_YNu|$0QrlB&!IlVlL z=8HcKd9zA&xn@x~qS?X!%1bIm_7*oG^kHDXw(@F6Ww4%AwUj+OZfoj6PpWDh5F7Oz z8TP5(TT_99G_><`alnoA9r#oE#}xv*#BQRptjJw0{Oe@=uuZ_O=01(}<|Z$nP5rRD zT(3{mmfQW4eYf+6>B5@Zidq)i$k9MPlMC79s)w8{TOVPi0wzw;$m_!EEWf^NB`Y~?~$1u)q&dR=7ygIL+4JBW+RiEf_~Ew@U7UK>oG2?VyUM10--4)1g^vp48g*3k zrrO6~^)Asg(&xs{Z1mLE18j}*KR@zK|4r>ER&f38 z$LrF=l;roDB&Itsvh zpwVd65ggoO%mTSlQtp4v@AuLHatsjJ_GI1f>5->Qy76eH>484Cv#IdE``9CVQUeRy zr{P(l5VhH|)C@>h{!ply5E23NFYC|1N*BtuFcD58-)9L@7-!2UcUiuq-}R!>_aK1f zfce`#!4YKnNct;=>ptpFAVGALIOJ2nXo`TRwCy2uG_wfD&un+BL>IM;e1@`Hc_5`R z4IM)o(C?8^qcXe;ls5!%@Cdpdd=ZY%)g&=k%lM2YXJqdkltz&ztMzPn;}(m#=cXl9 zUEm}T2jrDkS6bE&dkz$rhjK7fiM{r#UtD-8#8u6k7y5M+WK)N7)Y1H5!2=r9hY_<` zhd>qpyh%U_eKg6IIvmCYZJClspc7nLxK6?TxN*G}XiH95niSSED>o#E;;C}iQP_3c zGhDcX=i;CcLnJH`NEqqkww1wivBMh}u2bWMultfu8huhp%VH9I6WZ0%GFm{m1LC^* zpsB-7VyFp6{3@_~aTMs;z?>9HWx@cOS5hDZvD#$5$z2>DA7!z44vc%tUB9iZi*IuBlO*_Io zY(YvHbH-50q^idjWUPLkWmehg#gD-}e;7TN<9o$aeGLCF0^rXJgC!8Yn0*lyPitPK z%JA}bGqpF7RzQk}6@Cr59nWClGh;AVsdaTWoXZNk*}nPin$zcM*jM=&QPS51?NTz!%@p|6-+U+@1HT%h^!t5jSUP&#=rM}YMTEn z4@pbimR04D?*<0_y7VH%w*+UeLL3O5JjCA6>W#p}jU~i8`JpW{R^>@R9NAlVTLz#1 zxkS@Hzhh^rte4yP%z17mWhzgMAGLkZ_u$Txi%#K zNQdLm4EYdAk8iPAqTMjN@WpAi507*rB_=jH%@hb~Im83^1nMwU=aH|KsV4oFRAT*! zP!!J$VjXi&+yR}aX<{AB_1WWHEI<-1O?~ex`6Wlrih#QvEJgpx0whq@n>0wB%uhUq!&RzG6EHx_ z9WP9@2&4}wO=mwY-sJ24LdD4WS{vJ|X_+qsMF9780cN><+ zF)wm0F@Ex?&ZdkJzOg;R_#>`~#aQF5}I&Cf&bjmTV_8eyBEIki3HLB86e;@l%RCo*m3+%}Jcy zV|ep9k#qZ_NhxvbZZ##aQr%HtZnMd12orvC9#cFmzQcBe7u?t^o?pr3kg%4-spR`>Xx57XUOIGp?)_VR_^oeszNlYwGY^C#p3yxYhF6c%*x<4dbC&l-gito?U!_pvuW6aEwc1)>qeWEt0wsJ2qh>`G|f?bXqfWO;E`7dBzGXv z(%Yq_pxJskd~myzZ!8xvU+4!4V3H94z4gAIkBAd>_I8SgGAclmZW^Z>YT@3>+c(Kw z`au&hA3o&|2pId8JLaWQrn7Hr^(?p)&L!2@zHTo?SO?c+)H*T~QD zH`XucU4_`;NKBxwd-`e=u)c0XooC`xs&=HPf2-afQbP5tw5OE5{|5r2{;I`CwZ6@+ zd)J(#cgyaF_L^5}en_=o9j>>zdOL2Hfgk!o&-#Aj_V5dn%6Go6Qj_Omm++jw;Lh#Y zdC!fVjl_P>;T?n;q1l$YQF^~lGf!jW*HqcAig2*qLtDf6LcEJtILFA~sqWqQg&*1%k1*7f*iA17&y>O<3X}@w!a_1N{e6Zk`q~f_^X?{lMU8@?SCL`S}1o-bWQdSEraL2o6Akm~T*D*oq2;2oad zUC$FPn(uBlEyaE%-2hho`zY6EH!d;;sYCPsfsAeL%F>-3km~+dKT>2PI=^qKTy!d) z)qPQtMz1&nRLRGmi?@#5{iF0p{#Xak6`c3`tt;hi*CbA|!&j??w{CjHxF*V9@hSSW zu8~{P>hv2ErScC$SIgw^1c|h7Q5e3ZCH-fs_OH8Bt=rqn0RZEYx3)d$n)B8;S1D){2P9+nbAvQ3AoEnh^QRW1jDRe7iq@xW%W zQ}rD?aD`+f>3Cw(UN7VySTE+E(@}lp{Z~13Ii;+xT#HQ#qd6Ue6qDEK3}dy>_!Q6W zrq1T~f)pQBIx!z$o`s-0*bp_XB`r^1J@>l5SbZ`o+fI-(4}{*;w$>`?T>7UtUUBaE zpD_8qC$Xi(*U#ed8#OMKEB?wi0d4x{Kuv<$^V2_T$&bfZbE|hYyo&GrdUA_K8OzhA zKDw&tl0VgM5%`8k0)_$4Pq{8z7)WU(D*G1=ESo%ArZ*W12;Q%ZYK`@=t{MKBFX5Pk5U$2-WdgI6yUCgcZ3^|0*xzAtSm8q)OA+4SIc(TTVocmoiwK>B&2@`5aG>tb0Wiy$ z@c3+&MM`NPF25kDG!R`)m&CN0W{Jx^g5%RC9ss1_+QQ5MD#5 z^a$XF2s7oIgF&;R(r<-93-_y{R|uyd)cwj9g^z6{XIt^p4}JL^Y_Q_**lhq^Be?YM zLNLaH9S~twdb>!ESo2s}OoCe0 zzgL~ALq>uoSXi{;MttrIZ?iIK$KO(QH2%;;bRiHG|MN*Yn=G96(RiS+Yc#oO$TzaF z;e0M*@RRk1U5*f}VzAPXL^}IO7o-376Go5&^-}srrG|p2V3VVZ^YS)E<^|%R zOEZsSCIt!j_=xG&C|*RPzzI#nFQ8ESiMkorU>fY^lUlwvlPCG)@sW#ie#jO^%3U-F zO&4hx%d&>h_UhyD?2D|bxZl|!WaT(k5U@&hi!83vV%IKpzl3pfnaj7UtYr88fz+9K zdlg{OSUPPumJ#K8p7}?{Glh}Dg<0nmTvw-As=mHK?T~)yya`};__{&1-mCMKDZw2i z{B)(BQYk`+uCKe=4PVOY{Z*Uge^S*xPVzyqo)Q| ziP8si4@fCvLh3@_8wzIxq>z&fhx1w&RtWm|J&Ta}%eA--Yc-zA zSR^a(-pv|b0%mtZl4;BxSjojKuf@{R?eEDdO8(Wd!wcAEl}~KVx)_MAdKNh(!pe_c z;aF|8ruGtQQdag7+z zQhYhic}DgW0sKwVnI{i%IwE$z@m%u3-iWR`VT9e%9#_)lHgZv!_aB?J`t6}lTjS|H zS#!~rw!mx%%k;hy&mfYivGj#t)_!M@(d*LGPeWwfp|dUKaKk!Tv>`WOt3J% z!qg#rQcz3>eA1BdDLXhfg-)w28xcof%L}r@aNr1o)h5cWf-Dkm<^U;!Oc6Lo5$s| z3Vq40sXyZWLgq2#r&eyHT2@{c0|tfTm7eJ`HgWcf zj{}Gk<-zCl&X+QJ4GUIfUz+kM>7@J5TXqDvwn5L<7y4Xmt=%`bG)tdcp3Ad0S-H(h z(Vsda5}DM|u*`NJ^~8J9lqAFm$ZoA``1%h%`Om|g*-#UCc!qxB!%da5@L<)Q407r96vs=yokNh#cKfq;_L%Y0-MQS>|1|| z@kctWT;+V?iTMNhicd~Y3)Rgrv7Ccn&c)w!xIFkc?0ae$cqg$fA>TL3~qB!a@YYR54=4 zHY~lQRyxKI&uCXG@Sn@m3Rbb`e|3evY+6WcEMj}moRDvp8+k_rB-S%v;w~>EVEs5l zlYZhmK-v|}yBS<7mQ&E!ur2CK8GfI@)|}+|@4YeanOmotI=C*{P8!DvcMK03N0fhV zpSHKW=W|ER$Z`^8bZ_)S##_at0O@|U8Ms+ ze09$dVWIaCYSy*sIde#n#yv~b54s}bE zwBNAM>{y7MP zS`cXmH~^|4)DbELZ24!rtDXRU+-y_ZrdKlfZPd;G>u=6%MrtB&BIz=T$~t-SxZH&B zCFz=ziZ;U$j@io&sxK-UgsYX+t>K>p4?X`p{4$p6TKKL(G|~#q#-6}`*HC#t+lo3& zBS5{QY@havooI>B9Ob+_>`7R5uw|AwIEPzmHzg(VnaPe&Dp$pH-8=5`^zz_K zqs3^E^Yoi1Mv$Y1oZ*haZ_g?%e=o79xdoLz3t}3zP1=wLVpby`JrW*oy`%S3yO_6W z60eG-nm>b#yk1&t^v&Wge*JYCxmudwX6b^IEAZ6{w7(Ev(q?w1KOzD-Akd1ORd{@K0~}wp?XeZX=@;Z|e+1syS}8^FjDvq^&QTD_untwtD1(pO4ZA zyt^OLugq7(3;NfN%SltY1Y9)VU1qJ`nQ9mMRC(zPBda;!ih}*bZoSb;;f2VmHOHtJ zWBErOWCyu$MmGb7IAYOJ5u<@wST(3z?lL=aB5Yy@${G>Z>gNgo$H}B;MS~Yqxp=|n*HNkbBQ=j+#PPG~-i2indg%EaI z%&T=hwBx)!M+5`K?iwwl&!c(0X0vR&0k0=>3b4h^#trqtWsTk z$P5*<#`!Ho*v3A|g<>C?TOxxBP+83+J{c&qB25KH|Ial z-7WIqbEZ7KAnfMJJ4SwZAdA~(YH7(jGuQUR&^b;V@r3>_dT7e^8w;Sb)-TY-~UzqPrO2lnNk#h4iWBb_DT)=H?C=AifFI z3IYE0Ic1E%a^hgWHg%u>29Pus8;+;2yg{AWOar~ll=@=k#9 zmB(uZeaWi~-b5TZf=mAZX^e?{LcAkOL+_`G*8~tg@%aIbpU6T2mgroT_W$l9%jScb50*Bd_j!%veUnTSDArhoKJ{F> z(KAK5c(JmJN08%nKz^yqd>&FXaq^glqtQDwPeXhESJi^eJI+}gas6|87B9zQ0s9$9 zuCYODn7xw~$Tt_jT*7xBlp||(T;rbIU`{>cS_NPj0IU!L4GSvg0m%ZLs!$MO(*V%s zc7ina)~%D_C&r?NHf-$#$+74tJccnS`y2r97g~i|XkvJ^Zp;mP*}994;pR|Dh4M3Y z{Uq@g`7ck_b2TvnORGxVAVd)wx9%>dHS{Wq>Zs`{d}t+K62|(yd`||3=5vm%X4!)0 zDzl&{V+}d^ga}P%xYwn|Uf6-|>C>|E!9&m^XDid|BLH;P%QHA>!2-X1w*fQkWmcX5 zC`ySZIo6{?fRqL)M~N7pZl*0gAJDCT2q(R}0e z<-Rh!n$(iy4AReal3S*q=u*^RFytNPkSJB$WP87*D~|qBRSZ^r*Ezm4TIVEHrf2D& zupSExM&4tDTMO>uwGb%hd~x^F53hb9P1zL+F5bEe-&NB}k&VOBy_()wId4oG6_1`& zc>IE7!MpwYIF#{5(7K|alzWQmu08X>YK*T_=k7gU3#4(OPP6Mxpm+i){g8c*r|?Mn z2d#+heEwRzBPY+A-Y--j5zQt`nU)NeTJpF-Iz)qU&0UgCIZd z7l<UK;%=72E>RS7OPX>y&XsqF|K4nkxRZNSu3?ttoOTA=|tSZSR0`R11bmn#)Ct zZCVPywUyFUii#R1bY#B_8jA-cBBl%a-|;q8(*AO0iBY`|I>Pj~DUWQ<=xl@Z;WuE} zLY-&i3s&*VK6`QGrBvT=rS5Y!r-J|7M>`mMNlfOtNyof|>WsIf-x=;53-Rn8V(&#t zrBhD{!xqLneEQ-eppvSKLkVOwkKLvk6-?0nraD!__nFVf9Mfs>YFH~#MQ{&fj~N3U zKMs8;X(=#l)Cs&q{3bD#N!Yn|#oJ-IiVnt?2k|L-+vfQdLrtDS>)SzUJqgOkiWd9oi;!y7vFC5*kyfNkWczQ3klSv1gew$)8`@NGSO= zFv1TSPV;#~$SR+g=A3Gx3BdU2|Cui-tKRCTviX1G8FJ`uihaQ$F<7!2|GFmBIR-D8 zGV@oZn^V9NE~RYV+Wk0KQT_`dfmy>6b{m{Nu~p*HF%DaULQ6}kQ1M)0?UkxO z_jR5rG(sfj_x1+VJTaXpX<(dH4KOy=SQVi);Er$zWU4U5j}QZGHs-n}%x%x<9VD#a z>(!z@Xl%eXd8(FUV?1Al;{6{8&soXeCn~LPU*OF#JT$t^8}igy$%RzmVlAs#2VIum zX8x??sf;cjT>hI>Fp@3ADiuFDU&+fUPa8E#feGtFvZa#6E$p=?2+Gba{cBdnIZ85$ z5VCSdR`Npl(5j;|Jixy$vV8SF&<8tBM2UFdpOAb1uII64=9ruWB>k72HJFPFJ5cV(`d>)bE7 z-*TjmTe&0|Q*@ALir0Up%j!QSup>-Bm* zEuPP0jq-DmNfbP?!JUSx4UQ4N)nF%Rhj@aG>?qc|GjM)c|NYRc#wb=?ZdvSxkUFXd z78*SU*TIq?%PRM_+0w4A%CsqnIl7^`V$|&Ray$O_^SHO)8kxpzC@V*7Nrr!UkzFr+ z?`Jzmq7XY{TU=8bo0Mw+5{sg!yIZ?yrW<7bzPfa&^~qMZHDX0d+=F+TUQ=HwQ&*}R z6e~IM5)WESe^|<>9ac^H4^*nlf)CS4ubU2GJhdI`Y7$W<>IVK%wcQ5!C1* zFg0e#?U;4_y+H-bjv?by%qB>@jjJI0hBMfZE|4fMx%U+S{-WTt z^cx9$n6-rT0`OIRtJPZRJ2#EsiHCKjUp5;?zIXP}j{y?pk7;^#_Uwk)u*6HSO;xrd+}OkqmTn6v^SQ8?j5DZuaic)+iqMg4&W)VZ9_H>> zPGNk;KYvyg_HUP@-%cNp(L66yI0Q5iL7R7v>N>c4?Gli+!jve0i;f!*lfJ{f!75~_ zE|7Sm9Jd2L!@4z>CazVr8OojBUK0He#JHgr;Blx7Yk%5cy*6 zKal^t6;31eU#F=M1|!YZusA|ky@kwPgG_Ca!Sf7N#Kug!4ZXRon$jDIIL@s0{@iBH znX~H2XeH#C6I;`r7)5G(Cg!%)$a25pf`k9mTiVPc#M3JX*$ewDkj@>ul}&$ZR=pF9 zO|F*vDP>)Y^Jacpz*D!?%ZbS!O(WtS1lmVzLU7;znPz>)Yi&b_4Gr`d^sKOsOV)4x zXP;m!%5Eey^v$j7Tw#eN+n)-~KkQEE58?~EDUFK!f+yUc*=Qv=>n0wvxK-lcvwRi& zkQdwieT1=@X~nv#pMF~H4a-_t>L0_D)94C&glDqf#M_WOs64h@o#*^a;g-+E^I2@t z*+BVtU>xMzqsRT-R<&3TF8wCj6NF=T(j?MCVDY0Y4{n~_eQMKs(@m>{K+93LNt0%L ztXr(NG^LUHNfiolG)wY6FA3B)zrq{B*tDgJ13PdG(r|9%g;?LtL%h@>Ky(11Whn3d}t5mel)Yj?+&+N#U!tM?uHNxGASJjH;g-67H zKU+w)7Y4C-CU1C{K9=#AvEll(aWa)1(OL0AC^g^8jfs~y5XMb+Z?&ej)h3bLaYsU# z+uLy$a9xt$X7|<=eGQT-Zp{y^${$DRvz@tEzO4Naz^ftAfz~4ZUYoEUEO&obwt)@S zwtRtLOgVlVdIJyoC3xE9Gb)nrDRFq%Er+AYS3qt z0KrsIne3U?7&f+!E#>aI5RF8_5ky!{`XTuIcRldPj)i=d*UD|Ac-~{v^o1>%N+tY+ zDnrj{4TC`i;7;b?vvc?2wgx?jV#dpz9$euOxZfcM)If45p`Ya1xaI;Ji~*zM5KUhZ zo4#_j_jbyfo6^D~CO(|GK9G4UNcyK2C^2?A7pysCUuE}QL9C5kkslcU(D9^rO4E(f2E;=ND5izoiR~S#rafzWS!6=oY?N%^`bV&GETT4ymg4a|)LhpT}=#?GN z$6n7F`q-KB^dn`5gK>3}{B(kyY~SKT7RensWG%Kd{T$H9{brx^?|?}6>x(HPiN`JC zb4)&+iXXpgjRU>>fIs!|U|jP@9pXsh{7CSal;` z7hmFU;Nsx8Kng!`0AB?y-6OM($gBe0CvD8|#uyw2GUtA01L3^Hh_^9T-;@WzpA=Vn zfSmdXRK{KGO}qdd*rHENX)p+bLjl|l>ta}s1Kv@TyW8oA(I~FKuvE3F(-TJuB>xbd zzW+3tDI^T+#PFLb2AFR6Gs*uX^N5EN@l;MkTq__luP9l$E5IQAjbcP*T1QL)liL&= zJP8&)2o7)!QH!2fL-VYt_8o1EF#^oFlhs--j<=9V7!>1`k;;^~x^RLEjStq}&CUE)AxSD#uBjOVs}eV5Ga z3D6}NtmXlq`gzHc$PIKcSFeQ_!*XeIVK@NK$l|&}k1$u51MMPD9KCSDncF9m931aB zvG}NRFSJ03$Q8kq7LXc5^NLW7mY2AldtYCzZO0t1Ptq+TC1Q{~KV;DnT z&1D?!i?=tj;&j!W(C2dCZI6;jj#WoL=J<}DKvpH@CqKi)WA_!~S4^8xTYm#UoEE~v zdJYP#fH2~JnoJ^2-N@ATJPLTIwz2gLwO3{!#FV znL)Wuj#7pSFxS**$-83fEYTQL!>2^|@9*>BnI4*E})PdHD~QIPdq9f-ZU(YnQ>WQ)t|1%SarlUwF*PRNE)91r`H6 z3Ix1)NTr>Ho2~qQQA@-GZw69n2(8T(0c81j&8qc!PknuOU@NW9^Xc^gI7gSL9|HzmLis1f8yIMXj-p)tmQ zK%Ya3De(azH#)GQTn#d)5U#bNPt=t8+B~;&u=P^=MLC0}= z4*C6s;e_xn#XcVSQzY)|hm%cKTy)}`zQT1{dW+cb@zou_NuJm7Rdtt)G9^pW^Li0O z--Ucl{L&-n)S`2h+F^opx+m>9ttdi7oB>CPAst1?_JtKrgtQg2G#a3QP}12rz%BvE zivxHTymA(PEhkgv$X=)AL^}nkhBQ3f`}pW7#TUvjM6-Q#i#X0YWEUmAnm^JceLx(l zsY3B46U1Zj0-m1b5B->~{|)Fk4$%e6WgetkrL8l(;0A9(yxLUwU5@~WIU3-M&_s4K;#!Y*tEVv`?${~VCuC??MX=l<$=6<8qTd;9LHxyu~ZE`R3m#l02Vr z+>`F9$s7hUqnZV3?eOWzqtK9O!7CRe6~l>NS{wNUF6!K+NymALR!b+ln46PNyly6r z=1P<>ysAu#VgnaQj`cBz5~b2vyWvx1)fniAM4x)*IIgUV(>WoNyx~?l z@G*6?gw~3!F7{?w&`ctg^Grn-Xqv@d*@{;U>@1jE!nq4pp3cU#V!k{t zMmuUGwV#(LwLm=)CUx9Ku)8id@yi%Wd^k7%**n%#g$pM+X4=e-Jw|G(;{9Y4a+jnOmBC{TO!uiAh} zy~u&{tMGf_2_-iHSmrJ_-v-+JlitDqOq?BC;q*&2ArBtd<2VP+=PFKvO(zV|tK$a_g*rf52VRTy^SI4#sGgqrYR9+k^NOawhkYD6~b z+^rQ%9WZ0_wQZjBc0w^eOz*${H2f^axnl_KPKoWT4K~Y1pVvPaR9bk(UJh9sv>XuD z!!F}xd(XsU01Azu1xg=bz0z##=U=Itm(|zZHQ9kH5+iv1EJF-CvB3`~1hy3rb)-^x zfz~;i-tDFNOXqtUFao!0uKLYe)3!++CnA$-0j`0y<#bUAZZV|+pY=62(Y{R1Ivu25 zyrJTH;*nkohx!|va{xy6;)WsFLz*pAy1&fwBKq^ZXh7!91>JB`LT7Er zQa)}%$#EV=RCM?$n%>N9k3G z>usC?i8bD@wBV|+Gl96L{6a#RU%Nr6O$I*M z!sq8J+zbCXcpm1kUns=HP%_;xRCetti#~2(Z(2lDLcx~me=BmtFvE6KK`-WNfJ_Np zLnupt=KW_;RoB7O=nDK|%)xK!NJnN96cv0X@S&E4l?Ey~$i!ad_r5lqK?5tBGn|?! zbVG#y$+<@9vx*??c4{S0 zs6b}&$$IJb$jOw=c<^P z4kr7swXb(mIG)5l?OaoOQTL)Pd++ubZQb@ylM~|9psGto6c*;+aH{_MM$PYcjtSP2 zTwjZDQ8d(1-^!_r-r-_T7DAebv(9aos3G=Myk$-6e*7>6zp3;o78w zzOU%3dxPHXRRhIXmJRFE9{CI*+#f19RcV<1+ykU7AfXL_C^HfW63=Bzle|T%-z_)^ zk=)cEu&Hi*oR`uN)ps(Bn{KFWgyx4v33{1ni^pp4$CO!ecD&7!7iSs_7hTp{2T5b&Jbn_Q^hZsKt3eq=xfaVCY)~KukpY zcWWDNl^Cvz+`&I9L)w5ti3b&_Gev6JbTC;<{`2JPo-(!ZJ zU~#*kF+PLvuJF2Rd={fnB?aBm*0Q^IMPiHoF6l^6UO0v6$d&!V_3m(Ra|gVO4Kth! zIrCxtennqtV!&>DsNDFG^xN=RRxyhzrNT8!t$g6j@8#kr{#$@S?$0#OHd8q9$VWy| z6%x|MY>K;S5R6Ta6x-Ab<0e-izv30?Dg5mYzShh;($eI z&&tto{id246hZY#-V{wMt%g*>2l5l-^g4bC;+G=Bt;KJ!i%TdFirEr%C_ZNRKoYy-6Uaz4ul%QaQXztOD3Bx+8 zg!Y4Je6bKxgE{rn<$I^{OsF^*Y>!ISO8rIKxd)?K`!x4X0N8ozCMkl}0Fsh>39Kas zc!|?s9>Ts3lo=$Q1=Xd3`-pE^8DYb0V_+d?k`7ggEgm>NS0#lR3%{5mh~UgPL7|ul z4;#zen-E}n;~62`Q9>-Ncx>N;W;*n;#p;~{OTOi_`=IQ5CkCV+6(- z2V_w7pkoV@jn8pmL=Ynnf!k-7e>$>t|0(M3F~%&x$+#aLMVBhi=8 z(~p%ter{@eaYuF1GWRE6@AXvs+#vUa7vS`*He6VRFEiRV0b_oVt++vz(Y8dnD9L?! zba|~noITUQpaTMtV*zPCp;{XU4TgN%j+R(KfmZU9&B4k7O`5CjSEd8p?_EXd;+G#`QXw-JXiQuE>D zKX7o}#*0-~GWw=JIqPO>uC9XUO)u2&G#$6R249Iu8%_yXSm9cfHwA!k;OfW(F{&K;4D;y)|;RYorNeb=NWjR9E$i_4kU*-jLho88>QV%TJq$dTb zB}+>s%W+a2l1byCT)GJYnM-mTmi!F7e+JG3z|{OV;rqX;J6YK%tQ$QQ4l_U-u2Lf{ zIAivXc&CPHQzLob;D4ud76~mR;N6gVuim?5HynUih;a(=wVcOgbR*10jlEuu%?bv( zKjS<4-f>v}f!nB1sPE~VWkXFrd*&P`RP95Bqosc%JjDb?= zD}NSzyUqIKTU7E6K0ne=UjXurFo0}bVVkHWc^JHhvmO3m1pRXfq#%}7vkEmH?WsNR zd89e&s9eLYzA<6w!OjbVDQtbIObxfG1XODuE}EUo^OtRqj$H6BEunqRb>oi^yLE5H zQuImj^ZmvX{vQ)E=WRoX`+dJH%bEOWkhN>62jBVYTZ+eEzXZ#2&0FN>@%oBPKI@oT zOyIrkta@qjaGy`GHP8pu97yQsm-KFvZlFzw|)&U}b{Pz}EO zB(hSL)d`V&eL9OzZY;rsY17(5h(>IaW`+>&>HC;&h>2i*!iE)nV zf{18S$|XHIvBVjj-+L7!b5x7NGH-^9OYe?VwLA+~jJpRJ6aBSDota*_;r2+ab49u9 z!e8et}*Y2NbW+Eya-|^;_VBFgHO$y^b z!PuwYk95Lmp}i*`yfyrW5x?Ff>}jgZU3O~CR_QBbqZ~Uvst53V@&aJ2kc7+Hz5v zaUd&9-;n*GKxrDv`{3RZH>E6jlW6%O3mZ;wx=~Fnlje&o>j~-nS(o0a;$E>7FZ$b# zRY23nNeYBG#*$FAD!6B90_fah?!JbnB2C}%qv%XI*xq5SWuRaxY7U7S$BBq&h~rU; zs#c0`(=_?!FsZXQSDNKkz45v?OE^C_n@xp>|Nc1gFznp1iHyX%O6e5}>ql1bbDy9o zQPI~C1|PMi*%K}riK$P2bRXj_xhUj6nS1k5GnkM|;5_;H%o?}6DwD6O4L!_dNzY+8 zg&2BxmW}y5!=q5NmjE&_veVr6fbaE*Tej4XQKGg2rz!}%R~e&zS@=aLHq^pelz+Mc zZy6f3^PBydXK||okfvbF%U;ulJ*3~Ig5GU_W@+!)oM%|AEUe)~U=I{o_^ zky7@w;`)k&GVYgNuA@qdu-L_1o+rE=$3k9bnu)~JM;c?h?|*KqI*t-fBB}}t=;eXD zA^BD?uP4tdjRJ$PGfBa})XeKpKA@AL)rRJe%;5)_G-CVxe`(!r>$8_`3-o=FDj}Hc z)At6i3H|VOt5$EGJeB>e`7G)`kR!4G@=N&cwb7hZ-5lJlKtdyJromcXh#V~GP&~iiqv6ovnKiqT$()mEuz&4QqqEs6QWhF3@1;Rl${mk! zO662UkM7wpp zM=+X%AH=}iTIs_#oF1W;-A)ER-`%NN_ZkfAcG>%#8MIyPM9=rgRMLIMg|Yt^MV@zDm>VS-af4*O@QN&C*N}oYMF@eb93) zJ9%&l?#&cQ8|QFe*L70XmLP8!>6O#u^mr#c7^FDB@%lgH z!{XH^^n(Tv$ylN~8mfrAGg(Cw0ZB}0D8#q2f z;K(J%4!+!>GD^^Zaj1o!NL-2!HyzC`Ar?J^ZE9Af<)|7`;u!9Wy+^J6Gw1sdlMh&3 zrWgQE0IdOR>6r{>jIXH2sWy#URBGL96R}*MPL|!=JFT7L;qTIOVz??--59{t4?C>} z>&t^A6y8N_SuZIzJ8#)Qs`a4&tTN@EL0^5~oO92io|8>MoI8P0fe;c6x;x0o`ODD5 zO~kw8fY>pJ&>za4h0O$ubjrNcwFvS`P2L2>zOW@k2`?vd7HHt~Yy9vJLH?Dt?*ys~ z>`-;9@XXvnYsD2`IiX>gTf9%R((ECbMUhYaYe|fQ5;yM)aETWN&FyX`Erld2Y-{}Qv0mCS{xSm=JAJq=T zv2gEn-Pkk))w3ef+N)N9UlJG=`#Z+WV@q^D(tFZ?3rO=*?%%6p(rbdpWpAumNvSfy zwvGm6lcf%a#M_LapH2WzB`E+jVQ?w}3R#B0h=F85+}p33%9dtKOSzv52Wiz0TEQZ; zN;XhWzr>~MZGHn$UQu!YUy)@qdRVjt-N0&A_**K)`Z1!i_Tql^t$RCLW7aGK{`#ym zpnuX}!bJ@MapqD$gXdT?)rjb$>QTOhJ0)zrKfe;D-K#hyj#K(HdHpEB{MWEtu+w znJPjT9-^Z+CX+|o29=1q>HLDJ>3+AxV%R~~213J-6}>Gsem7n**kmIz$l@_n+2OCv zo_{`?R#<}8WA$T$3iXYWKj4NQ9A$H{&4REq^_MXMEKDR(qQkgW^KwH^iDt;P(phN>Ap>gE&$#jvwT(c^4YSI_6ejwa|p%yG#u zDvsFWD)|yk`8LsD8LW%c<6NSiXBZO8(2Wz16lZ{C+Xkx{M=LzRVXZu`OlP=fKcVDO zt5TrYKmK1z2jwvJn1cs-Sz7pSQxcV0J<-RVkeLc6 zVZudSj9a1UwLdBC2&aq?DZSfb0e%QAVre*G6==MTKepzjiMEt* z;puyM>aL4-n#rs{f?kIHQV6ugN zV8)O8CbTD_(VH_f^}@tWz)%sUQ`>);bourTm4o8P`|gK=go=Ap7WRQvs*->V{)U1` zP3bif34{Z~NI|d+Z#%lJZ?>^%mcg zdw1-Xn4!6*!7rGs$R)uF+GVdZmCatWkI_5sx`E zOhTt9xJj-ir+1tt46j-Di%Q5u1}`~z*||&pnwUvE-^{y~Nx{PtLr~Yhv=(wH5QQ+r z>8TD7`t3v!DA(&0dql35!f$Sjo2iUQTtbSsN=n^%v{vHG&>(9F4Vq%Ozg3A5HBG!r2bAkS`b|npey6`q-Q)6^{&aofoGO?^N}MHU zieGzwT%o|bZ$EDF?nqzha>-kMy&T*YoamP9{OA3*7yr0_eUvxRF^T}iBZ1*-=R;p( zm|uiYgG?QS-{8i=dwX_7dZ#el*Eads9?&d`IGLm|h7K>XV4Qv`m|iowknSqxldWBL z9ct9eQl<-aRK%+qd%;|bc}k3QF?wj58NmXE9rs+ z-CGjr9u&lENJ{!=&u=(@~g~^j_ON?gcn@E)`w*9b>iT(005vl$0 zaFV@1qX*UJQo&%{+H^$SRsK#GvG=7EMPCPdGe_)%=gqIR!jVzH;W*az@ll}D=5ri0ex|ylxzLmr`*XAqD z;*5;F_MVu}x!z&VB$<5iK~MYOOtm8nM&R`XcNVufb&=)L|7$Ix#V> z0OTK+>A|cSR={z8GZgb=rr0-K!7>`S*s=+4hiYS{zXy1~cZmFkdnx{!bE>J;OqkVF zvLpoVdpwhHtM;GVcPyGKm%xHHXSX(%hd~va&pHvBw?(5qgT}+1rAE&6 zD9=C29ap^2v>YJ&x()ucts^4NFj`R3R9Q>)i!b8r5Y z?z1?!(U~iWP$}TpDEg6aCSa?lTYURTy#d>S8H{jrnQWk1&9_?)Zqt%A ze6P|=BNPQ0%X}T@Hc2qw4DfvcO|I%!mQke`tt{u|_Y`XF>O+DW@R1UO)JX<*fcCZ= zr(rA&57Fo1^c9yGF-dTZ1*P72U{2Tgn61U{4@w~H8?w7~Y+4d5APwh)me;>Z?U?oa ztAg%Xv+iL|!F{vj05yi$*9^L5aXODfqzl>b(MYn*ox;vu0Y=}e+|IndP1%`X5C+xqRikoD4Hz)xg z4Yg>ld#Ii#@X{b;R{7q)Oyg41S>2sTKFQ&pqsAInq~f&0`1Uj3JE3TXuk-!VPu;)T10PPSC6^97JjZ$t$KE%>Ip-YY7{X&E*aE&97q76S!r(ps zk^xXUKlhs6R^qFEZwZL$jY9@5=w1?J=6Oz#Opyz`&>7vs^goOEb|9>aRJ)!P}Ev_^Gi(Ur>V(!qfF7}kqsvbQo0F( ztH$y*O|hvNij=8AD;%V+b!;3~#Sw;m^iu>pnK));N=N}6pb*rb?m*C4V$#-3K1J2M zpR|ZE8@Oo5dGA*hWBU~#&1M(|%Qc*18U&YU0+f3p#3^DjW6+yhA4>(}DToa;2t|e* z5F{o`;}B5Lnq7a>*8If%qKB-JICj;TJsV&GsJ=A@vWXtop$Tw?L@mxA0iw7_?gwo? zLKW?zuzNLPBUxEbtv@1^8&ia9W-$^)qsaWi ztB5s%OUplMBmfqst&kkeHGQ{%$tp`X#($5@6nL5Qu2Ao(l7Z7snW%ji;c&TCniiSE z61C;v@Ku!#d2Zs8t$dS4I7BTMLgnNn=xgXHA?!CSFjS#d5aYABWL`FabTPEq>hEZ9 zmR)#)Ei(ne6w3A=4z%IQYCJ?HKTF=#k0Aj)tdty~!>V}Nuf10Bw+)i;e;7%zwo0Hq zdGDEGG^0Hr2``RDULT+`k1cIa$jz@gDCIBImC#XTQdL)SymU@Jx?gn8%RRW{(V80a zUHUh2W5S~SOa<6j#<@{*^AvWzc*jV-Gj z6I3@=9^_&e-6_C~$J_0FDQ46*juMb%vK5bp!Mq$hc$4IEfn@U8Tro@!1)2Lfrkj-= zAn6GOLDI(_y;nlQF1iYAC%I(0(*1H-PtVf3XXV1jvc1(5=UBVQ!zz3&tjq-NOVbXlCKXzJrcDGCo6~X|GpaB`yQ`(BuCj!<9SgJ0N zupeTe{g!}a)Q;Aq{obP5+LGvmD*yD?%)Lk`3~FJs8z}6a_Qsh6Fk6Jal#mMRI>B+s zpD;%(IH$n9-ZH&DZGDP{NBA7cTom`>1 z5&v48OP4RvU(zou5YaAw-+)Vl!%Ge$88Ije*VTX2sF*9(AMqZ1?CAZOHb+|24`Q23 zg~90Q6^*PpYK%G9^x!a_COPDC4xb59n1+u!afAmP!LJDS>NyZ_pPN30s8y%i8_nIc z8q%X`q$G49*S^GQ7?KdAz;-q+r_fkToRy^SzGyYgEH0H>2*?tdH0OLVKez>LJ#Fzm zQ2PcW<7BShpAy6X!GX^pkbmYbIgl^;dLFd@!`@JBt*;oJ&xHFG@>f-yrFSt(ru!TN zmdE7;s-UG|U4g^LWLld9KR9DM4b(uNgGv1F(X*-e=gJXMck9I)hR zA>6C=wRs-vGbI_t`i}q~K>c-53@gbGICy%Ef8gvgj@5tk)vn9z-JpeoYKy#|TO9vf zZtV#!Ihpy8KW^1yFLZt0>?S{2oWbIou22Se(e^u;nR0SJG#+A(It?njdPkvq-Xav#LKEDXp{u!Y& zCTCJ~;)-j3kvgI<#Lf+(eyZ?^m0Q|LjyMTx`1v9&gxhj&|2h3jbMOy>lLx6+u*FnM zvJcN#v*jE%5cm_8J!GvcyU8I>v4_AMZ)G5=(3srmDaWSmOGT(fU_iNiJ$9s4zNF;n z&)1o3a0~Zn0HZX%v?A27ukL$gsB*bXwT6l%7RRem7EbD}O9^|i;6)I()#a(sETJno z4UW~&q{g|ob!nm)qTI3Vp$@8EDW0Tdpvt^=O{LYINIQ*o@F?4rUP;449iz2^fB&31pG0A&$DJdB7yRtgFGgKFObdtvTjp4^tQG( zpt?3&(R*L##35<)BJ#6=_m`LEPT0JQp;5wpzfL}8`B^&(m91_3o^DcaZrwbS@Q9}= zL0=_aX18g)KPdD4XUKn`xcbj3>&{@*6(;Nny#apngZ#Cj=MpouWpj+1NW&Ohwe@4w z?qpTP2!$H4ZH;YzMQ)peV`p!MbZt(eYT$6eLl{G6Xf$oDh_CbhpqIh^J%iFP1r4^x zQ^-urkPXg*J=mpB?9-TZwDopx80775*CB7Uj=tR$ztbvms7Ll)ib&k3_xRG%DaG>l z&P=iswZ5dULqD26t2gBVzGjL0#JCGlvCOZ%_K0co*GN@5Y^hfAur4@-Pl1gcq{oLA z)VdHMnZ;kSt1$4%eBgpk^T^hqfsc3vL^4!6HZa7|HI35+K+!rY2>#Pt64@h>0oQVl zSVw$?QRlutRj<%B(!00j%74E3iF$~b>cD}^hnu$|JmVp&fdh%@2RBM^bS6{AC%-b0 ze}nq23Vt?bJJh`8#3#enRlDTpe4%AULQDO3rjbjbNR#Z$BFRd)E@(OUW4g5czr`d& z5sHZg=IKB2^LS;5AyJ7W< zdagrW?3q3LbW8FtLBQV;_wjiAOAKZ#%yuK3TFLRmYJTqOCv?F%US+KhAU+Kc2s9Kl z(p9S9u16$r!}c7dh^h$$XpHllgzl7Ml%clg^tvdKH^!%y!`sJh=w+oWxT#!!gre98 zlD;CRk1=6rU?*&g=}Zcyu;w@EVyB0FBYcs-JR-w^4+RFlh2yCBkX>vj&}@JIAE^H~ zwI{|CBKqneK2TE7kI9$R{e#h%9DX!-9)zf6$aGsX>-Twv)=CmO)sZ?V=m7nQcG4;nI5!mb9wF>3Y-exz^O!kOV-=>(er)FQft{)DSkUs zysLG(ReS$Vfn}=RHcM-Un_o?ZNBiErqbH*y6o|0i%$E-(Q%|!$2I2&^>q~BM3oY?q z5n1K$4-dNc`Oy&KLb)`Y6e`rS5^lf2a*KVU^j>)M@}kL~t4=nO4$X}yrhR*wMVr5= z>R)b)-AG*D##Wf4@`vMdkB>_qG5uB2cJBNLLmb(soa*|2>vDZD<>1Htcvv)(=J`=B zyd_ULq#d{c0(6eVQEwsNcqBO6hFA77qdLI{??px&cLy-qWT8&jlN+V#>>uQv#|Xa+ zRUGka{ttB5rJ22BUDr{7@dZ?fsN@u#a!%KNi5X|tw~#Rp2B(i-(NMy(jgl~90C>}0 z_2*HYkLj12n@t-tg(KPteSdKx1+vCp&t6%hH2^IA&$;kz5CQb*;DdP4rAZMZdp8E?2pDWYye?}9KOBlN)d9nF5^B(HAd||NwECJn}>3Lv- zGv3;?4|dRKl+`6Y79!tv&&9||q%6tvOosPk)*NF^smmbZEcqJ_vT z{+OZ3j2T$RZ$FcjLI59;l}$b4vh-`qqH`T}hAgXhIM0Pw2QG2Vd&5@Cd5`5=GqMwA8`RPwe@-w~_48Jp2_gmH zm;G*fVW+-J<(fzCLv3X>YXi*7jKl&u0|hR;WH`HiIGy;xvHWwyYVD@AEclLuiDfO{ zbFduIYGS|khSYq=X&|UucMr`$xVwXf%7`xki2eXuRtqHV%q1CxJ^>`c0vB1U&M}5r z{tYDiF#r5nmd2KZ0{MysdX~R0u;DHnI&82RdFXepHo(-ZKMeKE5tcVtc}8oYHxeps%k~c*Va47xBDeM=?$LrVI8gJ&>*l!wLWDtdfrH&poX1_L1n0k8usQeaMcy z&~;ebF>t+G9{}KJnwHrB$h}tUCX&%c(M2}*LbJH!wVBFcuMf$?A#K`BiTm-(4}WO# z*|Dz89@ciJe`jEY(TO@A-fP)3B?(VV=4QKHFoWez33wKB?f0%k)OCbq=TXd2Wdfi& z95JeAwZ@oHfYG2$l*delkbSDhIb|ID{59ti$Q^vxpn{P#S%rbuP7YkM)S6E*YdLXC88NTIT5Mq=l_0rGE-Ww%k6XJy9`pM$h6g>gFB0)-XwMOqn)+W|iwY#dyj_?V(wMmY<_Eq1U*&AGcNi4qIL~5__%u-hP*`8ylx44*mZDc z0Fp*`9BunoMbDk0A=Gky(wL91tnWTCAEOqs5<=ITva}^;L_R5w11vRz=NuUiVJ@C; zu7#kItqvInbSVZuz2jBRvggP5E#|j#r`Lv2r%A?@;(; zvCoB!1lZ4CH5zc>#qV)7Oer%(VCEoO#*j$;5JY&Rapd2hubpme}cb!1&f z0uamxDA9EQmKpI1rE=7?o0$f%#{9`DqKkNWEZE%9I8YJfzfu$ICCK{eLv?$ zFrv?Q;Ffc!#=bI)wa*A~<$j{w`U=6E@89^jWsb@DSSHqNThWdL*S%%@qN3>0u>U}r zUg9>|{rE_!qqC#CZf>e&7jO9XXukU-`S|v?|3C$)4m4_$;beuT`yo%Sj{8vFHWr4=iOd-jK6o> zgwrC*6B9y)eO18-f)*>PBCEXC+Ho8`JY-mEsrG2$&j9Ibsjgrwt2+!9tMJuGo^TgJ z*xT5#Y$Nv-w}4>4*;M*=gqHVr%7x4w76^F0$mVNa9a-6uwWmi9d*ZAb+3|dTg^pY< z=66#V+dn9oR20cl=nu7maelmt&K1MS(&D?#4Joxja<%;5iL1XfwVT7Ug+*Dmr$4Kk zp@WOE{xum(O zR)PF%<7L$kjbEx!|LfMZsS7;SE}}`RUX?qc&V7~#=Lrcb55@t%3G;o@j>2`v}xeT+GciA3$&T&=Pjccez`1Bb> zrllk#_U-P;z^6dWsKuC;=NS&hPOF))<}i7i{C^akc_7pOAICQvbKkeQms>TYiMfwW z?mPJwrW{E&CC67YXEbw5n)@cA$W%g(p|IS!k~u?%t4Mu+pWlD}n7{Vf`}2CgUa#ll zVP|-+FB+)A|tX{>y{yjO>TNtg^?t(24cvhYW>LQEmV za&n6dDEJV*ysUDX2So8ckOwGp)GiPWN_)--uYz*#o-xTZ=5-I|1w!X6$~YXC2AYMcybrt27#g`b(~nDd8;dpdje6TSE^!L=_Fd%mVFG{K3u3= zrYx<6Jyi?_DdG);R$$nbAY0@JtWrPoi)pn{aCs8GYnLL!6Cs_TCVl4EAXG`sAd;)v5S;=G(j*-A3- zJFIYKrpa8P6&|MpFYZ1mGDXIi37 z(^2PO9W;ewT^i_#ur;d74n6kU&CqAAO7lf!4IEMrwlab|X#S7nVEl-);m!MRiJa*vXeNEwiH7J0ix$tNEcwiVFYxvr_ib8!Vw(7GNLb zF>zlQBzQrF6{PRo&r!lYur7WSQKJ$H-AfHNGiFL}_RZT0HsT9{aVE@Th7`$*oAlS> zVmPQvIdG7v69RcFXe_?tA}W#9$#nEdGg{n7ozx9_hYh0Hh{ux}{9j}5!he{WiAew@ zPTM=Wc!|c@xQG*AucANYBAAY+!~_t%L4vAE=LLq0fYVj2S;wY{G-Aa0IEBwcg2a}z zt#$Qz29grZnfG=|Qh^K5CHc2Y8c%8xeh1P0r)D;uEE`g)mG!HK?y&BuuF`fcJ`}4bCD-e3`EznwpK9S^&x4~6bBElHjwR4>hnQ=SM>_8 zG>+nIQ94)twbRqv_yaJ1P=od#0r0F!e5s@ivr>!;mc{k&Vkhti*Gi%s?|yftcxPe& z|5QrGwFsrcF5KLCDA_4wIiLYSeETV4oYw6NAZ?5jN2UkXVQ`0w?#ieuR%W)mZ>gD? zi*+kQtM;1DNk9QwnCQEY6j|@YUm6HtSbzxl9Vd?`MJ-^WP%j4z&TP<6?F+m)#BZfo zORp4@xRkF9D+Nx-ij?3eT}#;3rZvW|k8ZZ1W~p~s8E8JRi~Fx_s6Z8Ud$K>B1hAnp ztfa#V!0djGd*S`6Gtj-Tlez@87m*@T+?hF&V11b@k&1H-!5`8F{%J$Pn*IbnOI&FC z=Awzo_)7e9q2PlM!;E^Tdz4ryrpf*lbn3TnZi>x6AJ^xE2XR{NPsda9oJ1(m1Y36T zgl#>&6;~F9Sr)9MpU1Knbn4!fs#@WMP+{l*GZld2kjMG1Gd3_D=02L)6SA$PL8fw+8?$yHT(O`dDEo*x&nU`{+PkYK1Fmh zz?H5{4A^j}*&BYUv~6L}e!9At@dSedar;j!=MD!e%7YTOsAIHklnR9CIPY>lGL!~* z<`@EqAxr!wU>j1-?@&u7a8t9;s%3f!gFD^jz61H6V_}NZ06qNuwNlr|R5M{TpV4^;)#AC#ZP&}Q)RMFpnZPd4yPqTgUin~&jP zw>OFMUY8rAd8B7sGsQ}~>uIs%z2czD@seV@8-Z845>R@mQImtxXW8OQpv$RjwizZ) zdN89(XgZFz8_}gi^+*)Q$4?(S^CW#;!DSYq>rET*AD4tYQc8~SUBu1)m_R|s2TJwU ze!Z%^>vY+FAik$jw(%x~^HDC@(L5pShJ~B+6{se~s>ss%Qg+%x%MV~M;VB9J673Ii zSm>WQI0C~8Ol<;;&sG4TWxdNl5TQXww-N23JL%IUZ538vld!EKAt4(c_w~H^y1`mu z5B|+n8QM3DhB#e<$gE+><`TLohoiJ)YJ@~UCq)us_QV|t<+j`h3V7=&-WyFF^*kT84srZa*t{1Vb1>qcLeGFLX$4z45&Y8^xKmayGK-uBpT$cSh zR-rwKX#DZ$a)TN%&sPIQ^&dC61@LxicZ zQ3bK4D@)ID%9Si3UGG84jOAL0ACHpQRv$9VEB(E){+r@N@O!y0s4s!@iM3}QQparm zP0UG#C~jf%a+BC+GQzsf$w%kq@x;d$7+ZrN!~&2PH@>T?%LWI%C!*Vq&3v`ipkVGc zxHa&%Rn9uC_|ZM8Q$S$e>yb~1whzqi$}9xn)>tf~yq$$4J$PZJ0Rkwahr(<X5o#g!@@^OKHGb`L3{Vm7uH3b%}mva zhroVLX({>qXZY?wTVh3YuPOB^Ikz!|A4h2dDJm zuj@kH4dAZkaV=f_;pwkYBBkU5t!sQliTRG`$v%PROafSnV(9f^S@$X|;a2;>@Pb!@ zuX0!3IC-ppKLmKNdaVfMAfXoWor6jrO|0amV|<$_-&B4h;x0aEg+=>Qt2&YICWqUm zl!RXGMTbu&*V_O2Y-tZC?buyrZMU|+faA3Lwycz8?9P3G?3ZbF4WU=*m171p#!wY* zy>fpDXJH)*emd78{*}S+uhn_-PRVCvRHppZ_?zJ3qC;-Huej>)ALv=dB%1u~x*|&i zy@C5f#Sn!%L5+$-cUqg9EvOS&H8|`Rf*MWT;W#kFFFp$_{YRxE)wg^7zY>UYTshElZC88Z&sUDBbdGK8Jq0EGp8De{AG`8e! z2&-4CPS#6pYF0OP>CRzUe`wSrF{eZ>Sfm{vBm5)~5j21>tp57r$c+ylE{KDC!+wVKU7s1=IV;%1h?+VlO}QTwMVPAq z9-iwt*Z#5obC>sqcw?olO!DW)7I~PR)VRujJKy`JyrNL=X#A3y-r<3Q@A;ZW-`Vln zb<;14S*Y&SXee!SBnc8p=~J}I_6>#EC7@c7CwW&>2p1e!zH!ZEMKPccF0 z(Y`3Y$V$4l#iMjkiUKf6-6iepVvyz;UFXs0PPO+OV5S6|xL?BcKnaDu5N6xIWb`%t zN}z=YTR0tfor8R4EiFLCeI~Og!$~Yy>=ccuGaqb`1nOB+e!*Uqn`C{$ly2|iVGqjA zq=m!B0$Lg`O6i`@&<2RRz<9gPYB|g$w^c|{xoN}_Rco^Zw)5jGxRYtPS6qr z!Nval}85Au37Gxcv}42u?tA&36=Eo zRngnRE=N^GG<#`%Y<~_#thDYjyJfaf^nOK)q&t7%JL+vv^rVtfQXc4UPGu7xEUjea z!!vLy_}yJkNAWRtxqEjS2H`O0#mdA+ZJ9r6L{F87(OZ@0@VoavDsE1deznc0INbES zZ?6B$h;tbE%*6o5nA9?x%&RG7LWKZv^|gKam4nCPiOE;Z#%hs*3ns3dMz>3ako(WLQx7e#t%B({hJj%??n!F122b|H+*O=amCk%8BX6??{l8gKkX zbfMOCIXKg3AhkrQJ$C5l-xd}I{$1JUil;F)0Ijm2* zj!J>P0Iy{Xidb?s(S!e}g|PO`l>3r>3%pI=nFLR?))rCN@b28GoY7~UAGEA;X8e%cO;C`K>FemsIC&2uGrUuFF_dscTiphzD@eF%l-QI z?r8Y>-?%9q<%$sFZ#GgfBu;G0SBIay;NnqFc0p_RIcl(+zZJx$oU>qMmot-q%wWl! zW69{>@kXYCeC8`u_6O_C=cDwz+K8Ljl6K_+dK{86(QXB>Xwk=#%|fR!*RQl{_Mz2R*snzdGl*11et%w97yR~G zw%?48S9(-nj(gr&J;mZmmL}G&fjZg~%Z(1?yzEqq0Kc4{14}YDa*h(@-~r@>!y|Pb zOF!U}3`f^MpIE0#r3dA0>$988bL|6w0(s66J1ca=er>(_D}#6_dv@V}0s`FmUoc6ZbmS>c_i}w% zK?mPPw;VOG9q+8MdUQyG!swaNd@V~}eCj;F7z)(e&@K+czDoKW8>v{}X#7D4NWrH* zv(jP~ReUFMvh{bW#|6mqNB|mDwk5;sD>B;Hc+f|p-p*Wclpq*SN5|Aft{ZmkA@Ki>tXS3;Un^(h@`P$c`@08n)ovU1Wx_&iy9lM#9Q zCD=V)6oRQ|;NbLuM^1(Q^cO>n)+crEKaevvwae<(=j8{ii7EQ&*5X1tfAmVXjq5JR z5Z|<9tNYqMl1la(!=*?m0peaKE&*O+y4^%qK2v;$WZWjx0H7L+f;_gZX-xF5<%}^Q zSW#$9VCjr5a=lfl$0vNJ`-_SVF888z$LN0PvnO^v@7A||jrj)TVn@ENw@p2xA*|&b z-`(E8TMS=hG5N5mqn@erB|USrL6j?#__&b+V)XZ=hQoA55kU>Bew3EES=5<$!}rQ^ z6_z=hqd!hsQ=rZ34;>ehDx^bB)<_6_7;WjW#L0}{aMEeb#;E=@MMA#v@T=K0{;ER^SvmM} zFNfoqO(<|3?p1{r+pLV6D*SF&tnSbkW;{;58fDrn2i^k`Xb^_;=)}+JX!fY|CG;05 zFd0zf0o_#4gdFhXCcT?6Xrex4#2cUW^+>e0QvnjrMb+8E`bj-(d{=`sxF4qfsIYAW zd_@bwJR6wa_<>~-Le4pZI6N+1QcqcGR;&er?L3@{^ySF1w^3Zcohq7v=m)p_*eV{0 zOOZnSTTcCM*uvjm7rzUzb`9)K~HT#^~2c_zQA7lXXm7IknX8&HRQgB^uZm>a1103-OF-6ejRzTbw&g2pFfr;0E+52Zn5$yp7Fu7F z3anLZ^UU0OJS|%Yuh`>%j&J#Un~w2ISK@>sbd4 zy7E^DcxUhSvl#*zc(QK^I~Q-*-!M;ZQxjj9U8glDm-tb+;Jx|%(6bx}#s_SAKU)~d z3CV;Jv-@KLz%%_p1x@VQnMV_`dvRy&b+`kVMI~z_K@DSak$$QzNdkpBtWp=ywU=#h z?MJco^G!YCW`VCz9lGx3w(Jda%m?@ww*xWfYzqO}PIhXbM;v;gxhNtME|SM>Q!b- zXM6?tBPF^46`G6tIgF_5H3y@Y+LVRbGEYHE&TvIyS9*t&>00yUQk21NAn#B4>&mB+ z^kConT;mIR^3z`z-)*psJ9V2-@!XqIE`m+fh;yGeyW1xwdCjuBr>Hv9;#&z(*ERPY z5+rlsuZuDxXWK3Fo-d!x((&Xu-w)Ig$0j4$w^?j03c2HfM!od?dRlh-14MEJ*NHhX z4KZll?{Q1(l5+QKr@~)pTThF@4KqdJ)scpP)4q-WftF!w!9^VVw z9*5e6y7TNy)IQd!Xua?>vA}~iNm=a;9n}VJ2#lyHYx34PP8{dAJ8_Jj8_FG-%X15( zShZeslcq%UsLPH~{EUIR#pWjzQrDP;pry$}d^j^3)2x}j*up*}}EQJq~$4}5@A zDqzH&3R%l`*LbLB`1Zk!8v=x*v|{7cbJXr#ZTKhQyupt2-mu?_etzgFE&7J9Evy?zud|&V=e)O&1JrKnQnn zl-HA*4vj{k2I;rum7mG z;XhLq9p*xmFQIg(z-qR$ohG|^uP?-P1T=Bbnw7G{CFBhJJGdM@2!`{1lPLlhVlV8E z1YK_0K7Hc7PO;F>%1yX7cQ6uWy)Y=K6KAg zG-goI;KyHKjt!-GDum>K+zr_QOab*sgH(5EQfY8Dg;v|Hi{L*id)@?N&X8M2zw{?g zwMcj?kdH%=e}bf>Q&_&jgt_rhIHx$T?dJ{}3$U7Vl)AM4Cn#G&V&K>*fD5*Y_zzU< zi6uEcKZ#MBD)Y0jf;xMj!=Z_s?{Tl=!rI1xZFXqUg?Kk73o;Oa1NY{<(2|-qDl}8- zxvR}X`(g{Rk^Xs7{*|I_YAQAANSr=)&?j@z{GuG>KseCSx@;kc1>FN=+u)%kVbe-= zT~@S%jlh{euMn)bbf6Br!sb1_!AU;toe-Vr!t&xT%YL72l0tTRaf8DXqhaMZ{IH36 zl{1-{5!B1#Of71KG`)#{Gj(RNr8?~G0Pj@kche>bx#c9x+i0eUnKAJR`;lAaebYID zUWLclT)V8b4Xfk)?Y^@Jhe==Acrs+XH(-O?WYnWH;mi) zvz299b;ZtR!DTuV9X>+dFr>0)mSfcc=d?j8h+G?70LpZRKz}n>YBUn06HZ(0y^Lo48gpWcbM z3Gv%*N3i9OH|yo|=6Jx9HQzRM8CfT#&|;n{uO3tx;zoyl5JwjqgtXYe19TIo511Re z_pWrPR(UX$BH-ynYd^1`xZ#{l8+*rUwQw0*mSzF*6MJE>Tt9Hc1vU9OF8QQGDvh~{ zdQR42rQ>J^O9hZnjjKN&jE}`)oZkOZ&MZ>((7^l$Iviwn%sm%ji3?tMH$ ztgtn-B`cVC1L-SeSeDzL6pCGkhMBUKgjR=N*bU73sC*iPRuPcPF4YlvF9qCVNsG%F zmYDUiY&8`}0h8=w#$ZziTXehwCavYpdQni8_>mNCv%p;=0Y6^C1kMLc2KTP2m!kka z%YB+HsW(}n==|NXwaQG<52F&5p%|C`P+r~uAENIab`JDlZLs8N5%KrAnPs4Ol=QCZ ze7Fod#K_w8S||;~n_sV(Z!&lk6?Q4d3}JqJmFIO0$k@OC;gZp4>X9A4d7K(9B;KwEtF4nKDgO{3pZVoPRQhX7dF!Tlc%-h4wK2|04uHmgp`6dYPK-dhIE(}y;hKolP+qil?PRW3w zS&>zG7`ieAFxbfxzfq!n<1#8QQvXJLGk&Zr;Kwa9DF$@t)o_$~XPky5pE1X1RElJu zXs>h(zj29+b)XDv*{EC*Nl=EPlZ8)4emu6qCzY($y{d*%;tSsla|&YGW)S zZwZ9Ppo4ZoJMN!)c-q&q+T5a>SoXw0 zHFj8P3n>+hjtX<~J^dZoCMV-okT%qMzen#V>0WV~&I6}*Z{&#f%veA@Wsrv^Yp0re zsBEdZ`-4aVWLm?$dW|+h8DV`2%a>gpKLP!u_J9nnaze}nCm{v_b)7ja%rcQ_iJ}jw z@dzq8Qja-LE9rQDx0h*|gJPrry$4HX)pGt12KjHxV{Knl*Zc)ee)g*{W%6^$M3%fKYGi zookTx3tR4(dGXIPR@^6*9t;5Hf^#0)7u|C9)G|{=NBmLE6k6jGnw7d~d4olFJI}V9 z5i)x4)bP;1W^y@{(0oUZ0FixPP@mty85~}!8C&r;F3uBqtC2;uyL&})E{tu&?LUwc zG0ml>t3iRhSp7ICYFAbNaRy5Ev*)hY8QkyzQQ+%F*z}L8+|>Ey#(!OeIK{t*P4AcI zEmM+src>P_-Ur)7HQJ-qPhXU>bURz|14|$HC>^1k-f&*Ps@Bt9M38NaEpnJsSCj6P zP^9|hZrG;+Jrnc0C#S&Hg+1t_Et`KU6p4Mw5AS}7kXUl`vp-$2xje>(T`!fWT~%o+ zQX5(3$M9?c-OCFrpd;qg1I}4Ve8f|6<6q8SA}f|v3IdlI zx^eWoQcY3mQOQDPA)opJ<{!ShUAx*W;HG1rB8nkgMd*HxC*xCXq1PDW@qnl8A+c+2 z%hufK`tTcC!|rqLAIDC9bEe-Xa?{^U92iX%lJo^D$A-Wo1Ok5idzGloGlVHbenjmi zVYN(hg%#LiAF9UbxMmr5@JWBkI_IeUC|xQ-#QYS#@x30Jhv%~6?gK5gvLW7!dwuq2 z-?!5j^bYIPW+lRq60W~{(koAeNfR9(-v+uBY1IZIV5^BA1vTYXJg2W)R;k3LzqSlJ zXb>-Nc5~AR|NExBL8zT4_ae^Vu*%H*2hw@>=ccjFO;1C+N!inQPo&i0heGBYx!|qM z6taCW5XoW~^06<>-nnd6dMcwRtnlNk-ssaHdlLXV^}VCHjfX&&O08Re!%FmbclNwo z)cw606QJ;VLLB$+E_C#j;Ee*Oji|Hf&NJ90+KIZ(c0jku;3(4xGW5f4NeN>R&eVyu zq5h>hKyQXxNt5a@r;V@aL4W_fV}?5!?m>(-Q!9O4bK)}x`b5< z`J$qhxI<;ixqm4~#4WRMa1}S8+pZ2(P;CJQ0H;}F%9Ul>PXbF6t{rThv{xNMVa54K zRB2KV_F!{j>;cHRC}Lr;HV729O9fOzx(tvPJUvLXZ%v-D+u)LqEH893f54)etiNEHf-qr~b zRcnd=We3E8xtf&?CqS%v-E}q^9xf0f&!=&neD<$=05%1nm;U>1%WfK6N6?BoP|Dzy zRYLz}=+NUTd^!h8q-aU5C`Gc6mCAi`DhIv6+1P50oRnT2%*gG!VSQP7Hi3mr`RVj- zT~oF|evugJ_@LH|EoAwzw+zMIQE;9VD?AQa2XW9h!)y;2iB^NWrX$yHevw|7lT5jn{2Z|7`W$^PgTr{(35(lS8 zd0Tp9w#OJ18ov|x=j@SHNCJcP+xdvC%wZ5cL@vZ=#evn|z=2hnDDAR$P?w_VRVw#! z;-Frs59=pa*wJk73s2JNJKiswR?fd~ZO37F;MSza`E(STY5iG(*Ikikx~cDMrb0HA zvaa(4L5QSZ9ZPuP3H-J$5~BGUl-RF0;wh@70}*si{dnu;8>XxyA2PeU>y&!5+qi8( zSc#A0l^_O5n*r<}9dCd~v^qW6`n*=+8N>^$%}98(Kyn+yAA>t*+Su~qNu>FowLVi!@t>oRwg&m$uvoTv{MZv4 zW2TYHF~c@-^BvGBCCxm-IVZvvE92djf&3q3B6&!MC>w&eJBDKZ$v@aM6H=TX=p4Eq z=evUdsN<}aUd+341$m-P{9=^X3>RZFDrqC=N-RB54*#~Gw8G|*9vryz`^0_ma2A>6 zw;Yaz$@x|`mwA*DF#COG*Q>HT;lM=7%*XfYbAf5{y%r^hsg#_5Ls#>I*0|1kM+gWAWr%*^)qPG6BM-k_ZTb|6eYj;MYD_Dns~r?g9t$3WNCEG) zzyw#4)ev74PKJ!6GHeokiuiP(n6OvG|MQty1ryZwh}1Dv`MUGBH;1)#q5e;O3czyi z5~FRhg^(uLfIhIkdJ4AS(YA2_qs6DKb&`{sYOV&_2k=wwe4Icarem z{{4_K6=Iz6BUm_l?s%fgHSxDNp5!|0Bme1|bd8gg{Ed+OepY>Qrsj7J<-M}y7o@{$ zTfZFf?;M{B-=K%YrS*RF$RWa+1(L$%{t~nE#hySb{XPOVUF@l$qmkub?d9A`;{JUE zECwEIX3HmJ&kIn;%`n0Ka*%2Gm=FjVKT9gp0s)~9#KMV3rH{wGNSTwhxUb5rcm2Y~ za^Lso?w74r7!>I~bsi`cx{KKkQaiqtj{gu@|4?R0&BHzJc2D zv6!`D6G2VntRcsI%}r%+D-W0=FvopIxlYr-@iae8_7Pl zUd_aU)H7a7hC_+lsCU`q~WKDsDt_ooXL8DU)OVulNw&ANJ(ARv-dTb3n0b`5`0 z=g^+iKLx8Wn&PLrv3U@0RpgaAy<$m+yVEKx+$gYh!KpVIo+JH_z2>=jz= zOlc}+)F8ZsTPVB*XhfI!-A6KQu>rlW>Zp{wVtH&ERi&^Vws?Bs`Lm-x{q z22R>^!Oyk+lS1pfAs3Z;!zAqfp1|~M1$)X}x#Cw02J}NeY~gs)iwzrg^G1BMnz^1{ zIHb~Flo+VweI;VOCp@;#u#y9j`9c?(z1iJJ)w$E&otDe=-M^xmbQ`PlPW{mYcbssn z$?{?8X4xs{dpzqZ#u)MaTnVUDc#N8L9}uZ3G1yI$O&MUI=}UpA)8HF_Tw?L#}Ex!_IkC;nUJ)3|tu@ z8=&LpF+8mP0@qdH?1`1*wfnvHX5}w_7=EU85bYNk$pou z{L?>JOOBnX zD>q_z&W{sp00Ew_s+J3Bh6=_ogiKPIMR(y}DvAFryr|Q9&EIrlL*a*L;pgb^&dK>5 zvgpi(;z~1I`_dJ~Kcxo7=jLK?Z<}+T5tEG04CI7v*vnDql#Ux7edlUbX~n)Lf`97m z@2@w1=ln$oIJjJ;U?7|ELMzg+Yx-Q!Ka>skfZvE4lCLBFG8j)4Wom@Ue`D11`oGu4 z3}v1eGv0~NBE9c?PIy2Ta9R$kx-A;jK`DXeo##+^fv4>6c)vWy@^$HYgnE?@N(z(Bl~BX#;~!b9CbuHK$3|L*yAy|+fFwnlo^v};Zm{fT?W@H>qYg45&V(+ z$1btMU2qlP3kI1+Q(E0$ip2gLcI~p$rh}Z!nx;2_wN96|P(?aq%N8^rC8HYaM?Bcn zRp+x@kKb~MeHi$K9zRvpBSZ~3)R}AIF*~u^-LC;J$-r>K5bLEU#_NrGz?!(Z@x72B z%lywt@Za1HuGwPBNia4N8upwJEqk>=pCgElAhU5SIq{dK$n77ZYrM~`qUZq2-0u0! z6Xd|L10&>IwR&bz%M+aeC>eYFAINZ`7rPeHqw;p$C`m0tfMORDS*--&fZmj=sR38~ zhzH90dSjHXmKEF~pMyxNQMWeE9R#h%XU7Ki+62OZWXM+KbMYRs_x|4&U3X*Pu@3Z7 z;2NLqQ1@z5B!@4zm}5{ly0sh79OK1r8t1QVesg-)G@lhyTLwWLMN0uv}A8DuF z^g0dEJ9^0*c%?@Ov_eT{DOwhIc*`*ZX81=q-$%kbJT7!f5B`OY?!CnRw~+ zrw!*yLgc%=)&cOT3QG2jc*(WI<-!;+n$=~C*tBIG;MHyl zuYk^gmMFOxn7_e2moBrS@>J4prtCx5B1uq;{q>zXW6NdDkkRI;0b%>*mFfoV zxeJ>p-gNcxxS=Yo@0-LDGB6vdV=f6d^fm_O3H(G{?9=HfQfhV6&SHTZe+R&`PYnl` zKCapNW)T}=Wj2+6*?8n^b^9<2LOODpl-7^E^5~m!e);d7CLI=E2`=zBV2rZvI&JT2 zr0E*R>>6zhXyTru9el$;7uwbaL3e<_isH!K7_}#2>Mh$CIwVyPoU|JIvwFxZW8&o^ zkqE!1Lx{Vp`5*(_eYlqUKw3&vU%MX(OtRH)S_~dL#8xAEWjgJnDlT4g&wocfY!E#4 ztnTl=bbE>WDXxC;u-Q0CfLAJ^<4qGdo*c2J>kJ? zGM0pZ_Q!s6hd6`fEVBovuy%xb?!&4N#2||bf;~zR?&47~3<86kntgB11_f)m5vo`J z1d;fDTV45^3-(pYXsQ>G`VJsJlT6?9P0Qwb-8uCvA!QJ;R}|EMQ%bdxw)}kGbe%1 z7|UJ$)BhhJja0HN3E`P1D@13J`*BCXthT9`+=+eZFYi~ZXfOEg8F}Vy>!h3w4V%rH z$TIH3fBU0~hAGKCgk%=H0;^*;oe)VvqXqy*fhVVrYt;TP-om(bsN`_8EKT^4&pk$sS{ zai7@y&y%2hUAM62xJe5ERpE+vp#bBWvnC}sK0C9xDrnnw`|JzYFfbPTD8-L%*AuyD z>d<*cPu70yk?N&1Um{F=f76+;TI=%SaP+BlsXUrZd!QsQA(Ue_$Wzk1eQ^ODS&?dH z?jgQkMgynC9aCvehcZ)1j=~qcw3__Ox@x z`;zZS&ufHP_r=;_Z94HKv0_llez)95MtEg(yxD*p0bP5a7=Q-Oq48Y!F$1~rrYKkI zRMrv|S1oK2`?eZ>yH42ZjE$_P?L#G1i2)h9a5gOi%Dh{tip+*W{eihw{+u*Cm~TL@ zKX4DGiU@x{!{fA~FY5NGE$Fmu3PX(wKuvv5`$TdY`kd4YxvKN-j*sgIXZh}!3~X*1 z9|fO}SRwZ7Pd>_(w1NMPD^S8b@%s{^S0@0$*uU2<4hmO8XewI$OotVZ)b#{6j`S`` z3O4g(G@6K*>2? zA_9^*`C+|s3ct!53bRuQj^@4w3W2W|1+;4t)4kf*vVEE=qvFXdM%EfEr@<2N&;ZRQ z6#UMP8<(%bgIMr7kQuwr;xDm7$$8t`O#QiDy=uLblJSCYVO{ts;iD>RvVoJ5BK!4q z;c?8(bl0UKX0>p_Bbm1m24S|(2F0_G{q_<%N#cWwFN{wDv{&JmqRu!(6_~-Fi2K8d zOyO;)Rai7IVtwjOi-OQ~bd}@=QL=V9kN8YJgAAflP4JW+ID^+hl2zbenz1@gzr92&Aa}pvGiK$NO3| zj(j}nx$IjbzAwG$f#uCe^kM;jQ6WJNi+t1QD@ zhn1eB(7NTJkkS7@jrU2qhtAmteS8k;M-(g+{|9Nq`ulwTc?iikM1MQsfLL#nmms=k zXoc1*ZAQqa-5;b^?^hC@7`(MY_vvSugJ5h~vd)D+#NzkAi6$hw2C^u84j1I*Fw9k* zacf_FnY_*X%<60)=tT!890+twlzWJT*B){-kM4fsJ9$oFZgWv?Lgb#~yQaRoDl*YE z|J;g~obT*N?wx)d_3s!zACc*_S(au28Xke;u1R>3YZW8{(XPRnf64_{|=DKSzgsVwSS+$A>GOOZ||<;;W4w{Wxe|UHA{2* zt>wTANwS}@<|*oh(!})pUFfLYh?*R;oXwjCmQtX0dQkYOdg)V*ZB&#(nJ3G{rmzWHM@H2B#siCn&Z0Z5! zdi7$Old(h8@b#@rqz{+)v;z%DQ#qMf>AXk0_#%Aj`s3y&A|uH=N>kd;AJRp#C+6~c zw(m(^`SmVlv1E(&nX2zDoTt1)J9lvv(Ks9w>aVS zX*Z+id4)Iw;`yncqqpvIg-|d}oK)OX#&Y}mr5Dqs3mO+PH$wl_%M;{&Ir$qHbiDp* zB$=#`i|qMaR4hNdF!{b@Z||nT2UWhTwYB1<1?`Kur!}FE%MC&dAirFObIOPAi0gGN zP0WwIUCRDupKoT2SlX|cVTV;SF|Z;_K1Y&UtP^eJn0P%KjCp%-Se3yu8sTwDftu)I+PH)nh^Kehb_x{{!z&-_14X^m)&n=oCl~=HQ^? zHmn)q^hLZo&DA78cEtb4;Fu1w+AXiw) zj@@v7oP#~o&}R_cDJh*|{EiMoOvE#6C@Rp#)5xFCXX{RNur2`fD8El8uP{V$Punyk zU?a`(%G3Y4R5Vehzi}F@hgKcHvVegZ%QB012*{;`zxZlMQ0!fh%%4rYv%)eZoJtQo z)3)(DCmVTjb0$M(_{~3R7y03Y3)kc2=_GpfmP;Y2%*yHYnR6vcP2F;ou&L57$nYJb zGh>NWv5CGtt5*^nW{?OsG!X^7x|H7bm;*UsNt`+Nf1v18D0YQ)!!9U8FrN=_Dwo_J zZd&>)+hB$hy?AFtd-xQM8yOB?I%t5NQ`8(mDO5IlytxmoW;+v7O!w$P-r^tQw}2~5 z4Tv`s@DPB~<p#)aOtqKpN@(+xRd)gqZO)e!2EHtiF|>Uc=H_!XUe8Q7grk8 z{WYhnTTe-mNz}7)e0w`C<=zU{cy{c)WlB^=quA7mqzwB_6KP9sUOq?TnG!tx>W>nQ z(~HO*r^2^ynXE@+PgKK19dBR%UEc*yw{E<_Q6?+D7ptcz+n_TL+OF^x z3t-WZmA-h;R;rYG-YTtBK9o4xdi^8T!>r$U%jqL-Kr{YZ@l;w@4mk5wwu^$X?jInh z3K}Ig>42q9hCC!ewF*dBd$oX$O8`KnDpCo^s`ipW_IcT~DXLE!t?SIuJl_g)4ZuHy z20SNc#00QEoVX2gaj~q1wB3TP?3oI(ycXC8R-)do8Ti2ky2Wdw($upu$++?2%JT{Z zLf50B94b_Luc|07d`tgPo*xVhYSDX`V4|G~3SE~MXLfjJ^k^;Hw}}Rn=S7o>Lbct; zlT{9V$xR!oUJrOtve7lbv5|4+<$>@AY%**$B){&O4lC?l{@*)XCcywF4YfsfzJ@$9 zIKG}>9WKc`i8v@t3sORoZ_}?I$AAjgRv&J%9prtw>SSTiMjd|RuNl7;9^x?#r+6HV(dIDWBi zjk|Fv93c~w#V9N9wSrVS`SJ2ct)J6O>_68&uU+tpBzGU4Ie%EYCfVBG5@c2Ho21mL z{u+Vv2HMukwP%BG^uCYSa=M7Xw0~sWSzmm@>PVvOixIjX+`Vc&a!5Rtp-J1uLf0CZ zHuw~;&+Wi}IsK2Qa}Q+t|G)TVnEPDIWv*KcDRXPXnENI7d-#-Fg(RC&)@AP3nS06o zekVQ=l5*WpE}4)^$y}0Kxg=7b-~0R5?=S!P$J^`me4XbxkJE9JrB`TmzvQ`2AkI!Y zuTaOKYdDQnw3ljY$!Q4c3|aW`SEEr-)RBT(cgjJ!5<}-UoOn|{587{7q{!U~dQcVF zbD}6aPij(T=-MsB`sgbeAC+B(k?u;2|ML_B$QiEV=?H@e3*75gvPy=oS;RyA-kfnJ zC(S8zeG6DOe~(SnkDto)qSwphV~zk2v5NOwcF+ReGZ)jnm0#3b@^8Aoh8IQ2Q3Er>doOvSAv0k`;s%zN6d-oQrP~nUoqnAR%!qX&Hql;_U!(U z;Lh{l<5GQG!p|)T4hV)QDyISL+-gl%X%%|DKx&``nOC+C%F#Oi zY0O7ai<8>(71|(^P$!_TxV&G!;`27$*zDcslylxl+m+}&KJ|f%cO{I2pjG72N+%)(vJN0@-w54oVk{W z%X}oSahK(Iuwj~x9dgJtv~zqiNGGXSD4KkLsUqf$Kk$bk+Meyz`0dU=306~|%9|7p za!X8FmU^hKJ@{Tn+sSlnW51o6@+8%gw5 z*ah97+s~Ax`k*~9kx!n;$IsnoFTDy}U9u@|T7%5CK9-}Oey*cKjwqCFlYM1Wb2+dL z^zg%MbB6u`wlRE3LX!g1{Wb8t&T4{uqIs_7OBbg5=X28ui>{}yUJM@|$~BvQ&(2OA z-3nV$*fTcgXIBEPXEXIv-9PF)o{EpZ7x%FK+bczy*~E*;f)?H9_GxdRS%ngD{7A#IgmnFmyc-R>Z0{{wG+aTsiOM>EIWSSMDyt*_ zEXiSj@6802fE+=^P27$?*2nqG- ze}Ay=as)A>lswI?zTMQtg8}uPkBRfQZw^|Qn~Gk%-UP|zG#&m1ic_KRfi&|p-1#qC znY`xz`_qRX{u3C0{Vw>F{|D-HmWrH+-Mz9MVC z$MMW*sFYy@(rFe;6kxyq2pN}~=P*Y8wz%Xv0;W7a-3Wn3UfHP3u?ck3+p z=OthG=8X#_|4#1jh@hIkH=H1JDq?-{T{cT<&@Z`h(AOsz2Jgb`#fUlKP};3Q zRC}m|w^1WZMMyy*)8uEGH)r_$Zj)=O-LvG?8Ev}GFU-HI53K{;pV`A^-Egh|q5E9F z77zDJt=K@Bsh3+aC1iULxZ0eap)EV}AL}kTU~D%uiOpN}9&8;iYZz@vqJRcj;y6A3 zX~*K8+rjWX2uLw~-C72mc?kFc9KG~G4z1m{KHUm*0ntp!pO>&pX?$Fvdm-w82aY(; z22WG(UIb=y(eAaAV@5mI+s+aurgTvi^osiHq=r`q#Aa#^@H!G)E|*ndPXa{7?Tfmc z1#fw4?~=x6*kKH6OE633Ojt$Jwv5=?n=bcBV=sQaz<1Cn*GOR2h7>h8j6=aaV@Ep{ zGiMPHa%vzxo6c{`sQ71_BjmE0jxS5)6gW~1B8441VdDt+$Q24?m`{M#Y4^o@%Rg7k zp~Mi}QSnWG*#!!PpHMWG8`g1wznErbQyOy&T6$eDxPI{_0B#}lNLzvm>0T@-{t0jd!$f`PRXCK_r!v+n-AY~TB?@Si8&7@UFN!7rUo^Wr>D^v^@Oc;{6n9|RJ%0C3VpDFk+@CSswi8W(#FJrLfb zOLFwGV#&0M@KJAT&=~gR9J{PD;cJx|{HRJ(#+?7W!ffrL<(yNK!wzE6 z1CW=h_{ETK7Bpqf*JF1=~w@^_8q{x>1B8GZ~t4fVlIlP1C~jX1PY;2W!EC z{_fHHb`e(RLo;)WXRJHmkK~KJ5S!ZMgKzyh-dKPT1%jsMA3JgN>*xjD9{T&{i;-0c z34RP)aZ%2A49&k&?e7=VYbBNMXl@lk(`u#%O0en-5B5r_DbBmFoj*ll_=hqsw;G{$*n(49XjZDmzKaH+{ghqF9kHDs3ON>sq5%HI-c0r_4_v1lK= zu(x3n*<2GMfyj@XsB~w!i&V=T{!X&@3WA^|h!1PC440yoiT5Y23V$YuUa@?x!!Mfj zgNpmg?H1?u9U|2gn64&X5BoH##(P@bJr`^U7k{erH84BTz_)iFel63txd&vSP*q_) z;BzPD4S9G0?K~3F`nKjqbOzALRxwzfEH|ed6&RiZ4>I-g6zozr*)&t+9*CxV$JSY8 zNS6DhcUKWCIGb2ttcNFn+?`#B>!TLbB!0C5gQ5pVSj|(yj}lg+4Q)FH#YW^f=CEr( z{Av7PJ=(N8ZD3GpfsHqpXOHoWac=Fs%Bc81XmQVK8 z5El{?T|OTits(U8qA)f5(SE(XS`{R0A-fQ8#rQ0g?KuqC#=057^mvBSm8sONt-efZM(^gCsc+QWP0 ziCuJs>dF{HbGX2KlDJ5m{;(DmYRUipG(zuBwQ`OX6oXiIkyk1YU!aDPBb2rJpZZlY z4=QD~*cM5|fXhrIcB2p`461-onrPuwr+8up232+<9p%-4zKL`T!JHEzx-L*gV3jWC z#fei46-Qb&3leQW(o8c|)Vw3-*ZI4E>%LoNY`9CuSx_hN-~{ckFd}?EeKe1#<8UVZ zMQHR+w9RV%OBjvamW*5HH=I!V!<@*DTcCw6O7=Bt1_7VTk;=W7T0W6&tOVr(Ox6l_yqVm(M`{)c7?l$o_yxpW8?2QA)Z{wQ6thoPF0 zOlnpr-$2+uuLS1u@8`BEQ@Fr~W@G>|j6mJxxs6B)NcYZjyBdGx(Q4YJhi%@DS18aI zSQ8XD*c3s&V;{v)t#P(o|GaKtm0s&v7j_%$zI?9m3uWDC{qqK{!`Cz`AesARS$SzU zp*nimgz+>~b;uilqir0-Ar>5wX>RPJ8iL-Ks-Ea&^Q9CLa$Oa(=OiCONo8uzIvrOU zY?vLePw?-i>P~WA7-$RTa^_g{V~S{% zhq3|%wPiKB*LQ2@OX#Z`(~%auFvm$MFU+o$4$E63HCHFtY>J4|h0}FlE==qWl}$dG zlnUA1utPTLMpaEy10y?y*a02LPGj4RvfYhn@M9bFxDE=zi16l?yO|O7?l2?Jc9+Or zp*<%kapNUTnF}@+`tH_=nf%&?B%c_LkfRV7LgZ{vxX+(^borc2S(N%pE&=~h8nJqU zYRW^TVSm3OxC#bwvWJgVTm-($hIRnCZ^x7FJvY{+(c9O1or@g{nh?YM^Mw#uh_>h~ z_9%Svz0Dxmd5UdeGH`tMOSgAX5&4(xm#I!hOVB;%Gb74H9&_tY+*?Y#{>*cyj6_El zSte_l{+4Wwk83!K=Zehhz>VnFz3?ydRi^6+C-;Annmo}LjLrBqYivYKr9At_cBQFl zqWKqOY3?p#yW+*wS?3&n?O@hu`%||Oy{+%wKH0qCpN9HP;lpj4MvOR@~{I2;Of8X9e0!e>6XVI*&yZOFBhW!oUE}{r3RRQ@X^( zE(~(OpE2il0pr;~K#=MTiEPJKeM?HcJ(nk+H_zI6dZ!I%f(`7YJ70a4-XFjEhfO}Q z`NQmu`@LyIEORQ;$Z9s((W9pS=*Y*e?qDY=SwKFJvp;$TXLG|yO|Vb)<$s`92h+s# z=fTKl?I+)+Dv9GhGNT@^^(}80T6bRU0f$Bw(M25a=~Herw+KL?B72R9P-jQspoU52 zvxd;20*?LvK-?b%@#`OKNHEgl0HFzEfp4b;K8|)4M_OellM02&?!6ApEwVNHZ~D44 zF0HRFQ?CZYsxK=)4qmI^_$c``gkBikdd*%9&I85zG)ntU4QLtu%)QAfM5i4C#eHMfP?dp1p^HW%!HYk7mLF+= zt{;C#NvkGkukF?)^Dn*f-7O#YOyI+hy*4q24bq%`%tlC^u7)UN;6Jt14VoIin}{qAenJ&g;YnlZzUZBO)!E9haH7^IrF)-lSYp^J#|@AJ%9=9=uln^+5$M zEfa#8Vc+aN+%V_l@>|}ox)0`{0CcNrH>RY11-BhoKsp^$D=T)krW2(2A52j#=|Qd9%xvkHwtpQG|0JHtp{suGPj*QU$VL2s9Q(ugxYTIeG$eja2tAqtDB`Ad_ zQ^|NC>~j7@5U81zO75+k21A-@q@T4-jplwm-5a_0x%w|5N=D@3)wNV@14*i<@53(Z z)3PJ*Yq*e^8jl34!gAmnoF^=kS3)Vv@4ck%_2?CU0H1o~*=FVQ+}DzsoEg=n?P#|SwXZGub7qw^!N%mwaIpR@u55f-)oUV2TND@AA5yvIN7Sp z61A2KO^gykVS*%5DA^3vk(k~FXcNNq4t~T3MQQ+PfXiKA`x^Yte%-uBM!EGUnM;Dj zAei)X|Kxw2bDAX><+@x9(tp{HfSy+w(d?<4|O=;HLIhq#*I%aGZ#;1}3wS=BZ&n7PKjRp?21L;y- z00nBaiVOgM(fhGl+qc?OCx1`jo4)vC%XHPe03MRBM*3ak1l?N?k7GO@oRmvV<|mm`Jm6b& z_Xj=0(${@Qae-O=d)h|5iY-U{#WmK4fh?v`iM-?;>Ypu4MvO=3?&Ff{G=!y22|%4MmKB4<>{ zW_8=$TLW&}o)!k+mlrhipt9WTUpOTHz0XK)dg?@>l6DDB(L@cy`9oZFdY*CV*+od| zj~b1n^GY|5Z%eQJsGn0B$fkrw8eZK^NC#QKeT$w6W4Zcc!wv_5ptH6Ri2KdlNq`op zBrCNy4K`|qBVB6%(b<88l&z1rxC$9Cl?TY55qRI1;T(slAZ~fn&Rj02Njp$q@p`)8 z(yE@(oXhZAgEKKFfm1QN>0Vo){0L0#ObZ5W6wOFVPJ8QjOKKke!IN;>+cCX2>71i* zzuVt8?vIC7gx*35_dU;{pPI4M@XE%3h<%7wkTqq+7We$vLA{A3v>n)plerQe^aCVu zWnSbm%o2)}q48;p`=wkP1+AwW!tHL4va4x38puBDl(~-R;!WgCd38bmZ!KG$1S3TH zvcFDTYS5rbE?G)aH-JW{?)WNeLq`@*ne|pKu18{XiaFBbj)ZfOz_qLIUg+H-Wsi)|-g793DP^CJ0Ks_*$+&MFNh|zw`Cfng zi9&!bLWEu34;3tX$S(1)%;x}lWbZ@S5`A8TVd;`6BA=-zl|H#g**mHA zOtO4Ocel|-#n92 zJSJIF325=6X!7K5=TJ^rDSj9vdfi%w+W*LHgBqQCPMKd6!rM;-j#I{I)EA-ixKO}! z#pf_F*T_yvXH1kd&-R~ZHzm*m%Lj(>H$Ql&WJZrMgt2^m*&o;m7FAe9B4XTH5X;#{xEFFI)ZMR?0A znA{iR5f{35r*yf)Gi=)K^fc(NGpaqgv-D?ot>h4Re`DMU$Jsgr`bOWAn$&W9&&Q>z zLv5i8P7>4)n7PTZjn+SXUXg|Pl|18pmR0%H^N&|ca!t>)#3-^Zr%zN7X;l!JgPs8y z_N?2Q4@&L}uIa1dYT+h?*WSOYA}5mB$h09eC>w|KKaG|fJHd{U99JaiPkZcaJ(JGz zCS|ffO9oEy4tz2bE2mkv*NAN^66ZPHuWp={Q{TUl2umbt5AC>uOpqEeD~&WG;|iiKeXvhx3yioEnuu#+NsD`VXY^-1H1^x z_tc;5-`h@PU#ov;xaoScZI*4)i%k4-m-$^m+H&z@f#N@&zvk>I)>5uJS~uLD4(>^O zJ^9x(B=l(75Pe-CRElT|pZb1{XSEg6ZS}&!I|@xxz6YPcsF+G|Gt-Z+y-1TMo=!g* zfa$Jjf;HMVAZt> zAiG%D(h$N=@u{c-Wt#v{^sr*~4-s~d8(Ls1mIyA8WyGoa|NTUP_mA+F#b?cQ6pVHp z68slhK8Q=_?0)>J1jr!N#y+Rr4`AJli==2rpKzNvhQs`6cqUz+T%jqbQ1YC2<|-&Z z{SU8mOhK}JbFdjP^p9euV+Rqv=WU=Dy>8RLefu#wm}aK2ycyuzz;KjSza#Q)`38qZ zSeSsK%sC6+(fckuvmA$#?BfO;0JMI0$8I4-=FTVhi~D7(4_9A4xd-T~k3?cdU!so3 zF1Fr~@UI_pvV%=Vl5$Zg*~M}v|vV-2c-%y(vDaPjhf4LmTC zSVWxFV^+w(-wW))o-y%)^=6XI0}3G`OOVx#!j^I9W8BN}m784mVH}`ANhODNV+sng z-+kC1)Ksnm|4m{56!^JZ(5<(l+Q(B4V6EkpR*Q(m9NI&Ir47^Qh3^?cq?zh6TL^Y* zK%oXgHnV~SmZYY_^C^)Q5d&)qCF@p#?G@oiW`v@C`}?VcZbH#$@=SR>9W*lF> zJ&2&T%)o9d%$=ap1X;UJzS+^1g~n`w8{0cY9>e-DFg!B7B{B~8+$B5G9N*X0syNf7bgs3Hs8 zT>5TcG(vvl<My7MSpkZv@Dd%x zch_CSBh^TE#tzECos`0-l^=Tib+HJlS(l~PfS}L-8eP0cUCo346JL}Sr`J)QmXl}0 zjzO^GnV8IYUeBCLhWMlx>HtNbZjT|Ww0lFfBJpq#dit3Lk7Uw!G8Cw`6t0(N1&`mY zbZ&v$sCD~Iw&1(|9RC&eEY;mBBBJIA#xaXtK(CoI2W1f`#5tbSLYEgt+{T`KC2%Ks zR)%hw)JO2dw^?G{8g;^m95l2wwLdT3FdQfwilAc4(bAFW8?zCu077gxw>+WQzTzsP zOEq{P?1}DqEAj{AId9$Zd%EJ{qAR)wOwp1$nX?pMu^Q3$r@|%gGurDldd;w74v(_p zz26GxN)^;>@(Q-LLyD#wI5UTx{D+IO!fJyGJ)&s+saA~kE$>Sn64vKp+K5h8VHL#E z#QyyKHL486k9cnT@MI$3s}?SEl-Xr*efCe3slK1b9?=e==1 zYo@xe)pnTwn_=GQ!%tQU>yXV4F$GNT{?@z*1kzWd-WuRuRyXuZ6|9$}u0`oA)yTOl z5wYZ*sftaff`Lmg=w7*XqFqMV@4MwKDr&ddIrLhD4bJAZ?^rz^1S9g7qTH;)c3UME@-_dFfNErJ4;Gmp5)C2+{=7brN@!L=;T|?0L5?OufsjHAu z-$cYb=t`%Nw>MWK5eF*$;+?17y-t0TqLWxGkVy~rZ;$;Cl;@Njx|SjFVa07*Wn7KGIohm7p@SBgDkklFptI)FPjS z{?novqN1bzppSJ8G2^u993K;!&s-hT2o>BH7Oa8|4bk^1FCp2YiE8SXnjiZPfuy40 zKF{Yn0YI)^P$7CME-6tJgL`iN6iqR+2jZu5L?H0u?RmZ6bC*Wk3SmPbC*;vK4kcr( z!%2UX6Ci zIxGaTWKQa)pG_6Kn}yn_|60xU%P`rc9FHHcy#3L$Zs!R4D1F|tJo&5Xqere4r__Ry z1FCi8}xWmyxeB|k*C+~{aUEt z^F|_J+(`&&5QW8cG?2p+&3zw~A@?TARR}!^GIvK&5-woWtuDG{xsk6}gy^=paPPE| z`QH=(-i359mbZ$edNc;ixJ+iAX)1f;?!oJiOezaljU3|jR9yHKI-AE<;_cl%_qp+g zYVc+YKWcDeMESbzE0~XD9o_Jz-Cuv*dfC3P^%QGg8;%Z(&PE z9Lr~g)ROXLO+lv!5chQ|YE>u^jep|^a5Nu_Z=4v7Pq66vf$oj+f^_N4L|fYxLkUCQ z={LHLL1!%uXpA}Gw8Rg1sq%@exHP)%rc_4>hcnJB@SH|mEHruusON)9aM{71t(f+T z`%1jdcXSXT#~t0Eh3g%-iW?<>2zG^KtqGL;J<6JhpO)z*0&s6A4JlCy>A-f*vqTwE zP{j&-+!O4#h&+^Fg~BD^ohGYPUij+v$Z0{}hhugDm8^fDwxodhM(?D~NX)U*3p3Tc zo>6G4Mp6^CyYQZ*QX~Z#Ijy(PDOkNj_ckxrA&2M|8EW4x9}0@8g2MBQCJK6&du$ff z>ATfeRgC#U2nAjG;{H!5IK9`|E}XKPpH(+8f}>#7H7k;v7|$ljUnO|gGage{x{MM7uSQls_tm#dhGKc1 zAStj4hs1M1jX>4Um?7D+g5SaKt@?kU)3DLT*L*OHM&+4LG2?+&KODap5J z!O!yHTMhxI-0c=P*EHPx2K6qR@?N}3mYt!$Q{>@3_3hpko{t-7jJN4+2f?7P19;M2 z(o9J#D1TOqY%|X^HYaZ%&(t@6+57`4e+5tNNWbb}_aT1<{*UiWq%5S$m#t=x-ELfB ziNH#W-TRl`Bd)oYbSHl9#&v--$}YXM`p`E*uO&}D)Xw$#7xKX8gv^sGQ<~OS$c}!e zi5R~~{gr~(TBg{wH1%K8nj{;(otoF||29Y)t++*tx^wEC_|+T?Y6@ICkO_JD3WSA< z>P}nPU=b-VP3)Yhd?D)d`93d_(HYp^zv4J<4ZrjnH4Wdc6WqSKeQzY#x}NaFUQq46 zls`}&oRd-6M+J()nzI$kbM&%se^XbY-B8^ zi)hsuZZv?4zMrmkc7W*X^AQVR;w42=ejtS=eJKoeLdS>M%W3HJLh=bCGXFz1l{!II zMM1^n8bsSdtN!gT8vCYb>7t}Wzj$5Lg(tM7P+xl}@b>e6|NR|hb$h8JWwzt1Hg8b@ z3Pc!}rj;66(i?1r5)ce;oy&{$R(-XVkHSvOq*JaUN>M*kvb6ZcpX(EmGu~Wy+*khZeCU}w#dpOz5yBi+Yf;!@ zwlN13_*=(VN!jB?bKmtgBu}W>1-y8zISsqW=!$TZAd;o0(iqLM3Cx4y2h+lMyplDG z2lY30`(Cj)T*h&CkFJr&&v8KtCaRlzKQ?AJqFZ4$LSEF7Tr`~dkAV*Rmr1)cF59cM z?FZt;Oliw=a_T}n?CYQRYTCJ+GN*F5oA%*_+KeU+k7>#ebJn2~BEcx7JFr=SchVQ| zds$sjqx^&%uxA)_$Sm$JuGaYTA#Y{&aT!9=%Fh?CO(#h-3D(zh*i*z^z`8vd^(5a4 z9hmpK4Tc_hzoGb0s!^Zo>_sE+H|=9bk-=;lSXU~G=l&pcc!5`o<>?dTGfN9FFu2am z9gjoal~wER7YBF-q6dwyflIJGPi38<@heOM>Bf#7yBnk|p>Xs0Vwp&ZDXx zbw3ghTD%Tm;N8O7`OR=I8U7aRKnU~mhDF_}7QXyDBOKNO#bckoYCpQ2C@+d5Ypa9^ zkYDnVM^SD&fs5_8`SncmC~jI6iEt@#V$SpEGA`Q~uY# zb|@m(6@~Z@^dRXyXET}#g(TU?#MOBb{)U(QJ01_Zz47S@T1m!3QhOhO&7@!ORq!ue zkyW*2sqIIbfv#7$X@K@J*CQ{z;Be6)haQYLc(=dX!X6G>^lcVXs6D`JxI9&H3+9y1 zX*)yrwX<8qtmlGEpkn*072tE6>jQzZ-$MAd2_qnR(6Yb)C=L)-WNQA$q2@}Gq#V)+ z^bM13te{XKXyath#Xt;)9t}U)xKK@}6xwQfaNM}?tl^@!7jljIQQtkNoIK#e7rvFA z8W@lPX|9>~;e+9hO8b(9zw_DHfa;8!i7=a_LV^EmfV}WUDOG3JeNYb`MJUrLe zJd+EgutA^7l#HF_9ITX6X~&9v^9K*c6ue%FF#1XD!d8U%Igld@NiNZbz7YLb)@*rQ z0c*}|BoPb0Bb?ijoHo|tx11XEC%i$hY1>5_{j->#acc1bph-MVd{FTDZbyxgy_~-- zH_$A0&R)xxLTm}*<>9}rFq^Zf`z(lR%{se;f$A4PTI2KitT}c(O*3`)5BgMj5aq{c=m_TNd;+t0tN|-S6s1E8%g1Af z`{9C|%vSm2lsNW~uxGZG0Rrfx5m~XXq1OE^o*orJ(nK}_QSvVGVl3?*>-e~$P<=_f zBuBL-oMZGMY24UkEic3PY?-oPX;9LbWi6G1% zoP2CIb1XD437&}S_w40!offUu5Qz(ItI+_}iNgN`Xepl(Fx>k!Sw*Zz=@k$hn+B8f z(|0C6R1m}Cj$Y;88CBHuS{1z%iP2ZAHGe$F^ih+*={N9{JlF+e#xT;^7N_Me{W{Z` zpYKR|LNK8lP#l`_q@J_);LN12?B$9w$VgV~U~vE+f{`DJf9h@?Ie3|k6_cHNClw(E z6aYBjTa+Y94$W|TuEW-G;r$dTg3T1P26?kv40vwGr2S0ujS9`QkkwGc((ctZg+f?N zzpPJWZ<_QFG2VqrNkMobkt97)p=xEiMtxQEw-pzc*1J_$U@LrRfRz8~Kqhm=p-Lc` zgWW&tR3bwUUuLKujr$druf-@&Qd?zjnmC<8gZG;LhP zjo+uN-L`UYW?3ZrV zapRA6+`aE-Naf(V6tCC?_PNUVp8T*bHO+qxdeq{^x@Z2oy~0bZvr_x8(s|p|ubb{@ zfKa>VJ;~JAR8AsSg#iG?!1~jYZ=zt1>-OH+6(O8+8}4p#!;aX+15FE|caB605EZ9v z9AlEQCbMfAkSPyBtvt{7J+f2jSD_I`IVyaDWI{sefxugP!1dOnr^Q&aCrCe_|JZ`p zK5`F$aWWJW5H32lHbn(G8Q3PkF}cWPk;2_{;ZcAVS$=Rvbz^KI5~=GY`4M1p#xAr2 z8vwRVx_J*>H42 z|AvWf;*Y}VgoARG!N{Oxz7O6$AqKisG_YGyJ2Ikn5d&%O<(Q9yZL7Z6rF-`MguQNg z%1fR%RT(~9+%Mrf8<_tLXXfskR-6`Ab7Wp_q5XRDOgnwI*1sjjbPTd#H?HOt6H2wV zlt@^J&5At=9b0ppV zAACh$tSLEG4H4Rf0H(gZ)LGhdsiI^)mfWb$m}-!_stnHZ4bYWdb70jE6qTy1k;BF% zr*Cvu`8+HBdR6fHErQjM`u^dU2VXx)FnlQ#l@`43pZ6Y)1y9#nNH!*6dvfM)V_BQK zC9O5OPagkyt{?CRVITABdLKhfaX(p1XNz)i;p5 zr;OO;?*6MisY!;P1wct2{TYfPSg>{`{VFYV%RXoJqV0xnn_@8Eg7k^dlxF**kq3nC z9QZ@CU(?x;4|U48Wvi*3FN{w;R^;cZ~Rc9Sy}w-l))l zPs}ggL4`e*e#Z2mxe8(G1}%TkZ%yTqEe?9UBM&81J=xw4Ng7B$_%}tU*YAg1&ObMj-Iee|Kj+noKe>C)zJmV zstk!^!Y8vjGt9)ux|wu^ss?!#ItOWO-7rjPv1!p4eo$imSjq(h+W!-f!1mf;tU|t< z1ju@Ur%rGFlDS(PhBVnp!q&^0BO;XU^2Z1otnXMiuw!@#Gr5MKc2PLP+_!ttCr;zS zwVq7In^r)SuPyhYTJux$CK*zFcp5v}X2~a(n|#=1cE$Zkb^J4_rzJWZY0b(l z5p1VAd_W=QTZM|78uhYpUqrrBr-}h>CBPLS#uPD+?7@ExH45YA30tdt)UwSg8wpUg zLPRaT49M{Ik2~2Fp;>Dd?d0jVR0dDf@sq}3-aWcP_#6sR`!^SKJQeu|O5!|?yt5HG z6VR15GzUX;Sf4UoXa&~N^T90$VmY*be4mWa#gC^65I+ zl2wBV;){xacOWo}467;uqV3ytqr1qq&r!liU{2^B+jQkmj?<6tQOOXWi;voWNuAFvkv7!LIOEg{T{LMjUgQJNfq=yW(%~ z0_n~Qg_`pY>VwQw%QSiEg>5qV&mC8=nmOpZn&KW?qou`VUX5+pG8x~!8q0S+nbg7$ z#j$V-7kiE$Joqbi^|}8;lZ8L;qZvO2keio#?<`9Jd5nYFdcTE%Wq6T$7&z=l+sO|j z;{+Ra_5iC1*?cd+2_IQP$1VehBIBzpU-&F`0Ljt_9fn<2O1I$aC4Uh75EtA{CkMKU zG=i3we+*W41ZsnI_m@8?5Jgkc>1!5;tc{|Q_>BP-H#*{uGF?~(vXMval@cWiUmc8qFlfh!aOAZ-R`iU( z%NW+6k1Hgf>T|~LNPH&9n2+X}`D>Khb;xJ3GEoo7?gIJbbdckrwOhRn2D6i7r6oUW z6WaZi?c!ApZT%;R7bbE`*pFO~{{*JVqa&aM-8*An%v8-2wt|E<<~D2zydZ^7Vk4|b z)30hycD#HL1Vhqa40Hx`2q0j&p&PTBHuG5{y{!qSn6zBqe^S*Y*XYvy zKUu0pjU3n~%nr(QzMn#4idkTf88fazRJ|;Dq$x8r#2m9_B;+bL>xvN@lg?%fbt^uj z=(ZjFRL**A7qG~1&UA`&n;h2XTMH-uc>9LpE1cWJPogdmQB0CbI+JY(gyJoT2veBQ)(XR zg=V<*=Z1DH@S+CGN$5F_q4iOvFxF_y;s;#J+bBGzWapz+mNO~6jifaMhD;#3FYmqK;a^-&FHw@2emQ;+%w*SeWPNcDD_So5mcP4uJ#_-0Q?@%FvP87M4)F{I zhOMmStfI%ddd2G(}*lr*)7}=DXX-gk@ccEO)t1(z?v4Z$2bA7Z+=L>f(2fUM1L@(l87lO`Pc7Zv2@TQje7Lo>p(v! zs)@(*;TM|vL23Vd=vWI2C$k8!qk0w}8hxH>wU>QYJI#j;e)#Q(wSu7g4p8tBCjrC^ zl;;66-MpH*KqnO9)@R7BllTGZB-4M#qBIjZd~7NOXb`_;)C|B?#h`^LB%!1GoWkSxbyL8$>Zy}QRIyFchm)?j58&#Lv*Q2 z1u@1~8pnELB1}W)9VO|HmG{8wHoXE)g;iA*$}GsCpd_oCDT9*tDrJKFU=5%Pq6(jn zeQIRH!D3sM-KL^plKKS>_zPrmNpXCM+{wI8rf*XN&Aiw|(VV44?y8u?zrUq>TMUiO zpf5y=R;-@#-z4MofL4@P!WX`UvYKz!%2Z}l22neT>@HfWX`k4K0vuuPIp!1yMF0?= zlFYB1C+G_8{Blqi5Q$V?kI?73YVM$Qu%64=UUHE?e2nCJKI;nV`=|J#iqq{#b6M=H zsW4F~kDJ$-Sp}cqb2xwgmL5~%0#QQB^1}bNq4@V?Zp<>XS$G0$q?TUDOggKRAg?$i z)tk)u&1@AeNTTX<70chO?|=&iisp7m56_y)4=(K;!@=nNR_W zfQeY}MnZmwAZHh=(rgtb^3L@iAz5s@4ALS5jz8Q!`(!6fRAU@n0$%z3!}1Tyxq(41 zxF3+eT78~*_N6e29-NiDz`-TZ!uK#>K0x5#YUJUV!9+SQYz9EJny^{(fg+%w!{W|U zMD6rT2@eQyv=AT#$Ne(|Niw*R;5F(|p_7=Ms|p3CbS34R zLl_OgA^yF>{GY{-Q#b&Zn6_kHaR#B83Rk1zg~e}J2KBpq;`xg%_v5%@Ao9wi%WX-sCW zGAV)_(goqaa_8w~mPOCqr5-Z3WG=ncaG{fW6#er$Qp3!cz~5o9N?HBoMWeTkQDago zVvr2mhC7C?=;}r)-|?K_DQITCZ^f-sL<`T=U{~GAWxFbqWluLhb}6TtSIop zVo(HuxV2_rFLCIPqDDv<7*6g+4C4VCxtDM^3RKKe5F;EX46*|o@_%bicI1b@x>jwK z{V3Rk6$cf_jJD=H?IXI{U>xn!@4LD+(Q0hI-BLamyQvy#_ihd+VP*Y|T-S0PUPOET zID)!M`{<^WNh3YF)=@tCIzGJALu|!u5+3~LhWuu)d*Q2wKSh3eqw0!E={4IU-8I3h z>-#uF?@RQ{_SOlnqexkczk5;^CpR+6nm?Lq>Ah)fy@+x6gx)o6myY<``nFRi*^B*z zoGs{;hMJ>$l1P~b;K}V{fd7D!jEvJhVD8sY@ODJfGGFV>Nad7blh1_&S)kQu& z3D6`Ojo8Q1^xn8@fh%aLW=w0@Vpq{w(zUeN*S*RhgZ(wgZb@=ZY|&i|{lOzAj>|e9 zkUB|xe4k0yZe+ps*sj1fW6Jtxxze8Y*VkYS=>m5HLT4M#ZM_zr03W*4z8fb;&?0sJ zg7+B$4E~cAc=y~C%(Jk7%w^cL$jO{}bjMPzJ)RPG>=4-Jz_ZMSKac{C?N`P(l|P0% zqZ^F*pwRDSIdK?Y_@8eVU66zGME+gU>asd2ivA8f3z<5K_b~g4aqnHtN zfCVlZY}S?rYmkMFNxQSBeTm{+YbvhX)CgfG*`cU7UY5X~cE9D@J3xQC6Wz1{U6=fUcQd2gUVc;HASQ3H z$VXPPBvCx2V7^YRXG;13$V-@O)1Rm$bh|HH9bp_U<;p>5|@ zEM5J#)j~jaJ`GCp`Krpo4h;1Dx_g;hHY=zE4xIj|QaVonHqn&jppK!TnVvyNv$vc-3khRGX%8Ezf z_D&CB)Bdl+I$0>+$C*N}t519n3lgT@`gi~oHA!Ol0-DWNh-FI? zN{W`6D9ftdQGXbw{6IttO}hNJ&i*-jCHISzZF^NV;;RTYdatwpNwc+}AG6%Cd&D)_1*g~b~*vOK&guFZG zN9PnGZ4$0~b%x0d|HI~=tDS7&h{>zmEMbP{^+^Xz@6rjlEql;`zu0U{vkfvM=Qe0$ zJ)|XoVe-rJIj>h8KT=qp{7`JEBIg=tJ)g#AC<#4|Pv01-8QRE&em^_KV$*1e@1ZuSVC! zLFBJiOeI>R=9+w54`Szk%B$D}r)7=A+$zYL^>%0KF}$PYEg;0h{@s%5!%jtnnA|}c z^rq5gcOX~dbQ=z97rf|feZUx?j?G;(v2=Hwxv<bW;|% zn3z9#0ECi?7^kUz-~d%Is@_hV%+saGvrcbn}=d zLJMhf={_{-WGlwal-wV?%z+>81xd3MiR+4r4FDePA=$7lIWvg9d9g?cnt5+XfNd?q z!5rINKMg7IP<)Ti;|#Clr@f1Ns8p@nN3GMintUf0zKzhUPp)!XK@Ntinj87HFi855 zC*#c85%Qq2_Y?ysUeiS-dc|okdk)s3D%^mJ%Sj<^@@*xMo`IyZdnca8x|l3HOfz(8 z7r;N+$j~_(D>alqSC>oUO5lwzekAT8=_2)D6H}z?r-0`$v0GY8JbLG=prn|x#a2D6 zjqOiai%3<&)A9ca@>c3&s~ZnpR}i?Vdz> zd_S4A6@W*c$x5Kgz4pQ=YfM*n{A#pHU}8t5QIr>hS=m7(y7t*>XGvb8?ke`G-(s8N z+!;gtKkz!FLxTb(+P*v?ZP`w+KQ7aXkCZ06!I4U*q z=_&S#if8AT{IJfD8hlnfxf4M7x*qI3(8AjoYKRlsRThBcBF9B$=y@G`x3(jLMYCTj zxvF#xnb|-hj}**vMiWZD_q#EoPM?={ml%$%;lIu&pXhQ|WOr8Z+~8h)KN_DqCXxLn zKj&@6hnFokQ!SW9y;f%dYnEmU z2tH45Wc6t#@~7UP%8S>FYcEZXK_XiiDQ{DAq~fbrM}<8Dd=6nvK>_xoYYo4rI&892 zVjvr~!&Suy1B}0z$$!Ie9f%5yMU4ZbtnmL6;dV?(z}GxbJ!E5#P*k5Q2$Y?Qx$fS` zgRYs>+I1WLf=^4oU`n{dUv3#xj6b^`N>hi3O@zElB!Ain7x`23*!)zhS)(8<*1a%{ zN9@I(HQjsqdWPby>pI)axal0*{wFp5b1$|1JDA7&QK<1i8B4^F-iwz!^icOi&hM&{ zjwdY9$0hwQ5JELg2Mq&P_+;++(Mx&H8yOWFPxY)$I;eN-gqU-Y5_&##)ZtT=L4nU~ zZ-tv_63_@escf4MqS8z8uagbDJ=%5DZ1=}e$-Z~mK#C;--HG9b2?ju?$KLZ5K|(&! zO~66}GFdhG`<=AVh@O;pypXhLe5_<=31WEP6ke_*zL0`WQPYog={P6$&0r9?}DsoDk!y_(5%4nG*d8W-p6TOUl-FYlac*DybSdav0_p1JB(c^8^1>oqeZ zPgy%$PC&4a-m6~4`7AzZ7hM>~C0`x~pvJ2uWJi~N{tu*A$qt@WY}j;rt9AZ|jcT8^ zTm;MpLJE?PLCPNk8ap;kTKQk)t^nzuMxA**H`k%%1=@ZV(4KDw_FU;fQwD2su1oZJ$Wnr3kSU+N9^Zl5{ z?j3BV|2K%Q0e0pd9-A{kfDM-GXRsCxQ$HOx_*-ZJ3c3PVuP8xxIdTDw)mOW;5>^M0VXRDtP)0xJJ737 zy70%%1og_BYu9qDD`oqPElGo0foPCwSgxVsa@HqR7QaeB!haB zL!{P9uzvT3fM{z~?bsq}vd+UyOtp;$NX=Lz zvMGT7?y9k^fXYwtULxRnYLb<#dGajlpnkU4gf&{B*7TVia@$MRLQ01X9(d%cqm`Px z@!jJl^AIiz6wJiLL3*{CVvwj~J(sx-nK11~DcPLYy6~ez4A2&EtK&wgtvdXRVKL+K zV`SMIu#VupU{pmxm4I+V{xPjPWMXnLoj&JbaGm<;2Gya6f08B5QA0jW&RBF z*GA{%F83Tg*(GQZ%fvo90OfM8w7cfU_vBy}0m@P=hRYdHl9f z=W{|sxkr{$pZe>Dt1-vZb{4xso-BrNqDvgt!!Z`zN4;wL6AO|qcTMGl`UWPKuynV3 zgesK{l6%GKI4#7pBC<$Tu~AI)I>*){GMxtrB)alqO-`Nmoin7=%hhIQ{$7?QNXD=L;^F!BXTe`+yd%Uz=h{(6VaTDF5jm$v5`iXI5) zc;5y9tR%m@4*p3m3zS7ZY-8AKrhW|e`H$vYV?o;67{i0n`eda-8>;HGw3}EK53ch^ zZ%8%M->sbZnOfBlZJy5tPDH{1DkvyQ0mJJ07g_5-zsT~ZQ%KWzZ@L%HbyD)X#CqQpcdk zVHTTPqLO`; zbO=nZcHwhYdsF9+cxTL~Hxh&e$ZM}kb8H^oHfX}`DzALxce@a2zdpTnhxks80T$5i z0YKg1;sV9ekQ_EHo%C{?sq8aFB!gT!Z3mn0AEB2Y5Y?+uz!V$ok5DhUJLud!o23ke zRev1=<5}aw5;BvCPLTY0<7CyGf~a?=?RyO+%z8IRR8)qfk5Vo_UU7m<+MU8Gb(l6g zi8D??KUH79#m#S;X@sm`k^$G?6K$pe0IB#&Str=9KQm~um&4R|of9!m+{7%5WR^F8 znDF9!0$J^gYk+{5pHCvfbP~fm*XXA{IRV8xD1qC;flk`!HJ!qAAOy8|M_!~>C>3QWqcFp(~Dg|lx+9t6R(OH9o5))&DGyON_=Qkwz}N6X2(NDhQaZyQy{ zyR!62y=mC5yqr;2;DarnVHu@*A4~$`9Zc|INEG0_?6eb3r`dCSwUN5U=|;UHsa#pHP5`MWM7}pXx!4kI-I^H$C4iynQPnA{J}Q=(O&P z#ZGFaRD*QzdP_eWu(rCE>ybCc^#mazjyr3;ItS`y5=BO5=3jr6oesPGrc?Tjm}&W2 z`W_Rl~>LUGj0lz)I?CWcxwhpN`T7rYOlcE-Yak=`{uIMY?`{DVWE%8NOb|o!p z-`v-3d+^JT4d$9>WyQ0;%zR(|a`vapOsD$2z%$k7(RjxKe?wA%4!e}>@3xOy9&F{%W>zX)EFv8&qnn?$Lv{*X(qDZJcUzdwxD!{W-N> zC4i7c%)%!+V{?gRpb^nuHjb}OyigG|flu0cL&oo;m{lTu6n2ePgA^{3r_ z7-51iU4D|ULtOvh_7rq(d-ATwS;h?(T<0|YoLBID^?7aL^Xy4q!o39HLTpdG=loOp zQ~~gw+`NrK<&f*Dz9@VzesNz>zGN-mKzZnowQ2hmSqit28rb3}?NG5~HGk&273Jg* z7$Vku)2>}xLG0TOeA60vi@r5bM(lVMJQyY9Y0rzY*=pby z10QP}uw|2wiWMQj1-Vt-h>md)(8P4%wjGQ(Dig=S#1P1?fwXZmXUNMIEwfiI77i!ai@`J4n}z}6%f?I=8AYKQh{l-cW?znPEY6q zC+QOP=%8*4K6ge?6}TR^5AWk$897e8bvA-AW6^z8kBEY3!bPsqS& z1ug@b>|4nKhwqn=^VWVl9t|6CtESn=Rm7SMJD1Y*s?dwz10m)l{HUR1O7kyKC7y1n zGOeT`r)b3t9cBnIPxG)*IRr3#T-b2vJD@=TQaM)~M&5K@aa!A+$^YM2@LX+ERX23? zyGiYqHK}H|(i|4mfL)Bb_hLDF2pn$x%+NU^PyRY}%&7QhgFtyTy@T-sKr@hkkoh+^ zO5R$uZXQpu3@US6nuI_%>5agC*sdI#6&2&4;@%NOn0UL6%qj_DPmpU_j z%dBL^k`iC=xYFA6Z4bp@HP3{hPB1RgN)D^8C}QBt@j-U-Nt+b?+x4{N^SFJU121}S z^2W^SLodN`Y@MUaxImOJp{!W07a5{MDCHspPKB%WKgG=mXt^%-jCnJ9_g2ugbD-?k zwzU??%(*~vJ_O1)Y8dMlDQHfVn#<>#(pfsJ)f(Qh*>=s<#a`-ogC!_;`Ls*@j25dK z1M-K|(l%^KQ>ZjN5(!(*i-HM61M~WIuPVfaGxK6G^90jz9{J4D zJ%fF#zI>48^i=)4gn#ji9B(&y891Ms-bt{HO)Lp{NI#lAuTS1E{PB^AIDGgEl(#WaEaud2oWkcj@- zoW}VizZ|XA2T~<|COJ2;F7g0BC-Mbn9;w9X#-?jZBsr8mJ{zN)VePVELu8x$yn{Tb zAJUTCQoEs^pU}YjvCggU-zwg#UnVjOZ?X#s|9Mq;@Uy8qPja*qejwD7Ez!P+7x}73 z#bYhsZdp+kp&5Ss59AJw%RqqS(9y+ygoA>pU5bk@v^Ak+)sX5= z7VuY%(_akG8UO_otzQ&HgIY`wK5dm!`3r z4u80ObI}_Wb0su;qF?l8Nz^%2fyZ)d$F6w_y4+vZgg8EA`<`5);!VxOEn>b|L-mGT z&W!$RX1lbT6>zF8o%`-a_x@B*3~4AcxBuBDRiPTAm2tkBl$ep|3M`#>(PGa4!aVyS zRZFe6FL99p1b{qmb=N2Qo!uuWCvpj>mx>3cWmSITy&B!zqa(HgK$Uyp{bTC>(%b7n zKDoQRiqNSNA6hxy%F%FYRrK7jXUyojy^+sKhaL#d+puZ->pTG476!>dfHc+=qf-+7 zX)8t%0KRn?hVND^Yo(A?hS(;QaiSyAcBLGW16`@fa^#uF0b$|1X;u)gk1pm$~jv-{w>c z*2n5J&OhV+*2UNqE4H6i8s&-X0Dlh^k^;h?H`W)hurcg?-3I*YCxs;{?$;Y|zyr&x z8+t+_w!Ee3rXvtjo( zKP(!FiUtZWydOYRa}#Y}Gx{o08i#o%?jgvW{T?;}tdp>?(VX7-$HLx2CuWBb{rk43wQ1azWM8Jt$(Zeb+RSlp|xY3ybjT| z%@kp8SM)ip6gz@IYU`>fT{oESIh!92gFc2xC8KS8kK%8Aoz$-D3kTh8*u;G5%f!n| zmbys`d&dH#v$QnIpnoKL`U}?GEM1pzRdKE_#LoQf5$PG^pRG8Oh)JmE6j{Ww?k#7%$^ zp0XbMc)#&_hvl#vbfs2(uRi>qvNSBi8fZRm1Q};<@$yGV5=}NM@G(T|p_qeCQw z-yxo|Ml-&wxRPR-E#t6wpIA&!<(CI@EpMH=*Y}`*_~&(&U+{i4dJ57b3OmhA544(R`vyBD|KOCpGt+pG1|oBQjvqH;hIX;Szz! zor;9M?AZC9P1|dQAKUJ!8gL~g=wr>#sV6Ph23>Rp>%jQUI9ZsNM9?;O6E_fveC z|Eu~9-s?+Qu~UM40d&dtm3&p`CCOgp#k;j329mKD`Qm6r1isGExt@Ekj5@7t{#=M) zJV1!!rmmRE7t^HxgYcG&7!(mxJujuk1bTA^G`&#Pr$(_Et@VoKw>6b`p3BYrZ`Pm` zUTsM{ir+Cxy~6e$vjt531N($#iGXU+(;9+A!(n~WKTaMS8^5QdQ!a(SckX{+tSZX!rD7W8~D?dWaWh1}iM{{^OM{`^I+Z!qK+v zFp#%H;6A7D!{Y$O3mKjLh%GkoV;B1syuh%cQ71+1seZ*+N}K(bt(0K~XYUXXTKe|( z#c;D7>QbG5_J*&wZz#i+0HIY3l%@JW3_18xb75g9d#7o^EdS5>W^f1na20DT zRq;Oc){4pZ#?-1?1BAt3Lnnn6t!JRDRU&6TEncjCEK`VqTfkWkm_534pp}4^)(}P6 zoEGdT)(GuWVi3x_MPX_YylW;8yMY(~3-&M>@bgHDrDdCIF8si#3vhv7b14Km{|mul z8`GbO3KzVkuyZ9)34)(m4Gc~jLRfLLdsi;~u>NPwa?7Up?BbsBKvTQWZ90m|2;p4U zs&JSQ$ZaTx+H%B_Hm0B1;-dtjXiC;9tVx+y8 ziI`z6h=Lvin_m(E<}ps~RW0PNl>FNyqJ%Kr9M;+jD5P|Zo+Qhp#XC>n9ER100+x7h zO_A04`15$by73dhPbT$hhYFJw%X!7B=e2}LHLr#3b5+``--fH;IYnU*$uF(UUz{Dy zpk~O*n+uu9`mDa2%*#m$KjFM$2u=H(BJ9<^lll@f+vUiOxrB#&Srsd$(%{grjTsu# zHl)G!KBWeGFZI@j`|N1<(w9kXuG%)v{KM}0d}Rqcl-peNLVhuPB;!cjQaA>}0o{AaEDd%e~CQ1;6t&_s}5clI=7{zN%T z^NAizjuiBs$%AVx8K7Csn}H+#5ff5iqGw4e1<7^m@IHgnX!$dGqp0VuqB17kxqfROtX-N{Ug!|3FV{hw)cOVx+T32Om3B-L-P{4^ScQ zRWijA*v*m%fhfu7wV8d}pU}n(8;Qx4O#o}M`&MY@067_A&#tkjc74Q<$=GqXv0c&k zM2&MtzvQyGP0$jn;@(d1LQ!QPV~_nC?x2c2jqm2>z9b+xUFGA^;VRuNvDh(?zD?1O z_iVl_j#qFg0^I?Y@X1PxP2C4_kPl7OUhRD`%m;dZLv;AI$XT~xz>{_n%ET`7BGFw& z3b|;oYa%=rz;*k-113*U-ugp)*#;rc!63dMRD8c(|HJvk6j! zA8P#)lZeo(0vA5= z8;b=|l~=Ck=W5!&m&6PJ=xU`G_-4)SX*4h^VA%Z+w6tVy^*naJ{AG`FZ zF9xlBsZ+mbGHQ6IvdMrKje$+~8qVDMFgz?|4(^&uP=ywtx-OTLYBAAV3xPt%1U zHWVW$`F)>UAp`qlJo<&evSE}Wk<@v0g^j^mbetiQWMhRdNZddhqzrHcGA}pkz@fgF z;>+0_8lZLS!)6(2MK}jk<}LPMxhkFWiQZa9aA6z|e@>eL?NholTn^SxmzpTOkeuPZ)pBe?E)t<>cemyNmcF}6j97>n zS&Gz>@eIeOl?S6(b9W^{Oqn?aP7V?3GbJ+14%-wSm9*6}!D@hktIonX zK$gLSx)-u&$FO>kYIsclQ8&V2*7-8vU>sig-gEKQ^s$ zi2HSEp3j{vkWW9@{Amo1v&>dLXqUNS4OO(U@39lP7+Uf1F>7a*NzU7=4Qu_-oPb<-Q2xzn7{6XH4$=cqs^wKDdfygkLA8iUDH*>V1_c zQV%7_2F-O|*Z;>Oeo5Z*`gy_LwRY^^`&fbTQ#MC#Tw}AJl z?8RaMU22=osMv&NmhNxYh0fH*e)&6ar_t-#FJm@mb}PI_pLoiy-FLeCvcl8_cai7A z5)Md}w~k+&3Am*92E%l1kqXcXr2RAJgTYT3-@w^#~ateyoigzn}zMXyVHKp3}jQ`Dy z$LB_bS;~EP&CO3gOv#sPzrFuOjgBvMe|KG5uIh)vv%sI|x%C8)4+$C`D>d;Vcx0*6 z4uM&)c~}sxc@)*U{5F8Zv#q15awJbd6?y+$WVt77IV(exk;$ zVEi&>ZDXpZ*_L`+%i4M`3$V(nIC~ETGB5oI&a*N48OKu~%&$oTR8k+?*A#^W`Xz$& zkPN@VBx60;cRRnpY-%ewp1@=Diw+D8O6jCdwwPNE{{!JC5=zXnN|@xXyq=sRYQTBz zA}LCI^J)BlgP7!kU$wA^L{s#qO#S+jU0DDXgaqndaFrKB5C|2=hwR8+kdyK{&wNv4 z$zEHPox)HMnTVCzt$L9$C}LP{4R^uFoV$3bU;1DZbEth5iZBS&Wy5dGXYoi$|BkV zIF^2lQBK+Vs|2?ep{`^w(^@AH*bU2pV{T@=IF$br52{fpx0peul|(UbsavsHYb7Z$ z%1>wp?9+)R>0odF$6am*+)3-2pOdzjPK~oUor1#5Ba|Jq;`-!d%ppeH1qIW5OfuZ z7?-^aiy7T6f%4nP=bQT5APi^<$;_lOT)zE_{4q^EWCQliS(w=93To8BXKOd*eAgLtG3+GrG1|HFJL7xcFSbYME zA{Q$#?Sv$d`?lvw_@oM!>z>#{L(ff`X54u$t&sd%1QGc&aQ2wy#R* z!j^F87ecfNlgX({^2du@xQ~D-o41eR=yKAO;33ZI-nZ%GMmryu6@J6wVs2lAb)8)< zj~u)_2_RWvIq_+&BZ%XvkgfBIX1vZH9{KbRL*ya-n@6tC!W{<4(@@mLFiRVY<7de= zrm~EXkt=l_iR<>N0#^SZaMMgJ7kt0IoJazfuyn^1QJ?7@HU-6rOgTZXmi-STK3?@K z!v6i*R0-|8F;HP$&i7C@$htt%2*;kRpQ!>ac7tDf;rQwvu_7MVyFK&|O<>QwlV^8b zu;PU&{!MV=hljMX{(s*JKVLg`_jee$xr1t+0(Wzn{0;ts36+r#M*^gNar*+msCf?K z*ZvSkT~b7I~~x4tu5W1P6P@L4UnC3-nC10i}mt1_VVH@ z>WpsW%WN@a(G`ycT?6@oH9&~ey{0ZI&L4lvM+18myTPXKBWYX*S(OAcNCidTvFL4D zpw?*nyd2Tw$YwDT^^JUvYi}^(J^gUpp6dJA>6^aGs;COQL-{CJc!aCBF_c_q@Ypt( zs8SC)lZ?cdN0b zKaDE(>ycgM$f*2Z6&CC@Buv;QAoR=U=AiK%*{?75xG&PMqSpaD7sfxo`$g<-{#4Rf z2;-&C^@c`IZ~szY8!oT#HgFy{PJ>h_mOW#T~W00 zj)lojfC;OveS5|me{*B1iqHUBgY#~nWm|L&2*=ku*#wqK1Mr8*HmJ0PQaH(^Hi6EG z=e)Dw7AMxrX7_Po%LPpQ!;{2!Z=Gp`aY&!aKSvJN7&OG&`lYFe_8ruIN*3tL3QvV& zFz|HSJPqLSk;#|)+9~)SXU}N)yPYGU*LVAXE!Pe89C7e>U;x(K! zyrf#9hyR+K5v7a}Vf#|)7=z^`#Uxae9@H+glSkubB2i6^=_6U*dAjGp+TK-@zTEHK z&Yecr6u|pF-KiMoPqpx*&jF1}zLFN2I@$lt3Tj*jFoB13<&&99AvX8> z-sGRox+NAF4rWQ+bxpj3kl+Vo=Ti@vsYgrPt&>wpZCA#=hqL!@Oz$`N>&o(K>KS!; z*U0*J@BH&pZ&<74S{!?JZ|rpFJEAk~ww_i`7JkQq7%P}j4|xD3=xt)W{M0|rms?`| zxeg8oAZ=Sd2uh@YsH5;A5i$ws0;71H6hItoz(F5s(6!kR1&!mqs=%h$Irc1K@bP z${j?eN;8nT;5`!NE~viPEXqqcIr4ANDq?gwtqF9neOSv- z^`1!wY!aBB7Pn0AEU8v>bs@FXc#aTcPgq05I*G7Img&bA?40RQn9>Iz;4TrhdLV1> zJHVbEogFYLhx~4O(OoVauhKer|F&XkvQ%eP;`uKi0N>zhFjK@9Oa1Wr(ZYF3rt~dpC%5`Ul$=!&t zVuZWqc<*}2Ty(vAW>n*7Ecn)y+;nDhN2p1cNdtWV6f zXK^VubnPInFf@!>cZ(H=hR?jI=$$WrZTl^KQX7{)vz;=nOsBcOn;Ed#fAQN>UG8MH zvp3!PLImNY7yIQ$)AiA!yf*ep@41^IWal4NY-@Gq>5l>gxZ>zc`6d}_s~f<&R%^kk zwl7$$Nr@K`w7^1*b!Wos1JPxHN|r}p6_8guK(PjFl5WHcrsTN<3t&M4D#-F{5_qHD z=v)4G*uXno(|zjwzrfJBs9Aw}rEb98BudF0@)!u*bZ<>7Z{*{_1{LYMifNo-=r z^Ag%N-*3msHrM4iv1@A-zR~|HsUE2s!v5AdkIWmtws#s?@Cl#2lv5io6n$fR9^%$5 z^*n7y>U&h%C7YcF!42ZHQDLHouK6gJE{8yeqn}Yt`K!(m!Nt?tpsni(<&~m_e@ehn zQYKylVW)@Sx4LjZGgQJZ)Nc69i**=CNHUyc7S>SRe=S*V^T8$m8goF3!qGaFevA-OtmI`gTNElfc@A9>;sT+Ir4^KsK; zAs~_}HV#TFg8Yih0Fzm~8R0e*mC>+4TOtKVjjc^78cH)(+-(xf9+x+%;oNqPn3C5s zwq=!pO~le5?2}(jct2>C&+2y5`sY6)>x)I;)<_}z7+epAQ1%95aWVBeqnC40_f$OR z2BYI+1L1BOPS|Hmg#=8Q`VkO3)hx%3o_0PJriAHH^tJ##B#)K;Y*mBL*Pg@eOC7yV zTi^^oJJWAUtTI#~z>Q{Y{5{t7nQuoWdA_|lok@^5ER7&({&rc2+jsKmD~A!3*DkltUcPD(DPDVOm=Dlu}6+8!kgh11IJdbt-({ zw3-H$!wP#>VN*-vUA4^a`2LD_KB)7nrR2p*mU8gxz#U?!=B|gr6j8WfU-du_f35)d zU|fVV4Nf;6%VZga1O)C^`uCq0(3rSL(DtTwfgMC#z^(_DiJ!b}^tV((LSV)L{h_3FFi3rDwp9Oa_0vnEmIF`B2 zn;yrze)r82Uc2Qxl{dpY!E?ELm>X1^%!trGz5UY!N|UVgOWLuSdPzRUC`FIb;cLg3 zZf*;x7~Ef|k6ZwP;(cugUnTH5&I4(_X4GGkNBsQWha1k}s}RZ0C$X3n*s9*r4{V8# z=5)~Eun9+>?&i^~rw3nN1LQGiRzXA}u{@UJLDOX!NAI=r&ZqpaQ9##B$bW{iwsWiH z#I~3q3u!u*1Jmc_Z^Q)97S@qB*9Do_B(rB~AJLimbGfM%R^7fKag|@j9~?wlR-#Dj(hr3uoLpgu}k}MN~u!cuSZHq z_}XVe`=foX@>ylEFHVE%dMMt5dNRK91kr;6;5J?lzd^VH4mPG*nBCT(fQH<7EdTmV zj*h)>{k4+J#YYQH9OaJn$_I!YWW*4d+RG+VOW>dGQlJ!VfWtIND%FsSf!}eYLlf!k zqnT%ZH(Q4-uDt&a07QE(bMyY5ZdY@YUOC3Pmi1j}xWz1B#d6+P{e{Wo8s34i?@9K6 zK-)B3u%qOyKF}@@Q|LUi5_?c(aoN^Yr4?QQVOoKet4&qfzJ^a|aG&c*;{rl5VxKn5efh1$5XdHZ9I$#T zpS{A-HSEpnhp#ie=z9f+pRdEn&Iuxl_Raa`PHz*;iFx-z@&wHS367>89-5R51v*72 zH)haZp2j;*1ALVoPKD_2C6~F?>+KlRcJP$2$u~f&h}Z9*uZy!H0>UL$-tE^1#5TS05R#sHOvS%>N-~_BDeB{JdKyFge9|wMhQ2aV<%wC zHOJ9%L;f&oV@*+;^9o(4K3>Yqd&Uqu=*k*GrNyq;Ge0l&$0LEWEQ<5+ z$i{EdeEErAUaz@DBzq^A!1393oiZJEFC0fFTQMHyeC>b6H=JhESEVJBa3!7TT(Oa` zQ#bU&v&JM5!}tOn4*9AWnH>BkW@w@BwUOt(ot=Fz71_TEL^{-JcjN&gG)HJ0?*h_! z+#WyLJ$V7dy7X(JrKBhM z|5%#JEji;Ul;ux|mh8+wCn|7WEnIVY6Msnu!>gE8;?cf%UdzJtukz=wBZkT_4h`Jj z;GFxzBl*8OO2t#CV~$z6hLB5(wW&nnw|ncM{(T3>&f$n(!6ehYMtXx6%MI?e*LvTb z`a|S&c8tO9WOu36`;1uE&g-@o8GbmtjWB_;Ln& zHz}^9GPm|nZ)niml0YDFjd>tSs%En}x9xdfy#PlppLjD$p%rPC{DbhEBDj zy+hpDn=dPA4i8F&?w)LV+LUzk{3!2W?<~AE&GO)T;|{N(M}XMcY^sYOCdt8YX2nr@ z?nj{EJIbdvT@X@Ens~*zcEj410ON16iMgnmO0*z^dsrDky^eg{8|p$C8xR zy#lqhOiEIMTq6}9I~10^u|#_yjsPOGH~(B^r&g{eI?H!hy=p-iA`8g#v|1p+ghBuV z-DSgE+oufb@(}``xg^_8F)FSMDz*xL>FlduQ<)W5Qfv1sFwR4z1b% z7Ia^q0nHSSo9pZX!u@?4PDKn#f)H@+@?V#^iv3NKhQed67EvgX$$Ra~h6nN>Q#F%~Jn0q0)AJcI0k7klkxzcs>&#{*G*UUwyXf z8s zE@o4dD0t-qa4RVj(3B2I{^zdrc_*nu-WaXJ3NSC}Ivm5W33R#yG~`<2W25B5w)_!|uL!Av z0BR*4CY;V;NKmb>!?KO!8a9-+|2#(-XQsSy|Y%VSd;C_+Q7{@;t<>RhKT`>|Eg3I%=A7Uu0CWki!e$ddS;QLH(g}v4FI~WxhZyhZ^<80XAp!p;AikY z=;bvrzsRR2blDU|1p+;mHVb@?O@`ukl)h{Fa$#nZOa#Y3v0asxcWi%A_boQ>N&>E!8k(^I zBD8!;5pl~@G<9qK#=j5)Qa)N>UiRix9FKfe8AIk7Z!k4EY#7ux`Y)yq{56~#TFKx^ z+}jiPOVyMM4>=!=bLK(NcBaGv{HO<)>vODQ_6r}u_1wQcm7G#6Ph280ecL~tq&c}w z{;r1~-#YXN%mtuij!>5AFs++Z04f;y5FI3~B6bep^$WB#=LYg4MHhXZT5wN8L7T2@wN&C1x$lSiGU7sT0CvG2Dkh(VZ8PL!cIBtsN2BQoso4S^wVQ)0D z)H{k!MqIt;k~e0-naVN}OoP|xGrp&6&6Vyo2>RO~m)PY(Q#DprqFNKL4Wdy1t9Jkg zl{O$b56QO_DZZyp(}p5)DNl@|#uM7Zw7>&}8=vzgg_Cpi6O=N2;Lz`p=1Q!&Jf_4- zRl7|&pg48aCTLO0%hq6Jsl9Hr)D~7Kw?-eED-U0o__M6)?;8;fo;wig@5TI7^k15q zDQFh^(^UA8-*S9ZLnlNBKUYjX?CH&ie@QfW@Pq%6T-?9l%guD10*4}3X^K^^9PDWfeDybH|R+nmxd>fHROm&US zIHklqb@$=LABVu~NJ7e` zw}NM*HFN|)>r>UoM#|FaHc1A-$A-h8N$>88GjB){E8_0v({Cw`%&p<3b1t4~*(|D# zkW?h3h7XsBrwg>8Nded_LyCemY;$cL7c8p6i&?jA)4JRC>o;onEnRStT)Mqsqtaq= zs)&tM`>yoeJ-8<#-VJv*$5z$X2Hv==9qJz*M_rhb^ppfg7A~->IoeblW&<#&O}!>> zk*xc$%#2BUwOv3aCtgf3bSHW!Dy3KN6DeO{i)TfKO|c|v>)@Q!bIIjIK{5k8vgUgW`5;!$F;_Cw8yz z^2@P*Hj5!a$OSja**kwC-88s%_!r2L03c^ZTa#EG!mBvyGU2FJm>TM{HyjTbK!rC~ zok9YH@tup5ZNYw*jgNV1@5L(FT{RZ;Q&)1ZLgM_BvJz`FD_0%K+FqYXVAI`QKsvLb z*!!e#eBl!Ezs`e|%%s`F-JcVwb5_sGUtZrg^V5dPl_ve?z698nC%5B^j%x<=u_!yu zEX9IG0#TA`7(vX5*%?-Ep--IC!xT?9MwA;WY=!DRBhs4)%RcQ zd%0A?=%M*8JE>BEwa!;J{Dopc65wL$Ybvg?8!ujS9TV}|PO=-cMB?*4R~Dw0_}u3p z#DPAZ>pZ3oDv$#(ZybPl5a_{iTXw?u{m_jZp+P0_qH5IZJ1Cxq-{mwv#x~fGmFT@W zE+=RvZi%J!o_+E;_V1UMmBl^T)>BuXfV3vK($pn^kZ$c<(DGW2!SyCm;N}%^{Ih9| zv&T|mWgU0NPU0<|wN1HB*_6@NknU8W&6K_0x>>eftI2T{_BZ8!kaI6?#8)pGTiYD# z_C$SHbxC<_OkYR@T${UNejmDLr~(^wS38UOz@OfnIew*n&d3xwK+gx{E@w4)08G(X z=JW#~)k4S_09=)kuB6*I^D0rvCRfFErVD^XW#s->m2)D45Y<{+8h0?o*}@rVx^Kf_ zKp(A+=cyC|suS{m1rsjfO>x>W6Hb7Divwp69v3+V=}8L&GpDNOueoSZvmJq^m)NDr z=!^AhX0~4G%L#7pA9I2S4}0qw+%GqW<9VUsbHg^i!S{SfVJiQ10mu^AyZe$OhPQ%0 z4-h=E+?O8#xR_J6kBq4JX7xfGj1><2MOB@h^tazse(ZLMA93^fGuJNUU5g-T+cAX) z3~Q~@-F467xYv2~FH>aU$kBsIQ1{cQb--gP*f#-iLvkfgY{|s^bj6>GNIAB*gAsr98Jb7j)Sb6uCB?0ZK4%HWbvT$p59n`CZ^3fPA8r(RsTx z9Bbe+S;VBg8Ho z*5qk!@kOS#1QKY?vz(Bxb&~kvXOhP)&bP@UMsdLLuyY*k%fFBd0&QB|5^D}}-W1jv z^$0cBYDr`jRK9>un*UrIavYE@|9=wH)m2m+FyGEiIu;|Y#*(y!g`GH&Fy$Cq`_hx7 zId}$iW5a=GgfB>L7o(7BcLGG*sT8Qx1hYCBcR_B6;6BC`b7knUM@J5>Vrq!IzIA(u z1Y3f&@5~<9vjk*W@F7KV9 z%fV>zevyC9B}q1TEtISAw&@AEk$&5J)3F*DG&MR7Ji%@OB0tG-{KWmK3!tLW1E9#3 z?%cWGi*VPPEsKB}EqRa`T!)x{>UvtA5|TZ%!uUJcy}%V}-b+Zan@_YVp#-rs71IxL ze%7qj;BC+#g~o0^x7hmbYS((H&{TCdf6lLji@w2|@_ZZMR^xmu7l^cp(LD}Yjr;~Q z*T~^F5f#_i?k}W%Xj(b4_%{(j(Y%QQw7J%vO7k z8o=KSugRVH#PD;z75p$%8CuV-cIGv9sc?v%{z`$E-vy*Su0RuM&e1Zn`xm-9HX#WR}trH4Ev-hAi<5Nzq_ce0S@(l}EDSxM6E8NSI_-P+6gOulO!pIvmruB8i8H z0h4bYD#@+;foVw2y;pQirjf`Isyr!VDfi~9(mh?HL3?u^h+NR)*fr^OmtNnUes#VI zZ>Ze1AwXUD%106k2-Xs^po-ZC@pBQq?7PaP9)AJsy$H+H#fF4gYV0 zI*uECp+r%{Etwpb}?Tu%aih8%sYYV5yci7~f*X9VyC95cGjJhc`X%S8m)& zyG6X1IM*XSK|VUb`r;aukdB<9+|K1W$TJl(Dg}7C=4o<5^)-FPQWb0*F1s}TZ4F5j zriI0<+#581By4TqJQQ)_m=4gG8=^kSWt{oyx&zk#1(V75;w0t>-dYnKHRqT9{G|-i zI*b`$VOE2y!&`URpudPIIQ5y>8r4}z2NAAKYSy;AX7RZM{LRT?`dw8O0C#raH)CRh zpM)bA{DN=gco`8YoYpZ5y9;iiB*~LT{8~diKEjhMWX3u15vGr(G(prmOGSri_eKz~ zWMbB*o3#-w5Q*VP)54@yQ*N7tUiP}_T<5z1DoZ-}zV@@UoMX;90O}wjhC%sS?3oy0 zv)zbNwn4J10|!n`W`hzu^!2>+SSHcc>hpz7TDSXLwH?8z!lce3Y&YqxW(L9(KH*3( z4}~g1KUVix1!#A!qSwyJFB)qL0j1Qyy7=uerGEL1q-m^4ff*z5zx!XfC_cgCUn0-t z$d}@;`OZ($1u}GIe$L5SSW-k|i;;r!Q>}wz5?|I`J%&-QsIs9YZ!A+so-K4~Og~l@ z@oCl=cfvw34H@DuuaOKRbVj5bFGy^MSpI^%PNNAN=L=B{<)=CA)_76QmeOh%V-Nd1 zT`JtNUp5Ts2TBBRn=HABf0QYb)wyo+uDY@|;zpVC($9~z`7KujPgD}A`1haFIQCy$ z#c>c5q3h<9yLIV~l`D~d{;74Dy&TZ^93h0R9pSaAH2!{!T{1>$JYIF4A3k$KHAE*` zV$1!krN$SUqm|1sMTu*7N_lS%64G933!*o?eYoI7hqW!}+DLtoS3*Wdx+f3;M$Gnq zgwB$goMXP=r5n`|GqxP{Qt>zb1w(Tt)WiD@Rrtiq^}anjcSpXF+d1g}9Zy`Rq87@( zcoz-@^nvtWF{PiA@=w4ser_>g0+p%87{p4!V2(f+5)U6b9ngep!zWF^d@xqWS#Zdg zZQ#lrW`aC>$~#pb?69Lo&#kRa2YffV%=HEE4l1<>a3d(&uHxxloEYp6;+9AFvSO|y z^F0E9OKI1K4?-UQ_u87>gBU8%gSz|!>YWxc_)WDI5<1J(bBkuc8(iQ&Ab;pXKU~xE zJWXj8oDbR$$jo`8ea10n!mjX@_r2@TCoV&{cPWp}1)UVj3y$6UuhVE3UiHCpo&Niu z+Erq$|LDkmC-lj?yfegTcFJC*NSnOWa~~qk6aI=qncb@zPT5aAQ9n{sTs>;-zO-lL zt{nx_BgJl!(FfBwhpdk_PTLt#q5&ztetr6O7RNo|_~~1V9>#I=87;BuT<1F^e?>@@ zlt@xJH13ua5d>Yv*5#<=sqjrP?t!VB#yx5+rpqIt72WQcGF^T=tdc@*j;--{L_+=+ zUhlm7!p0I?oX^et1U&Ry`uM_>@HDCufeydR=J&4Sk>gXzS5H$D-0HdC_YqRQ8ROW!=i>D>`l9PH# zYc5J2FPXe{N8(Disd7Ow?Ws2Z4^?{%f@$$MYlZaL0e+GH4<>|5uf5=?gCgALbFDCl zw@PO%)1M`Mth3I?nZY-$+ym^(vi^Em2)FH`_H^O!SmKS# z{;eM$D@=>79i*&0xw&xewDoP7tb3%7Enn6D^;zHgIfPg8QH*?Z)38dfEuoD$a@iTm zSofKxe{qD)8_3*|$;2P85Y&e0$nItND@C0Qyeeq0Qzs7qmLTu$>LT31?@JdFV3wdC z;qfz%P<`aciiywl0>7nz{o}#3z|h~G7~u5nO(=Ha>%S1;^j{&x<%^N;;rB>iTOsRT z9&3$cMw??-k#{dIqL-XqXX9$Np2bC|*#=Ok_|_p5Pi9{GgD`-srEeJ7{lwliAYF4* z_RgApVX|n2qZOEV%d_{7v%Cc&3>!Cz8kM5AACcJWw%W}^23MbP`{)TsX`HiwSNcO1 zt>UQR93MFpalp!G|1RIPPRedk)pMp0N2>siM!4Z5YIteKw`lE;vr;nWo-_gcXQ4D6 zY|8EVxAs@VG8j-En}QH4iJTGwR2PMug`W4n>fwz{UmH8Ff+1f=8W9TeSKj8Dzp>_^rS;FIw;9`K36kmg=G{6i3FM+PguPj&Of2cIP)Jl~#|a3=7b>oZ zbFJNqV!+=VOzPHw%Y!>`y^*CsT~$Rz3$YC0r0E{6JDvUIiDl_XMIz?V#K700mAt)t zuruUlWtDZx;P-H_JWBc}HM&ZEAFXCGuA*v~n8@X%R1&4IV7*1OdPx_hze~pb542a` zihwO_?^eC}kHoo9E@*PFlcc&)Pc;VCF z6;!Kx4jfIKMjp7go_KEKEewMGiJL6qr~&iZO4RTizyBWt++U{xbXDxdL?|~Q)1ONM z2#%WihN@_v?J%{7d0B=*kS1RG4ODX~JVYxS;i$88>@Q5NTuHV5gxq zMHvA+nwfU1|NV`T&f@%TdC>^iy+xgT==I^kiohICc z#d_g}&c&s4uFstSkxf;e)VBkaq=3$pew*S^5G*a8zB$5{jyYUaTGU5Wc;mPphMNEl zN_ijWLDY*E=dkfJZQd`6(F@z}f7GOOzWE*b1;B-K^1jG>KRH8tG5P$nP@GJ4ZNLpf z+I)P%^?gg*+}JfhY59ybN#sDQLG3)HUwkCl1$KaW0JydKES=Pmfjh;=L}@oOb|Dq` zsT!6ABmr5{rd#(qFY%U&p!2A5Ggv-$)gb5>tC_=Mk8Hqxzg^d5?|!tp+X%DrPXx28 zkxJNzG^2n#zuSj>PS|4(S)9sq<*FQ_MuJdI>ZG2vEEa$le^40d1W06RXYE6qA3eY@ zq=a)#6$==oVCoI%4j@Fd9RYS%4UscT?mXHF##t>#E37EAZPEB@iPl$`${`1vg zfk249xS{ID1v`cy;W0TF4wa4sh#VFySDV*bOjr?9J25=O%3lbroK)(pMR{^_0$_GL zFfF{ti4k=2ZoHihC9r3mlX1+~=los0@zH(@Bxi?F(A<`prARY<)_=4V^ zHRA?o4G+i4ObjrV%K>7>f)}30HY|%4jFd05&CRvd(6u`U<*wzkxiUqI`pzQs?Yapb zxBL3$NxXL$5BwJ>@2kPD<#Nt^BP_$ED1A_}m8;on)7O2Q6OWIJr$if(0)IePLTpz6 zINS|pkA(e%k|lNWJ_qw6J{!xhiM9R&=%LVfN9LF**`1#hAs4m{$x zk9H>REa?ELMQ))@b+o&ig4@>5HRJx#8S>Sb59)f#(uzd z-P;rMl$4iaNpGJmvg51>nt%-qq-$EK(+2hte=n!W&*qpKu&dQ+FA_!QC3ne7=^#_- z`uS>McLZe)=2Ms=5(FIeZ0d@5K+V;{l#*3En_U%#&YcoueI^x&&o3<<1++_u4V7PD zR2AR##5;7!niD!BL}D$k%jEmq5h?e@?I5O)iP+(xQ}tTjgRS6G!FnEpDNDfOTb|#4 z+_Sd&ES~rsrwHN4uu3k4dN1IYLE9yXbU7nGqJ=Pdhwn?SQ-@lp*DikgX9EYJ@1r#U z`Qe?Y+wwOjvG}MJ+ZleJm_S<30{*oh2v}G$pp`)T?!4)1KiN1^xHu^{?;U&u^T+gV~>GR%+5Jn!qwcu7nfJ`iId&hR1Ge#wb>wo#*}? zc$vXSX{r*?80cYAq-vrQyUz8yeOA1dYLrE3glyX3T@jM8^k(@ynYr{fy&0ywE zJ~N+}v78V^Xsv{}Ipt16@Xv4WB4!=AKEPUp>`QnEf1txpIiGs$bo>(NM$n2!zLO+Z zlh8}qT2G(2N|{pU=da6N%G9I*?;S2j;~y?jfRTJ8UPAA(GH{8mh&G^+kuw@C%- z0;wMHdb`=0Ln4VkaC^7LI||d)Igp)jMK3t=v=vt1GV?^lefp#zS1?w3?)*UTRKk(@FJ`p|XDkHQeV+ zRCacokmKpY-?y%JKJlZBJDC&&z9MWj%d5Q#Epxg!&{|3>xjxaDAROatndVg-p7zf- z?x)WbmOJzo6fSMEk7`YsZh==9YpgFMznk}&$4 zplfU%vdBhgxGMdF3dfb-OC5u9fr4Po5y$YuyNJIoOL`+b%;&1V@`&0zqc!rc0PhWN z`aZa8hn>PZDtM%Qo_t>I2_TsgI%g&@N=(jSjXFxCWO(JJ4y z`C-$BZO$WqR9nqol}e{G6Vy01z($KD0i8YlSRq)Ld^7W_1=t4v$E_pDK5FyR-&=&% zIT1L3?pdtPmA_i1S_3X`*QyNW24huJL*z%8D{4=9v~avSa{%lnBj>efWO@9wrH~ON zk4B)o2z9^zIYg4zG^3Q>U{YacZ;5m;6dhj5u4@Qc8k#*9dPX_~+}33>G=y@K&U;sS+m2-ceqRz0$L|mP(l7;Y z3Dthca{wG_Zf&h?xa~l_6ArpMtY#bD4Wb!5%}(?Z-%~D29*6`eGInKR#6a82_`>83$B6W->ee4!o$0ix?YsqUQF9dQjW8Af04CuQR=-kzcyPG1`AqY;{M z(JKv$3X0^ogP9t=6eNp)U^ly$QRH82l34YtA;OyyK=lXjo!#$9N~LQE7{*@Po@!Wl z0y5Ay18!se=?h%Mym>^%)Pb-BhW#YuPMxS?7+e~_3yN{rur=PLLSz%AWO`pFL&Wo` zw7Aj?NpN%^UZ%HzherUuzDBlk^Mg{Diiaw#f~U;Zzm%Nv_?|v8j>Br5&m1 zC$_~gFO0Jsvk>n>%-tXz)}xM{CsKc}JMiSswqi`Oygg4=)|Rqq!MU^4!RTq2wuA(6 z^62@lEhJhMGw~8SIV~a|dcEHAA;(`+_0gTZMqE|e*3Q!9Jn!3CK^hZ1E{bP!?aK2} zDDw8U43`7v=qz!8>tgMinO^4*a>HX`XNB_JQTVwKka7^~+#^w0wD`APRYlKeJ!+;8 zo1mYW&2FlO*_Q|rerJLqaf*DQ0(QMdjkjwT>X6aDnF}q z+rct()}BhV55Apq3jnw`G3S9r&{GL zAn$8bQH0xVB&y3KoEppdMp#lXVavyPQtbGWh6DMU=`-hoK2vL_Wt;{h>(}46USryd zqw`oRTcQO|-=4JEfPDmU6rfphSd>M}+zO#bBYDq8GJE*VVSUISR;WJvpY7LI1=M}c zx;*RPsg38|lYIgN3uh{bv)I2&&S{g*63?Au8bzZ?r+$5kduKsNCWo6C@LY3oK8CnH zv1ZDuSNgua8q2uis__9SGczJ%-JcjN}+_0ksy8=KPWELd_%gzX^FYBc9= zIHrbFgj6C<*Eh^Z%bhk5*~;GDZGaVxo|G6tWSp|K_LRoPh!avr!fmAhD^SRg=u8L{ zxxi|+&=BPS?+Zr6Puat>P4;T7~;BiZJlcbFmf?kOCwrmAU!ll;Ulx-LqN1F7Sh z=y5?cuViF`kz0C`{K<$DhuaRB0gt*Nw8nR(`0xn02aPllCqquRMUQ+l1dIz)vl4r# zgN!9>`|=oONTcwQW`sGdY;E@Lyg#H@xpt~Z3F`@688(=7i&D6pWlhX8yL*Wg@juY8 zA<j2q=|Hot3mIARLrxqB)zryYa`p%L^*p2Vjiq zruq#NE3LAkoUad_F5%4K60lp~#Mf3MhP=#~^nI6?{0SS+p2S_^C274)*o<@cy1=zy z9ho#Oe%8z3bYLGRL80!!M0XVZ&?Z?Pujk`(PF4hOO$@Ez7&u_FwZZ95zwI9DaKO{(1*OIB=g8-o-3kufB3DOu>yGbr+WxDSdYVL)jFwK_JmnbD z1x=`7*EINS4(4 zEn43tQ<6!V-C8D^ruS=B%TVhXdwcBqQ0b$raqGn|{+!`LP!nJE7XFnIO!tVxIPI8skU;UtwJQ4QjpBh0w4$v2@1|$2i9>cAaZ% zA^NGiS`ra33qQ*$?1!uMutQC$+R zVS-6kkm41u=TZRa(K?ZpYv_8}UK2O4J%oJKlXi7v*zoAtTR~*t-Zz6uQ?a~_kJa~z zDh)IbBng$#q3FXkx|~Zv|5~{fhhv{f*Po;7MN{9@{cXGh2x*p8*=hlt5!H|N_-y#Tq>MJ*hVnByV1wIM+IHNGQLu)P5d5d6a12@Zg z`$*=QxugtVx%77Y+n)^MEa6?cEt`XPi#N6_jE!gvg{ z$0}7xt6;ZMtFpRnX9PxRY>N&vjCX6rT!$svvYrPYBX2XO#T_#JhT~`j`XGVcC15pt zbMQhfW6guerPYrHO0o}0zWJXQbRVs~%LCgU{k9Y4#mM}_)W!>_C#m?_JTNK4?OX4{ z8@8RM^ZYXgmg+Cgazola{NJ$A-IHZ(AP>@zaGQ|&(fiYpk{?F|0-eYIA`21 z-XHNhjA}+wOMH@pmY$`y@fPZ~jJ1%=j(DrE8M_6rHK!;-zBHp=1_~&feIwc3tite> zQh`@e#v+eCsF(ftxEMYY0=$mSY2dDmVB;4X26{58N7qQJCc~McpGFIvV>V+^UKSDP zYs@tV{*XAaf=cpUSkdnq&LZVn_W5*IV%Ge@B!oX{)~zjCaykY5Tl`#`zDUs%2stDd zOo6y^=$Q(^K>bfB*^y2G#}{H1r7`H*$%j@(OYRhHE(l>W(w0IHn|_X|6FKvFF}1~O zLNlOblEifz#KhDj&;FSIA=Iq!H1~%S!g(^q>8_&8V+bKfH15Xk9wWHT78zlX!C}Ci z;PNgjGeE4nZUiRL%q;7%K{|^naQac-&Y6K%PxMM-u>_pH1kHe*af&~_4RdW!{2UVe zUC_qGC1Q&~-sqQ(EOFr07d0+*l{5uXrhlDD^7{gbU+lPwzVu9`zFcE4ZVtuK-OEy5 zDp_1V4Av+1h@2MGniX1eeBpB$Gywy?j5L8lA%{Lnt&9s2|42%~yG=5Cp(ZIjv!_rC zK(oPUhN5R?gz)gWYqJEq($_89<%Km>wcStfv zy8*%rEX7*nEdn@c`PftT;~@Vu-q?lfhdNFHxm<=euiifoxgb4^FC_`X(&3I;<)nih zu=Y0fy7I3fZ~RJY5~W}vep0z!X2H>9BJQEJ_~_^=Prc*9F}p5!oF=d~o3x6|0h>xuZ|8@E_urUA84Vo_$NMK4pY zl=qknRNglyb|WO|SqYI;7E1WTe?QDV0ot?Mvpz$Zix|Z}osDgG)kU(4e#3msuK~sG zAQ}NzrS$!W4HjJc(mq)|ue=r;{3So%e8lrNKCfckHVoBw!|*A)q=rH!?Gqo>+BNbH zP|x@R$54_&M%P0)EIM+ng``(uX2NarRs=C+*M!xkQTs=|yzVTc1ZmaJ!;LN}o^}1z z5#E7;n{b(SuYlB#pbcvLdjZ;9_BMtyT36Bjj(oP_6s6;IG(xbQn{f3R@b2!*9%IT5 zSv8%$B4XIq4=vr!XjdXJndK(lg~F#)=groJ6g}&z*qBvU~}T;UX7<_ zQ{)rbEPETGI2rzpkQ3>H$H<=XeQa8gV#__sG~&&K>2C?fkVb1JdAUpkZF*4TLLJ(L z7EE2h2QfWUB#l%pPaU~N%-~o|Kb$DqMNA3^e0BU7pP>@Tzw|@k1gBBLI%Q10Lmw`8 z#%DUvCcyL%&VMZCvXprVnu^};I7_t!p?mHR&B0q|5MuR-|HX<(r0TcQ*4LiWsOY{Lud3CSBQ;Eqq^ zlD;ZPrMOylxLj!~Jp(@~ICrw`c~J2kw=Ws()S^!d)W1iM&zQeU1i*A?_WoNW64j-6 z%J#r5SRv5jQF%f>%1n;EbxX(mQl&c=I;?Ag?YQs>FwRUoSyD}m=FnnxRhhmHT=+S+ zQ*)*BnIZq*#p;Jw1OBTGM+jYv6S?MoCZFV$H8vdlx$hpw3H9w8KB!05vLOLKTb#dnI$P>wh z)*lA*i{D1l45u#THAVqBP;$;PbTQl0Yj0vOiw{Sz1umSn3L zSCaL?KJJi7o1Y3966g z!&`8nRI+g3y{d$b95K&x(n0(aX`33EQT5`5*RL1ssnmXjiz4Kk*``ikhQ(gzwJi;ITyTlXg(BhN#$lsON3>N_A8 zekXCxh{g;vz2lu1RV{{wyAD9sLG&}EL$8?KXi3fs1TA$`)xwfbLGT)yae9~Hu~ zYt^mbniH!xrGG*Po$h@e3voZ%=nR#y30bAmV*8b1mgnUHJNWQV9{dl~^3)B3Y>GH2 zXfXhn_r3$*TwSLl@`kpFbNlb@f{gB1P~SF#@brm`?;a;p=SeOrzu$fJs)vi;x4sft zQEX6%aM!uMQF%uph(3LIMaf&0UJj}bcq4Qq~UI9kx~*31Ibx5F~800ePN$AF#i#f8NdSi$){Zupsy@UftHQPdq`Fo= z-Y66||ACXeLkd}`SM(-gA-LqHx#5OK#s!&|zbRj-`gj|TxUTr4sXTS^_NswH< z>MM6Nq!ENOn3TEfses{lx6W^@(jpVT=AXL!brbIGD=ahnSgd^tpENy-At2FXf3emcTjuH@jINU2j(j z*hVgpfLV6!Jy{jdhIFt3_jdORe%*amzUe*{2x9aBP(tfiC({?I=`wCX#@qFzTY z-UVPy^Fiz8VC>(&&a*`F~K<@f{0m^F-2w9k*~?X>JU2icE4G*c@du z7*{hBnd(do13uWdNH$M|0;x`NC<#6Wq92b&$fRXd$v=Eh>tbK%F<0K4VGj9~7_)m+ zz!+u90WS0!+i~1ZGndv~Kh`Y%Cxg5A52xhKsxHB8zJ%g`!Mc8qOO^d=n=y>a4;Z6e z1|Q!RQ@03sy!@smCGjK(gFTg^F8E#@buwX32Qc-bFCCOLt~#WDwEo)z6sPTx@=@2C zPgiwVN8bS6M!JEyiB8ZKH3{2}^VzBW--!oPD68G@5O~VAFurYT|4q31vu8KUzzuc_ z9y-UDfg%3m)S^F2Ot*E@^6H``IecsVrO4xE8hKNBk}%uscchx3`Ix-cwG#78>E3|S zNK;#GsfrSc63WDtaC#5c@pb!_+LVqY;$=H!wH6H_ zFi@cqrtF(WIYMd5_AkXv5jr8%a)XuR7W*f{4~)Wtk@7K60PTw-eg~B0ho13onz zS6?!o`=vps-&d+Lx@tW^wYQUTInAG(!QzX6fN@I+KeE~j%jxp<&tCv znhi^^&J9dMGO*NLcW<{lr+C?a6c`ZV+EXOlXiILbD0JR1HpLbK-!M$`r`;OkSnjM{ z>Bnk$L#EALyAW{!kGNOQI~FOIhtSWET<-4WJx$dWRnC9pcO4rnsicc!N%tP?+$OX> zyg9g*am>$)ra9ZfMcZ9*tS3k9Rcd*e)`HXQEFhBylSyFHB3}C0-rY&SqSlzdCQuF5R85JB1v@=ShsL)aEzl z1w})9f?&6{6ZDe_bUR5#8yk85oJfHJ!7wccr?dQ*a{ntA^99PsE*!oXwTS z4Q^Bg`}6rxCoNO+$|Who=cHfadts7#=p1XII3D%v?mYWM*Ph7fW(B5+|DP4I+}iJK z(6&c-=y8YArBe6Yq80Ri1I^m0u|*)6)VtPKGthE0=*=n4+Yl-(LY3sbl5{@fSG*fx zG@}Iyk*L!U*w)lW>jrz>Q!Hfndf$`mxL5Akf@7n2x^wtNC?D$;ygtpvPoL}-SlHeA zSR2qJK$$ao%OQ!BJ8I|8>4*(e^Hx(SMc}VBD|Fd{7sUR|R0o_!1GXs?`d$E-4M#QU z>BxTC*}_@=ikS5!lVk{1bPCPJ#c}v*E{zLnzgv%zm-`{~KpdBx^txVcY57-oPo0!P zY{YP4m{!rz4cuv+c$qIp4ee(G1y`ZSJkNlzfO)&IoEO_vkK*q6swStG4ycSyirGQn zTTzz3+1&5AK$18Al7l2kEFQnjXnS2noXZ>IA-`47_C&~#fHQsXC0*h(#KJFPhUD=V zv3UJrvc+9%#4p9(25gskaDOB6L5z|Bh6eOh?wz)VTUE(9iWfU|!5=y-Grd?F5{0r#K?BpQ-TG^c z-@=KpJ7}1`zm~QcfTs@8$ax)9`@qG_ma01cGcSYxW9tvF)ZLnJ6A{z5%tSNf&IC;G zHz=M?`A1M~>)dogqr{})3WWhq_M}OSIxoX7l755|J{1)0iy1nLw@QqAVDC(4P#w|i z><1y0mT}Ve!x_c=m$$w}y5{7+^C{x?HpIqtDf1?62ru{HS?mi*fNTf^_ND|3DLQ zj}=19*#jS2%Jzco7KnW&S=R?_U<_hOsiJZ;_RnEs1JsB<@}K!jkMw=BrTEAT!=9KR zDa3fajM=r(K6tb1iN?Y5#g#IIH&FW4_Mf~SScVRB`A5BjLkVJpWydBfK;bs$g|D(hu zZew8iIDPoj%V&+S6H^mdxVf$OKSe71vp{BC)J zhM{JF0sHdRR*`Z~TCkU`2<2_>1nh;wI_<3?#|cD*@Bct$|Fz4yTEL+K?`l|Qosk-R zuH}jJ6gYxt_YN;9RPCbSp_!ti3B7;u?4n`7uup^a}s3fz^}tUD^gV z@LpJ8UJ$4etjJ`NO2s}`=3Nm8S~V1m`MvHTq8nh0WBsb(ybJ%~#8F#R#i8{ra@{-! zO;5^Rc2`NibquJ)u`vBh|L-BbeVaCB)#7S?qwio^{JT7oT}~ieb6EzVw`jJNt@GBr zHjcnd4z1u@B0`yX^)6?s^EKpG38yN2;t2!>3M}tY;UGD(u)*yRFKW$zC%Yof;W+t+CbnL5 z7ha1c)p34zpzfdn3rDN4?RtsT^X{hk^Yh=F0))~qLx*{RV?>E5air! zZYOn~!}zgb79CjsKb8jpSTWIEqa7pODo%?UVB39N1}AMINyt?&`}_PJ0Knoh-I(rC zLZJjBCwD6$$V;FFcJ`WOPK%}K8jWDjMbZx1k|}#$0Hi=mG#za)H7TuMxfQRu03>;y zliEUI!4!yXUOy|5V9zbF|GQbC>5`Hejo}t{kREfANZ)dO%=wC&T*{s5GP_G?o8sIW+;MU1CG&)E6Tx?Wj z4ODx%D-8wTD~QBJ4hc~2f)h5KS_t5w4tz7nI#3|v9GF3zUf=hSlcy7No^1mLxfCnu zc)&+PTUxZ2e&)RB9hbe`iUzi?i`oN+ANCfj8uP+N_etZyTDhv@IskrGD2bUsXj8OR zA0z@3{f1T%9mLQ5Nyq_-zHa@3yNXI2C#arIei@nVU8wbE9QQ5GjmElS+7BOdi#n;r z1!sM(CDO*h%FTMI)&8(j|F|i8C+ABWbIr!)x#DD5ZzWWd)Wc52Quk^iF6{e}k4Kf& zcXTPen>zC=%aA**6XBeLwb>Zm;q=fF!LLsPKv(3qDB1_{U{a!|kWQG+1iWSk%)&ZB zbpo~v?F^|g}kVpY5>YC3oA z4zI!P|50@AflTlJA0NY9=QbJUKKIDnXU5zwxek$>ax0f`j3SiHHN==(NONh35JgCe zT!zAOPjcioB63Sg{eGYCpZ+xS`Mlq+*Yo*!oT`+xT0u?5tMMFc%tXq#F4o-l5%So` zl|qz{PELy7bMkuuH3jTVd2>AguKRd22$PNYvqEn>uimoYzd7piAR0^-eZ2Hngk8=e zykymfVl&JojWwv1`y_X8@y@|tUH`L13#g;5iy0ecrr6G9Qam(E061rua_aj;-r5M# zP#qwh7jWX4=%CjAvs$Or+Ry=4_SQyO(tLbH@{bA6tfn zzx52QEZ`ORhD_Ar@gW0^HqEGfdNp3yi&D@#yqg)&XzFiL2s#v(M}MBLUz*OCj_O^m zT8qr9fqj#XE?U_~{(gl0%JG>3U(0zK_Z*YnMZUuy$KBS0xVb}c>{T@IR{;1A=Zgsz z8!D6hZjxK>Ay&sZh@V)=ISC>-mvJ|$pHOkRN(fli57*#rPtmSvWI2^#y zcjoyU-7MdmceK9`es*m34Q(J9hnL-O?9oakb`R(vN5(0n*yR$U!$L-e(i-Ame8oMC zOJW?a;?1^o;M&okI3s)4pE4@SBV-Nce-$;pW;-M#^62Aahe1s-aJ--{xas?S3vg^9 zaRA1d1;^h))vqDr-+noNl<#5Q6qR~QY2S2-7ro9eLz0%ZGdFkIc^Ok7A%Br&3^RSm zYQ_;woyKqp*wBc#`zl5;f{`MT5wAOduYhk60vL`hMSqWer^43Ot~$&_}X`D z4tOhbLb+(ix%3}Wq8mlMnEWS4u4&NK-#w$(XqoH+iprA0s+NViC|VI_n=A5&7!dgA zZ-H_){{`tgT_ALo8Kh6(bz0s9<%|xaXu4BeO-7KJ77?_yX(lAmOnn$-A0`BHV~qm< zfu#z9S)hgXin>st&Z|BqxBS~IN9Bd)y$&doIb-=(X;(bWa&5%MLL}6R`ok}1f(|8B zb49#XAmMk|G2Uq-*(w{cV-7)ColRzT&5#!+g$_M+>-!wo>n?LzR`CLHe_=3er0M5b z;Dw?}9DO2?!3h6y_wt)Y-s@H&Wh~(usE&ab;WxJ8hv? zR91z{+%7BM53=#kA`z*rW!8~_?np9W%fgN*r$**5Zne#O*x#eGtT;e-HOI*~Tde@l zwx+qIC`W~E3%(xdR4wEHQ$`bjC*ea~r25X<0w)5`>l#Z|L7|cI?jQ;PqP?c$VSi^g zT$#wf4B!o)dfo5JH|59Ev1S zFV)o)BY8XFzb4G`#NX&kcDZ|>Nh-_Z_YwwJ*uM@ko$zdVf~wC97Mk>k&BkeE|6~?8 z-FtoZCvsCXN9TO80%j_468naGMjQRr;^d9<-JA!K1JQ4-dD{(s|I|zffA}P5=&j9q z)5@^w!teN5H)Pb9zO``uyx!Y>A4=vT?^;`q!Bki#v-|=`zBr3^QD|*4>@VSE%EY@BiJCI#bk1|dj+jGYacO|6iJa>00 z7fXo3s#NO-p=+NTOf*$F;*)3RTi3K6bZ&?%B!+eUCVDwuP*tLB&V14%_w6^u+EhzC z)DaX^X5)Tq|DXSdR*7rr|4QGg>!lL`UO?37Ly8C1wbvN&!22Z`PMrF)m!CBQy`Y~G zKHhahQVPpGdRArw#7oGc9wo;Z{u{>EaCo$d%a=^Lg;mi5%_Ts9UDB~&q7k$Nh)OsQ z`>iJF->7kO@!{)>scj7K3OEb$;fQS%e#d)xDI--0qv6E}K_uCY{ zIj>`7&SgYYuq>HK*_;Oe@kX``aR<+~$J@EuWod1XQb<@X9?@ z7M?#27vc3UK&?jbdj*5u#5x*IyDb!uzFcL$j)j9QThyF|*snc2%2uhO zLa2l9GrP_i(QBIYYDKP$Eb7CMegln&V0D~5F#rfLIre29joZ80NQjTl#ppa>i6b6u z*hI_Hb38QSDEgh}`Cq4BwzQR=+cJU43H5HU^CVmqrU@ zb};Ldbmco5Y9+?)SSr8LsIlPFkll*3@3G&2P6a3eJu1WNpEx`JkQBU{D&Ik4wVjl< z<9-Hz)W#whYhchQV401Da$u&8&T>Rvv^LOre-HUX=P7}vrV;1NSRIOpWrCvXkomcw zZ>2P2U%Q>LJ18$^xC(zT*! zg~&TmZWN<-_>lEy1Msh#H1`H%auylG7)B^y9s!m{f)(AKBDTEB3emQVTrNmt8N;cS*vnB74-JO6Sf{U6A6 z^RoN67`7AUZU4|3bhx9UZP{Y@rE~m5SK>_Z zQp%l>%a1zjVppUJ(*5-)!y;7y(92!%QMQjPdWp9H`T&hWUqAW9{N)~+G@l*b6_R2k zMg6#i_jX?Mf&T5@)F)7=rbqzV$P0^_`?a3-{s+RNW9bHMj#@=}#c{a)AX---ZI%3) zVCThlx4gIzLT=9b3e1sAW*OWkhH>ni~0~x^Q(c8v_Y&I_YOD5Iq>TI9M9Y)jn&qbzuq#M-==0-{W zhzYqR=c8{kby_>RrU)r^MYU`Y6Y@zq)x%WJ=(|=d09MYp$EsyWvFRf542KiwUo3lN zk%J7>D68KWrz`s*lL~U!3SKFG1kv^C3+<=P>(xRkY=6y4eTu5IRs)+b@$Os{5xViA zo}3;U^JZLU0>qOWKM}{hnrO4i%h0+CF*xjf?4Kd)P5GAT(LCR=Um@91D;n94pvGm2 zmAl*?iv^&xgxl}Q98O*~wU1xj+;k%76Oux+@_YYYe5|@^dD7bmv;QQ)B&K4Bz%75i zH&XPav#E5Uu0-mP)G@NYJXE|1j~MnZCjt**g5*0M)l^J6^JFTrR8fD-Ti|cEYNxH5 z?#MZw!zZf>&k81sWZiyGBLh_g{vEU3boWv27=O>f5t0FK&?a}(6q2$(#vM!66`dD9 z7{p0`ap`1RE6z{uLAcKo`#Pm?kPhTuzod*5g=fZZMv}sHYM|N_+hm0tFgIHMWP-EG z2YSoExKKS=L2#99IJF>`F@uQ29MxR+TXk9WS;@K(si7iN{&@u=-=yMsi6t6LFgS!o zE-1+B1@q(MZZ-n5y>;fjec&~&pTpvcRimqM!p?T)EC`A4QOrK$wckvK{+fP`ieG6 z4N$%7`QjR}p#N1h0ttCb!m~BXoi6YNN~TY%;HR>qUYeVgPAB5VmVH3{b70)cL)g$h zXx}pB6K1HonVuO?CGKvFzD{LwE=OaH`spbinh~@4(IR*tml6ycmHXXjQl`+=`Q7*pWMuH3} z2gOT_TYh~qr`;SX3Vu~P`r(=hg=XQsc?p}V%tm&8HS$CLDoh=+2GUKHKnNs3sY%+#2+1j7(#dUx?``QJH@{si+C zKFDgv-Zh@Cf>|+RPImFx65=2O?60=yyo%PLma#zRP4tMcta~JY`=M0_o#;gaW zBy;*--YyD8yby60%AN}5-F7<@>sxvat4ad`|>uTL)C z^qz>(PjSqA`+;hzGPuZRe(i&GJ#j<)`sZi$U~hn2<)~-;@#jBF(;v>xx|Dc~5mL6w z;>rh`^9>(KNHxDvrZ?Im)3t$U>Gr@a*tX{_3%vVQa{6AeomcOd57#%sB9rA9LgeDv)?DuFI}rr5^JfM>EBR3a?(N0}(_9fcF- zuQdXcDA_SDXE>{#X9(E%M^&x-j-6IEP#>6yX*;#vd^!;HJ@YHWJANp~DHk*g6A z)*Q)h>Eo9j*lf98@vg2HW)MYkT(?G13n`jgxVt`N(_I|5FdAIO&}p*G$|AFaK8V4Q zH!DoZ0L9Wij?abMCI|EcaXho~k_R{;ZIA&lP9P2Z{dQiYFFL|7&gI1;VV0I;y6$;r z1d4HUY2q0R7bH)mLOfE%lYMFF_?XrMyIDhWZ3QIWV`)8(AA$M10gVJ;>!iW9n30a*dH6MAZjxAkiXg9P)b2OzdP^Fe<5j&VOm_4;!sP9&^DG+Zyp zMWtfLoyL;RT4h=@-3dA>AmEwifBHUZYQ5sDO)-oQ3NiYFeykGwn1MO2@4S>Fh6voN zl=DnAWmZ)k@li_o+d5D$wYFMQju?RL#D-ALrqJ7EsKJT+_sMUnS^Unh z?f)0urWJGbni)+sZla@KGdC`(XUowr^UJH`q)3}l7k$Y$VlFfJs!N_nGW#m(7IH0c zwrJ^*x=MZDEfu;+q0RCrEFpz(u{HFvE445;)qAgts#;=0kc6z*_&XBlAt2Y?nMB!7 zL~B=uTT6SS1tJVcPi4MN?v)pNVxQ>pW116hj!68kbaW#)j2#rXw$iBO+B|~@5dX)t z<=r@XK(7Z*UTjtH0THu1U^}us$uo~RY(9cJM=f&u)#nnV?L1iQL%F20^^kP>1^{o+ zTm-Fr|4|p0N;(w#u}t{~oIJi4@2*a?P!sOcZ+CiI|CYnqx}|yq1wr?0L_mWpxg{#( z+5AhX)u@I}F*+KqQ=I-CC&MWDhl4knQs&Mrr=mpJT&$3gDxqUpM!f_z#l*IpOFJ)d z-dd8j|D(EnK1P)7=4Q?W*}3D%C$Rw}63qz`-66PrzUy0QezZArU$eo0`ItDUYz|Wy z>ph||nv8^4Tz78O&vhhjkr#o$w&{lH4_M|$K|mC|m;~XCIsAL`4k%p!%3m?QVr{Bb z-51Vw?s6f`_L>ge0>0ynUz=^m2>4BMKKX6xe_cZJL z-1Cc}lU8@MMH%2VYac(bCeA_{!EXrM|DIT~uFES;mI0-@=#I$_(vMQxU+6Q z$|Dx9Q+Uj))X5l+qH(W^6f*F0o&aKxigGBeQTuMn=KOF#76wqFX>&*&dVWV>nQO-! z>?=U?7$OKz%YgS=i)T2h=UXN&H%uB}ul5%P%eGa@kxSr5)v}Fu(JSQ7UwO=NXYcS| z>2WV^X?P`|Qb|*WOFF?&p*ES02u#Pq@%~?;&;a4T^FQC9pRWbSDzgllI$o> z5#5rVR43Py^M%%v?R{qi&kIwHEFC>62)IUcX7Oe{O3UshJmZee6{1!YyTNt?P8Xc_<% z`T(!EZD1F9hSbqucDP=rmaZQ-Cw##}ri>}ohRNvSQ%a_G4%hVOf_v%qQ*#bUYve0! zoHWo9#mRT>`i)+(^}=C__Y?hhUKV*HR#Ehs8oang4vgvm1Lkr!)<_!iS9$Ec%Ut}fcl zP^&KF{w-ba7mD`v;pcA{ttPm8)AV!}UPKO-D}Uh34OF5YM&|qVbk22dXj`j5!$nX10- z%+V=Ak|ATxJ6<^yM4;r*byb&PvX@_x2wt*P4v#=m4^=O9JP>U8UiM5Uu*&NN4{U4PU=r-BXNJ3(HwVR82;e6z@Zs1$X7noTRx{W9BL= zxmItChe*iEjtbiXrpAJ8yhYOc@2{3qf#Amk!>4@}tAZBsGX;IMX4^$D^+hMzyxWP4Ia zboA)3+J}`cse&C2xV=Z0tk07HG}3n~WUXS6zouSDBqAwCy~KKn3yKZdXDzee6b7qj zF=o7PtmbFo?E^R#5=(FQj!0<6ZZ1qMBw08Y^OU*HJqt&bI|A=gNuXifksH1{=V~J? z=VuL=$9Qc{oStr)Nz5hQ4ezeYL+29!jZKsT$}?v~4EU5JGu#re0C!vFa`I%GTDFBp zcr;7?CT^9;ZG*{?G=O1Q&qhV|@Y}J=o|ob;Cs|CO;J%ZRwQ!H#SFyQk1i9ZLH5@Q8tLkq%t z4`Nrgyn0KR-=oHehQm)v>E_06VAjg}EpBy2 z6IT^c-H%oHLK3qp06Ucm$(ePD!Petn`pnjhGF|~=iG=rldEI7{p-ptkA#gs*pQw}9 zm!D`2!?4HXCnu8^r?vbtJ2#^BN-%NJ#O2QQ(JwsDo1eA2wBCTPYcYleXK{wI!k$r-+UOHw6V$4e_lzS<$1)1FiY1!5oI`D)NelcAbN(K>g}4!sg&tQXKL z?Jiu@CMVU)h0ZoHl1h*G6Z&pCVMCu#8acZMgm$t&Nh9MXCs3IDskR`7(~Qy zl}J?<7q2D10$#kEG-RI_i9ySf1ZC>`IYy2 z^YCLfj8Yq3vY&3SJIXi51%fll$~GKjD_Mb!ilQ7j(KsOf~z>s{cU^)9MT?=4u|T2I2Gl;@35EP3-Gcs-n~VdK=$c|Ko+6wJFtK& zUJ7R-xM}AFsQS7tTG8-NHd~8H`SSa{Vq>PY1f++|jl&_@c?-4zVEd2y zRg0Fio*$#vg6x3NJ%EoOw|*{t$viGpR@$u-GQY=&9H ze_dE>;vNv*OxPwYWPP|^G@YxVh1zu@`f&*7_X4Turo0RARMDI(TjuFpx!TD`b)oER zPaR9@ams+`i-bgDRr?KCk~@5Ux$y>prS*Xm5$L{Az|=xmwCqi3(*arNN%YY#K&HG} z=Gy^o3~5CM_lO}5@N-_vBF8JI%8qNgzS=pZwZ5{jn|#!T(n`H^_E2ge;C}{{h(V;i z)Cqc4rmpP<3x(fv|B21Px4z`MZcJg{49@IaGHac+fjm+6P>KWBhOjV;EsV~^hp^|eB0OLi1 zLB$=;P5@_>nRqBo{zfN?1Qe`Ypc^r}bt})|?{SP_qMtO2%u6%fXnre^{O9CB0n^^z z)qdUM6Ay=5K$nk9eS1g%PvTK=n$?wHy1!fI3(_NL)DeufZF6)uitX5r~3;gAucB^rMqX$sJ!c+Wj z^MEXKjE}!@N#$J?EhbpEBq;m)8_h=RNL@@bJt-Ik1szaT!y-UdIIwY>k3&}#l{6)z zzzK_*MAJSKd#vd4Sy81yoEhVbTNhL~5s0WoTAro(g4;s$nSVaQ;oofF>&Wkhzn$@N zzWE1#)GUy)%*5GltpI)G;VM4VmYbBHYXH;3Ur-$6!lpWmbiBPQCe755LneomK~HL% z7ax)N9jg*;GZUO42_}WOd4@Y!=Ek_W2SaYyT!Tn(zObSxYOpm?C)TPaVC8T|B}uRk zTA&bN&Vue?F8sRozznIDm2bC}$MR<~AF#I7vD9~cXQ{B^K>s`by~1Cy_r#QG&;#h;p7%dHK_UJEUMZSibxwr{z%8n`N#s=Gep{W*oq4HEHt!|$QOkO2rF|^U z3aheU?~t;OUZxSIVwZe=Y~cobo)OWfd8t{7zGeOe`c=$O##YKRpBj@FOm5~3QhZaFRyazG`t~74Qc))i57Yj%rL4F=AvQ#F&%DJp zn-5^)z1HZJy}B1wau?{31$StF&r0FyjfxDR36MB`be~)D0Nq9kFF4mm=AszU*32|$S-?A zc=LRLLtbhRvlg;f?bDGG6Sk;VrYjYwGcO;M`3V!P4Q>EhgaC{TU1#MvdG%%LgKb)n~dlmL==HjgH_+EuL} zw+XXKZq1jidK)H5_>^f+dB6560XAZjx=IKAb-w_qBx+(}L-j(!2o&wz%a}de&5AsU z?2cRjVtW6&a0Ci>EZ{G;ixWtr%QtFq4YDxXy)3h|!VNA@akT`DnM0L16ahhJH@odZ zhGuLCEubH9^ORuY{}BRdreU}vV>jZ~lU~SgB{P6=5bK%YIn2#U3kgXnO>orK$y7mR zyC#u-ljoCTR}~?N-+ap}*~3`z=cA=q9kszch0(6EO8F+WAUnFQSKwI859+1cry`ph z*IVqE3PEL#kFKWuN5?t@Rr{B`Wnu_$|22Kb!jF!D>NX1p*^zYKTT6$!jEC>_jMjJf z8k{zrM}@WiAxyTz8|HO7oxwmR(n}7xk0l1fGzk;61(gLPKz+-a$I@4g(u%G=zV zLf4tjPo2}8pIkfJTIU}gJ4L<*2Lgj0s3&A04+s1XoS%XL}->1ozV zjfzdUy>AoMu-p>%s8xohx6j39_>{SI6${QYoctqG9i|` zL!+7-{K@5}i5?cl)@o`r66;-yxcufdIw9?Hjz7;<&UEYw}u;z%p%z}A#4uMjgP|V0{NQB zxoe5sw({y1rhCi?<46QI&}pmqYh1vY>-+MLYH#A!X+6G!CpUImd5#UKf4R_s#P^6Y zQ`p3ousTHw!;UM0qgBe*oqCU+MjfId>hB?4lL71Wm0hr*L33ODndVM0K*x@OGO{k6z}He zp1-Mtu8nAZaOalvSndlLb21Z{9#shD|NKDE^`-Ah8B}uqGvMfUqt>@N(&+y{f_0J& zvPP$`G67~ocZ++3IFB$1v-*2IyN58&_Jfv~85x%u%0ayaEB5|}F0G4n?i~c*3EofZ z%lNi6szYozFF6>yYm-DvVbyj^8$u4thu^VM&7k%O5H?M1?hoxw;X4F}IlXU;MUCpp zdS*Pjyi&H38JuiMlz}FcaW@VJ`8vP8iA&!D)oHSj&$aV7k8=j~$YOfSeqevi7p0XQd~2N>f}Wdj4R`f z835Vi#&+K}HuD0gYt|{TSh^3p8nLK~1;yCQWQ_gF;nozb1JEt?j9cN4X7erI&xJA3 zgQ~79p6%{WHduxRcdS%77_|UW)tKa_+4~j!B(XN6??Gr)TS)@7LXZ&WE`v-ue zixCKhx7{m$V7X*|HtL3fwEeW~<@ew)clE8IQ&ro%jwJg%YLH|Gsv{Naz-BNvp~-Tb zqsx3aEOcV$h#Rhs@+4N7VOC%aT4rO<(6>)BNtOpJJ>gY}RX33&YkN1XACg($4c+ge zq~BEYQhlS!i*L}1SEb(O``J7Q_NAV>oiWgtB@D9sQDzm>k1&i%&io+88utTIDi#k& z35S-%9R!=}BlMw#3PSAaMaHj)UeO}-mFrS*AEM50AVbjO-9($*8Sm4+S}z)AA)S@q z=$G@`{tliVtdpHappu{cQ}*AH$}I!{bq1zda!S#>SqWc5dS!89D|rs)A{ihP`V_TI zL7-5^hkE^dNj{as+BNZFscgyk@UF)*md~O<$zWAUl}a(YT- zbxzZv@Ca?o;XEmLlcoxnaH?8XJifDOH6<{oQH_|M1*#Cfkd7S5sdgBdi^}e{Ua@WI zw&_{|$SaChc4L--+Shkekh{!PjmGjXOYXUL+n8t?J+k0Hfbh+006tsFM^l12xZ0KFC0dQREF&F4(w zyNRO0{x5l@TAS>xM3(B0#0-8^7WI%g;&PlCz2;IYet`C0?ak9{v)$#{_M>pCs!Un$ z)x+f^=WQVyoovX?rzC^Ql5Cz?L>^bAI1~he0=8QE8S|0ct%(wgIx#};5Be8VM7ucd ztLi1GzGlyWl{~{=uBLau@060~?`U-nV9) zKMACEF4v{fi{Nx4ptSr#`Dq95!6=))pM{j~Nhb|ImDS$pKGf`^$FAXHgD1j%0PBEJ z4y~QHF+gxk{86A|0V&V8Sn?K4N6{*3BV>twruZjKjDXASCPTW~`v)Y{C}52gp_Tz~~#2UC}F7S`^Z z;5x2bC4NR>c!>DBJH(UTF(ex|m6{$!22i$MX1PoJ;ddJmkIc`rkQ{?O*|F%Vw=EJH z+k|1Dg5vG{=ofG872r>umIvpZ-cI>Ub{+UDmfZj1+;vTo@Ja97jZ8-y2_4A7UmMx3!9m%jZw4 z-`@KhH|vdz9F+>J`?&4*gb}U##NrW|icR@dns!~-&{A!8;Mxb;MYn_5HhGr<&`3Yz zjaLmg2!{?PEosj`KvFg05?~)Kf6Dzw`mDOVeO11Gvf-IIWoWrIS}U(}^Ch+-3nE{G zZn*X?2}8W(8QF!Qj1oqy?fs)(O>8HDoV>qZr$)9+i`W+99F#8mVsb{Leq zL=L?_L0WvP1S$lWq5WC7Q4!3Gh93e6#3$V79~I^WfjY$;`ji)SYNQ4KHRIOZh~~Z2 zK54s$X&<=Q4w-f9i6Bf%CWv5A0h}+Tx*yws=j)F_Y>DkKEC?E5vpQ8MYf`>nQ#c^o z(E~&ALnPxT?JvO2ftDY5h)2Ugmx&9^(!`46<58VnGBUv}^*V*nqr}+5anZxmNYXh8 z@$L&3*tdXuyQ$4(ezv_?oz)a8QAA+b-!>1CRInJh26f_$>a`IAzyc7#oN7f@0c-Q! z0Zop}e_}VyLH?5_UWprKRzQN1rpB5#!l4z73wmcGNS`%oaw5;XJN?1`B*uQB z-UqqL;#27_xL`sbz^`{IrZdu|O}rUwlrn@=FiLLf)_9}MM~P>t?44Wm6}MawTi#nn z0h2Z!GBMz+zwW`piWiUqxKq`vRe9l0?Oxobh_F_caboQk+tj9u`{%RBA4i=~`0TzB zv=p_#J48>!8g4`m3Z?p8HR)G9?^Wa;^&bRXakUx(aO_CtQ-sogE$|))G~4m0nFj}m zr2vpkC9U*)9RK1_#m;tfYq3&1^6p3+ui$_y+qV99dYgh=sPdKBYPGENyf-7cpvx&Y zcO8Osh)rt3|8?^viyF61K$FMqDGN*h83x+0h7S_CsrY=+qOWoL!8*J+J?7R-?p?v` z2Gz;t24z2{T*{87vy&svXtE<+a#%)cFdsfBw(3Ig48j25M;i^t)MBB9U)&Davi$<6 zMH-7I*~u}=f$zx~aLj6A)(ou%HT1j3=LYdq4bAH_%xqaM?3KC9FF#*u<~t-o$XYJm zF+gPZ+}tX6G3PLNkP#eH|bs<@*du8xI=ebel8IM())ul^MgS< zw;X$nczvJ+X(@d9IdLpqIlW)Vs{Ohh00bJeaQl%|tBm-EA4)H7JyCpn5{@Oy=fOzXv@BY}CoAj!K);@hVrFQa3n=oP zgo1n>d;35Tb#6d0Wx78oO?wuSDJ-0wcGet=u8qVia~CBkNzyLVDx4(R4lb>z@-c^4T=>?*ZbxE*53 z=8rY8<4E)WeLAVoBLBJEH#w(~H|Svt*~IV?%;E&J3OHz?s|FxYaE6>`@5-+!ZBv|* z0#VrV{YN>;TIwnOYAvAwh5$q_7gD;}2qYB#yl{|7bVX;7Y%iW)3@n|Ef?fj>jdd~t zdbhA??24E?cBR@Y--%Ugf`~LRBfLyAYATMQCiF6oYqwOe@(d~od)?e1M@(L+a&rs+ z;Su82U_zl@hoFX2_$${q(!E{aQ4}~;UMp9@cnU~rrd+i>PF;t1i0IeO}BR-ju>$YnI644`F)h_nd!mJZ-c>} z>DlNj0EA*9e=bJ49s85HUz0BWq;>B<#H3n5@M_fN0Q+2ia`_c6dt2^WtP@9yI*D-n z`uksZ^#%VpY5Qxf9pQGJODknR8ah)b^4ro%IKY2g-0yTh2pctD*F|1lEhm1jR&@0c z@sloh8q4De3NjDt5VAJ%`F#Ojco%*jKWY^dwQFnN#`5;FM~>I+6+&|!r~?jEm=({c z4V|7oI?dEj&unvWwB7J_xg+;EcV)veU=?#Fnn0PaEh(V;cX2oN z&k&Q%VgCp61a2Cjs|FmTcuoXW)1ban-WI(SLt~A6S9asDf(K(Bq2k>IeVdr|dm@Nq zDMH(gl%5rdG6mc1gDO1a{gdf-w4_xHrU7`bo+JJCpd?ypCXsW;5wP>sw6kdjoW9AH z311oU2Z`6{G|7<4i-8T`Jqf*2+IKW@IVta@l<>afrXI%A-EpPcfgTb52s>cVqVJ2t zUaAeLN<)B?OF4628UDR_&N=g|l?MX#H6-;pM-Q0%XVZeP;0&ar8b!IFpA&Pu&SHWv z1Vm;4O)b)N_!r(xbeFGl1=#GE@%69%Sw!txl;|P&jpAY+cRIOz{CoVx9!cbxVwr8! zud|5=`%m{8npb8;i5$E@cF{B)Z*+}=exaLA0f{7!j!$gzdm=Kay-MI}Z*zi3)Z{FT zqV8Fs?2?Pw4^Gq~o$7xcQ@zBN9uP(k$$Z>ZbT&x)KseEG73iteX!s_hifxEMu^g6}VW!wq`39UgqjJ zkb86UQyX$9$XlSpVDz7Np;>Xz(*t~eiLoP(RH3~5HMW(BI*c%3>C95O-R%M19wqpa z%X`jnt8a85gVjIx*V>UkF6E3s*8jL8l0y+@OJv(+phikJWF`}5CudS1qIf%``wjmVRt1cR8pCG~bDnp7=U7!!5wqpzKUn?Z5AzFvv%fe2&o#u>*$~XL9|8winHNW(Qhnk=n4FIWp-(LtI=>$m>?S97H%q*U=3D{nKI(How8s$7ty z%DfpIg6lybcxQF((&`~GHFM#;3AVs~+e4l*>!{T5Gu||Bqly}71=QR0}gS!8p)lj}sjc^sMT1=p6j zMJ3wA%L87ox1=vu_oQm3s{MWBoyYds#W$GU{0?mW+z{+$l6lWoGX7)5AafmYG@x^h z{teMG?)~@1CpH~DV{gXgWsOUK@>(v)7$!*tnsm_RT9tp(u_*i_nIoSZ& z9mfxe+|KPFr0d-c&0FJN>{cA#vI6&Db(A&H=T?1&kVKc*CwhpzP^XyKdTts5ia8hs zVSod%jH1(1I|&fzN2OY7lMGx5h#hg>^GAO*DU?W*y>=NJgag-DHwATY<;DKJ;mLU% z$g{AX%P$WHb2Rl}k|M0JEoK&c(#jn7M8a6;z*vtB6v-w1xBe_9Q9kP!yP3IsNHhXc z07x^a?a?S}^CRlRppL=zb~}(JKrA@}3m|MQ)`33v{^=NJy2?l-)q>mfD<&nfBApm` zujC!H4ZJo!r@*CmEOzCv@^wn9XW#}sAFtOS8_t5JSA&Wt`q*;zl?9H(Wc>Flx;{d^ zO-5cdKem`(O}L1KTvpwY6-gs6q7+dSK(@iBi@xIoWd?QORCHs)`d>h}S5&zrF-XwfUpsNxPf4HFGZ` z%V2edS^!MDnS1s2XVLtwBtzk!u3WqcqRE4C;$q6t)~uv}@UNz;*NABkI8fD=h|;q< zL-*8JO~-<1HXnu-Al?b?=J36&)nCr)gS>wTxS@H!yVBf6Mm4@-5 zylz6+jyL}|Ed8hFyP+FatY#zjlweO8cyn(y>y9eN!_?0?FGGHDa>*2I+VyCc_Zd|C zw4A%|;nOK_K|TV`n$Nb40E}KpULT3L$yVx19>qFMVWsR>nYVj%G&BK7SeUoj>1R~tgCJM)pW&F}+Gj{#<2R-jra8_~ z=NKTD6GkMxFB38NRCcXu1@Vex`pwMWv9D#)gjpK4aJ#CGzIgi8V*2ilrMR0_^XUWw zwqG$7(F~E}(|4nM>35MWWB5tAFn;C@b3RIv^oV8Yh`>;M>TjP`qOOk=~s63^dj>za@)0NR@~~1u@JsX zj37)i#OoPXbn40*UG_vP#B#&P$_pm?u}*W>3rc$-APVO3bSj|C0SIHRC%kC3mT?ga z*`*cc@M#E7$Z`{QOtk^ScZ~^O$|UA?{69tK{?Fw9|M4*lG3UeBoHl35Vb~n!JaQ&U z-f}7VQy5Dw#vhm8nR5zSs8;*e|$%kH9EBcZ@%oCajZr1d@x0MoH3Gi>zwWlQ_0D-K^ zG;-eQpg;PR#bc+w_4 z**jF-!T@6HrkW$0Ug<)4Zwn<&b4NqKcb)BXKQSDgb=0)M`RV~nb$7^6)b*0XQ#(Q) zizy%7fBE?Fe=y7h`jCwhDkiu-Aayfl?<>r3jPkjW3SWaWG@;0@(A0=p<1Js>F=O1} zoB!H*HG>y_yd+eV)c6p9dFT4+n3Z<0O2LXvykyQ<$lg)p4oY7n)^yKBb}=@dQNb*y zYQ-4-jl)^+=OVtK$*Ka~qNdZ)Pw$<|froyHh?595&k7RR+^@z*B86GeeOCSn8c7e% z!#M0pMo5yqz7%$wQ4%Ly;|XQ=!bLH4G5F$f-C57rdAV1`)H(Ew3cetC96h5d#P4Ps z&rJ=PRzPa!L;GC0p81^xSlDNJ{93(y+Amlc3E~#doE0ZqMmOYT8{8ImZ%<8H{7riG zGPWm*fHJd2#bO$xS2X?uO^D{b{4WH=b!^Jnd>kr|85%E>2qpWO^;!a zvaYY2vEWGNOI46D&)*+bo^!)tArOXUPBPH_w0|BPK8Ozgl*Dm@&75MXvR zyLLgqRyVjVQs?b2d>9TM)F0U?$quHUfQ@L)NRZ>@@DQS8;c~0_iH114!Vyauc#1}k zj^VA!!qi59SnLxoA=)_NU-A#_q_tE`Oy_Bhn}ns}ApL9%LRjrWrcyZd(M--VCJhP@ z2l#V;cKf^ZXoD;!r)$fr&%W;&jtK7KGYoBzMLgW|P8RP(s9Dcr;Ik#eV9Xe^HfNSW zb_5DvVRLzgnWJx5HD%Qu6k4%&$a&`8z(FtPj-tM$V>Ho8m*?G?wSx!jV=lHscLf(( zu~O3AD$@TE4;*;?-piuc7I>!pEwgwNxKD=}tpe0IolKdR8edyqw88vw)}qN}5Atr(LZXX3@iAf&IN& z8BZ8rrW$_CW{#gs*z^vPY+7CxQV zD>~1=Rnz(0s{F3sa<%=!YI2OGAEDKHBSKC9C)^0C?Wd)%T6o51xvddqucMufbVH#- z7TR`p6<=bUo|oa%n}B`s7dK!2NpuL#Y@@@K8kQfT_BHrkMrqIL>@(? zt|*TJX8|7{YFQ|R1yjSA0L<%qb5p(UmL=1Yj>|%T?0C*zSa{|M5&(6WVJ(uXZx{?* z{rk@ygI1%^0p0>&H&XSqtc&~I;+3YH`@0Dd3 z7=JE|`JfeV7`bdub|Zew8XV~6hIn9`;I>Gh3@vc$8`CahjWWT@YZvW&^c+_M=)bc4 zFM5vQ46y$LVOS(_6$L{VLh=c9ivyNFbu5#bG-6q5SFqv$0Ij}#YBA;pRu1UYbA32* zkoyaWGeGDHL}7_cZX%;67!GwKDg-8}lT zdQ6Z{%fTu-t~U=<$ThK(-sv4mU5X#r9CqfDw+1oX)tZ)M2pHi3N!|Y3|FA&cMo5Y3 z6Hd152#^yMq8$p_Yf5OmpHBN0noH|@%t9Pac!W=;;oO^4ML?V^3_Vx4_9l&v zzYYg(vy?v5I0k|1H)hgyc8dFZ;!ChgMAUbyKbQG$#teWPG0cd7J86!9jzE-R{AWjl z>le6z)L2lWXNp};)qJ3$S7DaD?!ohXf-DRs*pweN9uw=j8;r{cpEq!4pOO?VojE>Y1|ZRUsj{ODd{8@I625P0KL$1zg1_#6<`9*do@PP5=&hCs zVmL;prPZfmz3DM#q_~s8Dg!0-6YGEgbkF!}EPk~Dm6?0s9#>gH$VGZQ-PsUE33W<< zNNjkXOGMGZ0mlC(1j9(0upXGucV()cnUsGb=PNaePK|9)uRHEV&uYFg6*pg%RS|3% z+PlY^t9cP5RN$Q5_$ny0k!&utxyiQt_LN!RaUx{;R z<^s2){n>c3=Un&-(}w+={SA! zpYjtdfPulRJMB6wtsj%_Z>|@;s$4*nuXeg*jZGp<6B=TZ9EwM{tTN56hxFRHLjbFo zay;W*Q&g-SFEoBFeRTb#waAHE<>7SCSh!=T`oHAQ&Yy`l-sTtIdd4!4QwiT8!9%KE zdMW5Zs^Qm+jJtCN7S~#}Pl}Xqv!RbmO=i93k~OT~VgP@KD$8GE68wa;61C|(JZtla zo>%7c&vp420|@Nz6mL9Urg_w&t8*392c=|0%7z|oK|oP&gEZYau9h!;tzuYws^ht>Ic=KRp1LefdhOp2|1hBJZ$CjA1#Y<7Ke97LAGt<*#chD-x?m;}{${E+ZQ5rQx%VlaXyJrM~{wW{o z2!}E_W$6kmI*@1$&52qLZE&WD(^JXBw{KX=YKVdDP22N3ruJ-DBOliLZ603-_yc7f zcT*}gN}7$_Z*m(_(w&*9Q&G6xb=kjHK$-pa7w%}oFABqz>bT+_a*+9cMiBt!3k>X@ zDJfjgSZi;x>w`#8x;YkoT8_kSrElB5G)?G1fsP(8cW{S-+zHpsRwO$UbJgq6d(?9>1Bb3tx zWSaVNB>)eJX5r{PV)qr5Vy(f)IG%*140N`FGlg>$QBD2CXh_xa6WgmA%orzJG)@Z6 zJI&|d2vaPL)X2HB@S~QTF_HnPUYzE$RSEyL)afN*Z<0~ugkTL9hurZO$Nsp}V=Vh- zqc*|nO=W4ulEb$!1^rVmghdT5Ez?ET+{`( zvIcd!Q$q=G_-tj_)s|11fG*veD6ZNA1}nTiZriSWBj$AbrdK&xmH1hzoeqdPUl=z# zjO81yf20QcUA+3JahO|4ApO_sExj#nC^JTL?^p?M`-JQ9pkoo4_y7 zoKcxjJ^kq{p=kZl$HHPEq#N(4BG!2iwjyK;v{#9MuiZAChNI~pWS@%^Y#XsnlgTp@ zw-F`F2}%@oTSVORyP53KDV6!XH}AN#cIm)cTT@gf^NlM{cm9oYd8s^Vmda_2UQM^2!|m_lGy2(Cz&F}%>`jGtY|!F95OFPx#zvRo zvrMf=t?I-yg4rwV1}QH?+-=!WqlySx;D zqB2T4_1f2l*e=DNkG)K1smsZDS!DWY1ph){T=9IP%9c`L-0rYz^U2rLPjoAHYvA4! zFT2>LBZ3Z)Yd;fmRiQLQAviV(I1+_|9X=nDr@O_L8Rhk-S{mOhEbJ@#M~Lf%!(bz( z3Ds@FwRF8*yg-=>#zOxOAz2FXJURaRMKj6ad9(eOO2D+r9-TI13qXy8Pip|GXNvOp%2JDae%NnQ+Y+%s2D1jNtytX4^F?l4i zMor&`Bjq~hDI@Q|zx=Zf;rIehmT7DV$zpAY1V)_nfOhX!Gm+SBj*-oZ%EM0Tq49$r zkI)#O^e++m_t_`%Zb8FdT}W<}?4)OF^(%-}w&~yNz)~jH{<*wNd?u%m z#PUx9|0G{2fYikghTqbFAHN@jAj@VxhhA)zSj9533pb4GE#>d3{}0sS>^!^&-=ZzX zc}3;D5Lr2MuNe0CrSo~QneJ?AiC-u{DY}^ZpR)JNuZKAu;N|#`2h_LucID4GL34u&r49rl*C;&_~6HcQ%wZfQI4c45SIjiosXWzpkt` zMRtu}zw$dZUm8%}Hr`%OM2cyRFnI$&5EsD_msh<|7*e>9(5C!p6Kduqj$^ONE}ybP zWoJQ{KPOuwZ;JcM$tSo~u`Gl^@StzbKa~ox*hy!(_K*^F+Dx5uNZSZJ3<{B|HjuM? zME6YQaq>p|LTrR(&XNmFu$vs_S+Oz%tGZ1G18%HQRqi#>JM>CU7jAYsHeD&B@gXzj zY@LCBdoT(PEQ#%CPDQf#0hXq+dEdf!%tlJ&ZV*ZQY6A$EmuW8~o>!+#?K5jcPFN*= zjU}iJy_Ui50CCRfA!kr6a3thu#T7GTJ~o0FH5o52zwO4Z!9rNbnC}b7rq^McMEIM zx~GH4S*bDD$w*Q06L*OF)%UWx5E|`D4v9w*{)^zL{X3vTITt>Y7m2{kNXfZLw)hk9 zY~Wt0G$JV^soG?t==b^ILVUP(KvnC1J{_y9ET&Qh4nqQu>rvRu4+L9GW zl@QTI#hZ5lgcNi8e;~_Q{%d3{SLo+%$}DF!Bg4TdIR7<@S3B#9Vlv~AZw@&ZCN8Z` zSbx*mng8l+Tv$58ecdOQC~6qZd8yaE(9W&@YdRzTyy7!te?#<#dRH?i8LTs`uPTh zNt*yojixFn*cI4;$@_CGauhIzo|Tb45ooVAaJ~1JMTE0Tck}_dd+DY%k!$qDtZGnq zX8WX##<5HlyAzcDRhCqYc!fT-1TCWqc#*Jm!TF$X3=MIKRUYVC`g&e`cO7$Td67yy z^q6|30g5Hf&K-Aa?HhP$Y#_9=hS&gIOiM&Ga>q0v=PBDP4KqENB6qY%c{F?GNgLCZ zoAz92O_Il9jf}XKl~&uTu`IPYxo!<^e>>-K%vvwT(YZbq)&)&Own$I$tUsskoodUL z!XA*q4}J90nrP!c&?Zbl<{~}LP08Ubo$8jzX%SE`6WdJpR%Y^m_!5oE2PmVG!p|0O z3z}S!#y`%*mDuAD;QENc#qnEt<-n>JRkr99AZ1sfZQ-ovc$v zt9>N?61S|U(AdJx|zH8$bHZeOjm2_*?e%sGh~?3fFI-G1tnG{W|q@V>AP z@O$!naZszE{+mMm7!mMHi%f`)q@aNXW|*jUrPf6Tz)d9dSl|EEtwa}dqUeMwYS#7_ zgTk))RMc@`rDHoi)krk*G2dTyr$&pb^NX#Uj-DSoHbP?w*RG1Jc`BFr04yv(m^eHovJUQ3l zH+qKgG?UWa-Q;Pl!8>X47Jvq~MmZmtZ5x^}#SS=4x{=tDP}y}xXJNAuP93Be7?DF? z>-iy>Jr!+O2n=Rp{S{@sXJ`Y>&vB3P^?)V_>e!4%#WTTQ>tfG}p6^yq&$C(Z7;tcRq2;v>VGeILk%f{`|R}=&v|vvHD-Y1 zTbw+_-a=M)-=v*wlXw&^DMF6*SX|_6<1Bc`0i2gMtUbmf{4LE^F60utfONCul>%`l z-&^c>Yz!1&cXcYG_;`+zN^~BPsYaA98Nw`dmZfpv;rV+8uY@yqzXKNFDkqnf6bKg1fix9A>Wh z8~mtGtJT&{ZGm2jIJjLoxT1Q}fE}0oY8x^hd#-KmON_>k^yN0)f}cG|a6yZ^#ZbwE zLTES8u*XVCvBICrF8b_A+6B!U{(2Sb_Xc+@6xfSvY1nil9}~K39lI!_Je*w@@$PT1 zX#BQo9}msccHk0g-K(0!iGsT_=5vALg!JYE|b1fBHKS9B(Gq;jewk zvww5fyKT-%5&kFgP3>Is!ujk**`~Q7Wl<~r>b4aH8itaMIxk3LEp0|JZ7`N^DrplpXIKLJ*EvD8SNZe(^i6#2 z(@%^TLt37^Xfy;`EfN2JD{Fd7) zjI{7p40(x_E_V7?llL((A@C%u-YM8IZU%i_D%wT3bc8D=Kt2ASoX9vd3Qdw?QS2~22pu>i}h?9#Ex_sq-D%JpRTJ_v0;!EGt zxnbmugEa=A@lV zK9*`3m{u7oDzus^C0}ik)Fh)fGxk4_MWgD5xzN6mkQ3L{%XiS+_z5?N{}^9VH_z)@ zaF$=#{(jvv@SNBrNxa*S>;0aQS~Gtk9Db!1oFFlLHaJ%8pgo;hQJ>??ra}T|pG!gY zH!dox7_U*@bO2fFCeq*1de{R?g%1FBdd2voJ`}{_4~F*T)8#qRurSiY2qTIn9?9XGz@ z85x=e7)0A=xzswXa`gi<)9O1#AI9Z8ZYz1V&1j*Sbj4_4<6MOsT`=;`r7W~RPxnO1 zILmo8Hzz>xQDRO1NcOotYKmreMJ-;W%q^KdD~GZRn}1I#@V_Hkl{Kz}S);wFw287- zi%ADstwSz1=v_QPSI~mX!d3mDvg1B=OO}h#?EBObK$^%U|m7Ji$nI!1A>Y)%cTPNuZ$1O>;K9m=Cu~NV942a12axN;rUCdE6}f zZFQ~k?*uW%2ql*q^QU*}n6<5t7*${sx1Ev^+^b&4L-j7+OVNRq>NbO07VRq%Nkx*yV)u~IIz=`|pDOkc?H^U0EUU0(LrRhk`}D{eOAe)MWi znj0TPtrcZxR7g#Uz38pKQV`w4YU9TXchC#`&j-Ynhcg6tl47*hNiYd|WZNEI}&}z$b%h>Gl z%TqZnT@u`SB1XD$!)2$HpplT2D5R*H)8;U*2uMSjiJ?618vXQo`Fst0UAU-zZHIi^`fJ(a1 zZ2O*(aTq?&tQG*TZ11ky2ANnkq&qLQ8#I_-87A<1&yj@w7<$IEr5Rl71f!_p4eB(U zMCcKL>yy?A*ZVGs1#5T#j}WPU;VweE%xn2hDEOldODmN}gG zX}*OZl!!&-ZjQQj>Ov1ikl3BL`MV(w($6nhXsgWo@&%fNH@H~D=g?m8mc=&^?}1F{bYD*}6Smc3l+n=^vk1A=~g(=-EI zf{q$00p17BBhHoS@*icJ%+LfUh&h-7cC{k@LF#L5ublod)hAm2+BhO=!#rMj$09JOKt3hC`idrZm`>s*I8|6Di zNl|BMvvKa_0bSZ9qn@8yjFjhcZ@(X~+_!5N%)lU(JcPyhuWN*oKQUQ7o;kh5@h?PM zWaHoyJ>CBLTCAgu-_n8;Lem&iGdRy}8Occg@0r*;>fb7jHR#ETRG=wj{#LWc;K4){ zgvZ=Qk=k5-87pfK z%oi7g!?A0pd=cYPUrj_FnR<*nf9`qs#CzR&$c;^B*!+Y~Yh<(?VTS$fI4IYCKE%cu zo9I2LA|Uv+@h>V0v$C-&+Od(m`A`3j}NIkYy-fLfkV^#_ro${X1*Db$>!$0uEFVJM96hBZ_+?vK{V zh3tR3jPSI-ex9^98SvZrW+YwLEi>++5s?6n)M+{ULUQkb`L$C*m;A!jA*=>+_XAXD zZ@M*L^LoFtmZzqsS?D0Oo35ftXTwSVRqkCWjHL06K7N^B~(YI&OF@9_ZTrt zgz!)coNC??=L8{!47SO34tMH%im;4$81IlV z&@tF{>sLZ4ByrbeYij&G*wT=ja(m(*-<^5sX@TuJp3fl$v)0FLLsv-lFwUYe96dCo zTG8r&0G+90LQvq0qe>IUIJE&)BYGobQ{G@};jwkx$Ov)NpNE_wGGRdy?8vexr!vE4 z{mP8ol6GC}db=$-yUZPj<$aL1KP|XoRJ~FT-Ipyn3IQ-y+T3gZD#lly=cZz-@A-Ys zVk5elC8>b);x@5`SCu&FpSFEjkIl5mG&Dvo7T9iR&WSGPi+qH3s@9siY4F)KRBu~r z&K1U(6!^E2DJgbVCeD`xptc1!KebrjRz=adleV-fPT=r9YgUPs*YoC!+WmYQ2cos6 zDm6MX`*ra3DA4W?Nt91|@WfK$sB=Ph;ZMwnnKxQ^F649}G$s;2Q;d%~pH|Xq#x8o~ z*+BV$`z+=TKXue|OW&g^%~qiQxq?RL(_GuoyAQ~ke$_pzEnEPeV}ZC|GZK~x{nLIh zO{GQV0|Nts~@H4U#Ak*dR6$F;pY#N*(VT#hPZcHbBh#C zOSLxql;$n-jfdC1;uQ4`?zBo^nr6)3o}QV6EMImoo;obzM|R%0)H16RY3YG!oWJ*QFkeaM11V!`^STK`V|vO;!cS6fLYxN3;i*f)5X4cb9snpSkY)&2)6nf3<& z6yW^nps5eNy|1a<#a#;Z6qDfJ=|Y9E1nK245`E99S3o>fG8E3})Q}Ua13^=onq@Q| zm9GHyDec@F$<2t{tr3mIY7XHGWDG3wYMM)>!84Pe<4dJ^-35jwZj9M28CiABvQf)f zzpF1|dOmDL#Ac2QKjT0uu{^7&;@vfK;QbjEwe@uENu&-g=er4{PgwH$*}Q^H&tTeP zH-lJm9U(XDEPk8XrO1KYRw`P ztJE@-)Z5k$eNww8-3VGXW?`P)Jy|NeV@|tsFxLO*M5HX*Qi*yp487n84>B06kQgKr!ySgN3sN{(b);1 zHo+md_t@Zpb=xX8O@a5^;qwRk@U z&UjqXY~QIOehF!zMPXi0SMIJ0B3z_<^JFcDlhcR6A?Yir9}bujDDN)SEW?*4aiiZI zEeucJQ`7k;Kjth3D8Ch-6jxVFKw@O;f;(faMS0qHovxSA_27(>EN5zro?-E3URG+A z170w3*HvXh0$MKFd`4o-K~J;RwloJ-48V$yHkxh2u;A56e}X{jBzN(GZmf@z2@^qP z6@**{!yvHDyqA?~XKfkwC*{;VOaXCs?Qz^z41Uf0wI9fNbS1E&_9?!P%Yr5CERV6A zEkvCx>@W_@K^*9AXrgRqNsm(sqAG3iuyObm1kp98q^;i~0y;1DUw?nYMXC;=Q1OSo znZQ`YfEE@Q!sGd3lDYEVq{+I)kqZK~_)5p(m#7{jaSFrz-%a;mDDY~i@*6!!G{gU_ zof9a2mQY_V7_)e3^ll($22F?v(PwDhH*Utt$E<=Bm(uP@Q#D{@op{A)&62SOlSySs0)hM(C)4GGa^_v>rbxdvZ=^EuUHcc8yb za48YoQ;zon_GV9M9xMEp{0=O1xfT#`TE4&r?Drqp!=J{M(VUN%)O2(}`v4ZUj)$I7 z<2tE;U#+gm?GAFs;cMO~ISM{vq{F=l1pBK$*iSm0`7B_>(Q8SyQ?t2V_93Uur;mS$ zebHxN0Dvr23{wTFRa&!iPX={4yGoY-Ia;bzZQpP+@z&Cj+*>Dm#>&wnKr0Ox^d5b4nw1C7(C}y-pg{I~x2mxq4HEKgbP_t=*?9_X`Yn}1R z+6CY^iAndBlVQT*7_&rrZMq&&iYan_TSF%=f6g-0eD|cex_;i<^^BBrg{o#qiM= zky#3XlQ)0$%9V|)pPIDzLMq7!N>t~tWVhg92{r6?%eY;Jrm<%LvA`{&@MJ0}uQoM$ zP!B}j^nf!R2KwuT`Jof~?Vp1~hEwf`nq%ah%%_Ws(4z}kYVvtEMvIRc zDJp4B>hHOW&)2vP6ucn8r?rXA18r>jG#MCQM5oiIgsCBJ`fuw96fPL(kmS=o7m-2_ zMZcE_OU?x;IM(4r0-X@;xGgN7yM8M2Z?$OO_ znnV5VX#R&I2XP~A?)r;Q-A{ zL+0muPbg@LSur8cs0EN(?VbGJPobP~#jXq1 z@cq#~X`7HDygHpU)2)0;&qNS4cvzry?Wc8KdG*+3kF_<6l*n>&g|E zP2GAjV71=iCYf^Sc4b<$5%pWvu5S%`SV^HOGR-#D=W|4WR{|nmG46fm1)q%f6C&>Z zv;Q$a(ixpX_W7bQAge!-MML29yzZK4Kfg*G7vh(ZnWVAbfl~6~v?>kcG(T9LdlR{0 z{_|*EIxEyXo>{%5cQEQNK*-E8-EZn{jSE!y`m!Ong&g?oz*?u_VrZ!mv78=#?dp-! zFCy{t#dpf3C+*&S{}izt@=(*KeKe5KFlqX@+`%POJwN~S6|G8zsCB>Zwep@s-tWv$d>-uy5)BK3R$a`Bo!za&|91a; zcd*pX)z$|`+dnn%Jmn&6V$CHqbloQl!xrnW7IOf>iGITzbmVgX)?yq5SC+B1-AT8@{1tl-pIvZGRY-p;6+-?Or)X@AmJp-2ACgU70p#URs)+xE z+dmdp>o%-4U|df9jXI=JdMU8*3Q1Ktuas)ouJ%VdF4uB=r=bn!fRVQMWn#)?Xwjr?9wCgNc46?epPFvW4{b`Cs z_KayiW@Gtf%z~_Sr|5K|Gsk?-CbZpe(Dv#(c0-?8-qZdaSr*rZH6m{ONP~NjE_6t9 ztrzm>^;UsIzj5*lsA;>)X>TV(c8t9_IAW=r#sZAL6q-A+-%1vjOOo&9 z)Fnd?K^6eKSylgxyIU!N58R!S$Rb2g3Lr}9K9-)f;iwsZ@%~i)4L3ksJ1r@+2B|E} z;eg@a?ZG*e*tm}r{T&l7&Qb%*S7jvbmVb?ItN|Af6l0;m?KP*IoKT+{fnEGjotpmp z$y%Nc59K7Zhf^CdW^|g2q=&QDw zqkn8-LeKORO1r`k@v`@U-bK6S3m?YP8L_d3K851aV;l>zAX&#z-!*9jyKfX?bKWm) zAuokzYP{ma`H)o)f3Ag~*0%-Jq23>NV`E08*W@E2cK8=0mV9ZEWpmb1x zAX^Z;B;ZoXfJL3DP-T$J{>~x^#n6Cnj;bcyjhj65%d4qEV9HyC5~(S9IDL(M}cf#;mh~b1y0@U&76fl zj&*v@Y{?y2h1o5k2zc;AXas+3*il16->DIHaBFX_`dw!e(I_sQMZ^Nn1jOQx=8kKQ z69jcl3TIB-GqD|sKywX19^32R2wRJf^gkw6T!uwN2=N1BkVd$;oYr8^T>gA5K9^_1Ayr#a()5V1KN*%Q=lO(vrgo8%A?HdO#y_7hwDH-Vi z;JLfU^W4+68{kZj{;7tpmpGyq}oYezQsQTuJQ3hg$T(^oj%J7!1yNZ`qbo!BsV$8GAg`y(>|~8yM-eu z6{aCOu<5VjH&u7f5iOt+aK-y2(sj%U#hxk{X;pJAwy7rV*S-Y9#x@LuW!hzCW7v#e z+x9ztdGA65Hs@~w>ZeCS)cWeOoRUnGkT|b_-;XG$R#DqP2%o;A6&IbAgz60jK3Kz}8Ke172m8Fy3tg77Gb4|grFs)@#vT(E{0I4P49=rw30#w~6~i*_@(H%ahQ zoz2v=M!6|#;0G`{b%-0=(1Yl@50P!KWRX|B9%bZqB~zerxxKq%>-k1LEF(q%1^QnQ5r}K+Im+OtQvUqA9Dn*VE93ll( z8l&_u*j-zaRPZ?@<25${|Gh8S14Dy$j7#xh_n9t%*h$M0Zq+N}*dtBJG5ow6$y@AF zD0ZppX`zAQLlQgR8)j10jhbDMpTcqP!@U;pF8}r;DKDklz2wmYGOfZsA=(5V@whUJ zFNLqpEW=r=P5fnJ*Lz0DAFIfw^~%{q`G*R#2ev`5|99F7=ba0`rayljw6Hz!v${IK zNBx17oUOvkTV<(|aJm8jF3Or?oI}kV;~Ux><_fV^5aBBhy{^l<25xJ9jy(MK(mzbv z-AaQMbx+*+*4@b3{CP3*lee(NnZE0`uiT>@y&@Hu*?7n&aH}R6>O82AVc#Xy%2)HV zZ~3>QL2Fs-A4_uaB|+4S26K%Aaifa<32H-sr}{&mw0K-M`wwP;ZPXePxxXes-LchNej0+Lg!;5K!=-ael8%e6_i? zQ`s?$syNvGcH%R+>Qlz9g0an|aaEW*&uJGezs0-m-fRC{bml6*WG3Hwai-2=PkXxk zGXptQIUQQioy1eQOxzj22qTm0XPk|V@>@Nr;-d(bM%nV^%0PNF%C96G zRc%oCrT!rB{`N`zv8~u z3m@0G+nK>z!rf@q5;x)KBSqU4kaN(NJ;1H6pSibX5}jydSCroWfx|kl=UGhg5)eB4 zYN1)=(ydhdleNHSTFS#37}k?>{07~(K@xtA9eOBBN-tljBhDojw3@Cx={uPKGd=!- zZ{0@1J~M-xEK=tbj|@=KNE&qxD?6E54O*p!L^*^A^-_R(wnOe^v1*>Mn8+E4c&$f? zAd%{(9^UZls~_H6U*H!?vZT+f%4o0%XIY1@19Y_J%ik{?&hBMiZ%VyTeW!9*LhHn} zQf@-B7NFFVa$3l;`{t01NLqLOK;SW`p}uPnrFrU-XOD&`{;;~>83)PezhbUJ^}CeO zbsyo9W$&q!DGj#~8x^6wBGB%pn@g>>9n`BRUScYJOnYECq{EGkvJvQq?;mZ*q1xL_ zfF%w7mCC;-z)Djd_ZmmsdumgQG~NOCbe6t!wFf=C7)avjpwCR`*(314`r-buv z%j(jTJp$}_BmiI2#Nd7IIDjQnK9&_TH@&A9+lFEV#ttt4ciY>T|LXKoIhv2XjuXao~@(NMpAykqgoh{*JvkR1%3pPla& zy+l*@<+%)>(x#OLe(cDw`yvB4Fs8!ne{itsbs&d#@X!{Jq8owhSud9Y2Wx|Dw-~b3_29-+8OCFZhzL+;M(tY`-ea_2>5~zibtC29Dg6i!)~kHKWy&V`h3p-y<_-L#JBlV#vO7<;Lz6*$axjCUB06pj1S;;w9rKQZD=SZY& zq60v$_dTjeGpMeWy8++G_&Z_-8nSRIgEOuUiV=~mJpm9M#J19spD2INk+L$+2&3&W0a7PdlDVOk(%pJ zE+H);+1zp~m#*sj`~3d(kB7&DdB0!p*Yo*QLayWJZj5Z_Eb&OR(tYh357k+jl_$}V zXdPkb=MFWD*`&a>p4zVoce_eb=Ki|n5IAPM+K}(Ym>C`{8%4andb)L@C>hzV`oKV4 zn<@fJoa*q&OH4lHPMWL2x~fe*J~I)g3Q^;muz>-lh~z~>9iK_1@iHR889AKm%{;hR zXmYgQF1J?Jx?_bdu;{Me5@pJ2U-itI3$kB-i-rP7S>jC_fJ@P@IVU{i0ifmw;bU! z1(twYy#^nO{EjImcYJZdq!T>T4fcj*?v)k}K$A)ztYgdlK_ds{?(*`h)nHji2&5@A z;G07kDgI(toedTzIo@p|^0ZSuWIMZHBulL{zxIJsFfNlWHZ?++^25~zpiIQU@ZZ8!8rIP+j$4%Cyvi=A+MjPzRPu3Ur&6r+ zsYAcF#@oPa=AzG)wEQ(*AI^*NHvbRw9Oz%!MmVmW@*vW%ct9{Z9U*jtN)_*|yOZv( zAqZdh3zN=EDLtqG$D3d0d?~*w>Sg|oB_mas>ho*0?(y*}f&Nb9!GBemrW=;`1bTWf zMph=rIPYeY-w0hyrFGl!wVIdi8iLF(C+Dk*b_9zRdQ0@OYD86qKKx$Ytx#pcfB2F7 zV{6`Kxh(M?R7kP5#^j(CX;~0aYH*pB|2>_`ygQ@nJsDG_Wns;>x5)yg)rnyF3CX$Z zqw3p+&uPSzfpc1qjC=4V*u^$U!xPhWPxi5BQ-RZ~z-y0ybV~aZixDz>*wo@a z*iB{!yu!WQu+)~uUm|=;nC{YFXK+h^bjsDkcH4PW=txo2u<}@ST9bL5>x0><*k*$d zqv4iQ2sglQ<<%c@q>ng>y{p34MTYZxYsdYkl(3RR5u7*B_EA>_4@0WY36kv06K8_t zB3)%2L0@VWbK!ODM^Y&??4eGCA*LS~*9fYAEEU_|G|QK$&zsVys>-MreOD7IkWoLx zVbF|b$f|kh)yF7a*`e`jgn{w@Kw{^9WWR0QaK;)ywXIM$mA~37zWtbf zEb&A9>=p3PC3sTX2bbzrGzsbHTC)0u_*ujD-btNc2Br9$!NJZ$bK-R4_+9g$E28)3 z?lfPAiFn(cmv^&Q%8-eZX7SbT+^;>oQeb?^nf>dU%a8c$Y_%6T@ps8czaLrb$sDDa zh0}^R4Z3D7@DVy8P=32^M*FvT0WcU zDC*3LUS`3&8~CI0TusYyxEA!mW8pc5JgdC1M+_146EAW*ly9|e!?Mvw4}yM$N0wy# zJOHX#th+RbQo#~ajro)4j~~oxwmd=uWOb@=DlFF*-wHlo6A!GJP&do5tC!_1LblK8K?gQeZ{J}K+{c)6E0Y$|;7?8yVy%9I%POv|; z=zKY8V630kg!58tGs`iPyt>O?eW`rk(Qvw2_37mXU3{V}bux~-KN>!%x^(Bb13`W&ayYY6lL$0|TJkHAR#CF2P!}Unkv67b#fLG6v(^tfe$fk!{ z%hGWO!_q~ij-`54MK#f6(~b2l93l9T+Ks~onDgOWs}u? zTBrx#YE{^GhoM8id-E@;yV6g8=Qz^7NyH2wG>(+%oK4MPMIP8yM{!TQ0^al$<0gEC zK3Jawvc$v*-ol6Erw=DT4u4WoCU|i| z>voydI3kctpWuNib(ZHlvvOL+xSFOb6tTQ0zy;`;A;}i|dAN?CmtcREOcpWZV3FS| z2QG*}2;VEe9eYGGSGuL8n3VE&IpTq=#*|5QmbDgTUx1Mv;1k;}d%bt@aO$WI{JKaF&z&Ked1)Uq4gA)%>mc@j%TEaPHt;{r>mX=lVzl zU-ipe&oIzwGOf@>-BeV}Oe7C@TWKztrrESECm`?{nvXMWUw8xL-NsaC)nMy~jLu3X z-_1@q5^#mtsQCL3-ld$y7OADJ!Y26BtU>T`bI<0`c=<8N#AHi=LjFk$4~laOCe1=C zX!fpw;feneb{IdiA3>~2Oh@(xNE#Yx>bI5*h=KXXWbb8;5#LgimMkG(>p~S}4mptA zzik&9MJ_|;0XcFU?B|PMJ^C_-0*|jufw7 zsqUinQ$UI>d`I=t3=kEcP+GaOXewlpSn3|xlgNWx1$^(1U6?KnMrFzL zp}8od>8Ma^(8xnbjZQ*x-_5yOx@SW9BHlAuHaI;MNb)Vfv6Z_=3!iM!p96=i zs1>JfA62AEQwh!$`@j<+bi+|h3qLP_+&QRW1xjGeNnB2fqlAwLnlHxlo5XVNWgi;S zQMHmKJ3fL5duCQqZM~Z??&cBb!;Bw~0UBicn*Q??+TXXw#IM~&qlX$2L31H$bsUB} ze`;j>(rq#IDgw*p0I8qOa}i=%GdwR@I0&F$TEKn7UR&y7|LOQFj`uW3Qr+du1uk{`ZHj@&s&v1h$R$z^- zbe$ZQveRANg2D{$pSSXA#rDZkQ9SF#LX3`ssAwQ7S$?xWBFX^SGZ1sBY_VbFyXU9lud~(?hNODX zJ|^^tL|KvA*Tc{tyK0vT8Wyt#@Cd+vkyN2M>fX@jgobRMAoB#xWn5xkV(C4>@-wMk|m&KC4v3xjhY>N%?tKC2V)ip9yc3}5+yOY2^=y$U= zz+WO(pU4av1W|#z3(Db#S0&#!6xrdQNMd$e2m5^|$V-(60y0>AY-8+dwX+wUs9^gH zVZK_o)R>C(qO`xvuOS|B_4}U zR>7yKrxf&@thYgzI)S)Ie&o3CsDi|h;mH%t%o>f9?d5+oQA4&Z)V(nRwhBAk;eQ|_ zTG6q!Ra}z=dy|q5kIBy8)FCIp>;3qJW8P&)gh_%K2lZNo>7T}NZ~d&d_*UD_sQZc6 zgwrQ>^a)*uKopNeNz9{8w=DD)eKAa6$@~&Bz|ZAPOi|9@F-Ef#Lv697f}%;~_NmU5 zD(HMw5a!l8l>p_?wA-U2kBcL|RfxpK>;|E>HINQZcqz7Sj9nUN%dsm(*3#7ci=B{I z9~Sg=km$jcSX{Q!6ku4|bsYTloRrd&9Oed3x3rKKNpIDCl{;2Hwqd#ESWkY9`&rOk z#`l-PQoJUJFRtAtx_L(JLD^?zQVn0n8gujv^@ zYJi=ixK$BHonR?ws`Ri8bjrrnP_2qONyv35m;3T&$_c=?U;w7KQ2 zPtyI)A$mVK__-hNS4oB`O^as2EjNbN0b)rfkNLdi+NPlRvt@{HH8%?qd8yJH+|ZvQrSQ{-8q}(Z{Jhq=Z`em~=hK{>RMw zrT_9BNm*G+9mX54cf&%d`cm(!N^XXvspK}xL}-6b>b$A^19;CDdX`ap;iByMP^;tI zkXQoc;%S|x+LqMnOEH^QrL9{g^k=4AvfMm_VgZBgVsz)a?Sfke8O`Z-;T(ey1}slT zTgHA#fR+nBz(D)}MXaX0C~2CAH?9C9BMXLtqOn73+A;^Q@&`8o#9cTK0U%Al{aM5= zDPRaF82E!`j|(%xab--*~gRuGl1ftcQnXM-R^8Ty@OP^ zt%4!&@ShPjy5{rbN7(z>53J~<$H<)cC_#DDbXI6nkd7cenm;sT#PU_L(3sHxe?D@~ zar@L#%5is06`e#}Me$wN%o5xvRi3PVdi#ya*cB5`w|aSXKITA(MtD{<&o6x8AX*{{ zLd1nJ62h&_L(nUQ{bHp-&c#yitW4%XCzjILoXcYI1dwU;}VFBGYw zS?jB)XWgHDIkJzy#EgnasneU|RNK4VK=I)=t!_dXAJJvP@sTb`; z&bal669z={2kX?955sbfB#VV=KcaBRI_EWdw&Q^#mT=X!3TK5oNem4=P$DpcXhe5I zgu3?W{cW$bS)-0P^r4-RtpRzCNYddu5bZR-QC^1U`u}ZxW71KcZ20`-e$^Y-fDTNk zR3;y3(D7SU?+mQyug-DNJQ&$C4mFWc!RJpa5Iyp4S+iP~as>W-zec5TF%Ed-E{K$C z9&Z&%@~Is;Lr=c-YL8G>R6X*KK|*&A^kG3sij#{$Jg^R|F=%!?=3}V`S%w>J2&px8 z6nbhB8!3Km*)y|yq{CF+*r~r2`C~0!-Xe$OZlo}2NUsH|jqEq7dM(Qt&EKo?^n|H( z8&kmeyC>@Xni)R3qiXBe`T9ShDqT6;>jz7>83ch?F0J%(@uf<;o?b@omx{tf;p}Kx zS8%a)zJ{mi#u`b7#|)u!K95#wTE!>DYpE4=OXrzpfQf{S7*BQdri#1Rig_ZQI!S^` zI1VP&G;p8UO?_D^+B_M?m-|1E7i!S;yS=z?{$R=-*w<{n2?_L zB?`$J=32vzCB|ngkrIYLqqvWLV9kni;cPfIXKVPlF2IS?dq>Y5Y4yJWtoHi~jm6}j zDyF;i6_H~e?9C>3HW}Q1&M13O?UkjwxGPTjS{>krAG9d)iZJvl37aRqo2({(LXIo_ ztmN2^s%-5Pmz{6%3;FdL#_9Nu>U}3sACS9LUiC|ab$Q*gxVh4%UB^(|iFXOff)frm zfO*`1_5|8=(NOHK>zr(|1jsVLQu@h8cIX>%HTi8bx2QnL!R3a~*J_$*7Cgt9$$)au z>&^y%m%Z;v_?=`Xlf;1zo8v*!kpfZwKY}n&D<7_C?%?_OBK$;@v{|}hwSflTEzZPL zH#rLZGw~Zxf~jq$WSRYmuRkWmr5}l{DjYp--vQTd3o=2&nM#BAw^6pQqb-%4T9a+s zqpjAE9{P|(3J3n9UbfLRYwXmNwE}Bpj=0)}tS0>V_k#>+6EQ!h)M{kAZMOj+&A5zw z2w>mB`StSuJ$`@vu~iN|QVsG|W>eQMiwQ`=c&efW0nW!bYb;SX^!V}l{`SeoNRi#) zpAI+QM7zX{z(8ha!-O}S7t%Ml?$dtRJ8GCg$6jx%}x6|c?pttr{d z5duO(Fw$gmqxMCIK#0@%0^OTM8u|Jv^*w{8YoUQ1-<)gFm_#=M(&55k(1vGvo1A$- z28Q2YS(<&lUU2QiT?&JRX%Jv9AyeL=#J)>ZxV)Idvr8M%r7OjX@-UyDS%=zEdBTX9TanpYj{Vdc93t}^lViGL6u(q zAzE9@nFrNYyC17uj0gg!xQ{}jSQcrzpiVe;sc=)X z`rvsOjZ2PLw^j^xs5PI=KPD`Mxusoh(;lldJ=N@(gC2rZR5wRD*`wEx1N^eX!>sUN zF+5@Siya6t3ex38%h;uyl>yU;w0)Bc{i1URHPjDqx&ZL!ar7HZ@UvEc9HAP!{v+tI ziVxw!^OKQDg^4nQCl`j-9q+MA5v0gNPcLhvgLm@37YdH1c`;WjP(m$o$*zR6bOUd| z5~AUxzEBmF)OO5Jx^$5!9LJ}ZFm_8DEF(fa>3gixP@&H1l~;|QS1RN`TEYfi8)LPk_{6T7IUz$)RL650if@J3g+VBTTuyqvi$eQQZ0dtJo~b85}UG|ws1N4%aGA? z!aaS_R(un>R2|}EB&WlOBVT&ntmbYIccUCS{v2J71(QOS;Xn$mmKG{8c%U8? zDt%0ogqT19lYbOA=-)C|n{0vmgHorGWY22!frcyAaQDppl`zEVf>b;>sC@DAokgxo z3PBTgxi!LH?G<6;%yqzXooC3a?0dT)O}kYhz6V%e!gm!&82#`vu3*T;ntp@Uo@(yE z*o^r(*)c0U42S;yiz-1`3noBHr#eN$b+vF}otUt@1l|Ma`dE0dAaU_QUvWNUOCG&A z)mhzojAaUDd(PQH`8K~jwv1E0@4T&%0qR5BUM|7k=d7je~=7VU9c# z9!?hz^ahEw7AQzc-bxMlY*T=re1_vcIp9+rC zM2NMrRr3CJEYT;{1{Xv@X^{k)c11HtWVKF)-E`_4FIDU<;=QsaJ$yKG#c$V)q)@qX zGRcuuZTET;1kS?G z9eX{HnZoQKMR09+XgWS`SowqtX{FIlewZF$^kCIj{Y*r8bAGg|t8YYMv?Z^Jc(E+t zPQ?i|lweE0k!%4z^J%LP}hsp!)2hdcW&I}^K(%$}b0g|M8!#@GW`8oZx z5jVaTvtuo~ui$8LebGJiPI^Mo&#vElt_2-5Jy*54HzT4{m(Fhk2FtSNn;e#bPw)4$ z01cpB!yEFWE4CbHw*o3F&|8+6IPm5h&S87OfP7bxe)^wJt%Nl#L7LZ~qXo|WlBGM6 zZpxchZ`Lv|ZsAKL39TW1(n$Ap*)>h*?{JIW!X{UP-kYyQfal$O3IBbWCOKZT*?(`M za922WTe$io?JqEE3LQ7T$%wYd<=%6!4i)pyqq&+ZU|)x-eXa3`49nAjMfjK_&*w9z&`6Zee zfniy!kiu7sX(&2s{+yPuswU$nWXXEnZ8SAoZmX~4D*sr(pr&VQwvgGt1*gI&V~KC= z|M$D!^z3qN0Ik8^6|S90ekL&GteU<2E`1y$dX9dn=qL+ZSFVRpU;LVkE*CiM zI`scDSpjy1V~-kbdV-mV#WE$5dJChl%5eO#he4InMnqs)`Ob zCp*sN`egn&g=hQF`=N4htrdNhk$X&xg)c05prag)-Etc4^kBcDONz};I>PudQM6Sde}qm_c;@5{9f`(hW1HL_T>l>^ z2V30y*9rn6_f5 z_AXjZ%>J>lZk^!tqJ}8KyDv4#OvP&6V;2(ur@E(|Yw4W|!-@BDO=e13hM^%h6(ZF- zJ{rZ(5w^0c)XiHUYVFmc?5TjbC;?Lxqq9WeeT0N5z}{=X9X;0F!+A`{F%TK~Rs$3J zP>IC^)^53Ui~R8TGf@!2nq;V0>$YVnxwuMLF9uymZLg&1&;{mSB0t~KX;ga<$&K;x zt1)ydbA_M`tbfLHqja2_zkHxUaF-jn%|IN)u?BfYN+7-}m7VF}LMX2Bw23|KFE3=#ydZF=5$EsQdY4NPJ%aV+4&U4OV z-WItCrH6p1F!P>A8OeN7U)-8-=QF>FNH7(ozk|Ia%wGJ)+Hfv}3yyh8#2beRyTiNG zC?6kRmXl;3z=(Lv(A|`Gc{6RIS;>)_*|*7uE!AF z=I6VV&<#R7H>F%jPh{;hqeO?tJqEBeVl=Nh`pAbD&}>RD=x+>I(S>B&cZ3LKSm_i z=!KRHom@7}&|oG&-Ns^UF0rp+6dp_AOgXa0s4!T_asw$?*yjYw09;0nDaO_tXy-;2 zB=<)ziWKt=f@$6BnT1y4G6H=Z|MN=I**3!-E{j9W5RDR5&U@rc%>X-glSZ5jl0Dzd zb+_c{=&6m$(zcWao(t)Q6@E%Oz_(St26+kd=pIq-q9*Q!L&YG}%k`mhYI~>sU7aG5 z2^yzK>z}WneD1B&y4Ql)Nmk5#&W5$N;A=SuY9XbW%t+R8q^H2PYA!C(&6Lb0kBKpL zfD=b^(GptyIvleOG3DXol60yzHPG9B637pzl8&DdT6BY-_JZSX?_|<-O`2y&bIp5?I7zdW2<>>#4OHOPBCy* zmpN*H#f6v$Qu27HjCYf*p}`+Onvuwbr|fhM2&4_g^ESR5sx=S9(xDF42B%_cib^vY zlqwlN02rOn?M*aLmG)V+zx+s#Z*m6=Yua)q_^BKO^3JlTwIg^>*gdFmdGL`Z1 z)^6=D{o8tsAZY0F_iyV0C17`$s=ZSF%q!B~!R75)RgO(wehdR!X?5rHysnjrg?ch! zEZi;t%d#rYFP8BC5*m8NDmMLRjz^p|Rs=I(4Ntqon*UZCuxW3)NRo=@z8zje{KZfyR_pQzmzNg{1Y>P& zmdnqJNpq7hTEK^Hw9&#n#C!q=VqAe&a#@HOZp=`{{sSOA3{_0bT3EjGOE7gQ@0zvq zT*!<6Cz>iM^zBo+RxqJl-M|~5XP>6pbhE#!Gu_(1RPeY>nSZb8AG-N`uPl60YTEk} zi~?*q2_1P^8bTXP&B8rxY!uYgtX;N2$&Az?bA6%eQKW@arL0f$UU%C{AMQ6%PxMoD zU*32?`6y-Z-|f}1E1!?woR&Y)cPyaJ4l!&t9rQWADWS`DR(!#NbRGJdc%#7e&}1U_ zFv@$()nje3Dd##OuXL%Z#k*;0Vw$a|L%Ws6Cl#^j`XWp=0J`%zeq8pfw71%Ep4HQZ zxRPv55di?4oMw0B>!$xI)24AL|G`9rDNl{B&WGoB-a`Q5W5z;NYwBDgo=-ji2&Y$P z()lB}p2K{Oi7}JaDlM;u=YQe7t@^nE@y2zNFrMEW%Fa2ke1A%rC9nf77GO%`Yn4t! zu4X?vQZEJUG%6S0=HFBb9XtP}Hu6)Hn5)Y^igYIM->8^{yO!4X3=+(Lzg73zbbLv^ zcw6X7T@Ajk77ft#ZP5lXyWc)*H$O|g=%cyr6|HBb8jYN-7s@M&CdSzH_ExE!qO}>u z@riV(i?un^-l=(g7Jrv5Et|z>W9Bf=k}2WKDD*O?f!4zOf>OglJ**#75khW+Qcun3 ze3G2JvavyT<~cGZ#`O-@U`U;3WVKtadDuIJNp^+M;srF8kENhKW^#qXQP*k?YkQyoMP*;WS&j4OUu!&`wbiq4&;$q1GjisNqnp zBR(WBK!}pDmS||@lCL0oFaaf6(SH;TTdh{i46z#b1(6^X+}LVDi{~O~3!dl!vo9DI zwTz}eGmx2UZiSj_NuU zT`Qr?wgSPQPQGX~m;^c9%IH)biXU*pg<*a`P{S(-kt2BUJ#v3a6Vh@Uo3V_D>p}6t zb|_P(_01^VGc-&?YTAN)obpIv+AVBW&@hS>1)-sr^3J&RQ5Z~&cKYkfPUN}3WIGWL zxX~zRVqYE()azvUQ~eE2!brXa>O=q0#9iLnoN?>oxkjobLIU2aExT0S&YyT*4=i%! zcY$gv%Dcoe#s4FIM>Xlnxg)=4L>B57WEi*L#bcbY^|qlI2_lC<#mB8}|6(`Zb%(qT zt<)(8ow!yln$CUUx@=94KI$$Di$#^_s|fS=a4bIA4Pvw7^|7L|7s>lOc)>z%7?_Dd z;R%d!(oDIKr78E@62YIi!Z0de#$Z@<#~6O#z~|wXszk<{osW0YTk%Ai1J;O zag?=%i-nG;KniURz#i2Kyv9J7m-H%QNux0%D?{s)Ho`lUATf`*CLZ3b)M(V+QbnI? zUSyhlbh@jU;xCRkf!=WDozBZ#v+yl2l{Dg=OFWxw&F_yajSdIb9Sq5D&?*@`F{He9 z*qaW02c;A^1X}q`e@(=MdcfSm-OB;TLCmRm$z$NKB}V2>UD|)YCMva&X)%MuJr{1} z3B3@$>*WGmjq}vscyJ1p^TGU0B9EbgT6U-&EW5IDKojyomPg$hBqQZS82{vmkU1e= zt5T7=4TWR0d^6J?(Bk1bjAl_1q6NJ^RSalMfs4AsWGl|WoCPlHYYWV)PID_1-*L=Q z;TgLnIN-ycXM*I~KqzYd6+IC#9;ZO&lUtw^HTB$wK*%LgZkp&)HK<=>XiKGk2EbFtA$%Sq}L1(i?0kjVD(6G zC8VsV)*sfffjy~WemFX`e%9u!I^Sxf>4y6VPCjPbS7O`Vle(I+;mN+I`htfq1heiF zTooMc0-Q24!nj^F;HOx&DGsaKC^YCy-A^k3kR|&%t29J zT#%TR^56f2K8ulxmXhzOYJyIN9~Y8JX$Kbzq^x`ng?``Pm@H&kF-B2*wnf0ilSlQE zJaebmTdDVw$75t9>Np4ZS}3yHAshh3kDq_3QP!tE4pmN^AtUG~W0;lPmNgSH>t(nw zHXii%`jp0Owr5<$)1ow^p>=n*h;EskalM|Ozc?|Fq_DxD6R;6+9ZJ5Z7a(;34FFKS?Y+eTRZ%&itJ0D;L4GU*1i9NMWQPwEGeRmy<3HT}mA^jOS0Swvo#D|mr& z9{=eFT$FcN=9B9)EqUda^*{qeCWZ1Yp9EPg7OCQY8l|&+PATfcQ&P2)f98F#aOJl3 z&}YHJx+~Vca<5n#sRJWs%DB~T{SmA;7!9v)hPSJKG5KDtfyyvgovoKZ)ycy-l1pG%RMahjP>Bh{q>J5lAcGdSaZDYy5^u*`2h>Nd zS>2oeK7P8*GEe9#Oa0r*?F=mv`#fQNFmX~_(rg!lY534Fq+m^|(ZUM8s~acQWMS{K z^O2KJ1%_qr{0c%p!rj3Nst=v=e7fb&C;r&oDiE=7pD^Hfj7;R|sS2g9tFttUC8b(0 zdvllRk(wj5px=Lu>+c`HOP^q3e$7O@p@YkaUyDOWKc^DXR8MCVKV^_6h#`ow7@(!I zZBBPoBcm%+?e`w^W{GjWbClY62t9@Xm?n^%r}1^_gp76K{f)gD|YLY$0ae)nFonkF!!8)eJj;Yg4aXBnek-f`xX+ z9EdnYvHl4wH7R=%!TG4U2<5|UmApbHlvC|%=`4qzH(lRxXU1*@15h36sM45$<*2TV zB`aVoeiVhvOu0myIMxFG6vOC&C$;jm!Bo!~Bm#-h{1a+g&~JaVTFxR8Aev9Ac{^8t z;i@_^-of{t%iOu)@mi;~zC-NF<1hby@nGG(V*LB*A(M3DP?t^ z<$rl}ljBB6hL9(|C22$7dFNuwDL*1&{@QtMnq+X~b;5kyg73>n85%j>8EoK2L?WG~ z6QzHK7p+uva`SyF$Z1gzZ_*q>5{B(#r3Qqj? zbAC`%Dm^vHIC2!(x?LY()rW6Wkh^Be0&vJ>a9I(l{<9G8BB2cFX|joJJS7syIMzkI z+X*>cpdvC0m0$_f^GL(W%)Z)@@jPf01)=?*1SJ{@g^sVgd>24wmx^y-tsxgN9i~8# zB3F~jYxHg%D^UXs!G9@)$yS_O9b%57emZsvr<-b;vi8dJeFm2vmbq>?SLP)oZ402+ zNgmNtyn>6|6?)Ymqg2u|LmP3}+UOn#92#)e{`p7AxP)BuvgsyM0FIKAvr78D>R65y zi%B6v_G;2wC22`6_ttF`Wo~d7lO@4(QJ7rcGgiF!YvVkM>k%?A<&wI3H*Mq`l830E z*y0WS3CkTRY{DMhw(ymP_ut;gjv!Hfa-}EJJ=0iiPRe)}vGAgwwsetFU>p5y=J5Q_ zDcJ#T>64oxc+3FgLAc{lzWrZcagai&VmR)eG;9}bY}1xeJ4z-_8&)==srMh*4X6}p zmZd6G!78`RgWnJ$G$E9Q95BHoIHfpdG$DD#re^ zW@XO_E{n#QEX;rImYM%7Z%q~rz~ldfJ(EP_B^-I+QB06&*F__gRwrB49|3dtsSh$j zj~I3uZ>V_GDSt&qws*_%liKDXWeFReMWs&Hlmud?le{Vzwq`D|v^G0KIox6Yms9Tc z1m~v~0hGb;_>a>uMv<>@7Ii>l+;k{Mpq zFSAtim8E!2N6$Vm|4075EoL+&Yr=QHJ79&uKH_$m7?EC$LyS!%mIFQ(`y)6Y4>vgA z`ujKd*Tl$N3FyJpUKJd~z28gDR$7HUA=(5jUSQA9)YujiNaYuO8G6AC*w$yO$^pq_ zMffdkZ2oH}pdONfz4L65+;RG)ldyz=$51)MQMGQaJM>tWq|nK)>n_auuOtXLZ}lpF zU5&KEzR_Cq?x>FlqRjDJ>|Xb)$x_7|QE#j;)agf=O4HGI(&l_b_AA!JF9-?3f5Il! z0*&s-A3C(5NWT>H9eHVD@hsmvM`bz(p}}PbZn8t{F=0f3X0z--^Wq)+&DckoS))*DLsCA@nn*r_h)+6ao zWLLlk8ZFh&Xs;pN=kMm%ri0{%d&((s98k<(%o<4>>nE0co9#Ro3m`PB-5SYy)cTD> zKMz;Spf19P6wltJf^p5-@Us$+B;9qUB#MsY09BG8*khX6B-MIp+rQ(pLylisopdVnhWEuot_vGoR+P$|^s0-W++6`Xn!9 z;(Ew%9cDO94n6Q`qy*|X!B<V4#@Lpzgy4W?}W3?#Ugiqg$R^C9*hEmhewf84(~|dC)KKS znz%?j9JynKO(X(qaC`%S=ix2W6K8_Naf~to?v4%>`Q;Tx8y`xP^) zjuiX|OzU{ePP>&kyC2IL6o-}V3r6Rk@@!Tz_2;bPT6h;@0L6-~Ak;wRMWLE)1Me53 z>{b?`>tE)&jkiPzt6P^B-VyxkmwN}YQT*f9VT%{R8g$&k-LKgE-md zGg=ALZ<|%Erc6gIrLICpdB%*BNonp@gc3*e_YHS5Y0k^lv#CQ9RBAS*($2*WG$`4+ zV@@k7AG3X^w0Pr@9X*Z9m@?MS?%k9J!rLNI0LL|${9FKa^o%lOWxvYiEX)&3<$kaA zw-JQ%EYT-rNI|9%l-Y*fKtW2+#TWa2*8-)|6hF$^dmopL1eu?`{7h9o61ltoi0oti z;a^&B`Wf}hxKDpT=sImFa+QCK<^6%(JsNrxl)XuDwJ0<(ae^fEJ=Rdg#bE?%&h|^S z0RPC+2=K^Obm zDoRQQ?0H(pBQ@+yuM=~R#40W_S>Vm(c_NW`h&mSpo#Yy2zY@oHuKr09QRv!N3)B8 z;J3p%0o(cMB$?NP+RW44{2q1~fuN|xo20?i*9;h$r+FVxCLCAG8kSM_SwurLG1|rf z7)RJ5KinBxHOMbI(*QKr}pf%UfmlaFulC%gdg2#s%LiCbvsS zZ7iit4kT)+6Y2EkRP*ji-tTr;qP19ut^6;oCnb@qle^hbr6I+*u=ipfxq;eMD*fAv z*wvYmiL;8OH?|i3J&wIMF0Up7<_F!{b|A(zqa0MJtEIvbsZfpE#Xhj)_i%_)7@e<> zOLTvhlCR+63ixldf-9KOuHCSjG_s>SM#nNm(V^RrU!9XONmgbYUU=!-EdFVH)lL0E zx>9MGnV0RTsJ~NbZJ}XtwE;1OqccXINtp0P=b@Y_DM2XnVS!)Y=;DwE zdumy>Z|fd{=*|^j-L80$G`(p?{p}$JxftU#BRiDyUhOkPCfW}+WLy2^e65Gqs{nhO z=ZnCOh(T!c_K9MP)IGbj*D8hog=Fh#>dN9$0R}ND2Iu(96^d5unh5pF*)?#s%u~6M z%gB!*SzSsk@`qjjqZQ7r!~;r^*?}X2Xr|^t6)Gcb6{TQl-An5Y0_rl`lWm+(SX4v8vQ__GIeK1|Vw~V-F*CQ5rezu5ve7k79nAZ{p zET6=P0wc2Ni6S8PQyiSH{eBDsAen3`g*v5d@afO&5s4rReNaYF?79E;ANs2!;xHQs z)%o@nxX!)ez)0?DedWqs*?U=h`&-UxC+iL@`_w%Zu0!7+^84CfbBh8HRP-;>Te;?n zuPGm^&rAoklYvA@gIZDK0xRWDxQ9R!Gwq*(V!|bT!T(CHHw0sb#x0zzRpZnH5ia;ndXTl12?oFb5Lc|B)%e=OofX_w}ZRR4qO=s^1*V0>b!de3G=@_yfA zUYjUlP_}?AlhPs93hKJmQR@$H%NlL(Hu}68sm(7(c;5xkZ8yhnwGRiE>(KK zM#{F=ne84k7}{cE1<`-kS>uz8ZxA3#I`!%&bfH0FI#L}w0qGpg%fz?rySg-Y$G${Q z6d=NVm6uu}^On_c)wB{P6X9dUC?k8$#c7D{fnGc))IhmBG%ri9>FW%GJB++2U8$(3 z!3ytDfP~jmMH^CKv;B4_peeh+R@$%HmJBrHu2ulpzX5u9>*pjjJv{^#$CR0KAe3YS z%Cg#)B4+<`SGEF3Y86P~iW*6#L5eNUNrxyM;_0FZiPRA4TejeW`$vQIb8H2*c}DsU z4q_HuDkiQ>t|CYE0H_$Qrd5JbRvPlyUEP1&9Z6cK5{mLE-ERohGg2OynyG>`^DVm& z#Rt>Dz4>CMG9@ranP^AAy*d%CHpBtbS{JIQ@5kFcuzW!&jGuUL)&d9-tp!p8iXMUu zw*?xpmQ2KMXkvy{IaPZtzMjXt>E+CQay%}#Xn!3`h?NH2tbJixQTZS`3Vle#V;4yo z+r{1zDw^pP4d8M=mPJ($C{ZckDT2eL+7AGr4HJUum%EteG z?qSQmXYbk!T>p#w=)5oQ3$d?)c$&p$7}hwy*p0JvQ9}u4P_}h5cpUS)xJx7ylWQFg zy3jGCmam0_XhW1L>(iHlVSfvXJ4mxnO%v=FV}8sW8wSA%Ka*s=WizeD=c`mUWAYQd zG(<%%DaRiSV8y{#d74EeSwv7F%>f?cslh^Q0mt&uiUn?@xE)8fL7w@p>2nY;Nm2PgS)Xatuh%sI5eA&Jh-5>Ic6*eP zIOOo4&fku~g!5k*f;D)rL>3-X*XZpFFTI?6wa$O`Z-VU>G?p1tczSPCpD5@^~3oZ2P* zp{1%g4bZJAmNC}$yp`#WcaRCz8wx!Pzc^57f=2)2OUWUPTgH!`m(9o+HeKzu9MsZr z`abHF&fXO+3(Ji9X$i>QP>5SA#%FnfMEgOV^mK!vIL63V%0(>NA^M8plw28d23Q^i z*!G~Qvc$_2zXxH1rxx*Nyj56;Ro-L|(W=t8QGt{Z@<}mQKm73kOF<;{0TFTw`__uD zY>?bhNcU z9Gor`k%K4!~2zswpC)KU(BYr&9eI_^jquf;93Y-JKz5K;&gLRuruj7 z?d4d#N=1AG*jL6(`45Tsn$q=u6rFoK(~JMd$1vo69p*mwF6P#Txy@zdI@jbYw}j-F z6*aL9xixbyw=|k-5k+yNT(?nJZmCoqKNGz%CZs4DI=>5ej)fM_d3FDL;PVm> zofO}XwD{R<|0F@XoQz5CY;0Sj$y1<~`KQXn`%cScw5=8vjtQ|3*K7lh(FO(9pTvFsv=75t%UF83+ zhfiow5Tm`T3PB*$2nyBQ&PQTUfI_s(=YqVU;wo5JQ|=F)Bg^8f{n^lN!4c%4UQr;a zWJLkGgwrc#_O#QYIw|7YhcCN+zqi&`)DyXhNCWP7g-05*Z*i+(e~ho) zHS_>h-C-ug7Y-Jv(36VOq4Y7#9N54Wa2^W_H_3R}a>o6J|HC^j-T#672}+J1F_Rq) z$Ndw|E8X2b^P~COF6kz5=H5vD9xse6aP9f6x|C{#-!9R6R^|_vDxIdzKAaf*^>NVb zVGJVEqqA<=5cTFK@pWm1-{Y*N65R8r6J73$r%o!sUz2;Pw~W;;o!F~En5Zc^3iWGO z*xb%}lDJlZi%jnar;qD{yhjgc%VgUgW#DEs=?Gc37b=*+Q%NnpndN4n^^X+=nk>uQ zd)G4;z#YEjb7r(W8!581u=C;!wLOW|)wKnJOZ9fu z9xd9f7KJwncStUcMej$K{S^52xD~Z=>bJi?dA>_O?tlJcre#4)ku-4jpLo}a9(u~E z3ZK6-dUNpKh*VEfnKxhdTPfprRh;tUt1+#cPl1~J+@#hV$%S7-Dobb8TE8_7^ZLl_ zE!#OQYCI$^D!V%UrgSl_3U8m8RhGS!i^0oE61q6Zd{P83A*z0sre-2sa5{CO102sK7-mrNFO!kRBGRUdkC z;3shYUF)vWZFD)+6Rwkm$u#C7fS7TC<52xep2O3A`%aTLf;gZNm6c93wQQs3QTjMw zX4W8uQpN%Wu6s;h?lKg z_+9TbqGIMIPNo{QzV4Gl6tvMvit+N(BYiPRn|tRbk)D_!j&aeNzXCw_8d6+fS+Hv3 z$r7?{-`cQey~XG;stP|JJBk{zv@^*lVa4{ZP{s^yU4VR4qggX=+`!+rYy)jo{q~{# zP#oz)vHzd3v#@IZa|}@z)`NLY*?)yc(zgAdc)2~i80yvqPSlU%a|HbdLadQo1p|3T zQr{c>NZotE7Fy}+bL9i2eVszUcNPWs@B^7lla%vU#k|) zNFbf?@=iF0U$kO~{Ps#HYS*-#aY6#hiv8U7fTl0RaMe=LqD5mqspc!_=z4>oP`l?O zwM3QO%_BJ9>}v5AgVGC9N8(6Fz*Lo8qce(<$*CnlUg0;@nWPg$RGy=W_4suSMcELv z6Q<7ufrjvj#e1xssu;xjdkqwRlqr_&)bxGN@eR5t*bYEHuv=~jhazU({wiU%?pD~V ze3%%k7-w}xHu0qG^xgzu{qyLk4hVlTTUTTq!fI#m@sB6|7&b}!L6SIpmsr6sbvc|$ zJug$Cb`vECjYE!U=S>}l=g!5=R5}zp8|u)a1MKZ=r>ph98ab3KwF3ChO1M-3(&WC- zP06y`4ZYg9V+Ij_9Q6e}suuF=PT5fIh&VxJn_|5&Opg_ut=KnrbK$z0{|R&pBUhuM zN_>m}8+6H6BS_>pDLFisk#mlOr0gVa`Q62z3{6|>sfaVva#{L5zX{dpbgd0MHyrPn z>=TgGt(G!(j6D%pSOnbVbop9QG%HU-(BBTRPoImoAH?tu#V|y>*T;CZk5r}MZU3plRa56oYZUTzWZ^|$nPz`4 z$vjp}NbRDl41U8GAYr&?wU0BRJO26%xufp!Fb%EZX25M-A_A|*3}|-8A!z)VIvn}L zk~rDLG*pX=v+%v7kC}_u*uahtB06@ar*f5))2w1H&L!9K)|_bws>n2$%c!?Xz2nls zoHG;PA$_qK2D@_$;w=29dPQ@F9;bKO@#@LvkKRA!Ma5H-fKz8|PNg*$Yfo`LQeF19 zGsJOTbg;3J=ac4csMC#A~4VpY< z*o-M)WEJ}@26RKoM){FVz%8`}l@4M13w{HykH+n%xVbS6^A|U;g4l6K;KPx^gJ3B= zT60!YP!XTa9D0TDbi`K_)`JqvXe1X%f}c_{-hJuA(piJU7GN6^N?Pv_QK@fUV8*T- z!D*-SEqU^WTUOIO!DO^FKz_2q0{@jA%2VLuf1uON*l=*^A*zYjv!4dR+e%7Sg^;6; zNffWI+n87=C5Q(y`l57tu~S{!b(v0{(T`6hDk&LS{s%f}sx3rVWO`F*4)R^uzQFx7 zEGNdZwF?%G)+c#u zobq(|I1#rO0YConZzn$kZ5u~;OW{qYxq-ta4aJBAm;U&1L+d}6IGKe^+x^BUUh-V2 zv#T!fYEKPDS}rz(?ke|lr-AV&Na7o!5Qq{spA#J?p_d92&*CKU%d|GENn zf0M+spSlNPV&6cmy6HDX-hctPYfBcmL+0?gqCmm$LPXVXuh8}Zce`q9CPg3tB*UM3 z-*)0`%q!3~fx0&lb1K2_zR-l;$6kvP?RdhPL)y}p1mm}lc(wN1X++ z_VY!|NO2bCK#wQSh!lXZs2=1chtZjc zHJe4O|I+{01p5nR7gk6WiN;+GsBz?C&E5YEL6Tm$47iqdvCqy{@M=SsyoF*@&-{IJ zJpIh0Y}olR_Cec&$9*IrqN>sj($iZ_KOTJDk88hj(t`=vEJ!VXaC_|RmLmFVOX}C3 zvQSpt)${e&xmzm$_0fTe-0)A9;*1;bHc485+?~9zuOy$&SzfXtbx0@JIWK&#u1#yz z{sg?J>&;<2H~EusQsE^aUB2{}dqB{~$hbQBWX!X4$+7W4;ws9W7$IubUDc=W zn<%=s;*7sW%O;qikUAetW8mx?Az{kVkDXQK#fZX@RYP%eeZkH(2IXeiH$G(|@2Q&I zeXUu;!aM(vIx3V%%IjX~waXrT81&EY^up@SYqb$dl~vyy0`1hJGZWjmCIOZ6RKP;p z@Y$zUoBi{AY3%^k!?%;!vA802sk{0Arq&lSBHa57*;}68{<88<>Z4*4 zk6k@&nG)4GG&4Fm#7IDG`6lNM+YloNuD8@rp3B|+e}^{--WueZxyFg4zmjXS_-jIL zR{J=?&F#5SqF~vcK6#@w>>ikN33!OOv}QbXpwey|<3>J5wmkf~_OXKLWPiF=ll|5a zy^feGaFn>Htb1gRa(4uH3Y4B!%9o7CnrzBzUKv(9};>t@F=1#p7`A-y$mN{bhRI-Z>wAdQx4aP z_LRRmB4#sB`DwCrsyhS|5+{I7gA`)orM14s7(bXwOWtw4*$Q11uLJF3+NqKsZU}2c zh#VwOwzV3gR%Fn2+)8i*Acqm{$>9`!C_83Cg1t|$;F)CrU;PEn{ToD@cU8JgaU1O0 zAP9F(Ynqx~l~j*Cj7Kg^Vld=BK45W~DEsW}t?KS3vO*4b$G_+ zD9QX-*j9Ydu0qWhE&9Ep#9dkb+#AeSAGIj~R0{dya3CNOA-h9Dook&Q%Sag)+LInj zYx+%`_3{zKCFlC_*C-*ZcKd4pxYQV^;N&=p4$plcf9_98%#`+^+(&xDOF8H_VBE9v zKKxRW6IEj*InfzSIH@EGN?*g;H8K;celp%T=f08$T0ggi{ghjEN(;o^q9`?%)d?Qg z7HOfnMS_G4pt8T@CdsrOX;6?RT@VSdJA8VF)S`z)Ir9aq?N2W2*`L*E2K1}9hZa?W z#bu^5Ih;z8*c}((?A_;h^^1Oix}qnekb`$s1mF3zG}%=IpX(=#tRS}>Hog6{yze|E z;uOQ5lC9zp?%cNOv+jCmhtS&s7Q%^I1t_j6OX%<8*AI}|qr``YO>Z*6#Mpx{b_Ccw5~+z(WH@X|w8OJm-q zaAO*GZdi`@dt1s^zcUZZjH-%=KkvB=i_XveG*NhHCW1m=X$S@43(2{5;in|5f`yvl z^vUGIz8${;qkGm$DI^lJ1DnY{^BJXD>IJJ6c`~J`G9CCy+D@s?AghLsr7oxozj}q8KqL$mHKI=kJysi8`ZK?~epMO<&ljW_-Mtg) zoyez}w9Lf&z&Ej~AtT)Xj~Hm1tEAU?C(5>-03{QrS)Sn@FCEd*&bKb|E1V@vGK$<5 zl)DdR7y+Arli5adrOr!A5dukSaUds?Uvv_u1gSpY&+Bg+XVgN|P-|})qZkF}-%okQ zK$10af(s<+*LnJw}EW7l{f(o4jddZ*-KGWsFh#cMl zXiFx%Zy@t{w;10J&Cger3H}$PkWwrIjKtz$8X8sGhyQy)^2sy8>4dyhP2)B$lI79j zJM3DMF(`;_js4Izx+r^6A5Xx z{i8o++^*LD`Cp>v9CKk|nrr|bff0S-?n}8guuB`Z{;MXUcSV2s$aJXofFZpxW=xvn z<{tco7ev|JBSr}OzrF=A_p5h9b9;rFkEx4fRS{?H=L`M=T>(hJ{6-)=8|JMR4;M)% zVWV>iY9m}oLkp-AHvhX?SHR=C4Po8Z9+V>nO*N6!wxlZGeGu;IuN7jW2^{(-k6zJg zuSVed?0!SXc^K|Ic@`Bn*hR?)Hk@&G+MyjO1oy#+qo3U8Q{0eW zOk4yOAa!z&w1*l%r4t;EXM&a2B$?#k)@=zKSES8%)y~W6zLE^RRXts)9Vm4*L-m@7 zH*|6owPk1j*zGy$C%vX@+|k_AK;(l@vZp+(Xo)+$@G3N@tpRpSu01x73=y5f#hz4p z^6!*v_P2euB`y{MvT5SAI}-o#dO(GuvyNs1k&>fk#Pg&jFdQR`pHPkoC@1MxEqNA5 z6?1^8v+9+YO43aNv?Q`Yy+vFU1EgD^*G<6CQC{$xpPoufrXlAe$%s2vCc zL!sd+9pJDowo(>RAp6bJr@~R0Obr@#!$**6Cgyk*ts7PE(oo#>-DSX@esP>w5n|Hn z{)45g8z|!lv7CzZniohAT2Rr`SQ=@kF+x%=iAq$9yC?tAol9yXiSSU~7KhAzsvb;t zlNes#&UGs(*i%ATmDOuAjrXsGui4oYK-3l{yN(o+om{K+$bE0PA2PE-llY)3-)cm_ zj|h~tVG(Rx!j<){b(cYaf~u*rThGhY!S5o+c)MiZP1J1JRPrxf8(ao&H^eIx4gyZZ z%62KGDv%Hh-9!pSM{}yvZL+TODfwz|_ z_aU*mM5a(f1YiQG)4KMF2OMp6C6pz8n5V5SxqVevnGHZvY&g#^U1L>82@HW8s4CBA zs~2OGMfis;;y@Eq+Do)R@Q6Tvf3Q+@hfY&!ckc| zC}je>@M#0!f^>s@U>7KG_vO0byH5_i31a>K6l*p7;RE8NJwAC8M# z;FK$qJOXWjZ&Nu5N>IHDyz zJrebqC=AUy`pc4x^m6;m_JAL`reyvDRJ}$d_`5)1 zlBVWAsih#4hbPh7RS=&E-COfF>}5&bnIvTx2)w_m^2YS2A1{I|-)QaSmp15O8Oi8y z?z$u+6yu0o|Ck$VK381Uz5cdHfO%2b$<~eS$D2q^RbZ6;fK_c@f!5>|_C#v>_) z{`^ep_d5N1&}N)FPMkd2II+Q*=_-GW2uMqDGTER9 z;pYAs$jB2gE=+%|^Q6-VMu`OY5q)oBiS(bLLX{2 zZdG8T=VLN8Ar%*;6V5@`e1ya_EpszT^4drUk}s*rq+K#N>$zz(MJ9uO+P6AeE@WHWh zng1#!yB-#tek@$Er?5KyFz<(~4| zrU>zlA^u|pB~FtD=%NBOAh0TpDVXOhbme&+$h1A*eOJ89eGu>uN!!Kh@P+?>|KAwl$BbGVls2$g5xDcp9-XI)lQ6y% z9ZQ}u-vRYroA)dewIay|C@VPXGek|AK;huprZaOOph>Z?vlg(aHdN-}_rG}HlO35P zK?0h(3vc>EXVb_L3*pQ3qo;jW@f$9mLZSqrds{A_fK70fD#nj-Do4Yn7rM0LQHF9> zB*}VFXyr|D3wJ}6OGyXQd_VNdZGQIx_s+m1V?}K~!mn3=N*2+8f)mE|vy$`XB`53dK67oPfpe9+&*7PKaH=YtN&UO0&&e=h2>f`h^q^aP2PoejPd)%pB z-p)5V3KMbr_p*_NCK&!Kwdr;Vb85W#|GVN|m5od&_sp=uaMSstgBP1|(%H{EVGmqT zS)qLAo~>@3D!Z;!RC4iMzWc8l_OYhB;FC&@4)%G4c%gS`Mi7^m5$`OT=od*+{1YBK zx#d7z{%#ua((>)E8JS;KrqD5QqQU@13#bAfk&4s4as7I<@OjH+#$#ssoe=B5shYCC zy;sKEUf9TlUpZ{*umFcp^CvU{U`1tx;ejcmmEK09}q@&#uUCB#h0HxV8bE?q%R$Sj`8QT^>$ zeoW%ulb%L;ZBY(E+i#$}1(~IqcY>Yi{A{+umneOW1VGf4D;OTI1mwRiEvC&5M4ZR( zHQTCxyc8Gwl;HO8s5T-~$E46LDuGRY91u>^k2^M!#?J?4FVn$ zQc;i>1hjA5^1`ddW9076Cp_T?EmgRh$*j=-Dl&2d#q$28{b>$pwM@@znPjM>(ZrR_ zaj_mgt{_#kiOI=-P$nbcp0sDnrMVbzNC>Ie)uDiXI7sT$m|GO)wMaDKwd3^&uI?x| zdjuyi&-CJsi4rDMDod1oBx1?xpg< z=&JST{WP3_qZ41aX&Kgw${#yZQnpZORbqxV>)8J^>7aYB?S^z0tsjtB?P!~?rT)q6%Pve%ry z0C=P)*O=9PCQv>vUyejVQUL64y% z*}S51$eFwE+ERsR63mZers&O`3v++9h9!a8ki3As{0&5{dNHlw&yYBdV3SFuIe^0! zDAfoXayQ%CCkI3RFqjlvviZN98M{B+DZpm<(EeJLSgCrLnI)H#%gESO+}6>2-g1g3 zqe&@^liqqX<6Vo0s>77MTyvuAQc@# z^92$KJPS#TIZ16aNfCg$jsJCWDUni*@A2@U8GSJVvkdNr?1(e2SZp@DB~}6~1^;QRyyO z^+!_`N3ewA8Pd2Oy=^ZnOUxW6z>MpED~9@`tLV?`Zanw5M34u$wSnQeZ%F7vZMlQ( z(jTG6G|GOA+tL1(NaL?Rx%S*se}f(n?RNJLy-}-XaC#RiBl5p)(r5gdjU=~y-RE{j zdg2si0$D%9j`iCoHwE&BseOS0O4}f2y4{lRkurt0xnZ7{79Sg0Fn-Fz*2fcHCH#XI zvL2kQa0rNkC?)?eDXUPVH+W68;IuWjt-f!@oIX<|$DN*{RTObJ^8!EXS(3jgpR+pM zGW+gS#v#`|N=jIyG|20U68UL6+k+VsxZY=)xo44HkJx+W?3T;mT=YIIAR(&#Os!G8 z^=*J5yi&n=XfF&h6%l-KF^HRPr-m6vGu^z8dKVC8i(cEvGBg`pBWa#0t?oQqp5WSx zb9JHW8;_!xNlEp3h<83|?|*xW@~T{Wwkvk@;q#{!*TGSwD_S=1w<@5b$FEq|x%K7b zQq!p`CR0avz)FaT*)qYP?|X}tHpZfT1UFfVGY;<&t`Qv*>-(Z&;|w=r8RG4%w`o-kREmyaXv{0DknJJ2rGKyu$5 zx}D>!S%f4(@>>KGh^o0~I~{vY9_kdo-CBg(-Tgv1T>lb(xgyQVz1L#oP7{gm)Qg2N z{pjbj&T&-27l$hWYXqP3-M8*}ql4m^UE@p4C-93u*4(+VV(vVv=93bOWh`Qcj-*-0 z;rn0pV7q^;$hof9hHB>#eafP4F9gUSF-WJ$CMKKoHECDI3>?5S7+Il(=;I-qPi(Jx--&r;KgOQ8 zxr#tqCjGdFy``aQSe>;RJ?Ae!wgh$=n2(NRhfaGt2(pJF_Rvj*S_#Dt`DN7KzV(q= znIupM)l+UdKUFN?d~~xaE_QQ$w&n{C8;%9dqX05G;gb55ZJXfo<;LSECt&p^V6DhM zdZGxibDl;r_t&kAcYToB5$CLrfP&Ne@4wZP*X-6eYhNzT37S=Tw6(xfQ5kS={_$Nf zxXvP5$@DFxOvI&uab;X%mfidClvPA!b~)gL}WLXJ3^FR_XzAg`Bs~ z$U|h{&yxLD%%j4t-xVR9Fdu2kly+kS{eC>-vPMJWY-8)D(`WZ3MEVs?ApEY51{{-Q zrLJucTO0A5e*r5a-_?pILai|n)U+{W60t{Tw7k44h`n;BFU zZk@LJC_NsM+ELdwsUn|*JP0ctm=FO9~Ts5@6o{PplbXeeiD3p>6crZr&sdfOoNOtJ>zVAWFjI<31e(D0(i7E!< zH|YQb6?k~Z=KW#(^Q6MprqNUdC-+@#ZDvTd@!Q7GDts>A=TIY(pmHAHnMTHnj*haf zsv!eBecpPU>?IG5TeMi5Y*!gvayrdG zPhQ5oEiLhnUJ&Ua=@@pP5UB91OXz6A0Qt*Njq5zgxDeE5pZ!dv$w*}EqX!u3-aV|_ zT+@#tp#$ESZft_VNWxjTSo&;>y*og{E{>m=IsgdBCVH?FmOF2&ylm5u@D*UBqQSPW z!oLs8YbH2&qM#!(l>%k$hg_@OH~-kZ_)fhf3oe3^XdaN@Qd5jQ`POv8h>JNqYAJ_2RJ^lj z`~4(IDmXWss9xjiKL3-hf%dmPPUJ`_-KMY5bhUpNAX$(Kz8Q9IM2dAwR9S`6=LBPi zA=1eg$iA)ViW4F25l(%Y+l{f&f~zu@nq3oBRY&^hM=cS-#-2tmr35rB6_u1}J_-t$p1AiL$*egvcF*WSK@#$WC>1kgJm&9r;HuuVgME z-oi`nIGM-tcNK0|gPV;UOxfi3TZ|3m-u$C4Fr>f+w6N=bg{K_P=-YA+bF0I$ZvcUX z|3EXo7jnMXjS}~^#&p}Y!Xhli(5q3`2DhOLmu0ph%&v#QLjJfJ1iip#@C^JReb9Ym z5_@41oSF@DaHL#L5y>h*J0h>lXDFw&V?_xiHzo_KnJ3Sb;(t56j!rBJZeR-(I~s z^aq%_OqNkoTOwc+C2lGw?>2XvDWtgrt;NL*YlVJgHy|Xp1ySiBwFWOWKP?~f+jrh=SPBG-Q|0r27FR0LJpxm^qYr3-)(w+2i;o4?%L%{Ta&?*TFM zMQpa-2xQ$ZgmpAaSvSgG`MK4vdigHtC(G7>en-+qt<5jk)&Nx!!7mOVyEm%(ON(j6 zyerD6Mh#cDH_W%B$CMb0XtqfKqICgu_PNXu@agzHPwQe7d>AN#F2wU|_Y3_cION)# zRXwgJRCL+uPfP*NV2I*zH}=`3J};m&(=~gyUv1$}3>}97#_u2;Vv+&PC{^QXx2V_a zK`kfS-YE`&2;?!uO2p16eHxOwIa#M zsixQ@K0;qyEyJxyURkMTmwr;FF|=^{Z^@C8GJfwJ!XI6zoC3=7vTQ7tYRCjax|Dh> zNsI4VpY+H*o6&J2G4tw@f60}2PUP)@LD*NMGP1s4l1Co4Vp0hu;y=pj-V|odHah41 zQ^_Z`TOLkcQFgv(ul^gcy%9Qszi z9X18PHMLPc$1LXXn5*OBX9ET1Ho8bkDeffwqu530c}q_@g^%CpJnoBtv9%J!v>v#< z>3Miw4W=jrMgP$aThA=uZDvO23VPGhn;0g;3lbit|2rZLMjb}2o>H#j zR+uSbY~kX8t{1#MeINA6<*K6AcU$bh2~Ox?Z4n}`<6?r_DRuR)bP&XKrov1Qlw5JM z4-O0Y$^Bj@p=o1W{ENhSd5}BUb})s5r9;7*8nm!lT{V@f@V|C9f?^#+IjZ$hbCeZy zW3E7}iG)>RO?#}xRqe(LUZc((0>HG2Ws$KC58J|5&`wvV;t5_77hDd}|%@Ol5V&{@ZM6y$hsLlwtd~=fd!i%g*_3 zM_2*&>uBSC{-*$?gaTQX>&mkzt(rqnI4mNP^4OY>6k-}9B{5)eXT0`Ph(2gwDi-Ib zmE&&wYg$w!=$jaNCos$KlVFhC?+-HtaQiO~IASqe4SsnA+#+&MN{?I3k3A6M1K$Z0 z$evrF?)XK#Q9``6`?ERYu%ocu{v|<=$-Gz^p_TKoU$Zk%jjWvt{3;qFYOONx?<#l) zXVqVmc1_Cl;jC}#RnsC-)ao<6h__3TM-SHyrn-$BP9Fn~_C9rCs6fS6lCSeU@IXj0 zN&TEozKeP3SZEpg5iMOd!t|oEOgIhbK6|N>`_4Bpqk~@8Xv#9rv>G~SZ|byN9(OX) z#(u2fn)-EP2GS54hhJc=r?i5!PhS38avw*sU(+TgEu`q5F>x4{9`uhC$^>3&#QD>I-I@Q6{SF zBnDVss~e@=DdV|856v{*vT?OD2ZW)BJP<9#!{y? zRTRuC#5L{@i|}K^ry%a+6;MGmnUi1`CDGfrN%S-sJ_ek}!9-A;BheGtZaJ`W$Axdn z+NyU|EX)kuvtv^U5PfE96}$PaKU;utO!~mDpY(!832vW%Zl#|AFt;VuxD~?Rvo49o zu^Hcskl@J{b<$%?7_aR?WG1DES6Xdne!4@j4ITs@cQUnnqL`>HFW9?1Q2R1TM;e?a zDsW2z>$5olp|}q$x6StG<6k#S-Ys!=Na_;be!#a2V5qf5Kc7}=vUXwcU1hxoQ&Ua- z)N2I8tb)ai$IO^4F)XXW)S@tSbbcwprY0(wt*I|gLfbaS`gQA*oyUpay-j?)3|jHk zf`?x;nCz-jK;zZxJJLBqm{Jziq0cg!d6XUv8w4?K@Hpz3`Q{`x7j9s~wt~(pr>q5l zMpjc++vH@Q>-#B>*l}rp0gtu3YF7xMN;s${-cQH6tS)rElDGo;{vnI5o1<1U6-1gr@!n;^x+(G9pkTYk&_= zj(hgV>pEOP+1TLsl{!#7uOlfayznh0?ljd{g3z~)Nz~WsR0wf66&kv2YU_GMfsOuB z*~M+_>tYf5#w@;Qw<>6Yh@4lhx9EITz{Hx=l>vVJZl}fG#js1X-?YF?+lI}m1D&j4 zTa`wh;j!2c^^EQsNGyOP5Gp2z5U*|zDg(6*G2|y=@noYtg_Ol1P0KkcU3*8m%}4i9 zK9~upr0JmI(s>K|LGbV`UmPZ}=zakg0IHu(I;%Dr&h6+h+3^$!B?h?_# zYq@*iDF^dhSzaUAVuTNfKs?E?+8I3es;%6pfUsV1PQ=sEon&5;U62jr06Sp{Ayk_F zQEx@EnK>+sqMqBmU-?9qPtfzR?b?PHAfE=|DJ9DoMxdPT6-_MLO zc7S`r2jdiW7c+AUdYng8rlsR`mNlQt2znRy@2#xaY&trR%iu8*SIgMLeDhacggk(B z(X|X9Wda;xg>WEEZAp&h9wpnUGE8{=A??0>OIJG3eJ?Y*@;5Gh8s}<{LnsqDypp7z zT{`GnJg^u9JNqpFJSl}oFtI4vEV82!Kj0CNTr0Lwr_HIF@`hay6YU2i$ z9)PRsAE}GOd9i!-H=_PG7iaOa38G;-f99y6xo<(i{KbQ*n9mHo&(1oi+I~b&zD}KX zPWCeE18R{L5;K^%1hhow-WVM$B~Jz_180K*Q|ziSQ!k;U+-kvJ2Ow@9p&mY^04YbuGdGp>q(hZj zolJs`D3`6PWfw=*s&758)`P}{Pbe5F9S#t?t;s=Gj=&g+IcuTA8zUSsXVPw9ngie z>!%IUI(cLh-uCx2v6UN5+x3SaYT=VLJ%R~Mn)<1w{6)UafZ$te@zq#V3E9g z`y7m>{wZ;nD1TVD?o^gUegQu#b;0|#fe0{KIF zXJe5{e6NEfq;a4p>m^|v*)01nD45$$w~0S2X4RSW*I?fb`pn~%sa$3AR~mg02|z;1 zu2uY_bs%oeSt|PluA5#Xyk{DbkcW(o0~jl1vs~1n{%M!R^Oh=UEmG`q6qC41SLA0e zmICo`=Y{hh%7jN{q~{KNg6c_nN?m`VceMm29mPX&h(N>CxL>tD1jxs+klk9Y7tB9e z%=|LLA|N~>BnenyCMF2qX_&lm##1`7pXKe`b0b72?^#KJ;e zKW{s=uUDXB7+#I;b!uXL`Ry#0aN{5Wn8V%sR-mkUT}+fPEG|$&mqY~=F>$(4ZG7LR z1B8r}D1+xKO5k>>VJR_%Ms|d0MQBl%QMghH!P$tB8J=W)+e=gFGZajXq_Ew^$M!w3 zJ!jHD+=Hn$k*j!SYKQu+e)$cRr(D@Mc$1v$JEUgrjezj|^|v>8q}jZO%og>a?9nbJ z{;$ke_1bed^9329i%WNPpHo_-j7whTocq|n*J5TA5kZ6OFW(3%$rKo2dIZ+C zS}uJPmtlxzn*$Dw4|%T~(!ie{%@%R8b2`379O?ztvvR~draDhK=t*zsD69`_Yisks zr+8ja_UbN(s)aOP+4AWW@P7*lWH2o?8uyWCAeuzRF^WknP_9%PPjFA_H%6cEMFrk8 z){~cncdb#yYMwn4XEB~-ue8VBpn-=M4eTiXe(zpHy-N*EzRopw`qtHrU6cE!28B1n ztFKJRIPhiu6FNO(f(iG-oiP}bQ!Gq9T3kFo{m9-u0?B%AYNnv_z1sX|J>R`}pTnmI z6_tY5BA&k>P01QLXa`a+2dWHemnKP8eM2?coD5f?(~z}X7w(Mk;XtKb%+RloEW&I? zW-0r9CX(Cfkjc}YMy#5`I_DG?SkPiJjMekex;(9KMz&@%O%Rd##Bb4z;K9KarReQ~ zH|Kn49zls4&NYmz47E(<3C*cldP9xAn!7W%(|{yVCdL!|i(O+-A>5FLgfumK@z6u4 zD*vycv3-~zcEKplMf(Wr0kDuaRZoH}r6TLvT92dM-CP7RY2Al<+i9=|)3hra&hiO* zyv19Sna(;NtkN=Yima%4iz@HW3KA=&O=^|O{Y&SnMeq8PRs zhMw^$jXVpVAJLw5n8pVd{Uek<5g7DXWvG&}&Z<){beou0h>0o?5#Ava-1~HqsEM}5 zbAur#y70gOtT{)n>vN&=oYTI^=nV+Ta|N9bJ@7n5q`t{7^>}R}s(FK2O9dD}U(iS0 z<>L~k5pdwrjAf($tckRt6m}Utk0sA&UgV`wx_};(Z%~pv{w8KDPmdzS`tk!?d&7)CbMq$DPJY8~as44_E zADg{`3@)*Uv`z4qfsmviv5fQI>k=RoHk)gzg$Ctup$&LoHX%yp)?OEy79SuhzFG*c zvE=B*oV);>=XNk51#}6gYttencwhvfV~`5Ux@~a2*u^}`riCW8T0c%ty*2%HgUh{~ zD1AZ|O;6)7Xd$ly5tO=sL=&e=L%#y-2UBbb8@r;p1tan5Mup!39lnpkbQw$kG`~D1 zm^rkQel9;SY#By_o&yHeuvhB+s2Xx#p9rAB5y{{c^KbE1gC{UT&VQ&exS3I8XSW~% zC_E6qM_#1Lu)0MWA`$zZr|i$?KX=%KXBLlupSQ&LIItRQXCJDb$wew(wG3-2Oy=2V z3a)gzkd*ut8{(|G?rFuj3e3Wm>70bBL^@xriup9J%|eyfyf5A6UiuefjFJ}A@<*e@ z{cfudo#A%jmOpA2RiV&6`U(7l3A7M{!?_L2W%kJPsw)*xVTh)7T0wu+cb^O<86Xc% zy9r|rs(1T^#WjHogWz0|v$C6+P~lRW!XZf?RPsm+G%_3z1WgcH`xB+8QCw{tC?nd( zce$TC`$*y|Nc<+68EuB`c@j}AxT;_9R%HcPzh+prE*RUC>C;NY;Nkl5Df^5!C+vLr zc4%%w`6Yh+eXGQoplF^DlnI&fALyjoj;%vskx_4B1o_2b?*Zr7h@6r6PxNZr2x+c4 zygsEd#BN;7(ONM|@W;yG9z#wViG+!GYO`d7>6cAJMam!Atl5+w5xafhTkn!6nINc~ zFH;`gKd$g^qO68}luJdo3~NP4Ig3bk8R``i(3N<NHH%ShWSblgL` zvBrgrsM_%ynt5d)RR-JyHL+f!q(yRspdgB`@NiX&w~^)kMur!|RZjr&8BvAZP#Ma- zLfX|sT|EPJx_|kS#~l}*K6um7h}$OK7n+(zww;9ph$`! z+&fTeZow=?@39cIA69L%n%V(38&NQx=G?q%e?6hA;i8MC?^}L79;8~;UtgXuQ{~F< z&F$da>Q1d%9q%gX4>xkCN8Qowz6s8!z*Pk5^i6fuKSZ8hBS zvYME~r`u6s;n&*Ux5bdWdHx1Fxq1`HTL!IH6&m7|KA%5&Wmgv5wOC2KwB?JJW$RGC zGj-={;{A(=-dfo{Pt@?UrCFg1aVTXWfedvIpyL{wr1^dX#u=I;7hL@ktrObfY@`ZY zN`6Z8%ZV#T$x^Be0j_r?kK`xkg&h}eThI0tWkUxOgCbse1=2c37w5zW48TVh&MN~o zpCl!YYt_M|ge)*Bg0fGyrFs(l%8kMGhvm>%2*4KP;=I_B%QuG*n0jT*Dz_fi* z`SxAV_SMFy+EKQn;nliPd6jd)|3}fe_%qr6e|$3xIU705am%?f#O65WFmgU6`3h4G zNk$Q3n`4;63^@#QK1CEYcex{np&UX|snkSr$|)&z|E}L3;PLP<*RJ>H{dv8fPu`I3 zVPIhl9zAL)v>J0;5ZsV~9a=|~zle%w1hydzRd`tDvAtJF0pgo3Pkvo~5R#CUDoE(% zI;ZOWpl>ZpNZW}p0!}2l6LtAPa7Bm9WxQ4s(LK&E@A7X*Y9APA@bgPqO?Mu^UX;&L z3inM;-E6buBx_7;Cd>|6`#ZnLXuK9yGx$7q^^dyhVD*nYcDEGo$Ut!QhFxpHkJHG~ zaN){sA@3$qnb+5g%*7~8xidCp!%w8v$kvzN)bELCEAX71CHJYxKbEbb=?+6pTM?F0 zx2<Xg?9LB4`&>~ax87Ue4ED_w6rM5$a^bndh zX08d)R#$b4Q}`xd+*GY|^u7F&n&3Vk;y|G0JtK9g6*@8*!hIeeK6mWAXRUrnef~un zwkK1s7T{g-D1re7?ChsrEGhJAW?Oc$Z-HH-jX}yziBLtKz>sSnm&;_WF2((5k~yY9 zVEy&1PaPFy?7l6cgyB=*^c2U(d^8)gUUjWPubiToAAh@#%cr-9-{hz^!;JI(S(&NV z;3rkHf492M77l5pV-6D$+;33b={7zRzPI=?GTag>z&c8B$#PoKwoD$Mat|q7 z*FsA#MDl2P-x>8~5l_*O@m>vRClBHlgOC-SfA z2h;S5AiVWfPB?`lg3@;*fv}Pu>S4q|5TUsZX7%QL`>{)B3H9eRgmG5uafCTiHdnk@ zX{OAUhhtwSF~#n-Wu%T#mbiupp%Utft;3o`G$M?)DUYXa&4HTS^R8H)q7M1 z!4Sy7hGLCkTELPqoGBMJt9qD74L)?k7q8pM$;h*RzOoZul#As}U3Y=>js8$gwJLd^ zA|o#%c{x^6k-2JDoLQ6-{EpOXVKoqeSL;?|PR+TPZM7X|y;bZIqn#}@I>xxwHQkAb zivGE6XPhIR!Dr^C=k)s250zc0d%r2qDR{BnSO_;i0;}&4h?pnH}tu{bFUer5ZHk-PB6AsY!OM`|c;$ptyAaWX&SZSp&X zd7!r!^5Px!WFjvpo-&Hk z=yDu6|Az$J^70C?cN?$dmAL%<`z+UWC=0HM@j^{x-05*yXnt1Bx(G+J>bGFln{O`+mBiIzf)o;gTH55K6xembb1> zr?UFykPj~C9YuN=<$47yUUhn5+v^QvKED=zaCcfZR{pWH%v#lOy8fBm?Mc{_DK|AJ zC=!L^X$~Uaja5*`6{jYEH=}VUP-#&;GMF0ehUZ!o3Q$wvHObY;8j!hJmkAo5fsp7~ zmmU#^zTaG(E~4bB#X_ks6F|fHxd7;nw|Ud)X4@(3mp~_DkFt}L<9QcXtW3f)pYq2ik(Z)?Z_IPhQuOv%d4|5i#F_xul2$q)^(MQUKt-Qbf$#ukU< zaegV3wBd6HJBlA?n@M<>Tft)TSWxL$!GI$~uTRiIoMY{^dfX+ElQX6yq8(3$zhL}S z-(9v^7@*hku+SB1&OM^xAM!XSbqNes-|R!^m#kaWi61}o$jSZv3SW4)uSvRp6?e(k zjR~awIx+|i&P|``a)GCGz;*o8_iGN-M`HBXWubgm2uC5|1=JFDCcufW4HRB_WBUG`YFD#Ot2`uxTUA!c^FHs zyv@!b@~{Vfxu`E@Nt(0WFc4toOMiV7>dkux(a2jwhD8?x>vMto#RPhv{*(b;1wvUH zKhEXpTV-9>7cbxYAj^(y=B!qaIzzl&vY2p#DVod6_t%3Y%)yau0nq&8;po@;Jn3d= zHn8HdGdnzBa{p$r?ZGOlhugHtHaER+@LvxdhX6SM`8gh;?#~dm^?BizKVNc^yXMk~ zxG({PTBHnse)BHY5!QQ0vm?8t5o7m}fpw?UTmY+wyF_3_A1D&4Kh3>qB5K27{F;TO zx!67@tqq5O8~Nrz93~LXJw@#9-FA}AD_bNdA<7!4^WUSQY`^>o_3c8p$BjEC4{}H6 zITa3q#K_JZtcaVA<-VypzRr%yIM}iVl!JO9&}#vJ@MGm>Hqr&@Ddj|JXK4O!J_?_l>0k`Hv;EKgGVpszuJ^cV@; z1PE{xR%?+dk^H94`^{XwAinTFVf}oOpi5tkWzSDshl?32%T~H)Y2?{(qS`Wi4|1kOxd?~hOa<%vI$KN|@N%4q7n{Mc6D|t98ayM< zJJIl802bFb?-YiR0(jSydK5(7o2Q3%U7nv&;Efv@CJETxCZ$4hQW~7se2Sf#Y`|+r ztp@fnCvAEseO`12j>$7BHOJsPJKjl>29m>&$B1cQ=Ixh3K+2|k>l{VUM&3{{@0fd_7%beNreP=JH}>yqCkPE6s^uh$;W)2bXyNJUzn?nn6hH#iqv4V8nn3%BO<<(W@_40 zXp`yXa`d;b-~_#O1Ae3F@*SZ!YwWoc15ME4udFGOXetQBZV%J`-|cB&z@{CwSm?Uh z=$bY!5FSFM;eq*YVadHB?z!rL2t@U`TZ~@EA9e~5OzywEHG8=z?S&Og^KVzWMr6X# zzrdzo=PL5m{C%NeOVHkO`?BCIBIC>BvOAq2T{7KfR+n!fw#9KRWT!`aRT#xfpxc_KCE)fj<(QLK3hgo{8lW!246uTL@ ziu6Bqk3OJHX1;VBwp(kzOBeA86>w;|VDk42K07PwNgJxjj5S)b9G-)RQ2tt@@`t0l+&o$5|UH89rJ)~IweoII?Nc^1>igGy3HR&t%)8m2F`STg?At`4IeFu{x zd!47Vj}ia9)_7~_<(P3YtABN5(ZzT^hf#1LAKIoRx-YE=uPj+^8Jc$)dfFzXoGU1o zi+Ww=bxcU;t=>*ngz^~PETSq+>5Du`bCY9g?2=!cdLb9HL=7yrMh$kFYbYhSebM9$ z4vLgF?$`S}ecsYG1VtGE4--8usUq);)GY4%O|?e*Is=O$Q>Yf*u38YsAbbm}NzJ&f zBv!1C(mAhJbwoBPp$nGCgbtg8McGqQNblRG=-QIj<1tr# z0k-=Ku}e2CCY-yi$2yJ*P)AtO3=;D@UO}Rcnifvk zkp8W(cAJu8!J|Njk5@jBr3Wk3Wdk#H__yq;dxUq%!$7H2z`xG$#iTv=OW8*DJU+xifK^8i78?t6Og^zhQK!o*B zYA|NF&BV|KW!46En)Pphe1g{<$yA|AEmR%46Z)Y{0;k6?h<6XKV;`1EoAQVRS_`Ex zmg{cS&f$K!cRWOpv@w9aiM%MiA!lR5D-@Q=8lvCpH6TwXJ1(ltbylVgKIraD1|nGc zR@ISwrqRP%22yH>(Ea)j@PDAdvJ8g%Zcud9Mc5c`|LRoi3{3=4d3tX6s z%k`bggNqRxWyCyptn{_QB$y8C#|Ro=)>`Vu@3-`Dagok7`Yz{-H%IWs{hEE})^9U~ z8a)%9{FOUW#IL*JxkSWgXNT(zC6IQTm${6Y>{;$hnmW#EDSJ$TCU%3lqR-{<3K;G8 zM4^yM48oW=$}uaX1$nQ8u6#&0$UyCESMD3A%*ifwzBTf??KbO&OAM2-6PCO9Zn|<{ zKC@S3){PV{rbNh1co|@~2e;$oqHG4bQ;N`AZ%ZD+F&OzA!N5}@XSk!m(nlep;2G1F z1O1L^XSooG`Fxab)m(ORU}h|36^r5Btbgp*c_Ag4xbUMkK$Ht=n&D$8G1dNpHDUg1 z->R4&pktV>N}&pcjfq}C!vniqra~4W5eC6MB(tJGc?roQP2S8q+>4RMQ=TJ_qGza# z89kP2Bov45;z5mm3+=TPdk@w}8ki`2rb|G+3Sm`liQ3r8v|_Cd+$#?OI}`zZX^2Oe zYTo-TM1qT%Yc8v8Ov~57ufSfc3t&%VehrnpB9fin&lKI52PqDx8`GA!qJMhUIW3V` z+(+*dJf!p`^5xn!y8RW1mAo3>+z^>}eRcEvIlTZ+r6}eUxNiOjYy=>$l=xl|jgwEb zM*7-93S$0VSH9@tA5FuFexH|)*qahMH*wxZLnrVH{xH6>>%#zc@H=Y1ekxXWk#G;u ztv~oiMkzka;Ux1&hdUNFm8vAJha+Ka2mGVyLnqVOJB*a|&`f0mZ~@dWgx7X-Z8|gU zE?(#Fv()2Aj}_BZ1EGS%mw97#&C-X@=#jZuU4`ukNG~3=jtG*67Xdw{syxm zO%VR+pUcUV3LAqxAg2>06EvyMpUsARC>qugB*bF&T9obs{Lf_?;pmk#2?jo1`WP7M zz~^HA1C?wK>2jNh_lCl{gcbtgXCz{U2JW>XtjG^JJ3G$$qWef~qxdP)+qs{Tb0iu!8m*C}2qbO=wo=ye#YL zu(WUr%r^$1x-SYK7=&?%-ZZ~(Gvb-)3 z^>#;ou!Xc?U#b*5A6Y8n9=tpXY!BN_$Tv;D$`1!KuFDI7P95FqT8G#R@A>k*dC(8! z#G6tGhKoUj$}WA&OLnI~82I*dJL<%J#Eo3=kH#?p!mUsF?A*e2v%qIBFo7h2OrugvQ zJ>m9cLf=LildhnPH*K*z(Pv@yKI}X(CllezQRr#L1$OxUkZBmyr_m@w{N(zcVRTJ@ zpzfcW^-GQeH)Yi5qqTu4<6q5X16g%T5@p)%1d_Awp8gNXbb3lz@u@3(wkFrx9Qkzt z)HQ`Y_dxkRCX#pS^O^_QFH7!qH{OnxoAhKxsZ8hIZgKw_Agdn|;B`hQc{X5_V}rMH zQ7*a`{st+nNa)2W^tTV|3As7U(;XI<2xWoPMJT#!Nw^mxuTsvdnMUs#*Gtz@{94u ziDiik2MjyC$J7=|Hzeuu4M&D_EMy!jF!N*ns1F#*JAV+g^0r}s1pqG5XeGr}hZ-3q zx72!w{jzhECDvju+s`ZW{IqiKs?%M$N7DGUc0$=1BP zk3g$sdFh5Yfb@a78|mtxQw3qkn9| zd@i#LkKphBs)5RN85B2)CDk~)j*<}+;G}fY?&h$__x+}j>J{nLED!}Ic$s2#1qE+v zm9*52jN5R`D-8M6IXnAd(3_Z_d|ZL?${W-fF@RYvz%9$?>ivA#@y2uXVtISmZ7rQx zV3jTlip)@hQe!23`|Kq`mSSP$Eb&2OYP21>G4F4$V62KB8SF;lYoLpXR>UE8TI`>( z=Bm&jPP?_#u_Ee6gHNxs>cuZWSqpsf#CQ8Z>(4VG*#>G~FIu?nuDc-sp15*BM#J}7 z6`jr?Fsre*=2UjGW7o=V)hdq26Boq8)ZS_AQUyG&O4l~9ck?8w|rI5 zi3N9)RhtAylQqsn6-Y-{73ZX~Yh{Fuh*`X)s;2P*4sI&YF?PF=CqD|e4fyoLPovp> zANJm9bdupmPl9$Wkd3Uh6nvM7GD42@=lU4ZbA|NOC)1eBT=K6>RPVk04Obv+3kQYh zt4e*zQ(9cvuW^&iv^v2z=>T?pamvj#Lf4LSq`s`EtTOay*>ASpEhimc0T3HR>)dy4 zD{36JT81lo{XP9Gb^T-tlA(aY1sND#wj+G(*2>HRX?0z1;Lqt>Pekw4EH}k`V#ExG z_L9=BWTh@Lz@w5HVrl`uw|C<`ScR3T&m+&}TIfgl)~k#y6fY(&l8V&Cx1wIeYQMlP z%|#$qzW(n*22%ZZL;Yaa=(L;dI5oD8dwm{p%~bP(=xRPVt4>#N14%gJ+h?`*bA~1I zE~Rp~;Zwi}aSu_3v;RVsS_Mqg@Yrd-sA-rMopsiH?D`=F2&`F z#9t7*lB2VMk-y@U9Ap}$V{KP6k0XPwg$WKb@_`onhR|-z#!nYjK*IBxG9(Cx|DIAE znS4GO#;vhJ!HS%wu9UTcNOdgjLdZ+Nfl+B zgz~~=9XpvPsa)ta4|jre{B^T#W18~7m#yjMuc@hlQMTXIPZwg4ib>8L%t}`~wvtgytNWr32!EOC%I>gZdY*8uQ8LQy@9 zqffV%D5T&bfsEswrabev?@1S4m%W!UE@pOr%+2?OYLbolg!+k0=}}HoBeD8FP;4W|uA}?5uoK^2i__qyI@Z~Q z&i-P(>1I_odP6tv34zFJ)Du<*kLXOAJ;jOE)|!`Z5c5NVSbX(8bd-5~@;P znECK`v_p-Ro0;oOw`w2%v0cLa6zyce5^AB#JH+oJsxBRCha@!ihDI9~bCI7U-7wVW z(ly|;X(cNQMp;w~5BS1?Uw*k%yQt%%o-oiQI}iS59KF|qyX19(EWOgE+K>7i5osGf zH5Apy7iXH_LOVy2P;o*{Qz9T#2!KFYSUlKTb?b{%PWpFm8l1XP{L6hIHBD<6D&3?V z2{D=C&XDHNkD897uq5qAyS z+(;T?9V=>2?K`7EtD^%R4~6n@e>m%5+~n(rEcEAe1C4;>M5D{(pwu0`si{|^kWuXf zaMm%H?sY#*y?>ABO67;-)MO40&iQVhW-R`pu2foP>yNsI$ceo7K&uqw$G?F8Om^_X zd^4K%w{iY7p^m>mQCbw6n(4U`5Y32kCdKo^lQsl-oBAfhSIV>n38!W@=8|jH&s2ph z?$r$Xx=udNl9fBBtr8FgyiWIDb}0V@G){tsphSvEQde6*H<8$}#i2MF7jzv@5{5d> z(lzq0Ep7b0VH1?IOASW;^~j3PRfB}cAU{)Rx>rG!@vZ?V!7Iq9jRL<#yN@1WB< zU#nt@?y6Nw34EUgM%29n$$%(_jg=_@G9j95anvN)#p@svjrETBczOj|#x*BgVT1ZL z<++I#yeA(bE}0G!)uX>96HKO@5?k&<^e7!G0MSJC2S|V;4+O$(mYCbQwe=QF`{ zi~|>>JX5hP-{(W@fH5hL_s>uB;?~ zN;DF@X77NpTB%-vdGm@BR_2;fBLre)T!V#5r@5Z6-jJ%>r3})*b@cdUcZ9sfXn&iw zH5W~t^5&MGE~%)t`t1i)Li(cM37FanrlW#4Hv(kT-$F@^}M_=lo;)WO!d;_-Aqny zcSz+~3U0&6k_gmZnZ&POBnZWqFP0-$U_DscCBp6_NOd(6_vD$mEKqDESMIGJmq;=q zrZ^2g^iJC@=na#(T*cO z-sA|Klzcq~$tURH8Tz%3&y)x`U7fi7Hn57C^y6c%YH-64$R&yxy zcZVLr$eORV$;LCCji`W#vkZFGc2h`fPyB-L(dBw-$5`#7|3DYs7K9ek&Zpy7R=3Jx zJ4%HGD&v<+vcdho7X-Xy36a7=f^t2IV|9P84|+rY*_-@goz**foI5K1`rRKIDAI4r z(p-vF^djhrvhKt6T#S6nTV(8ekVl<+;IOm%T)uT4ur7jm$DWJ;0BeC$G)a|09C;|+77j@YQUh(?t0t~($1l}s90r71K#b&IVzSVGA0T@y(=o& z*(5P6t@+e+@@j5UN-Kj~lOf97pAjx{7DM!V`t3 z7sJY7Q$svyZYPxMqUjD%Q;w`30PS`5p_XXRyVvzT=R{K%i63cBg9{{^2#^|m)-|xW z-u9Ni*e1#=Q+*WWm*8%{WMFxTJ^ng3tjDfL&S?R)R#{}{?U*C+A1EO!qN4x4RMM@7 zn6+^Q904>5G+31d@}s9-@h*#l*kY(<94cN9h={078?TQyq-0?*21*xldtt*8I^pTtf0{txUk*3 z;eHC(8m-MmWH+})6(-4w9VZk6*!?#Y|DGCf|98<;w z-YDi67koYox4I!8ZSVHaNtN%1*ilIykr==L&lGShHn}eURj-({+a(Em=@uh>A*VLW z3gc@H$tOB-vShd6;^=Q7tS{o?)lMjn(mN-|mMF;y#H^_(AE9p`6ORvr$kPjlo%E^c z1u&pJAJ&FSAw^QDd=Xr+b*nUOgnbv8ARLEtwWZU&9iH9q!U#1`2qsYNZ zB=ef;(bnu9ONx6TI{QquP@S>zbvKrql?{oc=tm06rN-jd*z!a>o8{W$xwVy56@G&q z5iEH8+*NVP{lWCD>God`Y49i8h(c8@>f84tpVJ}sVr=J&^}5B+!Y8;YpL}i(!_O&Q zAGfo&vXzE(=!P*a58{Qd8wwFy9adh4)6EOATT0#i?O6_bvNH<1#y*q0vc_ zT9)jwEXBNdYpbXp|EPH3J)!v|Cug%+VI^-0{o{0cyR*&@&hl41Y){(4akYmbaGULZ zHTi!FrQXOHd~na*6F}g(!D|*KH9SfY@2UQ*2-W^HRjJDe%q56%h@~=e(LE_@0=;xdU1gpBma zHz6~dfs!ll)1GyXtl26tZs&X=bURyy6}hr6o>Oovc6WUg3?*p0}Zbq5koSnuFc&afZkYgt&a) z>g#$u{<10BRI^+n6Cu_|+Fx_1Q7XYed9yQ7$kB}~ei|&e;)qiQg*hMG`~j0BjzlJQ zI3gj`o;7xx0arSQ>ek`Mc@A+*yUjMQQZ1tJ*)@Qk58BF2>M>n_U^{(ayPZ@OwG1cK$&tBl*L=|d%_ zJT@UPT#hS`PS|3#&WgStw3&pa0JqtE%sNfsva=R>-qMt{%EEl{ zW8tTwC-fX2gAtakeX9-vW6V!?rW-g8{BjnX#_qGlSYRKtXVx{NVJsA=h`hl?QB?+$ zwt;4Xig>VAvJs<2F-u5mU-nKC8SP0_60IXuy zkrfP6Dw(5bpsx9uIl=d1{6Y-x>EeXzwIw)_v6$bp+%zQ%DveGR;0d7CHL=^k0Rwaf z5j*4t6Mf&rrAN(ZIO`?KTAL8@A;s{T8NM~OlT<2I4$n1G=#nZ4+5oz9+6(p(2waR#TRoqwpyQMn@1m<9xJM5U1l>jHh0iP| zOo1Io^@&I^&Q|QI{iiG9Y<^r0R8^__U z!J{s^!`XKN`>4?y@4nYZs-S8kji^KqHM#u4XS9uR2&p^kl0gA`zr|sE@JcS)lsF{l z29Fy?uZMY&wInKP+kq@OpCo_3d1JR5_Ch8f_`%0+tGl5RUhrzj?%gtdpWTOtJn1wQGVgHN)OW#@&L2v^wur^!xmTMR%e^QOWBn(;d{=!fS!br;S5dsppli4qp9SbQhWFK@EOd zk8`+Y>1pcCfOzDWQ2%7y^MPA(3R5<0hLqP%2}9dlPv*Jl(fTDzW?)K72Q3b~RE4fh zaRpv;!PvWF*-{R~)io?CEf$_@)-@9Jyb?tx%{9@OTT6NM7GWwh2Dp#edhD^9%%L-I zMBH3Rg9At2uj+w|w`!aJsQcSK)dsJ}|GyTyak?bE$oEzTLveyEtHV3!psG zUmoLKI*Gb2rIWxY150^C9XI(^<`9efk&<^UsoRiW1sagT_GuOP5_g=qHfmDFx=-?c z;eQpX$`~~KGJ#)G5UE!$^eiMG9))$`E?X5`%8hHQl`znGWFk;E;-(aMA>}pI9om#O z`b%s`i!Tz|bWq>1sekK9lD_w2@g0j_%O$s?Y4kPsz;Klgg#5wfyTx)8g~e!#b8;!k z=2=C9LkO@_XoiKyp1eA*VFdqV_%ey2Tpt^W9#)q_hD!_sbaSrKrD@G)snAudw`X?L zN(0oMXH5Ap^1>tifq*tf1ZHiHBD8|m2i-N#YY4&NJ9IomO`%^bOf8NR4>Q7(Jhki2 zi%R|8D?cgLl>pa#Ni1k7T--CSR~-rI>>xz0xxI;*N?NEiH^STb=Es`;BsDC#;UYbf zuJ>e&p&xqDF9|!)M>l9#mA4ntInCzP^^x%J3bkeD#9Ri~CQwdGtSr$VN1+XdVqSW$ zdqK4U?@&{>2ISS{+fNIi51Vy5{X92&TV@c2H7}{VRX&fi2E%$5V_*;@Xk(ICVB5{T zlSTU-Nh%T&tO(#<+=H5va;!37-rlf3-)JnU>GxRV(JZVe(<*>pW|HF`b=QQR{QUJ9 z6*%>{NtLhcCFUh@;e;uOm-gZcl=>G|&c!Zz05L}a*&l50_UtM(CRSw1A} zOF;&3y0}wqAoo~N?>cPeL{9(k7Zc&aIw}4*X+@ls)tLwRZ#eQ{mDR))<@-QRw?j;f zk~<5kw{@SI($`tqYf0egD~KLCE+Gw7nx&vDQ^6Z$k2>-ff<_=@PN3XdME;ex7>!kQteDFqeK8KmDc-k{t^Z zv~QHTOuAKSAEv-NNdp8m*r# zS(3?Fn2$Kza2je1oCW5KZ&wTkVjOx*&3%$HD5DVc-!6eqj7nR{3ppy0n9(ylG-05O zdv*s1KiZcc5AewN5EMA+Ya}4UX&EWi_0^(Pqg_Rj8 zX_&2;H(kmd=%3`ZhLw=v{gCuz`XnDxW&~IdLM%5B@XO_r=?{W7Fqpfe^d8-yyz=_< z;Z}>ZS%p26vIR%}a7f}ANj&JI86@CI*^Y(%e}z ztanw04Sz+&sjl;UbJovBDjKSirAgj|FHPWfN}QV7+}+}||Fw=X#XHh=^xnaQ@N`pt z6M?P4E<6lu3*P{FkiMjeb+$(}#kV_70d=^Q90eA9FQn z^jPFER`j9!vWAxMyGJ16ev|rfO4UTUzbXjB)+c8xNj$0^;x=s7LTL)|(4>3VUmPYr zXI%PbqglY6E)0u-ZIZZB`V|3R-xaq$%|`S}H}-8ur3;ck%bROinx{*Ezx)-qyWalBH}0n9 zFM>>RSIW4Dxh%MY%fdlWZB3WD(|4Wrr?R2GYEnW3e=|#BGaY8ukFithr^V(&>p>+N09Y90m3Py)hv_z(32S11!q%|OK@bZsR>eg?@vhc13;*&s zO5?@D{v_89H?6aL>)4T{JRiX&Ed!{c?_4eU$!{;LI=XM~j2D=)n{2})#chZ%xdBt| zL>0ht3*V^`7f&Vfv0-<$yzg++4h0I*p%~KWmdE>1)}JMKZp9FO(uX9 zUm`0=oL64%sRh0Z#G%G8rEe_VfV=P|MHw9Ux(McBe$9lOQ=GsmJekI+aBnW%>Kc(u zl-q`_bKO^P=6FV(=hcaJdX2RT)HXc*uST?Y47{Ugbw;MBK z7kx^;A$r_%Oa;Zsiw`aBd_J{AO4Q6b9kl@XJ(Ak9=L;Xk^P?`y~Mg=3eTxV;WLXnQ9Q$20lhC_tR^IJ@FCg z&ELI52ii!r`P_B3k2O;5STbeTSbsR!pbL1IYAAsLzvAUny1|+&$R1!pUjdr~p@THV*K(O(u zq)gs>*U4~CTSvS!Nsf_ksyS5-i}>BM0$9w&)T~VaR5Ewwk2K$drjSP+oykeW=Yd7* z$aQFw5^)vxfY&Dz;(wr~-;+&^FP_o_(lfKDZ1VGz}^+4&x~nvseQ zp58%nxn>dn7QR@x{p{M}bydpHLS!DuoCr{wWLeAD>`~IlmV=v@ayaio+%U-}1W~Ph zGl~~5>8vB$$MGt@g4ZP(IpG)lL5J2BcU@&}3H4GY=aPd?mw$^?=TW|g_Tz7;QA3!W z9g_cBmFANvY?CmeSpB)HvkG%rNBVc*gYd_`|Gu-)!ALh>QsL#^-Evg!q~eW<)Lndm zxy~!^TZ1IIiKsXzrZF(Ct(kbDuZd`|d>^>z=nAerP|0<>_QH4rGZ>ib8hssR?>tx0 zj#@L6-do!`&&pZ~OdRjJ{zsE>UF|~gXU1m#%2P=L?TSmIO50WOj$DKnDL>;qg*rc5 zJcTw&mcwnjM>W> zI^g>KZ@{7Z31h)f{?%dLkaPUT0G2T73E_2{F<&-Tokb$ZDhYxHgWN>&|Zq*Z%}B~KjU9xcLu0PT;5 zQ|Z#eI((R|Lzk(t9#J;{rhW;j1?Q@5M>Au%dO=@9BvZ|11=|N{?8f~D3uP0Dx0D4~ z>Oj5`@z6z;tPq{||55W-qa&pF;w%#KQbc3!O&CxzG$gXa2pv;(OO=ISWw{Qhlez+@ zlgjXqVV-s5(H2pxP-#DfOPu%sIM3a8gXwu;1kE6-Y>?D>{>44s{6qX_w>a}0L8}_Q z(KSY3(QrmfF-Bfj!?z&PPT>ucbw^Zc0<$!Wkwu=r5Xd&GZJcf_i9qC#o_;?G9y7V1 zBfY1us-J%QBD$ZG1#EfOk&8d-BRdt}{AR=s0qST6E8;8{$|0!vxZ{T+L-}lc%r20p z(t4z@r=w-ZqE^*&*Zi|`;sRNtTK7^!DlmFs78M*po|wro<5wTP7}yZBiK`A)SHtI@ z{rMO#A$j|M_HeO7_nvYR?ioGghj<3ccRwPZ*CDIHVOP@R8M{!ZCC zrIf`SN6VDOP~R8bx_;Om^|DX(R=+=|9} zf>6=LYc6~8X{Re~&AR$^6b&wPL+m-;m5E=G{D0xG%w{2EjL8zo1(|-&@_qCNipcxQ zUOOgX7tjHie&ya|$7O_$gOQqMc(u(es93tC9osU5U)S-2A9mFpi5v{oHH1v=Hl*rv zJ*Nz7koAg@dmByzc;ChA!$QiVf~OaVWidSn?-==U1G2-)7kwmGt_XYve0F#8k-h;R z0Y#up_Bv*$lGG3T7H+E58}sW-0O^)k(1__xg+d+HV^-f84ao$d_wU}8t1c!&{ldaQ zXcrNmHgf*%&U6GYSH&Np z+#{aJ5+Z;^h?H2MCSYLlekA`mMq2(`Tt?uHN5afMnsAB~B0E6P2w>e;8BhX8ux9?y zGv%j@_?1^5)`f=!_q4E55%8*K`Fy-iwh>*ReQvUdI~xWLGdTJnyW`gy)Dl3b$Lt^+jCes?i zAkH=7bT=#m)A#;E&7grjsuH7?RX|tlv^D!#ojaHTT0xsEx`h)ujyJm7_gT+N;I)BG zoIJ{l+^U59Vr$(uhFF? zS?dP5T)iPdzM_sec(g|mxuk&i(}#vntl81ken61t9W9t|dvUuy5@GV`!j>>eBd5mn zcM{pfdLRj-cJHT)>#+_rkO2`NJ)i!utfVdA?u+?;PPZ|vskqfSQ2gI+ z?Hb%EvnOCTt^Ab7(rZ3tA`#@=ZoXpU;{G$@qMvriM%0;O!f5G9ZWpdg79in0NRX<# zssOMgc>TIlx>Xrv0j+w*d_zS(Qp>aOB1+}`;I8G4NcVAx z7>RLhU}Tde@aryWv~&vHNxkHh@VQzKE7oGLYyvo}1Nh#%S?C%poW5v(EIzxNa9Htg z#4E28THwM?Eh_j!!w^0&KbrQ_ecsh7d@;|d_Iur#YTxI58^BTGzUh$D=BrR46+1ck zn?qdTdH3G0GXC&@3`0qvV1^6VpItiJRGlzy7`!=y$Judcc%V)o%rCF5g1_bljSni8 zjD-i%yi{c%YQS9X?Unbs%|2FPP(t0k%11~H1ieSZX0#F?wTBQoRme|sxLD=?i0vJP z@Y-Ym`xk!HW3C-t;s~HL;TSP0QFC`yz>zmGlB%>57ax;Get8JsZav{3n$6p|y&W?! zKU!F&r?4xMC+1zH-S}5?%{BQug7OOgsQ1_j(H>Isob)Vo3AS(o5I@T<0Law2PMT*E zAa=vB{m&F%^H+Ipj($t?k-ryaAEIyT)Ji5)_YUXYRO>zKC5Dz+8@CJiA|-thn83>u zt+nWZo+JdQOh6)FLC&n}E`$t4uxb`HlYtD@w$ma?f;eglxJ~d3BuQW5A75 zF)dbh;urEhMF0eVbt1k7=N^D?U+zgdS5aDMnDilf*@%?XYVGwH^a1GjU+3ETG-WI;|v4srDFGONC zRn*MYq2PwIbDx{$fF0{;~QRDq4?JU2?*4&-s8^}3ojjsJ7VHH1Gv=pBBErj>hfbxSO9pzm`6XD7( z5a>lz+_*mWjmk;dEIbL;*G}4&{9V%0bLxbbL%v+&{u!$UN)h?+Cfoic1fM5=u916o zsI&_ZlP+#8dg}IATRz_<$fz!NjK^V%8z$+jP_f; z$i^tBNpqT-J7bjtof5y5)M?&}*>r|wb}ZhyS4x^tKXu~v7G7q8-kA)+ULA#UshD4v` zL7fdnLja91H1Z}SlQec!S`E@8X?Rk3$bKKvxZ=oV?JKTJtcnl3#P8eg;zc{Bx2&Re z?LGWP!<4BjGCYdc+^0CxX{h_^Jp1CRMNO=#CzL1S^_dc`dyOW!m4%z0X}9jFHTrOm znI;7chxJt+4>HSumlY$==M+XIZ4ZaZYJN#k`u)_tm8b8ixgqJ0w_(7+`AHl+GP=wT zwDD%t58trIJsMlUXKGP1;83V@vMV|_EJ$eK4rYx33iGzge@>&Ux{1%WPk3`_xfQmf z&!`lzq?VdYjb;#ms<#51+v9$@b=c(}M^dIsk-Es#rD#WRAbRA-WLWy30lxIMCgzWp z>wMlAhvC94PO{DiO*s41+3`~~MjBsm84<|9F*(^c0*oI61g-mf%uvCdlEs5owc2*UGSpV#+D<0jkeeX%ENd*DURL5 zJQ*pod9zMD2D<+4L78X)iv@~dHmvJ21HB(Pg|Ld5BSzIDs{n)B>;D)!7k{SrKaP)$x!>hB_qlg*naeOX*OB`@IptPHl2K&J<`QCNu1Sm0 zTtigCaTH;r!a|ZHnM-mjmqhCK`~Cwi4`1JXKJWMI^?WvB`xY`i`Ll4)u7{cf-|nvU z8q3HR=#pOd^(!yg_f;?Y0lr;BT?HM7#WmvP)o)1+%gRrbPV}l&JSg^hFRBEr*6>$6mXmx z{#jRX%d+3kOE7VwPt(xV13MB)uTsKx8C;zPul5E(#_!YcE(!9ImWhL^BK)+l_vOS| zgwxVa#mka)3yErxEJfWIV+mU&-nlHfnm57$4~_?|j6Zcrqh)ZQloC5^oqE9z*RQE; ztnbZ!@J@AqsAOmA#8G76!dIjNhh=NOe)4Q-+BFmfpy@7Y1oSD~Ia;oHeEZl3qWFlG zp2UL&?cB(ff^yecc1b8pF$+6zvg|8FnEj0;HIuhkUen=R8sh^aCV%Nd0F=IM?Z$$!sXU*O&h=azy5?^RW;o6a?j)4Wf9;^NPt=&I_%IMl<*O9>R_c^1AO-?KRCd0i^fsURanVC#T}l zol8Qv_pOTy<%u#UnAx`93ErK?p*J?H0}FZ6ps3El)7)BR4u-5#Ea`+!<{x@`!Rp){ z?V#($FSOE`xFx|tmP*(*kT8x^D-xdF)x&H?PlL?btBJavJp|T^8nfWRQlWja2eiAbj zli5@{lpah)?$Pmzg;-s{dN6DM=gVtYC_TCGAY8aEhkJmd0mLT^GYwckH_A8^d0Qj8 z0rrwIY?gG(UW2g6`iD zAJ)oAM7WgPHiH5WWbsoaUJUe66xTNtW|TPBh58Ee9a9Nr3q=8#9QnAA&|Z*GWv#A< zst6xvLdryQs24db+n{5JbhC;kDA)M5xZD+NRTus>(ORTT)z)tAKGDk}gdZaf$!%aC zE1#lEN0PuDW>R1jT;Z)vfX@dW?`hF%j(c z&Sa^$s92gW;7u_`z91O2okGyJ}xj&WS3Qgu^q0q&OYkuIZtR zRLrQT6jfkgk%vo9p#9 z)Qpb1_pZ95CR;7H=PL6yt~F8kZj$}286?MFYK zXOggZWRS=MDc+aB{sCO8Eur?i?gw3VK2gb9fcs_e-(rDY!xivU>QjfLu)XC58L=yv z*%aUKXR4!)=NMj{YWAUZP~)<)TaT|>DjE1*;+9s>+esb|?v0;FFZa__YMKr{Q~RPisymjqnJm|9-KOLu%zP`IZ}B5+spk$F24Zsa<_S$!r;! zi`PdqQ@^Py@*jHJ*q+AkT&2s&h5cI2{dQVx$$`g9qiS4;lJeuI@pK4t9q`iz4=-M2 zIBTfC2-PNPr*<7gRypPAy4^hVa!Jtavjo`UpeBdwf#HIbxTFnqi)voLQr39+3GgE= zv-!!}g_mbc6BPCATAXd4Wg-FHCi^1WV0ETQI;*JLY;CSwdO#OywRb`EW?@sX~PF1$vZjr41^+$;2Aqzw8RuW|D$>y9VR=x zhB;2X&pI_BC2a7KiwE6D4~>0c_*1s3RlU&45NIytO1Bt1fLz^ebb;A1fjU>TR5a0U zT9|U=BdOXsG-|f$ch^MEGC=thVWOHUyE)JpP1$j-dg(bjvJQX@R3lzbycE3Xw>s5eSF3Ba>D}Q@C~XqA zdo2zROG7fE&QZjV&b>1gw*ZldzlCy6@;K6H5XZ=Y>DZJLi4 z3Lbm=Z095D8*fdhttNh2c`EIr-4z{Xe7gTDcLN1INm`r}y|nDO#q*e1qW3b7La86S zzF$Znw;cXYz$-F%stQm}VP&9-tvbiLh3?TPyXRi^==_+ihIeD$FV zbEcp;jO1X(QtWDsZcy=jy1ADAal1kF;ju5!0&>{Is@I1mPlDN>q_HKhyMCJ6ldx2# z`FM1==846Jp0RR^JM8>^VonRdd9o384(bbG0=&$YNFWW;-lcqXnG!NhcqmG2mXRho zoZkXUHco9hYGW!wiFBx}5eXGp7u*Jq)klqeVS51}yz`hz zn9eb`&bs8=dLY;PI#LDaLX%YD{UzXbjqX?IwRbhj<{=SBdql>fS9Yz6D1EOEACNHD z-`3CxOeoTDZiB{gZ5jJttpymHn6t0Kn1rw&Rd4*1F7E?w(;ewo`X5vGGu?1rT_?C_ zZY|!NWm|dPD6G`~3aTQu@q9^n)FPM+Q!Umm=x7B;+Y59tc3QAd6u9QwjfhCXy==}`zjd_#in z%4Ls6!Qrn@Yf1^6s7gG3P?M^>l9Tz*a0cbqN{!lW{j+HVN@TQ*tcskFutm;G<9g;_ zrxC;;@s&;oczHxdF^#CJ5q zUM`7|`hj6fx?Mwt?8e~fFz12K+F(V(g!WychH{d-%f;H4a2sn$r>g4MK0?k}DX!B( zlc^>nbwJ$)>uW*Sqnn0w#QwedC}f+gk*_s=s~#I!)beGwRxe$A@+!hK7>g%ALbVN7 z@AEe4HvI14ugZ=Ycbl-eP(|C@!hrjLx0hFf{Dm>M9-Q<*FG|#{9cS}{f*J&!Od@`= z?-LGJSD(mn1vMJ52ohW=tB?wNA&B?dRAI2i_1}{*$Heq8teCD^s?e+(wiawFk&s#r zO2Cs)^;~EzX?_rSdW-;E<|K?df4JhnJCl@(T~OK9#~wYklp2cT*Y`mU|4t%Oy~@^)Kr?nNpGO7h-PuUgk_Q7!8`WOGA6 zvDN~zO%_`bIZm_39pcQu1tSJ^p|lZNy`@s|+v7D-H}k!Nb}r^(7Uv0}#U3BL9A$?V z5B(ZVjJp1*LzILXt@4mwX~KGeetNFVJIf)QGej4C`Ljf)fGc9{V2UpXTj| z8G759XCy=Zu|Uu>l!Fm%Qs15wXGjtZ1&=QuVrKwgDH=XdZZ_f5Y~orVsI#~4Ym&4KLgA_Q!J*_#R)eYXs9}%M zc)@YM8)T8nKT(W4uo>`kL8kA0H<I#Hze#{|W@gfyYgB7js!<+PkMjc`ts#m&tok?$!MM#vJll!4O+gyCea$`OUJrRe$wdufP zJ9$~$;3Qzm(8-Q#h|XN3M9vEG*?jMk-P>>4^wQ8{CVOexp8m13%hYZ0nv@bVw3es# z3`-Mj!{$iKCt}T{6XgPi-llz6byCrhn>LAOx*PjJGM`-TI~wE{c*%M5_i844Zbb^D zz1`ZMj)p@3^sbcIsdL)!Y$eoh50C8wP&r?h_}Z^>0c?`R-pWe8u|u;W+Vaw9 zm?XMGz2Lja->U}Gkwey}7EnBh7ELwUwY{xXTXq6W3UGPkpojUG@t>Qy<$J@FI_bDr zux24Jj7*)N>W~(Ev)q}aHtu@4c>r9-FG1deiF^Dr=oROiDzy_KCo z%ULE9yj8rgU(FZplYFT{ln={{L^ui<4(h&?<6q6;!GCf9=EGqhoM{cKAHP?rU_*fn z7ufpQxfdu$#1*d;<=4}dYT|6ZYioQ}RpEB@aFm)p;aJ3sPt7R?+&wJ( z%>C4SNbJBxk_u9ASK3cPdQ_h{23QZS9QIdC3gZ7>oL%`&Pn3eKppbR=RAe7G2aVtq z*bt})4*hG?T_?)eJ#w;7UKM6<)$QaZNkcI=Tr5h^qWx86T5QS63d-<%b;S8*9d@cK`UJlU?fnX?UgFHq2<6 zl2(=r+R1-afQv~4J!pwPV4n_=Q8slWc!=BeEB4@YIh92pClLDTS0<+(*iD~%-kvKd zJ6mxVV8Q7W5nqJ)Snzo#svrGuTL>x2e_15RrvR1$i?zx2E|k9P{IoJx7DNR(IQ6Y- z%l7l3&$iM_vs*<0-tg`^5!C2G zahDF)2sz;2_V71=2-6yLc&gqL8D41CQ`*qRM2vau41czg%d{BQB5kNq~k+}7WC?2YP!05g;*0ifFF zzE+3RRtkOzoRm-~@O6ui==?qT$Li^%{Ru3d8t>b7e^~6m_7cJ87hA>Wd$U%NM@5@V%_Dwu; z@d>&td|?c{mhYSroM{N&|5qNFT2k>@oswSQix-o{%zsA@H@f&KwdsHpfjPfyUW{4q z0woj)RVz&3CiVdi|a_ulIO^e&=`kk5N&C7<(`GGcXAh>n*dk9R%IdW1osb=6UKU;B(T7cod#h z6bFpXP}B=5V{wFHrjQkSZSWXm-J%7cL6Jfm)89Y3!G?sM%t-j_BN?)ZS-iS|HX#~M z?j1exjq}*3a){r-mlv+<8*mUpj#d#ss_1Vqf1Y^QGZ5WR))BukXdq!}_EVF(j;Q=% zS@EBD=chucR5m5qS8mz?oY!*;jv7+3T8woK_^D@jvBB`TO{km@j|KUXN-y$|?Mh-T zr=rXCk`!8#dK)_fGO?oes6$^hVvzGilTk-PyPl-lF>m(ocR}Lf-XwS1aca46M%;rs zX9bOi68e2|P?ZUnNMKGnQ-1uPZYI>NSd1;h2ZdeCmAoXD$#jGh^Ypcl-rE2i!}-Fl zWFltPyA9HtzP;P9bdr-EzBAG8%=XlTg2=(J@#y!(?Z>1l1O2*8Tf>OBF}K|Sc1YZZ zuy2u!i|nN{)YIuzSO= zH0$#KlUK^!bQ}5!MCn-#DjwKiO=bFPXBAa^sM24O^$4#&^p?($g#gjqc0h+w#CRjG2s+W<*k^PHmynTWHY+ipIAed_45^=LSUlUilr(USW zN>81TcACB%RQuKpsTeiUWui;-ZsA`s_9(8p6&SG}c!qiG47W`iCAjvi50=&X_%2LqNnv-*%U zj@=scQUF#PVQXFp6tG&o7##xqK6WBj7ssU4?H*2mKTF%V_>sdUEaKfbIB%tO?X5Gj zE$MM*E5i;aBrp??oB`WH>KNe|k)#5@QP+YCET*nUtlB!b3Ybq~aaT$8vt}Ev$9lW8 zDs;)rg6XR@p)Clr)oE|VO&#WS1l&SYNc2q-JvV35A`V%P2uu2_lq~-QaY`L{T8uRy z_}#TLvyf3Y{K14#3?~i5g@1p*4rJ#JkG;A+cID;WQ#Ptf6P4!!dAf+^b)|+$S~Y6p z+-@l$BsBdJen2SA9A6IU1sq=5vb8q;b8I(VfZbSDx#n}wQpvW z_+&4xu6Y$WNz)1wC|O5QO{dvcR0tPK)=hTB>L5F$$mwE>&HQ`hae_SG5l2zCNGkL3 z1`@Gp>nGm{FrVB$6T4L@gz*!q`aU;$lI0(tZT<9LDGDmZ7n`rOyjQRL^5_8-U(TC( z(ywW(0r_*qm^VYi4Vd+{%_gt3&F>BJ*=)|}_cZX3$RN=wI!`c2pr@W&>!3^NU46CY zf_q1elVSJ;0-Gx80sze;J3?PuboH$mmx)I}4@8}x=w;UtCYP$`IU-CDSUxCjV~Vb3oJQhi zqhn6$^R0gFiK4Q2=EET6Lp9YJc{YU#X@oyfgNpnC;GI*lfAAh&_U>jYvC4sv5C6<| z^=%Ro9uk2ZY>MY}IW$&)Pi`#-if2ST)0TY?zp7}2kqOTL*qD>T;v7YSfPfTD3>C?+ zXCgB0KbWEh;a}23E_qOo1cn&8Et_T=_I;U1S!w@c3&o@6VV09Q11i^I2n#LyyjbFO zE?^W?*4VEB6jTii{h%)}UYW)sPCr-C!dk>y!UXAD|9*m0nM!m-q8GtKMxGC{Q&0{H z6ADu_1B|lOxGY(gTjo9Z^>ynWEYHUY)Ne0a8zITPEf+uoki19d&G=C1_VRvTTOsku z7(g1yG@z{N*8t6N>aNDEnPysqo9&5y_gj)LMvj8XISueTM8t0X1_B` ziC(GD0ZOx}Pe4}zh>Vx5EX8Ce6~NtBiKQ2@!`Xa%kdU5wNw6}0j?}u*1JojPryvLT zUmikuPMz%(sZC^_Ci16&>MXiXNN8x?lwEwN{Bx!U*$-# z4ZCG@K|t{>HJ#$#4sszI>;PZ*O<$K~4x>f0#m?;uYpU_5N)9%Ab*_QSIl!opK*IaV zNxa3-uW_KwXDmzQ)!<(am9%BFm&m8g=r?LwJ!AQZqn8YFYW!tk`*i-P3mflgZ1#lg zo1k!^`N?84?Ov@8=uV@H6ZFGts(aXYmLBvZ{&0?3;zdgEf%kT|4M<%Qde z`@X{$Z=}l_Go**`deD^|c~wKXaQI5+TA*DrCEz1~dzvc>e`;3;EZ*fi8O~f^p>lL7 z!JowM4eIGLk1w|6cN3`Plms>>8A}_NbcJf0_VBTxn8VK zEI^`bu@F!P0r#X}r2ofep57FJ`_sMkokZEsAm>sR;JHO+vOJ^&uzXMt-}O+$!`h)3?< zn|a$|5A$h1*RYI?8ADVOqDXcbqWGXTk~Daba#8LO7!=V~w9Kj~{rtVdtgbCrNrSil z(#*F--D~vHU~L)di5$0m?J!C=Z+!j|w$xA85YHCMc{+@3S{tjg{QZt66Edt+QT$Q* zmOTqxMA4;|{S2Xr?DCh~BQB3R)(9Q9g{y4;H{o)&B=Do+zmhrKh1K?I(w4!gQ@LM7 z;P!&1!4^M9yh2qCDta)iZ@RaqGg?FxCel##3ebPLScqvgPrh$N(Hi*rF{QUB@$7xX zM`_Z@tvi$PXPzM(ytQKY{`wM%Li#D618;J_)R#RJKvR2@#;z>c=MptV@T;T3U|2XL z#`~jGQ}`m{G&u}V^F3uAJP#QAV&9_4EDhEF)CGHo;3GXT^}=DRK$ZY6k1fINzz3B+ zK8g*t7*lI-|RXfC9KU6Of&a$d8>x&{WPXaIGn5vyig$X zJ=NL9F4V+QpHp5yoLef%B?GNU9Z^0mU2{-Uy>>BxSxS_>x0K>vFAQH5ph^);HMFht>0>`1;>?>3S3cpl*z;Syx@NrrG zbhr&e@0<6X4XR1#IBrt08!xedx=cyh@{aYCS#JWo#XVLbW~KBe@U(*=EotFA^pvcJ zS>LCeS1uoLSSc{+rcO^P${tejjw{r3EtS<1DERm$>(R=uaVm8@u1nFt?u=g>=nmO% zzNo;7;^K(PYSxc=*{0aJ+h_;W^=sMy1jH?7vC2kFbw)4u&a>O{V4?43QgD!`qx#YB z38QaB0|))ua(;dqMK|*qj7&5y6%9$6FOL)q;a46l661_%Rn~~0HRG)6+P$akP5}O* zhR#7b5O}IQm}&6$$3C(yxF_2Q<>&?o8oCQMjvH*1pA}hrY3Se{{T3fU(>aIh3<#RX z&(&0C&T|C&5WTTlmK8c!Ke&ge5K!gHBpSGFKBbDn@U~&Ll@oK>WZXfQmRU8r>_{lI zV#q1T_3lebR|D@MU#!)YD1ltb7ZV6JLmOZjon;p!6alv83#jazKWODEcy zv4d{hC|j*c0&x@pSU`WpNkj7-u4>J53k?<$5!ftmg#ZL~EgH z==Gt!MyU+1ey%KOVPO#@tU}b&Co3cjN;?$MJ!4-?Zd1T8J<^Yt9BQ(dq%_&m^q!`trRlgT3ETf@%9jaDl zg5m-T?z=Z*oP<>#M!e6DA~H_f<&n4oD{8Yt;t1~;c9}}4`EI&r668OGrBC!&NU%54 zD+!NDsUPc_FMhZO6QFdC+JoD(UrXloPmvUt3Hi*_fP`L$`1j-WN@LoDul8YdhLSkOmq+O|bR>9f{)iG!L$cK189 zJnct7^E>4DK|SgREijx|q1_d(fnEfn1g?PgZw8oEPAq>so}XrufA(*d-ttS zT|o|OTibtD8Z@$lpW zgfQGL;uvJiUG7x1pdCt`loUeg!8RR?gtx7^Rt3cs#-`UCYr}e(emC1=loTD@wOq!x%uZ`X1sz~UEnlB;tF+l zmMVCoB-)&Em#8cNRM2V2W}2-5Is40<=dN!#shyD^E3#-D<3xqy4}!z@8d|AF8DsS; zJ5|NTr(vzX>7Kz7CJ~Ff)^*aLf4=Ge7o5N38w+=>$D~xWt2i26HiPYHHuhS;S!2Kk zgxCtG;}qRdU%8BmCdxq}A+%Fa1nB10U4jR9T#|AgR~%}Pf{I743y1;_bi-3U5hTlM zH*N98A{G@j!Ie-j#N=xT33Um^PkJd1x@Azh7D!>BmGR75?1YU@@0oIRmgr9^Q726+rMjXdjjD%ok1`;Oqh#)#0JB7+276 z+vr=&C5+?iy{g-7tmX6LB&B9{g48o^!^E8lrKd3nV}JFE$??{$P}hMFM`uW%d1Ccq zRYF)%j-SG$TuSt*^MN6)Nm?zj(5OVN)L19QTPpHzmtv!;UoJFR;MYD%=@aFXps}2G zYyg@!?vlrJnMlSIIy?ReuvE5oj(&Dqb|=RnIt4wyx18FRuoxjHCD8w&)jb}Ay^iE@ z$DGEi+N5t!Oh@B;j|eFUaCr0*Az=+;D)!8Yg_wE}M$Y(yPygk`)eY3G#^iun6Q`XY z^ygj@3OEo`Z$Zy9)3S)qV*^Ce(y(UG)L}Xtd1oRm*(;j2WO#Ti#lj<%!euJD;&NOY z^rfDM&a4X#jYjsZ<=C{zQ{o6p?f&qRV!On6FTeh5v!4iI5==syTkSW1t8x!^GNIy( zToOxm!f)aPMXm2}FfOL?G(hZini6hvp+)d81!6^uH9{c zL#17z7UYoCJ8UW=nCOhQsQcw@uPXkdXx0-Sbf;9^Qpk(9$yxUD81g5>xIyM_$q>98 zvU~g>y(5r#+|&0v3%5FV7gF^zmEss>KYOK|YY=1|`+NRx%2Td?ZY!G0Gcdl}DIt9e zO}3Mnif&QoZmBW*nL0to0Sj8>4u4g*LmbWp_=5x0vD&hn&D@isH>PeEz74b!h%?*5 z*oR`H)4%eZ5vIP_+{ur}7)qE3rtfVzRfoR*{-%zYMwBnj^G0~D$gO(pp3o~yZOspw z3Y)goO3|G-wkR?WrW6lfaLQH}NRp0Hc@?0g{z&@b3G%U;EJX)lnJ#Bjtz%h8*{%GS zl#sam-==aQ@5}uaQWXMdN3%+ud$sp7s@)aKzNKv4nCv=MeV$?rMjW#%9XXQ zab=bftFqS1kFEHHX)UW!$O|+3CGOdVn;7+wpuRmdn<3EHuSHjd*qub{0+4HJc6v^|(|4ajnTOdSjqE1R^DNZ2)~lu)df z`@x1&>oR=y0cE%Fc%<3<)!`8f(xQ;#xnh2y`0W)0qLfvEp?m(TOpdFAr93UL zb1bL~3~gso|NAj&K5;f@N>;>zQ-1jx@2y_%;SpOsy7cgv?S>ooQs;xp*Ug%lM8Ha~ zz62zcdwr2e)QguSk+~H>fC1M1ZUIa`h5KPZ(rs9dkZ+5K9kY}`uG-2= z-CqG)dI*c@ACQp7fON?2^`tW4@u`qbFumbr@U=!43~BaJpesp= zCHImXv1+3^CC`CfV@9RN5p#8v?pwUmga|={;>?vBYF*cji?mQ&jb2|*=M8M9?r%Bj zAJ_*JM{wWY0 zgpTk)8a5!D!Vu9dlJrv%Z`Fc%yYSnEo46BPNlkPUe>z9;-*GqM0$%Of-1Q^Yc)eJ) z`uqBYy0YWC1NhFp2W56IE{T2h$Vu!q@lLtz<{%;{)X%_z8~eCqs~-~HFJ*A+WL@7^EK z#md6)<+hQNRfl7GDSN| z27quCwwk^TfRg>>{jIM8O_~JeT7I)0xl5i0ayT9mN(}CVjYAN1NJSt(H5^}M zsZZaUs}J+D0zg7N_IR?Dmt#s=TK3PY!AS^7{29L0;YF`b6PtB6zOAWd(8G$ln$xz} z1Veyvanx{bP_?C-*Bmmk^Jx9anhDZ@<(Ss z6FK`;_swR+EB9H&LtjnbT~%C}$!u)=h`;d=w$vilOucUJL3w}c7g^?dgdB{RQ`+ai zNqM6X32g@KFQInrf;-k)U<5MHuB!vr3!97&at$Cfj9JF}e85kZ2_OB@HIWndoV+@Q zkYJmKEn&vYYJ~$zVntEc8JStZo-sVDcGLq>1%VWVm0dpoz#+J;%V>hNZ74W{fLOofX;Au&>1>JnzgHqoY_gr5yv>R*b?yy8T?v2Q{5ppb1N-{8*P z1ItAYy-Kerj;N3At>|h%xC9H-2~JEkG9%N8Pu`aYPk;Tj@@Ti7h+|;++$><8AV@_KK6|KD4SYw4T;~kx+qeRoRAG8m+U|V)iyLC@DBQ6x1!R#wQRmXz^j@e- zMNXS5G;cT9Z76+?eb%(?%-XKRnh^ze`@N`sn4!FMM zGyt4u8ddzc-Yh{>bD@GBtTA;2L#0SW4ucU;J)YvFLNN&bF zfTJj>GEnG5+|zEsjzS4IAbN4X6G+^cR+JiAV|Bd?3`pX_$k6*sFK0`J`6+T8}eK#V7#I*~BR`NQ z#59j}}sroV_a5WFeNu>mKzKV{$r{Fj=bQawvZseBIsJfR?9ufuEL9^Cn9 zK+F-bQ6+S}2-UUMpu3bh0VjI&83rerv7|K5%Jcnfwr{=Q;6po{LLZNYzM3A3;vGUC zmnC@PTnq8}cpzTlkluYw>FJ<^2bUSNoyQ;}`k$x#k5%T*togi|fH|0#-;)Gp@Nu- zVkiA_fEOS5xw&_nHqlqkY|Z|)iyZWDV3j4U@>bIg3R})4=UyK*8lvATv{qNt)^7AD z*um#KES%mwXQ+$eW>wzp9K-mP-R7=eBrnk0K;TEszP)#U7Tn_GP$d=asZ)&(*=*qp zirs7;`p;;R!{(0{%6Q%!R9l zs207PAQR%LS0$MrV5HcdJhgx-F8C=>XyZ@5DyFLJtU1w{in|x9e1az+&PWNj_L;^m#QnkJY!So z_Ry_X(Wr;iSF8Nc$UOvKt3T}T)fQoKV%fjoeRq&AL&$-tzmgyG)WibkAKVmcw%h0s zuHl=xxf>+k6>_;h;p-HT9q$`qn;<-yeLX_2Fk8vC-UT z)(i9VpS7{`&OuWm{-N%zM43A0m@p5;pSE*#We-J7Xv>t~)}70&SJwe9{c(*KuUVc> zulhX|f5vd_u6n<*2uLh-gd{RPu|gI!wd$rS^=IJXRL2|NBTe9EKaPr?`^&6e3Q&0K zM(|Py)A0Tk9NIJjrhBp!zX{^FhzdSR|Ha!1zt!Y50^a3c5fWBDFmOKeu8z<>kWzdO zw${G0bk-5#n-Q>Qqd>{(IgKmL_{bdG@G{u65fVvioOR`058s6?Q#=Bxn=>irO8i?9 zf)lg<0|mNBbdLS>FL%lfbwBa_OqVsg{8ZcrZNM?AZtNa<8PCTQ*vTm&sF5cEbU&(%tPYeC+BTD#5eYE@44jccHtur(jSgLBZLmi3K#B*a z7QD}CuM%pS-`yYd9SptaY-kYlb=;-pf)*tCo!VLDWnS1WAVHMGLz(7tzS1x)}Kon5q_b*==P!8F=f z`ggqjRZoTyZ!b8F@DA=|mB>XYZjpgq|NSWrC{mmJlTM*~P)#i0i^_qe*ea4Nir|%l zXkF(v$q%fl54in4zlieUzPEe?hCYBX@GcpDoKwHQV4)7ya%u;HfYKWgY zM|i8Y6*7|M6jLlVG%0q|QMN(5j8f5V*Tz^s5{WdZb#@;aV(Pl`b;OwMEi^wc8Teh7 zICVeOK-7go@|v#2(sfq2Gl%VnXOjUOe&{XO&Y;0-Pr7o?);QyyNZ6>w54XXmioEvv zSezMB{dwe5+t53U`1goHWdk)D(YZ9Bo?q3`WuF1pPbasnbRKCd*y#T~nbywb4W%tt zk){sZQBDods(Ws`+?9nzNbxWu)GKNm@^a3`=qFY8o=znva*S1s(I}#|=xF0|q^P#j zj75bGT-3oyBF<=dG>P%buCWI+h_OkNdE_|*gl%9&$1Jjx`sa$YQ{DK$bv<4-ZTdED z{_U!{i&ek>2Li;li;UBqgWDX?)yD84Mdyo{&s6LC5y=$z-z5GX;Pcw&EW1ioB<^Ot zBy9Gmr@WLRTK}X%&!1vGxGfp zDndUWik}?s+*LI4I3}HspGigW9_uwjnfn^lYC?HSUlJ%p^^P_Bfs)%k^Potnlj}bh zJs?TyF;Rn;@~MlQUyjD0fnd>dT%4STx4#($hou9lM{J63K#Kve2X`In`|`wx6w4A^ zog7aladzS?1kl+mInP<5Irm}VmJqMGXE09iTHo#iOyaigS(sxw34DzqlyY4m-01QD;*fL& zF%u-}t3+6i1efCV#+W4mC~{pG%l}l>>ggNertWJd$_z0*oGS#b44UkH%JcFI&f0YApRuGB72BQ#7X_*?_QM%*x! zcER4L!Mv)B!qysSa;!d&Q#CE^NAYe;!aVWhN<#8Fl@#n3cK* zl<*9M45NC{jQzca=z9TW_!4WN^5sDyC_5{W5Dgyj2RCutsza<=qHYsLL4+uu*eXp^ z{Cp~Y#3D-vY~ydXxI>=0V-z)b=0r!V#f}fd*5>%x0MPZ7UB-0v`uS(%hLz6xB4g}Z z(tOH;?@g{^D+OJj0Q$IJ$e49tyBg9#vS2K*+CEh3$K-e}uNjS2K=zn>fNdHF_W`ky zCzlmG;wi#1+=?usMZSv%q`MWl(gSi9Xaf$3-{|#}aJex&8k<lcMG5i5d=#Xuzm?^8+U{IhPLVO*^chrdWSL#w%Z1cN|Gw6(; zEI%$R5-JMKf0@fA`w!#T&)SR3A({7&_Ew#>rf~0WtGRj=$bz1U%d(D-|~(tL;8&@iN31MDhQD zEZNk7go}$|Qf2pAX%#(Cj2nDY|GD`)?UL4O2W3CJ^nzUSyYrb%ct0hBeMh&XLxI%C zGAosVld_$?DnA>j@RM8TU)6i5#qf#-`Wdy}C4!3vU0;*2XAV9dPH4J&(F!|4$i56U z)WFVKIbBUVo|?2=9&VQJYi+ucUn9gg0{}P78ajsuLjGOOokrUKHiL2F9rXijWB8yS z%aLg>*FR3wKPU@&Cf_8LFh(fI?#C;3`>M!3I~cub?)l~zOkIWSy{u8SCi-anLHSY~ zu@JI+kJ{uc^9v2zZzzZqnKAdc-(M_;0d)j%C{K$-JOCw=V~+`pk;`kf5AvB!kkSGx zMh#=}nD;G)da6T&#XY$--&o26cjz*5SX%v?*{QHGB9OYd6bq-!y>J##J^nC#`szb9 zJC}hk`QXk537ZHl^(uOJr(R#*pc--L&+iG9HUONEtMjJL>J0s^flZ-4R8|@*t{QyZ z`frm5D^|gMqyU?n-m+Duw0mwazyTf0;52)M2YKEayFxJ4CZ80!-pi3Hi*^oZ=v_x1 zdSnazpaJNDRcX9wIACROe?@srwn>Ty-)4_yGW{chHX~NVU_NkCetE12i&7n`R?l&edcwSzpXStUjU*XY< zWLbKmT{tmu6%$fKD;mWS)r)aRkp3W~kh|`XZEy?NLfLQqMJ^6%<-DlPj=j6>{ay|3L3tpdf#xqjJz)LPXCoF2@#JtH1+jjb7eE zK4_Si>Jstrol7MD9&B6pG(nK!sEAX2m;t=qd+mR&i_e2JTidUSi zQBmrG>2FLC8w@n+|1er^ntOLHI+A9U4o1*FVet9HpUn~ylLg9<0wz({wv}x$ewHjp z`j!&b%NQ2B(FLXAI)yCvIIFJwRipf`MQY17;<%UqDMvsCO8M~61O{Y)+-P1dE7SQF z?#(8s;diN=wKLxktj_tcZ@R*%YzJuyipz2ZY{=1*0vS`mE*d)$RM?C1Ye zbnfv??|&TMYz(zPwjJc28Ly|g}a>;Rwa+$Kt{W5d!AZg?tqNq8g$YoP8 zxs+T=3`tb3k(}T6_qWHx!}a_9eBSTZ>-mh3pL%$y)+LDjI^KNyl#(EKi0fFZCnY7w zIarZ>d9vsl7cs_2aw3Z4CXV|k$%@Ts2ckAC2gv1bB9Gc=F|hq=;z!u9=^r&wZ0K~i zMUHb%Wx2&`arNTfqCBy*(x3!=*F;toZ<3zVOku^WIN9DL-3j-6(5Fg_u@KJdggv_P ztfNsi00SVC{v0k5LsWzurF8>ggYnWt;)RCl(?o|kVJ8VgY2Y|fo9E}l4vequJN28$RrAwTHrPnk))7vL&UzgZ;S#^<{ejAsW(A2A3uRL( z;ryh{D(M9fZu z_QkHyNvEjqBu23}bijVt(DqfS{)L}-3&oq7uZ~EZ`B*OO6g%>;RqXZ?PiB@%#|`}u z|7~OrZ_HZ#_KTc*Y)jkjdZ7q!8jfPej|yO|SljgF5#Zmk0PlabJRr&-gk^j#x7OA7 zrhep6zvnLQiD%U1!aH z{np7R(HLJJYn2JO7~uA}Z;M|MAwd(Rntw#-iZ(EUNCbzEGn-nfwe!9&ckqgP%7CS=;asL8KnQ1P)S_ z2I3h769WXGzb%w4wLfBnN{)pwnNAm@)0kH*zZ&nKVV!n29J>!IbQaPRIGBs6%}ayL z=##Ttj#hbL2R?LY1i{592JB`pPQ*g`g)Z7jjV`K$*qf2JHCj<#ep{>kLB})1&Q@$m zkH@jyfBx3i4j|sXx8i+y@;}h2+e2fc%qI+=y&dK;hr!PnU_YLti8bHi(=dqOU7K(0 zb!u$_0WTcsp!5)p4dw|ozk?T4R(T?ZDe#bAxqU?98Rq!dNpBWK7%o|{)g0jCMoMyZ zcV;qDs1fjbrC5<4Y%=KYTkl|HLaZ!HvlyenpvtyhimqL z(o%vzH?^3u6z?Nal8@^yhS|MWd#Nap_hf^j`%p9U)K1g%Nd%m}lv*!hH-(jI!$4N6A@f!DnG z?k&{$jTgdj${sh8@=T#ysH8i&5P68_moKs zAje`CRy@%`~e#? zDwO2A@3rP>(0y10>QyFa-FMMB6;SQOq>4A62rTvg!*6@e%{B#8_fiL4Yj*Jb)EGrp zNAZZZYA~EFQvw$^!83_}11pVG(%0)BOMWmuYym9HfESE9)|yw~IlwMz0RWG6dh@$GWB4rpU3ri~=?MLz!?n-AlXEME^M7Y^u$63~KS{>UlMnNC7 z{0OGJt!lUYm|P7_$7Sp`@IBWBj)G?lt(tgL*BbQ}Jv2(1F7mcU`Zr}EnbSn8M1GId zR<|(^8Ftkw%zEZtDRQTOU0catEPki5vdZ{6;&(__24il60t-v39#DALeKJ&P%ersY zK_v%Ntv~#97gA$H;{a7Y>~MUeBQN99LWr!`(MMiAG2D|jVjE#C{4|NxcM1(N0wv>x zPu`Zr2&A7dch&vr^bo_+FonN0!+j3d!KSiBTSgGH(rCnFqM zjEf!;&8)l=JaZ%=3Rlk>kHAbX7tf6@0o9-k2%|jO9__8Rv4Q^B0X!22vlbwm7O8^y z%?fUUJC#o|#U%40?Fc;2O+~tSlgU<<_K;kwOz>18xr`#z3c{}tyft_gF8Co2>5+Wk z-iwYF7bYy^?|IHBB3S@-$nVOmkSr;ASS-x#)>|H)xBSdN`;xjQp+vZt(|Sc4~S7%qihe)?4=LN&6*}vV!5?%F2GoFUcqu8VGOWWsp}8?048Z$@Qp8c zfOeA?ZgTKpE2TrxPt1^Q=@gW*kPi$=9Vyi*oav$ZjA&Al?<=>D zvLtzJS_c4RsnT+R(N#YwR~1yzPE(_k3b6ByFD_j+jT;8lYBeZHiQ{zhnga>b2<7t8 zK$VsX2_l|uEhSqS!}sb9WaJ=M zu70sl1Qnu$V-;hh5k$nOz_5gxdb8A^anROI_2dvVle)rz*B2tQg_N zXl2eSqa$dhNCad`veKp#3r9wv(67S+hMd~V*&004^N)Q)6xB!{8)^;AA|1Yv=gTjo z%yNd$+(f!=Hd0twukmnPf_RN8?DA@vl)yTMGwbRUv+o|z;8WyCN#QNk6}ecmcom&M zlmi@oIh!g;joDt?u1P3zf&U(3YpJ|U5{e#KN@~}fO(g_)G!qmn}RVrm8u9A zb5<=BRoJuJQzh`1D4+qwfmW?AseRiN?QNJFvlXVCe_=Z_q&X9+?;K+T{)n@lw zC_%XYxStX$m8ulBE+=^x`s-?~W|RH&UtpFR2enf}nsf?UBxn7V*30QO{Wqpj_XICN z`~!@>Tw{G)Z5WUy7xV?XYHZvyWP!PU%M}2K@+?E#G1;aaBzB`eWR_zyITOD+9A<1J zNf9?nNfj2t?)F3Sl}VdK4EDF~v}#E{!!|gO^8kx`5H{LYC_(3qDOwQ`%G><$Vt_(5 z>_QV3yZ59*^zvk8l6W_XaLfX3Hlpd0qW^M-t=w7NKa$tY{(Y`r(66sw+U%NE+28K% zmdBEg(cFwOgv7+YZDzF_wElJ2^}{KR(p|`nM1OdwgZAe?Up8vu2t(-?DQ0M~H8u z^_1NC*TB?m0NVrKIV>7ki!vVNu0-*a?ax^m^^$id9`pLU z=~e@r<|44pugMO)@TAoh;eI9K!V_}zkdbLxcQSH_k03aOW&5BINm*(De zWpO|YF1cAwG~#bj;A$m>91-C_7#)F2tp$jy^{i*(QOY5>*(16u%HJ`XV*fSMnp=;@H zcd=yoE%Ob!Q%g%Gn!!s~>9y^)?S)KbOKpklC2OT2LqrGGW@Ncir-L4i!hTLCBV z*91yzgG~4x0;hpSW*p)QnH8 zH+}qP;cQg6(RcICTC_}(ka=e%+Q-jd#f_pZg;#w6jSyi)L3=`E4l`@>px|x=42p(gudggT|S>~2pU1HW^KvAxaZMK3x z{$80RmeEdI!MtG=&VG-CB+Ta%a=+JRwn@Ouw&qLZhzhIRFu3>>7_=>0YFS`MxgqL) z>{jF)<8JwgP{w()jm`!|Wg!)p_8h@MHq5-XDf^3_^c(SJeutc47l(E2kb=KzI=>Cp zAIps)JaEkRv45`Es>KkH=GNT-8%yQ|*mudzOdSffm*sB3$P9ReBIkvz)2SG7~B_<+vi z!0uPvSEDt0SqriH3TE>SY77Kp{8XUNn~e>!heQ*vJgcfxAO)#ZezhU|cDfOMvm)+5 z+i?*y6Of`ae=A14XEBmsw%n!WL$`siA;FE%7PILj%qjyALX1uctM))}hGhwP`D%2P zq681tRO>C{9~C+&6t@|fL0Fe*7NL2u4YU1?U|X^f{*Og0ykGMrq5K->Kae^AqKZ>k zs8JI$yX5SikR>CT+Y$yxx#r#)-}HdE74{N=2Pm{;_JzxBfoOaLWVbr&gmI?Xzp;FL zkn3!~Zh8Kw)3t!yAGMdw#P02l8wQH-#jkkMN9Nz}5f+|PJ~`Megu7(nTpb%i&cyIz zhOy91ca|3E;Qlw*BLJ5j$8Ual^+UGbF#{Jd%RRi7jE_?Q^k5b}4p?_=vaqj6)7zCf zA;?-+B}Q9{oQ) z1J*(+lTy)s!<}8aP5Z2I`oO+f?kEGM3Z6=#q>s2wyBH4Z7-1?WMaaty7LHPXkY>fk zRxEG!%I66kG}PamU}LAt6J-WNoR%Svn>GEs@(mF|V*E~a9tsiiHybbCa1c(j_@hg5 z-04co(yQ3jpI(DGXgM=pa1BAKLO|*M;~M!+2cMMI8SoqtF@itk$Ea(DIQCuY<{eg0 zio{Fou3v4OEDfqqnLx)A=ws97WMt?3kb2QSa)JL{mkP zDQS8xS(u!0KqvnP(glYQ1Xs)FMk&N)S=QWw(O2tOc`#>{KKENETu5|5$$r&2Ow@vI-7s5C zCEDk>ZDvA-gUZz{AOxq1RaHj2$;%HZ?3X=iGU`80ySW0~63G0S7AeYIjd>Ya2Yt!x z0Na!;$mb6~s}>x26#fj(L1>;s;foQy0&TB7%xdB3aw$YNLXkwwzooC5zXz&(akDphZy? z%_vF_IQ7@QS7Cybo+Rx<8el~*o+qr?@oJ$J2G|B$j+ZJ0d}kAYBM&iP_6CI#qQH#w9`G28EfL>pChJ%Dp0hU+ZI@8P{o&Ih{wYs;&!U9BnaXW z|A8vBk5Y1`&OKLrXq@rDe8v3z?=VM|_I&o=tAw`XF5W(Bue{LDQk&=x!W0cQR2^F)aF$i&2M}XCh#}Df~jGr3=S* z8jsTFh+44Gw3it(K=$^Yz`5L1i+^N6h7@;3ly1}Iz7MYM+|34~HpQITI1Q?v8_jqI z*uSo-YH;uS3QM&9MtcSNtjz=?zu>b`S9zP>f}Y`S9-W*1_Zm0s)}(Z&i4HQZKKzPR?1k!m z65*a--X{T*9j1T|8yTWFP7R9EbN|qnLs5X_mlX|$`@`y5w8Moi51aV^c=!AyACWT? zd7~d9!MDo(Km6*KDTuV&py(hRpmBiv+<8hZ2y4o&!DY41piNt`T;GOpz6J;*rRWjd<{Odg8#qyDs~xK1=Zg2%5wVSjBUfd?FCB5N*XP^} z{^)wwHs9Q)Kg)nQksO+Z7z>p1RDuGpEH5wFY^Ohzq&Bzpr^~Y~oFh4Rn&El|u%~A6 z@zIH8`GfSW?w;D)$u=8PBpN=V`Qcwv#P1ue8)v!>M_MSJ zm6UVPLWod&{d!2Obzl^9+KqKLDQ+1V`oO1T_*87ab6RTAoj)l9)Ih281@V>llB|Uk z%!`Cw-Ph7kS>Ol5^Q)`{fuyv*-g5)+C}T^GUU@XWB#VXEEPK>9F(_xAGsTok{_!~V zONe&%t3mGN#c-7-VCVJQs4(yfeMxy{(hKw{xX5r4u4ur$0^*MU5hHN3e zZ}@|*0O(*k-7!QUpDvLQEK3lC&j}#yWxZA12w2Rr(TR4R}s z%l5q~6(b)vtn^$xMZWbQXkT$G(zSk6$ghm+-@(?_qofV%q&8t5eWDt2RB~lRi0C=; zo7S&3Yflz?7RuUFoRVRT4$ui9a~4zZQS=iaza9%!Np&FD?&Shv&4S5l=w3RcEWh3C z&avf>Wlj#0+4NiY4KmNTNLC`A;vuwB!i=&i$qAo9!~lA+}4HrKEC+ za#Dj{c75X~ipf0*w%z-^TaQ(0tZl1$0lf*lUp=E5Rp9CQB9{M91W>)gZ<}B7@|p*pGEmtkzFRs&7yv9d$VKB$exqOY}oPLOG!$a(1qz5 z^#Q(wt>vun6Pl!)_5$fVmP(v*=>bryk3&J;)pb~3%7|0@cWcgziI9o1H=?vwG;jR8$G7EZy(BL z%ELbEc~HfcYjun-r^3IDA(kkmRm4~bXC-$PUwgtLeQc`gMQga$VuXP1AR!V1*bGH| zn#y^!bJ78`@Z+-TZpaR$K~10Ux1xMVEZX$N%CBnb}5qR9+w zt!BC^d%R3q>a4onNL`1gBbnh&g~0$WeqZ9>uYT*=i1^muX6vnWt1~Cm6xwKC61@6` ztqXS)4Ya*pA-iR1iVm4p9uFN2hLsWEQw^MyowZTKDLU32p4sdE2>v9>=fEqj*V zmXc%$cbV*FsIgh=YK5(pjw$1V{82l>-(dr@DGo_Fud(ocP^nOn+yWN(OND42!u;F= zHU;5gmXy7ElwbZR^%yw+AKtQhPH&+3uk>h6<(H6@UbdiH#jnl}=+ zYb1p3DXO3-hB(s!Tno9D?-IUyl|ZvIC6DRorK?;8Sgu7GyS%iEx^JX>iw}MziA5Iz zvA^OEyyeIRvx({xe+ggy+}2&kxy;jk>K|oE`Sx>UWIRXkn;~s)JnCj$)SvBt>;c*P z!Nk$dxy?0)%FRj3XokI;p+{a9vue>{`eWJkyH0Vpa3&s;e=!^)r(GRyfpt5-O(j*C z8Ou~eY^(aWL0l7g09af!yGy4*>_Xe%>wj1(pZ)v-|?5^t@)Ic4%v^D z|EE-;xhMIVu%FbOA->kH!CD;VcFFo?yUVQo=4;r_J!H>`@}{W&+UJ`aH# zp)>GaNiJ|~bF`Thhi?ne^4C@U#etWJI>4C9^BIW$=GdRlc<$TP?KNj?0rr@f^t)63 zYdOo>DW$-C*WEi<-GD@mhkCS;l>dCNIpW4C9M4`FKAaN{B>er_Qg3{#!SSoHmi7CD z=sh=FFI>sq44|{5jJ$!XSeE&{kP(Z6*BsALSEt7P4wZ6wDV@5E{T)^aqIhGV-|-E6 zPc9ALApdfMPJkM5$m^b$TCj-x;pu4Y0M6*} z+#k#V?ISZ6?O)ns_-HiB-xvA8fnuhNz5OxPh(h!(en5vm?dp!%ME(_#c*h!5}HPB+J z`WoprMX~+$&QT1qQPh(C58l`g{~0U8ITnAN_H#mNP=jkrSsS1TC%w6bJd4^MfW4D3 z$gq}sQ9o!=BP1l+WBs(EWWLl?;%U#Ih`u)XeoQ1Vi<$l0x{eRxiIBM1#>LL#bkz1Y z$L^9&RDwHc-7wxm{@2VI!dWBYg%W_cs`>EJ3~gDw*wwK*Gd$IT9DC{m05m@ji-(T3 zF&FVqW7w4KsyP$yjh~ah$X)Wgi@J#)D zYBE^Nu=_zz{v-Km>v`*xcu$qeAz!yhFieQM(09jKcBjYfei4I z$j9;ivlTvxiTvqta!BgN(@G8Z_ zz-;qb(qB=;0XV>0(EeLj%+&~@7&HJ|#DB#o%jDMZb;_`MnkDc-p~Iwi2WYp+$sI`D z_vC)nkcbhxv9j2s1;APlqfw()OJHf3CAdL@M1r;f9A&JGf0QZk;ep<}xqoX`w`cqW ziY%6%S%J&tROfSd(5gMZx@?0ez5+dPZdiS08<@kzhvfB1Rv4~%ps1JPzM8lh+vdM( zTXjmhK;>2Nt4+#CGs+e3W#kQxNcJ=!*^o&$cLmk*vLNZ}gZYH^l#QQSKY``D7}Nhv zWR_O(2Svv9w|5&pWc zXZvLBfD;TR@L*;_jdyi+s)5wH2VsQ4~i+N)=&7Bxb(g z5(Ln?V-MS>k4)N8&Xk|B#FxzSL|H~-(j#%E2IB5RnlCj51V+i%_9rwX#D92=NYoQGq7J~VvNB0s^z<~`~^YRaN2W>(X0ahvFOTIZ7VGpGf!}3gQ~lXdLyluZ~2O!eVS~3A%u2 z{=Qly1l+mR81acUYT?r1P|z-M0{hMBZ_Bd`9}@f1nFLYvD+WbTS{wA+(8VqWfzr5- zykf9^jMZb_KEf%7us7Cx6&{(IQTTKS_h#bY%a4682+L+buHmaw%(m`L77ZwOTGF>0 zolqL)W2+U~QbDwbn_?XzZv@Y<7N$~Kv>LP_4JyY)VkH`Ywyt*Pu>`sldF`;hUoBhk z@Ptd4y=;`5*)wPLM;gcsuF8EQ&as9m(mTN6IUsv{g*Hm_@k)#voTs`_7LL#puklZY z<@A1p-*d`T@AiNV4QZk)qvGe5QeN;J;P600nv;W=4nt>HD1-exS()|7`0?8GpQ(jyBj5$gMz!g*Krj044 zA-L8Az$JhlfXRwfrzD!6@orbE?3{`;;g!Kq82_uQmKVUl3T8MOe?Q2GXr3~nlY=@1 zByV8}!grG^v{Ax`p8RQr9H3$5hfw~xRZ9(>lL%pn>OHAV@H&o3 zM9K%i|GV!-7)0T0J*;nLG>(EQ+F2N*TYO3o9Ne;+0&5nX?)R zw+c~A5PTyHO1NK`XG$mG#SwhorBx$G_Q`XHo>H8kzu1h)ArC7Zj=1}~0%rqX-Mp6$ zW)oUbifs_{Q8DsPe@IfV>&vLMJ1*k}9`Yp0$_T=L)JSE?SO}rBy+6A6Mg5vcZ{&)* zy2B&%Ub>@g_4{Kai703Oqk&stXYxnNZbH9UvftK})jC&*>iPM-Xt94i3!Lektdlm- zW6h>HVQM@Q(Cui_(Zvj#FhW|R!4M^T%sj1MvPHfkq_w08-LnGBOXt}^yk9$w;S}dq zH^VzF9je1O&RI^c3=yMk%qoCA7%Pfm0?ww&dZnGe|H-zm{b;vYGOg^UzUp!ex$GWj zj2da;_QpL{8mg?L?)wl)HHoeEAhu1n^_v#xs}17tzqMJDsifYkYYs_>MtiLa3zN{v z(|~oT%a~32^$%8tKVuSvb2Yj}IhrM2wUU@e62LiyjA5+aqHhuor;A?Jd*~|Q~eBv^1JkBaDt}h(?aA-q8|KhBz zy)Cy@J9P7tGGthoC^$%RelFh7QR@=mGyLXk!wBf!L69emH3!i^$<*l{n6pCn%DbKR z_@&{y{QYsoM`}?56qC!;$um8;?=HB8$rJiHeW_Sv17A?MRpA|9=s+F_Xhu4vin7G8 z|A7>peZWD-qA=_l2Z!u}xE*F){X1x4kpz2f>f_VZJBxVjOii& zY&$U;CnFl7QBOvsvy8w&(4k~$C z)@ITU-m_ij-@4^-z?e9t^PtBT$$k7bJ5ycUa7Zcoah+=zzUM5RxU^IsG;LM|cIQFOPVUmYD(=b~`;R5fM+ZO&mwXp*8U$x{bx z77cVN8VG^(5UHz?@f`MTI`4ofxk7oJ!89SM;U6?vjWiJ)eEC5K} zsd{RX2$hnZdjxOMP8AnzB}8?3#21{d?@@xtrMQdLn}itT5+tdvEa;y%tUYqR!-K(I zX}TCjlPQ3RGF%yC!W&X~`xBbZ>@*~4v;aAvo2I&h3w@-2U3(uS zN*o)_^Pwg=^l)Wk+fE@kFqdL}+Z+wE7?~+pr#i4)DycTcP=T|fBQ%c%Q>DL&)R-<8 z*&I55Rxzkb-xaCLPonaxELbbq{C36J*YIg*qYoPVob$hK?aI999q<%ekP)E={CjQ1 zD^N&@VWH?SS!>;c6}ZhI;P4haihE#-)-eKt-Q6Faowqz7WxM| z%RA-WWn@16^uWvh_E8;3+ zWR%f&8)!MBG{0ITnF5b0+pNgD8qA(wlicZ%KS_K5RmA(;2O1=%i<#O=Iv+(_fFtk<{&~?SkaSDXjh;?q5Z^&d@T9q z%hskCI zKL1YH>Q-;;4Ja3#z0r_)oL@`^dABU>Xca=7)YE8drwWAB5aVr=&bK+7WxnDUy~4=n z*46=mc610EUMq(HakUslXy%*<1E)=pIN&qc7a0u~+yQ^U2x0!bGenN01X?d2b1tUh&$3TZ5Opt9-YunZQ^m zX)~i=et^jPoJ~r`tDi_AzAZ_P#eN&JaO4jhGbaHYg+`6z$v1h3Ea+L$Lbem-TCHU` zsmILYnCEiZ%E#}_WAN^|^1{(iIP1KqkAuHZK6WNa_00nGrVktY{KNz%JE<`HIzPbQ$$cex+?}HNq$I_#jsi zihK)p;9bBLi33TvTKHay77O1dmKE3+K40Hibvthrltfq?ZB_^INvy97)~i_EIJn*p zHJ1Dbw!96j-*3q`(xZoUA|QB$57;pHk?!Abc)#5ACNI==fRQkYb_9#7nbd-{|A*ah zmn8ll=-lAkNQvOn<*6K6+FE32<%sQ=bz_)z65OBHGX38*xx`G^KpJsJL=Tkqo@;j zUNoMU@x6a=Se~!AuT&F88OSRc;{t#sg4s!G^-ZLjQA9hre=eSREr(3HTjNerXs448 zi;vUMK%i#GRO-XsM{@^HcMd);BGY6e>ST=d=gOsrjMhO<{eR6Tq11Xew2>`vNa`A+ z{g&p7c;cOxDeInj)L7t$7TD2$3H~b5R4j>&+p~k%twzEL!!=VE7{&K`)l!>kCk0CO z;2~dulSyw2@uh#jP}jB^0!ZYmyg*t_^gk=yKmP+=IBl)+q#9J4(wpvQ!cD#C~PevEbT z!KFa45@ttDo(wkfskO6Hij*<K5D3Y>*52&zX5_Mt{J zdjJ-Fy8aOyY)1C-A>7fhz^qMGk63*?vG^tWPM9}KA~RzFxJOJVRK*racaY2M>N5)B zRGNK&Qu?9Mae~SOr4s}1x9Jb)Z|nJHWj*N;b8z=QP_B?nv?J4i(znnTtr9q~!_vjK zK#$LG4Zo`vF!F~JQD)k3GJfzskas+GDenVQ0|P<0nY&k~a%;jY)x2g4SI#N=#6+5x z)H&L-AH(#na8kK9`})wD4xp& zJU?*MvIZlB6)s>m48~xLgn5oi*a1&S*@Ga{Z+F6ktYo=o+(LG=Y_!5Udl6oxRqtQq zvawB+^)PRA&{nr*sj-%@?1PXKeNBmfm&^rcL9Gp8dqGA*VK$V6cMZ(HB&7?vE53|l zWDziJm{M~IZ3OcFi@UsCuV`HYLf>ij=?96VE{tZ2y=a9&_ve!Yx#mOm7(#A~sAv-0 z2QYyk+)8`^4rWpmP>#t3G^%}rmc0E6O8fnQEc7M>pkzKkKHd4hB0?Gwm^2FM)@opH zG+Qkccd;54C3R5czr#R5>38a!Ml?;q&%A&URkDN*9BH{!DuvQ%5AJN}bjL5>sXx4$ zWi6b#4ea z0nZYFnH*O(Mn~qyb1gVf-#o*b>~gV3T&>m%IWdD=9V;&bSNQ>xi_Dy-D$O9(0ZNT# zPg^x#)GRtrmuUo}`s|n8OjR?U<6SN_70+0vFJytmhYdve(O}SzevnZ#JB+F}LwX|n zFEkx}!b149qViLE79XYW@9sZl-UOV+Yy0Io3T4T|R2RyBxGbV{xEGgOt1q-@zfJ}^ zP$AYg_kX-?Q7xHJVy$B!Mc z98EJnPv`kpB)Iea6&TJ)zYp~2ei@Dv%g?YR=foTCMrv5Rk}a7=v>+rsIjjP{_&;CV zIr%vKAS?W>oTFlzh2nWpZ zk%`ib+dwwCEZN3v!?;Ws5w~}f8l=`ali<~UnNn&|%0@o%RFqusX9HB$xer~yb|fU= zb~9H-A0ddSuw34#q?Rs2ck4!=^XT#fk`**<4xD6wyRl-VL(@v$8=Z0RDU5{cRXiQp z(hl&S5pSqP4HPnp&nhVzu#?{wb?0gzejgkby}5Pt>@Xg1V4P<0&sZx*`x={D4VY5y zvfdEryibRRQqB&l-WUlJ zb`oS;1D72&aiDBEcG7=@d57JFU)Rt<ogt91<$$S| z4L>v(Qs0;d3ZL6)u(G10b6?|D=-z|-BTZ22N*K-4CIu4fayRR&+(I{}XF=tY13Fns z2$xGf`w*F)%-}cmyGQE{0IxZ|m2Gj-7Z7k*zTZK3uRQ01yW-w2EhT;|F`^@{Bqe6; z&gz*~F^H-p&695pmik-we5aKBE7XtGccTsHNq3HU$zhRCbq1wvGx&Mf_`QM+X;{TX zzG;rdzq>NK$_uyCKkW2NK+U#*3eRbkJc=TXzVUPK#y!vA0Jz99qCod@$m!(i&iNXB zI4>E1heBW)=0zn(9>ZXDs5g<;GTL)7YqqH<5dkn8wdrYv2vWUd=P;jNZTI~6ShD3Y zxU7ZtJT)ZEfa1AaApX-$&e)liB=R3(x8oa`U&WNmTw`Cv06@!igV+pQHG^ zJrdp7&qtYpk>|e3p0x!+%ltnR!-OOU+99Ep$wErpKcOh>z&14hGZ7b|O!Xi8}FUf0duAYeuF>4h> zvV8+XuGl|bQppiwyi-#JKS4x$m&&P!{Bx9&>v%#=?@09H$gR4efQ^(#uPVp@JU|!Q za@sZk3|mBiJ>Q==b^J&)fb*4gW(Nj@c}8$mx2on&OG|D%cC_`m9jih<|BsxbKpdNR zt_wa{qWYbbRf})zn!ZmytE(RIMZ62$DX2oivQIkXS*k*ck)bofqjxdg?E9ab(LR*= zH^#UxDMnI}32yxLyg3Uq#n-kho>l?L(N_H$Kda$#wsoOBhO=s|inm1U@(w*|azrgE zY{6|v(jTo7TUnDJ_Gu{z+if^HFrvH|ESYDw;3SLri_W+Gb34CDP z1D9HyYGa=SjeHF%9Mh`dTU4n?2CkMe`5G-Smv&=0MbBlN$ynzfoJdrZ1(5rrUwQ1e z{Z*&dnpNSV^f4=6?xwzrsPTG;sABRRzfnGUdh}y@V6%ZQybZWg;CECg53wB1+F6$E zOnfpzYD7Fq$n3#+Zw znl_SEP^fW)K?bt01s1Mup)#q+#E7^RJR$$A-o}kk6bgM7WX>Vncc(n|ivOMYCkZ1Z@qhg!iPaigWPb%;Cg2t+wX*N}# zJWnfjSOvhZgGzRmyx=Tb`cz*8W*`LCaEz#xzmkO=Ttr>s^sI+ix1ER^#)T-r2fuYM zY@a-(+vpoEkbNTc+eR7B?ot7S zk2W&B(u{b&%PXVPqD*iZTOSfCX6PT>;;biUwYmKJPp64VS1W@<|K%D}p`1Csu=7Wc zP#%)FM4DyHQB*z`h@_}kPBrVZ=16RW2RXCtJ^OXSpQ@jYPPi# zS|HMU2_315^d1O3ARPomK8m0e5edC0o8E*_0@5L1sEUAsfQU4yibR^IAV?61fG9!d$E3wLff2FB`1|G4egZxIF z-H|d^9mIdX8}G4g$96#EOW_k#=7MUyK>cKgzx0<2Q&q!r$LYR9gyPjxnX%yRSn0m} zua?@otjmf*5JumJv=IRcT-AzcS$==LJo!MiN38}@+|fp;LmHiJB&~&AbHV-1KC`sF zLo{)=&9Y3ceKl7fnF>BTRknx58h;w61koK*qiuko+29J{jB7$(2%^lay>oh-MPa?$ zz$Ka9E$j9{4$+F?HE$2Jm1=;-{t-y6LzL$^wB#o2@m{SRU)3XWGt;0KiykBEm4)#_(P zmua`6s5ZylbOuwih>P#lkcxWJi~R>XsG|1QkGGlpL86>=bsjBB!@(Rbv0bFR&1|87 z{DD`4FvwB|r$Mf9Z@75|;{ht3H$lVv)R0+_9KnWHOh^HS`kgUpzjyP58#G?5_KJu~9=6jWLzkjb=@Gh2Z~6}s5+?#Nd-&{%adzda{%EEjy94Hrta^qhwTkH9OI}s;TRoQI3KVb*>H&39 zpw;+)O$TN$c@2ZHpSwBjv&_b?!DU1zf~D?*9cGy6sS0IHh3XUoA9>Sz!WG zL9E1|I*ohPsVIQSojCR63KnG|UOdH&?aq^#$79}467s$s+3 zr)URq^YUofvR=*HVtl^0Tg%I9N2=Q@A8lzJZTH-BKbTOM&!ptGKROLzVBh76@>t&N zW#5p=IV|}cIn}}?Zr078I-pR*V!3arwO1i0)iS`yWDSr}#peu#uJ;P;Zn{fgxCLr5 z-A%uUo3@KS_2y69f$$|G4Jl~+NiV#c&hXWJZbz=oo-;L-TwH$J?s#L^f~k??9F^L! zp;C`Okc4v+UZ%G-cxqt64}wT;ncc+Ee2R9-HA_fh?`6{U!MTNO_6{(lW@~<1pC}{w zxdjGc6@gQwB+)D*W7{!^J?!)ddBaA4@B=r(uQ_8zkcu_}0le0yL428nK?|<0<}5^k z`=K0SjE5DE{Vbc}+ao91<8P@`X4|~41bJRsJdkAkRkvM)KyKowvA7ATTBpGWrYMP)MYEa;9hql#7OSkc| zT>E~_6F+6DLoYtZ;xFPn9 zQXEGtvxcYN;;(Zi(Bre8v?|>D62zlDDs47$`*Ap|>D2Dqr4e|r+R>z0js!RIjgK?H z$K`L#-%)RN!$1u|;*YJCb+3x(K@bOSWakQo)pS9!|C(&;AaB{1zMM|sh0HNoUkWsI zgc*GWs>}+UmOIX5+|R-6)pZyoOX|7~*80pwzF_>kSrpTuP!hW)i7@7rRRzj-#;DPm z(TZyzrwJ`ZML54YK2VRDn^og#tQepidCj;Laz=m@KUp#f&iY1}spv6--hl{^u2tU_ zLl8^pzTm(5sq~xpLwVs|X#1EZ_yXKL7HyDq^Xi|IT5M+sDA;L<3c7+1Tq z7e#fy2j8;hoe1U1P!{WAkd2wTd1OthvLp!;{|<3_=WD7ML=K$S=sFLb0H1Q9e;F}; zQZQ+tan6YC-AWs|R~WQMMiW;GjppdRI5-tME~n+ssk@X2NKY{D;b7oo-SKu`aSRfx zQ_3hby0TaTC675}B!~sF23Ydc-lNhc1)O9?s$S}wue9jRC+}*CG*C;s+ zffPzX0wY&N8YaQ_sq0PZe=HTB&?T`q25BPbX>E zHVqe{7{M@QF?rJx7UIuiFqn@c)g8t30mid)62R)+ZUS9 z4MvQpRqqMM9-_xBETrhICEQEWZ9LlX>8C9tenF3njFk$6w=ZB!c$xjxde_(Ys?%o& z#SoH5R=tccpt(A0t9A}@M%DRxM$*f<$WZn|skMs!h`FK;%RwE)!t`cas>5MizSOL-s6XiX{PmmlGAoI&3R}PXz`Qu zsfa!GNt;lJcrk0JOe#tpNzKK*cXQza$;R2ygFFWSM{5Q018oeWy8O*1Lc%D^QH+z4 zfysN6z*6;>Y>zO1X`B#M)ZrUVI|dOqwV&+ly2Qnh2fmAi(lPq%Eq96_ zgj$y24V_Y3MYCtc;gq0L6)#}H)SyJM9DE{qwppv^K^b9>ol*7+DohZiX+`(dluIl| zzDEbBqIOP)mIxfyHx;u5*g&|ZE(+;*^rQqY!*f#+( zx;dT|LfeMdFHRZxM<~(sQ+i~hM8t1@0ZK0`cuWs2_{LTgr|^h!T(lBJq!$r}vp9Qu z$cBk)sBO;A8gYvHXELc)7n%rXY^+L|ZhHbmf=Vg~WjXcDhS-FXg!#UXN{Y5iXuS{QA@t2hT^5YGZ z=ulm5{sG7!4^->d5=ivBeq__Mp(HC+;TSr<`ejv#UfsF~q6^0Eman5`=SW|4N-sT< z%#`Me?HQ?U`iL-^%-*dKh8_Ze8pPR02J+eE_y-0#ZDJlDY66LITDNOrQ4huEw!6GV zYoYD8`(f!spFk-ZZNH;E{5|yi;|M&#uXDr&t+B5hhfcS7}9%TNX3cz zKJi~kgq95*h^LqKZb2ErfLUMQM53ft97 zgUCaQBwKd=ehGeWG!MmUcdL2aGB#56U6J2C3KR|PxRVb9gAszM2IR@^8W}<|x%hIk zm=g9^CCdA<_C6E#=e@h@oid;Cm@l~{riVP9ZZi6KYE zv)p1K&qOQ!F4gAn@+F2Q=kGO*rnxa@IqK>ac%X^ciyk*c6;vFqRypZkeHAy0{OXv} zMmc_af)~Muj4bng*M(2IFg9G%G`m=l#N^L#QM{k-lx@n3<^leZQXTjCxwo%b^bK?) zN!Yv!bLaFNH3Z|}6QOLZMp$)PGq;v|`|ue0JfwXM;H_dYnTs5z)s9PgsEG@R7?d{B z1AZ(fZ^obaKBDyz4oB)VI%TV%9a<@6o*w-t67Mp{xD+qv*zF+0ee4X>FP zv*hd{Oxjc!gwI6P0k6t2116@TFlT|d`abU>DJaM_f!mqd+dQzc z)#rIkr;Il6$b#~ZoaUwo3Q^XOoH$-X(L6tEJ(`6O6rZMrL`;%a=Xh_XEe%`9PuZpn zW_~MKN>WmySOsm?<_p%tJUiIkglyRW7($@cp3k7_V0d+c;FsYbp~Z%MG35mGnMI^J zFB3V1vTv6#)2_rST~5`7undXkrg7XCatl`K@m&;%vZ4>@?W+Z2H+au+o;9R$OBdK> z5T;1f60BmAAGIqYnXi)v3?M3$L3!9v3+ZbsY=1IaIGKQKw&n7 zD=P#65{WcH?SJOLb66W>f6Yt`%iRF&=ftPytSkbVFz72x>0Y?6-T;-c)Q~ULAP+>d zGpxQ@tN-?Q*sFI%52%OeC_~mS6P%{PMQ@G0@o7;}e69Ym47QFg&hb>WxZiLoVfy8@ zMN%ycgfVIsJ6}5gL^p?j|Hs+q zFuTPufMM#d<=Z~QDmh#qUacLYU^NSJaO1XM5*0o6=IrOjy$RotVs((kknNKkSTXx4 zN7IgF!P0?1H@~rZt%q8+=$(z9>~GIyN_4E5izNO6JvlLA zo>C(}s|#3|7m`svZ2{*AnlY4(UHTrWgtGqlQ{_VZvKeB3?}1O@jdh7+WoY*`U}4;A2JETa@A{4+ zDx~KnscXMM)j>D$Th?6`3k%r1n7v0UF=i1kB`C8%--HFTe-QsE@Ce2KZU#>f%0xyW z!8jEb?DJsq!GwhSnyQDEZTmY+m5~CVv0q8@U9|EN?O0V7+s^2vI?e5^w4o(+(1u^Z7;ubDEI z_`@(wCU|uUd>0>BNesTtUO2Q5YiH@aDdGLiXYS2Qe}&Mp!T}R=Hjzb7TMsOd@Df5N z%3$(UK^RL%{*YLqnYsP+JJOrip7;Cbrl=j1{HhzDrQk^<>}unuL(G^0U93d9%{lX$ z0}x1_Sf=H%vWP?VmaiU0e3Me4cB{d7l1oaa?`yKI-Wp2>Lz3=Mc;wIkCn2imG8P_b zT3vLI*%gz6m3bqAMSYAV+5n*M(L2`2Y^C>y;P+TpiX|ekX;f{bS{L3S#^fT2xO`o< zw_C%EPc{w)t3AC`Y!rV{7J27uWumy=WPRE5_~QWw$+;APHN;W+bd;j1LgR;VdQA4h zx;e_if!BX_k9=tqZh!9Fmlyj^Ne{WsGUcd|$3$&HZ!YMk6~rQn({g|=^ipC6MbOAl z^q$_;L=rNR4dwK*IY!$}!5BeQ!@h~w0IJYT=jg^!;k8oDBeIcLb4Z~FmNRcqh9Mbf zTs1S#SZJdp8}==}#De&@*j|_JRrb5wVm$Llmz3RDf{u@-VhCU$5XJJffLRHw^bA1- z8R6V^IB=2JNds8~LY68XpTBwu9@AirCGQP){N{dijP zUgFTL+ba)EX0u+P1zKtH1)#3)*cnNeI*+o=@$Rb-40h_F`G_h-v_;8;cSXmL+Lk$$ z!B2L&Z)%I_(YXvPc%Bb;YTI$*gKAnuut4QZkh)|gcFuSR0E3lBs22AKeM_jO%c zHZHg@fnhHD%mT~76)~?pmu>uV6X{A2=>j^^9!)jGNE?0L?s;tj+_OS)7VPYLKjtQy z?Kv&L^{*KM_iK;%DUTnUU=STralFCFK@pw1dzk4Pug8iRdPMDHqZ#j@9UK{NC#Jn2_uP z3dQtb!sRmp(JrNHG)P1+4|xEhWy&PxMHAx@3#(X3>P-(Si?Y?jumqLCsx(tI8O7W% zHoNCL(;zUK1R)_0F}o%Y>lD5yY#tho;Smc2fV}fbgV(Oa_8`)3Sv76;^K~U@w`4K5 zw5ySE*?ZOIBOJr~6}bX#(RbD&(?~<35&N~=!gG{tW42fII7Jid#P#`8`J;WO6=+Fc zntaWzg{dGqaH_Xb+@vmQS|&Acotb9%a4F95yWQ>nAB0ii3&U0zhagQxJBIBtOvwar zZB~sR`IWVUAy%`A4_`evJw$=}pz*Up(O@HaCp$g3nh$H-(+@H=c_Zl%6CNB*7N^}L zbBNbD<2nKnHby*|v!jmZMg)~fJ*89|*GW|Bg=_1Uj}o}|{pt9F?1;n}XZjpDNxiIg z1dDlv@P>v*+4G5}5B#Iw)y0dU#Xvc}7TUwC#_vmHuwH>Mu~T?n3xr47gs~YUz7NvV z=i`|RfZ5{AOdNecC&M)**(H!_RZL7ReyRi_iNz1+buw1gWiaa1#YKhG`EmP0C_gpa zmmlcd2Vq0>=_tj*#>s{+XXQ`Ng3#@k2sUD0Aua{%h3EeIXvt6GjgplEbgH13V!6l@ zD$0mew`G?=hp7RnJt(N$+LH{34uCCQ%EDFM-h~n(cl^* z^Ea^+3msmTbJroO>PlsaXWdC<81hVkzp{}9hPY@YEJn%gQmSZ9m$i93pz^41$#0x0 zqh#%qklxdP!rKsHFrIqgueEK1=A@2-S}d`Emsn z!^+`$x(IL?AfTQc!ifg3V=}-7Z;H)i>;I{tb!Z8`m9xv~uc~o#xW} zBO`xS2tQ`-Iqs)yrE(6{>T^)99`!aq5Gq0!XU@k0>HBzsdYDI9E+r-B=kyavjwEQD zWuq@up~OAiL5u~dX^T#Y=FWTUUJ5bjZQCADIfnsG8VJB^?@XYZoRAE6Y(hlPppLZUT5=vWA` z2LbRB64HXqOLj&^>aE!cb{C$P(bl)7nl9ItWDLckJ~Rv6A$U~DTG@!DCmmiAlm<8aHeNf-^0hg{C1dAI#_Ak#!V0&OZTc%$5T@=Y8T+^=z7 z7j`wKhHOI=X&HM%gBjYcxq2_*ub`*-QhEaFu0eL!3j}dF;p6Nun^Bcd@m-KCw>A*% z>D&PCY8}6_i?frlW$uhNZ>s}67dqJsw^^w&!M3j93*6yd6*KVDE&*d{E zo=m1my)rp|R1EPIlts{r+fDeo)h@Wc@5|vz-Oe_U%AJ;3;x(ggMc&mr^PRk^P)-{< z>p6^-X3oQe?RiPzF5MD2&15H<*^1n<0;-jU+=4~+(@T(-QXqg~#Q>9bL_eLO}I6Hq6)=qxO{gWS8o= zsrHs|u-ZP2=5ZybFG@(yxu8tT8G=F7uo_bOp;y2{8K5CcpVFqZVZ*8?CkHa+au;uh zua~c1a;NLtpSpOAVi zKSHVzDHKf|`M`+LH%!r8Mf#=}a%nYwG0@GliTT~XP_%rdDXH}0Dy?xP=j8acst zwQ*FQ9J^O-%KSY5LbhYLyAZHDCX@cxe5S5haf-1zd-nZETHryM<8o+4XU;`z&yn3d zeZEAkofDs|LRtA9_6%8sz#Rq(k%GuzvhF#-?8BuPk1VF=^9OiV4nEA!z4{InF;;<- zJKp+TDf>T$ng?v{IffKV{7K4%Rl{g-e^CP~G_v%5tksCY^5RXc07-Nu{c={MfVWUV z&<@C$#aWf<47kM@Ny!U;`Gt*7qcKY6=@~|V!LIX}ZAx#^jVt**67P!WEUnJZ?QfYh z&*jlXyPH9az31j)$G@OH@+*8Bw!ohTvxpnBW*J2Vp+ww57u#GG@;J}n)Frah10*FM z?qFj`6Q!vgl+OMBl6kon!L$tV8>k z0uspf94nRQNUs8^&Pusw{xT7aHG69vDsEy4Sm?l$&tx?HvS4~`Y58RUaStYw&6oZK zgeYiM74b=3i$MC!8XCQ!bL|KDSzQ}H+si{&)fT7D6f`A=DrVb?ybZZXA8?1^y4^)L zx0~!afRcdXV5GGhFFVMACWkNrA^2?Gp9|+c)ZMaJuITZ=7FK)n#f-N3W;>DMJw37J zR)IOos}eE5$)(aHHIrfgK^#h|80Lcr3^ErIvtbgQnrLUl46dyCKBTW7hVjemgIuCC z(fh6Fem-@ir4v**o$@w5q~3`->G7glusU!e**XyD7eBJNTkG2|jF9Wu@J%^8+i_$g z-79>$rH@j*dM>_){NZkf@P;8(i?WASsFv3r{v4VO8;mryLwe6a8u>CQB_LMxo)Lpr8Ym1p!w^<`JUn|EiLkg+kc=+XEP4av5|F?0NYS*-JNK?r zrWxfp1YD1nrPyf`ZQHBB3-%5prGz@THIry`xog}_oVm`#ffUC{38`%W(`T)nBP%QI zX@4djLXR6?$EKc}+za(J8KXxM!g1!)6zvm%DnHp@iV6(Y331bT4B_j%`6TXE2kngs zS6VIXza_lYFW6}Zu?xJZ=GgK!&4q-nuaiF&7V{c0DN#tAgDLB;@bltwqU?}xgY=II z4Vx$x1Ix%KDk{q3l=z3hdv6|XH)F~!Ij79|Qzb@H=-!a79+8(Oos<(~)7R&Lkm@Cv zI-K>G^1|LQ@M$WJfguA8Mf}xNG>&YWUS99*5i~VPBW+u{bXRflI`9sqmk;87&NP*2 zc&Ov`WB3gnoqZ6b1{7UJ&3Q0HneW0dg3)I~lch;bySgrnjR=GlpnAc*Co}ikg0g3D z?stqq9ICIHAh}D^_xEC}LSFH9iS7g%(J-=QF4jF1%hw%ge<2V_C@+pbHCL|CpX8o9 z4(Y8PxvGiaFZnSvlSS9^$kA=Ta#6V)fh}B$5mpdTe1}M*4%ElRqlTZnfmvsMG0PZ% zjVeUJEzUZl0O*KLSVeuaXz$z~AmE%yX4bjPYV8(BJ^{7OgK6iKZ|V!@!T4BFk1H!Y z-WV2f$`$3R*bJelkeUDr6gNz*4%!*>B@-DSB_v8Y ziKi*Z;R-|S)wpLc#De5ocrvcM@1bbZ=EwHcBRhc2y=O5;y;oufPo>*k)=oxc^~IF0 z9!+-Gvj@nb)Iox|p?Hf$MWN&8aPQ=%Y2=WHNe2BJKK?c4VoP60RtU(}o$$zpYb#{K zr^Y?4TU7{y-E*K4{xyqCb{#Bas9I~|`8e~CBb~z}$1JQOT)GkZt7XKgnK7se_ z0Uzw<&i;t(5Z5eKF1B+5n#IYa+*aLdMZtoH^fFqe|qhS^&txnfBTTfC`pLDrT#`?g`Yu==vlJeMx3#?6*#0{C1_t zPe16*ov&7B16`6q9F)?YnDX5EpW{0Xs^{{>aOII1seZXk4 zDe3|Ntkj)@u&tc3A|QA>J6(f`(3CWG#(~1vw3-1|qu)4smq_PXTT(Gp& zvnf06anX4d9^bitQC?Qmgx9O7FWrUrUDyZFRxX~kFvj!y`g_Y|=P)R0vV89l#j`73 zWK*?3`pAj=x{qB=V^Q#nq;LRMcOffxGvuV9`|GITwDj-lAWp<;nGPH-h34M*sNN7t zQIQ$#KrSL&CsMSI$+pk;OB#MKw^?NpRz7*EeEOgiNZ&OqVe{iao#0tTu^ zF^nz&h5*M^URrnTZ%8H?CFXSL1MO~AAm|)kAe*_zjtI=+Qy~zBRgf7*x$UY@K!#Hm|gL5U}_hHurB0GKG?1OO3@bGJyEda6dm8_8&|M!+9iJmrhg(O zUupDJ`~Gnn4=O5n>(r1%L{H+t=BpAqaw^yI*4Tsy};^1|CE zpC`L5T7aeNqsg^Lywyq~p}!%>dLHjQ?frwP^n%c%P&`a<>Daf24TK$GVKx3$p6Sa| z$v?ZhX+kN}=CZ4(&cM&)I@F++V-y8AdFYeA`j`<-G#Fb@Hav4DmX-~+B4YPzfc`3Z z`NsWj*_Hxg#{Q5+*P2nn#0lwglT4%Sp3a*Vz{t;NO}pWkoXRq^{~OX*JH=%BItF=K zKGVRO6s9zI*_C|xi5~R8*2u5Csag!Bu}{|3`*|#l%DVHR((1Io0Wxs+TV`FYlDxIWXaIkI&V z+OmnU{#fGzPP3m<$4~7ZYuLp}eA9>)bSljCnK8Rs{`shgr9uptNQJze{H_GVTGu-8oAazQChr0v$Wq*V3= zUmBhEbub=8q<1a4JVUp3XdN)85aZVon2O1G)@Iok=U9V33d3Vy>jy+}^a4n1iOoE+ zqD^i;;=Otn*XB|_k!=>U58~CP>d5BOm;Z(|pr4{NCWT6)*Vd;d&Zi?8APN5SQC8wc znx{%5f~p5Lbnr;tTqbv>gXvTT|M=t6V0w=e(qxsBn9-KiJ};{d&{uzj7aj%ROtRFU zmDfb)T|;FYrJ)PYaM>TdJwF0MMn+D(!c-crf2#HLs)^)|{dEE}WlkgSWU<1!zamd)gU|M+LEvO(tC=v?B6L$^z17IPyB^zN*6 z0mBuX3HkVADY`5GB&k)n2&=2TmUBV>U7IO0M{(V8bl!D8zrRlJAHofVVbQIavl&|l zWi97ls_h+1$yX%fk51W>E@##fY|iRT5fwUjw?0-;Jyt!A1T1z(+%(F%0A463%w-|N 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 Date: Mon, 6 Jun 2016 13:44:27 +0200 Subject: [PATCH 7/7] Finished Test Missions for ZONE --- .../l10n/DEFAULT/Moose.lua | 18006 +++++++++++++++- Moose Mission Setup/Moose.lua | 18006 +++++++++++++++- .../Moose_Test_CLEANUP/Moose_Test_CLEANUP.miz | Bin 98334 -> 207018 bytes .../Moose_Test_DATABASE.miz | Bin 38082 -> 146766 bytes .../Moose_Test_DESTROY/MOOSE_Test_DESTROY.miz | Bin 33518 -> 142202 bytes .../Moose_Test_ESCORT/MOOSE_Test_ESCORT.miz | Bin 59173 -> 167857 bytes .../Moose_Test_MISSILETRAINER.miz | Bin 118467 -> 227151 bytes .../Moose_Test_SEAD/MOOSE_Test_SEAD.miz | Bin 25771 -> 134455 bytes .../Moose_Test_SPAWN/MOOSE_Test_SPAWN.miz | Bin 54986 -> 163705 bytes .../MOOSE_Test_SPAWN_Repeat.miz | Bin 25332 -> 134016 bytes .../MOOSE_Test_TASK_Pickup_and_Deploy.miz | Bin 31933 -> 140617 bytes .../Moose_Test_WRAPPER/Moose_Test_WRAPPER.miz | Bin 40952 -> 149636 bytes .../Moose_Test_ZONE/Moose_Test_ZONE.miz | Bin 20873 -> 129592 bytes .../Moose_Test_ZONE_POLYGON.miz | Bin 21605 -> 130324 bytes .../Moose_Test_ZONE_RADIUS.miz | Bin 21030 -> 129749 bytes .../Moose_Test_ZONE_UNIT.miz | Bin 20909 -> 129628 bytes 16 files changed, 35966 insertions(+), 46 deletions(-) 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 114a0f7fe..c8fd0f133 100644 --- a/Moose Mission Setup/Moose Mission Update/l10n/DEFAULT/Moose.lua +++ b/Moose Mission Setup/Moose Mission Update/l10n/DEFAULT/Moose.lua @@ -1,6 +1,5 @@ -env.info( '*** MOOSE DYNAMIC INCLUDE START *** ' ) -env.info( 'Moose Generation Timestamp: 20160605_2147' ) - +env.info( '*** MOOSE STATIC INCLUDE START *** ' ) +env.info( 'Moose Generation Timestamp: 20160606_1343' ) local base = _G env.info("Loading MOOSE " .. base.timer.getAbsTime() ) @@ -12,27 +11,9 @@ Include.Path = function() end Include.File = function( IncludeFile ) - if not Include.Files[ IncludeFile ] then - Include.Files[IncludeFile] = IncludeFile - env.info( "Include:" .. IncludeFile .. " from " .. Include.ProgramPath ) - local f = assert( base.loadfile( Include.ProgramPath .. IncludeFile .. ".lua" ) ) - if f == nil then - env.info( "Include:" .. IncludeFile .. " from " .. Include.MissionPath ) - local f = assert( base.loadfile( Include.MissionPath .. IncludeFile .. ".lua" ) ) - if f == nil then - error ("Could not load MOOSE file " .. IncludeFile .. ".lua" ) - else - env.info( "Include:" .. IncludeFile .. " loaded from " .. Include.MissionPath ) - return f() - end - else - env.info( "Include:" .. IncludeFile .. " loaded from " .. Include.ProgramPath ) - return f() - end - end end -Include.ProgramPath = "Scripts/Moose/" +Include.ProgramPath = "Scripts/Moose/Moose/" Include.MissionPath = Include.Path() env.info( "Include.ProgramPath = " .. Include.ProgramPath) @@ -42,4 +23,17983 @@ Include.Files = {} Include.File( "Moose" ) -env.info("Loaded MOOSE Include Engine")env.info( '*** MOOSE INCLUDE END *** ' ) +env.info("Loaded MOOSE Include Engine") +--- Various routines +-- @module routines +-- @author Flightcontrol + +--Include.File( "Trace" ) +--Include.File( "Message" ) + + +env.setErrorMessageBoxEnabled(false) + +--- Extract of MIST functions. +-- @author Grimes + +routines = {} + + +-- don't change these +routines.majorVersion = 3 +routines.minorVersion = 3 +routines.build = 22 + +----------------------------------------------------------------------------------------------------------------- + +---------------------------------------------------------------------------------------------- +-- Utils- conversion, Lua utils, etc. +routines.utils = {} + +--from http://lua-users.org/wiki/CopyTable +routines.utils.deepCopy = function(object) + local lookup_table = {} + local function _copy(object) + if type(object) ~= "table" then + return object + elseif lookup_table[object] then + return lookup_table[object] + end + local new_table = {} + lookup_table[object] = new_table + for index, value in pairs(object) do + new_table[_copy(index)] = _copy(value) + end + return setmetatable(new_table, getmetatable(object)) + end + local objectreturn = _copy(object) + return objectreturn +end + + +-- porting in Slmod's serialize_slmod2 +routines.utils.oneLineSerialize = function(tbl) -- serialization of a table all on a single line, no comments, made to replace old get_table_string function + + lookup_table = {} + + local function _Serialize( tbl ) + + if type(tbl) == 'table' then --function only works for tables! + + if lookup_table[tbl] then + return lookup_table[object] + end + + local tbl_str = {} + + lookup_table[tbl] = tbl_str + + tbl_str[#tbl_str + 1] = '{' + + for ind,val in pairs(tbl) do -- serialize its fields + local ind_str = {} + if type(ind) == "number" then + ind_str[#ind_str + 1] = '[' + ind_str[#ind_str + 1] = tostring(ind) + ind_str[#ind_str + 1] = ']=' + else --must be a string + ind_str[#ind_str + 1] = '[' + ind_str[#ind_str + 1] = routines.utils.basicSerialize(ind) + ind_str[#ind_str + 1] = ']=' + end + + local val_str = {} + if ((type(val) == 'number') or (type(val) == 'boolean')) then + val_str[#val_str + 1] = tostring(val) + val_str[#val_str + 1] = ',' + tbl_str[#tbl_str + 1] = table.concat(ind_str) + tbl_str[#tbl_str + 1] = table.concat(val_str) + elseif type(val) == 'string' then + val_str[#val_str + 1] = routines.utils.basicSerialize(val) + val_str[#val_str + 1] = ',' + tbl_str[#tbl_str + 1] = table.concat(ind_str) + tbl_str[#tbl_str + 1] = table.concat(val_str) + elseif type(val) == 'nil' then -- won't ever happen, right? + val_str[#val_str + 1] = 'nil,' + tbl_str[#tbl_str + 1] = table.concat(ind_str) + tbl_str[#tbl_str + 1] = table.concat(val_str) + elseif type(val) == 'table' then + if ind == "__index" then + -- tbl_str[#tbl_str + 1] = "__index" + -- tbl_str[#tbl_str + 1] = ',' --I think this is right, I just added it + else + + val_str[#val_str + 1] = _Serialize(val) + val_str[#val_str + 1] = ',' --I think this is right, I just added it + tbl_str[#tbl_str + 1] = table.concat(ind_str) + tbl_str[#tbl_str + 1] = table.concat(val_str) + end + elseif type(val) == 'function' then + -- tbl_str[#tbl_str + 1] = "function " .. tostring(ind) + -- tbl_str[#tbl_str + 1] = ',' --I think this is right, I just added it + else +-- env.info('unable to serialize value type ' .. routines.utils.basicSerialize(type(val)) .. ' at index ' .. tostring(ind)) +-- env.info( debug.traceback() ) + end + + end + tbl_str[#tbl_str + 1] = '}' + return table.concat(tbl_str) + else + return tostring(tbl) + end + end + + local objectreturn = _Serialize(tbl) + return objectreturn +end + +--porting in Slmod's "safestring" basic serialize +routines.utils.basicSerialize = function(s) + if s == nil then + return "\"\"" + else + if ((type(s) == 'number') or (type(s) == 'boolean') or (type(s) == 'function') or (type(s) == 'table') or (type(s) == 'userdata') ) then + return tostring(s) + elseif type(s) == 'string' then + s = string.format('%q', s) + return s + end + end +end + + +routines.utils.toDegree = function(angle) + return angle*180/math.pi +end + +routines.utils.toRadian = function(angle) + return angle*math.pi/180 +end + +routines.utils.metersToNM = function(meters) + return meters/1852 +end + +routines.utils.metersToFeet = function(meters) + return meters/0.3048 +end + +routines.utils.NMToMeters = function(NM) + return NM*1852 +end + +routines.utils.feetToMeters = function(feet) + return feet*0.3048 +end + +routines.utils.mpsToKnots = function(mps) + return mps*3600/1852 +end + +routines.utils.mpsToKmph = function(mps) + return mps*3.6 +end + +routines.utils.knotsToMps = function(knots) + return knots*1852/3600 +end + +routines.utils.kmphToMps = function(kmph) + return kmph/3.6 +end + +function routines.utils.makeVec2(Vec3) + if Vec3.z then + return {x = Vec3.x, y = Vec3.z} + else + return {x = Vec3.x, y = Vec3.y} -- it was actually already vec2. + end +end + +function routines.utils.makeVec3(Vec2, y) + if not Vec2.z then + if not y then + y = 0 + end + return {x = Vec2.x, y = y, z = Vec2.y} + else + return {x = Vec2.x, y = Vec2.y, z = Vec2.z} -- it was already Vec3, actually. + end +end + +function routines.utils.makeVec3GL(Vec2, offset) + local adj = offset or 0 + + if not Vec2.z then + return {x = Vec2.x, y = (land.getHeight(Vec2) + adj), z = Vec2.y} + else + return {x = Vec2.x, y = (land.getHeight({x = Vec2.x, y = Vec2.z}) + adj), z = Vec2.z} + end +end + +routines.utils.zoneToVec3 = function(zone) + local new = {} + if type(zone) == 'table' and zone.point then + new.x = zone.point.x + new.y = zone.point.y + new.z = zone.point.z + return new + elseif type(zone) == 'string' then + zone = trigger.misc.getZone(zone) + if zone then + new.x = zone.point.x + new.y = zone.point.y + new.z = zone.point.z + return new + end + end +end + +-- gets heading-error corrected direction from point along vector vec. +function routines.utils.getDir(vec, point) + local dir = math.atan2(vec.z, vec.x) + dir = dir + routines.getNorthCorrection(point) + if dir < 0 then + dir = dir + 2*math.pi -- put dir in range of 0 to 2*pi + end + return dir +end + +-- gets distance in meters between two points (2 dimensional) +function routines.utils.get2DDist(point1, point2) + point1 = routines.utils.makeVec3(point1) + point2 = routines.utils.makeVec3(point2) + return routines.vec.mag({x = point1.x - point2.x, y = 0, z = point1.z - point2.z}) +end + +-- gets distance in meters between two points (3 dimensional) +function routines.utils.get3DDist(point1, point2) + return routines.vec.mag({x = point1.x - point2.x, y = point1.y - point2.y, z = point1.z - point2.z}) +end + + + +-- From http://lua-users.org/wiki/SimpleRound +-- use negative idp for rounding ahead of decimal place, positive for rounding after decimal place +routines.utils.round = function(num, idp) + local mult = 10^(idp or 0) + return math.floor(num * mult + 0.5) / mult +end + +-- porting in Slmod's dostring +routines.utils.dostring = function(s) + local f, err = loadstring(s) + if f then + return true, f() + else + return false, err + end +end + + +--3D Vector manipulation +routines.vec = {} + +routines.vec.add = function(vec1, vec2) + return {x = vec1.x + vec2.x, y = vec1.y + vec2.y, z = vec1.z + vec2.z} +end + +routines.vec.sub = function(vec1, vec2) + return {x = vec1.x - vec2.x, y = vec1.y - vec2.y, z = vec1.z - vec2.z} +end + +routines.vec.scalarMult = function(vec, mult) + return {x = vec.x*mult, y = vec.y*mult, z = vec.z*mult} +end + +routines.vec.scalar_mult = routines.vec.scalarMult + +routines.vec.dp = function(vec1, vec2) + return vec1.x*vec2.x + vec1.y*vec2.y + vec1.z*vec2.z +end + +routines.vec.cp = function(vec1, vec2) + return { x = vec1.y*vec2.z - vec1.z*vec2.y, y = vec1.z*vec2.x - vec1.x*vec2.z, z = vec1.x*vec2.y - vec1.y*vec2.x} +end + +routines.vec.mag = function(vec) + return (vec.x^2 + vec.y^2 + vec.z^2)^0.5 +end + +routines.vec.getUnitVec = function(vec) + local mag = routines.vec.mag(vec) + return { x = vec.x/mag, y = vec.y/mag, z = vec.z/mag } +end + +routines.vec.rotateVec2 = function(vec2, theta) + return { x = vec2.x*math.cos(theta) - vec2.y*math.sin(theta), y = vec2.x*math.sin(theta) + vec2.y*math.cos(theta)} +end +--------------------------------------------------------------------------------------------------------------------------- + + + + +-- acc- the accuracy of each easting/northing. 0, 1, 2, 3, 4, or 5. +routines.tostringMGRS = function(MGRS, acc) + if acc == 0 then + return MGRS.UTMZone .. ' ' .. MGRS.MGRSDigraph + else + return MGRS.UTMZone .. ' ' .. MGRS.MGRSDigraph .. ' ' .. string.format('%0' .. acc .. 'd', routines.utils.round(MGRS.Easting/(10^(5-acc)), 0)) + .. ' ' .. string.format('%0' .. acc .. 'd', routines.utils.round(MGRS.Northing/(10^(5-acc)), 0)) + end +end + +--[[acc: +in DM: decimal point of minutes. +In DMS: decimal point of seconds. +position after the decimal of the least significant digit: +So: +42.32 - acc of 2. +]] +routines.tostringLL = function(lat, lon, acc, DMS) + + local latHemi, lonHemi + if lat > 0 then + latHemi = 'N' + else + latHemi = 'S' + end + + if lon > 0 then + lonHemi = 'E' + else + lonHemi = 'W' + end + + lat = math.abs(lat) + lon = math.abs(lon) + + local latDeg = math.floor(lat) + local latMin = (lat - latDeg)*60 + + local lonDeg = math.floor(lon) + local lonMin = (lon - lonDeg)*60 + + if DMS then -- degrees, minutes, and seconds. + local oldLatMin = latMin + latMin = math.floor(latMin) + local latSec = routines.utils.round((oldLatMin - latMin)*60, acc) + + local oldLonMin = lonMin + lonMin = math.floor(lonMin) + local lonSec = routines.utils.round((oldLonMin - lonMin)*60, acc) + + if latSec == 60 then + latSec = 0 + latMin = latMin + 1 + end + + if lonSec == 60 then + lonSec = 0 + lonMin = lonMin + 1 + end + + local secFrmtStr -- create the formatting string for the seconds place + if acc <= 0 then -- no decimal place. + secFrmtStr = '%02d' + else + local width = 3 + acc -- 01.310 - that's a width of 6, for example. + secFrmtStr = '%0' .. width .. '.' .. acc .. 'f' + end + + return string.format('%02d', latDeg) .. ' ' .. string.format('%02d', latMin) .. '\' ' .. string.format(secFrmtStr, latSec) .. '"' .. latHemi .. ' ' + .. string.format('%02d', lonDeg) .. ' ' .. string.format('%02d', lonMin) .. '\' ' .. string.format(secFrmtStr, lonSec) .. '"' .. lonHemi + + else -- degrees, decimal minutes. + latMin = routines.utils.round(latMin, acc) + lonMin = routines.utils.round(lonMin, acc) + + if latMin == 60 then + latMin = 0 + latDeg = latDeg + 1 + end + + if lonMin == 60 then + lonMin = 0 + lonDeg = lonDeg + 1 + end + + local minFrmtStr -- create the formatting string for the minutes place + if acc <= 0 then -- no decimal place. + minFrmtStr = '%02d' + else + local width = 3 + acc -- 01.310 - that's a width of 6, for example. + minFrmtStr = '%0' .. width .. '.' .. acc .. 'f' + end + + return string.format('%02d', latDeg) .. ' ' .. string.format(minFrmtStr, latMin) .. '\'' .. latHemi .. ' ' + .. string.format('%02d', lonDeg) .. ' ' .. string.format(minFrmtStr, lonMin) .. '\'' .. lonHemi + + end +end + +--[[ required: az - radian + required: dist - meters + optional: alt - meters (set to false or nil if you don't want to use it). + optional: metric - set true to get dist and alt in km and m. + precision will always be nearest degree and NM or km.]] +routines.tostringBR = function(az, dist, alt, metric) + az = routines.utils.round(routines.utils.toDegree(az), 0) + + if metric then + dist = routines.utils.round(dist/1000, 2) + else + dist = routines.utils.round(routines.utils.metersToNM(dist), 2) + end + + local s = string.format('%03d', az) .. ' for ' .. dist + + if alt then + if metric then + s = s .. ' at ' .. routines.utils.round(alt, 0) + else + s = s .. ' at ' .. routines.utils.round(routines.utils.metersToFeet(alt), 0) + end + end + return s +end + +routines.getNorthCorrection = function(point) --gets the correction needed for true north + if not point.z then --Vec2; convert to Vec3 + point.z = point.y + point.y = 0 + end + local lat, lon = coord.LOtoLL(point) + local north_posit = coord.LLtoLO(lat + 1, lon) + return math.atan2(north_posit.z - point.z, north_posit.x - point.x) +end + + +-- the main area +do + -- THE MAIN FUNCTION -- Accessed 100 times/sec. + routines.main = function() + timer.scheduleFunction(routines.main, {}, timer.getTime() + 2) --reschedule first in case of Lua error + ---------------------------------------------------------------------------------------------------------- + --area to add new stuff in + + routines.do_scheduled_functions() + end -- end of routines.main + + timer.scheduleFunction(routines.main, {}, timer.getTime() + 2) + +end + + +do + local idNum = 0 + + --Simplified event handler + routines.addEventHandler = function(f) --id is optional! + local handler = {} + idNum = idNum + 1 + handler.id = idNum + handler.f = f + handler.onEvent = function(self, event) + self.f(event) + end + world.addEventHandler(handler) + end + + routines.removeEventHandler = function(id) + for key, handler in pairs(world.eventHandlers) do + if handler.id and handler.id == id then + world.eventHandlers[key] = nil + return true + end + end + return false + end +end + +-- need to return a Vec3 or Vec2? +function routines.getRandPointInCircle(point, radius, innerRadius) + local theta = 2*math.pi*math.random() + local rad = math.random() + math.random() + if rad > 1 then + rad = 2 - rad + end + + local radMult + if innerRadius and innerRadius <= radius then + radMult = (radius - innerRadius)*rad + innerRadius + else + radMult = radius*rad + end + + if not point.z then --might as well work with vec2/3 + point.z = point.y + end + + local rndCoord + if radius > 0 then + rndCoord = {x = math.cos(theta)*radMult + point.x, y = math.sin(theta)*radMult + point.z} + else + rndCoord = {x = point.x, y = point.z} + end + return rndCoord +end + +routines.goRoute = function(group, path) + local misTask = { + id = 'Mission', + params = { + route = { + points = routines.utils.deepCopy(path), + }, + }, + } + if type(group) == 'string' then + group = Group.getByName(group) + end + local groupCon = group:getController() + if groupCon then + groupCon:setTask(misTask) + return true + end + + Controller.setTask(groupCon, misTask) + return false +end + + +-- Useful atomic functions from mist, ported. + +routines.ground = {} +routines.fixedWing = {} +routines.heli = {} + +routines.ground.buildWP = function(point, overRideForm, overRideSpeed) + + local wp = {} + wp.x = point.x + + if point.z then + wp.y = point.z + else + wp.y = point.y + end + local form, speed + + if point.speed and not overRideSpeed then + wp.speed = point.speed + elseif type(overRideSpeed) == 'number' then + wp.speed = overRideSpeed + else + wp.speed = routines.utils.kmphToMps(20) + end + + if point.form and not overRideForm then + form = point.form + else + form = overRideForm + end + + if not form then + wp.action = 'Cone' + else + form = string.lower(form) + if form == 'off_road' or form == 'off road' then + wp.action = 'Off Road' + elseif form == 'on_road' or form == 'on road' then + wp.action = 'On Road' + elseif form == 'rank' or form == 'line_abrest' or form == 'line abrest' or form == 'lineabrest'then + wp.action = 'Rank' + elseif form == 'cone' then + wp.action = 'Cone' + elseif form == 'diamond' then + wp.action = 'Diamond' + elseif form == 'vee' then + wp.action = 'Vee' + elseif form == 'echelon_left' or form == 'echelon left' or form == 'echelonl' then + wp.action = 'EchelonL' + elseif form == 'echelon_right' or form == 'echelon right' or form == 'echelonr' then + wp.action = 'EchelonR' + else + wp.action = 'Cone' -- if nothing matched + end + end + + wp.type = 'Turning Point' + + return wp + +end + +routines.fixedWing.buildWP = function(point, WPtype, speed, alt, altType) + + local wp = {} + wp.x = point.x + + if point.z then + wp.y = point.z + else + wp.y = point.y + end + + if alt and type(alt) == 'number' then + wp.alt = alt + else + wp.alt = 2000 + end + + if altType then + altType = string.lower(altType) + if altType == 'radio' or 'agl' then + wp.alt_type = 'RADIO' + elseif altType == 'baro' or 'asl' then + wp.alt_type = 'BARO' + end + else + wp.alt_type = 'RADIO' + end + + if point.speed then + speed = point.speed + end + + if point.type then + WPtype = point.type + end + + if not speed then + wp.speed = routines.utils.kmphToMps(500) + else + wp.speed = speed + end + + if not WPtype then + wp.action = 'Turning Point' + else + WPtype = string.lower(WPtype) + if WPtype == 'flyover' or WPtype == 'fly over' or WPtype == 'fly_over' then + wp.action = 'Fly Over Point' + elseif WPtype == 'turningpoint' or WPtype == 'turning point' or WPtype == 'turning_point' then + wp.action = 'Turning Point' + else + wp.action = 'Turning Point' + end + end + + wp.type = 'Turning Point' + return wp +end + +routines.heli.buildWP = function(point, WPtype, speed, alt, altType) + + local wp = {} + wp.x = point.x + + if point.z then + wp.y = point.z + else + wp.y = point.y + end + + if alt and type(alt) == 'number' then + wp.alt = alt + else + wp.alt = 500 + end + + if altType then + altType = string.lower(altType) + if altType == 'radio' or 'agl' then + wp.alt_type = 'RADIO' + elseif altType == 'baro' or 'asl' then + wp.alt_type = 'BARO' + end + else + wp.alt_type = 'RADIO' + end + + if point.speed then + speed = point.speed + end + + if point.type then + WPtype = point.type + end + + if not speed then + wp.speed = routines.utils.kmphToMps(200) + else + wp.speed = speed + end + + if not WPtype then + wp.action = 'Turning Point' + else + WPtype = string.lower(WPtype) + if WPtype == 'flyover' or WPtype == 'fly over' or WPtype == 'fly_over' then + wp.action = 'Fly Over Point' + elseif WPtype == 'turningpoint' or WPtype == 'turning point' or WPtype == 'turning_point' then + wp.action = 'Turning Point' + else + wp.action = 'Turning Point' + end + end + + wp.type = 'Turning Point' + return wp +end + +routines.groupToRandomPoint = function(vars) + local group = vars.group --Required + local point = vars.point --required + local radius = vars.radius or 0 + local innerRadius = vars.innerRadius + local form = vars.form or 'Cone' + local heading = vars.heading or math.random()*2*math.pi + local headingDegrees = vars.headingDegrees + local speed = vars.speed or routines.utils.kmphToMps(20) + + + local useRoads + if not vars.disableRoads then + useRoads = true + else + useRoads = false + end + + local path = {} + + if headingDegrees then + heading = headingDegrees*math.pi/180 + end + + if heading >= 2*math.pi then + heading = heading - 2*math.pi + end + + local rndCoord = routines.getRandPointInCircle(point, radius, innerRadius) + + local offset = {} + local posStart = routines.getLeadPos(group) + + offset.x = routines.utils.round(math.sin(heading - (math.pi/2)) * 50 + rndCoord.x, 3) + offset.z = routines.utils.round(math.cos(heading + (math.pi/2)) * 50 + rndCoord.y, 3) + path[#path + 1] = routines.ground.buildWP(posStart, form, speed) + + + if useRoads == true and ((point.x - posStart.x)^2 + (point.z - posStart.z)^2)^0.5 > radius * 1.3 then + path[#path + 1] = routines.ground.buildWP({['x'] = posStart.x + 11, ['z'] = posStart.z + 11}, 'off_road', speed) + path[#path + 1] = routines.ground.buildWP(posStart, 'on_road', speed) + path[#path + 1] = routines.ground.buildWP(offset, 'on_road', speed) + else + path[#path + 1] = routines.ground.buildWP({['x'] = posStart.x + 25, ['z'] = posStart.z + 25}, form, speed) + end + + path[#path + 1] = routines.ground.buildWP(offset, form, speed) + path[#path + 1] = routines.ground.buildWP(rndCoord, form, speed) + + routines.goRoute(group, path) + + return +end + +routines.groupRandomDistSelf = function(gpData, dist, form, heading, speed) + local pos = routines.getLeadPos(gpData) + local fakeZone = {} + fakeZone.radius = dist or math.random(300, 1000) + fakeZone.point = {x = pos.x, y, pos.y, z = pos.z} + routines.groupToRandomZone(gpData, fakeZone, form, heading, speed) + + return +end + +routines.groupToRandomZone = function(gpData, zone, form, heading, speed) + if type(gpData) == 'string' then + gpData = Group.getByName(gpData) + end + + if type(zone) == 'string' then + zone = trigger.misc.getZone(zone) + elseif type(zone) == 'table' and not zone.radius then + zone = trigger.misc.getZone(zone[math.random(1, #zone)]) + end + + if speed then + speed = routines.utils.kmphToMps(speed) + end + + local vars = {} + vars.group = gpData + vars.radius = zone.radius + vars.form = form + vars.headingDegrees = heading + vars.speed = speed + vars.point = routines.utils.zoneToVec3(zone) + + routines.groupToRandomPoint(vars) + + return +end + +routines.isTerrainValid = function(coord, terrainTypes) -- vec2/3 and enum or table of acceptable terrain types + if coord.z then + coord.y = coord.z + end + local typeConverted = {} + + if type(terrainTypes) == 'string' then -- if its a string it does this check + for constId, constData in pairs(land.SurfaceType) do + if string.lower(constId) == string.lower(terrainTypes) or string.lower(constData) == string.lower(terrainTypes) then + table.insert(typeConverted, constId) + end + end + elseif type(terrainTypes) == 'table' then -- if its a table it does this check + for typeId, typeData in pairs(terrainTypes) do + for constId, constData in pairs(land.SurfaceType) do + if string.lower(constId) == string.lower(typeData) or string.lower(constData) == string.lower(typeId) then + table.insert(typeConverted, constId) + end + end + end + end + for validIndex, validData in pairs(typeConverted) do + if land.getSurfaceType(coord) == land.SurfaceType[validData] then + return true + end + end + return false +end + +routines.groupToPoint = function(gpData, point, form, heading, speed, useRoads) + if type(point) == 'string' then + point = trigger.misc.getZone(point) + end + if speed then + speed = routines.utils.kmphToMps(speed) + end + + local vars = {} + vars.group = gpData + vars.form = form + vars.headingDegrees = heading + vars.speed = speed + vars.disableRoads = useRoads + vars.point = routines.utils.zoneToVec3(point) + routines.groupToRandomPoint(vars) + + return +end + + +routines.getLeadPos = function(group) + if type(group) == 'string' then -- group name + group = Group.getByName(group) + end + + local units = group:getUnits() + + local leader = units[1] + if not leader then -- SHOULD be good, but if there is a bug, this code future-proofs it then. + local lowestInd = math.huge + for ind, unit in pairs(units) do + if ind < lowestInd then + lowestInd = ind + leader = unit + end + end + end + if leader and Unit.isExist(leader) then -- maybe a little too paranoid now... + return leader:getPosition().p + end +end + +--[[ vars for routines.getMGRSString: +vars.units - table of unit names (NOT unitNameTable- maybe this should change). +vars.acc - integer between 0 and 5, inclusive +]] +routines.getMGRSString = function(vars) + local units = vars.units + local acc = vars.acc or 5 + local avgPos = routines.getAvgPos(units) + if avgPos then + return routines.tostringMGRS(coord.LLtoMGRS(coord.LOtoLL(avgPos)), acc) + end +end + +--[[ vars for routines.getLLString +vars.units - table of unit names (NOT unitNameTable- maybe this should change). +vars.acc - integer, number of numbers after decimal place +vars.DMS - if true, output in degrees, minutes, seconds. Otherwise, output in degrees, minutes. + + +]] +routines.getLLString = function(vars) + local units = vars.units + local acc = vars.acc or 3 + local DMS = vars.DMS + local avgPos = routines.getAvgPos(units) + if avgPos then + local lat, lon = coord.LOtoLL(avgPos) + return routines.tostringLL(lat, lon, acc, DMS) + end +end + +--[[ +vars.zone - table of a zone name. +vars.ref - vec3 ref point, maybe overload for vec2 as well? +vars.alt - boolean, if used, includes altitude in string +vars.metric - boolean, gives distance in km instead of NM. +]] +routines.getBRStringZone = function(vars) + local zone = trigger.misc.getZone( vars.zone ) + local ref = routines.utils.makeVec3(vars.ref, 0) -- turn it into Vec3 if it is not already. + local alt = vars.alt + local metric = vars.metric + if zone then + local vec = {x = zone.point.x - ref.x, y = zone.point.y - ref.y, z = zone.point.z - ref.z} + local dir = routines.utils.getDir(vec, ref) + local dist = routines.utils.get2DDist(zone.point, ref) + if alt then + alt = zone.y + end + return routines.tostringBR(dir, dist, alt, metric) + else + env.info( 'routines.getBRStringZone: error: zone is nil' ) + end +end + +--[[ +vars.units- table of unit names (NOT unitNameTable- maybe this should change). +vars.ref - vec3 ref point, maybe overload for vec2 as well? +vars.alt - boolean, if used, includes altitude in string +vars.metric - boolean, gives distance in km instead of NM. +]] +routines.getBRString = function(vars) + local units = vars.units + local ref = routines.utils.makeVec3(vars.ref, 0) -- turn it into Vec3 if it is not already. + local alt = vars.alt + local metric = vars.metric + local avgPos = routines.getAvgPos(units) + if avgPos then + local vec = {x = avgPos.x - ref.x, y = avgPos.y - ref.y, z = avgPos.z - ref.z} + local dir = routines.utils.getDir(vec, ref) + local dist = routines.utils.get2DDist(avgPos, ref) + if alt then + alt = avgPos.y + end + return routines.tostringBR(dir, dist, alt, metric) + end +end + + +-- Returns the Vec3 coordinates of the average position of the concentration of units most in the heading direction. +--[[ vars for routines.getLeadingPos: +vars.units - table of unit names +vars.heading - direction +vars.radius - number +vars.headingDegrees - boolean, switches heading to degrees +]] +routines.getLeadingPos = function(vars) + local units = vars.units + local heading = vars.heading + local radius = vars.radius + if vars.headingDegrees then + heading = routines.utils.toRadian(vars.headingDegrees) + end + + local unitPosTbl = {} + for i = 1, #units do + local unit = Unit.getByName(units[i]) + if unit and unit:isExist() then + unitPosTbl[#unitPosTbl + 1] = unit:getPosition().p + end + end + if #unitPosTbl > 0 then -- one more more units found. + -- first, find the unit most in the heading direction + local maxPos = -math.huge + + local maxPosInd -- maxPos - the furthest in direction defined by heading; maxPosInd = + for i = 1, #unitPosTbl do + local rotatedVec2 = routines.vec.rotateVec2(routines.utils.makeVec2(unitPosTbl[i]), heading) + if (not maxPos) or maxPos < rotatedVec2.x then + maxPos = rotatedVec2.x + maxPosInd = i + end + end + + --now, get all the units around this unit... + local avgPos + if radius then + local maxUnitPos = unitPosTbl[maxPosInd] + local avgx, avgy, avgz, totNum = 0, 0, 0, 0 + for i = 1, #unitPosTbl do + if routines.utils.get2DDist(maxUnitPos, unitPosTbl[i]) <= radius then + avgx = avgx + unitPosTbl[i].x + avgy = avgy + unitPosTbl[i].y + avgz = avgz + unitPosTbl[i].z + totNum = totNum + 1 + end + end + avgPos = { x = avgx/totNum, y = avgy/totNum, z = avgz/totNum} + else + avgPos = unitPosTbl[maxPosInd] + end + + return avgPos + end +end + + +--[[ vars for routines.getLeadingMGRSString: +vars.units - table of unit names +vars.heading - direction +vars.radius - number +vars.headingDegrees - boolean, switches heading to degrees +vars.acc - number, 0 to 5. +]] +routines.getLeadingMGRSString = function(vars) + local pos = routines.getLeadingPos(vars) + if pos then + local acc = vars.acc or 5 + return routines.tostringMGRS(coord.LLtoMGRS(coord.LOtoLL(pos)), acc) + end +end + +--[[ vars for routines.getLeadingLLString: +vars.units - table of unit names +vars.heading - direction, number +vars.radius - number +vars.headingDegrees - boolean, switches heading to degrees +vars.acc - number of digits after decimal point (can be negative) +vars.DMS - boolean, true if you want DMS. +]] +routines.getLeadingLLString = function(vars) + local pos = routines.getLeadingPos(vars) + if pos then + local acc = vars.acc or 3 + local DMS = vars.DMS + local lat, lon = coord.LOtoLL(pos) + return routines.tostringLL(lat, lon, acc, DMS) + end +end + + + +--[[ vars for routines.getLeadingBRString: +vars.units - table of unit names +vars.heading - direction, number +vars.radius - number +vars.headingDegrees - boolean, switches heading to degrees +vars.metric - boolean, if true, use km instead of NM. +vars.alt - boolean, if true, include altitude. +vars.ref - vec3/vec2 reference point. +]] +routines.getLeadingBRString = function(vars) + local pos = routines.getLeadingPos(vars) + if pos then + local ref = vars.ref + local alt = vars.alt + local metric = vars.metric + + local vec = {x = pos.x - ref.x, y = pos.y - ref.y, z = pos.z - ref.z} + local dir = routines.utils.getDir(vec, ref) + local dist = routines.utils.get2DDist(pos, ref) + if alt then + alt = pos.y + end + return routines.tostringBR(dir, dist, alt, metric) + end +end + +--[[ vars for routines.message.add + vars.text = 'Hello World' + vars.displayTime = 20 + vars.msgFor = {coa = {'red'}, countries = {'Ukraine', 'Georgia'}, unitTypes = {'A-10C'}} + +]] + +--[[ vars for routines.msgMGRS +vars.units - table of unit names (NOT unitNameTable- maybe this should change). +vars.acc - integer between 0 and 5, inclusive +vars.text - text in the message +vars.displayTime - self explanatory +vars.msgFor - scope +]] +routines.msgMGRS = function(vars) + local units = vars.units + local acc = vars.acc + local text = vars.text + local displayTime = vars.displayTime + local msgFor = vars.msgFor + + local s = routines.getMGRSString{units = units, acc = acc} + local newText + if string.find(text, '%%s') then -- look for %s + newText = string.format(text, s) -- insert the coordinates into the message + else -- else, just append to the end. + newText = text .. s + end + + routines.message.add{ + text = newText, + displayTime = displayTime, + msgFor = msgFor + } +end + +--[[ vars for routines.msgLL +vars.units - table of unit names (NOT unitNameTable- maybe this should change) (Yes). +vars.acc - integer, number of numbers after decimal place +vars.DMS - if true, output in degrees, minutes, seconds. Otherwise, output in degrees, minutes. +vars.text - text in the message +vars.displayTime - self explanatory +vars.msgFor - scope +]] +routines.msgLL = function(vars) + local units = vars.units -- technically, I don't really need to do this, but it helps readability. + local acc = vars.acc + local DMS = vars.DMS + local text = vars.text + local displayTime = vars.displayTime + local msgFor = vars.msgFor + + local s = routines.getLLString{units = units, acc = acc, DMS = DMS} + local newText + if string.find(text, '%%s') then -- look for %s + newText = string.format(text, s) -- insert the coordinates into the message + else -- else, just append to the end. + newText = text .. s + end + + routines.message.add{ + text = newText, + displayTime = displayTime, + msgFor = msgFor + } + +end + + +--[[ +vars.units- table of unit names (NOT unitNameTable- maybe this should change). +vars.ref - vec3 ref point, maybe overload for vec2 as well? +vars.alt - boolean, if used, includes altitude in string +vars.metric - boolean, gives distance in km instead of NM. +vars.text - text of the message +vars.displayTime +vars.msgFor - scope +]] +routines.msgBR = function(vars) + local units = vars.units -- technically, I don't really need to do this, but it helps readability. + local ref = vars.ref -- vec2/vec3 will be handled in routines.getBRString + local alt = vars.alt + local metric = vars.metric + local text = vars.text + local displayTime = vars.displayTime + local msgFor = vars.msgFor + + local s = routines.getBRString{units = units, ref = ref, alt = alt, metric = metric} + local newText + if string.find(text, '%%s') then -- look for %s + newText = string.format(text, s) -- insert the coordinates into the message + else -- else, just append to the end. + newText = text .. s + end + + routines.message.add{ + text = newText, + displayTime = displayTime, + msgFor = msgFor + } + +end + + +-------------------------------------------------------------------------------------------- +-- basically, just sub-types of routines.msgBR... saves folks the work of getting the ref point. +--[[ +vars.units- table of unit names (NOT unitNameTable- maybe this should change). +vars.ref - string red, blue +vars.alt - boolean, if used, includes altitude in string +vars.metric - boolean, gives distance in km instead of NM. +vars.text - text of the message +vars.displayTime +vars.msgFor - scope +]] +routines.msgBullseye = function(vars) + if string.lower(vars.ref) == 'red' then + vars.ref = routines.DBs.missionData.bullseye.red + routines.msgBR(vars) + elseif string.lower(vars.ref) == 'blue' then + vars.ref = routines.DBs.missionData.bullseye.blue + routines.msgBR(vars) + end +end + +--[[ +vars.units- table of unit names (NOT unitNameTable- maybe this should change). +vars.ref - unit name of reference point +vars.alt - boolean, if used, includes altitude in string +vars.metric - boolean, gives distance in km instead of NM. +vars.text - text of the message +vars.displayTime +vars.msgFor - scope +]] + +routines.msgBRA = function(vars) + if Unit.getByName(vars.ref) then + vars.ref = Unit.getByName(vars.ref):getPosition().p + if not vars.alt then + vars.alt = true + end + routines.msgBR(vars) + end +end +-------------------------------------------------------------------------------------------- + +--[[ vars for routines.msgLeadingMGRS: +vars.units - table of unit names +vars.heading - direction +vars.radius - number +vars.headingDegrees - boolean, switches heading to degrees (optional) +vars.acc - number, 0 to 5. +vars.text - text of the message +vars.displayTime +vars.msgFor - scope +]] +routines.msgLeadingMGRS = function(vars) + local units = vars.units -- technically, I don't really need to do this, but it helps readability. + local heading = vars.heading + local radius = vars.radius + local headingDegrees = vars.headingDegrees + local acc = vars.acc + local text = vars.text + local displayTime = vars.displayTime + local msgFor = vars.msgFor + + local s = routines.getLeadingMGRSString{units = units, heading = heading, radius = radius, headingDegrees = headingDegrees, acc = acc} + local newText + if string.find(text, '%%s') then -- look for %s + newText = string.format(text, s) -- insert the coordinates into the message + else -- else, just append to the end. + newText = text .. s + end + + routines.message.add{ + text = newText, + displayTime = displayTime, + msgFor = msgFor + } + + +end +--[[ vars for routines.msgLeadingLL: +vars.units - table of unit names +vars.heading - direction, number +vars.radius - number +vars.headingDegrees - boolean, switches heading to degrees (optional) +vars.acc - number of digits after decimal point (can be negative) +vars.DMS - boolean, true if you want DMS. (optional) +vars.text - text of the message +vars.displayTime +vars.msgFor - scope +]] +routines.msgLeadingLL = function(vars) + local units = vars.units -- technically, I don't really need to do this, but it helps readability. + local heading = vars.heading + local radius = vars.radius + local headingDegrees = vars.headingDegrees + local acc = vars.acc + local DMS = vars.DMS + local text = vars.text + local displayTime = vars.displayTime + local msgFor = vars.msgFor + + local s = routines.getLeadingLLString{units = units, heading = heading, radius = radius, headingDegrees = headingDegrees, acc = acc, DMS = DMS} + local newText + if string.find(text, '%%s') then -- look for %s + newText = string.format(text, s) -- insert the coordinates into the message + else -- else, just append to the end. + newText = text .. s + end + + routines.message.add{ + text = newText, + displayTime = displayTime, + msgFor = msgFor + } + +end + +--[[ +vars.units - table of unit names +vars.heading - direction, number +vars.radius - number +vars.headingDegrees - boolean, switches heading to degrees (optional) +vars.metric - boolean, if true, use km instead of NM. (optional) +vars.alt - boolean, if true, include altitude. (optional) +vars.ref - vec3/vec2 reference point. +vars.text - text of the message +vars.displayTime +vars.msgFor - scope +]] +routines.msgLeadingBR = function(vars) + local units = vars.units -- technically, I don't really need to do this, but it helps readability. + local heading = vars.heading + local radius = vars.radius + local headingDegrees = vars.headingDegrees + local metric = vars.metric + local alt = vars.alt + local ref = vars.ref -- vec2/vec3 will be handled in routines.getBRString + local text = vars.text + local displayTime = vars.displayTime + local msgFor = vars.msgFor + + local s = routines.getLeadingBRString{units = units, heading = heading, radius = radius, headingDegrees = headingDegrees, metric = metric, alt = alt, ref = ref} + local newText + if string.find(text, '%%s') then -- look for %s + newText = string.format(text, s) -- insert the coordinates into the message + else -- else, just append to the end. + newText = text .. s + end + + routines.message.add{ + text = newText, + displayTime = displayTime, + msgFor = msgFor + } +end + + +function spairs(t, order) + -- collect the keys + local keys = {} + for k in pairs(t) do keys[#keys+1] = k end + + -- if order function given, sort by it by passing the table and keys a, b, + -- otherwise just sort the keys + if order then + table.sort(keys, function(a,b) return order(t, a, b) end) + else + table.sort(keys) + end + + -- return the iterator function + local i = 0 + return function() + i = i + 1 + if keys[i] then + return keys[i], t[keys[i]] + end + end +end + + +function routines.IsPartOfGroupInZones( CargoGroup, LandingZones ) +--trace.f() + + local CurrentZoneID = nil + + if CargoGroup then + local CargoUnits = CargoGroup:getUnits() + for CargoUnitID, CargoUnit in pairs( CargoUnits ) do + if CargoUnit and CargoUnit:getLife() >= 1.0 then + CurrentZoneID = routines.IsUnitInZones( CargoUnit, LandingZones ) + if CurrentZoneID then + break + end + end + end + end + +--trace.r( "", "", { CurrentZoneID } ) + return CurrentZoneID +end + + + +function routines.IsUnitInZones( TransportUnit, LandingZones ) +--trace.f("", "routines.IsUnitInZones" ) + + local TransportZoneResult = nil + local TransportZonePos = nil + local TransportZone = nil + + -- fill-up some local variables to support further calculations to determine location of units within the zone. + if TransportUnit then + local TransportUnitPos = TransportUnit:getPosition().p + if type( LandingZones ) == "table" then + for LandingZoneID, LandingZoneName in pairs( LandingZones ) do + TransportZone = trigger.misc.getZone( LandingZoneName ) + if TransportZone then + TransportZonePos = {radius = TransportZone.radius, x = TransportZone.point.x, y = TransportZone.point.y, z = TransportZone.point.z} + if ((( TransportUnitPos.x - TransportZonePos.x)^2 + (TransportUnitPos.z - TransportZonePos.z)^2)^0.5 <= TransportZonePos.radius) then + TransportZoneResult = LandingZoneID + break + end + end + end + else + TransportZone = trigger.misc.getZone( LandingZones ) + TransportZonePos = {radius = TransportZone.radius, x = TransportZone.point.x, y = TransportZone.point.y, z = TransportZone.point.z} + if ((( TransportUnitPos.x - TransportZonePos.x)^2 + (TransportUnitPos.z - TransportZonePos.z)^2)^0.5 <= TransportZonePos.radius) then + TransportZoneResult = 1 + end + end + if TransportZoneResult then + --trace.i( "routines", "TransportZone:" .. TransportZoneResult ) + else + --trace.i( "routines", "TransportZone:nil logic" ) + end + return TransportZoneResult + else + --trace.i( "routines", "TransportZone:nil hard" ) + return nil + end +end + +function routines.IsUnitNearZonesRadius( TransportUnit, LandingZones, ZoneRadius ) +--trace.f("", "routines.IsUnitInZones" ) + + local TransportZoneResult = nil + local TransportZonePos = nil + local TransportZone = nil + + -- fill-up some local variables to support further calculations to determine location of units within the zone. + if TransportUnit then + local TransportUnitPos = TransportUnit:getPosition().p + if type( LandingZones ) == "table" then + for LandingZoneID, LandingZoneName in pairs( LandingZones ) do + TransportZone = trigger.misc.getZone( LandingZoneName ) + if TransportZone then + TransportZonePos = {radius = TransportZone.radius, x = TransportZone.point.x, y = TransportZone.point.y, z = TransportZone.point.z} + if ((( TransportUnitPos.x - TransportZonePos.x)^2 + (TransportUnitPos.z - TransportZonePos.z)^2)^0.5 <= ZoneRadius ) then + TransportZoneResult = LandingZoneID + break + end + end + end + else + TransportZone = trigger.misc.getZone( LandingZones ) + TransportZonePos = {radius = TransportZone.radius, x = TransportZone.point.x, y = TransportZone.point.y, z = TransportZone.point.z} + if ((( TransportUnitPos.x - TransportZonePos.x)^2 + (TransportUnitPos.z - TransportZonePos.z)^2)^0.5 <= ZoneRadius ) then + TransportZoneResult = 1 + end + end + if TransportZoneResult then + --trace.i( "routines", "TransportZone:" .. TransportZoneResult ) + else + --trace.i( "routines", "TransportZone:nil logic" ) + end + return TransportZoneResult + else + --trace.i( "routines", "TransportZone:nil hard" ) + return nil + end +end + + +function routines.IsStaticInZones( TransportStatic, LandingZones ) +--trace.f() + + local TransportZoneResult = nil + local TransportZonePos = nil + local TransportZone = nil + + -- fill-up some local variables to support further calculations to determine location of units within the zone. + local TransportStaticPos = TransportStatic:getPosition().p + if type( LandingZones ) == "table" then + for LandingZoneID, LandingZoneName in pairs( LandingZones ) do + TransportZone = trigger.misc.getZone( LandingZoneName ) + if TransportZone then + TransportZonePos = {radius = TransportZone.radius, x = TransportZone.point.x, y = TransportZone.point.y, z = TransportZone.point.z} + if ((( TransportStaticPos.x - TransportZonePos.x)^2 + (TransportStaticPos.z - TransportZonePos.z)^2)^0.5 <= TransportZonePos.radius) then + TransportZoneResult = LandingZoneID + break + end + end + end + else + TransportZone = trigger.misc.getZone( LandingZones ) + TransportZonePos = {radius = TransportZone.radius, x = TransportZone.point.x, y = TransportZone.point.y, z = TransportZone.point.z} + if ((( TransportStaticPos.x - TransportZonePos.x)^2 + (TransportStaticPos.z - TransportZonePos.z)^2)^0.5 <= TransportZonePos.radius) then + TransportZoneResult = 1 + end + end + +--trace.r( "", "", { TransportZoneResult } ) + return TransportZoneResult +end + + +function routines.IsUnitInRadius( CargoUnit, ReferencePosition, Radius ) +--trace.f() + + local Valid = true + + -- fill-up some local variables to support further calculations to determine location of units within the zone. + local CargoPos = CargoUnit:getPosition().p + local ReferenceP = ReferencePosition.p + + if (((CargoPos.x - ReferenceP.x)^2 + (CargoPos.z - ReferenceP.z)^2)^0.5 <= Radius) then + else + Valid = false + end + + return Valid +end + +function routines.IsPartOfGroupInRadius( CargoGroup, ReferencePosition, Radius ) +--trace.f() + + local Valid = true + + Valid = routines.ValidateGroup( CargoGroup, "CargoGroup", Valid ) + + -- fill-up some local variables to support further calculations to determine location of units within the zone + local CargoUnits = CargoGroup:getUnits() + for CargoUnitId, CargoUnit in pairs( CargoUnits ) do + local CargoUnitPos = CargoUnit:getPosition().p +-- env.info( 'routines.IsPartOfGroupInRadius: CargoUnitPos.x = ' .. CargoUnitPos.x .. ' CargoUnitPos.z = ' .. CargoUnitPos.z ) + local ReferenceP = ReferencePosition.p +-- env.info( 'routines.IsPartOfGroupInRadius: ReferenceGroupPos.x = ' .. ReferenceGroupPos.x .. ' ReferenceGroupPos.z = ' .. ReferenceGroupPos.z ) + + if ((( CargoUnitPos.x - ReferenceP.x)^2 + (CargoUnitPos.z - ReferenceP.z)^2)^0.5 <= Radius) then + else + Valid = false + break + end + end + + return Valid +end + + +function routines.ValidateString( Variable, VariableName, Valid ) +--trace.f() + + if type( Variable ) == "string" then + if Variable == "" then + error( "routines.ValidateString: error: " .. VariableName .. " must be filled out!" ) + Valid = false + end + else + error( "routines.ValidateString: error: " .. VariableName .. " is not a string." ) + Valid = false + end + +--trace.r( "", "", { Valid } ) + return Valid +end + +function routines.ValidateNumber( Variable, VariableName, Valid ) +--trace.f() + + if type( Variable ) == "number" then + else + error( "routines.ValidateNumber: error: " .. VariableName .. " is not a number." ) + Valid = false + end + +--trace.r( "", "", { Valid } ) + return Valid + +end + +function routines.ValidateGroup( Variable, VariableName, Valid ) +--trace.f() + + if Variable == nil then + error( "routines.ValidateGroup: error: " .. VariableName .. " is a nil value!" ) + Valid = false + end + +--trace.r( "", "", { Valid } ) + return Valid +end + +function routines.ValidateZone( LandingZones, VariableName, Valid ) +--trace.f() + + if LandingZones == nil then + error( "routines.ValidateGroup: error: " .. VariableName .. " is a nil value!" ) + Valid = false + end + + if type( LandingZones ) == "table" then + for LandingZoneID, LandingZoneName in pairs( LandingZones ) do + if trigger.misc.getZone( LandingZoneName ) == nil then + error( "routines.ValidateGroup: error: Zone " .. LandingZoneName .. " does not exist!" ) + Valid = false + break + end + end + else + if trigger.misc.getZone( LandingZones ) == nil then + error( "routines.ValidateGroup: error: Zone " .. LandingZones .. " does not exist!" ) + Valid = false + end + end + +--trace.r( "", "", { Valid } ) + return Valid +end + +function routines.ValidateEnumeration( Variable, VariableName, Enum, Valid ) +--trace.f() + + local ValidVariable = false + + for EnumId, EnumData in pairs( Enum ) do + if Variable == EnumData then + ValidVariable = true + break + end + end + + if ValidVariable then + else + error( 'TransportValidateEnum: " .. VariableName .. " is not a valid type.' .. Variable ) + Valid = false + end + +--trace.r( "", "", { Valid } ) + return Valid +end + +function routines.getGroupRoute(groupIdent, task) -- same as getGroupPoints but returns speed and formation type along with vec2 of point} + -- refactor to search by groupId and allow groupId and groupName as inputs + local gpId = groupIdent + if type(groupIdent) == 'string' and not tonumber(groupIdent) then + gpId = _DATABASE.Templates.Groups[groupIdent].groupId + end + + for coa_name, coa_data in pairs(env.mission.coalition) do + if (coa_name == 'red' or coa_name == 'blue') and type(coa_data) == 'table' then + if coa_data.country then --there is a country table + for cntry_id, cntry_data in pairs(coa_data.country) do + for obj_type_name, obj_type_data in pairs(cntry_data) do + if obj_type_name == "helicopter" or obj_type_name == "ship" or obj_type_name == "plane" or obj_type_name == "vehicle" then -- only these types have points + if ((type(obj_type_data) == 'table') and obj_type_data.group and (type(obj_type_data.group) == 'table') and (#obj_type_data.group > 0)) then --there's a group! + for group_num, group_data in pairs(obj_type_data.group) do + if group_data and group_data.groupId == gpId then -- this is the group we are looking for + if group_data.route and group_data.route.points and #group_data.route.points > 0 then + local points = {} + + for point_num, point in pairs(group_data.route.points) do + local routeData = {} + if not point.point then + routeData.x = point.x + routeData.y = point.y + else + routeData.point = point.point --it's possible that the ME could move to the point = Vec2 notation. + end + routeData.form = point.action + routeData.speed = point.speed + routeData.alt = point.alt + routeData.alt_type = point.alt_type + routeData.airdromeId = point.airdromeId + routeData.helipadId = point.helipadId + routeData.type = point.type + routeData.action = point.action + if task then + routeData.task = point.task + end + points[point_num] = routeData + end + + return points + end + return + end --if group_data and group_data.name and group_data.name == 'groupname' + end --for group_num, group_data in pairs(obj_type_data.group) do + end --if ((type(obj_type_data) == 'table') and obj_type_data.group and (type(obj_type_data.group) == 'table') and (#obj_type_data.group > 0)) then + end --if obj_type_name == "helicopter" or obj_type_name == "ship" or obj_type_name == "plane" or obj_type_name == "vehicle" or obj_type_name == "static" then + end --for obj_type_name, obj_type_data in pairs(cntry_data) do + end --for cntry_id, cntry_data in pairs(coa_data.country) do + end --if coa_data.country then --there is a country table + end --if coa_name == 'red' or coa_name == 'blue' and type(coa_data) == 'table' then + end --for coa_name, coa_data in pairs(mission.coalition) do +end + +routines.ground.patrolRoute = function(vars) + + + local tempRoute = {} + local useRoute = {} + local gpData = vars.gpData + if type(gpData) == 'string' then + gpData = Group.getByName(gpData) + end + + local useGroupRoute + if not vars.useGroupRoute then + useGroupRoute = vars.gpData + else + useGroupRoute = vars.useGroupRoute + end + local routeProvided = false + if not vars.route then + if useGroupRoute then + tempRoute = routines.getGroupRoute(useGroupRoute) + end + else + useRoute = vars.route + local posStart = routines.getLeadPos(gpData) + useRoute[1] = routines.ground.buildWP(posStart, useRoute[1].action, useRoute[1].speed) + routeProvided = true + end + + + local overRideSpeed = vars.speed or 'default' + local pType = vars.pType + local offRoadForm = vars.offRoadForm or 'default' + local onRoadForm = vars.onRoadForm or 'default' + + if routeProvided == false and #tempRoute > 0 then + local posStart = routines.getLeadPos(gpData) + + + useRoute[#useRoute + 1] = routines.ground.buildWP(posStart, offRoadForm, overRideSpeed) + for i = 1, #tempRoute do + local tempForm = tempRoute[i].action + local tempSpeed = tempRoute[i].speed + + if offRoadForm == 'default' then + tempForm = tempRoute[i].action + end + if onRoadForm == 'default' then + onRoadForm = 'On Road' + end + if (string.lower(tempRoute[i].action) == 'on road' or string.lower(tempRoute[i].action) == 'onroad' or string.lower(tempRoute[i].action) == 'on_road') then + tempForm = onRoadForm + else + tempForm = offRoadForm + end + + if type(overRideSpeed) == 'number' then + tempSpeed = overRideSpeed + end + + + useRoute[#useRoute + 1] = routines.ground.buildWP(tempRoute[i], tempForm, tempSpeed) + end + + if pType and string.lower(pType) == 'doubleback' then + local curRoute = routines.utils.deepCopy(useRoute) + for i = #curRoute, 2, -1 do + useRoute[#useRoute + 1] = routines.ground.buildWP(curRoute[i], curRoute[i].action, curRoute[i].speed) + end + end + + useRoute[1].action = useRoute[#useRoute].action -- make it so the first WP matches the last WP + end + + local cTask3 = {} + local newPatrol = {} + newPatrol.route = useRoute + newPatrol.gpData = gpData:getName() + cTask3[#cTask3 + 1] = 'routines.ground.patrolRoute(' + cTask3[#cTask3 + 1] = routines.utils.oneLineSerialize(newPatrol) + cTask3[#cTask3 + 1] = ')' + cTask3 = table.concat(cTask3) + local tempTask = { + id = 'WrappedAction', + params = { + action = { + id = 'Script', + params = { + command = cTask3, + + }, + }, + }, + } + + + useRoute[#useRoute].task = tempTask + routines.goRoute(gpData, useRoute) + + return +end + +routines.ground.patrol = function(gpData, pType, form, speed) + local vars = {} + + if type(gpData) == 'table' and gpData:getName() then + gpData = gpData:getName() + end + + vars.useGroupRoute = gpData + vars.gpData = gpData + vars.pType = pType + vars.offRoadForm = form + vars.speed = speed + + routines.ground.patrolRoute(vars) + + return +end + +function routines.GetUnitHeight( CheckUnit ) +--trace.f( "routines" ) + + local UnitPoint = CheckUnit:getPoint() + local UnitPosition = { x = UnitPoint.x, y = UnitPoint.z } + local UnitHeight = UnitPoint.y + + local LandHeight = land.getHeight( UnitPosition ) + + --env.info(( 'CarrierHeight: LandHeight = ' .. LandHeight .. ' CarrierHeight = ' .. CarrierHeight )) + + --trace.f( "routines", "Unit Height = " .. UnitHeight - LandHeight ) + + return UnitHeight - LandHeight + +end + + + +Su34Status = { status = {} } +boardMsgRed = { statusMsg = "" } +boardMsgAll = { timeMsg = "" } +SpawnSettings = {} +Su34MenuPath = {} +Su34Menus = 0 + + +function Su34AttackCarlVinson(groupName) +--trace.menu("", "Su34AttackCarlVinson") + local groupSu34 = Group.getByName( groupName ) + local controllerSu34 = groupSu34.getController(groupSu34) + local groupCarlVinson = Group.getByName("US Carl Vinson #001") + controllerSu34.setOption( controllerSu34, AI.Option.Air.id.ROE, AI.Option.Air.val.ROE.OPEN_FIRE ) + controllerSu34.setOption( controllerSu34, AI.Option.Air.id.REACTION_ON_THREAT, AI.Option.Air.val.REACTION_ON_THREAT.EVADE_FIRE ) + if groupCarlVinson ~= nil then + controllerSu34.pushTask(controllerSu34,{id = 'AttackGroup', params = { groupId = groupCarlVinson:getID(), expend = AI.Task.WeaponExpend.ALL, attackQtyLimit = true}}) + end + Su34Status.status[groupName] = 1 + MessageToRed( string.format('%s: ',groupName) .. 'Attacking carrier Carl Vinson. ', 10, 'RedStatus' .. groupName ) +end + +function Su34AttackWest(groupName) +--trace.f("","Su34AttackWest") + local groupSu34 = Group.getByName( groupName ) + local controllerSu34 = groupSu34.getController(groupSu34) + local groupShipWest1 = Group.getByName("US Ship West #001") + local groupShipWest2 = Group.getByName("US Ship West #002") + controllerSu34.setOption( controllerSu34, AI.Option.Air.id.ROE, AI.Option.Air.val.ROE.OPEN_FIRE ) + controllerSu34.setOption( controllerSu34, AI.Option.Air.id.REACTION_ON_THREAT, AI.Option.Air.val.REACTION_ON_THREAT.EVADE_FIRE ) + if groupShipWest1 ~= nil then + controllerSu34.pushTask(controllerSu34,{id = 'AttackGroup', params = { groupId = groupShipWest1:getID(), expend = AI.Task.WeaponExpend.ALL, attackQtyLimit = true}}) + end + if groupShipWest2 ~= nil then + controllerSu34.pushTask(controllerSu34,{id = 'AttackGroup', params = { groupId = groupShipWest2:getID(), expend = AI.Task.WeaponExpend.ALL, attackQtyLimit = true}}) + end + Su34Status.status[groupName] = 2 + MessageToRed( string.format('%s: ',groupName) .. 'Attacking invading ships in the west. ', 10, 'RedStatus' .. groupName ) +end + +function Su34AttackNorth(groupName) +--trace.menu("","Su34AttackNorth") + local groupSu34 = Group.getByName( groupName ) + local controllerSu34 = groupSu34.getController(groupSu34) + local groupShipNorth1 = Group.getByName("US Ship North #001") + local groupShipNorth2 = Group.getByName("US Ship North #002") + local groupShipNorth3 = Group.getByName("US Ship North #003") + controllerSu34.setOption( controllerSu34, AI.Option.Air.id.ROE, AI.Option.Air.val.ROE.OPEN_FIRE ) + controllerSu34.setOption( controllerSu34, AI.Option.Air.id.REACTION_ON_THREAT, AI.Option.Air.val.REACTION_ON_THREAT.EVADE_FIRE ) + if groupShipNorth1 ~= nil then + controllerSu34.pushTask(controllerSu34,{id = 'AttackGroup', params = { groupId = groupShipNorth1:getID(), expend = AI.Task.WeaponExpend.ALL, attackQtyLimit = false}}) + end + if groupShipNorth2 ~= nil then + controllerSu34.pushTask(controllerSu34,{id = 'AttackGroup', params = { groupId = groupShipNorth2:getID(), expend = AI.Task.WeaponExpend.ALL, attackQtyLimit = false}}) + end + if groupShipNorth3 ~= nil then + controllerSu34.pushTask(controllerSu34,{id = 'AttackGroup', params = { groupId = groupShipNorth3:getID(), expend = AI.Task.WeaponExpend.ALL, attackQtyLimit = false}}) + end + Su34Status.status[groupName] = 3 + MessageToRed( string.format('%s: ',groupName) .. 'Attacking invading ships in the north. ', 10, 'RedStatus' .. groupName ) +end + +function Su34Orbit(groupName) +--trace.menu("","Su34Orbit") + local groupSu34 = Group.getByName( groupName ) + local controllerSu34 = groupSu34:getController() + controllerSu34.setOption( controllerSu34, AI.Option.Air.id.ROE, AI.Option.Air.val.ROE.WEAPON_HOLD ) + controllerSu34.setOption( controllerSu34, AI.Option.Air.id.REACTION_ON_THREAT, AI.Option.Air.val.REACTION_ON_THREAT.EVADE_FIRE ) + controllerSu34:pushTask( {id = 'ControlledTask', params = { task = { id = 'Orbit', params = { pattern = AI.Task.OrbitPattern.RACE_TRACK } }, stopCondition = { duration = 600 } } } ) + Su34Status.status[groupName] = 4 + MessageToRed( string.format('%s: ',groupName) .. 'In orbit and awaiting further instructions. ', 10, 'RedStatus' .. groupName ) +end + +function Su34TakeOff(groupName) +--trace.menu("","Su34TakeOff") + local groupSu34 = Group.getByName( groupName ) + local controllerSu34 = groupSu34:getController() + controllerSu34.setOption( controllerSu34, AI.Option.Air.id.ROE, AI.Option.Air.val.ROE.WEAPON_HOLD ) + controllerSu34.setOption( controllerSu34, AI.Option.Air.id.REACTION_ON_THREAT, AI.Option.Air.val.REACTION_ON_THREAT.BYPASS_AND_ESCAPE ) + Su34Status.status[groupName] = 8 + MessageToRed( string.format('%s: ',groupName) .. 'Take-Off. ', 10, 'RedStatus' .. groupName ) +end + +function Su34Hold(groupName) +--trace.menu("","Su34Hold") + local groupSu34 = Group.getByName( groupName ) + local controllerSu34 = groupSu34:getController() + controllerSu34.setOption( controllerSu34, AI.Option.Air.id.ROE, AI.Option.Air.val.ROE.WEAPON_HOLD ) + controllerSu34.setOption( controllerSu34, AI.Option.Air.id.REACTION_ON_THREAT, AI.Option.Air.val.REACTION_ON_THREAT.BYPASS_AND_ESCAPE ) + Su34Status.status[groupName] = 5 + MessageToRed( string.format('%s: ',groupName) .. 'Holding Weapons. ', 10, 'RedStatus' .. groupName ) +end + +function Su34RTB(groupName) +--trace.menu("","Su34RTB") + Su34Status.status[groupName] = 6 + MessageToRed( string.format('%s: ',groupName) .. 'Return to Krasnodar. ', 10, 'RedStatus' .. groupName ) +end + +function Su34Destroyed(groupName) +--trace.menu("","Su34Destroyed") + Su34Status.status[groupName] = 7 + MessageToRed( string.format('%s: ',groupName) .. 'Destroyed. ', 30, 'RedStatus' .. groupName ) +end + +function GroupAlive( groupName ) +--trace.menu("","GroupAlive") + local groupTest = Group.getByName( groupName ) + + local groupExists = false + + if groupTest then + groupExists = groupTest:isExist() + end + + --trace.r( "", "", { groupExists } ) + return groupExists +end + +function Su34IsDead() +--trace.f() + +end + +function Su34OverviewStatus() +--trace.menu("","Su34OverviewStatus") + local msg = "" + local currentStatus = 0 + local Exists = false + + for groupName, currentStatus in pairs(Su34Status.status) do + + env.info(('Su34 Overview Status: GroupName = ' .. groupName )) + Alive = GroupAlive( groupName ) + + if Alive then + if currentStatus == 1 then + msg = msg .. string.format("%s: ",groupName) + msg = msg .. "Attacking carrier Carl Vinson. " + elseif currentStatus == 2 then + msg = msg .. string.format("%s: ",groupName) + msg = msg .. "Attacking supporting ships in the west. " + elseif currentStatus == 3 then + msg = msg .. string.format("%s: ",groupName) + msg = msg .. "Attacking invading ships in the north. " + elseif currentStatus == 4 then + msg = msg .. string.format("%s: ",groupName) + msg = msg .. "In orbit and awaiting further instructions. " + elseif currentStatus == 5 then + msg = msg .. string.format("%s: ",groupName) + msg = msg .. "Holding Weapons. " + elseif currentStatus == 6 then + msg = msg .. string.format("%s: ",groupName) + msg = msg .. "Return to Krasnodar. " + elseif currentStatus == 7 then + msg = msg .. string.format("%s: ",groupName) + msg = msg .. "Destroyed. " + elseif currentStatus == 8 then + msg = msg .. string.format("%s: ",groupName) + msg = msg .. "Take-Off. " + end + else + if currentStatus == 7 then + msg = msg .. string.format("%s: ",groupName) + msg = msg .. "Destroyed. " + else + Su34Destroyed(groupName) + end + end + end + + boardMsgRed.statusMsg = msg +end + + +function UpdateBoardMsg() +--trace.f() + Su34OverviewStatus() + MessageToRed( boardMsgRed.statusMsg, 15, 'RedStatus' ) +end + +function MusicReset( flg ) +--trace.f() + trigger.action.setUserFlag(95,flg) +end + +function PlaneActivate(groupNameFormat, flg) +--trace.f() + local groupName = groupNameFormat .. string.format("#%03d", trigger.misc.getUserFlag(flg)) + --trigger.action.outText(groupName,10) + trigger.action.activateGroup(Group.getByName(groupName)) +end + +function Su34Menu(groupName) +--trace.f() + + --env.info(( 'Su34Menu(' .. groupName .. ')' )) + local groupSu34 = Group.getByName( groupName ) + + if Su34Status.status[groupName] == 1 or + Su34Status.status[groupName] == 2 or + Su34Status.status[groupName] == 3 or + Su34Status.status[groupName] == 4 or + Su34Status.status[groupName] == 5 then + if Su34MenuPath[groupName] == nil then + if planeMenuPath == nil then + planeMenuPath = missionCommands.addSubMenuForCoalition( + coalition.side.RED, + "SU-34 anti-ship flights", + nil + ) + end + Su34MenuPath[groupName] = missionCommands.addSubMenuForCoalition( + coalition.side.RED, + "Flight " .. groupName, + planeMenuPath + ) + + missionCommands.addCommandForCoalition( + coalition.side.RED, + "Attack carrier Carl Vinson", + Su34MenuPath[groupName], + Su34AttackCarlVinson, + groupName + ) + + missionCommands.addCommandForCoalition( + coalition.side.RED, + "Attack ships in the west", + Su34MenuPath[groupName], + Su34AttackWest, + groupName + ) + + missionCommands.addCommandForCoalition( + coalition.side.RED, + "Attack ships in the north", + Su34MenuPath[groupName], + Su34AttackNorth, + groupName + ) + + missionCommands.addCommandForCoalition( + coalition.side.RED, + "Hold position and await instructions", + Su34MenuPath[groupName], + Su34Orbit, + groupName + ) + + missionCommands.addCommandForCoalition( + coalition.side.RED, + "Report status", + Su34MenuPath[groupName], + Su34OverviewStatus + ) + end + else + if Su34MenuPath[groupName] then + missionCommands.removeItemForCoalition(coalition.side.RED, Su34MenuPath[groupName]) + end + end +end + +--- Obsolete function, but kept to rework in framework. + +function ChooseInfantry ( TeleportPrefixTable, TeleportMax ) +--trace.f("Spawn") + --env.info(( 'ChooseInfantry: ' )) + + TeleportPrefixTableCount = #TeleportPrefixTable + TeleportPrefixTableIndex = math.random( 1, TeleportPrefixTableCount ) + + --env.info(( 'ChooseInfantry: TeleportPrefixTableIndex = ' .. TeleportPrefixTableIndex .. ' TeleportPrefixTableCount = ' .. TeleportPrefixTableCount .. ' TeleportMax = ' .. TeleportMax )) + + local TeleportFound = false + local TeleportLoop = true + local Index = TeleportPrefixTableIndex + local TeleportPrefix = '' + + while TeleportLoop do + TeleportPrefix = TeleportPrefixTable[Index] + if SpawnSettings[TeleportPrefix] then + if SpawnSettings[TeleportPrefix]['SpawnCount'] - 1 < TeleportMax then + SpawnSettings[TeleportPrefix]['SpawnCount'] = SpawnSettings[TeleportPrefix]['SpawnCount'] + 1 + TeleportFound = true + else + TeleportFound = false + end + else + SpawnSettings[TeleportPrefix] = {} + SpawnSettings[TeleportPrefix]['SpawnCount'] = 0 + TeleportFound = true + end + if TeleportFound then + TeleportLoop = false + else + if Index < TeleportPrefixTableCount then + Index = Index + 1 + else + TeleportLoop = false + end + end + --env.info(( 'ChooseInfantry: Loop 1 - TeleportPrefix = ' .. TeleportPrefix .. ' Index = ' .. Index )) + end + + if TeleportFound == false then + TeleportLoop = true + Index = 1 + while TeleportLoop do + TeleportPrefix = TeleportPrefixTable[Index] + if SpawnSettings[TeleportPrefix] then + if SpawnSettings[TeleportPrefix]['SpawnCount'] - 1 < TeleportMax then + SpawnSettings[TeleportPrefix]['SpawnCount'] = SpawnSettings[TeleportPrefix]['SpawnCount'] + 1 + TeleportFound = true + else + TeleportFound = false + end + else + SpawnSettings[TeleportPrefix] = {} + SpawnSettings[TeleportPrefix]['SpawnCount'] = 0 + TeleportFound = true + end + if TeleportFound then + TeleportLoop = false + else + if Index < TeleportPrefixTableIndex then + Index = Index + 1 + else + TeleportLoop = false + end + end + --env.info(( 'ChooseInfantry: Loop 2 - TeleportPrefix = ' .. TeleportPrefix .. ' Index = ' .. Index )) + end + end + + local TeleportGroupName = '' + if TeleportFound == true then + TeleportGroupName = TeleportPrefix .. string.format("#%03d", SpawnSettings[TeleportPrefix]['SpawnCount'] ) + else + TeleportGroupName = '' + end + + --env.info(('ChooseInfantry: TeleportGroupName = ' .. TeleportGroupName )) + --env.info(('ChooseInfantry: return')) + + return TeleportGroupName +end + +SpawnedInfantry = 0 + +function LandCarrier ( CarrierGroup, LandingZonePrefix ) +--trace.f() + --env.info(( 'LandCarrier: ' )) + --env.info(( 'LandCarrier: CarrierGroup = ' .. CarrierGroup:getName() )) + --env.info(( 'LandCarrier: LandingZone = ' .. LandingZonePrefix )) + + local controllerGroup = CarrierGroup:getController() + + local LandingZone = trigger.misc.getZone(LandingZonePrefix) + local LandingZonePos = {} + LandingZonePos.x = LandingZone.point.x + math.random(LandingZone.radius * -1, LandingZone.radius) + LandingZonePos.y = LandingZone.point.z + math.random(LandingZone.radius * -1, LandingZone.radius) + + controllerGroup:pushTask( { id = 'Land', params = { point = LandingZonePos, durationFlag = true, duration = 10 } } ) + + --env.info(( 'LandCarrier: end' )) +end + +EscortCount = 0 +function EscortCarrier ( CarrierGroup, EscortPrefix, EscortLastWayPoint, EscortEngagementDistanceMax, EscortTargetTypes ) +--trace.f() + --env.info(( 'EscortCarrier: ' )) + --env.info(( 'EscortCarrier: CarrierGroup = ' .. CarrierGroup:getName() )) + --env.info(( 'EscortCarrier: EscortPrefix = ' .. EscortPrefix )) + + local CarrierName = CarrierGroup:getName() + + local EscortMission = {} + local CarrierMission = {} + + local EscortMission = SpawnMissionGroup( EscortPrefix ) + local CarrierMission = SpawnMissionGroup( CarrierGroup:getName() ) + + if EscortMission ~= nil and CarrierMission ~= nil then + + EscortCount = EscortCount + 1 + EscortMissionName = string.format( EscortPrefix .. '#Escort %s', CarrierName ) + EscortMission.name = EscortMissionName + EscortMission.groupId = nil + EscortMission.lateActivation = false + EscortMission.taskSelected = false + + local EscortUnits = #EscortMission.units + for u = 1, EscortUnits do + EscortMission.units[u].name = string.format( EscortPrefix .. '#Escort %s %02d', CarrierName, u ) + EscortMission.units[u].unitId = nil + end + + + EscortMission.route.points[1].task = { id = "ComboTask", + params = + { + tasks = + { + [1] = + { + enabled = true, + auto = false, + id = "Escort", + number = 1, + params = + { + lastWptIndexFlagChangedManually = false, + groupId = CarrierGroup:getID(), + lastWptIndex = nil, + lastWptIndexFlag = false, + engagementDistMax = EscortEngagementDistanceMax, + targetTypes = EscortTargetTypes, + pos = + { + y = 20, + x = 20, + z = 0, + } -- end of ["pos"] + } -- end of ["params"] + } -- end of [1] + } -- end of ["tasks"] + } -- end of ["params"] + } -- end of ["task"] + + SpawnGroupAdd( EscortPrefix, EscortMission ) + + end +end + +function SendMessageToCarrier( CarrierGroup, CarrierMessage ) +--trace.f() + + if CarrierGroup ~= nil then + MessageToGroup( CarrierGroup, CarrierMessage, 30, 'Carrier/' .. CarrierGroup:getName() ) + end + +end + +function MessageToGroup( MsgGroup, MsgText, MsgTime, MsgName ) +--trace.f() + + if type(MsgGroup) == 'string' then + --env.info( 'MessageToGroup: Converted MsgGroup string "' .. MsgGroup .. '" into a Group structure.' ) + MsgGroup = Group.getByName( MsgGroup ) + end + + if MsgGroup ~= nil then + local MsgTable = {} + MsgTable.text = MsgText + MsgTable.displayTime = MsgTime + MsgTable.msgFor = { units = { MsgGroup:getUnits()[1]:getName() } } + MsgTable.name = MsgName + --routines.message.add( MsgTable ) + --env.info(('MessageToGroup: Message sent to ' .. MsgGroup:getUnits()[1]:getName() .. ' -> ' .. MsgText )) + end +end + +function MessageToUnit( UnitName, MsgText, MsgTime, MsgName ) +--trace.f() + + if UnitName ~= nil then + local MsgTable = {} + MsgTable.text = MsgText + MsgTable.displayTime = MsgTime + MsgTable.msgFor = { units = { UnitName } } + MsgTable.name = MsgName + --routines.message.add( MsgTable ) + end +end + +function MessageToAll( MsgText, MsgTime, MsgName ) +--trace.f() + + MESSAGE:New( MsgText, "Message", MsgTime, MsgName ):ToCoalition( coalition.side.RED ):ToCoalition( coalition.side.BLUE ) +end + +function MessageToRed( MsgText, MsgTime, MsgName ) +--trace.f() + + MESSAGE:New( MsgText, "To Red Coalition", MsgTime, MsgName ):ToCoalition( coalition.side.RED ) +end + +function MessageToBlue( MsgText, MsgTime, MsgName ) +--trace.f() + + MESSAGE:New( MsgText, "To Blue Coalition", MsgTime, MsgName ):ToCoalition( coalition.side.RED ) +end + +function getCarrierHeight( CarrierGroup ) +--trace.f() + + if CarrierGroup ~= nil then + if table.getn(CarrierGroup:getUnits()) == 1 then + local CarrierUnit = CarrierGroup:getUnits()[1] + local CurrentPoint = CarrierUnit:getPoint() + + local CurrentPosition = { x = CurrentPoint.x, y = CurrentPoint.z } + local CarrierHeight = CurrentPoint.y + + local LandHeight = land.getHeight( CurrentPosition ) + + --env.info(( 'CarrierHeight: LandHeight = ' .. LandHeight .. ' CarrierHeight = ' .. CarrierHeight )) + + return CarrierHeight - LandHeight + else + return 999999 + end + else + return 999999 + end + +end + +function GetUnitHeight( CheckUnit ) +--trace.f() + + local UnitPoint = CheckUnit:getPoint() + local UnitPosition = { x = CurrentPoint.x, y = CurrentPoint.z } + local UnitHeight = CurrentPoint.y + + local LandHeight = land.getHeight( CurrentPosition ) + + --env.info(( 'CarrierHeight: LandHeight = ' .. LandHeight .. ' CarrierHeight = ' .. CarrierHeight )) + + return UnitHeight - LandHeight + +end + + +_MusicTable = {} +_MusicTable.Files = {} +_MusicTable.Queue = {} +_MusicTable.FileCnt = 0 + + +function MusicRegister( SndRef, SndFile, SndTime ) +--trace.f() + + env.info(( 'MusicRegister: SndRef = ' .. SndRef )) + env.info(( 'MusicRegister: SndFile = ' .. SndFile )) + env.info(( 'MusicRegister: SndTime = ' .. SndTime )) + + + _MusicTable.FileCnt = _MusicTable.FileCnt + 1 + + _MusicTable.Files[_MusicTable.FileCnt] = {} + _MusicTable.Files[_MusicTable.FileCnt].Ref = SndRef + _MusicTable.Files[_MusicTable.FileCnt].File = SndFile + _MusicTable.Files[_MusicTable.FileCnt].Time = SndTime + + if not _MusicTable.Function then + _MusicTable.Function = routines.scheduleFunction( MusicScheduler, { }, timer.getTime() + 10, 10) + end + +end + +function MusicToPlayer( SndRef, PlayerName, SndContinue ) +--trace.f() + + --env.info(( 'MusicToPlayer: SndRef = ' .. SndRef )) + + local PlayerUnits = AlivePlayerUnits() + for PlayerUnitIdx, PlayerUnit in pairs(PlayerUnits) do + local PlayerUnitName = PlayerUnit:getPlayerName() + --env.info(( 'MusicToPlayer: PlayerUnitName = ' .. PlayerUnitName )) + if PlayerName == PlayerUnitName then + PlayerGroup = PlayerUnit:getGroup() + if PlayerGroup then + --env.info(( 'MusicToPlayer: PlayerGroup = ' .. PlayerGroup:getName() )) + MusicToGroup( SndRef, PlayerGroup, SndContinue ) + end + break + end + end + + --env.info(( 'MusicToPlayer: end' )) + +end + +function MusicToGroup( SndRef, SndGroup, SndContinue ) +--trace.f() + + --env.info(( 'MusicToGroup: SndRef = ' .. SndRef )) + + if SndGroup ~= nil then + if _MusicTable and _MusicTable.FileCnt > 0 then + if SndGroup:isExist() then + if MusicCanStart(SndGroup:getUnit(1):getPlayerName()) then + --env.info(( 'MusicToGroup: OK for Sound.' )) + local SndIdx = 0 + if SndRef == '' then + --env.info(( 'MusicToGroup: SndRef as empty. Queueing at random.' )) + SndIdx = math.random( 1, _MusicTable.FileCnt ) + else + for SndIdx = 1, _MusicTable.FileCnt do + if _MusicTable.Files[SndIdx].Ref == SndRef then + break + end + end + end + --env.info(( 'MusicToGroup: SndIdx = ' .. SndIdx )) + --env.info(( 'MusicToGroup: Queueing Music ' .. _MusicTable.Files[SndIdx].File .. ' for Group ' .. SndGroup:getID() )) + trigger.action.outSoundForGroup( SndGroup:getID(), _MusicTable.Files[SndIdx].File ) + MessageToGroup( SndGroup, 'Playing ' .. _MusicTable.Files[SndIdx].File, 15, 'Music-' .. SndGroup:getUnit(1):getPlayerName() ) + + local SndQueueRef = SndGroup:getUnit(1):getPlayerName() + if _MusicTable.Queue[SndQueueRef] == nil then + _MusicTable.Queue[SndQueueRef] = {} + end + _MusicTable.Queue[SndQueueRef].Start = timer.getTime() + _MusicTable.Queue[SndQueueRef].PlayerName = SndGroup:getUnit(1):getPlayerName() + _MusicTable.Queue[SndQueueRef].Group = SndGroup + _MusicTable.Queue[SndQueueRef].ID = SndGroup:getID() + _MusicTable.Queue[SndQueueRef].Ref = SndIdx + _MusicTable.Queue[SndQueueRef].Continue = SndContinue + _MusicTable.Queue[SndQueueRef].Type = Group + end + end + end + end +end + +function MusicCanStart(PlayerName) +--trace.f() + + --env.info(( 'MusicCanStart:' )) + + local MusicOut = false + + if _MusicTable['Queue'] ~= nil and _MusicTable.FileCnt > 0 then + --env.info(( 'MusicCanStart: PlayerName = ' .. PlayerName )) + local PlayerFound = false + local MusicStart = 0 + local MusicTime = 0 + for SndQueueIdx, SndQueue in pairs( _MusicTable.Queue ) do + if SndQueue.PlayerName == PlayerName then + PlayerFound = true + MusicStart = SndQueue.Start + MusicTime = _MusicTable.Files[SndQueue.Ref].Time + break + end + end + if PlayerFound then + --env.info(( 'MusicCanStart: MusicStart = ' .. MusicStart )) + --env.info(( 'MusicCanStart: MusicTime = ' .. MusicTime )) + --env.info(( 'MusicCanStart: timer.getTime() = ' .. timer.getTime() )) + + if MusicStart + MusicTime <= timer.getTime() then + MusicOut = true + end + else + MusicOut = true + end + end + + if MusicOut then + --env.info(( 'MusicCanStart: true' )) + else + --env.info(( 'MusicCanStart: false' )) + end + + return MusicOut +end + +function MusicScheduler() +--trace.scheduled("", "MusicScheduler") + + --env.info(( 'MusicScheduler:' )) + if _MusicTable['Queue'] ~= nil and _MusicTable.FileCnt > 0 then + --env.info(( 'MusicScheduler: Walking Sound Queue.')) + for SndQueueIdx, SndQueue in pairs( _MusicTable.Queue ) do + if SndQueue.Continue then + if MusicCanStart(SndQueue.PlayerName) then + --env.info(('MusicScheduler: MusicToGroup')) + MusicToPlayer( '', SndQueue.PlayerName, true ) + end + end + end + end + +end + + +env.info(( 'Init: Scripts Loaded v1.1' )) + +--- BASE classes. +-- +-- @{#BASE} class +-- ============== +-- The @{#BASE} class is the super class for most of the classes defined within MOOSE. +-- +-- It handles: +-- +-- * The construction and inheritance of child classes. +-- * The tracing of objects during mission execution within the DCS.log file (under saved games folder). +-- +-- Note: Normally you would not use the BASE class unless you are extending the MOOSE framework with new classes. +-- +-- BASE Trace functionality +-- ======================== +-- The BASE class contains trace methods to trace progress within a mission execution of a certain object. +-- Note that these trace methods are inherited by each MOOSE class interiting BASE. +-- As such, each object created from derived class from BASE can use the tracing functions to trace its execution. +-- +-- Trace a function call +-- --------------------- +-- There are basically 3 types of tracing methods available within BASE: +-- +-- * @{#BASE.F}: Trace the beginning of a function and its given parameters. +-- * @{#BASE.T}: Trace further logic within a function giving optional variables or parameters. +-- * @{#BASE.E}: Trace an execption within a function giving optional variables or parameters. An exception will always be traced. +-- +-- Tracing levels +-- -------------- +-- There are 3 tracing levels within MOOSE. +-- These tracing levels were defined to avoid bulks of tracing to be generated by lots of objects. +-- +-- As such, the F and T methods have additional variants to trace level 2 and 3 respectively: +-- +-- * @{#BASE.F2}: Trace the beginning of a function and its given parameters with tracing level 2. +-- * @{#BASE.F3}: Trace the beginning of a function and its given parameters with tracing level 3. +-- * @{#BASE.T2}: Trace further logic within a function giving optional variables or parameters with tracing level 2. +-- * @{#BASE.T3}: Trace further logic within a function giving optional variables or parameters with tracing level 3. +-- +-- BASE Inheritance support +-- ======================== +-- The following methods are available to support inheritance: +-- +-- * @{#BASE.Inherit}: Inherits from a class. +-- * @{#BASE.Inherited}: Returns the parent class from the class. +-- +-- Future +-- ====== +-- Further methods may be added to BASE whenever there is a need to make "overall" functions available within MOOSE. +-- +-- ==== +-- +-- @module Base +-- @author FlightControl + +Include.File( "Routines" ) + +local _TraceOn = true +local _TraceLevel = 1 +local _TraceClass = { + --DATABASE = true, + --SEAD = true, + --DESTROYBASETASK = true, + --MOVEMENT = true, + --SPAWN = true, + --STAGE = true, + --ZONE = true, + --GROUP = true, + --UNIT = true, + --CLIENT = true, + --CARGO = true, + --CARGO_GROUP = true, + --CARGO_PACKAGE = true, + --CARGO_SLINGLOAD = true, + --CARGO_ZONE = true, + --CLEANUP = true, + --MENU_CLIENT = true, + --MENU_CLIENT_COMMAND = true, + --ESCORT = true, + } +local _TraceClassMethod = {} + +--- The BASE Class +-- @type BASE +-- @field ClassName The name of the class. +-- @field ClassID The ID number of the class. +BASE = { + ClassName = "BASE", + ClassID = 0, + Events = {} +} + +--- The Formation Class +-- @type FORMATION +-- @field Cone A cone formation. +FORMATION = { + Cone = "Cone" +} + + + +--- The base constructor. This is the top top class of all classed defined within the MOOSE. +-- Any new class needs to be derived from this class for proper inheritance. +-- @param #BASE self +-- @return #BASE The new instance of the BASE class. +-- @usage +-- function TASK:New() +-- +-- local self = BASE:Inherit( self, BASE:New() ) +-- +-- -- assign Task default values during construction +-- self.TaskBriefing = "Task: No Task." +-- self.Time = timer.getTime() +-- self.ExecuteStage = _TransportExecuteStage.NONE +-- +-- return self +-- end +-- @todo need to investigate if the deepCopy is really needed... Don't think so. +function BASE:New() + local Child = routines.utils.deepCopy( self ) + local Parent = {} + setmetatable( Child, Parent ) + Child.__index = Child + self.ClassID = self.ClassID + 1 + Child.ClassID = self.ClassID + --Child.AddEvent( Child, S_EVENT_BIRTH, Child.EventBirth ) + return Child +end + +--- This is the worker method to inherit from a parent class. +-- @param #BASE self +-- @param Child is the Child class that inherits. +-- @param #BASE Parent is the Parent class that the Child inherits from. +-- @return #BASE Child +function BASE:Inherit( Child, Parent ) + local Child = routines.utils.deepCopy( Child ) + local Parent = routines.utils.deepCopy( Parent ) + if Child ~= nil then + setmetatable( Child, Parent ) + Child.__index = Child + end + --Child.ClassName = Child.ClassName .. '.' .. Child.ClassID + self:T( 'Inherited from ' .. Parent.ClassName ) + return Child +end + +--- This is the worker method to retrieve the Parent class. +-- @param #BASE self +-- @param #BASE Child is the Child class from which the Parent class needs to be retrieved. +-- @return #BASE +function BASE:Inherited( Child ) + local Parent = getmetatable( Child ) +-- env.info('Inherited class of ' .. Child.ClassName .. ' is ' .. Parent.ClassName ) + return Parent +end + +--- Get the ClassName + ClassID of the class instance. +-- The ClassName + ClassID is formatted as '%s#%09d'. +-- @param #BASE self +-- @return #string The ClassName + ClassID of the class instance. +function BASE:GetClassNameAndID() + return string.format( '%s#%09d', self:GetClassName(), self:GetClassID() ) +end + +--- Get the ClassName of the class instance. +-- @param #BASE self +-- @return #string The ClassName of the class instance. +function BASE:GetClassName() + return self.ClassName +end + +--- Get the ClassID of the class instance. +-- @param #BASE self +-- @return #string The ClassID of the class instance. +function BASE:GetClassID() + return self.ClassID +end + +--- Set a new listener for the class. +-- @param self +-- @param DCSTypes#Event Event +-- @param #function EventFunction +-- @return #BASE +function BASE:AddEvent( Event, EventFunction ) + self:F( Event ) + + self.Events[#self.Events+1] = {} + self.Events[#self.Events].Event = Event + self.Events[#self.Events].EventFunction = EventFunction + self.Events[#self.Events].EventEnabled = false + + return self +end + +--- Returns the event dispatcher +-- @param #BASE self +-- @return Event#EVENT +function BASE:Event() + + return _EVENTDISPATCHER +end + + + + + +--- Enable the event listeners for the class. +-- @param #BASE self +-- @return #BASE +function BASE:EnableEvents() + self:F( #self.Events ) + + for EventID, Event in pairs( self.Events ) do + Event.Self = self + Event.EventEnabled = true + end + self.Events.Handler = world.addEventHandler( self ) + + return self +end + + +--- Disable the event listeners for the class. +-- @param #BASE self +-- @return #BASE +function BASE:DisableEvents() + self:F() + + world.removeEventHandler( self ) + for EventID, Event in pairs( self.Events ) do + Event.Self = nil + Event.EventEnabled = false + end + + return self +end + + +local BaseEventCodes = { + "S_EVENT_SHOT", + "S_EVENT_HIT", + "S_EVENT_TAKEOFF", + "S_EVENT_LAND", + "S_EVENT_CRASH", + "S_EVENT_EJECTION", + "S_EVENT_REFUELING", + "S_EVENT_DEAD", + "S_EVENT_PILOT_DEAD", + "S_EVENT_BASE_CAPTURED", + "S_EVENT_MISSION_START", + "S_EVENT_MISSION_END", + "S_EVENT_TOOK_CONTROL", + "S_EVENT_REFUELING_STOP", + "S_EVENT_BIRTH", + "S_EVENT_HUMAN_FAILURE", + "S_EVENT_ENGINE_STARTUP", + "S_EVENT_ENGINE_SHUTDOWN", + "S_EVENT_PLAYER_ENTER_UNIT", + "S_EVENT_PLAYER_LEAVE_UNIT", + "S_EVENT_PLAYER_COMMENT", + "S_EVENT_SHOOTING_START", + "S_EVENT_SHOOTING_END", + "S_EVENT_MAX", +} + +--onEvent( {[1]="S_EVENT_BIRTH",[2]={["subPlace"]=5,["time"]=0,["initiator"]={["id_"]=16884480,},["place"]={["id_"]=5000040,},["id"]=15,["IniUnitName"]="US F-15C@RAMP-Air Support Mountains#001-01",},} +-- Event = { +-- id = enum world.event, +-- time = Time, +-- initiator = Unit, +-- target = Unit, +-- place = Unit, +-- subPlace = enum world.BirthPlace, +-- weapon = Weapon +-- } + +--- Creation of a Birth Event. +-- @param #BASE self +-- @param DCSTypes#Time EventTime The time stamp of the event. +-- @param DCSObject#Object Initiator The initiating object of the event. +-- @param #string IniUnitName The initiating unit name. +-- @param place +-- @param subplace +function BASE:CreateEventBirth( EventTime, Initiator, IniUnitName, place, subplace ) + self:F( { EventTime, Initiator, IniUnitName, place, subplace } ) + + local Event = { + id = world.event.S_EVENT_BIRTH, + time = EventTime, + initiator = Initiator, + IniUnitName = IniUnitName, + place = place, + subplace = subplace + } + + world.onEvent( Event ) +end + +--- Creation of a Crash Event. +-- @param #BASE self +-- @param DCSTypes#Time EventTime The time stamp of the event. +-- @param DCSObject#Object Initiator The initiating object of the event. +function BASE:CreateEventCrash( EventTime, Initiator ) + self:F( { EventTime, Initiator } ) + + local Event = { + id = world.event.S_EVENT_CRASH, + time = EventTime, + initiator = Initiator, + } + + world.onEvent( Event ) +end + +-- TODO: Complete DCSTypes#Event structure. +--- The main event handling function... This function captures all events generated for the class. +-- @param #BASE self +-- @param DCSTypes#Event event +function BASE:onEvent(event) + --self:F( { BaseEventCodes[event.id], event } ) + + if self then + for EventID, EventObject in pairs( self.Events ) do + if EventObject.EventEnabled then + --env.info( 'onEvent Table EventObject.Self = ' .. tostring(EventObject.Self) ) + --env.info( 'onEvent event.id = ' .. tostring(event.id) ) + --env.info( 'onEvent EventObject.Event = ' .. tostring(EventObject.Event) ) + if event.id == EventObject.Event then + if self == EventObject.Self then + if event.initiator and event.initiator:isExist() then + event.IniUnitName = event.initiator:getName() + end + if event.target and event.target:isExist() then + event.TgtUnitName = event.target:getName() + end + --self:T( { BaseEventCodes[event.id], event } ) + --EventObject.EventFunction( self, event ) + end + end + end + end + end +end + +-- Trace section + +-- Log a trace (only shown when trace is on) +-- TODO: Make trace function using variable parameters. + +--- Set trace level +-- @param #BASE self +-- @param #number Level +function BASE:TraceLevel( Level ) + _TraceLevel = Level + self:E( "Tracing level " .. Level ) +end + +--- Set tracing for a class +-- @param #BASE self +-- @param #string Class +function BASE:TraceClass( Class ) + _TraceClass[Class] = true + _TraceClassMethod[Class] = {} + self:E( "Tracing class " .. Class ) +end + +--- Set tracing for a specific method of class +-- @param #BASE self +-- @param #string Class +-- @param #string Method +function BASE:TraceClassMethod( Class, Method ) + if not _TraceClassMethod[Class] then + _TraceClassMethod[Class] = {} + _TraceClassMethod[Class].Method = {} + end + _TraceClassMethod[Class].Method[Method] = true + self:E( "Tracing method " .. Method .. " of class " .. Class ) +end + +--- Trace a function call. Must be at the beginning of the function logic. +-- @param #BASE self +-- @param Arguments A #table or any field. +function BASE:F( Arguments, DebugInfoCurrentParam, DebugInfoFromParam ) + + if _TraceOn and ( _TraceClass[self.ClassName] or _TraceClassMethod[self.ClassName] ) then + + local DebugInfoCurrent = DebugInfoCurrentParam and DebugInfoCurrentParam or debug.getinfo( 2, "nl" ) + local DebugInfoFrom = DebugInfoFromParam and DebugInfoFromParam or debug.getinfo( 3, "l" ) + + local Function = "function" + if DebugInfoCurrent.name then + Function = DebugInfoCurrent.name + end + + if _TraceClass[self.ClassName] or _TraceClassMethod[self.ClassName].Method[Function] then + local LineCurrent = DebugInfoCurrent.currentline + local LineFrom = 0 + if DebugInfoFrom then + LineFrom = DebugInfoFrom.currentline + end + env.info( string.format( "%6d(%6d)/%1s:%20s%05d.%s(%s)" , LineCurrent, LineFrom, "F", self.ClassName, self.ClassID, Function, routines.utils.oneLineSerialize( Arguments ) ) ) + end + end +end + +--- Trace a function call level 2. Must be at the beginning of the function logic. +-- @param #BASE self +-- @param Arguments A #table or any field. +function BASE:F2( Arguments ) + + local DebugInfoCurrent = debug.getinfo( 2, "nl" ) + local DebugInfoFrom = debug.getinfo( 3, "l" ) + + if _TraceLevel >= 2 then + self:F( Arguments, DebugInfoCurrent, DebugInfoFrom ) + end + +end + +--- Trace a function call level 3. Must be at the beginning of the function logic. +-- @param #BASE self +-- @param Arguments A #table or any field. +function BASE:F3( Arguments ) + + local DebugInfoCurrent = debug.getinfo( 2, "nl" ) + local DebugInfoFrom = debug.getinfo( 3, "l" ) + + if _TraceLevel >= 3 then + self:F( Arguments, DebugInfoCurrent, DebugInfoFrom ) + end + +end + +--- Trace a function logic. Can be anywhere within the function logic. +-- @param #BASE self +-- @param Arguments A #table or any field. +function BASE:T( Arguments, DebugInfoCurrentParam, DebugInfoFromParam ) + + if _TraceOn and ( _TraceClass[self.ClassName] or _TraceClassMethod[self.ClassName] ) then + + local DebugInfoCurrent = DebugInfoCurrentParam and DebugInfoCurrentParam or debug.getinfo( 2, "nl" ) + local DebugInfoFrom = DebugInfoFromParam and DebugInfoFromParam or debug.getinfo( 3, "l" ) + + local Function = "function" + if DebugInfoCurrent.name then + Function = DebugInfoCurrent.name + end + + if _TraceClass[self.ClassName] or _TraceClassMethod[self.ClassName].Method[Function] then + local LineCurrent = DebugInfoCurrent.currentline + local LineFrom = 0 + if DebugInfoFrom then + LineFrom = DebugInfoFrom.currentline + end + env.info( string.format( "%6d(%6d)/%1s:%20s%05d.%s" , LineCurrent, LineFrom, "T", self.ClassName, self.ClassID, routines.utils.oneLineSerialize( Arguments ) ) ) + end + end +end + +--- Trace a function logic level 2. Can be anywhere within the function logic. +-- @param #BASE self +-- @param Arguments A #table or any field. +function BASE:T2( Arguments ) + + local DebugInfoCurrent = debug.getinfo( 2, "nl" ) + local DebugInfoFrom = debug.getinfo( 3, "l" ) + + if _TraceLevel >= 2 then + self:T( Arguments, DebugInfoCurrent, DebugInfoFrom ) + end + +end + +--- Trace a function logic level 3. Can be anywhere within the function logic. +-- @param #BASE self +-- @param Arguments A #table or any field. +function BASE:T3( Arguments ) + + local DebugInfoCurrent = debug.getinfo( 2, "nl" ) + local DebugInfoFrom = debug.getinfo( 3, "l" ) + + if _TraceLevel >= 3 then + self:T( Arguments, DebugInfoCurrent, DebugInfoFrom ) + end + +end + +--- Log an exception which will be traced always. Can be anywhere within the function logic. +-- @param #BASE self +-- @param Arguments A #table or any field. +function BASE:E( Arguments ) + + local DebugInfoCurrent = debug.getinfo( 2, "nl" ) + local DebugInfoFrom = debug.getinfo( 3, "l" ) + + local Function = "function" + if DebugInfoCurrent.name then + Function = DebugInfoCurrent.name + end + + local LineCurrent = DebugInfoCurrent.currentline + local LineFrom = -1 + if DebugInfoFrom then + LineFrom = DebugInfoFrom.currentline + end + + env.info( string.format( "%6d(%6d)/%1s:%20s%05d.%s(%s)" , LineCurrent, LineFrom, "E", self.ClassName, self.ClassID, Function, routines.utils.oneLineSerialize( Arguments ) ) ) +end + + + +--- Models time events calling event handing functions. +-- +-- @{SCHEDULER} class +-- =================== +-- The @{SCHEDULER} class models time events calling given event handling functions. +-- +-- SCHEDULER constructor +-- ===================== +-- The SCHEDULER class is quite easy to use: +-- +-- * @{#SCHEDULER.New}: Setup a new scheduler and start it with the specified parameters. +-- +-- SCHEDULER timer methods +-- ======================= +-- The SCHEDULER can be stopped and restarted with the following methods: +-- +-- * @{#SCHEDULER.Start}: (Re-)Start the scheduler. +-- * @{#SCHEDULER.Start}: Stop the scheduler. +-- +-- @module Scheduler +-- @author FlightControl + +Include.File( "Routines" ) +Include.File( "Base" ) + + +--- The SCHEDULER class +-- @type SCHEDULER +-- @extends Base#BASE +SCHEDULER = { + ClassName = "SCHEDULER", +} + + +--- Constructor. +-- @param #SCHEDULER self +-- @param #table TimeEventObject Specified for which Moose object the timer is setup. If a value of nil is provided, a scheduler will be setup without an object reference. +-- @param #function TimeEventFunction The event function to be called when a timer event occurs. The event function needs to accept the parameters specified in TimeEventFunctionArguments. +-- @param #table TimeEventFunctionArguments Optional arguments that can be given as part of scheduler. The arguments need to be given as a table { param1, param 2, ... }. +-- @param #number StartSeconds Specifies the amount of seconds that will be waited before the scheduling is started, and the event function is called. +-- @param #number RepeatSecondsInterval Specifies the interval in seconds when the scheduler will call the event function. +-- @param #number RandomizationFactor Specifies a randomization factor between 0 and 1 to randomize the RepeatSecondsInterval. +-- @param #number StopSeconds Specifies the amount of seconds when the scheduler will be stopped. +-- @return #SCHEDULER self +function SCHEDULER:New( TimeEventObject, TimeEventFunction, TimeEventFunctionArguments, StartSeconds, RepeatSecondsInterval, RandomizationFactor, StopSeconds ) + local self = BASE:Inherit( self, BASE:New() ) + self:F2( { TimeEventObject, TimeEventFunction, TimeEventFunctionArguments, StartSeconds, RepeatSecondsInterval, RandomizationFactor, StopSeconds } ) + + self.TimeEventObject = TimeEventObject + self.TimeEventFunction = TimeEventFunction + self.TimeEventFunctionArguments = TimeEventFunctionArguments + self.StartSeconds = StartSeconds + + if RepeatSecondsInterval then + self.RepeatSecondsInterval = RepeatSecondsInterval + else + self.RepeatSecondsInterval = 0 + end + + if RandomizationFactor then + self.RandomizationFactor = RandomizationFactor + else + self.RandomizationFactor = 0 + end + + if StopSeconds then + self.StopSeconds = StopSeconds + end + + self.Repeat = false + + self.StartTime = timer.getTime() + + self:Start() + + return self +end + +--- (Re-)Starts the scheduler. +-- @param #SCHEDULER self +-- @return #SCHEDULER self +function SCHEDULER:Start() + self:F2( self.TimeEventObject ) + + self.Repeat = true + timer.scheduleFunction( self._Scheduler, self, timer.getTime() + self.StartSeconds + .01 ) + + return self +end + +--- Stops the scheduler. +-- @param #SCHEDULER self +-- @return #SCHEDULER self +function SCHEDULER:Stop() + self:F2( self.TimeEventObject ) + + self.Repeat = false + + return self +end + +-- Private Functions + +function SCHEDULER:_Scheduler() + self:F2( self.TimeEventFunctionArguments ) + + local ErrorHandler = function( errmsg ) + + env.info( "Error in SCHEDULER function:" .. errmsg ) + env.info( debug.traceback() ) + + return errmsg + end + + local Status, Result + if self.TimeEventObject then + Status, Result = xpcall( function() return self.TimeEventFunction( self.TimeEventObject, unpack( self.TimeEventFunctionArguments ) ) end, ErrorHandler ) + else + Status, Result = xpcall( function() return self.TimeEventFunction( unpack( self.TimeEventFunctionArguments ) ) end, ErrorHandler ) + end + + self:T( { Status, Result } ) + + if Status and ( ( not Result ) or ( Result and Result ~= false ) ) then + if self.Repeat and ( not self.StopSeconds or ( self.StopSeconds and timer.getTime() <= self.StartTime + self.StopSeconds ) ) then + timer.scheduleFunction( + self._Scheduler, + self, + timer.getTime() + self.RepeatSecondsInterval + math.random( - ( self.RandomizationFactor * self.RepeatSecondsInterval / 2 ), ( self.RandomizationFactor * self.RepeatSecondsInterval / 2 ) ) + 0.01 + ) + end + end + +end + + + + + + + + +--- The EVENT class models an efficient event handling process between other classes and its units, weapons. +-- @module Event +-- @author FlightControl + +Include.File( "Routines" ) +Include.File( "Base" ) + +--- The EVENT structure +-- @type EVENT +-- @field #EVENT.Events Events +EVENT = { + ClassName = "EVENT", + ClassID = 0, +} + +local _EVENTCODES = { + "S_EVENT_SHOT", + "S_EVENT_HIT", + "S_EVENT_TAKEOFF", + "S_EVENT_LAND", + "S_EVENT_CRASH", + "S_EVENT_EJECTION", + "S_EVENT_REFUELING", + "S_EVENT_DEAD", + "S_EVENT_PILOT_DEAD", + "S_EVENT_BASE_CAPTURED", + "S_EVENT_MISSION_START", + "S_EVENT_MISSION_END", + "S_EVENT_TOOK_CONTROL", + "S_EVENT_REFUELING_STOP", + "S_EVENT_BIRTH", + "S_EVENT_HUMAN_FAILURE", + "S_EVENT_ENGINE_STARTUP", + "S_EVENT_ENGINE_SHUTDOWN", + "S_EVENT_PLAYER_ENTER_UNIT", + "S_EVENT_PLAYER_LEAVE_UNIT", + "S_EVENT_PLAYER_COMMENT", + "S_EVENT_SHOOTING_START", + "S_EVENT_SHOOTING_END", + "S_EVENT_MAX", +} + +--- The Event structure +-- @type EVENTDATA +-- @field id +-- @field initiator +-- @field target +-- @field weapon +-- @field IniDCSUnit +-- @field IniDCSUnitName +-- @field IniDCSGroup +-- @field IniDCSGroupName +-- @field TgtDCSUnit +-- @field TgtDCSUnitName +-- @field TgtDCSGroup +-- @field TgtDCSGroupName +-- @field Weapon +-- @field WeaponName +-- @field WeaponTgtDCSUnit + +--- The Events structure +-- @type EVENT.Events +-- @field #number IniUnit + +function EVENT:New() + local self = BASE:Inherit( self, BASE:New() ) + self:F2() + self.EventHandler = world.addEventHandler( self ) + return self +end + +function EVENT:EventText( EventID ) + + local EventText = _EVENTCODES[EventID] + + return EventText +end + + +--- Initializes the Events structure for the event +-- @param #EVENT self +-- @param DCSWorld#world.event EventID +-- @param #string EventClass +-- @return #EVENT.Events +function EVENT:Init( EventID, EventClass ) + self:F3( { _EVENTCODES[EventID], EventClass } ) + if not self.Events[EventID] then + self.Events[EventID] = {} + end + if not self.Events[EventID][EventClass] then + self.Events[EventID][EventClass] = {} + end + return self.Events[EventID][EventClass] +end + + +--- Create an OnDead event handler for a group +-- @param #EVENT self +-- @param #table EventTemplate +-- @param #function EventFunction The function to be called when the event occurs for the unit. +-- @param EventSelf The self instance of the class for which the event is. +-- @param #function OnEventFunction +-- @return #EVENT +function EVENT:OnEventForTemplate( EventTemplate, EventFunction, EventSelf, OnEventFunction ) + self:F2( EventTemplate.name ) + + for EventUnitID, EventUnit in pairs( EventTemplate.units ) do + OnEventFunction( self, EventUnit.name, EventFunction, EventSelf ) + end + return self +end + +--- Set a new listener for an S_EVENT_X event independent from a unit or a weapon. +-- @param #EVENT self +-- @param #function EventFunction The function to be called when the event occurs for the unit. +-- @param Base#BASE EventSelf The self instance of the class for which the event is. +-- @param EventID +-- @return #EVENT +function EVENT:OnEventGeneric( EventFunction, EventSelf, EventID ) + self:F2( { EventID } ) + + local Event = self:Init( EventID, EventSelf:GetClassNameAndID() ) + Event.EventFunction = EventFunction + Event.EventSelf = EventSelf + return self +end + + +--- Set a new listener for an S_EVENT_X event +-- @param #EVENT self +-- @param #string EventDCSUnitName +-- @param #function EventFunction The function to be called when the event occurs for the unit. +-- @param Base#BASE EventSelf The self instance of the class for which the event is. +-- @param EventID +-- @return #EVENT +function EVENT:OnEventForUnit( EventDCSUnitName, EventFunction, EventSelf, EventID ) + self:F2( EventDCSUnitName ) + + local Event = self:Init( EventID, EventSelf:GetClassNameAndID() ) + if not Event.IniUnit then + Event.IniUnit = {} + end + Event.IniUnit[EventDCSUnitName] = {} + Event.IniUnit[EventDCSUnitName].EventFunction = EventFunction + Event.IniUnit[EventDCSUnitName].EventSelf = EventSelf + return self +end + + +--- Create an OnBirth event handler for a group +-- @param #EVENT self +-- @param Group#GROUP EventGroup +-- @param #function EventFunction The function to be called when the event occurs for the unit. +-- @param EventSelf The self instance of the class for which the event is. +-- @return #EVENT +function EVENT:OnBirthForTemplate( EventTemplate, EventFunction, EventSelf ) + self:F2( EventTemplate.name ) + + self:OnEventForTemplate( EventTemplate, EventFunction, EventSelf, self.OnBirthForUnit ) + + return self +end + +--- Set a new listener for an S_EVENT_BIRTH event, and registers the unit born. +-- @param #EVENT self +-- @param #function EventFunction The function to be called when the event occurs for the unit. +-- @param Base#BASE EventSelf +-- @return #EVENT +function EVENT:OnBirth( EventFunction, EventSelf ) + self:F2() + + self:OnEventGeneric( EventFunction, EventSelf, world.event.S_EVENT_BIRTH ) + + return self +end + +--- Set a new listener for an S_EVENT_BIRTH event. +-- @param #EVENT self +-- @param #string EventDCSUnitName The id of the unit for the event to be handled. +-- @param #function EventFunction The function to be called when the event occurs for the unit. +-- @param Base#BASE EventSelf +-- @return #EVENT +function EVENT:OnBirthForUnit( EventDCSUnitName, EventFunction, EventSelf ) + self:F2( EventDCSUnitName ) + + self:OnEventForUnit( EventDCSUnitName, EventFunction, EventSelf, world.event.S_EVENT_BIRTH ) + + return self +end + +--- Create an OnCrash event handler for a group +-- @param #EVENT self +-- @param Group#GROUP EventGroup +-- @param #function EventFunction The function to be called when the event occurs for the unit. +-- @param EventSelf The self instance of the class for which the event is. +-- @return #EVENT +function EVENT:OnCrashForTemplate( EventTemplate, EventFunction, EventSelf ) + self:F2( EventTemplate.name ) + + self:OnEventForTemplate( EventTemplate, EventFunction, EventSelf, self.OnCrashForUnit ) + + return self +end + +--- Set a new listener for an S_EVENT_CRASH event. +-- @param #EVENT self +-- @param #function EventFunction The function to be called when the event occurs for the unit. +-- @param Base#BASE EventSelf +-- @return #EVENT +function EVENT:OnCrash( EventFunction, EventSelf ) + self:F2() + + self:OnEventGeneric( EventFunction, EventSelf, world.event.S_EVENT_CRASH ) + + return self +end + +--- Set a new listener for an S_EVENT_CRASH event. +-- @param #EVENT self +-- @param #string EventDCSUnitName +-- @param #function EventFunction The function to be called when the event occurs for the unit. +-- @param Base#BASE EventSelf The self instance of the class for which the event is. +-- @return #EVENT +function EVENT:OnCrashForUnit( EventDCSUnitName, EventFunction, EventSelf ) + self:F2( EventDCSUnitName ) + + self:OnEventForUnit( EventDCSUnitName, EventFunction, EventSelf, world.event.S_EVENT_CRASH ) + + return self +end + +--- Create an OnDead event handler for a group +-- @param #EVENT self +-- @param Group#GROUP EventGroup +-- @param #function EventFunction The function to be called when the event occurs for the unit. +-- @param EventSelf The self instance of the class for which the event is. +-- @return #EVENT +function EVENT:OnDeadForTemplate( EventTemplate, EventFunction, EventSelf ) + self:F2( EventTemplate.name ) + + self:OnEventForTemplate( EventTemplate, EventFunction, EventSelf, self.OnDeadForUnit ) + + return self +end + +--- Set a new listener for an S_EVENT_DEAD event. +-- @param #EVENT self +-- @param #function EventFunction The function to be called when the event occurs for the unit. +-- @param Base#BASE EventSelf +-- @return #EVENT +function EVENT:OnDead( EventFunction, EventSelf ) + self:F2() + + self:OnEventGeneric( EventFunction, EventSelf, world.event.S_EVENT_DEAD ) + + return self +end + + +--- Set a new listener for an S_EVENT_DEAD event. +-- @param #EVENT self +-- @param #string EventDCSUnitName +-- @param #function EventFunction The function to be called when the event occurs for the unit. +-- @param Base#BASE EventSelf The self instance of the class for which the event is. +-- @return #EVENT +function EVENT:OnDeadForUnit( EventDCSUnitName, EventFunction, EventSelf ) + self:F2( EventDCSUnitName ) + + self:OnEventForUnit( EventDCSUnitName, EventFunction, EventSelf, world.event.S_EVENT_DEAD ) + + return self +end + +--- Set a new listener for an S_EVENT_PILOT_DEAD event. +-- @param #EVENT self +-- @param #string EventDCSUnitName +-- @param #function EventFunction The function to be called when the event occurs for the unit. +-- @param Base#BASE EventSelf The self instance of the class for which the event is. +-- @return #EVENT +function EVENT:OnPilotDeadForUnit( EventDCSUnitName, EventFunction, EventSelf ) + self:F2( EventDCSUnitName ) + + self:OnEventForUnit( EventDCSUnitName, EventFunction, EventSelf, world.event.S_EVENT_PILOT_DEAD ) + + return self +end + +--- Create an OnDead event handler for a group +-- @param #EVENT self +-- @param #table EventTemplate +-- @param #function EventFunction The function to be called when the event occurs for the unit. +-- @param EventSelf The self instance of the class for which the event is. +-- @return #EVENT +function EVENT:OnLandForTemplate( EventTemplate, EventFunction, EventSelf ) + self:F2( EventTemplate.name ) + + self:OnEventForTemplate( EventTemplate, EventFunction, EventSelf, self.OnLandForUnit ) + + return self +end + +--- Set a new listener for an S_EVENT_LAND event. +-- @param #EVENT self +-- @param #string EventDCSUnitName +-- @param #function EventFunction The function to be called when the event occurs for the unit. +-- @param Base#BASE EventSelf The self instance of the class for which the event is. +-- @return #EVENT +function EVENT:OnLandForUnit( EventDCSUnitName, EventFunction, EventSelf ) + self:F2( EventDCSUnitName ) + + self:OnEventForUnit( EventDCSUnitName, EventFunction, EventSelf, world.event.S_EVENT_LAND ) + + return self +end + +--- Create an OnDead event handler for a group +-- @param #EVENT self +-- @param #table EventTemplate +-- @param #function EventFunction The function to be called when the event occurs for the unit. +-- @param EventSelf The self instance of the class for which the event is. +-- @return #EVENT +function EVENT:OnTakeOffForTemplate( EventTemplate, EventFunction, EventSelf ) + self:F2( EventTemplate.name ) + + self:OnEventForTemplate( EventTemplate, EventFunction, EventSelf, self.OnTakeOffForUnit ) + + return self +end + +--- Set a new listener for an S_EVENT_TAKEOFF event. +-- @param #EVENT self +-- @param #string EventDCSUnitName +-- @param #function EventFunction The function to be called when the event occurs for the unit. +-- @param Base#BASE EventSelf The self instance of the class for which the event is. +-- @return #EVENT +function EVENT:OnTakeOffForUnit( EventDCSUnitName, EventFunction, EventSelf ) + self:F2( EventDCSUnitName ) + + self:OnEventForUnit( EventDCSUnitName, EventFunction, EventSelf, world.event.S_EVENT_TAKEOFF ) + + return self +end + +--- Create an OnDead event handler for a group +-- @param #EVENT self +-- @param #table EventTemplate +-- @param #function EventFunction The function to be called when the event occurs for the unit. +-- @param EventSelf The self instance of the class for which the event is. +-- @return #EVENT +function EVENT:OnEngineShutDownForTemplate( EventTemplate, EventFunction, EventSelf ) + self:F2( EventTemplate.name ) + + self:OnEventForTemplate( EventTemplate, EventFunction, EventSelf, self.OnEngineShutDownForUnit ) + + return self +end + +--- Set a new listener for an S_EVENT_ENGINE_SHUTDOWN event. +-- @param #EVENT self +-- @param #string EventDCSUnitName +-- @param #function EventFunction The function to be called when the event occurs for the unit. +-- @param Base#BASE EventSelf The self instance of the class for which the event is. +-- @return #EVENT +function EVENT:OnEngineShutDownForUnit( EventDCSUnitName, EventFunction, EventSelf ) + self:F2( EventDCSUnitName ) + + self:OnEventForUnit( EventDCSUnitName, EventFunction, EventSelf, world.event.S_EVENT_ENGINE_SHUTDOWN ) + + return self +end + +--- Set a new listener for an S_EVENT_ENGINE_STARTUP event. +-- @param #EVENT self +-- @param #string EventDCSUnitName +-- @param #function EventFunction The function to be called when the event occurs for the unit. +-- @param Base#BASE EventSelf The self instance of the class for which the event is. +-- @return #EVENT +function EVENT:OnEngineStartUpForUnit( EventDCSUnitName, EventFunction, EventSelf ) + self:F2( EventDCSUnitName ) + + self:OnEventForUnit( EventDCSUnitName, EventFunction, EventSelf, world.event.S_EVENT_ENGINE_STARTUP ) + + return self +end + +--- Set a new listener for an S_EVENT_SHOT event. +-- @param #EVENT self +-- @param #function EventFunction The function to be called when the event occurs for the unit. +-- @param Base#BASE EventSelf The self instance of the class for which the event is. +-- @return #EVENT +function EVENT:OnShot( EventFunction, EventSelf ) + self:F2() + + self:OnEventGeneric( EventFunction, EventSelf, world.event.S_EVENT_SHOT ) + + return self +end + +--- Set a new listener for an S_EVENT_SHOT event for a unit. +-- @param #EVENT self +-- @param #string EventDCSUnitName +-- @param #function EventFunction The function to be called when the event occurs for the unit. +-- @param Base#BASE EventSelf The self instance of the class for which the event is. +-- @return #EVENT +function EVENT:OnShotForUnit( EventDCSUnitName, EventFunction, EventSelf ) + self:F2( EventDCSUnitName ) + + self:OnEventForUnit( EventDCSUnitName, EventFunction, EventSelf, world.event.S_EVENT_SHOT ) + + return self +end + +--- Set a new listener for an S_EVENT_HIT event. +-- @param #EVENT self +-- @param #function EventFunction The function to be called when the event occurs for the unit. +-- @param Base#BASE EventSelf The self instance of the class for which the event is. +-- @return #EVENT +function EVENT:OnHit( EventFunction, EventSelf ) + self:F2() + + self:OnEventGeneric( EventFunction, EventSelf, world.event.S_EVENT_HIT ) + + return self +end + +--- Set a new listener for an S_EVENT_HIT event. +-- @param #EVENT self +-- @param #string EventDCSUnitName +-- @param #function EventFunction The function to be called when the event occurs for the unit. +-- @param Base#BASE EventSelf The self instance of the class for which the event is. +-- @return #EVENT +function EVENT:OnHitForUnit( EventDCSUnitName, EventFunction, EventSelf ) + self:F2( EventDCSUnitName ) + + self:OnEventForUnit( EventDCSUnitName, EventFunction, EventSelf, world.event.S_EVENT_HIT ) + + return self +end + +--- Set a new listener for an S_EVENT_PLAYER_ENTER_UNIT event. +-- @param #EVENT self +-- @param #function EventFunction The function to be called when the event occurs for the unit. +-- @param Base#BASE EventSelf The self instance of the class for which the event is. +-- @return #EVENT +function EVENT:OnPlayerEnterUnit( EventFunction, EventSelf ) + self:F2() + + self:OnEventGeneric( EventFunction, EventSelf, world.event.S_EVENT_PLAYER_ENTER_UNIT ) + + return self +end + +--- Set a new listener for an S_EVENT_PLAYER_LEAVE_UNIT event. +-- @param #EVENT self +-- @param #function EventFunction The function to be called when the event occurs for the unit. +-- @param Base#BASE EventSelf The self instance of the class for which the event is. +-- @return #EVENT +function EVENT:OnPlayerLeaveUnit( EventFunction, EventSelf ) + self:F2() + + self:OnEventGeneric( EventFunction, EventSelf, world.event.S_EVENT_PLAYER_LEAVE_UNIT ) + + return self +end + + + +function EVENT:onEvent( Event ) + self:F2( { _EVENTCODES[Event.id], Event } ) + + if self and self.Events and self.Events[Event.id] then + if Event.initiator and Event.initiator:getCategory() == Object.Category.UNIT then + Event.IniDCSUnit = Event.initiator + Event.IniDCSGroup = Event.IniDCSUnit:getGroup() + Event.IniDCSUnitName = Event.IniDCSUnit:getName() + Event.IniDCSGroupName = "" + if Event.IniDCSGroup and Event.IniDCSGroup:isExist() then + Event.IniDCSGroupName = Event.IniDCSGroup:getName() + end + end + if Event.target then + if Event.target and Event.target:getCategory() == Object.Category.UNIT then + Event.TgtDCSUnit = Event.target + Event.TgtDCSGroup = Event.TgtDCSUnit:getGroup() + Event.TgtDCSUnitName = Event.TgtDCSUnit:getName() + Event.TgtDCSGroupName = "" + if Event.TgtDCSGroup and Event.TgtDCSGroup:isExist() then + Event.TgtDCSGroupName = Event.TgtDCSGroup:getName() + end + end + end + if Event.weapon then + Event.Weapon = Event.weapon + Event.WeaponName = Event.Weapon:getTypeName() + --Event.WeaponTgtDCSUnit = Event.Weapon:getTarget() + end + self:E( { _EVENTCODES[Event.id], Event } ) + for ClassName, EventData in pairs( self.Events[Event.id] ) do + if Event.IniDCSUnitName and EventData.IniUnit and EventData.IniUnit[Event.IniDCSUnitName] then + self:T2( { "Calling event function for class ", ClassName, " unit ", Event.IniDCSUnitName } ) + EventData.IniUnit[Event.IniDCSUnitName].EventFunction( EventData.IniUnit[Event.IniDCSUnitName].EventSelf, Event ) + else + if Event.IniDCSUnit and not EventData.IniUnit then + self:T2( { "Calling event function for class ", ClassName } ) + EventData.EventFunction( EventData.EventSelf, Event ) + end + end + end + end +end + +--- Encapsulation of DCS World Menu system in a set of MENU classes. +-- @module Menu + +Include.File( "Routines" ) +Include.File( "Base" ) + +--- The MENU class +-- @type MENU +-- @extends Base#BASE +MENU = { + ClassName = "MENU", + MenuPath = nil, + MenuText = "", + MenuParentPath = nil +} + +--- +function MENU:New( MenuText, MenuParentPath ) + + -- Arrange meta tables + local Child = BASE:Inherit( self, BASE:New() ) + + Child.MenuPath = nil + Child.MenuText = MenuText + Child.MenuParentPath = MenuParentPath + return Child +end + +--- The COMMANDMENU class +-- @type COMMANDMENU +-- @extends Menu#MENU +COMMANDMENU = { + ClassName = "COMMANDMENU", + CommandMenuFunction = nil, + CommandMenuArgument = nil +} + +function COMMANDMENU:New( MenuText, ParentMenu, CommandMenuFunction, CommandMenuArgument ) + + -- Arrange meta tables + + local MenuParentPath = nil + if ParentMenu ~= nil then + MenuParentPath = ParentMenu.MenuPath + end + + local Child = BASE:Inherit( self, MENU:New( MenuText, MenuParentPath ) ) + + Child.MenuPath = missionCommands.addCommand( MenuText, MenuParentPath, CommandMenuFunction, CommandMenuArgument ) + Child.CommandMenuFunction = CommandMenuFunction + Child.CommandMenuArgument = CommandMenuArgument + return Child +end + +--- The SUBMENU class +-- @type SUBMENU +-- @extends Menu#MENU +SUBMENU = { + ClassName = "SUBMENU" +} + +function SUBMENU:New( MenuText, ParentMenu ) + + -- Arrange meta tables + local MenuParentPath = nil + if ParentMenu ~= nil then + MenuParentPath = ParentMenu.MenuPath + end + + local Child = BASE:Inherit( self, MENU:New( MenuText, MenuParentPath ) ) + + Child.MenuPath = missionCommands.addSubMenu( MenuText, MenuParentPath ) + return Child +end + +-- This local variable is used to cache the menus registered under clients. +-- Menus don't dissapear when clients are destroyed and restarted. +-- So every menu for a client created must be tracked so that program logic accidentally does not create +-- the same menus twice during initialization logic. +-- These menu classes are handling this logic with this variable. +local _MENUCLIENTS = {} + +--- The MENU_CLIENT class +-- @type MENU_CLIENT +-- @extends Menu#MENU +MENU_CLIENT = { + ClassName = "MENU_CLIENT" +} + +--- Creates a new menu item for a group +-- @param self +-- @param Client#CLIENT MenuClient The Client owning the menu. +-- @param #string MenuText The text for the menu. +-- @param #table ParentMenu The parent menu. +-- @return #MENU_CLIENT self +function MENU_CLIENT:New( MenuClient, MenuText, ParentMenu ) + + -- Arrange meta tables + local MenuParentPath = {} + if ParentMenu ~= nil then + MenuParentPath = ParentMenu.MenuPath + end + + local self = BASE:Inherit( self, MENU:New( MenuText, MenuParentPath ) ) + self:F( { MenuClient, MenuText, ParentMenu } ) + + self.MenuClient = MenuClient + self.MenuClientGroupID = MenuClient:GetClientGroupID() + self.MenuParentPath = MenuParentPath + self.MenuText = MenuText + self.ParentMenu = ParentMenu + + self.Menus = {} + + if not _MENUCLIENTS[self.MenuClientGroupID] then + _MENUCLIENTS[self.MenuClientGroupID] = {} + end + + local MenuPath = _MENUCLIENTS[self.MenuClientGroupID] + + self:T( { MenuClient:GetClientGroupName(), MenuPath[table.concat(MenuParentPath)], MenuParentPath, MenuText } ) + + local MenuPathID = table.concat(MenuParentPath) .. "/" .. MenuText + if MenuPath[MenuPathID] then + missionCommands.removeItemForGroup( self.MenuClient:GetClientGroupID(), MenuPath[MenuPathID] ) + end + + self.MenuPath = missionCommands.addSubMenuForGroup( self.MenuClient:GetClientGroupID(), MenuText, MenuParentPath ) + MenuPath[MenuPathID] = self.MenuPath + + self:T( { MenuClient:GetClientGroupName(), self.MenuPath } ) + + if ParentMenu and ParentMenu.Menus then + ParentMenu.Menus[self.MenuPath] = self + end + return self +end + +--- Removes the sub menus recursively of this MENU_CLIENT. +-- @param #MENU_CLIENT self +-- @return #MENU_CLIENT self +function MENU_CLIENT:RemoveSubMenus() + self:F( self.MenuPath ) + + for MenuID, Menu in pairs( self.Menus ) do + Menu:Remove() + end + +end + +--- Removes the sub menus recursively of this MENU_CLIENT. +-- @param #MENU_CLIENT self +-- @return #MENU_CLIENT self +function MENU_CLIENT:Remove() + self:F( self.MenuPath ) + + self:RemoveSubMenus() + + if not _MENUCLIENTS[self.MenuClientGroupID] then + _MENUCLIENTS[self.MenuClientGroupID] = {} + end + + local MenuPath = _MENUCLIENTS[self.MenuClientGroupID] + + if MenuPath[table.concat(self.MenuParentPath) .. "/" .. self.MenuText] then + MenuPath[table.concat(self.MenuParentPath) .. "/" .. self.MenuText] = nil + end + + missionCommands.removeItemForGroup( self.MenuClient:GetClientGroupID(), self.MenuPath ) + self.ParentMenu.Menus[self.MenuPath] = nil + return nil +end + + +--- The MENU_CLIENT_COMMAND class +-- @type MENU_CLIENT_COMMAND +-- @extends Menu#MENU +MENU_CLIENT_COMMAND = { + ClassName = "MENU_CLIENT_COMMAND" +} + +--- Creates a new radio command item for a group +-- @param self +-- @param Client#CLIENT MenuClient The Client owning the menu. +-- @param MenuText The text for the menu. +-- @param ParentMenu The parent menu. +-- @param CommandMenuFunction A function that is called when the menu key is pressed. +-- @param CommandMenuArgument An argument for the function. +-- @return Menu#MENU_CLIENT_COMMAND self +function MENU_CLIENT_COMMAND:New( MenuClient, MenuText, ParentMenu, CommandMenuFunction, CommandMenuArgument ) + + -- Arrange meta tables + + local MenuParentPath = {} + if ParentMenu ~= nil then + MenuParentPath = ParentMenu.MenuPath + end + + local self = BASE:Inherit( self, MENU:New( MenuText, MenuParentPath ) ) + + self.MenuClient = MenuClient + self.MenuClientGroupID = MenuClient:GetClientGroupID() + self.MenuParentPath = MenuParentPath + self.MenuText = MenuText + self.ParentMenu = ParentMenu + + if not _MENUCLIENTS[self.MenuClientGroupID] then + _MENUCLIENTS[self.MenuClientGroupID] = {} + end + + local MenuPath = _MENUCLIENTS[self.MenuClientGroupID] + + self:T( { MenuClient:GetClientGroupName(), MenuPath[table.concat(MenuParentPath)], MenuParentPath, MenuText, CommandMenuFunction, CommandMenuArgument } ) + + local MenuPathID = table.concat(MenuParentPath) .. "/" .. MenuText + if MenuPath[MenuPathID] then + missionCommands.removeItemForGroup( self.MenuClient:GetClientGroupID(), MenuPath[MenuPathID] ) + end + + self.MenuPath = missionCommands.addCommandForGroup( self.MenuClient:GetClientGroupID(), MenuText, MenuParentPath, CommandMenuFunction, CommandMenuArgument ) + MenuPath[MenuPathID] = self.MenuPath + + self.CommandMenuFunction = CommandMenuFunction + self.CommandMenuArgument = CommandMenuArgument + + ParentMenu.Menus[self.MenuPath] = self + + return self +end + +function MENU_CLIENT_COMMAND:Remove() + self:F( self.MenuPath ) + + if not _MENUCLIENTS[self.MenuClientGroupID] then + _MENUCLIENTS[self.MenuClientGroupID] = {} + end + + local MenuPath = _MENUCLIENTS[self.MenuClientGroupID] + + if MenuPath[table.concat(self.MenuParentPath) .. "/" .. self.MenuText] then + MenuPath[table.concat(self.MenuParentPath) .. "/" .. self.MenuText] = nil + end + + missionCommands.removeItemForGroup( self.MenuClient:GetClientGroupID(), self.MenuPath ) + self.ParentMenu.Menus[self.MenuPath] = nil + return nil +end + + +--- The MENU_COALITION class +-- @type MENU_COALITION +-- @extends Menu#MENU +MENU_COALITION = { + ClassName = "MENU_COALITION" +} + +--- Creates a new coalition menu item +-- @param #MENU_COALITION self +-- @param DCSCoalition#coalition.side MenuCoalition The coalition owning the menu. +-- @param #string MenuText The text for the menu. +-- @param #table ParentMenu The parent menu. +-- @return #MENU_COALITION self +function MENU_COALITION:New( MenuCoalition, MenuText, ParentMenu ) + + -- Arrange meta tables + local MenuParentPath = {} + if ParentMenu ~= nil then + MenuParentPath = ParentMenu.MenuPath + end + + local self = BASE:Inherit( self, MENU:New( MenuText, MenuParentPath ) ) + self:F( { MenuCoalition, MenuText, ParentMenu } ) + + self.MenuCoalition = MenuCoalition + self.MenuParentPath = MenuParentPath + self.MenuText = MenuText + self.ParentMenu = ParentMenu + + self.Menus = {} + + self:T( { MenuParentPath, MenuText } ) + + self.MenuPath = missionCommands.addSubMenuForCoalition( self.MenuCoalition, MenuText, MenuParentPath ) + + self:T( { self.MenuPath } ) + + if ParentMenu and ParentMenu.Menus then + ParentMenu.Menus[self.MenuPath] = self + end + return self +end + +--- Removes the sub menus recursively of this MENU_COALITION. +-- @param #MENU_COALITION self +-- @return #MENU_COALITION self +function MENU_COALITION:RemoveSubMenus() + self:F( self.MenuPath ) + + for MenuID, Menu in pairs( self.Menus ) do + Menu:Remove() + end + +end + +--- Removes the sub menus recursively of this MENU_COALITION. +-- @param #MENU_COALITION self +-- @return #MENU_COALITION self +function MENU_COALITION:Remove() + self:F( self.MenuPath ) + + self:RemoveSubMenus() + missionCommands.removeItemForCoalition( self.MenuCoalition, self.MenuPath ) + self.ParentMenu.Menus[self.MenuPath] = nil + + return nil +end + + +--- The MENU_COALITION_COMMAND class +-- @type MENU_COALITION_COMMAND +-- @extends Menu#MENU +MENU_COALITION_COMMAND = { + ClassName = "MENU_COALITION_COMMAND" +} + +--- Creates a new radio command item for a group +-- @param #MENU_COALITION_COMMAND self +-- @param DCSCoalition#coalition.side MenuCoalition The coalition owning the menu. +-- @param MenuText The text for the menu. +-- @param ParentMenu The parent menu. +-- @param CommandMenuFunction A function that is called when the menu key is pressed. +-- @param CommandMenuArgument An argument for the function. +-- @return #MENU_COALITION_COMMAND self +function MENU_COALITION_COMMAND:New( MenuCoalition, MenuText, ParentMenu, CommandMenuFunction, CommandMenuArgument ) + + -- Arrange meta tables + + local MenuParentPath = {} + if ParentMenu ~= nil then + MenuParentPath = ParentMenu.MenuPath + end + + local self = BASE:Inherit( self, MENU:New( MenuText, MenuParentPath ) ) + + self.MenuCoalition = MenuCoalition + self.MenuParentPath = MenuParentPath + self.MenuText = MenuText + self.ParentMenu = ParentMenu + + self:T( { MenuParentPath, MenuText, CommandMenuFunction, CommandMenuArgument } ) + + self.MenuPath = missionCommands.addCommandForCoalition( self.MenuCoalition, MenuText, MenuParentPath, CommandMenuFunction, CommandMenuArgument ) + + self.CommandMenuFunction = CommandMenuFunction + self.CommandMenuArgument = CommandMenuArgument + + ParentMenu.Menus[self.MenuPath] = self + + return self +end + +--- Removes a radio command item for a coalition +-- @param #MENU_COALITION_COMMAND self +-- @return #MENU_COALITION_COMMAND self +function MENU_COALITION_COMMAND:Remove() + self:F( self.MenuPath ) + + missionCommands.removeItemForCoalition( self.MenuCoalition, self.MenuPath ) + self.ParentMenu.Menus[self.MenuPath] = nil + return nil +end +--- This module contains the GROUP class. +-- +-- 1) @{Group#GROUP} class, extends @{Base#BASE} +-- ============================================= +-- The @{Group#GROUP} class is a wrapper class to handle the DCS Group objects: +-- +-- * Support all DCS Group APIs. +-- * Enhance with Group specific APIs not in the DCS Group API set. +-- * Handle local Group Controller. +-- * Manage the "state" of the DCS Group. +-- +-- **IMPORTANT: ONE SHOULD NEVER SANATIZE these GROUP OBJECT REFERENCES! (make the GROUP object references nil).** +-- +-- 1.1) GROUP reference methods +-- ----------------------- +-- For each DCS Group object alive within a running mission, a GROUP wrapper object (instance) will be created within the _@{DATABASE} object. +-- This is done at the beginning of the mission (when the mission starts), and dynamically when new DCS Group objects are spawned (using the @{SPAWN} class). +-- +-- The GROUP class does not contain a :New() method, rather it provides :Find() methods to retrieve the object reference +-- using the DCS Group or the DCS GroupName. +-- +-- Another thing to know is that GROUP objects do not "contain" the DCS Group object. +-- The GROUP methods will reference the DCS Group object by name when it is needed during API execution. +-- If the DCS Group object does not exist or is nil, the GROUP methods will return nil and log an exception in the DCS.log file. +-- +-- The GROUP class provides the following functions to retrieve quickly the relevant GROUP instance: +-- +-- * @{#GROUP.Find}(): Find a GROUP instance from the _DATABASE object using a DCS Group object. +-- * @{#GROUP.FindByName}(): Find a GROUP instance from the _DATABASE object using a DCS Group name. +-- +-- 1.2) GROUP task methods +-- ----------------------- +-- Several group task methods are available that help you to prepare tasks. +-- These methods return a string consisting of the task description, which can then be given to either a @{Group#GROUP.PushTask} or @{Group#SetTask} method to assign the task to the GROUP. +-- Tasks are specific for the category of the GROUP, more specific, for AIR, GROUND or AIR and GROUND. +-- Each task description where applicable indicates for which group category the task is valid. +-- There are 2 main subdivisions of tasks: Assigned tasks and EnRoute tasks. +-- +-- ### 1.2.1) Assigned task methods +-- +-- Assigned task methods make the group execute the task where the location of the (possible) targets of the task are known before being detected. +-- This is different from the EnRoute tasks, where the targets of the task need to be detected before the task can be executed. +-- +-- Find below a list of the **assigned task** methods: +-- +-- * @{#GROUP.TaskAttackGroup}: (AIR) Attack a Group. +-- * @{#GROUP.TaskAttackMapObject}: (AIR) Attacking the map object (building, structure, e.t.c). +-- * @{#GROUP.TaskAttackUnit}: (AIR) Attack the Unit. +-- * @{#GROUP.TaskBombing}: (AIR) Delivering weapon at the point on the ground. +-- * @{#GROUP.TaskBombingRunway}: (AIR) Delivering weapon on the runway. +-- * @{#GROUP.TaskEmbarking}: (AIR) Move the group to a Vec2 Point, wait for a defined duration and embark a group. +-- * @{#GROUP.TaskEmbarkToTransport}: (GROUND) Embark to a Transport landed at a location. +-- * @{#GROUP.TaskEscort}: (AIR) Escort another airborne group. +-- * @{#GROUP.TaskFAC_AttackGroup}: (AIR + GROUND) The task makes the group/unit a FAC and orders the FAC to control the target (enemy ground group) destruction. +-- * @{#GROUP.TaskFireAtPoint}: (GROUND) Fire at a VEC2 point until ammunition is finished. +-- * @{#GROUP.TaskFollow}: (AIR) Following another airborne group. +-- * @{#GROUP.TaskHold}: (GROUND) Hold ground group from moving. +-- * @{#GROUP.TaskHoldPosition}: (AIR) Hold position at the current position of the first unit of the group. +-- * @{#GROUP.TaskLand}: (AIR HELICOPTER) Landing at the ground. For helicopters only. +-- * @{#GROUP.TaskLandAtZone}: (AIR) Land the group at a @{Zone#ZONE_RADIUS). +-- * @{#GROUP.TaskOrbitCircle}: (AIR) Orbit at the current position of the first unit of the group at a specified alititude. +-- * @{#GROUP.TaskOrbitCircleAtVec2}: (AIR) Orbit at a specified position at a specified alititude during a specified duration with a specified speed. +-- * @{#GROUP.TaskRefueling}: (AIR) Refueling from the nearest tanker. No parameters. +-- * @{#GROUP.TaskRoute}: (AIR + GROUND) Return a Misson task to follow a given route defined by Points. +-- * @{#GROUP.TaskRouteToVec2}: (AIR + GROUND) Make the Group move to a given point. +-- * @{#GROUP.TaskRouteToVec3}: (AIR + GROUND) Make the Group move to a given point. +-- * @{#GROUP.TaskRouteToZone}: (AIR + GROUND) Route the group to a given zone. +-- +-- ### 1.2.2) EnRoute task methods +-- +-- EnRoute tasks require the targets of the task need to be detected by the group (using its sensors) before the task can be executed: +-- +-- * @{#GROUP.EnRouteTaskAWACS}: (AIR) Aircraft will act as an AWACS for friendly units (will provide them with information about contacts). No parameters. +-- * @{#GROUP.EnRouteTaskEngageGroup}: (AIR) Engaging a group. The task does not assign the target group to the unit/group to attack now; it just allows the unit/group to engage the target group as well as other assigned targets. +-- * @{#GROUP.EnRouteTaskEngageTargets}: (AIR) Engaging targets of defined types. +-- * @{#GROUP.EnRouteTaskEWR}: (AIR) Attack the Unit. +-- * @{#GROUP.EnRouteTaskFAC}: (AIR + GROUND) The task makes the group/unit a FAC and lets the FAC to choose a targets (enemy ground group) around as well as other assigned targets. +-- * @{#GROUP.EnRouteTaskFAC_EngageGroup}: (AIR + GROUND) The task makes the group/unit a FAC and lets the FAC to choose the target (enemy ground group) as well as other assigned targets. +-- * @{#GROUP.EnRouteTaskTanker}: (AIR) Aircraft will act as a tanker for friendly units. No parameters. +-- +-- ### 1.2.3) Preparation task methods +-- +-- There are certain task methods that allow to tailor the task behaviour: +-- +-- * @{#GROUP.TaskWrappedAction}: Return a WrappedAction Task taking a Command. +-- * @{#GROUP.TaskCombo}: Return a Combo Task taking an array of Tasks. +-- * @{#GROUP.TaskCondition}: Return a condition section for a controlled task. +-- * @{#GROUP.TaskControlled}: Return a Controlled Task taking a Task and a TaskCondition. +-- +-- ### 1.2.4) Obtain the mission from group templates +-- +-- Group templates contain complete mission descriptions. Sometimes you want to copy a complete mission from a group and assign it to another: +-- +-- * @{#GROUP.TaskMission}: (AIR + GROUND) Return a mission task from a mission template. +-- +-- 1.3) GROUP Command methods +-- -------------------------- +-- Group **command methods** prepare the execution of commands using the @{#GROUP.SetCommand} method: +-- +-- * @{#GROUP.CommandDoScript}: Do Script command. +-- * @{#GROUP.CommandSwitchWayPoint}: Perform a switch waypoint command. +-- +-- 1.4) GROUP Option methods +-- ------------------------- +-- Group **Option methods** change the behaviour of the Group while being alive. +-- +-- ### 1.4.1) Rule of Engagement: +-- +-- * @{#GROUP.OptionROEWeaponFree} +-- * @{#GROUP.OptionROEOpenFire} +-- * @{#GROUP.OptionROEReturnFire} +-- * @{#GROUP.OptionROEEvadeFire} +-- +-- To check whether an ROE option is valid for a specific group, use: +-- +-- * @{#GROUP.OptionROEWeaponFreePossible} +-- * @{#GROUP.OptionROEOpenFirePossible} +-- * @{#GROUP.OptionROEReturnFirePossible} +-- * @{#GROUP.OptionROEEvadeFirePossible} +-- +-- ### 1.4.2) Rule on thread: +-- +-- * @{#GROUP.OptionROTNoReaction} +-- * @{#GROUP.OptionROTPassiveDefense} +-- * @{#GROUP.OptionROTEvadeFire} +-- * @{#GROUP.OptionROTVertical} +-- +-- To test whether an ROT option is valid for a specific group, use: +-- +-- * @{#GROUP.OptionROTNoReactionPossible} +-- * @{#GROUP.OptionROTPassiveDefensePossible} +-- * @{#GROUP.OptionROTEvadeFirePossible} +-- * @{#GROUP.OptionROTVerticalPossible} +-- +-- 1.5) GROUP Zone validation methods +-- ---------------------------------- +-- The group can be validated whether it is completely, partly or not within a @{Zone}. +-- Use the following Zone validation methods on the group: +-- +-- * @{#GROUP.IsCompletelyInZone}: Returns true if all units of the group are within a @{Zone}. +-- * @{#GROUP.IsPartlyInZone}: Returns true if some units of the group are within a @{Zone}. +-- * @{#GROUP.IsNotInZone}: Returns true if none of the group units of the group are within a @{Zone}. +-- +-- The zone can be of any @{Zone} class derived from @{Zone#ZONE_BASE}. So, these methods are polymorphic to the zones tested on. +-- +-- @module Group +-- @author FlightControl + +Include.File( "Routines" ) +Include.File( "Base" ) +Include.File( "Message" ) +Include.File( "Unit" ) + +--- The GROUP class +-- @type GROUP +-- @extends Base#BASE +-- @field DCSGroup#Group DCSGroup The DCS group class. +-- @field #string GroupName The name of the group. +GROUP = { + ClassName = "GROUP", + GroupName = "", + GroupID = 0, + Controller = nil, + DCSGroup = nil, + WayPointFunctions = {}, +} + +--- A DCSGroup +-- @type DCSGroup +-- @field id_ The ID of the group in DCS + +--- Create a new GROUP from a DCSGroup +-- @param #GROUP self +-- @param DCSGroup#Group GroupName The DCS Group name +-- @return #GROUP self +function GROUP:Register( GroupName ) + local self = BASE:Inherit( self, BASE:New() ) + self:F2( GroupName ) + self.GroupName = GroupName + return self +end + +-- Reference methods. + +--- Find the GROUP wrapper class instance using the DCS Group. +-- @param #GROUP self +-- @param DCSGroup#Group DCSGroup The DCS Group. +-- @return #GROUP The GROUP. +function GROUP:Find( DCSGroup ) + + local GroupName = DCSGroup:getName() -- Group#GROUP + local GroupFound = _DATABASE:FindGroup( GroupName ) + return GroupFound +end + +--- Find the created GROUP using the DCS Group Name. +-- @param #GROUP self +-- @param #string GroupName The DCS Group Name. +-- @return #GROUP The GROUP. +function GROUP:FindByName( GroupName ) + + local GroupFound = _DATABASE:FindGroup( GroupName ) + return GroupFound +end + +-- DCS Group methods support. + +--- Returns the DCS Group. +-- @param #GROUP self +-- @return DCSGroup#Group The DCS Group. +function GROUP:GetDCSGroup() + local DCSGroup = Group.getByName( self.GroupName ) + + if DCSGroup then + return DCSGroup + end + + return nil +end + + +--- Returns if the DCS Group is alive. +-- When the group exists at run-time, this method will return true, otherwise false. +-- @param #GROUP self +-- @return #boolean true if the DCS Group is alive. +function GROUP:IsAlive() + self:F2( self.GroupName ) + + local DCSGroup = self:GetDCSGroup() + + if DCSGroup then + local GroupIsAlive = DCSGroup:isExist() + self:T3( GroupIsAlive ) + return GroupIsAlive + end + + return nil +end + +--- Destroys the DCS Group and all of its DCS Units. +-- Note that this destroy method also raises a destroy event at run-time. +-- So all event listeners will catch the destroy event of this DCS Group. +-- @param #GROUP self +function GROUP:Destroy() + self:F2( self.GroupName ) + + local DCSGroup = self:GetDCSGroup() + + if DCSGroup then + for Index, UnitData in pairs( DCSGroup:getUnits() ) do + self:CreateEventCrash( timer.getTime(), UnitData ) + end + DCSGroup:destroy() + DCSGroup = nil + end + + return nil +end + +--- Returns category of the DCS Group. +-- @param #GROUP self +-- @return DCSGroup#Group.Category The category ID +function GROUP:GetCategory() + self:F2( self.GroupName ) + + local DCSGroup = self:GetDCSGroup() + if DCSGroup then + local GroupCategory = DCSGroup:getCategory() + self:T3( GroupCategory ) + return GroupCategory + end + + return nil +end + +--- Returns the category name of the DCS Group. +-- @param #GROUP self +-- @return #string Category name = Helicopter, Airplane, Ground Unit, Ship +function GROUP:GetCategoryName() + self:F2( self.GroupName ) + + local DCSGroup = self:GetDCSGroup() + if DCSGroup then + local CategoryNames = { + [Group.Category.AIRPLANE] = "Airplane", + [Group.Category.HELICOPTER] = "Helicopter", + [Group.Category.GROUND] = "Ground Unit", + [Group.Category.SHIP] = "Ship", + } + local GroupCategory = DCSGroup:getCategory() + self:T3( GroupCategory ) + + return CategoryNames[GroupCategory] + end + + return nil +end + + +--- Returns the coalition of the DCS Group. +-- @param #GROUP self +-- @return DCSCoalitionObject#coalition.side The coalition side of the DCS Group. +function GROUP:GetCoalition() + self:F2( self.GroupName ) + + local DCSGroup = self:GetDCSGroup() + if DCSGroup then + local GroupCoalition = DCSGroup:getCoalition() + self:T3( GroupCoalition ) + return GroupCoalition + end + + return nil +end + +--- Returns the country of the DCS Group. +-- @param #GROUP self +-- @return DCScountry#country.id The country identifier. +-- @return #nil The DCS Group is not existing or alive. +function GROUP:GetCountry() + self:F2( self.GroupName ) + + local DCSGroup = self:GetDCSGroup() + if DCSGroup then + local GroupCountry = DCSGroup:getUnit(1):getCountry() + self:T3( GroupCountry ) + return GroupCountry + end + + return nil +end + +--- Returns the name of the DCS Group. +-- @param #GROUP self +-- @return #string The DCS Group name. +function GROUP:GetName() + self:F2( self.GroupName ) + + local DCSGroup = self:GetDCSGroup() + + if DCSGroup then + local GroupName = DCSGroup:getName() + self:T3( GroupName ) + return GroupName + end + + return nil +end + +--- Returns the DCS Group identifier. +-- @param #GROUP self +-- @return #number The identifier of the DCS Group. +function GROUP:GetID() + self:F2( self.GroupName ) + + local DCSGroup = self:GetDCSGroup() + + if DCSGroup then + local GroupID = DCSGroup:getID() + self:T3( GroupID ) + return GroupID + end + + return nil +end + +--- Returns the UNIT wrapper class with number UnitNumber. +-- If the underlying DCS Unit does not exist, the method will return nil. . +-- @param #GROUP self +-- @param #number UnitNumber The number of the UNIT wrapper class to be returned. +-- @return Unit#UNIT The UNIT wrapper class. +function GROUP:GetUnit( UnitNumber ) + self:F2( { self.GroupName, UnitNumber } ) + + local DCSGroup = self:GetDCSGroup() + + if DCSGroup then + local UnitFound = UNIT:Find( DCSGroup:getUnit( UnitNumber ) ) + self:T3( UnitFound.UnitName ) + self:T2( UnitFound ) + return UnitFound + end + + return nil +end + +--- Returns the DCS Unit with number UnitNumber. +-- If the underlying DCS Unit does not exist, the method will return nil. . +-- @param #GROUP self +-- @param #number UnitNumber The number of the DCS Unit to be returned. +-- @return DCSUnit#Unit The DCS Unit. +function GROUP:GetDCSUnit( UnitNumber ) + self:F2( { self.GroupName, UnitNumber } ) + + local DCSGroup = self:GetDCSGroup() + + if DCSGroup then + local DCSUnitFound = DCSGroup:getUnit( UnitNumber ) + self:T3( DCSUnitFound ) + return DCSUnitFound + end + + return nil +end + +--- Returns current size of the DCS Group. +-- If some of the DCS Units of the DCS Group are destroyed the size of the DCS Group is changed. +-- @param #GROUP self +-- @return #number The DCS Group size. +function GROUP:GetSize() + self:F2( { self.GroupName } ) + local DCSGroup = self:GetDCSGroup() + + if DCSGroup then + local GroupSize = DCSGroup:getSize() + self:T3( GroupSize ) + return GroupSize + end + + return nil +end + +--- +--- Returns the initial size of the DCS Group. +-- If some of the DCS Units of the DCS Group are destroyed, the initial size of the DCS Group is unchanged. +-- @param #GROUP self +-- @return #number The DCS Group initial size. +function GROUP:GetInitialSize() + self:F2( { self.GroupName } ) + local DCSGroup = self:GetDCSGroup() + + if DCSGroup then + local GroupInitialSize = DCSGroup:getInitialSize() + self:T3( GroupInitialSize ) + return GroupInitialSize + end + + return nil +end + +--- Returns the UNITs wrappers of the DCS Units of the DCS Group. +-- @param #GROUP self +-- @return #table The UNITs wrappers. +function GROUP:GetUnits() + self:F2( { self.GroupName } ) + local DCSGroup = self:GetDCSGroup() + + if DCSGroup then + local DCSUnits = DCSGroup:getUnits() + local Units = {} + for Index, UnitData in pairs( DCSUnits ) do + Units[#Units+1] = UNIT:Find( UnitData ) + end + self:T3( Units ) + return Units + end + + return nil +end + + +--- Returns the DCS Units of the DCS Group. +-- @param #GROUP self +-- @return #table The DCS Units. +function GROUP:GetDCSUnits() + self:F2( { self.GroupName } ) + local DCSGroup = self:GetDCSGroup() + + if DCSGroup then + local DCSUnits = DCSGroup:getUnits() + self:T3( DCSUnits ) + return DCSUnits + end + + return nil +end + +--- Get the controller for the GROUP. +-- @param #GROUP self +-- @return DCSController#Controller +function GROUP:_GetController() + self:F2( { self.GroupName } ) + local DCSGroup = self:GetDCSGroup() + + if DCSGroup then + local GroupController = DCSGroup:getController() + self:T3( GroupController ) + return GroupController + end + + return nil +end + + +--- Retrieve the group mission and allow to place function hooks within the mission waypoint plan. +-- Use the method @{Group#GROUP:WayPointFunction} to define the hook functions for specific waypoints. +-- Use the method @{Group@GROUP:WayPointExecute) to start the execution of the new mission plan. +-- Note that when WayPointInitialize is called, the Mission of the group is RESTARTED! +-- @param #GROUP self +-- @return #GROUP +function GROUP:WayPointInitialize() + + self.WayPoints = self:GetTaskRoute() + + return self +end + + +--- Registers a waypoint function that will be executed when the group moves over the WayPoint. +-- @param #GROUP self +-- @param #number WayPoint The waypoint number. Note that the start waypoint on the route is WayPoint 1! +-- @param #number WayPointIndex When defining multiple WayPoint functions for one WayPoint, use WayPointIndex to set the sequence of actions. +-- @param #function WayPointFunction The waypoint function to be called when the group moves over the waypoint. The waypoint function takes variable parameters. +-- @return #GROUP +function GROUP:WayPointFunction( WayPoint, WayPointIndex, WayPointFunction, ... ) + self:F2( { WayPoint, WayPointIndex, WayPointFunction } ) + + table.insert( self.WayPoints[WayPoint].task.params.tasks, WayPointIndex ) + self.WayPoints[WayPoint].task.params.tasks[WayPointIndex] = self:TaskFunction( WayPoint, WayPointIndex, WayPointFunction, arg ) + return self +end + + +function GROUP:TaskFunction( WayPoint, WayPointIndex, FunctionString, FunctionArguments ) + + local DCSTask + + local DCSScript = {} + DCSScript[#DCSScript+1] = "local MissionGroup = GROUP:Find( ... ) " + + if FunctionArguments.n > 0 then + DCSScript[#DCSScript+1] = FunctionString .. "( MissionGroup, " .. table.concat( FunctionArguments, "," ) .. ")" + else + DCSScript[#DCSScript+1] = FunctionString .. "( MissionGroup )" + end + + DCSTask = self:TaskWrappedAction( + self:CommandDoScript( + table.concat( DCSScript ) + ), WayPointIndex + ) + + self:T3( DCSTask ) + + return DCSTask + +end + + + +--- Executes the WayPoint plan. +-- The function gets a WayPoint parameter, that you can use to restart the mission at a specific WayPoint. +-- Note that when the WayPoint parameter is used, the new start mission waypoint of the group will be 1! +-- @param #GROUP self +-- @param #number WayPoint The WayPoint from where to execute the mission. +-- @param #number WaitTime The amount seconds to wait before initiating the mission. +-- @return #GROUP +function GROUP:WayPointExecute( WayPoint, WaitTime ) + + if not WayPoint then + WayPoint = 1 + end + + -- When starting the mission from a certain point, the TaskPoints need to be deleted before the given WayPoint. + for TaskPointID = 1, WayPoint - 1 do + table.remove( self.WayPoints, 1 ) + end + + self:T3( self.WayPoints ) + + self:SetTask( self:TaskRoute( self.WayPoints ), WaitTime ) + + return self +end + + +--- Activates a GROUP. +-- @param #GROUP self +function GROUP:Activate() + self:F2( { self.GroupName } ) + trigger.action.activateGroup( self:GetDCSGroup() ) + return self:GetDCSGroup() +end + + +--- Gets the type name of the group. +-- @param #GROUP self +-- @return #string The type name of the group. +function GROUP:GetTypeName() + self:F2( self.GroupName ) + + local DCSGroup = self:GetDCSGroup() + + if DCSGroup then + local GroupTypeName = DCSGroup:getUnit(1):getTypeName() + self:T3( GroupTypeName ) + return( GroupTypeName ) + end + + return nil +end + +--- Gets the CallSign of the first DCS Unit of the DCS Group. +-- @param #GROUP self +-- @return #string The CallSign of the first DCS Unit of the DCS Group. +function GROUP:GetCallsign() + self:F2( self.GroupName ) + + local DCSGroup = self:GetDCSGroup() + + if DCSGroup then + local GroupCallSign = DCSGroup:getUnit(1):getCallsign() + self:T3( GroupCallSign ) + return GroupCallSign + end + + return nil +end + +--- Returns the current point (Vec2 vector) of the first DCS Unit in the DCS Group. +-- @return DCSTypes#Vec2 Current Vec2 point of the first DCS Unit of the DCS Group. +function GROUP:GetPointVec2() + self:F2( self.GroupName ) + + local GroupPointVec2 = self:GetUnit(1):GetPointVec2() + self:T3( GroupPointVec2 ) + return GroupPointVec2 +end + +--- Returns the current point (Vec3 vector) of the first DCS Unit in the DCS Group. +-- @return DCSTypes#Vec3 Current Vec3 point of the first DCS Unit of the DCS Group. +function GROUP:GetPointVec3() + self:F2( self.GroupName ) + + local GroupPointVec3 = self:GetUnit(1):GetPointVec3() + self:T3( GroupPointVec3 ) + return GroupPointVec3 +end + + + +-- Is Zone Functions + +--- Returns true if all units of the group are within a @{Zone}. +-- @param #GROUP self +-- @param Zone#ZONE_BASE Zone The zone to test. +-- @return #boolean Returns true if the Group is completely within the @{Zone#ZONE_BASE} +function GROUP:IsCompletelyInZone( Zone ) + self:F2( { self.GroupName, Zone } ) + + for UnitID, UnitData in pairs( self:GetUnits() ) do + local Unit = UnitData -- Unit#UNIT + if Zone:IsPointVec3InZone( Unit:GetPointVec3() ) then + else + return false + end + end + + return true +end + +--- Returns true if some units of the group are within a @{Zone}. +-- @param #GROUP self +-- @param Zone#ZONE_BASE Zone The zone to test. +-- @return #boolean Returns true if the Group is completely within the @{Zone#ZONE_BASE} +function GROUP:IsPartlyInZone( Zone ) + self:F2( { self.GroupName, Zone } ) + + for UnitID, UnitData in pairs( self:GetUnits() ) do + local Unit = UnitData -- Unit#UNIT + if Zone:IsPointVec3InZone( Unit:GetPointVec3() ) then + return true + end + end + + return false +end + +--- Returns true if none of the group units of the group are within a @{Zone}. +-- @param #GROUP self +-- @param Zone#ZONE_BASE Zone The zone to test. +-- @return #boolean Returns true if the Group is completely within the @{Zone#ZONE_BASE} +function GROUP:IsNotInZone( Zone ) + self:F2( { self.GroupName, Zone } ) + + for UnitID, UnitData in pairs( self:GetUnits() ) do + local Unit = UnitData -- Unit#UNIT + if Zone:IsPointVec3InZone( Unit:GetPointVec3() ) then + return false + end + end + + return true +end + +--- Returns if the group is of an air category. +-- If the group is a helicopter or a plane, then this method will return true, otherwise false. +-- @param #GROUP self +-- @return #boolean Air category evaluation result. +function GROUP:IsAir() + self:F2( self.GroupName ) + + local DCSGroup = self:GetDCSGroup() + + if DCSGroup then + local IsAirResult = DCSGroup:getCategory() == Group.Category.AIRPLANE or DCSGroup:getCategory() == Group.Category.HELICOPTER + self:T3( IsAirResult ) + return IsAirResult + end + + return nil +end + +--- Returns if the DCS Group contains Helicopters. +-- @param #GROUP self +-- @return #boolean true if DCS Group contains Helicopters. +function GROUP:IsHelicopter() + self:F2( self.GroupName ) + + local DCSGroup = self:GetDCSGroup() + + if DCSGroup then + local GroupCategory = DCSGroup:getCategory() + self:T2( GroupCategory ) + return GroupCategory == Group.Category.HELICOPTER + end + + return nil +end + +--- Returns if the DCS Group contains AirPlanes. +-- @param #GROUP self +-- @return #boolean true if DCS Group contains AirPlanes. +function GROUP:IsAirPlane() + self:F2() + + local DCSGroup = self:GetDCSGroup() + + if DCSGroup then + local GroupCategory = DCSGroup:getCategory() + self:T2( GroupCategory ) + return GroupCategory == Group.Category.AIRPLANE + end + + return nil +end + +--- Returns if the DCS Group contains Ground troops. +-- @param #GROUP self +-- @return #boolean true if DCS Group contains Ground troops. +function GROUP:IsGround() + self:F2() + + local DCSGroup = self:GetDCSGroup() + + if DCSGroup then + local GroupCategory = DCSGroup:getCategory() + self:T2( GroupCategory ) + return GroupCategory == Group.Category.GROUND + end + + return nil +end + +--- Returns if the DCS Group contains Ships. +-- @param #GROUP self +-- @return #boolean true if DCS Group contains Ships. +function GROUP:IsShip() + self:F2() + + local DCSGroup = self:GetDCSGroup() + + if DCSGroup then + local GroupCategory = DCSGroup:getCategory() + self:T2( GroupCategory ) + return GroupCategory == Group.Category.SHIP + end + + return nil +end + +--- Returns if all units of the group are on the ground or landed. +-- If all units of this group are on the ground, this function will return true, otherwise false. +-- @param #GROUP self +-- @return #boolean All units on the ground result. +function GROUP:AllOnGround() + self:F2() + + local DCSGroup = self:GetDCSGroup() + + if DCSGroup then + local AllOnGroundResult = true + + for Index, UnitData in pairs( DCSGroup:getUnits() ) do + if UnitData:inAir() then + AllOnGroundResult = false + end + end + + self:T3( AllOnGroundResult ) + return AllOnGroundResult + end + + return nil +end + +--- Returns the current maximum velocity of the group. +-- Each unit within the group gets evaluated, and the maximum velocity (= the unit which is going the fastest) is returned. +-- @param #GROUP self +-- @return #number Maximum velocity found. +function GROUP:GetMaxVelocity() + self:F2() + + local DCSGroup = self:GetDCSGroup() + + if DCSGroup then + local MaxVelocity = 0 + + for Index, UnitData in pairs( DCSGroup:getUnits() ) do + + local Velocity = UnitData:getVelocity() + local VelocityTotal = math.abs( Velocity.x ) + math.abs( Velocity.y ) + math.abs( Velocity.z ) + + if VelocityTotal < MaxVelocity then + MaxVelocity = VelocityTotal + end + end + + return MaxVelocity + end + + return nil +end + +--- Returns the current minimum height of the group. +-- Each unit within the group gets evaluated, and the minimum height (= the unit which is the lowest elevated) is returned. +-- @param #GROUP self +-- @return #number Minimum height found. +function GROUP:GetMinHeight() + self:F2() + +end + +--- Returns the current maximum height of the group. +-- Each unit within the group gets evaluated, and the maximum height (= the unit which is the highest elevated) is returned. +-- @param #GROUP self +-- @return #number Maximum height found. +function GROUP:GetMaxHeight() + self:F2() + +end + +-- Tasks + +--- Popping current Task from the group. +-- @param #GROUP self +-- @return Group#GROUP self +function GROUP:PopCurrentTask() + self:F2() + + local DCSGroup = self:GetDCSGroup() + + if DCSGroup then + local Controller = self:_GetController() + Controller:popTask() + return self + end + + return nil +end + +--- Pushing Task on the queue from the group. +-- @param #GROUP self +-- @return Group#GROUP self +function GROUP:PushTask( DCSTask, WaitTime ) + self:F2() + + local DCSGroup = self:GetDCSGroup() + + if DCSGroup then + local Controller = self:_GetController() + + -- When a group SPAWNs, it takes about a second to get the group in the simulator. Setting tasks to unspawned groups provides unexpected results. + -- Therefore we schedule the functions to set the mission and options for the Group. + -- Controller:pushTask( DCSTask ) + + if WaitTime then + --routines.scheduleFunction( Controller.pushTask, { Controller, DCSTask }, timer.getTime() + WaitTime ) + SCHEDULER:New( Controller, Controller.pushTask, { DCSTask }, WaitTime ) + else + Controller:pushTask( DCSTask ) + end + + return self + end + + return nil +end + +--- Clearing the Task Queue and Setting the Task on the queue from the group. +-- @param #GROUP self +-- @return Group#GROUP self +function GROUP:SetTask( DCSTask, WaitTime ) + self:F2( { DCSTask } ) + + local DCSGroup = self:GetDCSGroup() + + if DCSGroup then + + local Controller = self:_GetController() + + -- When a group SPAWNs, it takes about a second to get the group in the simulator. Setting tasks to unspawned groups provides unexpected results. + -- Therefore we schedule the functions to set the mission and options for the Group. + -- Controller.setTask( Controller, DCSTask ) + + if not WaitTime then + WaitTime = 1 + end + --routines.scheduleFunction( Controller.setTask, { Controller, DCSTask }, timer.getTime() + WaitTime ) + SCHEDULER:New( Controller, Controller.setTask, { DCSTask }, WaitTime ) + + return self + end + + return nil +end + + +--- Return a condition section for a controlled task. +-- @param #GROUP self +-- @param DCSTime#Time time +-- @param #string userFlag +-- @param #boolean userFlagValue +-- @param #string condition +-- @param DCSTime#Time duration +-- @param #number lastWayPoint +-- return DCSTask#Task +function GROUP:TaskCondition( time, userFlag, userFlagValue, condition, duration, lastWayPoint ) + self:F2( { time, userFlag, userFlagValue, condition, duration, lastWayPoint } ) + + local DCSStopCondition = {} + DCSStopCondition.time = time + DCSStopCondition.userFlag = userFlag + DCSStopCondition.userFlagValue = userFlagValue + DCSStopCondition.condition = condition + DCSStopCondition.duration = duration + DCSStopCondition.lastWayPoint = lastWayPoint + + self:T3( { DCSStopCondition } ) + return DCSStopCondition +end + +--- Return a Controlled Task taking a Task and a TaskCondition. +-- @param #GROUP self +-- @param DCSTask#Task DCSTask +-- @param #DCSStopCondition DCSStopCondition +-- @return DCSTask#Task +function GROUP:TaskControlled( DCSTask, DCSStopCondition ) + self:F2( { DCSTask, DCSStopCondition } ) + + local DCSTaskControlled + + DCSTaskControlled = { + id = 'ControlledTask', + params = { + task = DCSTask, + stopCondition = DCSStopCondition + } + } + + self:T3( { DCSTaskControlled } ) + return DCSTaskControlled +end + +--- Return a Combo Task taking an array of Tasks. +-- @param #GROUP self +-- @param DCSTask#TaskArray DCSTasks Array of @{DCSTask#Task} +-- @return DCSTask#Task +function GROUP:TaskCombo( DCSTasks ) + self:F2( { DCSTasks } ) + + local DCSTaskCombo + + DCSTaskCombo = { + id = 'ComboTask', + params = { + tasks = DCSTasks + } + } + + self:T3( { DCSTaskCombo } ) + return DCSTaskCombo +end + +--- Return a WrappedAction Task taking a Command. +-- @param #GROUP self +-- @param DCSCommand#Command DCSCommand +-- @return DCSTask#Task +function GROUP:TaskWrappedAction( DCSCommand, Index ) + self:F2( { DCSCommand } ) + + local DCSTaskWrappedAction + + DCSTaskWrappedAction = { + id = "WrappedAction", + enabled = true, + number = Index, + auto = false, + params = { + action = DCSCommand, + }, + } + + self:T3( { DCSTaskWrappedAction } ) + return DCSTaskWrappedAction +end + +--- Executes a command action +-- @param #GROUP self +-- @param DCSCommand#Command DCSCommand +-- @return #GROUP self +function GROUP:SetCommand( DCSCommand ) + self:F2( DCSCommand ) + + local DCSGroup = self:GetDCSGroup() + + if DCSGroup then + local Controller = self:_GetController() + Controller:setCommand( DCSCommand ) + return self + end + + return nil +end + +--- Perform a switch waypoint command +-- @param #GROUP self +-- @param #number FromWayPoint +-- @param #number ToWayPoint +-- @return DCSTask#Task +function GROUP:CommandSwitchWayPoint( FromWayPoint, ToWayPoint, Index ) + self:F2( { FromWayPoint, ToWayPoint, Index } ) + + local CommandSwitchWayPoint = { + id = 'SwitchWaypoint', + params = { + fromWaypointIndex = FromWayPoint, + goToWaypointIndex = ToWayPoint, + }, + } + + self:T3( { CommandSwitchWayPoint } ) + return CommandSwitchWayPoint +end + + +-- TASKS FOR AIR GROUPS + + +--- (AIR) Attack a Group. +-- @param #GROUP self +-- @param Group#GROUP AttackGroup The Group to be attacked. +-- @param #number WeaponType (optional) Bitmask of weapon types those allowed to use. If parameter is not defined that means no limits on weapon usage. +-- @param DCSTypes#AI.Task.WeaponExpend WeaponExpend (optional) Determines how much weapon will be released at each attack. If parameter is not defined the unit / group will choose expend on its own discretion. +-- @param #number AttackQty (optional) This parameter limits maximal quantity of attack. The aicraft/group will not make more attack than allowed even if the target group not destroyed and the aicraft/group still have ammo. If not defined the aircraft/group will attack target until it will be destroyed or until the aircraft/group will run out of ammo. +-- @param DCSTypes#Azimuth Direction (optional) Desired ingress direction from the target to the attacking aircraft. Group/aircraft will make its attacks from the direction. Of course if there is no way to attack from the direction due the terrain group/aircraft will choose another direction. +-- @param DCSTypes#Distance Altitude (optional) Desired attack start altitude. Group/aircraft will make its attacks from the altitude. If the altitude is too low or too high to use weapon aircraft/group will choose closest altitude to the desired attack start altitude. If the desired altitude is defined group/aircraft will not attack from safe altitude. +-- @param #boolean AttackQtyLimit (optional) The flag determines how to interpret attackQty parameter. If the flag is true then attackQty is a limit on maximal attack quantity for "AttackGroup" and "AttackUnit" tasks. If the flag is false then attackQty is a desired attack quantity for "Bombing" and "BombingRunway" tasks. +-- @return DCSTask#Task The DCS task structure. +function GROUP:TaskAttackGroup( AttackGroup, WeaponType, WeaponExpend, AttackQty, Direction, Altitude, AttackQtyLimit ) + self:F2( { self.GroupName, AttackGroup, WeaponType, WeaponExpend, AttackQty, Direction, Altitude, AttackQtyLimit } ) + + -- AttackGroup = { + -- id = 'AttackGroup', + -- params = { + -- groupId = Group.ID, + -- weaponType = number, + -- expend = enum AI.Task.WeaponExpend, + -- attackQty = number, + -- directionEnabled = boolean, + -- direction = Azimuth, + -- altitudeEnabled = boolean, + -- altitude = Distance, + -- attackQtyLimit = boolean, + -- } + -- } + + local DirectionEnabled = nil + if Direction then + DirectionEnabled = true + end + + local AltitudeEnabled = nil + if Altitude then + AltitudeEnabled = true + end + + local DCSTask + DCSTask = { id = 'AttackGroup', + params = { + groupId = AttackGroup:GetID(), + weaponType = WeaponType, + expend = WeaponExpend, + attackQty = AttackQty, + directionEnabled = DirectionEnabled, + direction = Direction, + altitudeEnabled = AltitudeEnabled, + altitude = Altitude, + attackQtyLimit = AttackQtyLimit, + }, + }, + + self:T3( { DCSTask } ) + return DCSTask +end + + +--- (AIR) Attack the Unit. +-- @param #GROUP self +-- @param Unit#UNIT AttackUnit The unit. +-- @param #number WeaponType (optional) Bitmask of weapon types those allowed to use. If parameter is not defined that means no limits on weapon usage. +-- @param DCSTypes#AI.Task.WeaponExpend WeaponExpend (optional) Determines how much weapon will be released at each attack. If parameter is not defined the unit / group will choose expend on its own discretion. +-- @param #number AttackQty (optional) This parameter limits maximal quantity of attack. The aicraft/group will not make more attack than allowed even if the target group not destroyed and the aicraft/group still have ammo. If not defined the aircraft/group will attack target until it will be destroyed or until the aircraft/group will run out of ammo. +-- @param DCSTypes#Azimuth Direction (optional) Desired ingress direction from the target to the attacking aircraft. Group/aircraft will make its attacks from the direction. Of course if there is no way to attack from the direction due the terrain group/aircraft will choose another direction. +-- @param #boolean AttackQtyLimit (optional) The flag determines how to interpret attackQty parameter. If the flag is true then attackQty is a limit on maximal attack quantity for "AttackGroup" and "AttackUnit" tasks. If the flag is false then attackQty is a desired attack quantity for "Bombing" and "BombingRunway" tasks. +-- @param #boolean GroupAttack (optional) Flag indicates that the target must be engaged by all aircrafts of the group. Has effect only if the task is assigned to a group, not to a single aircraft. +-- @return DCSTask#Task The DCS task structure. +function GROUP:TaskAttackUnit( AttackUnit, WeaponType, WeaponExpend, AttackQty, Direction, AttackQtyLimit, GroupAttack ) + self:F2( { self.GroupName, AttackUnit, WeaponType, WeaponExpend, AttackQty, Direction, AttackQtyLimit, GroupAttack } ) + + -- AttackUnit = { + -- id = 'AttackUnit', + -- params = { + -- unitId = Unit.ID, + -- weaponType = number, + -- expend = enum AI.Task.WeaponExpend + -- attackQty = number, + -- direction = Azimuth, + -- attackQtyLimit = boolean, + -- groupAttack = boolean, + -- } + -- } + + local DCSTask + DCSTask = { id = 'AttackUnit', + params = { + unitId = AttackUnit:GetID(), + weaponType = WeaponType, + expend = WeaponExpend, + attackQty = AttackQty, + direction = Direction, + attackQtyLimit = AttackQtyLimit, + groupAttack = GroupAttack, + }, + }, + + self:T3( { DCSTask } ) + return DCSTask +end + + +--- (AIR) Delivering weapon at the point on the ground. +-- @param #GROUP self +-- @param DCSTypes#Vec2 PointVec2 2D-coordinates of the point to deliver weapon at. +-- @param #number WeaponType (optional) Bitmask of weapon types those allowed to use. If parameter is not defined that means no limits on weapon usage. +-- @param DCSTypes#AI.Task.WeaponExpend WeaponExpend (optional) Determines how much weapon will be released at each attack. If parameter is not defined the unit / group will choose expend on its own discretion. +-- @param #number AttackQty (optional) Desired quantity of passes. The parameter is not the same in AttackGroup and AttackUnit tasks. +-- @param DCSTypes#Azimuth Direction (optional) Desired ingress direction from the target to the attacking aircraft. Group/aircraft will make its attacks from the direction. Of course if there is no way to attack from the direction due the terrain group/aircraft will choose another direction. +-- @param #boolean GroupAttack (optional) Flag indicates that the target must be engaged by all aircrafts of the group. Has effect only if the task is assigned to a group, not to a single aircraft. +-- @return DCSTask#Task The DCS task structure. +function GROUP:TaskBombing( PointVec2, WeaponType, WeaponExpend, AttackQty, Direction, GroupAttack ) + self:F2( { self.GroupName, PointVec2, WeaponType, WeaponExpend, AttackQty, Direction, GroupAttack } ) + +-- Bombing = { +-- id = 'Bombing', +-- params = { +-- point = Vec2, +-- weaponType = number, +-- expend = enum AI.Task.WeaponExpend, +-- attackQty = number, +-- direction = Azimuth, +-- groupAttack = boolean, +-- } +-- } + + local DCSTask + DCSTask = { id = 'Bombing', + params = { + point = PointVec2, + weaponType = WeaponType, + expend = WeaponExpend, + attackQty = AttackQty, + direction = Direction, + groupAttack = GroupAttack, + }, + }, + + self:T3( { DCSTask } ) + return DCSTask +end + +--- (AIR) Orbit at a specified position at a specified alititude during a specified duration with a specified speed. +-- @param #GROUP self +-- @param DCSTypes#Vec2 Point The point to hold the position. +-- @param #number Altitude The altitude to hold the position. +-- @param #number Speed The speed flying when holding the position. +-- @return #GROUP self +function GROUP:TaskOrbitCircleAtVec2( Point, Altitude, Speed ) + self:F2( { self.GroupName, Point, Altitude, Speed } ) + + -- pattern = enum AI.Task.OribtPattern, + -- point = Vec2, + -- point2 = Vec2, + -- speed = Distance, + -- altitude = Distance + + local LandHeight = land.getHeight( Point ) + + self:T3( { LandHeight } ) + + local DCSTask = { id = 'Orbit', + params = { pattern = AI.Task.OrbitPattern.CIRCLE, + point = Point, + speed = Speed, + altitude = Altitude + LandHeight + } + } + + + -- local AITask = { id = 'ControlledTask', + -- params = { task = { id = 'Orbit', + -- params = { pattern = AI.Task.OrbitPattern.CIRCLE, + -- point = Point, + -- speed = Speed, + -- altitude = Altitude + LandHeight + -- } + -- }, + -- stopCondition = { duration = Duration + -- } + -- } + -- } + -- ) + + return DCSTask +end + +--- (AIR) Orbit at the current position of the first unit of the group at a specified alititude. +-- @param #GROUP self +-- @param #number Altitude The altitude to hold the position. +-- @param #number Speed The speed flying when holding the position. +-- @return #GROUP self +function GROUP:TaskOrbitCircle( Altitude, Speed ) + self:F2( { self.GroupName, Altitude, Speed } ) + + local DCSGroup = self:GetDCSGroup() + + if DCSGroup then + local GroupPoint = self:GetPointVec2() + return self:TaskOrbitCircleAtVec2( GroupPoint, Altitude, Speed ) + end + + return nil +end + + + +--- (AIR) Hold position at the current position of the first unit of the group. +-- @param #GROUP self +-- @param #number Duration The maximum duration in seconds to hold the position. +-- @return #GROUP self +function GROUP:TaskHoldPosition() + self:F2( { self.GroupName } ) + + return self:TaskOrbitCircle( 30, 10 ) +end + + + + +--- (AIR) Attacking the map object (building, structure, e.t.c). +-- @param #GROUP self +-- @param DCSTypes#Vec2 PointVec2 2D-coordinates of the point the map object is closest to. The distance between the point and the map object must not be greater than 2000 meters. Object id is not used here because Mission Editor doesn't support map object identificators. +-- @param #number WeaponType (optional) Bitmask of weapon types those allowed to use. If parameter is not defined that means no limits on weapon usage. +-- @param DCSTypes#AI.Task.WeaponExpend WeaponExpend (optional) Determines how much weapon will be released at each attack. If parameter is not defined the unit / group will choose expend on its own discretion. +-- @param #number AttackQty (optional) This parameter limits maximal quantity of attack. The aicraft/group will not make more attack than allowed even if the target group not destroyed and the aicraft/group still have ammo. If not defined the aircraft/group will attack target until it will be destroyed or until the aircraft/group will run out of ammo. +-- @param DCSTypes#Azimuth Direction (optional) Desired ingress direction from the target to the attacking aircraft. Group/aircraft will make its attacks from the direction. Of course if there is no way to attack from the direction due the terrain group/aircraft will choose another direction. +-- @param #boolean GroupAttack (optional) Flag indicates that the target must be engaged by all aircrafts of the group. Has effect only if the task is assigned to a group, not to a single aircraft. +-- @return DCSTask#Task The DCS task structure. +function GROUP:TaskAttackMapObject( PointVec2, WeaponType, WeaponExpend, AttackQty, Direction, GroupAttack ) + self:F2( { self.GroupName, PointVec2, WeaponType, WeaponExpend, AttackQty, Direction, GroupAttack } ) + +-- AttackMapObject = { +-- id = 'AttackMapObject', +-- params = { +-- point = Vec2, +-- weaponType = number, +-- expend = enum AI.Task.WeaponExpend, +-- attackQty = number, +-- direction = Azimuth, +-- groupAttack = boolean, +-- } +-- } + + local DCSTask + DCSTask = { id = 'AttackMapObject', + params = { + point = PointVec2, + weaponType = WeaponType, + expend = WeaponExpend, + attackQty = AttackQty, + direction = Direction, + groupAttack = GroupAttack, + }, + }, + + self:T3( { DCSTask } ) + return DCSTask +end + + +--- (AIR) Delivering weapon on the runway. +-- @param #GROUP self +-- @param Airbase#AIRBASE Airbase Airbase to attack. +-- @param #number WeaponType (optional) Bitmask of weapon types those allowed to use. If parameter is not defined that means no limits on weapon usage. +-- @param DCSTypes#AI.Task.WeaponExpend WeaponExpend (optional) Determines how much weapon will be released at each attack. If parameter is not defined the unit / group will choose expend on its own discretion. +-- @param #number AttackQty (optional) This parameter limits maximal quantity of attack. The aicraft/group will not make more attack than allowed even if the target group not destroyed and the aicraft/group still have ammo. If not defined the aircraft/group will attack target until it will be destroyed or until the aircraft/group will run out of ammo. +-- @param DCSTypes#Azimuth Direction (optional) Desired ingress direction from the target to the attacking aircraft. Group/aircraft will make its attacks from the direction. Of course if there is no way to attack from the direction due the terrain group/aircraft will choose another direction. +-- @param #boolean GroupAttack (optional) Flag indicates that the target must be engaged by all aircrafts of the group. Has effect only if the task is assigned to a group, not to a single aircraft. +-- @return DCSTask#Task The DCS task structure. +function GROUP:TaskBombingRunway( Airbase, WeaponType, WeaponExpend, AttackQty, Direction, GroupAttack ) + self:F2( { self.GroupName, Airbase, WeaponType, WeaponExpend, AttackQty, Direction, GroupAttack } ) + +-- BombingRunway = { +-- id = 'BombingRunway', +-- params = { +-- runwayId = AirdromeId, +-- weaponType = number, +-- expend = enum AI.Task.WeaponExpend, +-- attackQty = number, +-- direction = Azimuth, +-- groupAttack = boolean, +-- } +-- } + + local DCSTask + DCSTask = { id = 'BombingRunway', + params = { + point = Airbase:GetID(), + weaponType = WeaponType, + expend = WeaponExpend, + attackQty = AttackQty, + direction = Direction, + groupAttack = GroupAttack, + }, + }, + + self:T3( { DCSTask } ) + return DCSTask +end + + +--- (AIR) Refueling from the nearest tanker. No parameters. +-- @param #GROUP self +-- @return DCSTask#Task The DCS task structure. +function GROUP:TaskRefueling() + self:F2( { self.GroupName } ) + +-- Refueling = { +-- id = 'Refueling', +-- params = {} +-- } + + local DCSTask + DCSTask = { id = 'Refueling', + params = { + }, + }, + + self:T3( { DCSTask } ) + return DCSTask +end + + +--- (AIR HELICOPTER) Landing at the ground. For helicopters only. +-- @param #GROUP self +-- @param DCSTypes#Vec2 Point The point where to land. +-- @param #number Duration The duration in seconds to stay on the ground. +-- @return #GROUP self +function GROUP:TaskLandAtVec2( Point, Duration ) + self:F2( { self.GroupName, Point, Duration } ) + +-- Land = { +-- id= 'Land', +-- params = { +-- point = Vec2, +-- durationFlag = boolean, +-- duration = Time +-- } +-- } + + local DCSTask + if Duration and Duration > 0 then + DCSTask = { id = 'Land', + params = { + point = Point, + durationFlag = true, + duration = Duration, + }, + } + else + DCSTask = { id = 'Land', + params = { + point = Point, + durationFlag = false, + }, + } + end + + self:T3( DCSTask ) + return DCSTask +end + +--- (AIR) Land the group at a @{Zone#ZONE_RADIUS). +-- @param #GROUP self +-- @param Zone#ZONE Zone The zone where to land. +-- @param #number Duration The duration in seconds to stay on the ground. +-- @return #GROUP self +function GROUP:TaskLandAtZone( Zone, Duration, RandomPoint ) + self:F2( { self.GroupName, Zone, Duration, RandomPoint } ) + + local Point + if RandomPoint then + Point = Zone:GetRandomPointVec2() + else + Point = Zone:GetPointVec2() + end + + local DCSTask = self:TaskLandAtVec2( Point, Duration ) + + self:T3( DCSTask ) + return DCSTask +end + + + +--- (AIR) Following another airborne group. +-- The unit / group will follow lead unit of another group, wingmens of both groups will continue following their leaders. +-- If another group is on land the unit / group will orbit around. +-- @param #GROUP self +-- @param Group#GROUP FollowGroup The group to be followed. +-- @param DCSTypes#Vec3 PointVec3 Position of the unit / lead unit of the group relative lead unit of another group in frame reference oriented by course of lead unit of another group. If another group is on land the unit / group will orbit around. +-- @param #number LastWaypointIndex Detach waypoint of another group. Once reached the unit / group Follow task is finished. +-- @return DCSTask#Task The DCS task structure. +function GROUP:TaskFollow( FollowGroup, PointVec3, LastWaypointIndex ) + self:F2( { self.GroupName, FollowGroup, PointVec3, LastWaypointIndex } ) + +-- Follow = { +-- id = 'Follow', +-- params = { +-- groupId = Group.ID, +-- pos = Vec3, +-- lastWptIndexFlag = boolean, +-- lastWptIndex = number +-- } +-- } + + local LastWaypointIndexFlag = nil + if LastWaypointIndex then + LastWaypointIndexFlag = true + end + + local DCSTask + DCSTask = { id = 'Follow', + params = { + groupId = FollowGroup:GetID(), + pos = PointVec3, + lastWptIndexFlag = LastWaypointIndexFlag, + lastWptIndex = LastWaypointIndex, + }, + }, + + self:T3( { DCSTask } ) + return DCSTask +end + + +--- (AIR) Escort another airborne group. +-- The unit / group will follow lead unit of another group, wingmens of both groups will continue following their leaders. +-- The unit / group will also protect that group from threats of specified types. +-- @param #GROUP self +-- @param Group#GROUP EscortGroup The group to be escorted. +-- @param DCSTypes#Vec3 PointVec3 Position of the unit / lead unit of the group relative lead unit of another group in frame reference oriented by course of lead unit of another group. If another group is on land the unit / group will orbit around. +-- @param #number LastWaypointIndex Detach waypoint of another group. Once reached the unit / group Follow task is finished. +-- @param #number EngagementDistanceMax Maximal distance from escorted group to threat. If the threat is already engaged by escort escort will disengage if the distance becomes greater than 1.5 * engagementDistMax. +-- @param DCSTypes#AttributeNameArray TargetTypes Array of AttributeName that is contains threat categories allowed to engage. +-- @return DCSTask#Task The DCS task structure. +function GROUP:TaskEscort( FollowGroup, PointVec3, LastWaypointIndex, EngagementDistance, TargetTypes ) + self:F2( { self.GroupName, FollowGroup, PointVec3, LastWaypointIndex, EngagementDistance, TargetTypes } ) + +-- Escort = { +-- id = 'Escort', +-- params = { +-- groupId = Group.ID, +-- pos = Vec3, +-- lastWptIndexFlag = boolean, +-- lastWptIndex = number, +-- engagementDistMax = Distance, +-- targetTypes = array of AttributeName, +-- } +-- } + + local LastWaypointIndexFlag = nil + if LastWaypointIndex then + LastWaypointIndexFlag = true + end + + local DCSTask + DCSTask = { id = 'Follow', + params = { + groupId = FollowGroup:GetID(), + pos = PointVec3, + lastWptIndexFlag = LastWaypointIndexFlag, + lastWptIndex = LastWaypointIndex, + engagementDistMax = EngagementDistance, + targetTypes = TargetTypes, + }, + }, + + self:T3( { DCSTask } ) + return DCSTask +end + + +-- GROUND TASKS + +--- (GROUND) Fire at a VEC2 point until ammunition is finished. +-- @param #GROUP self +-- @param DCSTypes#Vec2 PointVec2 The point to fire at. +-- @param DCSTypes#Distance Radius The radius of the zone to deploy the fire at. +-- @return DCSTask#Task The DCS task structure. +function GROUP:TaskFireAtPoint( PointVec2, Radius ) + self:F2( { self.GroupName, PointVec2, Radius } ) + + -- FireAtPoint = { + -- id = 'FireAtPoint', + -- params = { + -- point = Vec2, + -- radius = Distance, + -- } + -- } + + local DCSTask + DCSTask = { id = 'FireAtPoint', + params = { + point = PointVec2, + radius = Radius, + } + } + + self:T3( { DCSTask } ) + return DCSTask +end + +--- (GROUND) Hold ground group from moving. +-- @param #GROUP self +-- @return DCSTask#Task The DCS task structure. +function GROUP:TaskHold() + self:F2( { self.GroupName } ) + +-- Hold = { +-- id = 'Hold', +-- params = { +-- } +-- } + + local DCSTask + DCSTask = { id = 'Hold', + params = { + } + } + + self:T3( { DCSTask } ) + return DCSTask +end + + +-- TASKS FOR AIRBORNE AND GROUND UNITS/GROUPS + +--- (AIR + GROUND) The task makes the group/unit a FAC and orders the FAC to control the target (enemy ground group) destruction. +-- The killer is player-controlled allied CAS-aircraft that is in contact with the FAC. +-- If the task is assigned to the group lead unit will be a FAC. +-- @param #GROUP self +-- @param Group#GROUP AttackGroup Target GROUP. +-- @param #number WeaponType Bitmask of weapon types those allowed to use. If parameter is not defined that means no limits on weapon usage. +-- @param DCSTypes#AI.Task.Designation Designation (optional) Designation type. +-- @param #boolean Datalink (optional) Allows to use datalink to send the target information to attack aircraft. Enabled by default. +-- @return DCSTask#Task The DCS task structure. +function GROUP:TaskFAC_AttackGroup( AttackGroup, WeaponType, Designation, Datalink ) + self:F2( { self.GroupName, AttackGroup, WeaponType, Designation, Datalink } ) + +-- FAC_AttackGroup = { +-- id = 'FAC_AttackGroup', +-- params = { +-- groupId = Group.ID, +-- weaponType = number, +-- designation = enum AI.Task.Designation, +-- datalink = boolean +-- } +-- } + + local DCSTask + DCSTask = { id = 'FAC_AttackGroup', + params = { + groupId = AttackGroup:GetID(), + weaponType = WeaponType, + designation = Designation, + datalink = Datalink, + } + } + + self:T3( { DCSTask } ) + return DCSTask +end + +-- EN-ROUTE TASKS FOR AIRBORNE GROUPS + +--- (AIR) Engaging targets of defined types. +-- @param #GROUP self +-- @param DCSTypes#Distance Distance Maximal distance from the target to a route leg. If the target is on a greater distance it will be ignored. +-- @param DCSTypes#AttributeNameArray TargetTypes Array of target categories allowed to engage. +-- @param #number Priority All enroute tasks have the priority parameter. This is a number (less value - higher priority) that determines actions related to what task will be performed first. +-- @return DCSTask#Task The DCS task structure. +function GROUP:EnRouteTaskEngageTargets( Distance, TargetTypes, Priority ) + self:F2( { self.GroupName, Distance, TargetTypes, Priority } ) + +-- EngageTargets ={ +-- id = 'EngageTargets', +-- params = { +-- maxDist = Distance, +-- targetTypes = array of AttributeName, +-- priority = number +-- } +-- } + + local DCSTask + DCSTask = { id = 'EngageTargets', + params = { + maxDist = Distance, + targetTypes = TargetTypes, + priority = Priority + } + } + + self:T3( { DCSTask } ) + return DCSTask +end + + + +--- (AIR) Engaging a targets of defined types at circle-shaped zone. +-- @param #GROUP self +-- @param DCSTypes#Vec2 PointVec2 2D-coordinates of the zone. +-- @param DCSTypes#Distance Radius Radius of the zone. +-- @param DCSTypes#AttributeNameArray TargetTypes Array of target categories allowed to engage. +-- @param #number Priority All en-route tasks have the priority parameter. This is a number (less value - higher priority) that determines actions related to what task will be performed first. +-- @return DCSTask#Task The DCS task structure. +function GROUP:EnRouteTaskEngageTargets( PointVec2, Radius, TargetTypes, Priority ) + self:F2( { self.GroupName, PointVec2, Radius, TargetTypes, Priority } ) + +-- EngageTargetsInZone = { +-- id = 'EngageTargetsInZone', +-- params = { +-- point = Vec2, +-- zoneRadius = Distance, +-- targetTypes = array of AttributeName, +-- priority = number +-- } +-- } + + local DCSTask + DCSTask = { id = 'EngageTargetsInZone', + params = { + point = PointVec2, + zoneRadius = Radius, + targetTypes = TargetTypes, + priority = Priority + } + } + + self:T3( { DCSTask } ) + return DCSTask +end + + +--- (AIR) Engaging a group. The task does not assign the target group to the unit/group to attack now; it just allows the unit/group to engage the target group as well as other assigned targets. +-- @param #GROUP self +-- @param Group#GROUP AttackGroup The Group to be attacked. +-- @param #number Priority All en-route tasks have the priority parameter. This is a number (less value - higher priority) that determines actions related to what task will be performed first. +-- @param #number WeaponType (optional) Bitmask of weapon types those allowed to use. If parameter is not defined that means no limits on weapon usage. +-- @param DCSTypes#AI.Task.WeaponExpend WeaponExpend (optional) Determines how much weapon will be released at each attack. If parameter is not defined the unit / group will choose expend on its own discretion. +-- @param #number AttackQty (optional) This parameter limits maximal quantity of attack. The aicraft/group will not make more attack than allowed even if the target group not destroyed and the aicraft/group still have ammo. If not defined the aircraft/group will attack target until it will be destroyed or until the aircraft/group will run out of ammo. +-- @param DCSTypes#Azimuth Direction (optional) Desired ingress direction from the target to the attacking aircraft. Group/aircraft will make its attacks from the direction. Of course if there is no way to attack from the direction due the terrain group/aircraft will choose another direction. +-- @param DCSTypes#Distance Altitude (optional) Desired attack start altitude. Group/aircraft will make its attacks from the altitude. If the altitude is too low or too high to use weapon aircraft/group will choose closest altitude to the desired attack start altitude. If the desired altitude is defined group/aircraft will not attack from safe altitude. +-- @param #boolean AttackQtyLimit (optional) The flag determines how to interpret attackQty parameter. If the flag is true then attackQty is a limit on maximal attack quantity for "AttackGroup" and "AttackUnit" tasks. If the flag is false then attackQty is a desired attack quantity for "Bombing" and "BombingRunway" tasks. +-- @return DCSTask#Task The DCS task structure. +function GROUP:EnRouteTaskEngageGroup( AttackGroup, Priority, WeaponType, WeaponExpend, AttackQty, Direction, Altitude, AttackQtyLimit ) + self:F2( { self.GroupName, AttackGroup, Priority, WeaponType, WeaponExpend, AttackQty, Direction, Altitude, AttackQtyLimit } ) + + -- EngageGroup = { + -- id = 'EngageGroup ', + -- params = { + -- groupId = Group.ID, + -- weaponType = number, + -- expend = enum AI.Task.WeaponExpend, + -- attackQty = number, + -- directionEnabled = boolean, + -- direction = Azimuth, + -- altitudeEnabled = boolean, + -- altitude = Distance, + -- attackQtyLimit = boolean, + -- priority = number, + -- } + -- } + + local DirectionEnabled = nil + if Direction then + DirectionEnabled = true + end + + local AltitudeEnabled = nil + if Altitude then + AltitudeEnabled = true + end + + local DCSTask + DCSTask = { id = 'EngageGroup', + params = { + groupId = AttackGroup:GetID(), + weaponType = WeaponType, + expend = WeaponExpend, + attackQty = AttackQty, + directionEnabled = DirectionEnabled, + direction = Direction, + altitudeEnabled = AltitudeEnabled, + altitude = Altitude, + attackQtyLimit = AttackQtyLimit, + priority = Priority, + }, + }, + + self:T3( { DCSTask } ) + return DCSTask +end + + +--- (AIR) Attack the Unit. +-- @param #GROUP self +-- @param Unit#UNIT AttackUnit The UNIT. +-- @param #number Priority All en-route tasks have the priority parameter. This is a number (less value - higher priority) that determines actions related to what task will be performed first. +-- @param #number WeaponType (optional) Bitmask of weapon types those allowed to use. If parameter is not defined that means no limits on weapon usage. +-- @param DCSTypes#AI.Task.WeaponExpend WeaponExpend (optional) Determines how much weapon will be released at each attack. If parameter is not defined the unit / group will choose expend on its own discretion. +-- @param #number AttackQty (optional) This parameter limits maximal quantity of attack. The aicraft/group will not make more attack than allowed even if the target group not destroyed and the aicraft/group still have ammo. If not defined the aircraft/group will attack target until it will be destroyed or until the aircraft/group will run out of ammo. +-- @param DCSTypes#Azimuth Direction (optional) Desired ingress direction from the target to the attacking aircraft. Group/aircraft will make its attacks from the direction. Of course if there is no way to attack from the direction due the terrain group/aircraft will choose another direction. +-- @param #boolean AttackQtyLimit (optional) The flag determines how to interpret attackQty parameter. If the flag is true then attackQty is a limit on maximal attack quantity for "AttackGroup" and "AttackUnit" tasks. If the flag is false then attackQty is a desired attack quantity for "Bombing" and "BombingRunway" tasks. +-- @param #boolean GroupAttack (optional) Flag indicates that the target must be engaged by all aircrafts of the group. Has effect only if the task is assigned to a group, not to a single aircraft. +-- @return DCSTask#Task The DCS task structure. +function GROUP:EnRouteTaskEngageUnit( AttackUnit, Priority, WeaponType, WeaponExpend, AttackQty, Direction, AttackQtyLimit, GroupAttack ) + self:F2( { self.GroupName, AttackUnit, Priority, WeaponType, WeaponExpend, AttackQty, Direction, AttackQtyLimit, GroupAttack } ) + + -- EngageUnit = { + -- id = 'EngageUnit', + -- params = { + -- unitId = Unit.ID, + -- weaponType = number, + -- expend = enum AI.Task.WeaponExpend + -- attackQty = number, + -- direction = Azimuth, + -- attackQtyLimit = boolean, + -- groupAttack = boolean, + -- priority = number, + -- } + -- } + + local DCSTask + DCSTask = { id = 'EngageUnit', + params = { + unitId = AttackUnit:GetID(), + weaponType = WeaponType, + expend = WeaponExpend, + attackQty = AttackQty, + direction = Direction, + attackQtyLimit = AttackQtyLimit, + groupAttack = GroupAttack, + priority = Priority, + }, + }, + + self:T3( { DCSTask } ) + return DCSTask +end + + + +--- (AIR) Aircraft will act as an AWACS for friendly units (will provide them with information about contacts). No parameters. +-- @param #GROUP self +-- @return DCSTask#Task The DCS task structure. +function GROUP:EnRouteTaskAWACS( ) + self:F2( { self.GroupName } ) + +-- AWACS = { +-- id = 'AWACS', +-- params = { +-- } +-- } + + local DCSTask + DCSTask = { id = 'AWACS', + params = { + } + } + + self:T3( { DCSTask } ) + return DCSTask +end + + +--- (AIR) Aircraft will act as a tanker for friendly units. No parameters. +-- @param #GROUP self +-- @return DCSTask#Task The DCS task structure. +function GROUP:EnRouteTaskTanker( ) + self:F2( { self.GroupName } ) + +-- Tanker = { +-- id = 'Tanker', +-- params = { +-- } +-- } + + local DCSTask + DCSTask = { id = 'Tanker', + params = { + } + } + + self:T3( { DCSTask } ) + return DCSTask +end + + +-- En-route tasks for ground units/groups + +--- (GROUND) Ground unit (EW-radar) will act as an EWR for friendly units (will provide them with information about contacts). No parameters. +-- @param #GROUP self +-- @return DCSTask#Task The DCS task structure. +function GROUP:EnRouteTaskEWR( ) + self:F2( { self.GroupName } ) + +-- EWR = { +-- id = 'EWR', +-- params = { +-- } +-- } + + local DCSTask + DCSTask = { id = 'EWR', + params = { + } + } + + self:T3( { DCSTask } ) + return DCSTask +end + + +-- En-route tasks for airborne and ground units/groups + +--- (AIR + GROUND) The task makes the group/unit a FAC and lets the FAC to choose the target (enemy ground group) as well as other assigned targets. +-- The killer is player-controlled allied CAS-aircraft that is in contact with the FAC. +-- If the task is assigned to the group lead unit will be a FAC. +-- @param #GROUP self +-- @param Group#GROUP AttackGroup Target GROUP. +-- @param #number Priority All en-route tasks have the priority parameter. This is a number (less value - higher priority) that determines actions related to what task will be performed first. +-- @param #number WeaponType Bitmask of weapon types those allowed to use. If parameter is not defined that means no limits on weapon usage. +-- @param DCSTypes#AI.Task.Designation Designation (optional) Designation type. +-- @param #boolean Datalink (optional) Allows to use datalink to send the target information to attack aircraft. Enabled by default. +-- @return DCSTask#Task The DCS task structure. +function GROUP:EnRouteTaskFAC_EngageGroup( AttackGroup, Priority, WeaponType, Designation, Datalink ) + self:F2( { self.GroupName, AttackGroup, WeaponType, Priority, Designation, Datalink } ) + +-- FAC_EngageGroup = { +-- id = 'FAC_EngageGroup', +-- params = { +-- groupId = Group.ID, +-- weaponType = number, +-- designation = enum AI.Task.Designation, +-- datalink = boolean, +-- priority = number, +-- } +-- } + + local DCSTask + DCSTask = { id = 'FAC_EngageGroup', + params = { + groupId = AttackGroup:GetID(), + weaponType = WeaponType, + designation = Designation, + datalink = Datalink, + priority = Priority, + } + } + + self:T3( { DCSTask } ) + return DCSTask +end + + +--- (AIR + GROUND) The task makes the group/unit a FAC and lets the FAC to choose a targets (enemy ground group) around as well as other assigned targets. +-- The killer is player-controlled allied CAS-aircraft that is in contact with the FAC. +-- If the task is assigned to the group lead unit will be a FAC. +-- @param #GROUP self +-- @param DCSTypes#Distance Radius The maximal distance from the FAC to a target. +-- @param #number Priority All en-route tasks have the priority parameter. This is a number (less value - higher priority) that determines actions related to what task will be performed first. +-- @return DCSTask#Task The DCS task structure. +function GROUP:EnRouteTaskFAC( Radius, Priority ) + self:F2( { self.GroupName, Radius, Priority } ) + +-- FAC = { +-- id = 'FAC', +-- params = { +-- radius = Distance, +-- priority = number +-- } +-- } + + local DCSTask + DCSTask = { id = 'FAC', + params = { + radius = Radius, + priority = Priority + } + } + + self:T3( { DCSTask } ) + return DCSTask +end + + + + +--- (AIR) Move the group to a Vec2 Point, wait for a defined duration and embark a group. +-- @param #GROUP self +-- @param DCSTypes#Vec2 Point The point where to wait. +-- @param #number Duration The duration in seconds to wait. +-- @param #GROUP EmbarkingGroup The group to be embarked. +-- @return DCSTask#Task The DCS task structure +function GROUP:TaskEmbarking( Point, Duration, EmbarkingGroup ) + self:F2( { self.GroupName, Point, Duration, EmbarkingGroup.DCSGroup } ) + + local DCSTask + DCSTask = { id = 'Embarking', + params = { x = Point.x, + y = Point.y, + duration = Duration, + groupsForEmbarking = { EmbarkingGroup.GroupID }, + durationFlag = true, + distributionFlag = false, + distribution = {}, + } + } + + self:T3( { DCSTask } ) + return DCSTask +end + +--- (GROUND) Embark to a Transport landed at a location. + +--- Move to a defined Vec2 Point, and embark to a group when arrived within a defined Radius. +-- @param #GROUP self +-- @param DCSTypes#Vec2 Point The point where to wait. +-- @param #number Radius The radius of the embarking zone around the Point. +-- @return DCSTask#Task The DCS task structure. +function GROUP:TaskEmbarkToTransport( Point, Radius ) + self:F2( { self.GroupName, Point, Radius } ) + + local DCSTask --DCSTask#Task + DCSTask = { id = 'EmbarkToTransport', + params = { x = Point.x, + y = Point.y, + zoneRadius = Radius, + } + } + + self:T3( { DCSTask } ) + return DCSTask +end + + + +--- (AIR + GROUND) Return a mission task from a mission template. +-- @param #GROUP self +-- @param #table TaskMission A table containing the mission task. +-- @return DCSTask#Task +function GROUP:TaskMission( TaskMission ) + self:F2( Points ) + + local DCSTask + DCSTask = { id = 'Mission', params = { TaskMission, }, } + + self:T3( { DCSTask } ) + return DCSTask +end + +--- Return a Misson task to follow a given route defined by Points. +-- @param #GROUP self +-- @param #table Points A table of route points. +-- @return DCSTask#Task +function GROUP:TaskRoute( Points ) + self:F2( Points ) + + local DCSTask + DCSTask = { id = 'Mission', params = { route = { points = Points, }, }, } + + self:T3( { DCSTask } ) + return DCSTask +end + +--- (AIR + GROUND) Make the Group move to fly to a given point. +-- @param #GROUP self +-- @param DCSTypes#Vec3 Point The destination point in Vec3 format. +-- @param #number Speed The speed to travel. +-- @return #GROUP self +function GROUP:TaskRouteToVec2( Point, Speed ) + self:F2( { Point, Speed } ) + + local GroupPoint = self:GetUnit( 1 ):GetPointVec2() + + local PointFrom = {} + PointFrom.x = GroupPoint.x + PointFrom.y = GroupPoint.y + PointFrom.type = "Turning Point" + PointFrom.action = "Turning Point" + PointFrom.speed = Speed + PointFrom.speed_locked = true + PointFrom.properties = { + ["vnav"] = 1, + ["scale"] = 0, + ["angle"] = 0, + ["vangle"] = 0, + ["steer"] = 2, + } + + + local PointTo = {} + PointTo.x = Point.x + PointTo.y = Point.y + PointTo.type = "Turning Point" + PointTo.action = "Fly Over Point" + PointTo.speed = Speed + PointTo.speed_locked = true + PointTo.properties = { + ["vnav"] = 1, + ["scale"] = 0, + ["angle"] = 0, + ["vangle"] = 0, + ["steer"] = 2, + } + + + local Points = { PointFrom, PointTo } + + self:T3( Points ) + + self:Route( Points ) + + return self +end + +--- (AIR + GROUND) Make the Group move to a given point. +-- @param #GROUP self +-- @param DCSTypes#Vec3 Point The destination point in Vec3 format. +-- @param #number Speed The speed to travel. +-- @return #GROUP self +function GROUP:TaskRouteToVec3( Point, Speed ) + self:F2( { Point, Speed } ) + + local GroupPoint = self:GetUnit( 1 ):GetPointVec3() + + local PointFrom = {} + PointFrom.x = GroupPoint.x + PointFrom.y = GroupPoint.z + PointFrom.alt = GroupPoint.y + PointFrom.alt_type = "BARO" + PointFrom.type = "Turning Point" + PointFrom.action = "Turning Point" + PointFrom.speed = Speed + PointFrom.speed_locked = true + PointFrom.properties = { + ["vnav"] = 1, + ["scale"] = 0, + ["angle"] = 0, + ["vangle"] = 0, + ["steer"] = 2, + } + + + local PointTo = {} + PointTo.x = Point.x + PointTo.y = Point.z + PointTo.alt = Point.y + PointTo.alt_type = "BARO" + PointTo.type = "Turning Point" + PointTo.action = "Fly Over Point" + PointTo.speed = Speed + PointTo.speed_locked = true + PointTo.properties = { + ["vnav"] = 1, + ["scale"] = 0, + ["angle"] = 0, + ["vangle"] = 0, + ["steer"] = 2, + } + + + local Points = { PointFrom, PointTo } + + self:T3( Points ) + + self:Route( Points ) + + return self +end + + + +--- Make the group to follow a given route. +-- @param #GROUP self +-- @param #table GoPoints A table of Route Points. +-- @return #GROUP self +function GROUP:Route( GoPoints ) + self:F2( GoPoints ) + + local DCSGroup = self:GetDCSGroup() + + if DCSGroup then + local Points = routines.utils.deepCopy( GoPoints ) + local MissionTask = { id = 'Mission', params = { route = { points = Points, }, }, } + local Controller = self:_GetController() + --Controller.setTask( Controller, MissionTask ) + --routines.scheduleFunction( Controller.setTask, { Controller, MissionTask}, timer.getTime() + 1 ) + SCHEDULER:New( Controller, Controller.setTask, { MissionTask }, 1 ) + return self + end + + return nil +end + + + +--- (AIR + GROUND) Route the group to a given zone. +-- The group final destination point can be randomized. +-- A speed can be given in km/h. +-- A given formation can be given. +-- @param #GROUP self +-- @param Zone#ZONE Zone The zone where to route to. +-- @param #boolean Randomize Defines whether to target point gets randomized within the Zone. +-- @param #number Speed The speed. +-- @param Base#FORMATION Formation The formation string. +function GROUP:TaskRouteToZone( Zone, Randomize, Speed, Formation ) + self:F2( Zone ) + + local DCSGroup = self:GetDCSGroup() + + if DCSGroup then + + local GroupPoint = self:GetPointVec2() + + local PointFrom = {} + PointFrom.x = GroupPoint.x + PointFrom.y = GroupPoint.y + PointFrom.type = "Turning Point" + PointFrom.action = "Cone" + PointFrom.speed = 20 / 1.6 + + + local PointTo = {} + local ZonePoint + + if Randomize then + ZonePoint = Zone:GetRandomPointVec2() + else + ZonePoint = Zone:GetPointVec2() + end + + PointTo.x = ZonePoint.x + PointTo.y = ZonePoint.y + PointTo.type = "Turning Point" + + if Formation then + PointTo.action = Formation + else + PointTo.action = "Cone" + end + + if Speed then + PointTo.speed = Speed + else + PointTo.speed = 20 / 1.6 + end + + local Points = { PointFrom, PointTo } + + self:T3( Points ) + + self:Route( Points ) + + return self + end + + return nil +end + +-- Commands + +--- Do Script command +-- @param #GROUP self +-- @param #string DoScript +-- @return #DCSCommand +function GROUP:CommandDoScript( DoScript ) + + local DCSDoScript = { + id = "Script", + params = { + command = DoScript, + }, + } + + self:T3( DCSDoScript ) + return DCSDoScript +end + + +--- Return the mission template of the group. +-- @param #GROUP self +-- @return #table The MissionTemplate +function GROUP:GetTaskMission() + self:F2( self.GroupName ) + + return routines.utils.deepCopy( _DATABASE.Templates.Groups[self.GroupName].Template ) +end + +--- Return the mission route of the group. +-- @param #GROUP self +-- @return #table The mission route defined by points. +function GROUP:GetTaskRoute() + self:F2( self.GroupName ) + + return routines.utils.deepCopy( _DATABASE.Templates.Groups[self.GroupName].Template.route.points ) +end + +--- Return the route of a group by using the @{Database#DATABASE} class. +-- @param #GROUP self +-- @param #number Begin The route point from where the copy will start. The base route point is 0. +-- @param #number End The route point where the copy will end. The End point is the last point - the End point. The last point has base 0. +-- @param #boolean Randomize Randomization of the route, when true. +-- @param #number Radius When randomization is on, the randomization is within the radius. +function GROUP:CopyRoute( Begin, End, Randomize, Radius ) + self:F2( { Begin, End } ) + + local Points = {} + + -- Could be a Spawned Group + local GroupName = string.match( self:GetName(), ".*#" ) + if GroupName then + GroupName = GroupName:sub( 1, -2 ) + else + GroupName = self:GetName() + end + + self:T3( { GroupName } ) + + local Template = _DATABASE.Templates.Groups[GroupName].Template + + if Template then + if not Begin then + Begin = 0 + end + if not End then + End = 0 + end + + for TPointID = Begin + 1, #Template.route.points - End do + if Template.route.points[TPointID] then + Points[#Points+1] = routines.utils.deepCopy( Template.route.points[TPointID] ) + if Randomize then + if not Radius then + Radius = 500 + end + Points[#Points].x = Points[#Points].x + math.random( Radius * -1, Radius ) + Points[#Points].y = Points[#Points].y + math.random( Radius * -1, Radius ) + end + end + end + return Points + end + + return nil +end + + +function GROUP:GetDetectedTargets() + self:F2( self.GroupName ) + + local DCSGroup = self:GetDCSGroup() + if DCSGroup then + return self:_GetController():getDetectedTargets() + end + + return nil +end + +function GROUP:IsTargetDetected( DCSObject ) + self:F2( self.GroupName ) + + local DCSGroup = self:GetDCSGroup() + if DCSGroup then + + local TargetIsDetected, TargetIsVisible, TargetLastTime, TargetKnowType, TargetKnowDistance, TargetLastPos, TargetLastVelocity + = self:_GetController().isTargetDetected( self:_GetController(), DCSObject, + Controller.Detection.VISUAL, + Controller.Detection.OPTIC, + Controller.Detection.RADAR, + Controller.Detection.IRST, + Controller.Detection.RWR, + Controller.Detection.DLINK + ) + return TargetIsDetected, TargetIsVisible, TargetLastTime, TargetKnowType, TargetKnowDistance, TargetLastPos, TargetLastVelocity + end + + return nil +end + +-- Options + +--- Can the GROUP hold their weapons? +-- @param #GROUP self +-- @return #boolean +function GROUP:OptionROEHoldFirePossible() + self:F2( { self.GroupName } ) + + local DCSGroup = self:GetDCSGroup() + if DCSGroup then + if self:IsAir() or self:IsGround() or self:IsShip() then + return true + end + + return false + end + + return nil +end + +--- Holding weapons. +-- @param Group#GROUP self +-- @return Group#GROUP self +function GROUP:OptionROEHoldFire() + self:F2( { self.GroupName } ) + + local DCSGroup = self:GetDCSGroup() + if DCSGroup then + local Controller = self:_GetController() + + if self:IsAir() then + Controller:setOption( AI.Option.Air.id.ROE, AI.Option.Air.val.ROE.WEAPON_HOLD ) + elseif self:IsGround() then + Controller:setOption( AI.Option.Ground.id.ROE, AI.Option.Ground.val.ROE.WEAPON_HOLD ) + elseif self:IsShip() then + Controller:setOption( AI.Option.Naval.id.ROE, AI.Option.Naval.val.ROE.WEAPON_HOLD ) + end + + return self + end + + return nil +end + +--- Can the GROUP attack returning on enemy fire? +-- @param #GROUP self +-- @return #boolean +function GROUP:OptionROEReturnFirePossible() + self:F2( { self.GroupName } ) + + local DCSGroup = self:GetDCSGroup() + if DCSGroup then + if self:IsAir() or self:IsGround() or self:IsShip() then + return true + end + + return false + end + + return nil +end + +--- Return fire. +-- @param #GROUP self +-- @return #GROUP self +function GROUP:OptionROEReturnFire() + self:F2( { self.GroupName } ) + + local DCSGroup = self:GetDCSGroup() + if DCSGroup then + local Controller = self:_GetController() + + if self:IsAir() then + Controller:setOption( AI.Option.Air.id.ROE, AI.Option.Air.val.ROE.RETURN_FIRE ) + elseif self:IsGround() then + Controller:setOption( AI.Option.Ground.id.ROE, AI.Option.Ground.val.ROE.RETURN_FIRE ) + elseif self:IsShip() then + Controller:setOption( AI.Option.Naval.id.ROE, AI.Option.Naval.val.ROE.RETURN_FIRE ) + end + + return self + end + + return nil +end + +--- Can the GROUP attack designated targets? +-- @param #GROUP self +-- @return #boolean +function GROUP:OptionROEOpenFirePossible() + self:F2( { self.GroupName } ) + + local DCSGroup = self:GetDCSGroup() + if DCSGroup then + if self:IsAir() or self:IsGround() or self:IsShip() then + return true + end + + return false + end + + return nil +end + +--- Openfire. +-- @param #GROUP self +-- @return #GROUP self +function GROUP:OptionROEOpenFire() + self:F2( { self.GroupName } ) + + local DCSGroup = self:GetDCSGroup() + if DCSGroup then + local Controller = self:_GetController() + + if self:IsAir() then + Controller:setOption( AI.Option.Air.id.ROE, AI.Option.Air.val.ROE.OPEN_FIRE ) + elseif self:IsGround() then + Controller:setOption( AI.Option.Ground.id.ROE, AI.Option.Ground.val.ROE.OPEN_FIRE ) + elseif self:IsShip() then + Controller:setOption( AI.Option.Naval.id.ROE, AI.Option.Naval.val.ROE.OPEN_FIRE ) + end + + return self + end + + return nil +end + +--- Can the GROUP attack targets of opportunity? +-- @param #GROUP self +-- @return #boolean +function GROUP:OptionROEWeaponFreePossible() + self:F2( { self.GroupName } ) + + local DCSGroup = self:GetDCSGroup() + if DCSGroup then + if self:IsAir() then + return true + end + + return false + end + + return nil +end + +--- Weapon free. +-- @param #GROUP self +-- @return #GROUP self +function GROUP:OptionROEWeaponFree() + self:F2( { self.GroupName } ) + + local DCSGroup = self:GetDCSGroup() + if DCSGroup then + local Controller = self:_GetController() + + if self:IsAir() then + Controller:setOption( AI.Option.Air.id.ROE, AI.Option.Air.val.ROE.WEAPON_FREE ) + end + + return self + end + + return nil +end + +--- Can the GROUP ignore enemy fire? +-- @param #GROUP self +-- @return #boolean +function GROUP:OptionROTNoReactionPossible() + self:F2( { self.GroupName } ) + + local DCSGroup = self:GetDCSGroup() + if DCSGroup then + if self:IsAir() then + return true + end + + return false + end + + return nil +end + + +--- No evasion on enemy threats. +-- @param #GROUP self +-- @return #GROUP self +function GROUP:OptionROTNoReaction() + self:F2( { self.GroupName } ) + + local DCSGroup = self:GetDCSGroup() + if DCSGroup then + local Controller = self:_GetController() + + if self:IsAir() then + Controller:setOption( AI.Option.Air.id.REACTION_ON_THREAT, AI.Option.Air.val.REACTION_ON_THREAT.NO_REACTION ) + end + + return self + end + + return nil +end + +--- Can the GROUP evade using passive defenses? +-- @param #GROUP self +-- @return #boolean +function GROUP:OptionROTPassiveDefensePossible() + self:F2( { self.GroupName } ) + + local DCSGroup = self:GetDCSGroup() + if DCSGroup then + if self:IsAir() then + return true + end + + return false + end + + return nil +end + +--- Evasion passive defense. +-- @param #GROUP self +-- @return #GROUP self +function GROUP:OptionROTPassiveDefense() + self:F2( { self.GroupName } ) + + local DCSGroup = self:GetDCSGroup() + if DCSGroup then + local Controller = self:_GetController() + + if self:IsAir() then + Controller:setOption( AI.Option.Air.id.REACTION_ON_THREAT, AI.Option.Air.val.REACTION_ON_THREAT.PASSIVE_DEFENCE ) + end + + return self + end + + return nil +end + +--- Can the GROUP evade on enemy fire? +-- @param #GROUP self +-- @return #boolean +function GROUP:OptionROTEvadeFirePossible() + self:F2( { self.GroupName } ) + + local DCSGroup = self:GetDCSGroup() + if DCSGroup then + if self:IsAir() then + return true + end + + return false + end + + return nil +end + + +--- Evade on fire. +-- @param #GROUP self +-- @return #GROUP self +function GROUP:OptionROTEvadeFire() + self:F2( { self.GroupName } ) + + local DCSGroup = self:GetDCSGroup() + if DCSGroup then + local Controller = self:_GetController() + + if self:IsAir() then + Controller:setOption( AI.Option.Air.id.REACTION_ON_THREAT, AI.Option.Air.val.REACTION_ON_THREAT.EVADE_FIRE ) + end + + return self + end + + return nil +end + +--- Can the GROUP evade on fire using vertical manoeuvres? +-- @param #GROUP self +-- @return #boolean +function GROUP:OptionROTVerticalPossible() + self:F2( { self.GroupName } ) + + local DCSGroup = self:GetDCSGroup() + if DCSGroup then + if self:IsAir() then + return true + end + + return false + end + + return nil +end + + +--- Evade on fire using vertical manoeuvres. +-- @param #GROUP self +-- @return #GROUP self +function GROUP:OptionROTVertical() + self:F2( { self.GroupName } ) + + local DCSGroup = self:GetDCSGroup() + if DCSGroup then + local Controller = self:_GetController() + + if self:IsAir() then + Controller:setOption( AI.Option.Air.id.REACTION_ON_THREAT, AI.Option.Air.val.REACTION_ON_THREAT.BYPASS_AND_ESCAPE ) + end + + return self + end + + return nil +end + +-- Message APIs + +--- Returns a message for a coalition or a client. +-- @param #GROUP self +-- @param #string Message The message text +-- @param DCSTypes#Duration Duration The duration of the message. +-- @return Message#MESSAGE +function GROUP:Message( Message, Duration ) + self:F2( { Message, Duration } ) + + local DCSGroup = self:GetDCSGroup() + if DCSGroup then + return MESSAGE:New( Message, self:GetCallsign() .. " (" .. self:GetTypeName() .. ")", Duration, self:GetClassNameAndID() ) + end + + return nil +end + +--- Send a message to all coalitions. +-- The message will appear in the message area. The message will begin with the callsign of the group and the type of the first unit sending the message. +-- @param #GROUP self +-- @param #string Message The message text +-- @param DCSTypes#Duration Duration The duration of the message. +function GROUP:MessageToAll( Message, Duration ) + self:F2( { Message, Duration } ) + + local DCSGroup = self:GetDCSGroup() + if DCSGroup then + self:Message( Message, Duration ):ToAll() + end + + return nil +end + +--- Send a message to the red coalition. +-- The message will appear in the message area. The message will begin with the callsign of the group and the type of the first unit sending the message. +-- @param #GROUP self +-- @param #string Message The message text +-- @param DCSTYpes#Duration Duration The duration of the message. +function GROUP:MessageToRed( Message, Duration ) + self:F2( { Message, Duration } ) + + local DCSGroup = self:GetDCSGroup() + if DCSGroup then + self:Message( Message, Duration ):ToRed() + end + + return nil +end + +--- Send a message to the blue coalition. +-- The message will appear in the message area. The message will begin with the callsign of the group and the type of the first unit sending the message. +-- @param #GROUP self +-- @param #string Message The message text +-- @param DCSTypes#Duration Duration The duration of the message. +function GROUP:MessageToBlue( Message, Duration ) + self:F2( { Message, Duration } ) + + local DCSGroup = self:GetDCSGroup() + if DCSGroup then + self:Message( Message, Duration ):ToBlue() + end + + return nil +end + +--- Send a message to a client. +-- The message will appear in the message area. The message will begin with the callsign of the group and the type of the first unit sending the message. +-- @param #GROUP self +-- @param #string Message The message text +-- @param DCSTypes#Duration Duration The duration of the message. +-- @param Client#CLIENT Client The client object receiving the message. +function GROUP:MessageToClient( Message, Duration, Client ) + self:F2( { Message, Duration } ) + + local DCSGroup = self:GetDCSGroup() + if DCSGroup then + self:Message( Message, Duration ):ToClient( Client ) + end + + return nil +end +--- This module contains the UNIT class. +-- +-- 1) @{Unit#UNIT} class, extends @{Base#BASE} +-- =========================================== +-- The @{Unit#UNIT} class is a wrapper class to handle the DCS Unit objects: +-- +-- * Support all DCS Unit APIs. +-- * Enhance with Unit specific APIs not in the DCS Unit API set. +-- * Handle local Unit Controller. +-- * Manage the "state" of the DCS Unit. +-- +-- +-- 1.1) UNIT reference methods +-- ---------------------- +-- For each DCS Unit object alive within a running mission, a UNIT wrapper object (instance) will be created within the _@{DATABASE} object. +-- This is done at the beginning of the mission (when the mission starts), and dynamically when new DCS Unit objects are spawned (using the @{SPAWN} class). +-- +-- The UNIT class **does not contain a :New()** method, rather it provides **:Find()** methods to retrieve the object reference +-- using the DCS Unit or the DCS UnitName. +-- +-- Another thing to know is that UNIT objects do not "contain" the DCS Unit object. +-- The UNIT methods will reference the DCS Unit object by name when it is needed during API execution. +-- If the DCS Unit object does not exist or is nil, the UNIT methods will return nil and log an exception in the DCS.log file. +-- +-- The UNIT class provides the following functions to retrieve quickly the relevant UNIT instance: +-- +-- * @{#UNIT.Find}(): Find a UNIT instance from the _DATABASE object using a DCS Unit object. +-- * @{#UNIT.FindByName}(): Find a UNIT instance from the _DATABASE object using a DCS Unit name. +-- +-- IMPORTANT: ONE SHOULD NEVER SANATIZE these UNIT OBJECT REFERENCES! (make the UNIT object references nil). +-- +-- 1.2) DCS UNIT APIs +-- ------------------ +-- The DCS Unit APIs are used extensively within MOOSE. The UNIT class has for each DCS Unit API a corresponding method. +-- To be able to distinguish easily in your code the difference between a UNIT API call and a DCS Unit API call, +-- the first letter of the method is also capitalized. So, by example, the DCS Unit method @{DCSUnit#Unit.getName}() +-- is implemented in the UNIT class as @{#UNIT.GetName}(). +-- +-- 1.3) Smoke, Flare Units +-- ----------------------- +-- The UNIT class provides methods to smoke or flare units easily. +-- The @{#UNIT.SmokeBlue}(), @{#UNIT.SmokeGreen}(),@{#UNIT.SmokeOrange}(), @{#UNIT.SmokeRed}(), @{#UNIT.SmokeRed}() methods +-- will smoke the unit in the corresponding color. Note that smoking a unit is done at the current position of the DCS Unit. +-- When the DCS Unit moves for whatever reason, the smoking will still continue! +-- The @{#UNIT.FlareGreen}(), @{#UNIT.FlareRed}(), @{#UNIT.FlareWhite}(), @{#UNIT.FlareYellow}() +-- methods will fire off a flare in the air with the corresponding color. Note that a flare is a one-off shot and its effect is of very short duration. +-- +-- 1.4) Location Position, Point +-- ----------------------------- +-- The UNIT class provides methods to obtain the current point or position of the DCS Unit. +-- The @{#UNIT.GetPointVec2}(), @{#UNIT.GetPointVec3}() will obtain the current **location** of the DCS Unit in a Vec2 (2D) or a **point** in a Vec3 (3D) vector respectively. +-- If you want to obtain the complete **3D position** including oriëntation and direction vectors, consult the @{#UNIT.GetPositionVec3}() method respectively. +-- +-- 1.5) Test if alive +-- ------------------ +-- The @{#UNIT.IsAlive}(), @{#UNIT.IsActive}() methods determines if the DCS Unit is alive, meaning, it is existing and active. +-- +-- 1.6) Test for proximity +-- ----------------------- +-- The UNIT class contains methods to test the location or proximity against zones or other objects. +-- +-- ### 1.6.1) Zones +-- To test whether the Unit is within a **zone**, use the @{#UNIT.IsInZone}() or the @{#UNIT.IsNotInZone}() methods. Any zone can be tested on, but the zone must be derived from @{Zone#ZONE_BASE}. +-- +-- ### 1.6.2) Units +-- Test if another DCS Unit is within a given radius of the current DCS Unit, use the @{#UNIT.OtherUnitInRadius}() method. +-- +-- @module Unit +-- @author FlightControl + +Include.File( "Routines" ) +Include.File( "Base" ) +Include.File( "Message" ) + +--- The UNIT class +-- @type UNIT +-- @extends Base#BASE +-- @field #UNIT.FlareColor FlareColor +-- @field #UNIT.SmokeColor SmokeColor +UNIT = { + ClassName="UNIT", + CategoryName = { + [Unit.Category.AIRPLANE] = "Airplane", + [Unit.Category.HELICOPTER] = "Helicoper", + [Unit.Category.GROUND_UNIT] = "Ground Unit", + [Unit.Category.SHIP] = "Ship", + [Unit.Category.STRUCTURE] = "Structure", + }, + FlareColor = { + Green = trigger.flareColor.Green, + Red = trigger.flareColor.Red, + White = trigger.flareColor.White, + Yellow = trigger.flareColor.Yellow + }, + SmokeColor = { + Green = trigger.smokeColor.Green, + Red = trigger.smokeColor.Red, + White = trigger.smokeColor.White, + Orange = trigger.smokeColor.Orange, + Blue = trigger.smokeColor.Blue + }, + } + +--- FlareColor +-- @type UNIT.FlareColor +-- @field Green +-- @field Red +-- @field White +-- @field Yellow + +--- SmokeColor +-- @type UNIT.SmokeColor +-- @field Green +-- @field Red +-- @field White +-- @field Orange +-- @field Blue + +-- Registration. + +--- Create a new UNIT from DCSUnit. +-- @param #UNIT self +-- @param DCSUnit#Unit DCSUnit +-- @param Database#DATABASE Database +-- @return Unit#UNIT +function UNIT:Register( UnitName ) + + local self = BASE:Inherit( self, BASE:New() ) + self:F2( UnitName ) + self.UnitName = UnitName + return self +end + +-- Reference methods. + +--- Finds a UNIT from the _DATABASE using a DCSUnit object. +-- @param #UNIT self +-- @param DCSUnit#Unit DCSUnit An existing DCS Unit object reference. +-- @return Unit#UNIT self +function UNIT:Find( DCSUnit ) + + local UnitName = DCSUnit:getName() + local UnitFound = _DATABASE:FindUnit( UnitName ) + return UnitFound +end + +--- Find a UNIT in the _DATABASE using the name of an existing DCS Unit. +-- @param #UNIT self +-- @param #string UnitName The Unit Name. +-- @return Unit#UNIT self +function UNIT:FindByName( UnitName ) + + local UnitFound = _DATABASE:FindUnit( UnitName ) + return UnitFound +end + +function UNIT:GetDCSUnit() + local DCSUnit = Unit.getByName( self.UnitName ) + + if DCSUnit then + return DCSUnit + end + + return nil +end + +--- Returns coalition of the Unit. +-- @param Unit#UNIT self +-- @return DCSCoalitionObject#coalition.side The side of the coalition. +-- @return #nil The DCS Unit is not existing or alive. +function UNIT:GetCoalition() + self:F2( self.UnitName ) + + local DCSUnit = self:GetDCSUnit() + + if DCSUnit then + local UnitCoalition = DCSUnit:getCoalition() + self:T3( UnitCoalition ) + return UnitCoalition + end + + return nil +end + +--- Returns country of the Unit. +-- @param Unit#UNIT self +-- @return DCScountry#country.id The country identifier. +-- @return #nil The DCS Unit is not existing or alive. +function UNIT:GetCountry() + self:F2( self.UnitName ) + + local DCSUnit = self:GetDCSUnit() + + if DCSUnit then + local UnitCountry = DCSUnit:getCountry() + self:T3( UnitCountry ) + return UnitCountry + end + + return nil +end + + +--- Returns DCS Unit object name. +-- The function provides access to non-activated units too. +-- @param Unit#UNIT self +-- @return #string The name of the DCS Unit. +-- @return #nil The DCS Unit is not existing or alive. +function UNIT:GetName() + self:F2( self.UnitName ) + + local DCSUnit = self:GetDCSUnit() + + if DCSUnit then + local UnitName = self.UnitName + return UnitName + end + + return nil +end + + +--- Returns if the unit is alive. +-- @param Unit#UNIT self +-- @return #boolean true if Unit is alive. +-- @return #nil The DCS Unit is not existing or alive. +function UNIT:IsAlive() + self:F2( self.UnitName ) + + local DCSUnit = self:GetDCSUnit() + + if DCSUnit then + local UnitIsAlive = DCSUnit:isExist() + return UnitIsAlive + end + + return false +end + +--- Returns if the unit is activated. +-- @param Unit#UNIT self +-- @return #boolean true if Unit is activated. +-- @return #nil The DCS Unit is not existing or alive. +function UNIT:IsActive() + self:F2( self.UnitName ) + + local DCSUnit = self:GetDCSUnit() + + if DCSUnit then + + local UnitIsActive = DCSUnit:isActive() + return UnitIsActive + end + + return nil +end + +--- Returns name of the player that control the unit or nil if the unit is controlled by A.I. +-- @param Unit#UNIT self +-- @return #string Player Name +-- @return #nil The DCS Unit is not existing or alive. +function UNIT:GetPlayerName() + self:F2( self.UnitName ) + + local DCSUnit = self:GetDCSUnit() + + if DCSUnit then + + local PlayerName = DCSUnit:getPlayerName() + if PlayerName == nil then + PlayerName = "" + end + return PlayerName + end + + return nil +end + +--- Returns the unit's unique identifier. +-- @param Unit#UNIT self +-- @return DCSUnit#Unit.ID Unit ID +-- @return #nil The DCS Unit is not existing or alive. +function UNIT:GetID() + self:F2( self.UnitName ) + + local DCSUnit = self:GetDCSUnit() + + if DCSUnit then + local UnitID = DCSUnit:getID() + return UnitID + end + + return nil +end + +--- Returns the unit's number in the group. +-- The number is the same number the unit has in ME. +-- It may not be changed during the mission. +-- If any unit in the group is destroyed, the numbers of another units will not be changed. +-- @param Unit#UNIT self +-- @return #number The Unit number. +-- @return #nil The DCS Unit is not existing or alive. +function UNIT:GetNumber() + self:F2( self.UnitName ) + + local DCSUnit = self:GetDCSUnit() + + if DCSUnit then + local UnitNumber = DCSUnit:getNumber() + return UnitNumber + end + + return nil +end + +--- Returns the unit's group if it exist and nil otherwise. +-- @param Unit#UNIT self +-- @return Group#GROUP The Group of the Unit. +-- @return #nil The DCS Unit is not existing or alive. +function UNIT:GetGroup() + self:F2( self.UnitName ) + + local DCSUnit = self:GetDCSUnit() + + if DCSUnit then + local UnitGroup = DCSUnit:getGroup() + return UnitGroup + end + + return nil +end + + +--- Returns the unit's callsign - the localized string. +-- @param Unit#UNIT self +-- @return #string The Callsign of the Unit. +-- @return #nil The DCS Unit is not existing or alive. +function UNIT:GetCallSign() + self:F2( self.UnitName ) + + local DCSUnit = self:GetDCSUnit() + + if DCSUnit then + local UnitCallSign = DCSUnit:getCallsign() + return UnitCallSign + end + + return nil +end + +--- Returns the unit's health. Dead units has health <= 1.0. +-- @param Unit#UNIT self +-- @return #number The Unit's health value. +-- @return #nil The DCS Unit is not existing or alive. +function UNIT:GetLife() + self:F2( self.UnitName ) + + local DCSUnit = self:GetDCSUnit() + + if DCSUnit then + local UnitLife = DCSUnit:getLife() + return UnitLife + end + + return nil +end + +--- Returns the Unit's initial health. +-- @param Unit#UNIT self +-- @return #number The Unit's initial health value. +-- @return #nil The DCS Unit is not existing or alive. +function UNIT:GetLife0() + self:F2( self.UnitName ) + + local DCSUnit = self:GetDCSUnit() + + if DCSUnit then + local UnitLife0 = DCSUnit:getLife0() + return UnitLife0 + end + + return nil +end + +--- Returns relative amount of fuel (from 0.0 to 1.0) the unit has in its internal tanks. If there are additional fuel tanks the value may be greater than 1.0. +-- @param Unit#UNIT self +-- @return #number The relative amount of fuel (from 0.0 to 1.0). +-- @return #nil The DCS Unit is not existing or alive. +function UNIT:GetFuel() + self:F2( self.UnitName ) + + local DCSUnit = self:GetDCSUnit() + + if DCSUnit then + local UnitFuel = DCSUnit:getFuel() + return UnitFuel + end + + return nil +end + +--- Returns the Unit's ammunition. +-- @param Unit#UNIT self +-- @return DCSUnit#Unit.Ammo +-- @return #nil The DCS Unit is not existing or alive. +function UNIT:GetAmmo() + self:F2( self.UnitName ) + + local DCSUnit = self:GetDCSUnit() + + if DCSUnit then + local UnitAmmo = DCSUnit:getAmmo() + return UnitAmmo + end + + return nil +end + +--- Returns the unit sensors. +-- @param Unit#UNIT self +-- @return DCSUnit#Unit.Sensors +-- @return #nil The DCS Unit is not existing or alive. +function UNIT:GetSensors() + self:F2( self.UnitName ) + + local DCSUnit = self:GetDCSUnit() + + if DCSUnit then + local UnitSensors = DCSUnit:getSensors() + return UnitSensors + end + + return nil +end + +-- Need to add here a function per sensortype +-- unit:hasSensors(Unit.SensorType.RADAR, Unit.RadarType.AS) + +--- Returns two values: +-- +-- * First value indicates if at least one of the unit's radar(s) is on. +-- * Second value is the object of the radar's interest. Not nil only if at least one radar of the unit is tracking a target. +-- @param Unit#UNIT self +-- @return #boolean Indicates if at least one of the unit's radar(s) is on. +-- @return DCSObject#Object The object of the radar's interest. Not nil only if at least one radar of the unit is tracking a target. +-- @return #nil The DCS Unit is not existing or alive. +function UNIT:GetRadar() + self:F2( self.UnitName ) + + local DCSUnit = self:GetDCSUnit() + + if DCSUnit then + local UnitRadarOn, UnitRadarObject = DCSUnit:getRadar() + return UnitRadarOn, UnitRadarObject + end + + return nil, nil +end + +-- Need to add here functions to check if radar is on and which object etc. + +--- Returns unit descriptor. Descriptor type depends on unit category. +-- @param Unit#UNIT self +-- @return DCSUnit#Unit.Desc The Unit descriptor. +-- @return #nil The DCS Unit is not existing or alive. +function UNIT:GetDesc() + self:F2( self.UnitName ) + + local DCSUnit = self:GetDCSUnit() + + if DCSUnit then + local UnitDesc = DCSUnit:getDesc() + return UnitDesc + end + + return nil +end + + +--- Returns the type name of the DCS Unit. +-- @param Unit#UNIT self +-- @return #string The type name of the DCS Unit. +-- @return #nil The DCS Unit is not existing or alive. +function UNIT:GetTypeName() + self:F2( self.UnitName ) + + local DCSUnit = self:GetDCSUnit() + + if DCSUnit then + local UnitTypeName = DCSUnit:getTypeName() + self:T3( UnitTypeName ) + return UnitTypeName + end + + return nil +end + + + +--- Returns the prefix name of the DCS Unit. A prefix name is a part of the name before a '#'-sign. +-- DCS Units spawned with the @{SPAWN} class contain a '#'-sign to indicate the end of the (base) DCS Unit name. +-- The spawn sequence number and unit number are contained within the name after the '#' sign. +-- @param Unit#UNIT self +-- @return #string The name of the DCS Unit. +-- @return #nil The DCS Unit is not existing or alive. +function UNIT:GetPrefix() + self:F2( self.UnitName ) + + local DCSUnit = self:GetDCSUnit() + + if DCSUnit then + local UnitPrefix = string.match( self.UnitName, ".*#" ):sub( 1, -2 ) + self:T3( UnitPrefix ) + return UnitPrefix + end + + return nil +end + + + +--- Returns the @{DCSTypes#Vec2} vector indicating the point in 2D of the DCS Unit within the mission. +-- @param Unit#UNIT self +-- @return DCSTypes#Vec2 The 2D point vector of the DCS Unit. +-- @return #nil The DCS Unit is not existing or alive. +function UNIT:GetPointVec2() + self:F2( self.UnitName ) + + local DCSUnit = self:GetDCSUnit() + + if DCSUnit then + local UnitPointVec3 = DCSUnit:getPosition().p + + local UnitPointVec2 = {} + UnitPointVec2.x = UnitPointVec3.x + UnitPointVec2.y = UnitPointVec3.z + + self:T2( UnitPointVec2 ) + return UnitPointVec2 + end + + return nil +end + + +--- Returns the @{DCSTypes#Vec3} vector indicating the point in 3D of the DCS Unit within the mission. +-- @param Unit#UNIT self +-- @return DCSTypes#Vec3 The 3D point vector of the DCS Unit. +-- @return #nil The DCS Unit is not existing or alive. +function UNIT:GetPointVec3() + self:F2( self.UnitName ) + + local DCSUnit = self:GetDCSUnit() + + if DCSUnit then + local UnitPointVec3 = DCSUnit:getPosition().p + self:T3( UnitPointVec3 ) + return UnitPointVec3 + end + + return nil +end + +--- Returns the @{DCSTypes#Position3} position vectors indicating the point and direction vectors in 3D of the DCS Unit within the mission. +-- @param Unit#UNIT self +-- @return DCSTypes#Position The 3D position vectors of the DCS Unit. +-- @return #nil The DCS Unit is not existing or alive. +function UNIT:GetPositionVec3() + self:F2( self.UnitName ) + + local DCSUnit = self:GetDCSUnit() + + if DCSUnit then + local UnitPosition = DCSUnit:getPosition() + self:T3( UnitPosition ) + return UnitPosition + end + + return nil +end + +--- Returns the DCS Unit velocity vector. +-- @param Unit#UNIT self +-- @return DCSTypes#Vec3 The velocity vector +-- @return #nil The DCS Unit is not existing or alive. +function UNIT:GetVelocity() + self:F2( self.UnitName ) + + local DCSUnit = self:GetDCSUnit() + + if DCSUnit then + local UnitVelocityVec3 = DCSUnit:getVelocity() + self:T3( UnitVelocityVec3 ) + return UnitVelocityVec3 + end + + return nil +end + +-- Is functions + +--- Returns true if the unit is within a @{Zone}. +-- @param #UNIT self +-- @param Zone#ZONE_BASE Zone The zone to test. +-- @return #boolean Returns true if the unit is within the @{Zone#ZONE_BASE} +function UNIT:IsInZone( Zone ) + self:F2( { self.UnitName, Zone } ) + + local IsInZone = Zone:IsPointVec3InZone( self:GetPointVec3() ) + + self:T( { IsInZone } ) + return IsInZone +end + +--- Returns true if the unit is not within a @{Zone}. +-- @param #UNIT self +-- @param Zone#ZONE_BASE Zone The zone to test. +-- @return #boolean Returns true if the unit is not within the @{Zone#ZONE_BASE} +function UNIT:IsNotInZone( Zone ) + self:F2( { self.UnitName, Zone } ) + + local IsInZone = not Zone:IsPointVec3InZone( self:GetPointVec3() ) + + self:T( { IsInZone } ) + return IsInZone +end + +--- Returns true if the DCS Unit is in the air. +-- @param Unit#UNIT self +-- @return #boolean true if in the air. +-- @return #nil The DCS Unit is not existing or alive. +function UNIT:InAir() + self:F2( self.UnitName ) + + local DCSUnit = self:GetDCSUnit() + + if DCSUnit then + local UnitInAir = DCSUnit:inAir() + self:T3( UnitInAir ) + return UnitInAir + end + + return nil +end + +--- Returns the altitude of the DCS Unit. +-- @param Unit#UNIT self +-- @return DCSTypes#Distance The altitude of the DCS Unit. +-- @return #nil The DCS Unit is not existing or alive. +function UNIT:GetAltitude() + self:F2() + + local DCSUnit = self:GetDCSUnit() + + if DCSUnit then + local UnitPointVec3 = DCSUnit:getPoint() --DCSTypes#Vec3 + return UnitPointVec3.y + end + + return nil +end + +--- Returns true if there is an **other** DCS Unit within a radius of the current 2D point of the DCS Unit. +-- @param Unit#UNIT self +-- @param Unit#UNIT AwaitUnit The other UNIT wrapper object. +-- @param Radius The radius in meters with the DCS Unit in the centre. +-- @return true If the other DCS Unit is within the radius of the 2D point of the DCS Unit. +-- @return #nil The DCS Unit is not existing or alive. +function UNIT:OtherUnitInRadius( AwaitUnit, Radius ) + self:F2( { self.UnitName, AwaitUnit.UnitName, Radius } ) + + local DCSUnit = self:GetDCSUnit() + + if DCSUnit then + local UnitPos = self:GetPointVec3() + local AwaitUnitPos = AwaitUnit:GetPointVec3() + + if (((UnitPos.x - AwaitUnitPos.x)^2 + (UnitPos.z - AwaitUnitPos.z)^2)^0.5 <= Radius) then + self:T3( "true" ) + return true + else + self:T3( "false" ) + return false + end + end + + return nil +end + +--- Returns the DCS Unit category name as defined within the DCS Unit Descriptor. +-- @param Unit#UNIT self +-- @return #string The DCS Unit Category Name +function UNIT:GetCategoryName() + local DCSUnit = self:GetDCSUnit() + + if DCSUnit then + local UnitCategoryName = self.CategoryName[ self:GetDesc().category ] + return UnitCategoryName + end + + return nil +end + +--- Signal a flare at the position of the UNIT. +-- @param #UNIT self +function UNIT:Flare( FlareColor ) + self:F2() + trigger.action.signalFlare( self:GetPointVec3(), FlareColor , 0 ) +end + +--- Signal a white flare at the position of the UNIT. +-- @param #UNIT self +function UNIT:FlareWhite() + self:F2() + trigger.action.signalFlare( self:GetPointVec3(), trigger.flareColor.White , 0 ) +end + +--- Signal a yellow flare at the position of the UNIT. +-- @param #UNIT self +function UNIT:FlareYellow() + self:F2() + trigger.action.signalFlare( self:GetPointVec3(), trigger.flareColor.Yellow , 0 ) +end + +--- Signal a green flare at the position of the UNIT. +-- @param #UNIT self +function UNIT:FlareGreen() + self:F2() + trigger.action.signalFlare( self:GetPointVec3(), trigger.flareColor.Green , 0 ) +end + +--- Signal a red flare at the position of the UNIT. +-- @param #UNIT self +function UNIT:FlareRed() + self:F2() + trigger.action.signalFlare( self:GetPointVec3(), trigger.flareColor.Red, 0 ) +end + +--- Smoke the UNIT. +-- @param #UNIT self +function UNIT:Smoke( SmokeColor ) + self:F2() + trigger.action.smoke( self:GetPointVec3(), SmokeColor ) +end + +--- Smoke the UNIT Green. +-- @param #UNIT self +function UNIT:SmokeGreen() + self:F2() + trigger.action.smoke( self:GetPointVec3(), trigger.smokeColor.Green ) +end + +--- Smoke the UNIT Red. +-- @param #UNIT self +function UNIT:SmokeRed() + self:F2() + trigger.action.smoke( self:GetPointVec3(), trigger.smokeColor.Red ) +end + +--- Smoke the UNIT White. +-- @param #UNIT self +function UNIT:SmokeWhite() + self:F2() + trigger.action.smoke( self:GetPointVec3(), trigger.smokeColor.White ) +end + +--- Smoke the UNIT Orange. +-- @param #UNIT self +function UNIT:SmokeOrange() + self:F2() + trigger.action.smoke( self:GetPointVec3(), trigger.smokeColor.Orange ) +end + +--- Smoke the UNIT Blue. +-- @param #UNIT self +function UNIT:SmokeBlue() + self:F2() + trigger.action.smoke( self:GetPointVec3(), trigger.smokeColor.Blue ) +end + +-- Is methods + +--- Returns if the unit is of an air category. +-- If the unit is a helicopter or a plane, then this method will return true, otherwise false. +-- @param #UNIT self +-- @return #boolean Air category evaluation result. +function UNIT:IsAir() + self:F2() + + local UnitDescriptor = self.DCSUnit:getDesc() + self:T3( { UnitDescriptor.category, Unit.Category.AIRPLANE, Unit.Category.HELICOPTER } ) + + local IsAirResult = ( UnitDescriptor.category == Unit.Category.AIRPLANE ) or ( UnitDescriptor.category == Unit.Category.HELICOPTER ) + + self:T3( IsAirResult ) + return IsAirResult +end + +--- This module contains the ZONE classes, inherited from @{Zone#ZONE_BASE}. +-- There are essentially two core functions that zones accomodate: +-- +-- * Test if an object is within the zone boundaries. +-- * Provide the zone behaviour. Some zones are static, while others are moveable. +-- +-- The object classes are using the zone classes to test the zone boundaries, which can take various forms: +-- +-- * Test if completely within the zone. +-- * Test if partly within the zone (for @{Group#GROUP} objects). +-- * Test if not in the zone. +-- * Distance to the nearest intersecting point of the zone. +-- * Distance to the center of the zone. +-- * ... +-- +-- Each of these ZONE classes have a zone name, and specific parameters defining the zone type: +-- +-- * @{Zone#ZONE_BASE}: The ZONE_BASE class defining the base for all other zone classes. +-- * @{Zone#ZONE_RADIUS}: The ZONE_RADIUS class defined by a zone name, a location and a radius. +-- * @{Zone#ZONE}: The ZONE class, defined by the zone name as defined within the Mission Editor. +-- * @{Zone#ZONE_UNIT}: The ZONE_UNIT class defined by a zone around a @{Unit#UNIT} with a radius. +-- * @{Zone#ZONE_POLYGON}: The ZONE_POLYGON class defined by a sequence of @{Group#GROUP} waypoints within the Mission Editor, forming a polygon. +-- +-- Each zone implements two polymorphic functions defined in @{Zone#ZONE_BASE}: +-- +-- * @{#ZONE_BASE.IsPointVec2InZone}: Returns if a location is within the zone. +-- * @{#ZONE_BASE.IsPointVec3InZone}: Returns if a point is within the zone. +-- +-- === +-- +-- 1) @{Zone#ZONE_BASE} class, extends @{Base#BASE} +-- ================================================ +-- The ZONE_BASE class defining the base for all other zone classes. +-- +-- === +-- +-- 2) @{Zone#ZONE_RADIUS} class, extends @{Zone#ZONE_BASE} +-- ======================================================= +-- The ZONE_RADIUS class defined by a zone name, a location and a radius. +-- +-- === +-- +-- 3) @{Zone#ZONE} class, extends @{Zone#ZONE_RADIUS} +-- ========================================== +-- The ZONE class, defined by the zone name as defined within the Mission Editor. +-- +-- === +-- +-- 4) @{Zone#ZONE_UNIT} class, extends @{Zone#ZONE_RADIUS} +-- ======================================================= +-- The ZONE_UNIT class defined by a zone around a @{Unit#UNIT} with a radius. +-- +-- === +-- +-- 5) @{Zone#ZONE_POLYGON} class, extends @{Zone#ZONE_BASE} +-- ======================================================== +-- The ZONE_POLYGON class defined by a sequence of @{Group#GROUP} waypoints within the Mission Editor, forming a polygon. +-- +-- === +-- +-- @module Zone +-- @author FlightControl + + +Include.File( "Routines" ) +Include.File( "Base" ) +Include.File( "Message" ) +Include.File( "Point" ) + + + +--- The ZONE_BASE class +-- @type ZONE_BASE +-- @extends Base#BASE +ZONE_BASE = { + ClassName = "ZONE_BASE", + } + +--- ZONE_BASE constructor +-- @param #ZONE_BASE self +-- @param #string ZoneName Name of the zone. +-- @return #ZONE_BASE self +function ZONE_BASE:New( ZoneName ) + local self = BASE:Inherit( self, BASE:New() ) + self:F( ZoneName ) + + self.ZoneName = ZoneName + + return self +end + +--- Returns if a location is within the zone. +-- @param #ZONE_RADIUS self +-- @param DCSTypes#Vec2 PointVec2 The location to test. +-- @return #boolean true if the location is within the zone. +function ZONE_BASE:IsPointVec2InZone( PointVec2 ) + self:F2( PointVec2 ) + + return false +end + +--- Returns if a point is within the zone. +-- @param #ZONE_RADIUS self +-- @param DCSTypes#Vec3 PointVec3 The point to test. +-- @return #boolean true if the point is within the zone. +function ZONE_BASE:IsPointVec3InZone( PointVec3 ) + self:F2( PointVec3 ) + + local InZone = self:IsPointVec2InZone( { x = PointVec3.x, y = PointVec3.z } ) + + return InZone +end + +--- Smokes the zone boundaries in a color. +-- @param #ZONE_BASE self +-- @param SmokeColor The smoke color. +function ZONE_BASE:SmokeZone( SmokeColor ) + self:F2( SmokeColor ) + +end + + +--- The ZONE_RADIUS class, defined by a zone name, a location and a radius. +-- @type ZONE_RADIUS +-- @field DCSTypes#Vec2 PointVec2 The current location of the zone. +-- @field DCSTypes#Distance Radius The radius of the zone. +-- @extends Zone#ZONE_BASE +ZONE_RADIUS = { + ClassName="ZONE_RADIUS", + } + +--- Constructor of ZONE_RADIUS, taking the zone name, the zone location and a radius. +-- @param #ZONE_RADIUS self +-- @param #string ZoneName Name of the zone. +-- @param DCSTypes#Vec2 PointVec2 The location of the zone. +-- @param DCSTypes#Distance Radius The radius of the zone. +-- @return #ZONE_RADIUS self +function ZONE_RADIUS:New( ZoneName, PointVec2, Radius ) + local self = BASE:Inherit( self, ZONE_BASE:New( ZoneName ) ) + self:F( { ZoneName, PointVec2, Radius } ) + + self.Radius = Radius + self.PointVec2 = PointVec2 + + return self +end + +--- Smokes the zone boundaries in a color. +-- @param #ZONE_RADIUS self +-- @param #POINT_VEC3.SmokeColor SmokeColor The smoke color. +-- @param #number Points (optional) The amount of points in the circle. +-- @return #ZONE_RADIUS self +function ZONE_RADIUS:SmokeZone( SmokeColor, Points ) + self:F2( SmokeColor ) + + local Point = {} + local PointVec2 = self:GetPointVec2() + + Points = Points and Points or 360 + + local Angle + local RadialBase = math.pi*2 + + for Angle = 0, 360, 360 / Points do + local Radial = Angle * RadialBase / 360 + Point.x = PointVec2.x + math.cos( Radial ) * self:GetRadius() + Point.y = PointVec2.y + math.sin( Radial ) * self:GetRadius() + POINT_VEC2:New( Point.x, Point.y ):Smoke( SmokeColor ) + end + + return self +end + + +--- Flares the zone boundaries in a color. +-- @param #ZONE_RADIUS self +-- @param #POINT_VEC3.FlareColor FlareColor The flare color. +-- @param #number Points (optional) The amount of points in the circle. +-- @param DCSTypes#Azimuth Azimuth (optional) Azimuth The azimuth of the flare. +-- @return #ZONE_RADIUS self +function ZONE_RADIUS:FlareZone( FlareColor, Points, Azimuth ) + self:F2( { FlareColor, Azimuth } ) + + local Point = {} + local PointVec2 = self:GetPointVec2() + + Points = Points and Points or 360 + + local Angle + local RadialBase = math.pi*2 + + for Angle = 0, 360, 360 / Points do + local Radial = Angle * RadialBase / 360 + Point.x = PointVec2.x + math.cos( Radial ) * self:GetRadius() + Point.y = PointVec2.y + math.sin( Radial ) * self:GetRadius() + POINT_VEC2:New( Point.x, Point.y ):Flare( FlareColor, Azimuth ) + end + + return self +end + +--- Returns the radius of the zone. +-- @param #ZONE_RADIUS self +-- @return DCSTypes#Distance The radius of the zone. +function ZONE_RADIUS:GetRadius() + self:F2( self.ZoneName ) + + self:T2( { self.Radius } ) + + return self.Radius +end + +--- Sets the radius of the zone. +-- @param #ZONE_RADIUS self +-- @param DCSTypes#Distance Radius The radius of the zone. +-- @return DCSTypes#Distance The radius of the zone. +function ZONE_RADIUS:SetRadius( Radius ) + self:F2( self.ZoneName ) + + self.Radius = Radius + self:T2( { self.Radius } ) + + return self.Radius +end + +--- Returns the location of the zone. +-- @param #ZONE_RADIUS self +-- @return DCSTypes#Vec2 The location of the zone. +function ZONE_RADIUS:GetPointVec2() + self:F2( self.ZoneName ) + + self:T2( { self.PointVec2 } ) + + return self.PointVec2 +end + +--- Sets the location of the zone. +-- @param #ZONE_RADIUS self +-- @param DCSTypes#Vec2 PointVec2 The new location of the zone. +-- @return DCSTypes#Vec2 The new location of the zone. +function ZONE_RADIUS:SetPointVec2( PointVec2 ) + self:F2( self.ZoneName ) + + self.PointVec2 = PointVec2 + + self:T2( { self.PointVec2 } ) + + return self.PointVec2 +end + +--- Returns the point of the zone. +-- @param #ZONE_RADIUS self +-- @param DCSTypes#Distance Height The height to add to the land height where the center of the zone is located. +-- @return DCSTypes#Vec3 The point of the zone. +function ZONE_RADIUS:GetPointVec3( Height ) + self:F2( self.ZoneName ) + + local PointVec2 = self:GetPointVec2() + + local PointVec3 = { x = PointVec2.x, y = land.getHeight( self:GetPointVec2() ) + Height, z = PointVec2.y } + + self:T2( { PointVec3 } ) + + return PointVec3 +end + + +--- Returns if a location is within the zone. +-- @param #ZONE_RADIUS self +-- @param DCSTypes#Vec2 PointVec2 The location to test. +-- @return #boolean true if the location is within the zone. +function ZONE_RADIUS:IsPointVec2InZone( PointVec2 ) + self:F2( PointVec2 ) + + local ZonePointVec2 = self:GetPointVec2() + + if (( PointVec2.x - ZonePointVec2.x )^2 + ( PointVec2.y - ZonePointVec2.y ) ^2 ) ^ 0.5 <= self:GetRadius() then + return true + end + + return false +end + +--- Returns if a point is within the zone. +-- @param #ZONE_RADIUS self +-- @param DCSTypes#Vec3 PointVec3 The point to test. +-- @return #boolean true if the point is within the zone. +function ZONE_RADIUS:IsPointVec3InZone( PointVec3 ) + self:F2( PointVec3 ) + + local InZone = self:IsPointVec2InZone( { x = PointVec3.x, y = PointVec3.z } ) + + return InZone +end + +--- Returns a random location within the zone. +-- @param #ZONE_RADIUS self +-- @return DCSTypes#Vec2 The random location within the zone. +function ZONE_RADIUS:GetRandomPointVec2() + self:F( self.ZoneName ) + + local Point = {} + local PointVec2 = self:GetPointVec2() + + local angle = math.random() * math.pi*2; + Point.x = PointVec2.x + math.cos( angle ) * math.random() * self:GetRadius(); + Point.y = PointVec2.y + math.sin( angle ) * math.random() * self:GetRadius(); + + self:T( { Point } ) + + return Point +end + + + +--- The ZONE class, defined by the zone name as defined within the Mission Editor. The location and the radius are automatically collected from the mission settings. +-- @type ZONE +-- @extends Zone#ZONE_RADIUS +ZONE = { + ClassName="ZONE", + } + + +--- Constructor of ZONE, taking the zone name. +-- @param #ZONE self +-- @param #string ZoneName The name of the zone as defined within the mission editor. +-- @return #ZONE +function ZONE:New( ZoneName ) + + local Zone = trigger.misc.getZone( ZoneName ) + + if not Zone then + error( "Zone " .. ZoneName .. " does not exist." ) + return nil + end + + local self = BASE:Inherit( self, ZONE_RADIUS:New( ZoneName, { x = Zone.point.x, y = Zone.point.z }, Zone.radius ) ) + self:F( ZoneName ) + + self.Zone = Zone + + return self +end + + +--- The ZONE_UNIT class defined by a zone around a @{Unit#UNIT} with a radius. +-- @type ZONE_UNIT +-- @field Unit#UNIT ZoneUNIT +-- @extends Zone#ZONE_RADIUS +ZONE_UNIT = { + ClassName="ZONE_UNIT", + } + +--- Constructor to create a ZONE_UNIT instance, taking the zone name, a zone unit and a radius. +-- @param #ZONE_UNIT self +-- @param #string ZoneName Name of the zone. +-- @param Unit#UNIT ZoneUNIT The unit as the center of the zone. +-- @param DCSTypes#Distance Radius The radius of the zone. +-- @return #ZONE_UNIT self +function ZONE_UNIT:New( ZoneName, ZoneUNIT, Radius ) + local self = BASE:Inherit( self, ZONE_RADIUS:New( ZoneName, ZoneUNIT:GetPointVec2(), Radius ) ) + self:F( { ZoneName, ZoneUNIT:GetPointVec2(), Radius } ) + + self.ZoneUNIT = ZoneUNIT + + return self +end + + +--- Returns the current location of the @{Unit#UNIT}. +-- @param #ZONE_UNIT self +-- @return DCSTypes#Vec2 The location of the zone based on the @{Unit#UNIT}location. +function ZONE_UNIT:GetPointVec2() + self:F( self.ZoneName ) + + local ZonePointVec2 = self.ZoneUNIT:GetPointVec2() + + self:T( { ZonePointVec2 } ) + + return ZonePointVec2 +end + + +--- The ZONE_POLYGON class defined by a sequence of @{Group#GROUP} waypoints within the Mission Editor, forming a polygon. +-- @type ZONE_POLYGON +-- @extends Zone#ZONE_BASE +ZONE_POLYGON = { + ClassName="ZONE_POLYGON", + } + +--- Constructor to create a ZONE_POLYGON instance, taking the zone name and the name of the @{Group#GROUP} defined within the Mission Editor. +-- The @{Group#GROUP} waypoints define the polygon corners. The first and the last point are automatically connected by ZONE_POLYGON. +-- @param #ZONE_POLYGON self +-- @param #string ZoneName Name of the zone. +-- @param Group#GROUP ZoneGroup The GROUP waypoints as defined within the Mission Editor define the polygon shape. +-- @return #ZONE_POLYGON self +function ZONE_POLYGON:New( ZoneName, ZoneGroup ) + local self = BASE:Inherit( self, ZONE_BASE:New( ZoneName ) ) + self:F( { ZoneName, ZoneGroup } ) + + local GroupPoints = ZoneGroup:GetTaskRoute() + local i = 0 + + self.Polygon = {} + + for i = 1, #GroupPoints do + self.Polygon[i] = {} + self.Polygon[i].x = GroupPoints[i].x + self.Polygon[i].y = GroupPoints[i].y + end + + return self +end + +--- Smokes the zone boundaries in a color. +-- @param #ZONE_POLYGON self +-- @param #POINT_VEC3.SmokeColor SmokeColor The smoke color. +-- @return #ZONE_POLYGON self +function ZONE_POLYGON:SmokeZone( SmokeColor ) + self:F2( SmokeColor ) + + local i + local j + local Segments = 10 + + i = 1 + j = #self.Polygon + + while i <= #self.Polygon do + self:T( { i, j, self.Polygon[i], self.Polygon[j] } ) + + local DeltaX = self.Polygon[j].x - self.Polygon[i].x + local DeltaY = self.Polygon[j].y - self.Polygon[i].y + + for Segment = 0, Segments do -- We divide each line in 5 segments and smoke a point on the line. + local PointX = self.Polygon[i].x + ( Segment * DeltaX / Segments ) + local PointY = self.Polygon[i].y + ( Segment * DeltaY / Segments ) + POINT_VEC2:New( PointX, PointY ):Smoke( SmokeColor ) + end + j = i + i = i + 1 + end + + return self +end + + + + +--- Returns if a location is within the zone. +-- @param #ZONE_POLYGON self +-- @param DCSTypes#Vec2 PointVec2 The location to test. +-- @return #boolean true if the location is within the zone. +function ZONE_POLYGON:IsPointVec2InZone( PointVec2 ) + self:F2( PointVec2 ) + + local i + local j + local c = false + + i = 1 + j = #self.Polygon + + while i < #self.Polygon do + j = i + i = i + 1 + self:T( { i, j, self.Polygon[i], self.Polygon[j] } ) + if ( ( ( self.Polygon[i].y > PointVec2.y ) ~= ( self.Polygon[j].y > PointVec2.y ) ) and + ( PointVec2.x < ( self.Polygon[j].x - self.Polygon[i].x ) * ( PointVec2.y - self.Polygon[i].y ) / ( self.Polygon[j].y - self.Polygon[i].y ) + self.Polygon[i].x ) + ) then + c = not c + end + self:T2( { "c = ", c } ) + end + + self:T( { "c = ", c } ) + return c +end + +--- This module contains the CLIENT class. +-- +-- 1) @{Client#CLIENT} class, extends @{Unit#UNIT} +-- =============================================== +-- Clients are those **Units** defined within the Mission Editor that have the skillset defined as __Client__ or __Player__. +-- Note that clients are NOT the same as Units, they are NOT necessarily alive. +-- The @{Client#CLIENT} class is a wrapper class to handle the DCS Unit objects that have the skillset defined as __Client__ or __Player__: +-- +-- * Wraps the DCS Unit objects with skill level set to Player or Client. +-- * Support all DCS Unit APIs. +-- * Enhance with Unit specific APIs not in the DCS Group API set. +-- * When player joins Unit, execute alive init logic. +-- * Handles messages to players. +-- * Manage the "state" of the DCS Unit. +-- +-- Clients are being used by the @{MISSION} class to follow players and register their successes. +-- +-- 1.1) CLIENT reference methods +-- ----------------------------- +-- For each DCS Unit having skill level Player or Client, a CLIENT wrapper object (instance) will be created within the _@{DATABASE} object. +-- This is done at the beginning of the mission (when the mission starts). +-- +-- The CLIENT class does not contain a :New() method, rather it provides :Find() methods to retrieve the object reference +-- using the DCS Unit or the DCS UnitName. +-- +-- Another thing to know is that CLIENT objects do not "contain" the DCS Unit object. +-- The CLIENT methods will reference the DCS Unit object by name when it is needed during API execution. +-- If the DCS Unit object does not exist or is nil, the CLIENT methods will return nil and log an exception in the DCS.log file. +-- +-- The CLIENT class provides the following functions to retrieve quickly the relevant CLIENT instance: +-- +-- * @{#CLIENT.Find}(): Find a CLIENT instance from the _DATABASE object using a DCS Unit object. +-- * @{#CLIENT.FindByName}(): Find a CLIENT instance from the _DATABASE object using a DCS Unit name. +-- +-- IMPORTANT: ONE SHOULD NEVER SANATIZE these CLIENT OBJECT REFERENCES! (make the CLIENT object references nil). +-- +-- @module Client +-- @author FlightControl + +Include.File( "Routines" ) +Include.File( "Base" ) +Include.File( "Cargo" ) +Include.File( "Message" ) + + +--- The CLIENT class +-- @type CLIENT +-- @extends Unit#UNIT +CLIENT = { + ONBOARDSIDE = { + NONE = 0, + LEFT = 1, + RIGHT = 2, + BACK = 3, + FRONT = 4 + }, + ClassName = "CLIENT", + ClientName = nil, + ClientAlive = false, + ClientTransport = false, + ClientBriefingShown = false, + _Menus = {}, + _Tasks = {}, + Messages = { + } +} + + +--- Finds a CLIENT from the _DATABASE using the relevant DCS Unit. +-- @param #CLIENT self +-- @param #string ClientName Name of the DCS **Unit** as defined within the Mission Editor. +-- @param #string ClientBriefing Text that describes the briefing of the mission when a Player logs into the Client. +-- @return #CLIENT +-- @usage +-- -- Create new Clients. +-- local Mission = MISSIONSCHEDULER.AddMission( 'Russia Transport Troops SA-6', 'Operational', 'Transport troops from the control center to one of the SA-6 SAM sites to activate their operation.', 'Russia' ) +-- Mission:AddGoal( DeploySA6TroopsGoal ) +-- +-- Mission:AddClient( CLIENT:FindByName( 'RU MI-8MTV2*HOT-Deploy Troops 1' ):Transport() ) +-- Mission:AddClient( CLIENT:FindByName( 'RU MI-8MTV2*RAMP-Deploy Troops 3' ):Transport() ) +-- Mission:AddClient( CLIENT:FindByName( 'RU MI-8MTV2*HOT-Deploy Troops 2' ):Transport() ) +-- Mission:AddClient( CLIENT:FindByName( 'RU MI-8MTV2*RAMP-Deploy Troops 4' ):Transport() ) +function CLIENT:Find( DCSUnit ) + local ClientName = DCSUnit:getName() + local ClientFound = _DATABASE:FindClient( ClientName ) + + if ClientFound then + ClientFound:F( ClientName ) + return ClientFound + end + + error( "CLIENT not found for: " .. ClientName ) +end + + +--- Finds a CLIENT from the _DATABASE using the relevant Client Unit Name. +-- As an optional parameter, a briefing text can be given also. +-- @param #CLIENT self +-- @param #string ClientName Name of the DCS **Unit** as defined within the Mission Editor. +-- @param #string ClientBriefing Text that describes the briefing of the mission when a Player logs into the Client. +-- @return #CLIENT +-- @usage +-- -- Create new Clients. +-- local Mission = MISSIONSCHEDULER.AddMission( 'Russia Transport Troops SA-6', 'Operational', 'Transport troops from the control center to one of the SA-6 SAM sites to activate their operation.', 'Russia' ) +-- Mission:AddGoal( DeploySA6TroopsGoal ) +-- +-- Mission:AddClient( CLIENT:FindByName( 'RU MI-8MTV2*HOT-Deploy Troops 1' ):Transport() ) +-- Mission:AddClient( CLIENT:FindByName( 'RU MI-8MTV2*RAMP-Deploy Troops 3' ):Transport() ) +-- Mission:AddClient( CLIENT:FindByName( 'RU MI-8MTV2*HOT-Deploy Troops 2' ):Transport() ) +-- Mission:AddClient( CLIENT:FindByName( 'RU MI-8MTV2*RAMP-Deploy Troops 4' ):Transport() ) +function CLIENT:FindByName( ClientName, ClientBriefing ) + local ClientFound = _DATABASE:FindClient( ClientName ) + + if ClientFound then + ClientFound:F( { ClientName, ClientBriefing } ) + ClientFound:AddBriefing( ClientBriefing ) + ClientFound.MessageSwitch = true + + return ClientFound + end + + error( "CLIENT not found for: " .. ClientName ) +end + +function CLIENT:Register( ClientName ) + local self = BASE:Inherit( self, UNIT:Register( ClientName ) ) + + self:F( ClientName ) + self.ClientName = ClientName + self.MessageSwitch = true + self.ClientAlive2 = false + + --self.AliveCheckScheduler = routines.scheduleFunction( self._AliveCheckScheduler, { self }, timer.getTime() + 1, 5 ) + self.AliveCheckScheduler = SCHEDULER:New( self, self._AliveCheckScheduler, {}, 1, 5 ) + + return self +end + + +--- Transport defines that the Client is a Transport. Transports show cargo. +-- @param #CLIENT self +-- @return #CLIENT +function CLIENT:Transport() + self:F() + + self.ClientTransport = true + return self +end + +--- AddBriefing adds a briefing to a CLIENT when a player joins a mission. +-- @param #CLIENT self +-- @param #string ClientBriefing is the text defining the Mission briefing. +-- @return #CLIENT self +function CLIENT:AddBriefing( ClientBriefing ) + self:F( ClientBriefing ) + self.ClientBriefing = ClientBriefing + self.ClientBriefingShown = false + + return self +end + +--- Show the briefing of a CLIENT. +-- @param #CLIENT self +-- @return #CLIENT self +function CLIENT:ShowBriefing() + self:F( { self.ClientName, self.ClientBriefingShown } ) + + if not self.ClientBriefingShown then + self.ClientBriefingShown = true + local Briefing = "" + if self.ClientBriefing then + Briefing = Briefing .. self.ClientBriefing + end + Briefing = Briefing .. " Press [LEFT ALT]+[B] to view the complete mission briefing." + self:Message( Briefing, 60, self.ClientName .. '/ClientBriefing', "Briefing" ) + end + + return self +end + +--- Show the mission briefing of a MISSION to the CLIENT. +-- @param #CLIENT self +-- @param #string MissionBriefing +-- @return #CLIENT self +function CLIENT:ShowMissionBriefing( MissionBriefing ) + self:F( { self.ClientName } ) + + if MissionBriefing then + self:Message( MissionBriefing, 60, self.ClientName .. '/MissionBriefing', "Mission Briefing" ) + end + + return self +end + + + +--- Resets a CLIENT. +-- @param #CLIENT self +-- @param #string ClientName Name of the Group as defined within the Mission Editor. The Group must have a Unit with the type Client. +function CLIENT:Reset( ClientName ) + self:F() + self._Menus = {} +end + +-- Is Functions + +--- Checks if the CLIENT is a multi-seated UNIT. +-- @param #CLIENT self +-- @return #boolean true if multi-seated. +function CLIENT:IsMultiSeated() + self:F( self.ClientName ) + + local ClientMultiSeatedTypes = { + ["Mi-8MT"] = "Mi-8MT", + ["UH-1H"] = "UH-1H", + ["P-51B"] = "P-51B" + } + + if self:IsAlive() then + local ClientTypeName = self:GetClientGroupUnit():GetTypeName() + if ClientMultiSeatedTypes[ClientTypeName] then + return true + end + end + + return false +end + +--- Checks for a client alive event and calls a function on a continuous basis. +-- @param #CLIENT self +-- @param #function CallBack Function. +-- @return #CLIENT +function CLIENT:Alive( CallBack, ... ) + self:F() + + self.ClientCallBack = CallBack + self.ClientParameters = arg + + return self +end + +--- @param #CLIENT self +function CLIENT:_AliveCheckScheduler() + self:F( { self.ClientName, self.ClientAlive2, self.ClientBriefingShown } ) + + if self:IsAlive() then -- Polymorphic call of UNIT + if self.ClientAlive2 == false then + self:ShowBriefing() + if self.ClientCallBack then + self:T("Calling Callback function") + self.ClientCallBack( self, unpack( self.ClientParameters ) ) + end + self.ClientAlive2 = true + end + else + if self.ClientAlive2 == true then + self.ClientAlive2 = false + end + end + + return true +end + +--- Return the DCSGroup of a Client. +-- This function is modified to deal with a couple of bugs in DCS 1.5.3 +-- @param #CLIENT self +-- @return DCSGroup#Group +function CLIENT:GetDCSGroup() + self:F3() + +-- local ClientData = Group.getByName( self.ClientName ) +-- if ClientData and ClientData:isExist() then +-- self:T( self.ClientName .. " : group found!" ) +-- return ClientData +-- else +-- return nil +-- end + + local ClientUnit = Unit.getByName( self.ClientName ) + + local CoalitionsData = { AlivePlayersRed = coalition.getPlayers( coalition.side.RED ), AlivePlayersBlue = coalition.getPlayers( coalition.side.BLUE ) } + for CoalitionId, CoalitionData in pairs( CoalitionsData ) do + self:T3( { "CoalitionData:", CoalitionData } ) + for UnitId, UnitData in pairs( CoalitionData ) do + self:T3( { "UnitData:", UnitData } ) + if UnitData and UnitData:isExist() then + + --self:E(self.ClientName) + if ClientUnit then + local ClientGroup = ClientUnit:getGroup() + if ClientGroup then + self:T3( "ClientGroup = " .. self.ClientName ) + if ClientGroup:isExist() and UnitData:getGroup():isExist() then + if ClientGroup:getID() == UnitData:getGroup():getID() then + self:T3( "Normal logic" ) + self:T3( self.ClientName .. " : group found!" ) + self.ClientGroupID = ClientGroup:getID() + self.ClientGroupName = ClientGroup:getName() + return ClientGroup + end + else + -- Now we need to resolve the bugs in DCS 1.5 ... + -- Consult the database for the units of the Client Group. (ClientGroup:getUnits() returns nil) + self:T3( "Bug 1.5 logic" ) + local ClientGroupTemplate = _DATABASE.Templates.Units[self.ClientName].GroupTemplate + self.ClientGroupID = ClientGroupTemplate.groupId + self.ClientGroupName = _DATABASE.Templates.Units[self.ClientName].GroupName + self:T3( self.ClientName .. " : group found in bug 1.5 resolvement logic!" ) + return ClientGroup + end + -- else + -- error( "Client " .. self.ClientName .. " not found!" ) + end + else + --self:E( { "Client not found!", self.ClientName } ) + end + end + end + end + + -- For non player clients + if ClientUnit then + local ClientGroup = ClientUnit:getGroup() + if ClientGroup then + self:T3( "ClientGroup = " .. self.ClientName ) + if ClientGroup:isExist() then + self:T3( "Normal logic" ) + self:T3( self.ClientName .. " : group found!" ) + return ClientGroup + end + end + end + + self.ClientGroupID = nil + self.ClientGroupUnit = nil + + return nil +end + + +-- TODO: Check DCSTypes#Group.ID +--- Get the group ID of the client. +-- @param #CLIENT self +-- @return DCSTypes#Group.ID +function CLIENT:GetClientGroupID() + + local ClientGroup = self:GetDCSGroup() + + --self:E( self.ClientGroupID ) -- Determined in GetDCSGroup() + return self.ClientGroupID +end + + +--- Get the name of the group of the client. +-- @param #CLIENT self +-- @return #string +function CLIENT:GetClientGroupName() + + local ClientGroup = self:GetDCSGroup() + + self:T( self.ClientGroupName ) -- Determined in GetDCSGroup() + return self.ClientGroupName +end + +--- Returns the UNIT of the CLIENT. +-- @param #CLIENT self +-- @return Unit#UNIT +function CLIENT:GetClientGroupUnit() + self:F2() + + local ClientDCSUnit = Unit.getByName( self.ClientName ) + + self:T( self.ClientDCSUnit ) + if ClientDCSUnit and ClientDCSUnit:isExist() then + local ClientUnit = _DATABASE:FindUnit( self.ClientName ) + self:T2( ClientUnit ) + return ClientUnit + end +end + +--- Returns the DCSUnit of the CLIENT. +-- @param #CLIENT self +-- @return DCSTypes#Unit +function CLIENT:GetClientGroupDCSUnit() + self:F2() + + local ClientDCSUnit = Unit.getByName( self.ClientName ) + + if ClientDCSUnit and ClientDCSUnit:isExist() then + self:T2( ClientDCSUnit ) + return ClientDCSUnit + end +end + + +--- Evaluates if the CLIENT is a transport. +-- @param #CLIENT self +-- @return #boolean true is a transport. +function CLIENT:IsTransport() + self:F() + return self.ClientTransport +end + +--- Shows the @{Cargo#CARGO} contained within the CLIENT to the player as a message. +-- The @{Cargo#CARGO} is shown using the @{Message#MESSAGE} distribution system. +-- @param #CLIENT self +function CLIENT:ShowCargo() + self:F() + + local CargoMsg = "" + + for CargoName, Cargo in pairs( CARGOS ) do + if self == Cargo:IsLoadedInClient() then + CargoMsg = CargoMsg .. Cargo.CargoName .. " Type:" .. Cargo.CargoType .. " Weight: " .. Cargo.CargoWeight .. "\n" + end + end + + if CargoMsg == "" then + CargoMsg = "empty" + end + + self:Message( CargoMsg, 15, self.ClientName .. "/Cargo", "Co-Pilot: Cargo Status", 30 ) + +end + +-- TODO (1) I urgently need to revise this. +--- A local function called by the DCS World Menu system to switch off messages. +function CLIENT.SwitchMessages( PrmTable ) + PrmTable[1].MessageSwitch = PrmTable[2] +end + +--- The main message driver for the CLIENT. +-- This function displays various messages to the Player logged into the CLIENT through the DCS World Messaging system. +-- @param #CLIENT self +-- @param #string Message is the text describing the message. +-- @param #number MessageDuration is the duration in seconds that the Message should be displayed. +-- @param #string MessageId is a text identifying the Message in the MessageQueue. The Message system overwrites Messages with the same MessageId +-- @param #string MessageCategory is the category of the message (the title). +-- @param #number MessageInterval is the interval in seconds between the display of the @{Message#MESSAGE} when the CLIENT is in the air. +function CLIENT:Message( Message, MessageDuration, MessageId, MessageCategory, MessageInterval ) + self:F( { Message, MessageDuration, MessageId, MessageCategory, MessageInterval } ) + + if not self.MenuMessages then + if self:GetClientGroupID() then + self.MenuMessages = MENU_CLIENT:New( self, 'Messages' ) + self.MenuRouteMessageOn = MENU_CLIENT_COMMAND:New( self, 'Messages On', self.MenuMessages, CLIENT.SwitchMessages, { self, true } ) + self.MenuRouteMessageOff = MENU_CLIENT_COMMAND:New( self,'Messages Off', self.MenuMessages, CLIENT.SwitchMessages, { self, false } ) + end + end + + if self.MessageSwitch == true then + if MessageCategory == nil then + MessageCategory = "Messages" + end + if self.Messages[MessageId] == nil then + self.Messages[MessageId] = {} + self.Messages[MessageId].MessageId = MessageId + self.Messages[MessageId].MessageTime = timer.getTime() + self.Messages[MessageId].MessageDuration = MessageDuration + if MessageInterval == nil then + self.Messages[MessageId].MessageInterval = 600 + else + self.Messages[MessageId].MessageInterval = MessageInterval + end + MESSAGE:New( Message, MessageCategory, MessageDuration, MessageId ):ToClient( self ) + else + if self:GetClientGroupDCSUnit() and not self:GetClientGroupDCSUnit():inAir() then + if timer.getTime() - self.Messages[MessageId].MessageTime >= self.Messages[MessageId].MessageDuration + 10 then + MESSAGE:New( Message, MessageCategory, MessageDuration, MessageId ):ToClient( self ) + self.Messages[MessageId].MessageTime = timer.getTime() + end + else + if timer.getTime() - self.Messages[MessageId].MessageTime >= self.Messages[MessageId].MessageDuration + self.Messages[MessageId].MessageInterval then + MESSAGE:New( Message, MessageCategory, MessageDuration, MessageId ):ToClient( self ) + self.Messages[MessageId].MessageTime = timer.getTime() + end + end + end + end +end +--- Manage the mission database. +-- +-- @{#DATABASE} class +-- ================== +-- Mission designers can use the DATABASE class to refer to: +-- +-- * UNITS +-- * GROUPS +-- * players +-- * alive players +-- * CLIENTS +-- * alive CLIENTS +-- +-- On top, for internal MOOSE administration purposes, the DATBASE administers the Unit and Gruop templates as defined within the Mission Editor. +-- +-- Moose will automatically create one instance of the DATABASE class into the **global** object _DATABASE. +-- Moose refers to _DATABASE within the framework extensively, but you can also refer to the _DATABASE object within your missions if required. +-- +-- DATABASE iterators: +-- =================== +-- You can iterate the database with the available iterator methods. +-- The iterator methods will walk the DATABASE set, and call for each element within the set a function that you provide. +-- The following iterator methods are currently available within the DATABASE: +-- +-- * @{#DATABASE.ForEachUnit}: Calls a function for each @{UNIT} it finds within the DATABASE. +-- * @{#DATABASE.ForEachGroup}: Calls a function for each @{GROUP} it finds within the DATABASE. +-- * @{#DATABASE.ForEachPlayer}: Calls a function for each player it finds within the DATABASE. +-- * @{#DATABASE.ForEachPlayerAlive}: Calls a function for each alive player it finds within the DATABASE. +-- * @{#DATABASE.ForEachClient}: Calls a function for each @{CLIENT} it finds within the DATABASE. +-- * @{#DATABASE.ForEachClientAlive}: Calls a function for each alive @{CLIENT} it finds within the DATABASE. +-- +-- @module Database +-- @author FlightControl + +Include.File( "Routines" ) +Include.File( "Base" ) +Include.File( "Menu" ) +Include.File( "Group" ) +Include.File( "Static" ) +Include.File( "Unit" ) +Include.File( "Event" ) +Include.File( "Client" ) +Include.File( "Scheduler" ) + + +--- DATABASE class +-- @type DATABASE +-- @extends Base#BASE +DATABASE = { + ClassName = "DATABASE", + Templates = { + Units = {}, + Groups = {}, + ClientsByName = {}, + ClientsByID = {}, + }, + DCSUnits = {}, + DCSGroups = {}, + DCSStatics = {}, + UNITS = {}, + STATICS = {}, + GROUPS = {}, + PLAYERS = {}, + PLAYERSALIVE = {}, + CLIENTS = {}, + CLIENTSALIVE = {}, + NavPoints = {}, +} + +local _DATABASECoalition = + { + [1] = "Red", + [2] = "Blue", + } + +local _DATABASECategory = + { + [Unit.Category.AIRPLANE] = "Plane", + [Unit.Category.HELICOPTER] = "Helicopter", + [Unit.Category.GROUND_UNIT] = "Vehicle", + [Unit.Category.SHIP] = "Ship", + [Unit.Category.STRUCTURE] = "Structure", + } + + +--- Creates a new DATABASE object, building a set of units belonging to a coalitions, categories, countries, types or with defined prefix names. +-- @param #DATABASE self +-- @return #DATABASE +-- @usage +-- -- Define a new DATABASE Object. This DBObject will contain a reference to all Group and Unit Templates defined within the ME and the DCSRTE. +-- DBObject = DATABASE:New() +function DATABASE:New() + + -- Inherits from BASE + local self = BASE:Inherit( self, BASE:New() ) + + _EVENTDISPATCHER:OnBirth( self._EventOnBirth, self ) + _EVENTDISPATCHER:OnDead( self._EventOnDeadOrCrash, self ) + _EVENTDISPATCHER:OnCrash( self._EventOnDeadOrCrash, self ) + + + -- Follow alive players and clients + _EVENTDISPATCHER:OnPlayerEnterUnit( self._EventOnPlayerEnterUnit, self ) + _EVENTDISPATCHER:OnPlayerLeaveUnit( self._EventOnPlayerLeaveUnit, self ) + + self:_RegisterTemplates() + self:_RegisterGroupsAndUnits() + self:_RegisterStatics() + self:_RegisterPlayers() + + return self +end + +--- Finds a Unit based on the Unit Name. +-- @param #DATABASE self +-- @param #string UnitName +-- @return Unit#UNIT The found Unit. +function DATABASE:FindUnit( UnitName ) + + local UnitFound = self.UNITS[UnitName] + return UnitFound +end + + +--- Adds a Unit based on the Unit Name in the DATABASE. +-- @param #DATABASE self +function DATABASE:AddUnit( DCSUnit, DCSUnitName ) + + self.DCSUnits[DCSUnitName] = DCSUnit + self.UNITS[DCSUnitName] = UNIT:Register( DCSUnitName ) +end + + +--- Deletes a Unit from the DATABASE based on the Unit Name. +-- @param #DATABASE self +function DATABASE:DeleteUnit( DCSUnitName ) + + self.DCSUnits[DCSUnitName] = nil +end + +--- Adds a Static based on the Static Name in the DATABASE. +-- @param #DATABASE self +function DATABASE:AddStatic( DCSStatic, DCSStaticName ) + + self.DCSStatics[DCSStaticName] = DCSStatic + self.STATICS[DCSStaticName] = STATIC:Register( DCSStaticName ) +end + + +--- Deletes a Static from the DATABASE based on the Static Name. +-- @param #DATABASE self +function DATABASE:DeleteStatic( DCSStaticName ) + + self.DCSStatics[DCSStaticName] = nil +end + +--- Finds a STATIC based on the StaticName. +-- @param #DATABASE self +-- @param #string StaticName +-- @return Static#STATIC The found STATIC. +function DATABASE:FindStatic( StaticName ) + + local StaticFound = self.STATICS[StaticName] + return StaticFound +end + + +--- Finds a CLIENT based on the ClientName. +-- @param #DATABASE self +-- @param #string ClientName +-- @return Client#CLIENT The found CLIENT. +function DATABASE:FindClient( ClientName ) + + local ClientFound = self.CLIENTS[ClientName] + return ClientFound +end + + +--- Adds a CLIENT based on the ClientName in the DATABASE. +-- @param #DATABASE self +function DATABASE:AddClient( ClientName ) + + self.CLIENTS[ClientName] = CLIENT:Register( ClientName ) + self:E( self.CLIENTS[ClientName]:GetClassNameAndID() ) +end + + +--- Finds a GROUP based on the GroupName. +-- @param #DATABASE self +-- @param #string GroupName +-- @return Group#GROUP The found GROUP. +function DATABASE:FindGroup( GroupName ) + + local GroupFound = self.GROUPS[GroupName] + return GroupFound +end + + +--- Adds a GROUP based on the GroupName in the DATABASE. +-- @param #DATABASE self +function DATABASE:AddGroup( DCSGroup, GroupName ) + + self.DCSGroups[GroupName] = DCSGroup + self.GROUPS[GroupName] = GROUP:Register( GroupName ) +end + +--- Adds a player based on the Player Name in the DATABASE. +-- @param #DATABASE self +function DATABASE:AddPlayer( UnitName, PlayerName ) + + if PlayerName then + self:E( { "Add player for unit:", UnitName, PlayerName } ) + self.PLAYERS[PlayerName] = PlayerName + self.PLAYERSALIVE[PlayerName] = PlayerName + self.CLIENTSALIVE[PlayerName] = self:FindClient( UnitName ) + end +end + +--- Deletes a player from the DATABASE based on the Player Name. +-- @param #DATABASE self +function DATABASE:DeletePlayer( PlayerName ) + + if PlayerName then + self:E( { "Clean player:", PlayerName } ) + self.PLAYERSALIVE[PlayerName] = nil + self.CLIENTSALIVE[PlayerName] = nil + end +end + + +--- Instantiate new Groups within the DCSRTE. +-- This method expects EXACTLY the same structure as a structure within the ME, and needs 2 additional fields defined: +-- SpawnCountryID, SpawnCategoryID +-- This method is used by the SPAWN class. +-- @param #DATABASE self +-- @param #table SpawnTemplate +-- @return #DATABASE self +function DATABASE:Spawn( SpawnTemplate ) + self:F2( SpawnTemplate.name ) + + self:T2( { SpawnTemplate.SpawnCountryID, SpawnTemplate.SpawnCategoryID } ) + + -- Copy the spawn variables of the template in temporary storage, nullify, and restore the spawn variables. + local SpawnCoalitionID = SpawnTemplate.SpawnCoalitionID + local SpawnCountryID = SpawnTemplate.SpawnCountryID + local SpawnCategoryID = SpawnTemplate.SpawnCategoryID + + -- Nullify + SpawnTemplate.SpawnCoalitionID = nil + SpawnTemplate.SpawnCountryID = nil + SpawnTemplate.SpawnCategoryID = nil + + self:_RegisterTemplate( SpawnTemplate ) + + self:T3( SpawnTemplate ) + coalition.addGroup( SpawnCountryID, SpawnCategoryID, SpawnTemplate ) + + -- Restore + SpawnTemplate.SpawnCoalitionID = SpawnCoalitionID + SpawnTemplate.SpawnCountryID = SpawnCountryID + SpawnTemplate.SpawnCategoryID = SpawnCategoryID + + local SpawnGroup = GROUP:Register( SpawnTemplate.name ) + return SpawnGroup +end + +--- Set a status to a Group within the Database, this to check crossing events for example. +function DATABASE:SetStatusGroup( GroupName, Status ) + self:F2( Status ) + + self.Templates.Groups[GroupName].Status = Status +end + +--- Get a status to a Group within the Database, this to check crossing events for example. +function DATABASE:GetStatusGroup( GroupName ) + self:F2( Status ) + + if self.Templates.Groups[GroupName] then + return self.Templates.Groups[GroupName].Status + else + return "" + end +end + + +--- Private method that registers new Group Templates within the DATABASE Object. +-- @param #DATABASE self +-- @param #table GroupTemplate +-- @return #DATABASE self +function DATABASE:_RegisterTemplate( GroupTemplate ) + + local GroupTemplateName = env.getValueDictByKey(GroupTemplate.name) + + if not self.Templates.Groups[GroupTemplateName] then + self.Templates.Groups[GroupTemplateName] = {} + self.Templates.Groups[GroupTemplateName].Status = nil + end + + -- Delete the spans from the route, it is not needed and takes memory. + if GroupTemplate.route and GroupTemplate.route.spans then + GroupTemplate.route.spans = nil + end + + self.Templates.Groups[GroupTemplateName].GroupName = GroupTemplateName + self.Templates.Groups[GroupTemplateName].Template = GroupTemplate + self.Templates.Groups[GroupTemplateName].groupId = GroupTemplate.groupId + self.Templates.Groups[GroupTemplateName].UnitCount = #GroupTemplate.units + self.Templates.Groups[GroupTemplateName].Units = GroupTemplate.units + + self:T2( { "Group", self.Templates.Groups[GroupTemplateName].GroupName, self.Templates.Groups[GroupTemplateName].UnitCount } ) + + for unit_num, UnitTemplate in pairs( GroupTemplate.units ) do + + local UnitTemplateName = env.getValueDictByKey(UnitTemplate.name) + self.Templates.Units[UnitTemplateName] = {} + self.Templates.Units[UnitTemplateName].UnitName = UnitTemplateName + self.Templates.Units[UnitTemplateName].Template = UnitTemplate + self.Templates.Units[UnitTemplateName].GroupName = GroupTemplateName + self.Templates.Units[UnitTemplateName].GroupTemplate = GroupTemplate + self.Templates.Units[UnitTemplateName].GroupId = GroupTemplate.groupId + self:E( {"skill",UnitTemplate.skill}) + if UnitTemplate.skill and (UnitTemplate.skill == "Client" or UnitTemplate.skill == "Player") then + self.Templates.ClientsByName[UnitTemplateName] = UnitTemplate + self.Templates.ClientsByID[UnitTemplate.unitId] = UnitTemplate + end + self:E( { "Unit", self.Templates.Units[UnitTemplateName].UnitName } ) + end +end + + +--- Private method that registers all alive players in the mission. +-- @param #DATABASE self +-- @return #DATABASE self +function DATABASE:_RegisterPlayers() + + local CoalitionsData = { AlivePlayersRed = coalition.getPlayers( coalition.side.RED ), AlivePlayersBlue = coalition.getPlayers( coalition.side.BLUE ) } + for CoalitionId, CoalitionData in pairs( CoalitionsData ) do + for UnitId, UnitData in pairs( CoalitionData ) do + self:T3( { "UnitData:", UnitData } ) + if UnitData and UnitData:isExist() then + local UnitName = UnitData:getName() + local PlayerName = UnitData:getPlayerName() + if not self.PLAYERS[PlayerName] then + self:E( { "Add player for unit:", UnitName, PlayerName } ) + self:AddPlayer( UnitName, PlayerName ) + end + end + end + end + + return self +end + + +--- Private method that registers all Groups and Units within in the mission. +-- @param #DATABASE self +-- @return #DATABASE self +function DATABASE:_RegisterGroupsAndUnits() + + local CoalitionsData = { GroupsRed = coalition.getGroups( coalition.side.RED ), GroupsBlue = coalition.getGroups( coalition.side.BLUE ) } + for CoalitionId, CoalitionData in pairs( CoalitionsData ) do + for DCSGroupId, DCSGroup in pairs( CoalitionData ) do + + if DCSGroup:isExist() then + local DCSGroupName = DCSGroup:getName() + + self:E( { "Register Group:", DCSGroup, DCSGroupName } ) + self:AddGroup( DCSGroup, DCSGroupName ) + + for DCSUnitId, DCSUnit in pairs( DCSGroup:getUnits() ) do + + local DCSUnitName = DCSUnit:getName() + self:E( { "Register Unit:", DCSUnit, DCSUnitName } ) + self:AddUnit( DCSUnit, DCSUnitName ) + end + else + self:E( { "Group does not exist: ", DCSGroup } ) + end + + end + end + + for ClientName, ClientTemplate in pairs( self.Templates.ClientsByName ) do + self:E( { "Adding Client:", ClientName } ) + self:AddClient( ClientName ) + end + + return self +end + +function DATABASE:_RegisterStatics() + + local CoalitionsData = { GroupsRed = coalition.getStaticObjects( coalition.side.RED ), GroupsBlue = coalition.getStaticObjects( coalition.side.BLUE ) } + for CoalitionId, CoalitionData in pairs( CoalitionsData ) do + for DCSStaticId, DCSStatic in pairs( CoalitionData ) do + + if DCSStatic:isExist() then + local DCSStaticName = DCSStatic:getName() + + self:E( { "Register Static:", DCSStatic, DCSStaticName } ) + self:AddStatic( DCSStatic, DCSStaticName ) + else + self:E( { "Static does not exist: ", DCSStatic } ) + end + end + end + + return self +end + + +--- Events + +--- Handles the OnBirth event for the alive units set. +-- @param #DATABASE self +-- @param Event#EVENTDATA Event +function DATABASE:_EventOnBirth( Event ) + self:F2( { Event } ) + + if Event.IniDCSUnit then + self:AddUnit( Event.IniDCSUnit, Event.IniDCSUnitName ) + self:AddGroup( Event.IniDCSGroup, Event.IniDCSGroupName ) + self:_EventOnPlayerEnterUnit( Event ) + end +end + + +--- Handles the OnDead or OnCrash event for alive units set. +-- @param #DATABASE self +-- @param Event#EVENTDATA Event +function DATABASE:_EventOnDeadOrCrash( Event ) + self:F2( { Event } ) + + if Event.IniDCSUnit then + if self.DCSUnits[Event.IniDCSUnitName] then + self:DeleteUnit( Event.IniDCSUnitName ) + -- add logic to correctly remove a group once all units are destroyed... + end + end +end + + +--- Handles the OnPlayerEnterUnit event to fill the active players table (with the unit filter applied). +-- @param #DATABASE self +-- @param Event#EVENTDATA Event +function DATABASE:_EventOnPlayerEnterUnit( Event ) + self:F2( { Event } ) + + if Event.IniDCSUnit then + local PlayerName = Event.IniDCSUnit:getPlayerName() + if not self.PLAYERSALIVE[PlayerName] then + self:AddPlayer( Event.IniDCSUnitName, PlayerName ) + end + end +end + + +--- Handles the OnPlayerLeaveUnit event to clean the active players table. +-- @param #DATABASE self +-- @param Event#EVENTDATA Event +function DATABASE:_EventOnPlayerLeaveUnit( Event ) + self:F2( { Event } ) + + if Event.IniDCSUnit then + local PlayerName = Event.IniDCSUnit:getPlayerName() + if self.PLAYERSALIVE[PlayerName] then + self:DeletePlayer( PlayerName ) + end + end +end + +--- Iterators + +--- Iterate the DATABASE and call an iterator function for the given set, providing the Object for each element within the set and optional parameters. +-- @param #DATABASE self +-- @param #function IteratorFunction The function that will be called when there is an alive player in the database. +-- @return #DATABASE self +function DATABASE:ForEach( IteratorFunction, arg, Set ) + self:F2( arg ) + + local function CoRoutine() + local Count = 0 + for ObjectID, Object in pairs( Set ) do + self:T2( Object ) + IteratorFunction( Object, unpack( arg ) ) + Count = Count + 1 + if Count % 10 == 0 then + coroutine.yield( false ) + end + end + return true + end + + local co = coroutine.create( CoRoutine ) + + local function Schedule() + + local status, res = coroutine.resume( co ) + self:T2( { status, res } ) + + if status == false then + error( res ) + end + if res == false then + return true -- resume next time the loop + end + + return false + end + + local Scheduler = SCHEDULER:New( self, Schedule, {}, 0.001, 0.001, 0 ) + + return self +end + + +--- Iterate the DATABASE and call an iterator function for each **alive** unit, providing the DCSUnit and optional parameters. +-- @param #DATABASE self +-- @param #function IteratorFunction The function that will be called when there is an alive unit in the database. The function needs to accept a DCSUnit parameter. +-- @return #DATABASE self +function DATABASE:ForEachDCSUnit( IteratorFunction, ... ) + self:F2( arg ) + + self:ForEach( IteratorFunction, arg, self.DCSUnits ) + + return self +end + + +--- Iterate the DATABASE and call an iterator function for each **alive** UNIT, providing the UNIT and optional parameters. +-- @param #DATABASE self +-- @param #function IteratorFunction The function that will be called when there is an alive UNIT in the database. The function needs to accept a UNIT parameter. +-- @return #DATABASE self +function DATABASE:ForEachUnit( IteratorFunction, ... ) + self:F2( arg ) + + self:ForEach( IteratorFunction, arg, self.UNITS ) + + return self +end + +--- Iterate the DATABASE and call an iterator function for each **alive** GROUP, providing the GROUP and optional parameters. +-- @param #DATABASE self +-- @param #function IteratorFunction The function that will be called when there is an alive GROUP in the database. The function needs to accept a GROUP parameter. +-- @return #DATABASE self +function DATABASE:ForEachGroup( IteratorFunction, ... ) + self:F2( arg ) + + self:ForEach( IteratorFunction, arg, self.GROUPS ) + + return self +end + + +--- Iterate the DATABASE and call an iterator function for each player, providing the player name and optional parameters. +-- @param #DATABASE self +-- @param #function IteratorFunction The function that will be called when there is an player in the database. The function needs to accept the player name. +-- @return #DATABASE self +function DATABASE:ForEachPlayer( IteratorFunction, ... ) + self:F2( arg ) + + self:ForEach( IteratorFunction, arg, self.PLAYERS ) + + return self +end + + +--- Iterate the DATABASE and call an iterator function for each **alive** player, providing the Unit of the player and optional parameters. +-- @param #DATABASE self +-- @param #function IteratorFunction The function that will be called when there is an alive player in the database. The function needs to accept a UNIT parameter. +-- @return #DATABASE self +function DATABASE:ForEachPlayerAlive( IteratorFunction, ... ) + self:F2( arg ) + + self:ForEach( IteratorFunction, arg, self.PLAYERSALIVE ) + + return self +end + +--- Iterate the DATABASE and call an iterator function for each CLIENT, providing the CLIENT to the function and optional parameters. +-- @param #DATABASE self +-- @param #function IteratorFunction The function that will be called when there is an alive player in the database. The function needs to accept a CLIENT parameter. +-- @return #DATABASE self +function DATABASE:ForEachClient( IteratorFunction, ... ) + self:F2( arg ) + + self:ForEach( IteratorFunction, arg, self.CLIENTS ) + + return self +end + +--- Iterate the DATABASE and call an iterator function for each **ALIVE** CLIENT, providing the CLIENT to the function and optional parameters. +-- @param #DATABASE self +-- @param #function IteratorFunction The function that will be called when there is an alive CLIENT in the database. The function needs to accept a CLIENT parameter. +-- @return #DATABASE self +function DATABASE:ForEachClientAlive( IteratorFunction, ... ) + self:F2( arg ) + + self:ForEach( IteratorFunction, arg, self.CLIENTSALIVE ) + + return self +end + + +function DATABASE:_RegisterTemplates() + self:F2() + + self.Navpoints = {} + self.UNITS = {} + --Build routines.db.units and self.Navpoints + for coa_name, coa_data in pairs(env.mission.coalition) do + + if (coa_name == 'red' or coa_name == 'blue') and type(coa_data) == 'table' then + --self.Units[coa_name] = {} + + ---------------------------------------------- + -- build nav points DB + self.Navpoints[coa_name] = {} + if coa_data.nav_points then --navpoints + for nav_ind, nav_data in pairs(coa_data.nav_points) do + + if type(nav_data) == 'table' then + self.Navpoints[coa_name][nav_ind] = routines.utils.deepCopy(nav_data) + + self.Navpoints[coa_name][nav_ind]['name'] = nav_data.callsignStr -- name is a little bit more self-explanatory. + self.Navpoints[coa_name][nav_ind]['point'] = {} -- point is used by SSE, support it. + self.Navpoints[coa_name][nav_ind]['point']['x'] = nav_data.x + self.Navpoints[coa_name][nav_ind]['point']['y'] = 0 + self.Navpoints[coa_name][nav_ind]['point']['z'] = nav_data.y + end + end + end + ------------------------------------------------- + if coa_data.country then --there is a country table + for cntry_id, cntry_data in pairs(coa_data.country) do + + local countryName = string.lower(cntry_data.name) + --self.Units[coa_name][countryName] = {} + --self.Units[coa_name][countryName]["countryId"] = cntry_data.id + + if type(cntry_data) == 'table' then --just making sure + + for obj_type_name, obj_type_data in pairs(cntry_data) do + + if obj_type_name == "helicopter" or obj_type_name == "ship" or obj_type_name == "plane" or obj_type_name == "vehicle" or obj_type_name == "static" then --should be an unncessary check + + local category = obj_type_name + + if ((type(obj_type_data) == 'table') and obj_type_data.group and (type(obj_type_data.group) == 'table') and (#obj_type_data.group > 0)) then --there's a group! + + --self.Units[coa_name][countryName][category] = {} + + for group_num, GroupTemplate in pairs(obj_type_data.group) do + + if GroupTemplate and GroupTemplate.units and type(GroupTemplate.units) == 'table' then --making sure again- this is a valid group + self:_RegisterTemplate( GroupTemplate ) + end --if GroupTemplate and GroupTemplate.units then + end --for group_num, GroupTemplate in pairs(obj_type_data.group) do + end --if ((type(obj_type_data) == 'table') and obj_type_data.group and (type(obj_type_data.group) == 'table') and (#obj_type_data.group > 0)) then + end --if obj_type_name == "helicopter" or obj_type_name == "ship" or obj_type_name == "plane" or obj_type_name == "vehicle" or obj_type_name == "static" then + end --for obj_type_name, obj_type_data in pairs(cntry_data) do + end --if type(cntry_data) == 'table' then + end --for cntry_id, cntry_data in pairs(coa_data.country) do + end --if coa_data.country then --there is a country table + end --if coa_name == 'red' or coa_name == 'blue' and type(coa_data) == 'table' then + end --for coa_name, coa_data in pairs(mission.coalition) do + + return self +end + + + + +--- The main include file for the MOOSE system. + +Include.File( "Routines" ) +Include.File( "Base" ) +Include.File( "Database" ) +Include.File( "Event" ) + +-- The order of the declarations is important here. Don't touch it. + +--- Declare the event dispatcher based on the EVENT class +_EVENTDISPATCHER = EVENT:New() -- #EVENT + +--- Declare the main database object, which is used internally by the MOOSE classes. +_DATABASE = DATABASE:New() -- Database#DATABASE + +--- Scoring system for MOOSE. +-- This scoring class calculates the hits and kills that players make within a simulation session. +-- Scoring is calculated using a defined algorithm. +-- With a small change in MissionScripting.lua, the scoring can also be logged in a CSV file, that can then be uploaded +-- to a database or a BI tool to publish the scoring results to the player community. +-- @module Scoring +-- @author FlightControl + + +Include.File( "Routines" ) +Include.File( "Base" ) +Include.File( "Menu" ) +Include.File( "Group" ) +Include.File( "Event" ) + + +--- The Scoring class +-- @type SCORING +-- @field Players A collection of the current players that have joined the game. +-- @extends Base#BASE +SCORING = { + ClassName = "SCORING", + ClassID = 0, + Players = {}, +} + +local _SCORINGCoalition = + { + [1] = "Red", + [2] = "Blue", + } + +local _SCORINGCategory = + { + [Unit.Category.AIRPLANE] = "Plane", + [Unit.Category.HELICOPTER] = "Helicopter", + [Unit.Category.GROUND_UNIT] = "Vehicle", + [Unit.Category.SHIP] = "Ship", + [Unit.Category.STRUCTURE] = "Structure", + } + +--- Creates a new SCORING object to administer the scoring achieved by players. +-- @param #SCORING self +-- @param #string GameName The name of the game. This name is also logged in the CSV score file. +-- @return #SCORING self +-- @usage +-- -- Define a new scoring object for the mission Gori Valley. +-- ScoringObject = SCORING:New( "Gori Valley" ) +function SCORING:New( GameName ) + + -- Inherits from BASE + local self = BASE:Inherit( self, BASE:New() ) + + if GameName then + self.GameName = GameName + else + error( "A game name must be given to register the scoring results" ) + end + + + _EVENTDISPATCHER:OnDead( self._EventOnDeadOrCrash, self ) + _EVENTDISPATCHER:OnCrash( self._EventOnDeadOrCrash, self ) + _EVENTDISPATCHER:OnHit( self._EventOnHit, self ) + + --self.SchedulerId = routines.scheduleFunction( SCORING._FollowPlayersScheduled, { self }, 0, 5 ) + self.SchedulerId = SCHEDULER:New( self, self._FollowPlayersScheduled, {}, 0, 5 ) + + self:ScoreMenu() + + return self + +end + +--- Creates a score radio menu. Can be accessed using Radio -> F10. +-- @param #SCORING self +-- @return #SCORING self +function SCORING:ScoreMenu() + self.Menu = SUBMENU:New( 'Scoring' ) + self.AllScoresMenu = COMMANDMENU:New( 'Score All Active Players', self.Menu, SCORING.ReportScoreAll, self ) + --- = COMMANDMENU:New('Your Current Score', ReportScore, SCORING.ReportScorePlayer, self ) + return self +end + +--- Follows new players entering Clients within the DCSRTE. +-- TODO: Need to see if i can catch this also with an event. It will eliminate the schedule ... +function SCORING:_FollowPlayersScheduled() + self:F3( "_FollowPlayersScheduled" ) + + local ClientUnit = 0 + local CoalitionsData = { AlivePlayersRed = coalition.getPlayers(coalition.side.RED), AlivePlayersBlue = coalition.getPlayers(coalition.side.BLUE) } + local unitId + local unitData + local AlivePlayerUnits = {} + + for CoalitionId, CoalitionData in pairs( CoalitionsData ) do + self:T3( { "_FollowPlayersScheduled", CoalitionData } ) + for UnitId, UnitData in pairs( CoalitionData ) do + self:_AddPlayerFromUnit( UnitData ) + end + end + + return true +end + + +--- Track DEAD or CRASH events for the scoring. +-- @param #SCORING self +-- @param Event#EVENTDATA Event +function SCORING:_EventOnDeadOrCrash( Event ) + self:F( { Event } ) + + local TargetUnit = nil + local TargetGroup = nil + local TargetUnitName = "" + local TargetGroupName = "" + local TargetPlayerName = "" + local TargetCoalition = nil + local TargetCategory = nil + local TargetType = nil + local TargetUnitCoalition = nil + local TargetUnitCategory = nil + local TargetUnitType = nil + + if Event.IniDCSUnit then + + TargetUnit = Event.IniDCSUnit + TargetUnitName = Event.IniDCSUnitName + TargetGroup = Event.IniDCSGroup + TargetGroupName = Event.IniDCSGroupName + TargetPlayerName = TargetUnit:getPlayerName() + + TargetCoalition = TargetUnit:getCoalition() + --TargetCategory = TargetUnit:getCategory() + TargetCategory = TargetUnit:getDesc().category -- Workaround + TargetType = TargetUnit:getTypeName() + + TargetUnitCoalition = _SCORINGCoalition[TargetCoalition] + TargetUnitCategory = _SCORINGCategory[TargetCategory] + TargetUnitType = TargetType + + self:T( { TargetUnitName, TargetGroupName, TargetPlayerName, TargetCoalition, TargetCategory, TargetType } ) + end + + for PlayerName, PlayerData in pairs( self.Players ) do + if PlayerData then -- This should normally not happen, but i'll test it anyway. + self:T( "Something got killed" ) + + -- Some variables + local InitUnitName = PlayerData.UnitName + local InitUnitType = PlayerData.UnitType + local InitCoalition = PlayerData.UnitCoalition + local InitCategory = PlayerData.UnitCategory + local InitUnitCoalition = _SCORINGCoalition[InitCoalition] + local InitUnitCategory = _SCORINGCategory[InitCategory] + + self:T( { InitUnitName, InitUnitType, InitUnitCoalition, InitCoalition, InitUnitCategory, InitCategory } ) + + -- What is he hitting? + if TargetCategory then + if PlayerData and PlayerData.Hit and PlayerData.Hit[TargetCategory] and PlayerData.Hit[TargetCategory][TargetUnitName] then -- Was there a hit for this unit for this player before registered??? + if not PlayerData.Kill[TargetCategory] then + PlayerData.Kill[TargetCategory] = {} + end + if not PlayerData.Kill[TargetCategory][TargetType] then + PlayerData.Kill[TargetCategory][TargetType] = {} + PlayerData.Kill[TargetCategory][TargetType].Score = 0 + PlayerData.Kill[TargetCategory][TargetType].ScoreKill = 0 + PlayerData.Kill[TargetCategory][TargetType].Penalty = 0 + PlayerData.Kill[TargetCategory][TargetType].PenaltyKill = 0 + end + + if InitCoalition == TargetCoalition then + PlayerData.Penalty = PlayerData.Penalty + 25 + PlayerData.Kill[TargetCategory][TargetType].Penalty = PlayerData.Kill[TargetCategory][TargetType].Penalty + 25 + PlayerData.Kill[TargetCategory][TargetType].PenaltyKill = PlayerData.Kill[TargetCategory][TargetType].PenaltyKill + 1 + MESSAGE:New( "Player '" .. PlayerName .. "' killed a friendly " .. TargetUnitCategory .. " ( " .. TargetType .. " ) " .. + PlayerData.Kill[TargetCategory][TargetType].PenaltyKill .. " times. Penalty: -" .. PlayerData.Kill[TargetCategory][TargetType].Penalty .. + ". Score Total:" .. PlayerData.Score - PlayerData.Penalty, + "", 5, "/PENALTY" .. PlayerName .. "/" .. InitUnitName ):ToAll() + self:ScoreCSV( PlayerName, "KILL_PENALTY", 1, -125, InitUnitName, InitUnitCoalition, InitUnitCategory, InitUnitType, TargetUnitName, TargetUnitCoalition, TargetUnitCategory, TargetUnitType ) + else + PlayerData.Score = PlayerData.Score + 10 + PlayerData.Kill[TargetCategory][TargetType].Score = PlayerData.Kill[TargetCategory][TargetType].Score + 10 + PlayerData.Kill[TargetCategory][TargetType].ScoreKill = PlayerData.Kill[TargetCategory][TargetType].ScoreKill + 1 + MESSAGE:New( "Player '" .. PlayerName .. "' killed an enemy " .. TargetUnitCategory .. " ( " .. TargetType .. " ) " .. + PlayerData.Kill[TargetCategory][TargetType].ScoreKill .. " times. Score: " .. PlayerData.Kill[TargetCategory][TargetType].Score .. + ". Score Total:" .. PlayerData.Score - PlayerData.Penalty, + "", 5, "/SCORE" .. PlayerName .. "/" .. InitUnitName ):ToAll() + self:ScoreCSV( PlayerName, "KILL_SCORE", 1, 10, InitUnitName, InitUnitCoalition, InitUnitCategory, InitUnitType, TargetUnitName, TargetUnitCoalition, TargetUnitCategory, TargetUnitType ) + end + end + end + end + end +end + + + +--- Add a new player entering a Unit. +function SCORING:_AddPlayerFromUnit( UnitData ) + self:F( UnitData ) + + if UnitData and UnitData:isExist() then + local UnitName = UnitData:getName() + local PlayerName = UnitData:getPlayerName() + local UnitDesc = UnitData:getDesc() + local UnitCategory = UnitDesc.category + local UnitCoalition = UnitData:getCoalition() + local UnitTypeName = UnitData:getTypeName() + + self:T( { PlayerName, UnitName, UnitCategory, UnitCoalition, UnitTypeName } ) + + if self.Players[PlayerName] == nil then -- I believe this is the place where a Player gets a life in a mission when he enters a unit ... + self.Players[PlayerName] = {} + self.Players[PlayerName].Hit = {} + self.Players[PlayerName].Kill = {} + self.Players[PlayerName].Mission = {} + + -- for CategoryID, CategoryName in pairs( SCORINGCategory ) do + -- self.Players[PlayerName].Hit[CategoryID] = {} + -- self.Players[PlayerName].Kill[CategoryID] = {} + -- end + self.Players[PlayerName].HitPlayers = {} + self.Players[PlayerName].HitUnits = {} + self.Players[PlayerName].Score = 0 + self.Players[PlayerName].Penalty = 0 + self.Players[PlayerName].PenaltyCoalition = 0 + self.Players[PlayerName].PenaltyWarning = 0 + end + + if not self.Players[PlayerName].UnitCoalition then + self.Players[PlayerName].UnitCoalition = UnitCoalition + else + if self.Players[PlayerName].UnitCoalition ~= UnitCoalition then + self.Players[PlayerName].Penalty = self.Players[PlayerName].Penalty + 50 + self.Players[PlayerName].PenaltyCoalition = self.Players[PlayerName].PenaltyCoalition + 1 + MESSAGE:New( "Player '" .. PlayerName .. "' changed coalition from " .. _SCORINGCoalition[self.Players[PlayerName].UnitCoalition] .. " to " .. _SCORINGCoalition[UnitCoalition] .. + "(changed " .. self.Players[PlayerName].PenaltyCoalition .. " times the coalition). 50 Penalty points added.", + "", + 2, + "/PENALTYCOALITION" .. PlayerName + ):ToAll() + self:ScoreCSV( PlayerName, "COALITION_PENALTY", 1, -50, self.Players[PlayerName].UnitName, _SCORINGCoalition[self.Players[PlayerName].UnitCoalition], _SCORINGCategory[self.Players[PlayerName].UnitCategory], self.Players[PlayerName].UnitType, + UnitName, _SCORINGCoalition[UnitCoalition], _SCORINGCategory[UnitCategory], UnitData:getTypeName() ) + end + end + self.Players[PlayerName].UnitName = UnitName + self.Players[PlayerName].UnitCoalition = UnitCoalition + self.Players[PlayerName].UnitCategory = UnitCategory + self.Players[PlayerName].UnitType = UnitTypeName + + if self.Players[PlayerName].Penalty > 100 then + if self.Players[PlayerName].PenaltyWarning < 1 then + MESSAGE:New( "Player '" .. PlayerName .. "': WARNING! If you continue to commit FRATRICIDE and have a PENALTY score higher than 150, you will be COURT MARTIALED and DISMISSED from this mission! \nYour total penalty is: " .. self.Players[PlayerName].Penalty, + "", + 30, + "/PENALTYCOALITION" .. PlayerName + ):ToAll() + self.Players[PlayerName].PenaltyWarning = self.Players[PlayerName].PenaltyWarning + 1 + end + end + + if self.Players[PlayerName].Penalty > 150 then + ClientGroup = GROUP:NewFromDCSUnit( UnitData ) + ClientGroup:Destroy() + MESSAGE:New( "Player '" .. PlayerName .. "' committed FRATRICIDE, he will be COURT MARTIALED and is DISMISSED from this mission!", + "", + 10, + "/PENALTYCOALITION" .. PlayerName + ):ToAll() + end + + end +end + + +--- Registers Scores the players completing a Mission Task. +function SCORING:_AddMissionTaskScore( PlayerUnit, MissionName, Score ) + self:F( { PlayerUnit, MissionName, Score } ) + + local PlayerName = PlayerUnit:getPlayerName() + + if not self.Players[PlayerName].Mission[MissionName] then + self.Players[PlayerName].Mission[MissionName] = {} + self.Players[PlayerName].Mission[MissionName].ScoreTask = 0 + self.Players[PlayerName].Mission[MissionName].ScoreMission = 0 + end + + self:T( PlayerName ) + self:T( self.Players[PlayerName].Mission[MissionName] ) + + self.Players[PlayerName].Score = self.Players[PlayerName].Score + Score + self.Players[PlayerName].Mission[MissionName].ScoreTask = self.Players[PlayerName].Mission[MissionName].ScoreTask + Score + + MESSAGE:New( "Player '" .. PlayerName .. "' has finished another Task in Mission '" .. MissionName .. "'. " .. + Score .. " Score points added.", + "", 20, "/SCORETASK" .. PlayerName ):ToAll() + + self:ScoreCSV( PlayerName, "TASK_" .. MissionName:gsub( ' ', '_' ), 1, Score, PlayerUnit:getName() ) +end + + +--- Registers Mission Scores for possible multiple players that contributed in the Mission. +function SCORING:_AddMissionScore( MissionName, Score ) + self:F( { MissionName, Score } ) + + for PlayerName, PlayerData in pairs( self.Players ) do + + if PlayerData.Mission[MissionName] then + PlayerData.Score = PlayerData.Score + Score + PlayerData.Mission[MissionName].ScoreMission = PlayerData.Mission[MissionName].ScoreMission + Score + MESSAGE:New( "Player '" .. PlayerName .. "' has finished Mission '" .. MissionName .. "'. " .. + Score .. " Score points added.", + "", 20, "/SCOREMISSION" .. PlayerName ):ToAll() + self:ScoreCSV( PlayerName, "MISSION_" .. MissionName:gsub( ' ', '_' ), 1, Score ) + end + end +end + +--- Handles the OnHit event for the scoring. +-- @param #SCORING self +-- @param Event#EVENTDATA Event +function SCORING:_EventOnHit( Event ) + self:F( { Event } ) + + local InitUnit = nil + local InitUnitName = "" + local InitGroup = nil + local InitGroupName = "" + local InitPlayerName = nil + + local InitCoalition = nil + local InitCategory = nil + local InitType = nil + local InitUnitCoalition = nil + local InitUnitCategory = nil + local InitUnitType = nil + + local TargetUnit = nil + local TargetUnitName = "" + local TargetGroup = nil + local TargetGroupName = "" + local TargetPlayerName = "" + + local TargetCoalition = nil + local TargetCategory = nil + local TargetType = nil + local TargetUnitCoalition = nil + local TargetUnitCategory = nil + local TargetUnitType = nil + + if Event.IniDCSUnit then + + InitUnit = Event.IniDCSUnit + InitUnitName = Event.IniDCSUnitName + InitGroup = Event.IniDCSGroup + InitGroupName = Event.IniDCSGroupName + InitPlayerName = InitUnit:getPlayerName() + + InitCoalition = InitUnit:getCoalition() + --TODO: Workaround Client DCS Bug + --InitCategory = InitUnit:getCategory() + InitCategory = InitUnit:getDesc().category + InitType = InitUnit:getTypeName() + + InitUnitCoalition = _SCORINGCoalition[InitCoalition] + InitUnitCategory = _SCORINGCategory[InitCategory] + InitUnitType = InitType + + self:T( { InitUnitName, InitGroupName, InitPlayerName, InitCoalition, InitCategory, InitType , InitUnitCoalition, InitUnitCategory, InitUnitType } ) + end + + + if Event.TgtDCSUnit then + + TargetUnit = Event.TgtDCSUnit + TargetUnitName = Event.TgtDCSUnitName + TargetGroup = Event.TgtDCSGroup + TargetGroupName = Event.TgtDCSGroupName + TargetPlayerName = TargetUnit:getPlayerName() + + TargetCoalition = TargetUnit:getCoalition() + --TODO: Workaround Client DCS Bug + --TargetCategory = TargetUnit:getCategory() + TargetCategory = TargetUnit:getDesc().category + TargetType = TargetUnit:getTypeName() + + TargetUnitCoalition = _SCORINGCoalition[TargetCoalition] + TargetUnitCategory = _SCORINGCategory[TargetCategory] + TargetUnitType = TargetType + + self:T( { TargetUnitName, TargetGroupName, TargetPlayerName, TargetCoalition, TargetCategory, TargetType, TargetUnitCoalition, TargetUnitCategory, TargetUnitType } ) + end + + if InitPlayerName ~= nil then -- It is a player that is hitting something + self:_AddPlayerFromUnit( InitUnit ) + if self.Players[InitPlayerName] then -- This should normally not happen, but i'll test it anyway. + if TargetPlayerName ~= nil then -- It is a player hitting another player ... + self:_AddPlayerFromUnit( TargetUnit ) + self.Players[InitPlayerName].HitPlayers = self.Players[InitPlayerName].HitPlayers + 1 + end + + self:T( "Hitting Something" ) + -- What is he hitting? + if TargetCategory then + if not self.Players[InitPlayerName].Hit[TargetCategory] then + self.Players[InitPlayerName].Hit[TargetCategory] = {} + end + if not self.Players[InitPlayerName].Hit[TargetCategory][TargetUnitName] then + self.Players[InitPlayerName].Hit[TargetCategory][TargetUnitName] = {} + self.Players[InitPlayerName].Hit[TargetCategory][TargetUnitName].Score = 0 + self.Players[InitPlayerName].Hit[TargetCategory][TargetUnitName].Penalty = 0 + self.Players[InitPlayerName].Hit[TargetCategory][TargetUnitName].ScoreHit = 0 + self.Players[InitPlayerName].Hit[TargetCategory][TargetUnitName].PenaltyHit = 0 + end + local Score = 0 + if InitCoalition == TargetCoalition then + self.Players[InitPlayerName].Penalty = self.Players[InitPlayerName].Penalty + 10 + self.Players[InitPlayerName].Hit[TargetCategory][TargetUnitName].Penalty = self.Players[InitPlayerName].Hit[TargetCategory][TargetUnitName].Penalty + 10 + self.Players[InitPlayerName].Hit[TargetCategory][TargetUnitName].PenaltyHit = self.Players[InitPlayerName].Hit[TargetCategory][TargetUnitName].PenaltyHit + 1 + MESSAGE:New( "Player '" .. InitPlayerName .. "' hit a friendly " .. TargetUnitCategory .. " ( " .. TargetType .. " ) " .. + self.Players[InitPlayerName].Hit[TargetCategory][TargetUnitName].PenaltyHit .. " times. Penalty: -" .. self.Players[InitPlayerName].Hit[TargetCategory][TargetUnitName].Penalty .. + ". Score Total:" .. self.Players[InitPlayerName].Score - self.Players[InitPlayerName].Penalty, + "", + 2, + "/PENALTY" .. InitPlayerName .. "/" .. InitUnitName + ):ToAll() + self:ScoreCSV( InitPlayerName, "HIT_PENALTY", 1, -25, InitUnitName, InitUnitCoalition, InitUnitCategory, InitUnitType, TargetUnitName, TargetUnitCoalition, TargetUnitCategory, TargetUnitType ) + else + self.Players[InitPlayerName].Score = self.Players[InitPlayerName].Score + 10 + self.Players[InitPlayerName].Hit[TargetCategory][TargetUnitName].Score = self.Players[InitPlayerName].Hit[TargetCategory][TargetUnitName].Score + 1 + self.Players[InitPlayerName].Hit[TargetCategory][TargetUnitName].ScoreHit = self.Players[InitPlayerName].Hit[TargetCategory][TargetUnitName].ScoreHit + 1 + MESSAGE:New( "Player '" .. InitPlayerName .. "' hit a target " .. TargetUnitCategory .. " ( " .. TargetType .. " ) " .. + self.Players[InitPlayerName].Hit[TargetCategory][TargetUnitName].ScoreHit .. " times. Score: " .. self.Players[InitPlayerName].Hit[TargetCategory][TargetUnitName].Score .. + ". Score Total:" .. self.Players[InitPlayerName].Score - self.Players[InitPlayerName].Penalty, + "", + 2, + "/SCORE" .. InitPlayerName .. "/" .. InitUnitName + ):ToAll() + self:ScoreCSV( InitPlayerName, "HIT_SCORE", 1, 1, InitUnitName, InitUnitCoalition, InitUnitCategory, InitUnitType, TargetUnitName, TargetUnitCoalition, TargetUnitCategory, TargetUnitType ) + end + end + end + elseif InitPlayerName == nil then -- It is an AI hitting a player??? + + end +end + + +function SCORING:ReportScoreAll() + + env.info( "Hello World " ) + + local ScoreMessage = "" + local PlayerMessage = "" + + self:T( "Score Report" ) + + for PlayerName, PlayerData in pairs( self.Players ) do + if PlayerData then -- This should normally not happen, but i'll test it anyway. + self:T( "Score Player: " .. PlayerName ) + + -- Some variables + local InitUnitCoalition = _SCORINGCoalition[PlayerData.UnitCoalition] + local InitUnitCategory = _SCORINGCategory[PlayerData.UnitCategory] + local InitUnitType = PlayerData.UnitType + local InitUnitName = PlayerData.UnitName + + local PlayerScore = 0 + local PlayerPenalty = 0 + + ScoreMessage = ":\n" + + local ScoreMessageHits = "" + + for CategoryID, CategoryName in pairs( _SCORINGCategory ) do + self:T( CategoryName ) + if PlayerData.Hit[CategoryID] then + local Score = 0 + local ScoreHit = 0 + local Penalty = 0 + local PenaltyHit = 0 + self:T( "Hit scores exist for player " .. PlayerName ) + for UnitName, UnitData in pairs( PlayerData.Hit[CategoryID] ) do + Score = Score + UnitData.Score + ScoreHit = ScoreHit + UnitData.ScoreHit + Penalty = Penalty + UnitData.Penalty + PenaltyHit = UnitData.PenaltyHit + end + local ScoreMessageHit = string.format( "%s:%d ", CategoryName, Score - Penalty ) + self:T( ScoreMessageHit ) + ScoreMessageHits = ScoreMessageHits .. ScoreMessageHit + PlayerScore = PlayerScore + Score + PlayerPenalty = PlayerPenalty + Penalty + else + --ScoreMessageHits = ScoreMessageHits .. string.format( "%s:%d ", string.format(CategoryName, 1, 1), 0 ) + end + end + if ScoreMessageHits ~= "" then + ScoreMessage = ScoreMessage .. " Hits: " .. ScoreMessageHits .. "\n" + end + + local ScoreMessageKills = "" + for CategoryID, CategoryName in pairs( _SCORINGCategory ) do + self:T( "Kill scores exist for player " .. PlayerName ) + if PlayerData.Kill[CategoryID] then + local Score = 0 + local ScoreKill = 0 + local Penalty = 0 + local PenaltyKill = 0 + + for UnitName, UnitData in pairs( PlayerData.Kill[CategoryID] ) do + Score = Score + UnitData.Score + ScoreKill = ScoreKill + UnitData.ScoreKill + Penalty = Penalty + UnitData.Penalty + PenaltyKill = PenaltyKill + UnitData.PenaltyKill + end + + local ScoreMessageKill = string.format( " %s:%d ", CategoryName, Score - Penalty ) + self:T( ScoreMessageKill ) + ScoreMessageKills = ScoreMessageKills .. ScoreMessageKill + + PlayerScore = PlayerScore + Score + PlayerPenalty = PlayerPenalty + Penalty + else + --ScoreMessageKills = ScoreMessageKills .. string.format( "%s:%d ", string.format(CategoryName, 1, 1), 0 ) + end + end + if ScoreMessageKills ~= "" then + ScoreMessage = ScoreMessage .. " Kills: " .. ScoreMessageKills .. "\n" + end + + local ScoreMessageCoalitionChangePenalties = "" + if PlayerData.PenaltyCoalition ~= 0 then + ScoreMessageCoalitionChangePenalties = ScoreMessageCoalitionChangePenalties .. string.format( " -%d (%d changed)", PlayerData.Penalty, PlayerData.PenaltyCoalition ) + PlayerPenalty = PlayerPenalty + PlayerData.Penalty + end + if ScoreMessageCoalitionChangePenalties ~= "" then + ScoreMessage = ScoreMessage .. " Coalition Penalties: " .. ScoreMessageCoalitionChangePenalties .. "\n" + end + + local ScoreMessageMission = "" + local ScoreMission = 0 + local ScoreTask = 0 + for MissionName, MissionData in pairs( PlayerData.Mission ) do + ScoreMission = ScoreMission + MissionData.ScoreMission + ScoreTask = ScoreTask + MissionData.ScoreTask + ScoreMessageMission = ScoreMessageMission .. "'" .. MissionName .. "'; " + end + PlayerScore = PlayerScore + ScoreMission + ScoreTask + + if ScoreMessageMission ~= "" then + ScoreMessage = ScoreMessage .. " Tasks: " .. ScoreTask .. " Mission: " .. ScoreMission .. " ( " .. ScoreMessageMission .. ")\n" + end + + PlayerMessage = PlayerMessage .. string.format( "Player '%s' Score:%d (%d Score -%d Penalties)%s", PlayerName, PlayerScore - PlayerPenalty, PlayerScore, PlayerPenalty, ScoreMessage ) + end + end + MESSAGE:New( PlayerMessage, "Player Scores", 30, "AllPlayerScores"):ToAll() +end + + +function SCORING:ReportScorePlayer() + + env.info( "Hello World " ) + + local ScoreMessage = "" + local PlayerMessage = "" + + self:T( "Score Report" ) + + for PlayerName, PlayerData in pairs( self.Players ) do + if PlayerData then -- This should normally not happen, but i'll test it anyway. + self:T( "Score Player: " .. PlayerName ) + + -- Some variables + local InitUnitCoalition = _SCORINGCoalition[PlayerData.UnitCoalition] + local InitUnitCategory = _SCORINGCategory[PlayerData.UnitCategory] + local InitUnitType = PlayerData.UnitType + local InitUnitName = PlayerData.UnitName + + local PlayerScore = 0 + local PlayerPenalty = 0 + + ScoreMessage = "" + + local ScoreMessageHits = "" + + for CategoryID, CategoryName in pairs( _SCORINGCategory ) do + self:T( CategoryName ) + if PlayerData.Hit[CategoryID] then + local Score = 0 + local ScoreHit = 0 + local Penalty = 0 + local PenaltyHit = 0 + self:T( "Hit scores exist for player " .. PlayerName ) + for UnitName, UnitData in pairs( PlayerData.Hit[CategoryID] ) do + Score = Score + UnitData.Score + ScoreHit = ScoreHit + UnitData.ScoreHit + Penalty = Penalty + UnitData.Penalty + PenaltyHit = UnitData.PenaltyHit + end + local ScoreMessageHit = string.format( "\n %s = %d score(%d;-%d) hits(#%d;#-%d)", CategoryName, Score - Penalty, Score, Penalty, ScoreHit, PenaltyHit ) + self:T( ScoreMessageHit ) + ScoreMessageHits = ScoreMessageHits .. ScoreMessageHit + PlayerScore = PlayerScore + Score + PlayerPenalty = PlayerPenalty + Penalty + else + --ScoreMessageHits = ScoreMessageHits .. string.format( "%s:%d ", string.format(CategoryName, 1, 1), 0 ) + end + end + if ScoreMessageHits ~= "" then + ScoreMessage = ScoreMessage .. "\n Hits: " .. ScoreMessageHits .. " " + end + + local ScoreMessageKills = "" + for CategoryID, CategoryName in pairs( _SCORINGCategory ) do + self:T( "Kill scores exist for player " .. PlayerName ) + if PlayerData.Kill[CategoryID] then + local Score = 0 + local ScoreKill = 0 + local Penalty = 0 + local PenaltyKill = 0 + + for UnitName, UnitData in pairs( PlayerData.Kill[CategoryID] ) do + Score = Score + UnitData.Score + ScoreKill = ScoreKill + UnitData.ScoreKill + Penalty = Penalty + UnitData.Penalty + PenaltyKill = PenaltyKill + UnitData.PenaltyKill + end + + local ScoreMessageKill = string.format( "\n %s = %d score(%d;-%d) hits(#%d;#-%d)", CategoryName, Score - Penalty, Score, Penalty, ScoreKill, PenaltyKill ) + self:T( ScoreMessageKill ) + ScoreMessageKills = ScoreMessageKills .. ScoreMessageKill + + PlayerScore = PlayerScore + Score + PlayerPenalty = PlayerPenalty + Penalty + else + --ScoreMessageKills = ScoreMessageKills .. string.format( "%s:%d ", string.format(CategoryName, 1, 1), 0 ) + end + end + if ScoreMessageKills ~= "" then + ScoreMessage = ScoreMessage .. "\n Kills: " .. ScoreMessageKills .. " " + end + + local ScoreMessageCoalitionChangePenalties = "" + if PlayerData.PenaltyCoalition ~= 0 then + ScoreMessageCoalitionChangePenalties = ScoreMessageCoalitionChangePenalties .. string.format( " -%d (%d changed)", PlayerData.Penalty, PlayerData.PenaltyCoalition ) + PlayerPenalty = PlayerPenalty + PlayerData.Penalty + end + if ScoreMessageCoalitionChangePenalties ~= "" then + ScoreMessage = ScoreMessage .. "\n Coalition: " .. ScoreMessageCoalitionChangePenalties .. " " + end + + local ScoreMessageMission = "" + local ScoreMission = 0 + local ScoreTask = 0 + for MissionName, MissionData in pairs( PlayerData.Mission ) do + ScoreMission = ScoreMission + MissionData.ScoreMission + ScoreTask = ScoreTask + MissionData.ScoreTask + ScoreMessageMission = ScoreMessageMission .. "'" .. MissionName .. "'; " + end + PlayerScore = PlayerScore + ScoreMission + ScoreTask + + if ScoreMessageMission ~= "" then + ScoreMessage = ScoreMessage .. "\n Tasks: " .. ScoreTask .. " Mission: " .. ScoreMission .. " ( " .. ScoreMessageMission .. ") " + end + + PlayerMessage = PlayerMessage .. string.format( "Player '%s' Score = %d ( %d Score, -%d Penalties ):%s", PlayerName, PlayerScore - PlayerPenalty, PlayerScore, PlayerPenalty, ScoreMessage ) + end + end + MESSAGE:New( PlayerMessage, "Player Scores", 30, "AllPlayerScores"):ToAll() + +end + + +function SCORING:SecondsToClock(sSeconds) + local nSeconds = sSeconds + if nSeconds == 0 then + --return nil; + return "00:00:00"; + else + nHours = string.format("%02.f", math.floor(nSeconds/3600)); + nMins = string.format("%02.f", math.floor(nSeconds/60 - (nHours*60))); + nSecs = string.format("%02.f", math.floor(nSeconds - nHours*3600 - nMins *60)); + return nHours..":"..nMins..":"..nSecs + end +end + +--- Opens a score CSV file to log the scores. +-- @param #SCORING self +-- @param #string ScoringCSV +-- @return #SCORING self +-- @usage +-- -- Open a new CSV file to log the scores of the game Gori Valley. Let the name of the CSV file begin with "Player Scores". +-- ScoringObject = SCORING:New( "Gori Valley" ) +-- ScoringObject:OpenCSV( "Player Scores" ) +function SCORING:OpenCSV( ScoringCSV ) + self:F( ScoringCSV ) + + if lfs and io and os then + if ScoringCSV then + self.ScoringCSV = ScoringCSV + local fdir = lfs.writedir() .. [[Logs\]] .. self.ScoringCSV .. " " .. os.date( "%Y-%m-%d %H-%M-%S" ) .. ".csv" + + self.CSVFile, self.err = io.open( fdir, "w+" ) + if not self.CSVFile then + error( "Error: Cannot open CSV file in " .. lfs.writedir() ) + end + + self.CSVFile:write( '"GameName","RunTime","Time","PlayerName","ScoreType","PlayerUnitCoaltion","PlayerUnitCategory","PlayerUnitType","PlayerUnitName","TargetUnitCoalition","TargetUnitCategory","TargetUnitType","TargetUnitName","Times","Score"\n' ) + + self.RunTime = os.date("%y-%m-%d_%H-%M-%S") + else + error( "A string containing the CSV file name must be given." ) + end + else + self:E( "The MissionScripting.lua file has not been changed to allow lfs, io and os modules to be used..." ) + end + return self +end + + +--- Registers a score for a player. +-- @param #SCORING self +-- @param #string PlayerName The name of the player. +-- @param #string ScoreType The type of the score. +-- @param #string ScoreTimes The amount of scores achieved. +-- @param #string ScoreAmount The score given. +-- @param #string PlayerUnitName The unit name of the player. +-- @param #string PlayerUnitCoalition The coalition of the player unit. +-- @param #string PlayerUnitCategory The category of the player unit. +-- @param #string PlayerUnitType The type of the player unit. +-- @param #string TargetUnitName The name of the target unit. +-- @param #string TargetUnitCoalition The coalition of the target unit. +-- @param #string TargetUnitCategory The category of the target unit. +-- @param #string TargetUnitType The type of the target unit. +-- @return #SCORING self +function SCORING:ScoreCSV( PlayerName, ScoreType, ScoreTimes, ScoreAmount, PlayerUnitName, PlayerUnitCoalition, PlayerUnitCategory, PlayerUnitType, TargetUnitName, TargetUnitCoalition, TargetUnitCategory, TargetUnitType ) + --write statistic information to file + local ScoreTime = self:SecondsToClock( timer.getTime() ) + PlayerName = PlayerName:gsub( '"', '_' ) + + if PlayerUnitName and PlayerUnitName ~= '' then + local PlayerUnit = Unit.getByName( PlayerUnitName ) + + if PlayerUnit then + if not PlayerUnitCategory then + --PlayerUnitCategory = SCORINGCategory[PlayerUnit:getCategory()] + PlayerUnitCategory = _SCORINGCategory[PlayerUnit:getDesc().category] + end + + if not PlayerUnitCoalition then + PlayerUnitCoalition = _SCORINGCoalition[PlayerUnit:getCoalition()] + end + + if not PlayerUnitType then + PlayerUnitType = PlayerUnit:getTypeName() + end + else + PlayerUnitName = '' + PlayerUnitCategory = '' + PlayerUnitCoalition = '' + PlayerUnitType = '' + end + else + PlayerUnitName = '' + PlayerUnitCategory = '' + PlayerUnitCoalition = '' + PlayerUnitType = '' + end + + if not TargetUnitCoalition then + TargetUnitCoalition = '' + end + + if not TargetUnitCategory then + TargetUnitCategory = '' + end + + if not TargetUnitType then + TargetUnitType = '' + end + + if not TargetUnitName then + TargetUnitName = '' + end + + if lfs and io and os then + self.CSVFile:write( + '"' .. self.GameName .. '"' .. ',' .. + '"' .. self.RunTime .. '"' .. ',' .. + '' .. ScoreTime .. '' .. ',' .. + '"' .. PlayerName .. '"' .. ',' .. + '"' .. ScoreType .. '"' .. ',' .. + '"' .. PlayerUnitCoalition .. '"' .. ',' .. + '"' .. PlayerUnitCategory .. '"' .. ',' .. + '"' .. PlayerUnitType .. '"' .. ',' .. + '"' .. PlayerUnitName .. '"' .. ',' .. + '"' .. TargetUnitCoalition .. '"' .. ',' .. + '"' .. TargetUnitCategory .. '"' .. ',' .. + '"' .. TargetUnitType .. '"' .. ',' .. + '"' .. TargetUnitName .. '"' .. ',' .. + '' .. ScoreTimes .. '' .. ',' .. + '' .. ScoreAmount + ) + + self.CSVFile:write( "\n" ) + end +end + + +function SCORING:CloseCSV() + if lfs and io and os then + self.CSVFile:close() + end +end + +--- CARGO Classes +-- @module CARGO + +Include.File( "Routines" ) +Include.File( "Base" ) +Include.File( "Message" ) +Include.File( "Scheduler" ) + + +--- Clients are those Groups defined within the Mission Editor that have the skillset defined as "Client" or "Player". +-- These clients are defined within the Mission Orchestration Framework (MOF) + +CARGOS = {} + + +CARGO_ZONE = { + ClassName="CARGO_ZONE", + CargoZoneName = '', + CargoHostUnitName = '', + SIGNAL = { + TYPE = { + SMOKE = { ID = 1, TEXT = "smoke" }, + FLARE = { ID = 2, TEXT = "flare" } + }, + COLOR = { + GREEN = { ID = 1, TRIGGERCOLOR = trigger.smokeColor.Green, TEXT = "A green" }, + RED = { ID = 2, TRIGGERCOLOR = trigger.smokeColor.Red, TEXT = "A red" }, + WHITE = { ID = 3, TRIGGERCOLOR = trigger.smokeColor.White, TEXT = "A white" }, + ORANGE = { ID = 4, TRIGGERCOLOR = trigger.smokeColor.Orange, TEXT = "An orange" }, + BLUE = { ID = 5, TRIGGERCOLOR = trigger.smokeColor.Blue, TEXT = "A blue" }, + YELLOW = { ID = 6, TRIGGERCOLOR = trigger.flareColor.Yellow, TEXT = "A yellow" } + } + } +} + +--- Creates a new zone where cargo can be collected or deployed. +-- The zone functionality is useful to smoke or indicate routes for cargo pickups or deployments. +-- Provide the zone name as declared in the mission file into the CargoZoneName in the :New method. +-- An optional parameter is the CargoHostName, which is a Group declared with Late Activation switched on in the mission file. +-- The CargoHostName is the "host" of the cargo zone: +-- +-- * It will smoke the zone position when a client is approaching the zone. +-- * Depending on the cargo type, it will assist in the delivery of the cargo by driving to and from the client. +-- +-- @param #CARGO_ZONE self +-- @param #string CargoZoneName The name of the zone as declared within the mission editor. +-- @param #string CargoHostName The name of the Group "hosting" the zone. The Group MUST NOT be a static, and must be a "mobile" unit. +function CARGO_ZONE:New( CargoZoneName, CargoHostName ) local self = BASE:Inherit( self, ZONE:New( CargoZoneName ) ) + self:F( { CargoZoneName, CargoHostName } ) + + self.CargoZoneName = CargoZoneName + self.SignalHeight = 2 + --self.CargoZone = trigger.misc.getZone( CargoZoneName ) + + + if CargoHostName then + self.CargoHostName = CargoHostName + end + + self:T( self.CargoZoneName ) + + return self +end + +function CARGO_ZONE:Spawn() + self:F( self.CargoHostName ) + + if self.CargoHostName then -- Only spawn a host in the zone when there is one given as a parameter in the New function. + if self.CargoHostSpawn then + local CargoHostGroup = self.CargoHostSpawn:GetGroupFromIndex() + if CargoHostGroup and CargoHostGroup:IsAlive() then + else + self.CargoHostSpawn:ReSpawn( 1 ) + end + else + self:T( "Initialize CargoHostSpawn" ) + self.CargoHostSpawn = SPAWN:New( self.CargoHostName ):Limit( 1, 1 ) + self.CargoHostSpawn:ReSpawn( 1 ) + end + end + + return self +end + +function CARGO_ZONE:GetHostUnit() + self:F( self ) + + if self.CargoHostName then + + -- A Host has been given, signal the host + local CargoHostGroup = self.CargoHostSpawn:GetGroupFromIndex() + local CargoHostUnit + if CargoHostGroup and CargoHostGroup:IsAlive() then + CargoHostUnit = CargoHostGroup:GetUnit(1) + else + CargoHostUnit = StaticObject.getByName( self.CargoHostName ) + end + + return CargoHostUnit + end + + return nil +end + +function CARGO_ZONE:ReportCargosToClient( Client, CargoType ) + self:F() + + local SignalUnit = self:GetHostUnit() + + if SignalUnit then + + local SignalUnitTypeName = SignalUnit:getTypeName() + + local HostMessage = "" + + local IsCargo = false + for CargoID, Cargo in pairs( CARGOS ) do + if Cargo.CargoType == Task.CargoType then + if Cargo:IsStatusNone() then + HostMessage = HostMessage .. " - " .. Cargo.CargoName .. " - " .. Cargo.CargoType .. " (" .. Cargo.Weight .. "kg)" .. "\n" + IsCargo = true + end + end + end + + if not IsCargo then + HostMessage = "No Cargo Available." + end + + Client:Message( HostMessage, 20, Mission.Name .. "/StageHosts." .. SignalUnitTypeName, SignalUnitTypeName .. ": Reporting Cargo", 10 ) + end +end + + +function CARGO_ZONE:Signal() + self:F() + + local Signalled = false + + if self.SignalType then + + if self.CargoHostName then + + -- A Host has been given, signal the host + + local SignalUnit = self:GetHostUnit() + + if SignalUnit then + + self:T( 'Signalling Unit' ) + local SignalVehiclePos = SignalUnit:GetPointVec3() + SignalVehiclePos.y = SignalVehiclePos.y + 2 + + if self.SignalType.ID == CARGO_ZONE.SIGNAL.TYPE.SMOKE.ID then + + trigger.action.smoke( SignalVehiclePos, self.SignalColor.TRIGGERCOLOR ) + Signalled = true + + elseif self.SignalType.ID == CARGO_ZONE.SIGNAL.TYPE.FLARE.ID then + + trigger.action.signalFlare( SignalVehiclePos, self.SignalColor.TRIGGERCOLOR , 0 ) + Signalled = false + + end + end + + else + + local ZonePointVec3 = self:GetPointVec3( self.SignalHeight ) -- Get the zone position + the landheight + 2 meters + + if self.SignalType.ID == CARGO_ZONE.SIGNAL.TYPE.SMOKE.ID then + + trigger.action.smoke( ZonePointVec3, self.SignalColor.TRIGGERCOLOR ) + Signalled = true + + elseif self.SignalType.ID == CARGO_ZONE.SIGNAL.TYPE.FLARE.ID then + trigger.action.signalFlare( ZonePointVec3, self.SignalColor.TRIGGERCOLOR, 0 ) + Signalled = false + + end + end + end + + return Signalled + +end + +function CARGO_ZONE:WhiteSmoke( SignalHeight ) + self:F() + + self.SignalType = CARGO_ZONE.SIGNAL.TYPE.SMOKE + self.SignalColor = CARGO_ZONE.SIGNAL.COLOR.WHITE + + if SignalHeight then + self.SignalHeight = SignalHeight + end + + return self +end + +function CARGO_ZONE:BlueSmoke( SignalHeight ) + self:F() + + self.SignalType = CARGO_ZONE.SIGNAL.TYPE.SMOKE + self.SignalColor = CARGO_ZONE.SIGNAL.COLOR.BLUE + + if SignalHeight then + self.SignalHeight = SignalHeight + end + + return self +end + +function CARGO_ZONE:RedSmoke( SignalHeight ) + self:F() + + self.SignalType = CARGO_ZONE.SIGNAL.TYPE.SMOKE + self.SignalColor = CARGO_ZONE.SIGNAL.COLOR.RED + + if SignalHeight then + self.SignalHeight = SignalHeight + end + + return self +end + +function CARGO_ZONE:OrangeSmoke( SignalHeight ) + self:F() + + self.SignalType = CARGO_ZONE.SIGNAL.TYPE.SMOKE + self.SignalColor = CARGO_ZONE.SIGNAL.COLOR.ORANGE + + if SignalHeight then + self.SignalHeight = SignalHeight + end + + return self +end + +function CARGO_ZONE:GreenSmoke( SignalHeight ) + self:F() + + self.SignalType = CARGO_ZONE.SIGNAL.TYPE.SMOKE + self.SignalColor = CARGO_ZONE.SIGNAL.COLOR.GREEN + + if SignalHeight then + self.SignalHeight = SignalHeight + end + + return self +end + + +function CARGO_ZONE:WhiteFlare( SignalHeight ) + self:F() + + self.SignalType = CARGO_ZONE.SIGNAL.TYPE.FLARE + self.SignalColor = CARGO_ZONE.SIGNAL.COLOR.WHITE + + if SignalHeight then + self.SignalHeight = SignalHeight + end + + return self +end + +function CARGO_ZONE:RedFlare( SignalHeight ) + self:F() + + self.SignalType = CARGO_ZONE.SIGNAL.TYPE.FLARE + self.SignalColor = CARGO_ZONE.SIGNAL.COLOR.RED + + if SignalHeight then + self.SignalHeight = SignalHeight + end + + return self +end + +function CARGO_ZONE:GreenFlare( SignalHeight ) + self:F() + + self.SignalType = CARGO_ZONE.SIGNAL.TYPE.FLARE + self.SignalColor = CARGO_ZONE.SIGNAL.COLOR.GREEN + + if SignalHeight then + self.SignalHeight = SignalHeight + end + + return self +end + +function CARGO_ZONE:YellowFlare( SignalHeight ) + self:F() + + self.SignalType = CARGO_ZONE.SIGNAL.TYPE.FLARE + self.SignalColor = CARGO_ZONE.SIGNAL.COLOR.YELLOW + + if SignalHeight then + self.SignalHeight = SignalHeight + end + + return self +end + + +function CARGO_ZONE:GetCargoHostUnit() + self:F( self ) + + if self.CargoHostSpawn then + local CargoHostGroup = self.CargoHostSpawn:GetGroupFromIndex(1) + if CargoHostGroup and CargoHostGroup:IsAlive() then + local CargoHostUnit = CargoHostGroup:GetUnit(1) + if CargoHostUnit and CargoHostUnit:IsAlive() then + return CargoHostUnit + end + end + end + + return nil +end + +function CARGO_ZONE:GetCargoZoneName() + self:F() + + return self.CargoZoneName +end + +CARGO = { + ClassName = "CARGO", + STATUS = { + NONE = 0, + LOADED = 1, + UNLOADED = 2, + LOADING = 3 + }, + CargoClient = nil +} + +--- Add Cargo to the mission... Cargo functionality needs to be reworked a bit, so this is still under construction. I need to make a CARGO Class... +function CARGO:New( CargoType, CargoName, CargoWeight ) local self = BASE:Inherit( self, BASE:New() ) + self:F( { CargoType, CargoName, CargoWeight } ) + + + self.CargoType = CargoType + self.CargoName = CargoName + self.CargoWeight = CargoWeight + + self:StatusNone() + + return self +end + +function CARGO:Spawn( Client ) + self:F() + + return self + +end + +function CARGO:IsNear( Client, LandingZone ) + self:F() + + local Near = true + + return Near + +end + + +function CARGO:IsLoadingToClient() + self:F() + + if self:IsStatusLoading() then + return self.CargoClient + end + + return nil + +end + + +function CARGO:IsLoadedInClient() + self:F() + + if self:IsStatusLoaded() then + return self.CargoClient + end + + return nil + +end + + +function CARGO:UnLoad( Client, TargetZoneName ) + self:F() + + self:StatusUnLoaded() + + return self +end + +function CARGO:OnBoard( Client, LandingZone ) + self:F() + + local Valid = true + + self.CargoClient = Client + local ClientUnit = Client:GetClientGroupDCSUnit() + + return Valid +end + +function CARGO:OnBoarded( Client, LandingZone ) + self:F() + + local OnBoarded = true + + return OnBoarded +end + +function CARGO:Load( Client ) + self:F() + + self:StatusLoaded( Client ) + + return self +end + +function CARGO:IsLandingRequired() + self:F() + return true +end + +function CARGO:IsSlingLoad() + self:F() + return false +end + + +function CARGO:StatusNone() + self:F() + + self.CargoClient = nil + self.CargoStatus = CARGO.STATUS.NONE + + return self +end + +function CARGO:StatusLoading( Client ) + self:F() + + self.CargoClient = Client + self.CargoStatus = CARGO.STATUS.LOADING + self:T( "Cargo " .. self.CargoName .. " loading to Client: " .. self.CargoClient:GetClientGroupName() ) + + return self +end + +function CARGO:StatusLoaded( Client ) + self:F() + + self.CargoClient = Client + self.CargoStatus = CARGO.STATUS.LOADED + self:T( "Cargo " .. self.CargoName .. " loaded in Client: " .. self.CargoClient:GetClientGroupName() ) + + return self +end + +function CARGO:StatusUnLoaded() + self:F() + + self.CargoClient = nil + self.CargoStatus = CARGO.STATUS.UNLOADED + + return self +end + + +function CARGO:IsStatusNone() + self:F() + + return self.CargoStatus == CARGO.STATUS.NONE +end + +function CARGO:IsStatusLoading() + self:F() + + return self.CargoStatus == CARGO.STATUS.LOADING +end + +function CARGO:IsStatusLoaded() + self:F() + + return self.CargoStatus == CARGO.STATUS.LOADED +end + +function CARGO:IsStatusUnLoaded() + self:F() + + return self.CargoStatus == CARGO.STATUS.UNLOADED +end + + +CARGO_GROUP = { + ClassName = "CARGO_GROUP" +} + + +function CARGO_GROUP:New( CargoType, CargoName, CargoWeight, CargoGroupTemplate, CargoZone ) local self = BASE:Inherit( self, CARGO:New( CargoType, CargoName, CargoWeight ) ) + self:F( { CargoType, CargoName, CargoWeight, CargoGroupTemplate, CargoZone } ) + + self.CargoSpawn = SPAWN:NewWithAlias( CargoGroupTemplate, CargoName ) + self.CargoZone = CargoZone + + CARGOS[self.CargoName] = self + + return self + +end + +function CARGO_GROUP:Spawn( Client ) + self:F( { Client } ) + + local SpawnCargo = true + + if self:IsStatusNone() then + local CargoGroup = Group.getByName( self.CargoName ) + if CargoGroup and CargoGroup:isExist() then + SpawnCargo = false + end + + elseif self:IsStatusLoading() then + + local Client = self:IsLoadingToClient() + if Client and Client:GetDCSGroup() then + SpawnCargo = false + else + local CargoGroup = Group.getByName( self.CargoName ) + if CargoGroup and CargoGroup:isExist() then + SpawnCargo = false + end + end + + elseif self:IsStatusLoaded() then + + local ClientLoaded = self:IsLoadedInClient() + -- Now test if another Client is alive (not this one), and it has the CARGO, then this cargo does not need to be initialized and spawned. + if ClientLoaded and ClientLoaded ~= Client then + local ClientGroup = Client:GetDCSGroup() + if ClientLoaded:GetClientGroupDCSUnit() and ClientLoaded:GetClientGroupDCSUnit():isExist() then + SpawnCargo = false + else + self:StatusNone() + end + else + -- Same Client, but now in initialize, so set back the status to None. + self:StatusNone() + end + + elseif self:IsStatusUnLoaded() then + + SpawnCargo = false + + end + + if SpawnCargo then + if self.CargoZone:GetCargoHostUnit() then + --- ReSpawn the Cargo from the CargoHost + self.CargoGroupName = self.CargoSpawn:SpawnFromUnit( self.CargoZone:GetCargoHostUnit(), 60, 30, 1 ):GetName() + else + --- ReSpawn the Cargo in the CargoZone without a host ... + self:T( self.CargoZone ) + self.CargoGroupName = self.CargoSpawn:SpawnInZone( self.CargoZone, true, 1 ):GetName() + end + self:StatusNone() + end + + self:T( { self.CargoGroupName, CARGOS[self.CargoName].CargoGroupName } ) + + return self +end + +function CARGO_GROUP:IsNear( Client, LandingZone ) + self:F() + + local Near = false + + if self.CargoGroupName then + local CargoGroup = Group.getByName( self.CargoGroupName ) + if routines.IsPartOfGroupInRadius( CargoGroup, Client:GetPositionVec3(), 250 ) then + Near = true + end + end + + return Near + +end + + +function CARGO_GROUP:OnBoard( Client, LandingZone, OnBoardSide ) + self:F() + + local Valid = true + + local ClientUnit = Client:GetClientGroupDCSUnit() + + local CarrierPos = ClientUnit:getPoint() + local CarrierPosMove = ClientUnit:getPoint() + local CarrierPosOnBoard = ClientUnit:getPoint() + + local CargoGroup = Group.getByName( self.CargoGroupName ) + + local CargoUnit = CargoGroup:getUnit(1) + local CargoPos = CargoUnit:getPoint() + + self.CargoInAir = CargoUnit:inAir() + + self:T( self.CargoInAir ) + + -- Only move the group to the carrier when the cargo is not in the air + -- (eg. cargo can be on a oil derrick, moving the cargo on the oil derrick will drop the cargo on the sea). + if not self.CargoInAir then + + local Points = {} + + self:T( 'CargoPos x = ' .. CargoPos.x .. " z = " .. CargoPos.z ) + self:T( 'CarrierPosMove x = ' .. CarrierPosMove.x .. " z = " .. CarrierPosMove.z ) + + Points[#Points+1] = routines.ground.buildWP( CargoPos, "Cone", 10 ) + + self:T( 'Points[1] x = ' .. Points[1].x .. " y = " .. Points[1].y ) + + if OnBoardSide == nil then + OnBoardSide = CLIENT.ONBOARDSIDE.NONE + end + + if OnBoardSide == CLIENT.ONBOARDSIDE.LEFT then + + self:T( "TransportCargoOnBoard: Onboarding LEFT" ) + CarrierPosMove.z = CarrierPosMove.z - 25 + CarrierPosOnBoard.z = CarrierPosOnBoard.z - 5 + Points[#Points+1] = routines.ground.buildWP( CarrierPosMove, "Cone", 10 ) + Points[#Points+1] = routines.ground.buildWP( CarrierPosOnBoard, "Cone", 10 ) + + elseif OnBoardSide == CLIENT.ONBOARDSIDE.RIGHT then + + self:T( "TransportCargoOnBoard: Onboarding RIGHT" ) + CarrierPosMove.z = CarrierPosMove.z + 25 + CarrierPosOnBoard.z = CarrierPosOnBoard.z + 5 + Points[#Points+1] = routines.ground.buildWP( CarrierPosMove, "Cone", 10 ) + Points[#Points+1] = routines.ground.buildWP( CarrierPosOnBoard, "Cone", 10 ) + + elseif OnBoardSide == CLIENT.ONBOARDSIDE.BACK then + + self:T( "TransportCargoOnBoard: Onboarding BACK" ) + CarrierPosMove.x = CarrierPosMove.x - 25 + CarrierPosOnBoard.x = CarrierPosOnBoard.x - 5 + Points[#Points+1] = routines.ground.buildWP( CarrierPosMove, "Cone", 10 ) + Points[#Points+1] = routines.ground.buildWP( CarrierPosOnBoard, "Cone", 10 ) + + elseif OnBoardSide == CLIENT.ONBOARDSIDE.FRONT then + + self:T( "TransportCargoOnBoard: Onboarding FRONT" ) + CarrierPosMove.x = CarrierPosMove.x + 25 + CarrierPosOnBoard.x = CarrierPosOnBoard.x + 5 + Points[#Points+1] = routines.ground.buildWP( CarrierPosMove, "Cone", 10 ) + Points[#Points+1] = routines.ground.buildWP( CarrierPosOnBoard, "Cone", 10 ) + + elseif OnBoardSide == CLIENT.ONBOARDSIDE.NONE then + + self:T( "TransportCargoOnBoard: Onboarding CENTRAL" ) + Points[#Points+1] = routines.ground.buildWP( CarrierPos, "Cone", 10 ) + + end + self:T( "TransportCargoOnBoard: Routing " .. self.CargoGroupName ) + + --routines.scheduleFunction( routines.goRoute, { self.CargoGroupName, Points}, timer.getTime() + 4 ) + SCHEDULER:New( self, routines.goRoute, { self.CargoGroupName, Points}, 4 ) + end + + self:StatusLoading( Client ) + + return Valid + +end + + +function CARGO_GROUP:OnBoarded( Client, LandingZone ) + self:F() + + local OnBoarded = false + + local CargoGroup = Group.getByName( self.CargoGroupName ) + + if not self.CargoInAir then + if routines.IsPartOfGroupInRadius( CargoGroup, Client:GetPositionVec3(), 25 ) then + CargoGroup:destroy() + self:StatusLoaded( Client ) + OnBoarded = true + end + else + CargoGroup:destroy() + self:StatusLoaded( Client ) + OnBoarded = true + end + + return OnBoarded +end + + +function CARGO_GROUP:UnLoad( Client, TargetZoneName ) + self:F() + + self:T( 'self.CargoName = ' .. self.CargoName ) + + local CargoGroup = self.CargoSpawn:SpawnFromUnit( Client:GetClientGroupUnit(), 60, 30 ) + + self.CargoGroupName = CargoGroup:GetName() + self:T( 'self.CargoGroupName = ' .. self.CargoGroupName ) + + CargoGroup:TaskRouteToZone( ZONE:New( TargetZoneName ), true ) + + self:StatusUnLoaded() + + return self +end + + +CARGO_PACKAGE = { + ClassName = "CARGO_PACKAGE" +} + + +function CARGO_PACKAGE:New( CargoType, CargoName, CargoWeight, CargoClient ) local self = BASE:Inherit( self, CARGO:New( CargoType, CargoName, CargoWeight ) ) + self:F( { CargoType, CargoName, CargoWeight, CargoClient } ) + + self.CargoClient = CargoClient + + CARGOS[self.CargoName] = self + + return self + +end + + +function CARGO_PACKAGE:Spawn( Client ) + self:F( { self, Client } ) + + -- this needs to be checked thoroughly + + local CargoClientGroup = self.CargoClient:GetDCSGroup() + if not CargoClientGroup then + if not self.CargoClientSpawn then + self.CargoClientSpawn = SPAWN:New( self.CargoClient:GetClientGroupName() ):Limit( 1, 1 ) + end + self.CargoClientSpawn:ReSpawn( 1 ) + end + + local SpawnCargo = true + + if self:IsStatusNone() then + + elseif self:IsStatusLoading() or self:IsStatusLoaded() then + + local CargoClientLoaded = self:IsLoadedInClient() + if CargoClientLoaded and CargoClientLoaded:GetDCSGroup() then + SpawnCargo = false + end + + elseif self:IsStatusUnLoaded() then + + SpawnCargo = false + + else + + end + + if SpawnCargo then + self:StatusLoaded( self.CargoClient ) + end + + return self +end + + +function CARGO_PACKAGE:IsNear( Client, LandingZone ) + self:F() + + local Near = false + + if self.CargoClient and self.CargoClient:GetDCSGroup() then + self:T( self.CargoClient.ClientName ) + self:T( 'Client Exists.' ) + + if routines.IsUnitInRadius( self.CargoClient:GetClientGroupDCSUnit(), Client:GetPositionVec3(), 150 ) then + Near = true + end + end + + return Near + +end + + +function CARGO_PACKAGE:OnBoard( Client, LandingZone, OnBoardSide ) + self:F() + + local Valid = true + + local ClientUnit = Client:GetClientGroupDCSUnit() + + local CarrierPos = ClientUnit:getPoint() + local CarrierPosMove = ClientUnit:getPoint() + local CarrierPosOnBoard = ClientUnit:getPoint() + local CarrierPosMoveAway = ClientUnit:getPoint() + + local CargoHostGroup = self.CargoClient:GetDCSGroup() + local CargoHostName = self.CargoClient:GetDCSGroup():getName() + + local CargoHostUnits = CargoHostGroup:getUnits() + local CargoPos = CargoHostUnits[1]:getPoint() + + local Points = {} + + self:T( 'CargoPos x = ' .. CargoPos.x .. " z = " .. CargoPos.z ) + self:T( 'CarrierPosMove x = ' .. CarrierPosMove.x .. " z = " .. CarrierPosMove.z ) + + Points[#Points+1] = routines.ground.buildWP( CargoPos, "Cone", 10 ) + + self:T( 'Points[1] x = ' .. Points[1].x .. " y = " .. Points[1].y ) + + if OnBoardSide == nil then + OnBoardSide = CLIENT.ONBOARDSIDE.NONE + end + + if OnBoardSide == CLIENT.ONBOARDSIDE.LEFT then + + self:T( "TransportCargoOnBoard: Onboarding LEFT" ) + CarrierPosMove.z = CarrierPosMove.z - 25 + CarrierPosOnBoard.z = CarrierPosOnBoard.z - 5 + CarrierPosMoveAway.z = CarrierPosMoveAway.z - 20 + Points[#Points+1] = routines.ground.buildWP( CarrierPosMove, "Cone", 10 ) + Points[#Points+1] = routines.ground.buildWP( CarrierPosOnBoard, "Cone", 10 ) + Points[#Points+1] = routines.ground.buildWP( CarrierPosMoveAway, "Cone", 10 ) + + elseif OnBoardSide == CLIENT.ONBOARDSIDE.RIGHT then + + self:T( "TransportCargoOnBoard: Onboarding RIGHT" ) + CarrierPosMove.z = CarrierPosMove.z + 25 + CarrierPosOnBoard.z = CarrierPosOnBoard.z + 5 + CarrierPosMoveAway.z = CarrierPosMoveAway.z + 20 + Points[#Points+1] = routines.ground.buildWP( CarrierPosMove, "Cone", 10 ) + Points[#Points+1] = routines.ground.buildWP( CarrierPosOnBoard, "Cone", 10 ) + Points[#Points+1] = routines.ground.buildWP( CarrierPosMoveAway, "Cone", 10 ) + + elseif OnBoardSide == CLIENT.ONBOARDSIDE.BACK then + + self:T( "TransportCargoOnBoard: Onboarding BACK" ) + CarrierPosMove.x = CarrierPosMove.x - 25 + CarrierPosOnBoard.x = CarrierPosOnBoard.x - 5 + CarrierPosMoveAway.x = CarrierPosMoveAway.x - 20 + Points[#Points+1] = routines.ground.buildWP( CarrierPosMove, "Cone", 10 ) + Points[#Points+1] = routines.ground.buildWP( CarrierPosOnBoard, "Cone", 10 ) + Points[#Points+1] = routines.ground.buildWP( CarrierPosMoveAway, "Cone", 10 ) + + elseif OnBoardSide == CLIENT.ONBOARDSIDE.FRONT then + + self:T( "TransportCargoOnBoard: Onboarding FRONT" ) + CarrierPosMove.x = CarrierPosMove.x + 25 + CarrierPosOnBoard.x = CarrierPosOnBoard.x + 5 + CarrierPosMoveAway.x = CarrierPosMoveAway.x + 20 + Points[#Points+1] = routines.ground.buildWP( CarrierPosMove, "Cone", 10 ) + Points[#Points+1] = routines.ground.buildWP( CarrierPosOnBoard, "Cone", 10 ) + Points[#Points+1] = routines.ground.buildWP( CarrierPosMoveAway, "Cone", 10 ) + + elseif OnBoardSide == CLIENT.ONBOARDSIDE.NONE then + + self:T( "TransportCargoOnBoard: Onboarding FRONT" ) + CarrierPosMove.x = CarrierPosMove.x + 25 + CarrierPosOnBoard.x = CarrierPosOnBoard.x + 5 + CarrierPosMoveAway.x = CarrierPosMoveAway.x + 20 + Points[#Points+1] = routines.ground.buildWP( CarrierPosMove, "Cone", 10 ) + Points[#Points+1] = routines.ground.buildWP( CarrierPosOnBoard, "Cone", 10 ) + Points[#Points+1] = routines.ground.buildWP( CarrierPosMoveAway, "Cone", 10 ) + + end + self:T( "Routing " .. CargoHostName ) + + --routines.scheduleFunction( routines.goRoute, { CargoHostName, Points}, timer.getTime() + 4 ) + SCHEDULER:New( self, routines.goRoute, { CargoHostName, Points }, 4 ) + + return Valid + +end + + +function CARGO_PACKAGE:OnBoarded( Client, LandingZone ) + self:F() + + local OnBoarded = false + + if self.CargoClient and self.CargoClient:GetDCSGroup() then + if routines.IsUnitInRadius( self.CargoClient:GetClientGroupDCSUnit(), self.CargoClient:GetPositionVec3(), 10 ) then + + -- Switch Cargo from self.CargoClient to Client ... Each cargo can have only one client. So assigning the new client for the cargo is enough. + self:StatusLoaded( Client ) + + -- All done, onboarded the Cargo to the new Client. + OnBoarded = true + end + end + + return OnBoarded +end + + +function CARGO_PACKAGE:UnLoad( Client, TargetZoneName ) + self:F() + + self:T( 'self.CargoName = ' .. self.CargoName ) + --self:T( 'self.CargoHostName = ' .. self.CargoHostName ) + + --self.CargoSpawn:FromCarrier( Client:GetDCSGroup(), TargetZoneName, self.CargoHostName ) + self:StatusUnLoaded() + + return Cargo +end + + +CARGO_SLINGLOAD = { + ClassName = "CARGO_SLINGLOAD" +} + + +function CARGO_SLINGLOAD:New( CargoType, CargoName, CargoWeight, CargoZone, CargoHostName, CargoCountryID ) + local self = BASE:Inherit( self, CARGO:New( CargoType, CargoName, CargoWeight ) ) + self:F( { CargoType, CargoName, CargoWeight, CargoZone, CargoHostName, CargoCountryID } ) + + self.CargoHostName = CargoHostName + + -- Cargo will be initialized around the CargoZone position. + self.CargoZone = CargoZone + + self.CargoCount = 0 + self.CargoStaticName = string.format( "%s#%03d", self.CargoName, self.CargoCount ) + + -- The country ID needs to be correctly set. + self.CargoCountryID = CargoCountryID + + CARGOS[self.CargoName] = self + + return self + +end + + +function CARGO_SLINGLOAD:IsLandingRequired() + self:F() + return false +end + + +function CARGO_SLINGLOAD:IsSlingLoad() + self:F() + return true +end + + +function CARGO_SLINGLOAD:Spawn( Client ) + self:F( { self, Client } ) + + local Zone = trigger.misc.getZone( self.CargoZone ) + + local ZonePos = {} + ZonePos.x = Zone.point.x + math.random( Zone.radius / 2 * -1, Zone.radius / 2 ) + ZonePos.y = Zone.point.z + math.random( Zone.radius / 2 * -1, Zone.radius / 2 ) + + self:T( "Cargo Location = " .. ZonePos.x .. ", " .. ZonePos.y ) + + --[[ + -- This does not work in 1.5.2. + CargoStatic = StaticObject.getByName( self.CargoName ) + if CargoStatic then + CargoStatic:destroy() + end + --]] + + CargoStatic = StaticObject.getByName( self.CargoStaticName ) + + if CargoStatic and CargoStatic:isExist() then + CargoStatic:destroy() + end + + -- I need to make every time a new cargo due to bugs in 1.5.2. + + self.CargoCount = self.CargoCount + 1 + self.CargoStaticName = string.format( "%s#%03d", self.CargoName, self.CargoCount ) + + local CargoTemplate = { + ["category"] = "Cargo", + ["shape_name"] = "ab-212_cargo", + ["type"] = "Cargo1", + ["x"] = ZonePos.x, + ["y"] = ZonePos.y, + ["mass"] = self.CargoWeight, + ["name"] = self.CargoStaticName, + ["canCargo"] = true, + ["heading"] = 0, + } + + coalition.addStaticObject( self.CargoCountryID, CargoTemplate ) + +-- end + + return self +end + + +function CARGO_SLINGLOAD:IsNear( Client, LandingZone ) + self:F() + + local Near = false + + return Near +end + + +function CARGO_SLINGLOAD:IsInLandingZone( Client, LandingZone ) + self:F() + + local Near = false + + local CargoStaticUnit = StaticObject.getByName( self.CargoName ) + if CargoStaticUnit then + if routines.IsStaticInZones( CargoStaticUnit, LandingZone ) then + Near = true + end + end + + return Near +end + + +function CARGO_SLINGLOAD:OnBoard( Client, LandingZone, OnBoardSide ) + self:F() + + local Valid = true + + + return Valid +end + + +function CARGO_SLINGLOAD:OnBoarded( Client, LandingZone ) + self:F() + + local OnBoarded = false + + local CargoStaticUnit = StaticObject.getByName( self.CargoName ) + if CargoStaticUnit then + if not routines.IsStaticInZones( CargoStaticUnit, LandingZone ) then + OnBoarded = true + end + end + + return OnBoarded +end + + +function CARGO_SLINGLOAD:UnLoad( Client, TargetZoneName ) + self:F() + + self:T( 'self.CargoName = ' .. self.CargoName ) + self:T( 'self.CargoGroupName = ' .. self.CargoGroupName ) + + self:StatusUnLoaded() + + return Cargo +end +--- Message System to display Messages for Clients and Coalitions or All. +-- Messages are grouped on the display panel per Category to improve readability for the players. +-- Messages are shown on the display panel for an amount of seconds, and will then disappear. +-- Messages are identified by an ID. The messages with the same ID belonging to the same category will be overwritten if they were still being displayed on the display panel. +-- Messages are created with MESSAGE:@{New}(). +-- Messages are sent to Clients with MESSAGE:@{ToClient}(). +-- Messages are sent to Coalitions with MESSAGE:@{ToCoalition}(). +-- Messages are sent to All Players with MESSAGE:@{ToAll}(). +-- @module Message + +Include.File( "Base" ) + +--- The MESSAGE class +-- @type MESSAGE +MESSAGE = { + ClassName = "MESSAGE", + MessageCategory = 0, + MessageID = 0, +} + + +--- Creates a new MESSAGE object. Note that these MESSAGE objects are not yet displayed on the display panel. You must use the functions @{ToClient} or @{ToCoalition} or @{ToAll} to send these Messages to the respective recipients. +-- @param self +-- @param #string MessageText is the text of the Message. +-- @param #string MessageCategory is a string expressing the Category of the Message. Messages are grouped on the display panel per Category to improve readability. +-- @param #number MessageDuration is a number in seconds of how long the MESSAGE should be shown on the display panel. +-- @param #string MessageID is a string expressing the ID of the Message. +-- @return #MESSAGE +-- @usage +-- -- Create a series of new Messages. +-- -- MessageAll is meant to be sent to all players, for 25 seconds, and is classified as "Score". +-- -- MessageRED is meant to be sent to the RED players only, for 10 seconds, and is classified as "End of Mission", with ID "Win". +-- -- MessageClient1 is meant to be sent to a Client, for 25 seconds, and is classified as "Score", with ID "Score". +-- -- MessageClient1 is meant to be sent to a Client, for 25 seconds, and is classified as "Score", with ID "Score". +-- MessageAll = MESSAGE:New( "To all Players: BLUE has won! Each player of BLUE wins 50 points!", "End of Mission", 25, "Win" ) +-- MessageRED = MESSAGE:New( "To the RED Players: You receive a penalty because you've killed one of your own units", "Penalty", 25, "Score" ) +-- MessageClient1 = MESSAGE:New( "Congratulations, you've just hit a target", "Score", 25, "Score" ) +-- MessageClient2 = MESSAGE:New( "Congratulations, you've just killed a target", "Score", 25, "Score" ) +function MESSAGE:New( MessageText, MessageCategory, MessageDuration, MessageID ) + local self = BASE:Inherit( self, BASE:New() ) + self:F( { MessageText, MessageCategory, MessageDuration, MessageID } ) + + -- When no messagecategory is given, we don't show it as a title... + if MessageCategory and MessageCategory ~= "" then + self.MessageCategory = MessageCategory .. ": " + else + self.MessageCategory = "" + end + + self.MessageDuration = MessageDuration + self.MessageID = MessageID + self.MessageTime = timer.getTime() + self.MessageText = MessageText + + self.MessageSent = false + self.MessageGroup = false + self.MessageCoalition = false + + return self +end + +--- Sends a MESSAGE to a Client Group. Note that the Group needs to be defined within the ME with the skillset "Client" or "Player". +-- @param #MESSAGE self +-- @param Client#CLIENT Client is the Group of the Client. +-- @return #MESSAGE +-- @usage +-- -- Send the 2 messages created with the @{New} method to the Client Group. +-- -- Note that the Message of MessageClient2 is overwriting the Message of MessageClient1. +-- ClientGroup = Group.getByName( "ClientGroup" ) +-- +-- MessageClient1 = MESSAGE:New( "Congratulations, you've just hit a target", "Score", 25, "Score" ):ToClient( ClientGroup ) +-- MessageClient2 = MESSAGE:New( "Congratulations, you've just killed a target", "Score", 25, "Score" ):ToClient( ClientGroup ) +-- or +-- MESSAGE:New( "Congratulations, you've just hit a target", "Score", 25, "Score" ):ToClient( ClientGroup ) +-- MESSAGE:New( "Congratulations, you've just killed a target", "Score", 25, "Score" ):ToClient( ClientGroup ) +-- or +-- MessageClient1 = MESSAGE:New( "Congratulations, you've just hit a target", "Score", 25, "Score" ) +-- MessageClient2 = MESSAGE:New( "Congratulations, you've just killed a target", "Score", 25, "Score" ) +-- MessageClient1:ToClient( ClientGroup ) +-- MessageClient2:ToClient( ClientGroup ) +function MESSAGE:ToClient( Client ) + self:F( Client ) + + if Client and Client:GetClientGroupID() then + + local ClientGroupID = Client:GetClientGroupID() + self:T( self.MessageCategory .. self.MessageText:gsub("\n$",""):gsub("\n$","") .. " / " .. self.MessageDuration ) + trigger.action.outTextForGroup( ClientGroupID, self.MessageCategory .. self.MessageText:gsub("\n$",""):gsub("\n$",""), self.MessageDuration ) + end + + return self +end + +--- Sends a MESSAGE to the Blue coalition. +-- @param #MESSAGE self +-- @return #MESSAGE +-- @usage +-- -- Send a message created with the @{New} method to the BLUE coalition. +-- MessageBLUE = MESSAGE:New( "To the BLUE Players: You receive a penalty because you've killed one of your own units", "Penalty", 25, "Score" ):ToBlue() +-- or +-- MESSAGE:New( "To the BLUE Players: You receive a penalty because you've killed one of your own units", "Penalty", 25, "Score" ):ToBlue() +-- or +-- MessageBLUE = MESSAGE:New( "To the BLUE Players: You receive a penalty because you've killed one of your own units", "Penalty", 25, "Score" ) +-- MessageBLUE:ToBlue() +function MESSAGE:ToBlue() + self:F() + + self:ToCoalition( coalition.side.BLUE ) + + return self +end + +--- Sends a MESSAGE to the Red Coalition. +-- @param #MESSAGE self +-- @return #MESSAGE +-- @usage +-- -- Send a message created with the @{New} method to the RED coalition. +-- MessageRED = MESSAGE:New( "To the RED Players: You receive a penalty because you've killed one of your own units", "Penalty", 25, "Score" ):ToRed() +-- or +-- MESSAGE:New( "To the RED Players: You receive a penalty because you've killed one of your own units", "Penalty", 25, "Score" ):ToRed() +-- or +-- MessageRED = MESSAGE:New( "To the RED Players: You receive a penalty because you've killed one of your own units", "Penalty", 25, "Score" ) +-- MessageRED:ToRed() +function MESSAGE:ToRed( ) + self:F() + + self:ToCoalition( coalition.side.RED ) + + return self +end + +--- Sends a MESSAGE to a Coalition. +-- @param #MESSAGE self +-- @param CoalitionSide needs to be filled out by the defined structure of the standard scripting engine @{coalition.side}. +-- @return #MESSAGE +-- @usage +-- -- Send a message created with the @{New} method to the RED coalition. +-- MessageRED = MESSAGE:New( "To the RED Players: You receive a penalty because you've killed one of your own units", "Penalty", 25, "Score" ):ToCoalition( coalition.side.RED ) +-- or +-- MESSAGE:New( "To the RED Players: You receive a penalty because you've killed one of your own units", "Penalty", 25, "Score" ):ToCoalition( coalition.side.RED ) +-- or +-- MessageRED = MESSAGE:New( "To the RED Players: You receive a penalty because you've killed one of your own units", "Penalty", 25, "Score" ) +-- MessageRED:ToCoalition( coalition.side.RED ) +function MESSAGE:ToCoalition( CoalitionSide ) + self:F( CoalitionSide ) + + if CoalitionSide then + self:T( self.MessageCategory .. self.MessageText:gsub("\n$",""):gsub("\n$","") .. " / " .. self.MessageDuration ) + trigger.action.outTextForCoalition( CoalitionSide, self.MessageCategory .. self.MessageText:gsub("\n$",""):gsub("\n$",""), self.MessageDuration ) + end + + return self +end + +--- Sends a MESSAGE to all players. +-- @param #MESSAGE self +-- @return #MESSAGE +-- @usage +-- -- Send a message created to all players. +-- MessageAll = MESSAGE:New( "To all Players: BLUE has won! Each player of BLUE wins 50 points!", "End of Mission", 25, "Win" ):ToAll() +-- or +-- MESSAGE:New( "To all Players: BLUE has won! Each player of BLUE wins 50 points!", "End of Mission", 25, "Win" ):ToAll() +-- or +-- MessageAll = MESSAGE:New( "To all Players: BLUE has won! Each player of BLUE wins 50 points!", "End of Mission", 25, "Win" ) +-- MessageAll:ToAll() +function MESSAGE:ToAll() + self:F() + + self:ToCoalition( coalition.side.RED ) + self:ToCoalition( coalition.side.BLUE ) + + return self +end + + + +--- The MESSAGEQUEUE class +-- @type MESSAGEQUEUE +MESSAGEQUEUE = { + ClientGroups = {}, + CoalitionSides = {} +} + +function MESSAGEQUEUE:New( RefreshInterval ) + local self = BASE:Inherit( self, BASE:New() ) + self:F( { RefreshInterval } ) + + self.RefreshInterval = RefreshInterval + + --self.DisplayFunction = routines.scheduleFunction( self._DisplayMessages, { self }, 0, RefreshInterval ) + self.DisplayFunction = SCHEDULER:New( self, self._DisplayMessages, {}, 0, RefreshInterval ) + + return self +end + +--- This function is called automatically by the MESSAGEQUEUE scheduler. +function MESSAGEQUEUE:_DisplayMessages() + + -- First we display all messages that a coalition needs to receive... Also those who are not in a client (CA module clients...). + for CoalitionSideID, CoalitionSideData in pairs( self.CoalitionSides ) do + for MessageID, MessageData in pairs( CoalitionSideData.Messages ) do + if MessageData.MessageSent == false then + --trigger.action.outTextForCoalition( CoalitionSideID, MessageData.MessageCategory .. '\n' .. MessageData.MessageText:gsub("\n$",""):gsub("\n$",""), MessageData.MessageDuration ) + MessageData.MessageSent = true + end + local MessageTimeLeft = ( MessageData.MessageTime + MessageData.MessageDuration ) - timer.getTime() + if MessageTimeLeft <= 0 then + MessageData = nil + end + end + end + + -- Then we send the messages for each individual client, but also to be included are those Coalition messages for the Clients who belong to a coalition. + -- Because the Client messages will overwrite the Coalition messages (for that Client). + for ClientGroupName, ClientGroupData in pairs( self.ClientGroups ) do + for MessageID, MessageData in pairs( ClientGroupData.Messages ) do + if MessageData.MessageGroup == false then + trigger.action.outTextForGroup( Group.getByName(ClientGroupName):getID(), MessageData.MessageCategory .. '\n' .. MessageData.MessageText:gsub("\n$",""):gsub("\n$",""), MessageData.MessageDuration ) + MessageData.MessageGroup = true + end + local MessageTimeLeft = ( MessageData.MessageTime + MessageData.MessageDuration ) - timer.getTime() + if MessageTimeLeft <= 0 then + MessageData = nil + end + end + + -- Now check if the Client also has messages that belong to the Coalition of the Client... + for CoalitionSideID, CoalitionSideData in pairs( self.CoalitionSides ) do + for MessageID, MessageData in pairs( CoalitionSideData.Messages ) do + local CoalitionGroup = Group.getByName( ClientGroupName ) + if CoalitionGroup and CoalitionGroup:getCoalition() == CoalitionSideID then + if MessageData.MessageCoalition == false then + trigger.action.outTextForGroup( Group.getByName(ClientGroupName):getID(), MessageData.MessageCategory .. '\n' .. MessageData.MessageText:gsub("\n$",""):gsub("\n$",""), MessageData.MessageDuration ) + MessageData.MessageCoalition = true + end + end + local MessageTimeLeft = ( MessageData.MessageTime + MessageData.MessageDuration ) - timer.getTime() + if MessageTimeLeft <= 0 then + MessageData = nil + end + end + end + end + + return true +end + +--- The _MessageQueue object is created when the MESSAGE class module is loaded. +--_MessageQueue = MESSAGEQUEUE:New( 0.5 ) + +--- Stages within a @{TASK} within a @{MISSION}. All of the STAGE functionality is considered internally administered and not to be used by any Mission designer. +-- @module STAGE +-- @author Flightcontrol + +Include.File( "Routines" ) +Include.File( "Base" ) +Include.File( "Mission" ) +Include.File( "Client" ) +Include.File( "Task" ) + +--- The STAGE class +-- @type +STAGE = { + ClassName = "STAGE", + MSG = { ID = "None", TIME = 10 }, + FREQUENCY = { NONE = 0, ONCE = 1, REPEAT = -1 }, + + Name = "NoStage", + StageType = '', + WaitTime = 1, + Frequency = 1, + MessageCount = 0, + MessageInterval = 15, + MessageShown = {}, + MessageShow = false, + MessageFlash = false +} + + +function STAGE:New() + local self = BASE:Inherit( self, BASE:New() ) + self:F() + return self +end + +function STAGE:Execute( Mission, Client, Task ) + + local Valid = true + + return Valid +end + +function STAGE:Executing( Mission, Client, Task ) + +end + +function STAGE:Validate( Mission, Client, Task ) + local Valid = true + + return Valid +end + + +STAGEBRIEF = { + ClassName = "BRIEF", + MSG = { ID = "Brief", TIME = 1 }, + Name = "Brief", + StageBriefingTime = 0, + StageBriefingDuration = 1 +} + +function STAGEBRIEF:New() + local self = BASE:Inherit( self, STAGE:New() ) + self:F() + self.StageType = 'CLIENT' + return self +end + +--- Execute +-- @param #STAGEBRIEF self +-- @param Mission#MISSION Mission +-- @param Client#CLIENT Client +-- @param Task#TASK Task +-- @return #boolean +function STAGEBRIEF:Execute( Mission, Client, Task ) + local Valid = BASE:Inherited(self):Execute( Mission, Client, Task ) + self:F() + Client:ShowMissionBriefing( Mission.MissionBriefing ) + self.StageBriefingTime = timer.getTime() + return Valid +end + +function STAGEBRIEF:Validate( Mission, Client, Task ) + local Valid = STAGE:Validate( Mission, Client, Task ) + self:T() + + if timer.getTime() - self.StageBriefingTime <= self.StageBriefingDuration then + return 0 + else + self.StageBriefingTime = timer.getTime() + return 1 + end + +end + + +STAGESTART = { + ClassName = "START", + MSG = { ID = "Start", TIME = 1 }, + Name = "Start", + StageStartTime = 0, + StageStartDuration = 1 +} + +function STAGESTART:New() + local self = BASE:Inherit( self, STAGE:New() ) + self:F() + self.StageType = 'CLIENT' + return self +end + +function STAGESTART:Execute( Mission, Client, Task ) + self:F() + local Valid = BASE:Inherited(self):Execute( Mission, Client, Task ) + if Task.TaskBriefing then + Client:Message( Task.TaskBriefing, 30, Mission.Name .. "/Stage", "Command" ) + else + Client:Message( 'Task ' .. Task.TaskNumber .. '.', 30, Mission.Name .. "/Stage", "Command" ) + end + self.StageStartTime = timer.getTime() + return Valid +end + +function STAGESTART:Validate( Mission, Client, Task ) + self:F() + local Valid = STAGE:Validate( Mission, Client, Task ) + + if timer.getTime() - self.StageStartTime <= self.StageStartDuration then + return 0 + else + self.StageStartTime = timer.getTime() + return 1 + end + + return 1 + +end + +STAGE_CARGO_LOAD = { + ClassName = "STAGE_CARGO_LOAD" +} + +function STAGE_CARGO_LOAD:New() + local self = BASE:Inherit( self, STAGE:New() ) + self:F() + self.StageType = 'CLIENT' + return self +end + +function STAGE_CARGO_LOAD:Execute( Mission, Client, Task ) + self:F() + local Valid = BASE:Inherited(self):Execute( Mission, Client, Task ) + + for LoadCargoID, LoadCargo in pairs( Task.Cargos.LoadCargos ) do + LoadCargo:Load( Client ) + end + + if Mission.MissionReportFlash and Client:IsTransport() then + Client:ShowCargo() + end + + return Valid +end + +function STAGE_CARGO_LOAD:Validate( Mission, Client, Task ) + self:F() + local Valid = STAGE:Validate( Mission, Client, Task ) + + return 1 +end + + +STAGE_CARGO_INIT = { + ClassName = "STAGE_CARGO_INIT" +} + +function STAGE_CARGO_INIT:New() + local self = BASE:Inherit( self, STAGE:New() ) + self:F() + self.StageType = 'CLIENT' + return self +end + +function STAGE_CARGO_INIT:Execute( Mission, Client, Task ) + self:F() + local Valid = BASE:Inherited(self):Execute( Mission, Client, Task ) + + for InitLandingZoneID, InitLandingZone in pairs( Task.LandingZones.LandingZones ) do + self:T( InitLandingZone ) + InitLandingZone:Spawn() + end + + + self:T( Task.Cargos.InitCargos ) + for InitCargoID, InitCargoData in pairs( Task.Cargos.InitCargos ) do + self:T( { InitCargoData } ) + InitCargoData:Spawn( Client ) + end + + return Valid +end + + +function STAGE_CARGO_INIT:Validate( Mission, Client, Task ) + self:F() + local Valid = STAGE:Validate( Mission, Client, Task ) + + return 1 +end + + + +STAGEROUTE = { + ClassName = "STAGEROUTE", + MSG = { ID = "Route", TIME = 5 }, + Frequency = STAGE.FREQUENCY.REPEAT, + Name = "Route" +} + +function STAGEROUTE:New() + local self = BASE:Inherit( self, STAGE:New() ) + self:F() + self.StageType = 'CLIENT' + self.MessageSwitch = true + return self +end + + +--- Execute the routing. +-- @param #STAGEROUTE self +-- @param Mission#MISSION Mission +-- @param Client#CLIENT Client +-- @param Task#TASK Task +function STAGEROUTE:Execute( Mission, Client, Task ) + self:F() + local Valid = BASE:Inherited(self):Execute( Mission, Client, Task ) + + local RouteMessage = "Fly to: " + self:T( Task.LandingZones ) + for LandingZoneID, LandingZoneName in pairs( Task.LandingZones.LandingZoneNames ) do + RouteMessage = RouteMessage .. "\n " .. LandingZoneName .. ' at ' .. routines.getBRStringZone( { zone = LandingZoneName, ref = Client:GetClientGroupDCSUnit():getPoint(), true, true } ) .. ' km.' + end + + if Client:IsMultiSeated() then + Client:Message( RouteMessage, self.MSG.TIME, Mission.Name .. "/StageRoute", "Co-Pilot", 20 ) + else + Client:Message( RouteMessage, self.MSG.TIME, Mission.Name .. "/StageRoute", "Command", 20 ) + end + + + if Mission.MissionReportFlash and Client:IsTransport() then + Client:ShowCargo() + end + + return Valid +end + +function STAGEROUTE:Validate( Mission, Client, Task ) + self:F() + local Valid = STAGE:Validate( Mission, Client, Task ) + + -- check if the Client is in the landing zone + self:T( Task.LandingZones.LandingZoneNames ) + Task.CurrentLandingZoneName = routines.IsUnitNearZonesRadius( Client:GetClientGroupDCSUnit(), Task.LandingZones.LandingZoneNames, 500 ) + + if Task.CurrentLandingZoneName then + + Task.CurrentLandingZone = Task.LandingZones.LandingZones[Task.CurrentLandingZoneName].CargoZone + Task.CurrentCargoZone = Task.LandingZones.LandingZones[Task.CurrentLandingZoneName] + + if Task.CurrentCargoZone then + if not Task.Signalled then + Task.Signalled = Task.CurrentCargoZone:Signal() + end + end + + self:T( 1 ) + return 1 + end + + self:T( 0 ) + return 0 +end + + + +STAGELANDING = { + ClassName = "STAGELANDING", + MSG = { ID = "Landing", TIME = 10 }, + Name = "Landing", + Signalled = false +} + +function STAGELANDING:New() + local self = BASE:Inherit( self, STAGE:New() ) + self:F() + self.StageType = 'CLIENT' + return self +end + +--- Execute the landing coordination. +-- @param #STAGELANDING self +-- @param Mission#MISSION Mission +-- @param Client#CLIENT Client +-- @param Task#TASK Task +function STAGELANDING:Execute( Mission, Client, Task ) + self:F() + + if Client:IsMultiSeated() then + Client:Message( "We have arrived at the landing zone.", self.MSG.TIME, Mission.Name .. "/StageArrived", "Co-Pilot", 10 ) + else + Client:Message( "You have arrived at the landing zone.", self.MSG.TIME, Mission.Name .. "/StageArrived", "Command", 10 ) + end + + Task.HostUnit = Task.CurrentCargoZone:GetHostUnit() + + self:T( { Task.HostUnit } ) + + if Task.HostUnit then + + Task.HostUnitName = Task.HostUnit:GetPrefix() + Task.HostUnitTypeName = Task.HostUnit:GetTypeName() + + local HostMessage = "" + Task.CargoNames = "" + + local IsFirst = true + + for CargoID, Cargo in pairs( CARGOS ) do + if Cargo.CargoType == Task.CargoType then + + if Cargo:IsLandingRequired() then + self:T( "Task for cargo " .. Cargo.CargoType .. " requires landing.") + Task.IsLandingRequired = true + end + + if Cargo:IsSlingLoad() then + self:T( "Task for cargo " .. Cargo.CargoType .. " is a slingload.") + Task.IsSlingLoad = true + end + + if IsFirst then + IsFirst = false + Task.CargoNames = Task.CargoNames .. Cargo.CargoName .. "( " .. Cargo.CargoWeight .. " )" + else + Task.CargoNames = Task.CargoNames .. "; " .. Cargo.CargoName .. "( " .. Cargo.CargoWeight .. " )" + end + end + end + + if Task.IsLandingRequired then + HostMessage = "Land the helicopter to " .. Task.TEXT[1] .. " " .. Task.CargoNames .. "." + else + HostMessage = "Use the Radio menu and F6 to find the cargo, then fly or land near the cargo and " .. Task.TEXT[1] .. " " .. Task.CargoNames .. "." + end + + local Host = "Command" + if Task.HostUnitName then + Host = Task.HostUnitName .. " (" .. Task.HostUnitTypeName .. ")" + else + if Client:IsMultiSeated() then + Host = "Co-Pilot" + end + end + + Client:Message( HostMessage, self.MSG.TIME, Mission.Name .. "/STAGELANDING.EXEC." .. Host, Host, 10 ) + + end +end + +function STAGELANDING:Validate( Mission, Client, Task ) + self:F() + + Task.CurrentLandingZoneName = routines.IsUnitNearZonesRadius( Client:GetClientGroupDCSUnit(), Task.LandingZones.LandingZoneNames, 500 ) + if Task.CurrentLandingZoneName then + + -- Client is in de landing zone. + self:T( Task.CurrentLandingZoneName ) + + Task.CurrentLandingZone = Task.LandingZones.LandingZones[Task.CurrentLandingZoneName].CargoZone + Task.CurrentCargoZone = Task.LandingZones.LandingZones[Task.CurrentLandingZoneName] + + if Task.CurrentCargoZone then + if not Task.Signalled then + Task.Signalled = Task.CurrentCargoZone:Signal() + end + end + else + if Task.CurrentLandingZone then + Task.CurrentLandingZone = nil + end + if Task.CurrentCargoZone then + Task.CurrentCargoZone = nil + end + Task.Signalled = false + Task:RemoveCargoMenus( Client ) + self:T( -1 ) + return -1 + end + + + local DCSUnitVelocityVec3 = Client:GetClientGroupDCSUnit():getVelocity() + local DCSUnitVelocity = ( DCSUnitVelocityVec3.x ^2 + DCSUnitVelocityVec3.y ^2 + DCSUnitVelocityVec3.z ^2 ) ^ 0.5 + + local DCSUnitPointVec3 = Client:GetClientGroupDCSUnit():getPoint() + local LandHeight = land.getHeight( { x = DCSUnitPointVec3.x, y = DCSUnitPointVec3.z } ) + local DCSUnitHeight = DCSUnitPointVec3.y - LandHeight + + self:T( { Task.IsLandingRequired, Client:GetClientGroupDCSUnit():inAir() } ) + if Task.IsLandingRequired and not Client:GetClientGroupDCSUnit():inAir() then + self:T( 1 ) + Task.IsInAirTestRequired = true + return 1 + end + + self:T( { DCSUnitVelocity, DCSUnitHeight, LandHeight, Task.CurrentCargoZone.SignalHeight } ) + if Task.IsLandingRequired and DCSUnitVelocity <= 0.05 and DCSUnitHeight <= Task.CurrentCargoZone.SignalHeight then + self:T( 1 ) + Task.IsInAirTestRequired = false + return 1 + end + + self:T( 0 ) + return 0 +end + +STAGELANDED = { + ClassName = "STAGELANDED", + MSG = { ID = "Land", TIME = 10 }, + Name = "Landed", + MenusAdded = false +} + +function STAGELANDED:New() + local self = BASE:Inherit( self, STAGE:New() ) + self:F() + self.StageType = 'CLIENT' + return self +end + +function STAGELANDED:Execute( Mission, Client, Task ) + self:F() + + if Task.IsLandingRequired then + + local Host = "Command" + if Task.HostUnitName then + Host = Task.HostUnitName .. " (" .. Task.HostUnitTypeName .. ")" + else + if Client:IsMultiSeated() then + Host = "Co-Pilot" + end + end + + Client:Message( 'You have landed within the landing zone. Use the radio menu (F10) to ' .. Task.TEXT[1] .. ' the ' .. Task.CargoType .. '.', + self.MSG.TIME, Mission.Name .. "/STAGELANDED.EXEC" .. Host, Host ) + + if not self.MenusAdded then + Task.Cargo = nil + Task:RemoveCargoMenus( Client ) + Task:AddCargoMenus( Client, CARGOS, 250 ) + end + end +end + + + +function STAGELANDED:Validate( Mission, Client, Task ) + self:F() + + if not routines.IsUnitNearZonesRadius( Client:GetClientGroupDCSUnit(), Task.CurrentLandingZoneName, 500 ) then + self:T( "Client is not anymore in the landing zone, go back to stage Route, and remove cargo menus." ) + Task.Signalled = false + Task:RemoveCargoMenus( Client ) + self:T( -2 ) + return -2 + end + + local DCSUnitVelocityVec3 = Client:GetClientGroupDCSUnit():getVelocity() + local DCSUnitVelocity = ( DCSUnitVelocityVec3.x ^2 + DCSUnitVelocityVec3.y ^2 + DCSUnitVelocityVec3.z ^2 ) ^ 0.5 + + local DCSUnitPointVec3 = Client:GetClientGroupDCSUnit():getPoint() + local LandHeight = land.getHeight( { x = DCSUnitPointVec3.x, y = DCSUnitPointVec3.z } ) + local DCSUnitHeight = DCSUnitPointVec3.y - LandHeight + + self:T( { Task.IsLandingRequired, Client:GetClientGroupDCSUnit():inAir() } ) + if Task.IsLandingRequired and Task.IsInAirTestRequired == true and Client:GetClientGroupDCSUnit():inAir() then + self:T( "Client went back in the air. Go back to stage Landing." ) + self:T( -1 ) + return -1 + end + + self:T( { DCSUnitVelocity, DCSUnitHeight, LandHeight, Task.CurrentCargoZone.SignalHeight } ) + if Task.IsLandingRequired and Task.IsInAirTestRequired == false and DCSUnitVelocity >= 2 and DCSUnitHeight >= Task.CurrentCargoZone.SignalHeight then + self:T( "It seems the Client went back in the air and over the boundary limits. Go back to stage Landing." ) + self:T( -1 ) + return -1 + end + + -- Wait until cargo is selected from the menu. + if Task.IsLandingRequired then + if not Task.Cargo then + self:T( 0 ) + return 0 + end + end + + self:T( 1 ) + return 1 +end + +STAGEUNLOAD = { + ClassName = "STAGEUNLOAD", + MSG = { ID = "Unload", TIME = 10 }, + Name = "Unload" +} + +function STAGEUNLOAD:New() + local self = BASE:Inherit( self, STAGE:New() ) + self:F() + self.StageType = 'CLIENT' + return self +end + +--- Coordinate UnLoading +-- @param #STAGEUNLOAD self +-- @param Mission#MISSION Mission +-- @param Client#CLIENT Client +-- @param Task#TASK Task +function STAGEUNLOAD:Execute( Mission, Client, Task ) + self:F() + + if Client:IsMultiSeated() then + Client:Message( 'The ' .. Task.CargoType .. ' are being ' .. Task.TEXT[2] .. ' within the landing zone. Wait until the helicopter is ' .. Task.TEXT[3] .. '.', + self.MSG.TIME, Mission.Name .. "/StageUnLoad", "Co-Pilot" ) + else + Client:Message( 'You are unloading the ' .. Task.CargoType .. ' ' .. Task.TEXT[2] .. ' within the landing zone. Wait until the helicopter is ' .. Task.TEXT[3] .. '.', + self.MSG.TIME, Mission.Name .. "/StageUnLoad", "Command" ) + end + Task:RemoveCargoMenus( Client ) +end + +function STAGEUNLOAD:Executing( Mission, Client, Task ) + self:F() + env.info( 'STAGEUNLOAD:Executing() Task.Cargo.CargoName = ' .. Task.Cargo.CargoName ) + + local TargetZoneName + + if Task.TargetZoneName then + TargetZoneName = Task.TargetZoneName + else + TargetZoneName = Task.CurrentLandingZoneName + end + + if Task.Cargo:UnLoad( Client, TargetZoneName ) then + Task.ExecuteStage = _TransportExecuteStage.SUCCESS + if Mission.MissionReportFlash then + Client:ShowCargo() + end + end +end + +--- Validate UnLoading +-- @param #STAGEUNLOAD self +-- @param Mission#MISSION Mission +-- @param Client#CLIENT Client +-- @param Task#TASK Task +function STAGEUNLOAD:Validate( Mission, Client, Task ) + self:F() + env.info( 'STAGEUNLOAD:Validate()' ) + + if routines.IsUnitNearZonesRadius( Client:GetClientGroupDCSUnit(), Task.CurrentLandingZoneName, 500 ) then + else + Task.ExecuteStage = _TransportExecuteStage.FAILED + Task:RemoveCargoMenus( Client ) + if Client:IsMultiSeated() then + Client:Message( 'The ' .. Task.CargoType .. " haven't been successfully " .. Task.TEXT[3] .. ' within the landing zone. Task and mission has failed.', + _TransportStageMsgTime.DONE, Mission.Name .. "/StageFailure", "Co-Pilot" ) + else + Client:Message( 'The ' .. Task.CargoType .. " haven't been successfully " .. Task.TEXT[3] .. ' within the landing zone. Task and mission has failed.', + _TransportStageMsgTime.DONE, Mission.Name .. "/StageFailure", "Command" ) + end + return 1 + end + + if not Client:GetClientGroupDCSUnit():inAir() then + else + Task.ExecuteStage = _TransportExecuteStage.FAILED + Task:RemoveCargoMenus( Client ) + if Client:IsMultiSeated() then + Client:Message( 'The ' .. Task.CargoType .. " haven't been successfully " .. Task.TEXT[3] .. ' within the landing zone. Task and mission has failed.', + _TransportStageMsgTime.DONE, Mission.Name .. "/StageFailure", "Co-Pilot" ) + else + Client:Message( 'The ' .. Task.CargoType .. " haven't been successfully " .. Task.TEXT[3] .. ' within the landing zone. Task and mission has failed.', + _TransportStageMsgTime.DONE, Mission.Name .. "/StageFailure", "Command" ) + end + return 1 + end + + if Task.ExecuteStage == _TransportExecuteStage.SUCCESS then + if Client:IsMultiSeated() then + Client:Message( 'The ' .. Task.CargoType .. ' have been sucessfully ' .. Task.TEXT[3] .. ' within the landing zone.', _TransportStageMsgTime.DONE, Mission.Name .. "/Stage", "Co-Pilot" ) + else + Client:Message( 'The ' .. Task.CargoType .. ' have been sucessfully ' .. Task.TEXT[3] .. ' within the landing zone.', _TransportStageMsgTime.DONE, Mission.Name .. "/Stage", "Command" ) + end + Task:RemoveCargoMenus( Client ) + Task.MissionTask:AddGoalCompletion( Task.MissionTask.GoalVerb, Task.CargoName, 1 ) -- We set the cargo as one more goal completed in the mission. + return 1 + end + + return 1 +end + +STAGELOAD = { + ClassName = "STAGELOAD", + MSG = { ID = "Load", TIME = 10 }, + Name = "Load" +} + +function STAGELOAD:New() + local self = BASE:Inherit( self, STAGE:New() ) + self:F() + self.StageType = 'CLIENT' + return self +end + +function STAGELOAD:Execute( Mission, Client, Task ) + self:F() + + if not Task.IsSlingLoad then + + local Host = "Command" + if Task.HostUnitName then + Host = Task.HostUnitName .. " (" .. Task.HostUnitTypeName .. ")" + else + if Client:IsMultiSeated() then + Host = "Co-Pilot" + end + end + + Client:Message( 'The ' .. Task.CargoType .. ' are being ' .. Task.TEXT[2] .. ' within the landing zone. Wait until the helicopter is ' .. Task.TEXT[3] .. '.', + _TransportStageMsgTime.EXECUTING, Mission.Name .. "/STAGELOAD.EXEC." .. Host, Host ) + + -- Route the cargo to the Carrier + + Task.Cargo:OnBoard( Client, Task.CurrentCargoZone, Task.OnBoardSide ) + Task.ExecuteStage = _TransportExecuteStage.EXECUTING + else + Task.ExecuteStage = _TransportExecuteStage.EXECUTING + end +end + +function STAGELOAD:Executing( Mission, Client, Task ) + self:F() + + -- If the Cargo is ready to be loaded, load it into the Client. + + local Host = "Command" + if Task.HostUnitName then + Host = Task.HostUnitName .. " (" .. Task.HostUnitTypeName .. ")" + else + if Client:IsMultiSeated() then + Host = "Co-Pilot" + end + end + + if not Task.IsSlingLoad then + self:T( Task.Cargo.CargoName) + + if Task.Cargo:OnBoarded( Client, Task.CurrentCargoZone ) then + + -- Load the Cargo onto the Client + Task.Cargo:Load( Client ) + + -- Message to the pilot that cargo has been loaded. + Client:Message( "The cargo " .. Task.Cargo.CargoName .. " has been loaded in our helicopter.", + 20, Mission.Name .. "/STAGELANDING.LOADING1." .. Host, Host ) + Task.ExecuteStage = _TransportExecuteStage.SUCCESS + + Client:ShowCargo() + end + else + Client:Message( "Hook the " .. Task.CargoNames .. " onto the helicopter " .. Task.TEXT[3] .. " within the landing zone.", + _TransportStageMsgTime.EXECUTING, Mission.Name .. "/STAGELOAD.LOADING.1." .. Host, Host , 10 ) + for CargoID, Cargo in pairs( CARGOS ) do + self:T( "Cargo.CargoName = " .. Cargo.CargoName ) + + if Cargo:IsSlingLoad() then + local CargoStatic = StaticObject.getByName( Cargo.CargoStaticName ) + if CargoStatic then + self:T( "Cargo is found in the DCS simulator.") + local CargoStaticPosition = CargoStatic:getPosition().p + self:T( "Cargo Position x = " .. CargoStaticPosition.x .. ", y = " .. CargoStaticPosition.y .. ", z = " .. CargoStaticPosition.z ) + local CargoStaticHeight = routines.GetUnitHeight( CargoStatic ) + if CargoStaticHeight > 5 then + self:T( "Cargo is airborne.") + Cargo:StatusLoaded() + Task.Cargo = Cargo + Client:Message( 'The Cargo has been successfully hooked onto the helicopter and is now being sling loaded. Fly outside the landing zone.', + self.MSG.TIME, Mission.Name .. "/STAGELANDING.LOADING.2." .. Host, Host ) + Task.ExecuteStage = _TransportExecuteStage.SUCCESS + break + end + else + self:T( "Cargo not found in the DCS simulator." ) + end + end + end + end + +end + +function STAGELOAD:Validate( Mission, Client, Task ) + self:F() + + self:T( "Task.CurrentLandingZoneName = " .. Task.CurrentLandingZoneName ) + + local Host = "Command" + if Task.HostUnitName then + Host = Task.HostUnitName .. " (" .. Task.HostUnitTypeName .. ")" + else + if Client:IsMultiSeated() then + Host = "Co-Pilot" + end + end + + if not Task.IsSlingLoad then + if not routines.IsUnitNearZonesRadius( Client:GetClientGroupDCSUnit(), Task.CurrentLandingZoneName, 500 ) then + Task:RemoveCargoMenus( Client ) + Task.ExecuteStage = _TransportExecuteStage.FAILED + Task.CargoName = nil + Client:Message( "The " .. Task.CargoType .. " loading has been aborted. You flew outside the pick-up zone while loading. ", + self.MSG.TIME, Mission.Name .. "/STAGELANDING.VALIDATE.1." .. Host, Host ) + self:T( -1 ) + return -1 + end + + local DCSUnitVelocityVec3 = Client:GetClientGroupDCSUnit():getVelocity() + local DCSUnitVelocity = ( DCSUnitVelocityVec3.x ^2 + DCSUnitVelocityVec3.y ^2 + DCSUnitVelocityVec3.z ^2 ) ^ 0.5 + + local DCSUnitPointVec3 = Client:GetClientGroupDCSUnit():getPoint() + local LandHeight = land.getHeight( { x = DCSUnitPointVec3.x, y = DCSUnitPointVec3.z } ) + local DCSUnitHeight = DCSUnitPointVec3.y - LandHeight + + self:T( { Task.IsLandingRequired, Client:GetClientGroupDCSUnit():inAir() } ) + if Task.IsLandingRequired and Task.IsInAirTestRequired == true and Client:GetClientGroupDCSUnit():inAir() then + Task:RemoveCargoMenus( Client ) + Task.ExecuteStage = _TransportExecuteStage.FAILED + Task.CargoName = nil + Client:Message( "The " .. Task.CargoType .. " loading has been aborted. Re-start the " .. Task.TEXT[3] .. " process. Don't fly outside the pick-up zone.", + self.MSG.TIME, Mission.Name .. "/STAGELANDING.VALIDATE.1." .. Host, Host ) + self:T( -1 ) + return -1 + end + + self:T( { DCSUnitVelocity, DCSUnitHeight, LandHeight, Task.CurrentCargoZone.SignalHeight } ) + if Task.IsLandingRequired and Task.IsInAirTestRequired == false and DCSUnitVelocity >= 2 and DCSUnitHeight >= Task.CurrentCargoZone.SignalHeight then + Task:RemoveCargoMenus( Client ) + Task.ExecuteStage = _TransportExecuteStage.FAILED + Task.CargoName = nil + Client:Message( "The " .. Task.CargoType .. " loading has been aborted. Re-start the " .. Task.TEXT[3] .. " process. Don't fly outside the pick-up zone.", + self.MSG.TIME, Mission.Name .. "/STAGELANDING.VALIDATE.1." .. Host, Host ) + self:T( -1 ) + return -1 + end + + if Task.ExecuteStage == _TransportExecuteStage.SUCCESS then + Task:RemoveCargoMenus( Client ) + Client:Message( "Good Job. The " .. Task.CargoType .. " has been sucessfully " .. Task.TEXT[3] .. " within the landing zone.", + self.MSG.TIME, Mission.Name .. "/STAGELANDING.VALIDATE.3." .. Host, Host ) + Task.MissionTask:AddGoalCompletion( Task.MissionTask.GoalVerb, Task.CargoName, 1 ) + self:T( 1 ) + return 1 + end + + else + if Task.ExecuteStage == _TransportExecuteStage.SUCCESS then + CargoStatic = StaticObject.getByName( Task.Cargo.CargoStaticName ) + if CargoStatic and not routines.IsStaticInZones( CargoStatic, Task.CurrentLandingZoneName ) then + Client:Message( "Good Job. The " .. Task.CargoType .. " has been sucessfully " .. Task.TEXT[3] .. " and flown outside of the landing zone.", + self.MSG.TIME, Mission.Name .. "/STAGELANDING.VALIDATE.4." .. Host, Host ) + Task.MissionTask:AddGoalCompletion( Task.MissionTask.GoalVerb, Task.Cargo.CargoName, 1 ) + self:T( 1 ) + return 1 + end + end + + end + + + self:T( 0 ) + return 0 +end + + +STAGEDONE = { + ClassName = "STAGEDONE", + MSG = { ID = "Done", TIME = 10 }, + Name = "Done" +} + +function STAGEDONE:New() + local self = BASE:Inherit( self, STAGE:New() ) + self:F() + self.StageType = 'AI' + return self +end + +function STAGEDONE:Execute( Mission, Client, Task ) + self:F() + +end + +function STAGEDONE:Validate( Mission, Client, Task ) + self:F() + + Task:Done() + + return 0 +end + +STAGEARRIVE = { + ClassName = "STAGEARRIVE", + MSG = { ID = "Arrive", TIME = 10 }, + Name = "Arrive" +} + +function STAGEARRIVE:New() + local self = BASE:Inherit( self, STAGE:New() ) + self:F() + self.StageType = 'CLIENT' + return self +end + + +--- Execute Arrival +-- @param #STAGEARRIVE self +-- @param Mission#MISSION Mission +-- @param Client#CLIENT Client +-- @param Task#TASK Task +function STAGEARRIVE:Execute( Mission, Client, Task ) + self:F() + + if Client:IsMultiSeated() then + Client:Message( 'We have arrived at ' .. Task.CurrentLandingZoneName .. ".", self.MSG.TIME, Mission.Name .. "/Stage", "Co-Pilot" ) + else + Client:Message( 'We have arrived at ' .. Task.CurrentLandingZoneName .. ".", self.MSG.TIME, Mission.Name .. "/Stage", "Command" ) + end + +end + +function STAGEARRIVE:Validate( Mission, Client, Task ) + self:F() + + Task.CurrentLandingZoneID = routines.IsUnitInZones( Client:GetClientGroupDCSUnit(), Task.LandingZones ) + if ( Task.CurrentLandingZoneID ) then + else + return -1 + end + + return 1 +end + +STAGEGROUPSDESTROYED = { + ClassName = "STAGEGROUPSDESTROYED", + DestroyGroupSize = -1, + Frequency = STAGE.FREQUENCY.REPEAT, + MSG = { ID = "DestroyGroup", TIME = 10 }, + Name = "GroupsDestroyed" +} + +function STAGEGROUPSDESTROYED:New() + local self = BASE:Inherit( self, STAGE:New() ) + self:F() + self.StageType = 'AI' + return self +end + +--function STAGEGROUPSDESTROYED:Execute( Mission, Client, Task ) +-- +-- Client:Message( 'Task: Still ' .. DestroyGroupSize .. " of " .. Task.DestroyGroupCount .. " " .. Task.DestroyGroupType .. " to be destroyed!", self.MSG.TIME, Mission.Name .. "/Stage" ) +-- +--end + +function STAGEGROUPSDESTROYED:Validate( Mission, Client, Task ) + self:F() + + if Task.MissionTask:IsGoalReached() then + return 1 + else + return 0 + end +end + +function STAGEGROUPSDESTROYED:Execute( Mission, Client, Task ) + self:F() + self:T( { Task.ClassName, Task.Destroyed } ) + --env.info( 'Event Table Task = ' .. tostring(Task) ) + +end + + + + + + + + + + + + + +--[[ + _TransportStage: Defines the different stages of which of transport missions can be in. This table is internal and is used to control the sequence of messages, actions and flow. + + - _TransportStage.START + - _TransportStage.ROUTE + - _TransportStage.LAND + - _TransportStage.EXECUTE + - _TransportStage.DONE + - _TransportStage.REMOVE +--]] +_TransportStage = { + HOLD = "HOLD", + START = "START", + ROUTE = "ROUTE", + LANDING = "LANDING", + LANDED = "LANDED", + EXECUTING = "EXECUTING", + LOAD = "LOAD", + UNLOAD = "UNLOAD", + DONE = "DONE", + NEXT = "NEXT" +} + +_TransportStageMsgTime = { + HOLD = 10, + START = 60, + ROUTE = 5, + LANDING = 10, + LANDED = 30, + EXECUTING = 30, + LOAD = 30, + UNLOAD = 30, + DONE = 30, + NEXT = 0 +} + +_TransportStageTime = { + HOLD = 10, + START = 5, + ROUTE = 5, + LANDING = 1, + LANDED = 1, + EXECUTING = 5, + LOAD = 5, + UNLOAD = 5, + DONE = 1, + NEXT = 0 +} + +_TransportStageAction = { + REPEAT = -1, + NONE = 0, + ONCE = 1 +} +--- The TASK Classes define major end-to-end activities within a MISSION. The TASK Class is the Master Class to orchestrate these activities. From this class, many concrete TASK classes are inherited. +-- @module TASK + +Include.File( "Routines" ) +Include.File( "Base" ) +Include.File( "Mission" ) +Include.File( "Client" ) +Include.File( "Stage" ) + +--- The TASK class +-- @type TASK +-- @extends Base#BASE +TASK = { + + -- Defines the different signal types with a Task. + SIGNAL = { + COLOR = { + RED = { ID = 1, COLOR = trigger.smokeColor.Red, TEXT = "A red" }, + GREEN = { ID = 2, COLOR = trigger.smokeColor.Green, TEXT = "A green" }, + BLUE = { ID = 3, COLOR = trigger.smokeColor.Blue, TEXT = "A blue" }, + WHITE = { ID = 4, COLOR = trigger.smokeColor.White, TEXT = "A white" }, + ORANGE = { ID = 5, COLOR = trigger.smokeColor.Orange, TEXT = "An orange" } + }, + TYPE = { + SMOKE = { ID = 1, TEXT = "smoke" }, + FLARE = { ID = 2, TEXT = "flare" } + } + }, + ClassName = "TASK", + Mission = {}, -- Owning mission of the Task + Name = '', + Stages = {}, + Stage = {}, + Cargos = { + InitCargos = {}, + LoadCargos = {} + }, + LandingZones = { + LandingZoneNames = {}, + LandingZones = {} + }, + ActiveStage = 0, + TaskDone = false, + TaskFailed = false, + GoalTasks = {} +} + +--- Instantiates a new TASK Base. Should never be used. Interface Class. +-- @return TASK +function TASK:New() + local self = BASE:Inherit( self, BASE:New() ) + self:F() + + -- assign Task default values during construction + self.TaskBriefing = "Task: No Task." + self.Time = timer.getTime() + self.ExecuteStage = _TransportExecuteStage.NONE + + return self +end + +function TASK:SetStage( StageSequenceIncrement ) + self:F( { StageSequenceIncrement } ) + + local Valid = false + if StageSequenceIncrement ~= 0 then + self.ActiveStage = self.ActiveStage + StageSequenceIncrement + if 1 <= self.ActiveStage and self.ActiveStage <= #self.Stages then + self.Stage = self.Stages[self.ActiveStage] + self:T( { self.Stage.Name } ) + self.Frequency = self.Stage.Frequency + Valid = true + else + Valid = false + env.info( "TASK:SetStage() self.ActiveStage is smaller or larger than self.Stages array. self.ActiveStage = " .. self.ActiveStage ) + end + end + self.Time = timer.getTime() + return Valid +end + +function TASK:Init() + self:F() + self.ActiveStage = 0 + self:SetStage(1) + self.TaskDone = false + self.TaskFailed = false +end + + +--- Get progress of a TASK. +-- @return string GoalsText +function TASK:GetGoalProgress() + self:F2() + + local GoalsText = "" + for GoalVerb, GoalVerbData in pairs( self.GoalTasks ) do + local Goals = self:GetGoalCompletion( GoalVerb ) + if Goals and Goals ~= "" then + Goals = '(' .. Goals .. ')' + else + Goals = '( - )' + end + GoalsText = GoalsText .. GoalVerb .. ': ' .. self:GetGoalCount(GoalVerb) .. ' goals ' .. Goals .. ' of ' .. self:GetGoalTotal(GoalVerb) .. ' goals completed (' .. self:GetGoalPercentage(GoalVerb) .. '%); ' + end + + if GoalsText == "" then + GoalsText = "( - )" + end + + return GoalsText +end + +--- Show progress of a TASK. +-- @param MISSION Mission Group structure describing the Mission. +-- @param CLIENT Client Group structure describing the Client. +function TASK:ShowGoalProgress( Mission, Client ) + self:F2() + + local GoalsText = "" + for GoalVerb, GoalVerbData in pairs( self.GoalTasks ) do + if Mission:IsCompleted() then + else + local Goals = self:GetGoalCompletion( GoalVerb ) + if Goals and Goals ~= "" then + else + Goals = "-" + end + GoalsText = GoalsText .. self:GetGoalProgress() + end + end + + if Mission.MissionReportFlash or Mission.MissionReportShow then + Client:Message( GoalsText, 10, "/TASKPROGRESS" .. self.ClassName, "Mission Command: Task Status", 30 ) + end +end + +--- Sets a TASK to status Done. +function TASK:Done() + self:F2() + self.TaskDone = true +end + +--- Returns if a TASK is done. +-- @return bool +function TASK:IsDone() + self:F2( self.TaskDone ) + return self.TaskDone +end + +--- Sets a TASK to status failed. +function TASK:Failed() + self:F() + self.TaskFailed = true +end + +--- Returns if a TASk has failed. +-- @return bool +function TASK:IsFailed() + self:F2( self.TaskFailed ) + return self.TaskFailed +end + +function TASK:Reset( Mission, Client ) + self:F2() + self.ExecuteStage = _TransportExecuteStage.NONE +end + +--- Returns the Goals of a TASK +-- @return @table Goals +function TASK:GetGoals() + return self.GoalTasks +end + +--- Returns if a TASK has Goal(s). +-- @param #TASK self +-- @param #string GoalVerb is the name of the Goal of the TASK. +-- @return bool +function TASK:Goal( GoalVerb ) + self:F2( { GoalVerb } ) + if not GoalVerb then + GoalVerb = self.GoalVerb + end + self:T2( {self.GoalTasks[GoalVerb] } ) + if self.GoalTasks[GoalVerb] and self.GoalTasks[GoalVerb].GoalTotal > 0 then + return true + else + return false + end +end + +--- Sets the total Goals to be achieved of the Goal Name +-- @param number GoalTotal is the number of times the GoalVerb needs to be achieved. +-- @param ?string GoalVerb is the name of the Goal of the TASK. If the GoalVerb is not given, then the default TASK Goals will be used. +function TASK:SetGoalTotal( GoalTotal, GoalVerb ) + self:F2( { GoalTotal, GoalVerb } ) + + if not GoalVerb then + GoalVerb = self.GoalVerb + end + self.GoalTasks[GoalVerb] = {} + self.GoalTasks[GoalVerb].Goals = {} + self.GoalTasks[GoalVerb].GoalTotal = GoalTotal + self.GoalTasks[GoalVerb].GoalCount = 0 + return self +end + +--- Gets the total of Goals to be achieved within the TASK of the GoalVerb. +-- @param ?string GoalVerb is the name of the Goal of the TASK. If the GoalVerb is not given, then the default TASK Goals will be used. +function TASK:GetGoalTotal( GoalVerb ) + self:F2( { GoalVerb } ) + if not GoalVerb then + GoalVerb = self.GoalVerb + end + if self:Goal( GoalVerb ) then + return self.GoalTasks[GoalVerb].GoalTotal + else + return 0 + end +end + +--- Sets the total of Goals currently achieved within the TASK of the GoalVerb. +-- @param number GoalCount is the total number of Goals achieved within the TASK. +-- @param ?string GoalVerb is the name of the Goal of the TASK. If the GoalVerb is not given, then the default TASK Goals will be used. +-- @return TASK +function TASK:SetGoalCount( GoalCount, GoalVerb ) + self:F2() + if not GoalVerb then + GoalVerb = self.GoalVerb + end + if self:Goal( GoalVerb) then + self.GoalTasks[GoalVerb].GoalCount = GoalCount + end + return self +end + +--- Increments the total of Goals currently achieved within the TASK of the GoalVerb, with the given GoalCountIncrease. +-- @param number GoalCountIncrease is the number of new Goals achieved within the TASK. +-- @param ?string GoalVerb is the name of the Goal of the TASK. If the GoalVerb is not given, then the default TASK Goals will be used. +-- @return TASK +function TASK:IncreaseGoalCount( GoalCountIncrease, GoalVerb ) + self:F2( { GoalCountIncrease, GoalVerb } ) + if not GoalVerb then + GoalVerb = self.GoalVerb + end + if self:Goal( GoalVerb) then + self.GoalTasks[GoalVerb].GoalCount = self.GoalTasks[GoalVerb].GoalCount + GoalCountIncrease + end + return self +end + +--- Gets the total of Goals currently achieved within the TASK of the GoalVerb. +-- @param ?string GoalVerb is the name of the Goal of the TASK. If the GoalVerb is not given, then the default TASK Goals will be used. +-- @return TASK +function TASK:GetGoalCount( GoalVerb ) + self:F2() + if not GoalVerb then + GoalVerb = self.GoalVerb + end + if self:Goal( GoalVerb ) then + return self.GoalTasks[GoalVerb].GoalCount + else + return 0 + end +end + +--- Gets the percentage of Goals currently achieved within the TASK of the GoalVerb. +-- @param ?string GoalVerb is the name of the Goal of the TASK. If the GoalVerb is not given, then the default TASK Goals will be used. +-- @return TASK +function TASK:GetGoalPercentage( GoalVerb ) + self:F2() + if not GoalVerb then + GoalVerb = self.GoalVerb + end + if self:Goal( GoalVerb ) then + return math.floor( self:GetGoalCount( GoalVerb ) / self:GetGoalTotal( GoalVerb ) * 100 + .5 ) + else + return 100 + end +end + +--- Returns if all the Goals of the TASK were achieved. +-- @return bool +function TASK:IsGoalReached() + self:F2() + + local GoalReached = true + + for GoalVerb, Goals in pairs( self.GoalTasks ) do + self:T2( { "GoalVerb", GoalVerb } ) + if self:Goal( GoalVerb ) then + local GoalToDo = self:GetGoalTotal( GoalVerb ) - self:GetGoalCount( GoalVerb ) + self:T2( "GoalToDo = " .. GoalToDo ) + if GoalToDo <= 0 then + else + GoalReached = false + break + end + else + break + end + end + + self:T( { GoalReached, self.GoalTasks } ) + return GoalReached +end + +--- Adds an Additional Goal for the TASK to be achieved. +-- @param string GoalVerb is the name of the Goal of the TASK. +-- @param string GoalTask is a text describing the Goal of the TASK to be achieved. +-- @param number GoalIncrease is a number by which the Goal achievement is increasing. +function TASK:AddGoalCompletion( GoalVerb, GoalTask, GoalIncrease ) + self:F2( { GoalVerb, GoalTask, GoalIncrease } ) + + if self:Goal( GoalVerb ) then + self.GoalTasks[GoalVerb].Goals[#self.GoalTasks[GoalVerb].Goals+1] = GoalTask + self.GoalTasks[GoalVerb].GoalCount = self.GoalTasks[GoalVerb].GoalCount + GoalIncrease + end + return self +end + +--- Returns if the additional Goal for the TASK was completed. +-- @param ?string GoalVerb is the name of the Goal of the TASK. If the GoalVerb is not given, then the default TASK Goals will be used. +-- @return string Goals +function TASK:GetGoalCompletion( GoalVerb ) + self:F2( { GoalVerb } ) + + if self:Goal( GoalVerb ) then + local Goals = "" + for GoalID, GoalName in pairs( self.GoalTasks[GoalVerb].Goals ) do Goals = Goals .. GoalName .. " + " end + return Goals:gsub(" + $", ""), self.GoalTasks[GoalVerb].GoalCount + end +end + +function TASK.MenuAction( Parameter ) + Parameter.ReferenceTask.ExecuteStage = _TransportExecuteStage.EXECUTING + Parameter.ReferenceTask.Cargo = Parameter.CargoTask +end + +function TASK:StageExecute() + self:F() + + local Execute = false + + if self.Frequency == STAGE.FREQUENCY.REPEAT then + Execute = true + elseif self.Frequency == STAGE.FREQUENCY.NONE then + Execute = false + elseif self.Frequency >= 0 then + Execute = true + self.Frequency = self.Frequency - 1 + end + + return Execute + +end + +--- Work function to set signal events within a TASK. +function TASK:AddSignal( SignalUnitNames, SignalType, SignalColor, SignalHeight ) + self:F() + + local Valid = true + + if Valid then + if type( SignalUnitNames ) == "table" then + self.LandingZoneSignalUnitNames = SignalUnitNames + else + self.LandingZoneSignalUnitNames = { SignalUnitNames } + end + self.LandingZoneSignalType = SignalType + self.LandingZoneSignalColor = SignalColor + self.Signalled = false + if SignalHeight ~= nil then + self.LandingZoneSignalHeight = SignalHeight + else + self.LandingZoneSignalHeight = 0 + end + + if self.TaskBriefing then + self.TaskBriefing = self.TaskBriefing .. " " .. SignalColor.TEXT .. " " .. SignalType.TEXT .. " will be fired when entering the landing zone." + end + end + + return Valid +end + +--- When the CLIENT is approaching the landing zone, a RED SMOKE will be fired by an optional SignalUnitNames. +-- @param table|string SignalUnitNames Name of the Group that will fire the signal. If this parameter is NIL, the signal will be fired from the center of the landing zone. +-- @param number SignalHeight Altitude that the Signal should be fired... +function TASK:AddSmokeRed( SignalUnitNames, SignalHeight ) + self:F() + self:AddSignal( SignalUnitNames, TASK.SIGNAL.TYPE.SMOKE, TASK.SIGNAL.COLOR.RED, SignalHeight ) +end + +--- When the CLIENT is approaching the landing zone, a GREEN SMOKE will be fired by an optional SignalUnitNames. +-- @param table|string SignalUnitNames Name of the Group that will fire the signal. If this parameter is NIL, the signal will be fired from the center of the landing zone. +-- @param number SignalHeight Altitude that the Signal should be fired... +function TASK:AddSmokeGreen( SignalUnitNames, SignalHeight ) + self:F() + self:AddSignal( SignalUnitNames, TASK.SIGNAL.TYPE.SMOKE, TASK.SIGNAL.COLOR.GREEN, SignalHeight ) +end + +--- When the CLIENT is approaching the landing zone, a BLUE SMOKE will be fired by an optional SignalUnitNames. +-- @param table|string SignalUnitNames Name of the Group that will fire the signal. If this parameter is NIL, the signal will be fired from the center of the landing zone. +-- @param number SignalHeight Altitude that the Signal should be fired... +function TASK:AddSmokeBlue( SignalUnitNames, SignalHeight ) + self:F() + self:AddSignal( SignalUnitNames, TASK.SIGNAL.TYPE.SMOKE, TASK.SIGNAL.COLOR.BLUE, SignalHeight ) +end + +--- When the CLIENT is approaching the landing zone, a WHITE SMOKE will be fired by an optional SignalUnitNames. +-- @param table|string SignalUnitNames Name of the Group that will fire the signal. If this parameter is NIL, the signal will be fired from the center of the landing zone. +-- @param number SignalHeight Altitude that the Signal should be fired... +function TASK:AddSmokeWhite( SignalUnitNames, SignalHeight ) + self:F() + self:AddSignal( SignalUnitNames, TASK.SIGNAL.TYPE.SMOKE, TASK.SIGNAL.COLOR.WHITE, SignalHeight ) +end + +--- When the CLIENT is approaching the landing zone, an ORANGE SMOKE will be fired by an optional SignalUnitNames. +-- @param table|string SignalUnitNames Name of the Group that will fire the signal. If this parameter is NIL, the signal will be fired from the center of the landing zone. +-- @param number SignalHeight Altitude that the Signal should be fired... +function TASK:AddSmokeOrange( SignalUnitNames, SignalHeight ) + self:F() + self:AddSignal( SignalUnitNames, TASK.SIGNAL.TYPE.SMOKE, TASK.SIGNAL.COLOR.ORANGE, SignalHeight ) +end + +--- When the CLIENT is approaching the landing zone, a RED FLARE will be fired by an optional SignalUnitNames. +-- @param table|string SignalUnitNames Name of the Group that will fire the signal. If this parameter is NIL, the signal will be fired from the center of the landing zone. +-- @param number SignalHeight Altitude that the Signal should be fired... +function TASK:AddFlareRed( SignalUnitNames, SignalHeight ) + self:F() + self:AddSignal( SignalUnitNames, TASK.SIGNAL.TYPE.FLARE, TASK.SIGNAL.COLOR.RED, SignalHeight ) +end + +--- When the CLIENT is approaching the landing zone, a GREEN FLARE will be fired by an optional SignalUnitNames. +-- @param table|string SignalUnitNames Name of the Group that will fire the signal. If this parameter is NIL, the signal will be fired from the center of the landing zone. +-- @param number SignalHeight Altitude that the Signal should be fired... +function TASK:AddFlareGreen( SignalUnitNames, SignalHeight ) + self:F() + self:AddSignal( SignalUnitNames, TASK.SIGNAL.TYPE.FLARE, TASK.SIGNAL.COLOR.GREEN, SignalHeight ) +end + +--- When the CLIENT is approaching the landing zone, a BLUE FLARE will be fired by an optional SignalUnitNames. +-- @param table|string SignalUnitNames Name of the Group that will fire the signal. If this parameter is NIL, the signal will be fired from the center of the landing zone. +-- @param number SignalHeight Altitude that the Signal should be fired... +function TASK:AddFlareBlue( SignalUnitNames, SignalHeight ) + self:F() + self:AddSignal( SignalUnitNames, TASK.SIGNAL.TYPE.FLARE, TASK.SIGNAL.COLOR.BLUE, SignalHeight ) +end + +--- When the CLIENT is approaching the landing zone, a WHITE FLARE will be fired by an optional SignalUnitNames. +-- @param table|string SignalUnitNames Name of the Group that will fire the signal. If this parameter is NIL, the signal will be fired from the center of the landing zone. +-- @param number SignalHeight Altitude that the Signal should be fired... +function TASK:AddFlareWhite( SignalUnitNames, SignalHeight ) + self:F() + self:AddSignal( SignalUnitNames, TASK.SIGNAL.TYPE.FLARE, TASK.SIGNAL.COLOR.WHITE, SignalHeight ) +end + +--- When the CLIENT is approaching the landing zone, an ORANGE FLARE will be fired by an optional SignalUnitNames. +-- @param table|string SignalUnitNames Name of the Group that will fire the signal. If this parameter is NIL, the signal will be fired from the center of the landing zone. +-- @param number SignalHeight Altitude that the Signal should be fired... +function TASK:AddFlareOrange( SignalUnitNames, SignalHeight ) + self:F() + self:AddSignal( SignalUnitNames, TASK.SIGNAL.TYPE.FLARE, TASK.SIGNAL.COLOR.ORANGE, SignalHeight ) +end +--- A GOHOMETASK orchestrates the travel back to the home base, which is a specific zone defined within the ME. +-- @module GOHOMETASK + +Include.File("Task") + +--- The GOHOMETASK class +-- @type +GOHOMETASK = { + ClassName = "GOHOMETASK", +} + +--- Creates a new GOHOMETASK. +-- @param table{string,...}|string LandingZones Table of Landing Zone names where Home(s) are located. +-- @return GOHOMETASK +function GOHOMETASK:New( LandingZones ) + local self = BASE:Inherit( self, TASK:New() ) + self:F( { LandingZones } ) + local Valid = true + + Valid = routines.ValidateZone( LandingZones, "LandingZones", Valid ) + + if Valid then + self.Name = 'Fly Home' + self.TaskBriefing = "Task: Fly back to your home base. Your co-pilot will provide you with the directions (required flight angle in degrees) and the distance (in km) to your home base." + if type( LandingZones ) == "table" then + self.LandingZones = LandingZones + else + self.LandingZones = { LandingZones } + end + self.Stages = { STAGEBRIEF:New(), STAGESTART:New(), STAGEROUTE:New(), STAGEARRIVE:New(), STAGEDONE:New() } + self.SetStage( self, 1 ) + end + + return self +end +--- A DESTROYBASETASK will monitor the destruction of Groups and Units. This is a BASE class, other classes are derived from this class. +-- @module DESTROYBASETASK +-- @see DESTROYGROUPSTASK +-- @see DESTROYUNITTYPESTASK +-- @see DESTROY_RADARS_TASK + +Include.File("Task") + +--- The DESTROYBASETASK class +-- @type DESTROYBASETASK +DESTROYBASETASK = { + ClassName = "DESTROYBASETASK", + Destroyed = 0, + GoalVerb = "Destroy", + DestroyPercentage = 100, +} + +--- Creates a new DESTROYBASETASK. +-- @param #DESTROYBASETASK self +-- @param #string DestroyGroupType Text describing the group to be destroyed. f.e. "Radar Installations", "Ships", "Vehicles", "Command Centers". +-- @param #string DestroyUnitType Text describing the unit types to be destroyed. f.e. "SA-6", "Row Boats", "Tanks", "Tents". +-- @param #list<#string> DestroyGroupPrefixes Table of Prefixes of the Groups to be destroyed before task is completed. +-- @param #number DestroyPercentage defines the %-tage that needs to be destroyed to achieve mission success. eg. If in the Group there are 10 units, then a value of 75 would require 8 units to be destroyed from the Group to complete the @{TASK}. +-- @return DESTROYBASETASK +function DESTROYBASETASK:New( DestroyGroupType, DestroyUnitType, DestroyGroupPrefixes, DestroyPercentage ) + local self = BASE:Inherit( self, TASK:New() ) + self:F() + + self.Name = 'Destroy' + self.Destroyed = 0 + self.DestroyGroupPrefixes = DestroyGroupPrefixes + self.DestroyGroupType = DestroyGroupType + self.DestroyUnitType = DestroyUnitType + if DestroyPercentage then + self.DestroyPercentage = DestroyPercentage + end + self.TaskBriefing = "Task: Destroy " .. DestroyGroupType .. "." + self.Stages = { STAGEBRIEF:New(), STAGESTART:New(), STAGEGROUPSDESTROYED:New(), STAGEDONE:New() } + self.SetStage( self, 1 ) + + return self +end + +--- Handle the S_EVENT_DEAD events to validate the destruction of units for the task monitoring. +-- @param #DESTROYBASETASK self +-- @param Event#EVENTDATA Event structure of MOOSE. +function DESTROYBASETASK:EventDead( Event ) + self:F( { Event } ) + + if Event.IniDCSUnit then + local DestroyUnit = Event.IniDCSUnit + local DestroyUnitName = Event.IniDCSUnitName + local DestroyGroup = Event.IniDCSGroup + local DestroyGroupName = Event.IniDCSGroupName + + --TODO: I need to fix here if 2 groups in the mission have a similar name with GroupPrefix equal, then i should differentiate for which group the goal was reached! + --I may need to test if for the goalverb that group goal was reached or something. Need to think about it a bit more ... + local UnitsDestroyed = 0 + for DestroyGroupPrefixID, DestroyGroupPrefix in pairs( self.DestroyGroupPrefixes ) do + self:T( DestroyGroupPrefix ) + if string.find( DestroyGroupName, DestroyGroupPrefix, 1, true ) then + self:T( BASE:Inherited(self).ClassName ) + UnitsDestroyed = self:ReportGoalProgress( DestroyGroup, DestroyUnit ) + self:T( UnitsDestroyed ) + end + end + + self:T( { UnitsDestroyed } ) + self:IncreaseGoalCount( UnitsDestroyed, self.GoalVerb ) + end + +end + +--- Validate task completeness of DESTROYBASETASK. +-- @param DestroyGroup Group structure describing the group to be evaluated. +-- @param DestroyUnit Unit structure describing the Unit to be evaluated. +function DESTROYBASETASK:ReportGoalProgress( DestroyGroup, DestroyUnit ) + self:F() + + return 0 +end +--- DESTROYGROUPSTASK +-- @module DESTROYGROUPSTASK + +Include.File("DestroyBaseTask") + +--- The DESTROYGROUPSTASK class +-- @type +DESTROYGROUPSTASK = { + ClassName = "DESTROYGROUPSTASK", + GoalVerb = "Destroy Groups", +} + +--- Creates a new DESTROYGROUPSTASK. +-- @param #DESTROYGROUPSTASK self +-- @param #string DestroyGroupType String describing the group to be destroyed. +-- @param #string DestroyUnitType String describing the unit to be destroyed. +-- @param #list<#string> DestroyGroupNames Table of string containing the name of the groups to be destroyed before task is completed. +-- @param #number DestroyPercentage defines the %-tage that needs to be destroyed to achieve mission success. eg. If in the Group there are 10 units, then a value of 75 would require 8 units to be destroyed from the Group to complete the @{TASK}. +---@return DESTROYGROUPSTASK +function DESTROYGROUPSTASK:New( DestroyGroupType, DestroyUnitType, DestroyGroupNames, DestroyPercentage ) + local self = BASE:Inherit( self, DESTROYBASETASK:New( DestroyGroupType, DestroyUnitType, DestroyGroupNames, DestroyPercentage ) ) + self:F() + + self.Name = 'Destroy Groups' + self.GoalVerb = "Destroy " .. DestroyGroupType + + _EVENTDISPATCHER:OnDead( self.EventDead , self ) + _EVENTDISPATCHER:OnCrash( self.EventDead , self ) + + return self +end + +--- Report Goal Progress. +-- @param #DESTROYGROUPSTASK self +-- @param DCSGroup#Group DestroyGroup Group structure describing the group to be evaluated. +-- @param DCSUnit#Unit DestroyUnit Unit structure describing the Unit to be evaluated. +-- @return #number The DestroyCount reflecting the amount of units destroyed within the group. +function DESTROYGROUPSTASK:ReportGoalProgress( DestroyGroup, DestroyUnit ) + self:F( { DestroyGroup, DestroyUnit, self.DestroyPercentage } ) + + local DestroyGroupSize = DestroyGroup:getSize() - 1 -- When a DEAD event occurs, the getSize is still one larger than the destroyed unit. + local DestroyGroupInitialSize = DestroyGroup:getInitialSize() + self:T( { DestroyGroupSize, DestroyGroupInitialSize - ( DestroyGroupInitialSize * self.DestroyPercentage / 100 ) } ) + + local DestroyCount = 0 + if DestroyGroup then + if DestroyGroupSize <= DestroyGroupInitialSize - ( DestroyGroupInitialSize * self.DestroyPercentage / 100 ) then + DestroyCount = 1 + end + else + DestroyCount = 1 + end + + self:T( DestroyCount ) + + return DestroyCount +end +--- Task class to destroy radar installations. +-- @module DESTROYRADARSTASK + +Include.File("DestroyBaseTask") + +--- The DESTROYRADARS class +-- @type +DESTROYRADARSTASK = { + ClassName = "DESTROYRADARSTASK", + GoalVerb = "Destroy Radars" +} + +--- Creates a new DESTROYRADARSTASK. +-- @param table{string,...} DestroyGroupNames Table of string containing the group names of which the radars are be destroyed. +-- @return DESTROYRADARSTASK +function DESTROYRADARSTASK:New( DestroyGroupNames ) + local self = BASE:Inherit( self, DESTROYGROUPSTASK:New( 'radar installations', 'radars', DestroyGroupNames ) ) + self:F() + + self.Name = 'Destroy Radars' + + _EVENTDISPATCHER:OnDead( self.EventDead , self ) + + return self +end + +--- Report Goal Progress. +-- @param Group DestroyGroup Group structure describing the group to be evaluated. +-- @param Unit DestroyUnit Unit structure describing the Unit to be evaluated. +function DESTROYRADARSTASK:ReportGoalProgress( DestroyGroup, DestroyUnit ) + self:F( { DestroyGroup, DestroyUnit } ) + + local DestroyCount = 0 + if DestroyUnit and DestroyUnit:hasSensors( Unit.SensorType.RADAR, Unit.RadarType.AS ) then + if DestroyUnit and DestroyUnit:getLife() <= 1.0 then + self:T( 'Destroyed a radar' ) + DestroyCount = 1 + end + end + return DestroyCount +end +--- Set TASK to destroy certain unit types. +-- @module DESTROYUNITTYPESTASK + +Include.File("DestroyBaseTask") + +--- The DESTROYUNITTYPESTASK class +-- @type +DESTROYUNITTYPESTASK = { + ClassName = "DESTROYUNITTYPESTASK", + GoalVerb = "Destroy", +} + +--- Creates a new DESTROYUNITTYPESTASK. +-- @param string DestroyGroupType String describing the group to be destroyed. f.e. "Radar Installations", "Fleet", "Batallion", "Command Centers". +-- @param string DestroyUnitType String describing the unit to be destroyed. f.e. "radars", "ships", "tanks", "centers". +-- @param table{string,...} DestroyGroupNames Table of string containing the group names of which the radars are be destroyed. +-- @param string DestroyUnitTypes Table of string containing the type names of the units to achieve mission success. +-- @return DESTROYUNITTYPESTASK +function DESTROYUNITTYPESTASK:New( DestroyGroupType, DestroyUnitType, DestroyGroupNames, DestroyUnitTypes ) + local self = BASE:Inherit( self, DESTROYBASETASK:New( DestroyGroupType, DestroyUnitType, DestroyGroupNames ) ) + self:F( { DestroyGroupType, DestroyUnitType, DestroyGroupNames, DestroyUnitTypes } ) + + if type(DestroyUnitTypes) == 'table' then + self.DestroyUnitTypes = DestroyUnitTypes + else + self.DestroyUnitTypes = { DestroyUnitTypes } + end + + self.Name = 'Destroy Unit Types' + self.GoalVerb = "Destroy " .. DestroyGroupType + + _EVENTDISPATCHER:OnDead( self.EventDead , self ) + + return self +end + +--- Report Goal Progress. +-- @param Group DestroyGroup Group structure describing the group to be evaluated. +-- @param Unit DestroyUnit Unit structure describing the Unit to be evaluated. +function DESTROYUNITTYPESTASK:ReportGoalProgress( DestroyGroup, DestroyUnit ) + self:F( { DestroyGroup, DestroyUnit } ) + + local DestroyCount = 0 + for UnitTypeID, UnitType in pairs( self.DestroyUnitTypes ) do + if DestroyUnit and DestroyUnit:getTypeName() == UnitType then + if DestroyUnit and DestroyUnit:getLife() <= 1.0 then + DestroyCount = DestroyCount + 1 + end + end + end + return DestroyCount +end +--- A PICKUPTASK orchestrates the loading of CARGO at a specific landing zone. +-- @module PICKUPTASK +-- @parent TASK + +Include.File("Task") +Include.File("Cargo") + +--- The PICKUPTASK class +-- @type +PICKUPTASK = { + ClassName = "PICKUPTASK", + TEXT = { "Pick-Up", "picked-up", "loaded" }, + GoalVerb = "Pick-Up" +} + +--- Creates a new PICKUPTASK. +-- @param table{string,...}|string LandingZones Table of Zone names where Cargo is to be loaded. +-- @param CARGO_TYPE CargoType Type of the Cargo. The type must be of the following Enumeration:.. +-- @param number OnBoardSide Reflects from which side the cargo Group will be on-boarded on the Carrier. +function PICKUPTASK:New( CargoType, OnBoardSide ) + local self = BASE:Inherit( self, TASK:New() ) + self:F() + + -- self holds the inherited instance of the PICKUPTASK Class to the BASE class. + + local Valid = true + + if Valid then + self.Name = 'Pickup Cargo' + self.TaskBriefing = "Task: Fly to the indicated landing zones and pickup " .. CargoType .. ". Your co-pilot will provide you with the directions (required flight angle in degrees) and the distance (in km) to the pickup zone." + self.CargoType = CargoType + self.GoalVerb = CargoType .. " " .. self.GoalVerb + self.OnBoardSide = OnBoardSide + self.IsLandingRequired = true -- required to decide whether the client needs to land or not + self.IsSlingLoad = false -- Indicates whether the cargo is a sling load cargo + self.Stages = { STAGE_CARGO_INIT:New(), STAGE_CARGO_LOAD:New(), STAGEBRIEF:New(), STAGESTART:New(), STAGEROUTE:New(), STAGELANDING:New(), STAGELANDED:New(), STAGELOAD:New(), STAGEDONE:New() } + self.SetStage( self, 1 ) + end + + return self +end + +function PICKUPTASK:FromZone( LandingZone ) + self:F() + + self.LandingZones.LandingZoneNames[LandingZone.CargoZoneName] = LandingZone.CargoZoneName + self.LandingZones.LandingZones[LandingZone.CargoZoneName] = LandingZone + + return self +end + +function PICKUPTASK:InitCargo( InitCargos ) + self:F( { InitCargos } ) + + if type( InitCargos ) == "table" then + self.Cargos.InitCargos = InitCargos + else + self.Cargos.InitCargos = { InitCargos } + end + + return self +end + +function PICKUPTASK:LoadCargo( LoadCargos ) + self:F( { LoadCargos } ) + + if type( LoadCargos ) == "table" then + self.Cargos.LoadCargos = LoadCargos + else + self.Cargos.LoadCargos = { LoadCargos } + end + + return self +end + +function PICKUPTASK:AddCargoMenus( Client, Cargos, TransportRadius ) + self:F() + + for CargoID, Cargo in pairs( Cargos ) do + + self:T( { Cargo.ClassName, Cargo.CargoName, Cargo.CargoType, Cargo:IsStatusNone(), Cargo:IsStatusLoaded(), Cargo:IsStatusLoading(), Cargo:IsStatusUnLoaded() } ) + + -- If the Cargo has no status, allow the menu option. + if Cargo:IsStatusNone() or ( Cargo:IsStatusLoading() and Client == Cargo:IsLoadingToClient() ) then + + local MenuAdd = false + if Cargo:IsNear( Client, self.CurrentCargoZone ) then + MenuAdd = true + end + + if MenuAdd then + if Client._Menus[Cargo.CargoType] == nil then + Client._Menus[Cargo.CargoType] = {} + end + + if not Client._Menus[Cargo.CargoType].PickupMenu then + Client._Menus[Cargo.CargoType].PickupMenu = missionCommands.addSubMenuForGroup( + Client:GetClientGroupID(), + self.TEXT[1] .. " " .. Cargo.CargoType, + nil + ) + self:T( 'Added PickupMenu: ' .. self.TEXT[1] .. " " .. Cargo.CargoType ) + end + + if Client._Menus[Cargo.CargoType].PickupSubMenus == nil then + Client._Menus[Cargo.CargoType].PickupSubMenus = {} + end + + Client._Menus[Cargo.CargoType].PickupSubMenus[ #Client._Menus[Cargo.CargoType].PickupSubMenus + 1 ] = missionCommands.addCommandForGroup( + Client:GetClientGroupID(), + Cargo.CargoName .. " ( " .. Cargo.CargoWeight .. "kg )", + Client._Menus[Cargo.CargoType].PickupMenu, + self.MenuAction, + { ReferenceTask = self, CargoTask = Cargo } + ) + self:T( 'Added PickupSubMenu' .. Cargo.CargoType .. ":" .. Cargo.CargoName .. " ( " .. Cargo.CargoWeight .. "kg )" ) + end + end + end + +end + +function PICKUPTASK:RemoveCargoMenus( Client ) + self:F() + + for MenuID, MenuData in pairs( Client._Menus ) do + for SubMenuID, SubMenuData in pairs( MenuData.PickupSubMenus ) do + missionCommands.removeItemForGroup( Client:GetClientGroupID(), SubMenuData ) + self:T( "Removed PickupSubMenu " ) + SubMenuData = nil + end + if MenuData.PickupMenu then + missionCommands.removeItemForGroup( Client:GetClientGroupID(), MenuData.PickupMenu ) + self:T( "Removed PickupMenu " ) + MenuData.PickupMenu = nil + end + end + + for CargoID, Cargo in pairs( CARGOS ) do + self:T( { Cargo.ClassName, Cargo.CargoName, Cargo.CargoType, Cargo:IsStatusNone(), Cargo:IsStatusLoaded(), Cargo:IsStatusLoading(), Cargo:IsStatusUnLoaded() } ) + if Cargo:IsStatusLoading() and Client == Cargo:IsLoadingToClient() then + Cargo:StatusNone() + end + end + +end + + + +function PICKUPTASK:HasFailed( ClientDead ) + self:F() + + local TaskHasFailed = self.TaskFailed + return TaskHasFailed +end + +--- A DEPLOYTASK orchestrates the deployment of CARGO within a specific landing zone. +-- @module DEPLOYTASK + +Include.File( "Task" ) + +--- A DeployTask +-- @type DEPLOYTASK +DEPLOYTASK = { + ClassName = "DEPLOYTASK", + TEXT = { "Deploy", "deployed", "unloaded" }, + GoalVerb = "Deployment" +} + + +--- Creates a new DEPLOYTASK object, which models the sequence of STAGEs to unload a cargo. +-- @function [parent=#DEPLOYTASK] New +-- @param #string CargoType Type of the Cargo. +-- @return #DEPLOYTASK The created DeployTask +function DEPLOYTASK:New( CargoType ) + local self = BASE:Inherit( self, TASK:New() ) + self:F() + + local Valid = true + + if Valid then + self.Name = 'Deploy Cargo' + self.TaskBriefing = "Fly to one of the indicated landing zones and deploy " .. CargoType .. ". Your co-pilot will provide you with the directions (required flight angle in degrees) and the distance (in km) to the deployment zone." + self.CargoType = CargoType + self.GoalVerb = CargoType .. " " .. self.GoalVerb + self.Stages = { STAGE_CARGO_INIT:New(), STAGE_CARGO_LOAD:New(), STAGEBRIEF:New(), STAGESTART:New(), STAGEROUTE:New(), STAGELANDING:New(), STAGELANDED:New(), STAGEUNLOAD:New(), STAGEDONE:New() } + self.SetStage( self, 1 ) + end + + return self +end + +function DEPLOYTASK:ToZone( LandingZone ) + self:F() + + self.LandingZones.LandingZoneNames[LandingZone.CargoZoneName] = LandingZone.CargoZoneName + self.LandingZones.LandingZones[LandingZone.CargoZoneName] = LandingZone + + return self +end + + +function DEPLOYTASK:InitCargo( InitCargos ) + self:F( { InitCargos } ) + + if type( InitCargos ) == "table" then + self.Cargos.InitCargos = InitCargos + else + self.Cargos.InitCargos = { InitCargos } + end + + return self +end + + +function DEPLOYTASK:LoadCargo( LoadCargos ) + self:F( { LoadCargos } ) + + if type( LoadCargos ) == "table" then + self.Cargos.LoadCargos = LoadCargos + else + self.Cargos.LoadCargos = { LoadCargos } + end + + return self +end + + +--- When the cargo is unloaded, it will move to the target zone name. +-- @param string TargetZoneName Name of the Zone to where the Cargo should move after unloading. +function DEPLOYTASK:SetCargoTargetZoneName( TargetZoneName ) + self:F() + + local Valid = true + + Valid = routines.ValidateString( TargetZoneName, "TargetZoneName", Valid ) + + if Valid then + self.TargetZoneName = TargetZoneName + end + + return Valid + +end + +function DEPLOYTASK:AddCargoMenus( Client, Cargos, TransportRadius ) + self:F() + + local ClientGroupID = Client:GetClientGroupID() + + self:T( ClientGroupID ) + + for CargoID, Cargo in pairs( Cargos ) do + + self:T( { Cargo.ClassName, Cargo.CargoName, Cargo.CargoType, Cargo.CargoWeight } ) + + if Cargo:IsStatusLoaded() and Client == Cargo:IsLoadedInClient() then + + if Client._Menus[Cargo.CargoType] == nil then + Client._Menus[Cargo.CargoType] = {} + end + + if not Client._Menus[Cargo.CargoType].DeployMenu then + Client._Menus[Cargo.CargoType].DeployMenu = missionCommands.addSubMenuForGroup( + ClientGroupID, + self.TEXT[1] .. " " .. Cargo.CargoType, + nil + ) + self:T( 'Added DeployMenu ' .. self.TEXT[1] ) + end + + if Client._Menus[Cargo.CargoType].DeploySubMenus == nil then + Client._Menus[Cargo.CargoType].DeploySubMenus = {} + end + + if Client._Menus[Cargo.CargoType].DeployMenu == nil then + self:T( 'deploymenu is nil' ) + end + + Client._Menus[Cargo.CargoType].DeploySubMenus[ #Client._Menus[Cargo.CargoType].DeploySubMenus + 1 ] = missionCommands.addCommandForGroup( + ClientGroupID, + Cargo.CargoName .. " ( " .. Cargo.CargoWeight .. "kg )", + Client._Menus[Cargo.CargoType].DeployMenu, + self.MenuAction, + { ReferenceTask = self, CargoTask = Cargo } + ) + self:T( 'Added DeploySubMenu ' .. Cargo.CargoType .. ":" .. Cargo.CargoName .. " ( " .. Cargo.CargoWeight .. "kg )" ) + end + end + +end + +function DEPLOYTASK:RemoveCargoMenus( Client ) + self:F() + + local ClientGroupID = Client:GetClientGroupID() + self:T( ClientGroupID ) + + for MenuID, MenuData in pairs( Client._Menus ) do + if MenuData.DeploySubMenus ~= nil then + for SubMenuID, SubMenuData in pairs( MenuData.DeploySubMenus ) do + missionCommands.removeItemForGroup( ClientGroupID, SubMenuData ) + self:T( "Removed DeploySubMenu " ) + SubMenuData = nil + end + end + if MenuData.DeployMenu then + missionCommands.removeItemForGroup( ClientGroupID, MenuData.DeployMenu ) + self:T( "Removed DeployMenu " ) + MenuData.DeployMenu = nil + end + end + +end +--- A NOTASK is a dummy activity... But it will show a Mission Briefing... +-- @module NOTASK + +Include.File("Task") + +--- The NOTASK class +-- @type +NOTASK = { + ClassName = "NOTASK", +} + +--- Creates a new NOTASK. +function NOTASK:New() + local self = BASE:Inherit( self, TASK:New() ) + self:F() + + local Valid = true + + if Valid then + self.Name = 'Nothing' + self.TaskBriefing = "Task: Execute your mission." + self.Stages = { STAGEBRIEF:New(), STAGESTART:New(), STAGEDONE:New() } + self.SetStage( self, 1 ) + end + + return self +end +--- A ROUTETASK orchestrates the travel to a specific zone defined within the ME. +-- @module ROUTETASK + +--- The ROUTETASK class +-- @type +ROUTETASK = { + ClassName = "ROUTETASK", + GoalVerb = "Route", +} + +--- Creates a new ROUTETASK. +-- @param table{sring,...}|string LandingZones Table of Zone Names where the target is located. +-- @param string TaskBriefing (optional) Defines a text describing the briefing of the task. +-- @return ROUTETASK +function ROUTETASK:New( LandingZones, TaskBriefing ) + local self = BASE:Inherit( self, TASK:New() ) + self:F( { LandingZones, TaskBriefing } ) + + local Valid = true + + Valid = routines.ValidateZone( LandingZones, "LandingZones", Valid ) + + if Valid then + self.Name = 'Route To Zone' + if TaskBriefing then + self.TaskBriefing = TaskBriefing .. " Your co-pilot will provide you with the directions (required flight angle in degrees) and the distance (in km) to the target objective." + else + self.TaskBriefing = "Task: Fly to specified zone(s). Your co-pilot will provide you with the directions (required flight angle in degrees) and the distance (in km) to the target objective." + end + if type( LandingZones ) == "table" then + self.LandingZones = LandingZones + else + self.LandingZones = { LandingZones } + end + self.Stages = { STAGEBRIEF:New(), STAGESTART:New(), STAGEROUTE:New(), STAGEARRIVE:New(), STAGEDONE:New() } + self.SetStage( self, 1 ) + end + + return self +end + +--- A MISSION is the main owner of a Mission orchestration within MOOSE . The Mission framework orchestrates @{CLIENT}s, @{TASK}s, @{STAGE}s etc. +-- A @{CLIENT} needs to be registered within the @{MISSION} through the function @{AddClient}. A @{TASK} needs to be registered within the @{MISSION} through the function @{AddTask}. +-- @module Mission + +Include.File( "Routines" ) +Include.File( "Base" ) +Include.File( "Client" ) +Include.File( "Task" ) + +--- The MISSION class +-- @type MISSION +-- @extends Base#BASE +-- @field #MISSION.Clients _Clients +-- @field #string MissionBriefing +MISSION = { + ClassName = "MISSION", + Name = "", + MissionStatus = "PENDING", + _Clients = {}, + _Tasks = {}, + _ActiveTasks = {}, + GoalFunction = nil, + MissionReportTrigger = 0, + MissionProgressTrigger = 0, + MissionReportShow = false, + MissionReportFlash = false, + MissionTimeInterval = 0, + MissionCoalition = "", + SUCCESS = 1, + FAILED = 2, + REPEAT = 3, + _GoalTasks = {} +} + +--- @type MISSION.Clients +-- @list + +function MISSION:Meta() + + local self = BASE:Inherit( self, BASE:New() ) + self:F() + + return self +end + +--- This is the main MISSION declaration method. Each Mission is like the master or a Mission orchestration between, Clients, Tasks, Stages etc. +-- @param string MissionName is the name of the mission. This name will be used to reference the status of each mission by the players. +-- @param string MissionPriority is a string indicating the "priority" of the Mission. f.e. "Primary", "Secondary" or "First", "Second". It is free format and up to the Mission designer to choose. There are no rules behind this field. +-- @param string MissionBriefing is a string indicating the mission briefing to be shown when a player joins a @{CLIENT}. +-- @param string MissionCoalition is a string indicating the coalition or party to which this mission belongs to. It is free format and can be chosen freely by the mission designer. Note that this field is not to be confused with the coalition concept of the ME. Examples of a Mission Coalition could be "NATO", "CCCP", "Intruders", "Terrorists"... +-- @return MISSION +-- @usage +-- -- Declare a few missions. +-- local Mission = MISSIONSCHEDULER.AddMission( 'Russia Transport Troops SA-6', 'Operational', 'Transport troops from the control center to one of the SA-6 SAM sites to activate their operation.', 'Russia' ) +-- local Mission = MISSIONSCHEDULER.AddMission( 'Patriots', 'Primary', 'Our intelligence reports that 3 Patriot SAM defense batteries are located near Ruisi, Kvarhiti and Gori.', 'Russia' ) +-- local Mission = MISSIONSCHEDULER.AddMission( 'Package Delivery', 'Operational', 'In order to be in full control of the situation, we need you to deliver a very important package at a secret location. Fly undetected through the NATO defenses and deliver the secret package. The secret agent is located at waypoint 4.', 'Russia' ) +-- local Mission = MISSIONSCHEDULER.AddMission( 'Rescue General', 'Tactical', 'Our intelligence has received a remote signal behind Gori. We believe it is a very important Russian General that was captured by Georgia. Go out there and rescue him! Ensure you stay out of the battle zone, keep south. Waypoint 4 is the location of our Russian General.', 'Russia' ) +-- local Mission = MISSIONSCHEDULER.AddMission( 'NATO Transport Troops', 'Operational', 'Transport 3 groups of air defense engineers from our barracks "Gold" and "Titan" to each patriot battery control center to activate our air defenses.', 'NATO' ) +-- local Mission = MISSIONSCHEDULER.AddMission( 'SA-6 SAMs', 'Primary', 'Our intelligence reports that 3 SA-6 SAM defense batteries are located near Didmukha, Khetagurov and Berula. Eliminate the Russian SAMs.', 'NATO' ) +-- local Mission = MISSIONSCHEDULER.AddMission( 'NATO Sling Load', 'Operational', 'Fly to the cargo pickup zone at Dzegvi or Kaspi, and sling the cargo to Soganlug airbase.', 'NATO' ) +-- local Mission = MISSIONSCHEDULER.AddMission( 'Rescue secret agent', 'Tactical', 'In order to be in full control of the situation, we need you to rescue a secret agent from the woods behind enemy lines. Avoid the Russian defenses and rescue the agent. Keep south until Khasuri, and keep your eyes open for any SAM presence. The agent is located at waypoint 4 on your kneeboard.', 'NATO' ) +function MISSION:New( MissionName, MissionPriority, MissionBriefing, MissionCoalition ) + + self = MISSION:Meta() + self:T({ MissionName, MissionPriority, MissionBriefing, MissionCoalition }) + + local Valid = true + + Valid = routines.ValidateString( MissionName, "MissionName", Valid ) + Valid = routines.ValidateString( MissionPriority, "MissionPriority", Valid ) + Valid = routines.ValidateString( MissionBriefing, "MissionBriefing", Valid ) + Valid = routines.ValidateString( MissionCoalition, "MissionCoalition", Valid ) + + if Valid then + self.Name = MissionName + self.MissionPriority = MissionPriority + self.MissionBriefing = MissionBriefing + self.MissionCoalition = MissionCoalition + end + + return self +end + +--- Returns if a Mission has completed. +-- @return bool +function MISSION:IsCompleted() + self:F() + return self.MissionStatus == "ACCOMPLISHED" +end + +--- Set a Mission to completed. +function MISSION:Completed() + self:F() + self.MissionStatus = "ACCOMPLISHED" + self:StatusToClients() +end + +--- Returns if a Mission is ongoing. +-- treturn bool +function MISSION:IsOngoing() + self:F() + return self.MissionStatus == "ONGOING" +end + +--- Set a Mission to ongoing. +function MISSION:Ongoing() + self:F() + self.MissionStatus = "ONGOING" + --self:StatusToClients() +end + +--- Returns if a Mission is pending. +-- treturn bool +function MISSION:IsPending() + self:F() + return self.MissionStatus == "PENDING" +end + +--- Set a Mission to pending. +function MISSION:Pending() + self:F() + self.MissionStatus = "PENDING" + self:StatusToClients() +end + +--- Returns if a Mission has failed. +-- treturn bool +function MISSION:IsFailed() + self:F() + return self.MissionStatus == "FAILED" +end + +--- Set a Mission to failed. +function MISSION:Failed() + self:F() + self.MissionStatus = "FAILED" + self:StatusToClients() +end + +--- Send the status of the MISSION to all Clients. +function MISSION:StatusToClients() + self:F() + if self.MissionReportFlash then + for ClientID, Client in pairs( self._Clients ) do + Client:Message( self.MissionCoalition .. ' "' .. self.Name .. '": ' .. self.MissionStatus .. '! ( ' .. self.MissionPriority .. ' mission ) ', 10, self.Name .. '/Status', "Mission Command: Mission Status") + end + end +end + +--- Handles the reporting. After certain time intervals, a MISSION report MESSAGE will be shown to All Players. +function MISSION:ReportTrigger() + self:F() + + if self.MissionReportShow == true then + self.MissionReportShow = false + return true + else + if self.MissionReportFlash == true then + if timer.getTime() >= self.MissionReportTrigger then + self.MissionReportTrigger = timer.getTime() + self.MissionTimeInterval + return true + else + return false + end + else + return false + end + end +end + +--- Report the status of all MISSIONs to all active Clients. +function MISSION:ReportToAll() + self:F() + + local AlivePlayers = '' + for ClientID, Client in pairs( self._Clients ) do + if Client:GetDCSGroup() then + if Client:GetClientGroupDCSUnit() then + if Client:GetClientGroupDCSUnit():getLife() > 0.0 then + if AlivePlayers == '' then + AlivePlayers = ' Players: ' .. Client:GetClientGroupDCSUnit():getPlayerName() + else + AlivePlayers = AlivePlayers .. ' / ' .. Client:GetClientGroupDCSUnit():getPlayerName() + end + end + end + end + end + local Tasks = self:GetTasks() + local TaskText = "" + for TaskID, TaskData in pairs( Tasks ) do + TaskText = TaskText .. " - Task " .. TaskID .. ": " .. TaskData.Name .. ": " .. TaskData:GetGoalProgress() .. "\n" + end + MESSAGE:New( self.MissionCoalition .. ' "' .. self.Name .. '": ' .. self.MissionStatus .. ' ( ' .. self.MissionPriority .. ' mission )' .. AlivePlayers .. "\n" .. TaskText:gsub("\n$",""), "Mission Command: Mission Report", 10, self.Name .. '/Status'):ToAll() +end + + +--- Add a goal function to a MISSION. Goal functions are called when a @{TASK} within a mission has been completed. +-- @param function GoalFunction is the function defined by the mission designer to evaluate whether a certain goal has been reached after a @{TASK} finishes within the @{MISSION}. A GoalFunction must accept 2 parameters: Mission, Client, which contains the current MISSION object and the current CLIENT object respectively. +-- @usage +-- PatriotActivation = { +-- { "US SAM Patriot Zerti", false }, +-- { "US SAM Patriot Zegduleti", false }, +-- { "US SAM Patriot Gvleti", false } +-- } +-- +-- function DeployPatriotTroopsGoal( Mission, Client ) +-- +-- +-- -- Check if the cargo is all deployed for mission success. +-- for CargoID, CargoData in pairs( Mission._Cargos ) do +-- if Group.getByName( CargoData.CargoGroupName ) then +-- CargoGroup = Group.getByName( CargoData.CargoGroupName ) +-- if CargoGroup then +-- -- Check if the cargo is ready to activate +-- CurrentLandingZoneID = routines.IsUnitInZones( CargoGroup:getUnits()[1], Mission:GetTask( 2 ).LandingZones ) -- The second task is the Deploytask to measure mission success upon +-- if CurrentLandingZoneID then +-- if PatriotActivation[CurrentLandingZoneID][2] == false then +-- -- Now check if this is a new Mission Task to be completed... +-- trigger.action.setGroupAIOn( Group.getByName( PatriotActivation[CurrentLandingZoneID][1] ) ) +-- PatriotActivation[CurrentLandingZoneID][2] = true +-- MessageToBlue( "Mission Command: Message to all airborne units! The " .. PatriotActivation[CurrentLandingZoneID][1] .. " is armed. Our air defenses are now stronger.", 60, "BLUE/PatriotDefense" ) +-- MessageToRed( "Mission Command: Our satellite systems are detecting additional NATO air defenses. To all airborne units: Take care!!!", 60, "RED/PatriotDefense" ) +-- Mission:GetTask( 2 ):AddGoalCompletion( "Patriots activated", PatriotActivation[CurrentLandingZoneID][1], 1 ) -- Register Patriot activation as part of mission goal. +-- end +-- end +-- end +-- end +-- end +-- end +-- +-- local Mission = MISSIONSCHEDULER.AddMission( 'NATO Transport Troops', 'Operational', 'Transport 3 groups of air defense engineers from our barracks "Gold" and "Titan" to each patriot battery control center to activate our air defenses.', 'NATO' ) +-- Mission:AddGoalFunction( DeployPatriotTroopsGoal ) +function MISSION:AddGoalFunction( GoalFunction ) + self:F() + self.GoalFunction = GoalFunction +end + +--- Register a new @{CLIENT} to participate within the mission. +-- @param CLIENT Client is the @{CLIENT} object. The object must have been instantiated with @{CLIENT:New}. +-- @return CLIENT +-- @usage +-- Add a number of Client objects to the Mission. +-- Mission:AddClient( CLIENT:FindByName( 'US UH-1H*HOT-Deploy Troops 1', 'Transport 3 groups of air defense engineers from our barracks "Gold" and "Titan" to each patriot battery control center to activate our air defenses.' ):Transport() ) +-- Mission:AddClient( CLIENT:FindByName( 'US UH-1H*RAMP-Deploy Troops 3', 'Transport 3 groups of air defense engineers from our barracks "Gold" and "Titan" to each patriot battery control center to activate our air defenses.' ):Transport() ) +-- Mission:AddClient( CLIENT:FindByName( 'US UH-1H*HOT-Deploy Troops 2', 'Transport 3 groups of air defense engineers from our barracks "Gold" and "Titan" to each patriot battery control center to activate our air defenses.' ):Transport() ) +-- Mission:AddClient( CLIENT:FindByName( 'US UH-1H*RAMP-Deploy Troops 4', 'Transport 3 groups of air defense engineers from our barracks "Gold" and "Titan" to each patriot battery control center to activate our air defenses.' ):Transport() ) +function MISSION:AddClient( Client ) + self:F( { Client } ) + + local Valid = true + + if Valid then + self._Clients[Client.ClientName] = Client + end + + return Client +end + +--- Find a @{CLIENT} object within the @{MISSION} by its ClientName. +-- @param CLIENT ClientName is a string defining the Client Group as defined within the ME. +-- @return CLIENT +-- @usage +-- -- Seach for Client "Bomber" within the Mission. +-- local BomberClient = Mission:FindClient( "Bomber" ) +function MISSION:FindClient( ClientName ) + self:F( { self._Clients[ClientName] } ) + return self._Clients[ClientName] +end + + +--- Register a @{TASK} to be completed within the @{MISSION}. Note that there can be multiple @{TASK}s registered to be completed. Each TASK can be set a certain Goal. The MISSION will not be completed until all Goals are reached. +-- @param TASK Task is the @{TASK} object. The object must have been instantiated with @{TASK:New} or any of its inherited @{TASK}s. +-- @param number TaskNumber is the sequence number of the TASK within the MISSION. This number does have to be chronological. +-- @return TASK +-- @usage +-- -- Define a few tasks for the Mission. +-- PickupZones = { "NATO Gold Pickup Zone", "NATO Titan Pickup Zone" } +-- PickupSignalUnits = { "NATO Gold Coordination Center", "NATO Titan Coordination Center" } +-- +-- -- Assign the Pickup Task +-- local PickupTask = PICKUPTASK:New( PickupZones, CARGO_TYPE.ENGINEERS, CLIENT.ONBOARDSIDE.LEFT ) +-- PickupTask:AddSmokeBlue( PickupSignalUnits ) +-- PickupTask:SetGoalTotal( 3 ) +-- Mission:AddTask( PickupTask, 1 ) +-- +-- -- Assign the Deploy Task +-- local PatriotActivationZones = { "US Patriot Battery 1 Activation", "US Patriot Battery 2 Activation", "US Patriot Battery 3 Activation" } +-- local PatriotActivationZonesSmokeUnits = { "US SAM Patriot - Battery 1 Control", "US SAM Patriot - Battery 2 Control", "US SAM Patriot - Battery 3 Control" } +-- local DeployTask = DEPLOYTASK:New( PatriotActivationZones, CARGO_TYPE.ENGINEERS ) +-- --DeployTask:SetCargoTargetZoneName( 'US Troops Attack ' .. math.random(2) ) +-- DeployTask:AddSmokeBlue( PatriotActivationZonesSmokeUnits ) +-- DeployTask:SetGoalTotal( 3 ) +-- DeployTask:SetGoalTotal( 3, "Patriots activated" ) +-- Mission:AddTask( DeployTask, 2 ) + +function MISSION:AddTask( Task, TaskNumber ) + self:F() + + self._Tasks[TaskNumber] = Task + self._Tasks[TaskNumber]:EnableEvents() + self._Tasks[TaskNumber].ID = TaskNumber + + return Task + end + +--- Get the TASK idenified by the TaskNumber from the Mission. This function is useful in GoalFunctions. +-- @param number TaskNumber is the number of the @{TASK} within the @{MISSION}. +-- @return TASK +-- @usage +-- -- Get Task 2 from the Mission. +-- Task2 = Mission:GetTask( 2 ) + +function MISSION:GetTask( TaskNumber ) + self:F() + + local Valid = true + + local Task = nil + + if type(TaskNumber) ~= "number" then + Valid = false + end + + if Valid then + Task = self._Tasks[TaskNumber] + end + + return Task +end + +--- Get all the TASKs from the Mission. This function is useful in GoalFunctions. +-- @return {TASK,...} Structure of TASKS with the @{TASK} number as the key. +-- @usage +-- -- Get Tasks from the Mission. +-- Tasks = Mission:GetTasks() +-- env.info( "Task 2 Completion = " .. Tasks[2]:GetGoalPercentage() .. "%" ) +function MISSION:GetTasks() + self:F() + + return self._Tasks +end + + +--[[ + _TransportExecuteStage: Defines the different stages of Transport unload/load execution. This table is internal and is used to control the validity of Transport load/unload timing. + + - _TransportExecuteStage.EXECUTING + - _TransportExecuteStage.SUCCESS + - _TransportExecuteStage.FAILED + +--]] +_TransportExecuteStage = { + NONE = 0, + EXECUTING = 1, + SUCCESS = 2, + FAILED = 3 +} + + +--- The MISSIONSCHEDULER is an OBJECT and is the main scheduler of ALL active MISSIONs registered within this scheduler. It's workings are considered internal and is automatically created when the Mission.lua file is included. +-- @type MISSIONSCHEDULER +-- @field #MISSIONSCHEDULER.MISSIONS Missions +MISSIONSCHEDULER = { + Missions = {}, + MissionCount = 0, + TimeIntervalCount = 0, + TimeIntervalShow = 150, + TimeSeconds = 14400, + TimeShow = 5 +} + +--- @type MISSIONSCHEDULER.MISSIONS +-- @list <#MISSION> Mission + +--- This is the main MISSIONSCHEDULER Scheduler function. It is considered internal and is automatically created when the Mission.lua file is included. +function MISSIONSCHEDULER.Scheduler() + + + -- loop through the missions in the TransportTasks + for MissionName, MissionData in pairs( MISSIONSCHEDULER.Missions ) do + + local Mission = MissionData -- #MISSION + + if not Mission:IsCompleted() then + + -- This flag will monitor if for this mission, there are clients alive. If this flag is still false at the end of the loop, the mission status will be set to Pending (if not Failed or Completed). + local ClientsAlive = false + + for ClientID, ClientData in pairs( Mission._Clients ) do + + local Client = ClientData -- Client#CLIENT + + if Client:IsAlive() then + + -- There is at least one Client that is alive... So the Mission status is set to Ongoing. + ClientsAlive = true + + -- If this Client was not registered as Alive before: + -- 1. We register the Client as Alive. + -- 2. We initialize the Client Tasks and make a link to the original Mission Task. + -- 3. We initialize the Cargos. + -- 4. We flag the Mission as Ongoing. + if not Client.ClientAlive then + Client.ClientAlive = true + Client.ClientBriefingShown = false + for TaskNumber, Task in pairs( Mission._Tasks ) do + -- Note that this a deepCopy. Each client must have their own Tasks with own Stages!!! + Client._Tasks[TaskNumber] = routines.utils.deepCopy( Mission._Tasks[TaskNumber] ) + -- Each MissionTask must point to the original Mission. + Client._Tasks[TaskNumber].MissionTask = Mission._Tasks[TaskNumber] + Client._Tasks[TaskNumber].Cargos = Mission._Tasks[TaskNumber].Cargos + Client._Tasks[TaskNumber].LandingZones = Mission._Tasks[TaskNumber].LandingZones + end + + Mission:Ongoing() + end + + + -- For each Client, check for each Task the state and evolve the mission. + -- This flag will indicate if the Task of the Client is Complete. + local TaskComplete = false + + for TaskNumber, Task in pairs( Client._Tasks ) do + + if not Task.Stage then + Task:SetStage( 1 ) + end + + + local TransportTime = timer.getTime() + + if not Task:IsDone() then + + if Task:Goal() then + Task:ShowGoalProgress( Mission, Client ) + end + + --env.info( 'Scheduler: Mission = ' .. Mission.Name .. ' / Client = ' .. Client.ClientName .. ' / Task = ' .. Task.Name .. ' / Stage = ' .. Task.ActiveStage .. ' - ' .. Task.Stage.Name .. ' - ' .. Task.Stage.StageType ) + + -- Action + if Task:StageExecute() then + Task.Stage:Execute( Mission, Client, Task ) + end + + -- Wait until execution is finished + if Task.ExecuteStage == _TransportExecuteStage.EXECUTING then + Task.Stage:Executing( Mission, Client, Task ) + end + + -- Validate completion or reverse to earlier stage + if Task.Time + Task.Stage.WaitTime <= TransportTime then + Task:SetStage( Task.Stage:Validate( Mission, Client, Task ) ) + end + + if Task:IsDone() then + --env.info( 'Scheduler: Mission '.. Mission.Name .. ' Task ' .. Task.Name .. ' Stage ' .. Task.Stage.Name .. ' done. TaskComplete = ' .. string.format ( "%s", TaskComplete and "true" or "false" ) ) + TaskComplete = true -- when a task is not yet completed, a mission cannot be completed + + else + -- break only if this task is not yet done, so that future task are not yet activated. + TaskComplete = false -- when a task is not yet completed, a mission cannot be completed + --env.info( 'Scheduler: Mission "'.. Mission.Name .. '" Task "' .. Task.Name .. '" Stage "' .. Task.Stage.Name .. '" break. TaskComplete = ' .. string.format ( "%s", TaskComplete and "true" or "false" ) ) + break + end + + if TaskComplete then + + if Mission.GoalFunction ~= nil then + Mission.GoalFunction( Mission, Client ) + end + if MISSIONSCHEDULER.Scoring then + MISSIONSCHEDULER.Scoring:_AddMissionTaskScore( Client:GetClientGroupDCSUnit(), Mission.Name, 25 ) + end + +-- if not Mission:IsCompleted() then +-- end + end + end + end + + local MissionComplete = true + for TaskNumber, Task in pairs( Mission._Tasks ) do + if Task:Goal() then +-- Task:ShowGoalProgress( Mission, Client ) + if Task:IsGoalReached() then + else + MissionComplete = false + end + else + MissionComplete = false -- If there is no goal, the mission should never be ended. The goal status will be set somewhere else. + end + end + + if MissionComplete then + Mission:Completed() + if MISSIONSCHEDULER.Scoring then + MISSIONSCHEDULER.Scoring:_AddMissionScore( Mission.Name, 100 ) + end + else + if TaskComplete then + -- Reset for new tasking of active client + Client.ClientAlive = false -- Reset the client tasks. + end + end + + + else + if Client.ClientAlive then + env.info( 'Scheduler: Client "' .. Client.ClientName .. '" is inactive.' ) + Client.ClientAlive = false + + -- This is tricky. If we sanitize Client._Tasks before sanitizing Client._Tasks[TaskNumber].MissionTask, then the original MissionTask will be sanitized, and will be lost within the garbage collector. + -- So first sanitize Client._Tasks[TaskNumber].MissionTask, after that, sanitize only the whole _Tasks structure... + --Client._Tasks[TaskNumber].MissionTask = nil + --Client._Tasks = nil + end + end + end + + -- If all Clients of this Mission are not activated, then the Mission status needs to be put back into Pending status. + -- But only if the Mission was Ongoing. In case the Mission is Completed or Failed, the Mission status may not be changed. In these cases, this will be the last run of this Mission in the Scheduler. + if ClientsAlive == false then + if Mission:IsOngoing() then + -- Mission status back to pending... + Mission:Pending() + end + end + end + + Mission:StatusToClients() + + if Mission:ReportTrigger() then + Mission:ReportToAll() + end + end + + return true +end + +--- Start the MISSIONSCHEDULER. +function MISSIONSCHEDULER.Start() + if MISSIONSCHEDULER ~= nil then + --MISSIONSCHEDULER.SchedulerId = routines.scheduleFunction( MISSIONSCHEDULER.Scheduler, { }, 0, 2 ) + MISSIONSCHEDULER.SchedulerId = SCHEDULER:New( nil, MISSIONSCHEDULER.Scheduler, { }, 0, 2 ) + end +end + +--- Stop the MISSIONSCHEDULER. +function MISSIONSCHEDULER.Stop() + if MISSIONSCHEDULER.SchedulerId then + routines.removeFunction(MISSIONSCHEDULER.SchedulerId) + MISSIONSCHEDULER.SchedulerId = nil + end +end + +--- This is the main MISSION declaration method. Each Mission is like the master or a Mission orchestration between, Clients, Tasks, Stages etc. +-- @param Mission is the MISSION object instantiated by @{MISSION:New}. +-- @return MISSION +-- @usage +-- -- Declare a mission. +-- Mission = MISSION:New( 'Russia Transport Troops SA-6', +-- 'Operational', +-- 'Transport troops from the control center to one of the SA-6 SAM sites to activate their operation.', +-- 'Russia' ) +-- MISSIONSCHEDULER:AddMission( Mission ) +function MISSIONSCHEDULER.AddMission( Mission ) + MISSIONSCHEDULER.Missions[Mission.Name] = Mission + MISSIONSCHEDULER.MissionCount = MISSIONSCHEDULER.MissionCount + 1 + -- Add an overall AI Client for the AI tasks... This AI Client will facilitate the Events in the background for each Task. + --MissionAdd:AddClient( CLIENT:Register( 'AI' ) ) + + return Mission +end + +--- Remove a MISSION from the MISSIONSCHEDULER. +-- @param MissionName is the name of the MISSION given at declaration using @{AddMission}. +-- @usage +-- -- Declare a mission. +-- Mission = MISSION:New( 'Russia Transport Troops SA-6', +-- 'Operational', +-- 'Transport troops from the control center to one of the SA-6 SAM sites to activate their operation.', +-- 'Russia' ) +-- MISSIONSCHEDULER:AddMission( Mission ) +-- +-- -- Now remove the Mission. +-- MISSIONSCHEDULER:RemoveMission( 'Russia Transport Troops SA-6' ) +function MISSIONSCHEDULER.RemoveMission( MissionName ) + MISSIONSCHEDULER.Missions[MissionName] = nil + MISSIONSCHEDULER.MissionCount = MISSIONSCHEDULER.MissionCount - 1 +end + +--- Find a MISSION within the MISSIONSCHEDULER. +-- @param MissionName is the name of the MISSION given at declaration using @{AddMission}. +-- @return MISSION +-- @usage +-- -- Declare a mission. +-- Mission = MISSION:New( 'Russia Transport Troops SA-6', +-- 'Operational', +-- 'Transport troops from the control center to one of the SA-6 SAM sites to activate their operation.', +-- 'Russia' ) +-- MISSIONSCHEDULER:AddMission( Mission ) +-- +-- -- Now find the Mission. +-- MissionFind = MISSIONSCHEDULER:FindMission( 'Russia Transport Troops SA-6' ) +function MISSIONSCHEDULER.FindMission( MissionName ) + return MISSIONSCHEDULER.Missions[MissionName] +end + +-- Internal function used by the MISSIONSCHEDULER menu. +function MISSIONSCHEDULER.ReportMissionsShow( ) + for MissionName, Mission in pairs( MISSIONSCHEDULER.Missions ) do + Mission.MissionReportShow = true + Mission.MissionReportFlash = false + end +end + +-- Internal function used by the MISSIONSCHEDULER menu. +function MISSIONSCHEDULER.ReportMissionsFlash( TimeInterval ) + local Count = 0 + for MissionName, Mission in pairs( MISSIONSCHEDULER.Missions ) do + Mission.MissionReportShow = false + Mission.MissionReportFlash = true + Mission.MissionReportTrigger = timer.getTime() + Count * TimeInterval + Mission.MissionTimeInterval = MISSIONSCHEDULER.MissionCount * TimeInterval + env.info( "TimeInterval = " .. Mission.MissionTimeInterval ) + Count = Count + 1 + end +end + +-- Internal function used by the MISSIONSCHEDULER menu. +function MISSIONSCHEDULER.ReportMissionsHide( Prm ) + for MissionName, Mission in pairs( MISSIONSCHEDULER.Missions ) do + Mission.MissionReportShow = false + Mission.MissionReportFlash = false + end +end + +--- Enables a MENU option in the communications menu under F10 to control the status of the active missions. +-- This function should be called only once when starting the MISSIONSCHEDULER. +function MISSIONSCHEDULER.ReportMenu() + local ReportMenu = SUBMENU:New( 'Status' ) + local ReportMenuShow = COMMANDMENU:New( 'Show Report Missions', ReportMenu, MISSIONSCHEDULER.ReportMissionsShow, 0 ) + local ReportMenuFlash = COMMANDMENU:New('Flash Report Missions', ReportMenu, MISSIONSCHEDULER.ReportMissionsFlash, 120 ) + local ReportMenuHide = COMMANDMENU:New( 'Hide Report Missions', ReportMenu, MISSIONSCHEDULER.ReportMissionsHide, 0 ) +end + +--- Show the remaining mission time. +function MISSIONSCHEDULER:TimeShow() + self.TimeIntervalCount = self.TimeIntervalCount + 1 + if self.TimeIntervalCount >= self.TimeTriggerShow then + local TimeMsg = string.format("%00d", ( self.TimeSeconds / 60 ) - ( timer.getTime() / 60 )) .. ' minutes left until mission reload.' + MESSAGE:New( TimeMsg, "Mission time", self.TimeShow, '/TimeMsg' ):ToAll() + self.TimeIntervalCount = 0 + end +end + +function MISSIONSCHEDULER:Time( TimeSeconds, TimeIntervalShow, TimeShow ) + + self.TimeIntervalCount = 0 + self.TimeSeconds = TimeSeconds + self.TimeIntervalShow = TimeIntervalShow + self.TimeShow = TimeShow +end + +--- Adds a mission scoring to the game. +function MISSIONSCHEDULER:Scoring( Scoring ) + + self.Scoring = Scoring +end + +--- The CLEANUP class keeps an area clean of crashing or colliding airplanes. It also prevents airplanes from firing within this area. +-- @module CleanUp +-- @author Flightcontrol + +Include.File( "Routines" ) +Include.File( "Base" ) +Include.File( "Mission" ) +Include.File( "Client" ) +Include.File( "Task" ) + +--- The CLEANUP class. +-- @type CLEANUP +-- @extends Base#BASE +CLEANUP = { + ClassName = "CLEANUP", + ZoneNames = {}, + TimeInterval = 300, + CleanUpList = {}, +} + +--- Creates the main object which is handling the cleaning of the debris within the given Zone Names. +-- @param #CLEANUP self +-- @param #table ZoneNames Is a table of zone names where the debris should be cleaned. Also a single string can be passed with one zone name. +-- @param #number TimeInterval The interval in seconds when the clean activity takes place. The default is 300 seconds, thus every 5 minutes. +-- @return #CLEANUP +-- @usage +-- -- Clean these Zones. +-- CleanUpAirports = CLEANUP:New( { 'CLEAN Tbilisi', 'CLEAN Kutaisi' }, 150 ) +-- or +-- CleanUpTbilisi = CLEANUP:New( 'CLEAN Tbilisi', 150 ) +-- CleanUpKutaisi = CLEANUP:New( 'CLEAN Kutaisi', 600 ) +function CLEANUP:New( ZoneNames, TimeInterval ) local self = BASE:Inherit( self, BASE:New() ) + self:F( { ZoneNames, TimeInterval } ) + + if type( ZoneNames ) == 'table' then + self.ZoneNames = ZoneNames + else + self.ZoneNames = { ZoneNames } + end + if TimeInterval then + self.TimeInterval = TimeInterval + end + + _EVENTDISPATCHER:OnBirth( self._OnEventBirth, self ) + + --self.CleanUpScheduler = routines.scheduleFunction( self._CleanUpScheduler, { self }, timer.getTime() + 1, TimeInterval ) + self.CleanUpScheduler = SCHEDULER:New( self, self._CleanUpScheduler, {}, 1, TimeInterval ) + + return self +end + + +--- Destroys a group from the simulator, but checks first if it is still existing! +-- @param #CLEANUP self +-- @param DCSGroup#Group GroupObject The object to be destroyed. +-- @param #string CleanUpGroupName The groupname... +function CLEANUP:_DestroyGroup( GroupObject, CleanUpGroupName ) + self:F( { GroupObject, CleanUpGroupName } ) + + if GroupObject then -- and GroupObject:isExist() then + --MESSAGE:New( "Destroy Group " .. CleanUpGroupName, CleanUpGroupName, 1, CleanUpGroupName ):ToAll() + trigger.action.deactivateGroup(GroupObject) + self:T( { "GroupObject Destroyed", GroupObject } ) + end +end + +--- Destroys a @{DCSUnit#Unit} from the simulator, but checks first if it is still existing! +-- @param #CLEANUP self +-- @param DCSUnit#Unit CleanUpUnit The object to be destroyed. +-- @param #string CleanUpUnitName The Unit name ... +function CLEANUP:_DestroyUnit( CleanUpUnit, CleanUpUnitName ) + self:F( { CleanUpUnit, CleanUpUnitName } ) + + if CleanUpUnit then + --MESSAGE:New( "Destroy " .. CleanUpUnitName, CleanUpUnitName, 1, CleanUpUnitName ):ToAll() + local CleanUpGroup = Unit.getGroup(CleanUpUnit) + -- TODO Client bug in 1.5.3 + if CleanUpGroup and CleanUpGroup:isExist() then + local CleanUpGroupUnits = CleanUpGroup:getUnits() + if #CleanUpGroupUnits == 1 then + local CleanUpGroupName = CleanUpGroup:getName() + --self:CreateEventCrash( timer.getTime(), CleanUpUnit ) + CleanUpGroup:destroy() + self:T( { "Destroyed Group:", CleanUpGroupName } ) + else + CleanUpUnit:destroy() + self:T( { "Destroyed Unit:", CleanUpUnitName } ) + end + self.CleanUpList[CleanUpUnitName] = nil -- Cleaning from the list + CleanUpUnit = nil + end + end +end + +-- TODO check DCSTypes#Weapon +--- Destroys a missile from the simulator, but checks first if it is still existing! +-- @param #CLEANUP self +-- @param DCSTypes#Weapon MissileObject +function CLEANUP:_DestroyMissile( MissileObject ) + self:F( { MissileObject } ) + + if MissileObject and MissileObject:isExist() then + MissileObject:destroy() + self:T( "MissileObject Destroyed") + end +end + +function CLEANUP:_OnEventBirth( Event ) + self:F( { Event } ) + + self.CleanUpList[Event.IniDCSUnitName] = {} + self.CleanUpList[Event.IniDCSUnitName].CleanUpUnit = Event.IniDCSUnit + self.CleanUpList[Event.IniDCSUnitName].CleanUpGroup = Event.IniDCSGroup + self.CleanUpList[Event.IniDCSUnitName].CleanUpGroupName = Event.IniDCSGroupName + self.CleanUpList[Event.IniDCSUnitName].CleanUpUnitName = Event.IniDCSUnitName + + _EVENTDISPATCHER:OnEngineShutDownForUnit( Event.IniDCSUnitName, self._EventAddForCleanUp, self ) + _EVENTDISPATCHER:OnEngineStartUpForUnit( Event.IniDCSUnitName, self._EventAddForCleanUp, self ) + _EVENTDISPATCHER:OnHitForUnit( Event.IniDCSUnitName, self._EventAddForCleanUp, self ) + _EVENTDISPATCHER:OnPilotDeadForUnit( Event.IniDCSUnitName, self._EventCrash, self ) + _EVENTDISPATCHER:OnDeadForUnit( Event.IniDCSUnitName, self._EventCrash, self ) + _EVENTDISPATCHER:OnCrashForUnit( Event.IniDCSUnitName, self._EventCrash, self ) + _EVENTDISPATCHER:OnShotForUnit( Event.IniDCSUnitName, self._EventShot, self ) + + --self:AddEvent( world.event.S_EVENT_ENGINE_SHUTDOWN, self._EventAddForCleanUp ) + --self:AddEvent( world.event.S_EVENT_ENGINE_STARTUP, self._EventAddForCleanUp ) +-- self:AddEvent( world.event.S_EVENT_HIT, self._EventAddForCleanUp ) -- , self._EventHitCleanUp ) +-- self:AddEvent( world.event.S_EVENT_CRASH, self._EventCrash ) -- , self._EventHitCleanUp ) +-- --self:AddEvent( world.event.S_EVENT_DEAD, self._EventCrash ) +-- self:AddEvent( world.event.S_EVENT_SHOT, self._EventShot ) +-- +-- self:EnableEvents() + + +end + +--- Detects if a crash event occurs. +-- Crashed units go into a CleanUpList for removal. +-- @param #CLEANUP self +-- @param DCSTypes#Event event +function CLEANUP:_EventCrash( Event ) + self:F( { Event } ) + + --TODO: This stuff is not working due to a DCS bug. Burning units cannot be destroyed. + --MESSAGE:New( "Crash ", "Crash", 10, "Crash" ):ToAll() + -- self:T("before getGroup") + -- local _grp = Unit.getGroup(event.initiator)-- Identify the group that fired + -- self:T("after getGroup") + -- _grp:destroy() + -- self:T("after deactivateGroup") + -- event.initiator:destroy() + + self.CleanUpList[Event.IniDCSUnitName] = {} + self.CleanUpList[Event.IniDCSUnitName].CleanUpUnit = Event.IniDCSUnit + self.CleanUpList[Event.IniDCSUnitName].CleanUpGroup = Event.IniDCSGroup + self.CleanUpList[Event.IniDCSUnitName].CleanUpGroupName = Event.IniDCSGroupName + self.CleanUpList[Event.IniDCSUnitName].CleanUpUnitName = Event.IniDCSUnitName + +end + +--- Detects if a unit shoots a missile. +-- If this occurs within one of the zones, then the weapon used must be destroyed. +-- @param #CLEANUP self +-- @param DCSTypes#Event event +function CLEANUP:_EventShot( Event ) + self:F( { Event } ) + + -- Test if the missile was fired within one of the CLEANUP.ZoneNames. + local CurrentLandingZoneID = 0 + CurrentLandingZoneID = routines.IsUnitInZones( Event.IniDCSUnit, self.ZoneNames ) + if ( CurrentLandingZoneID ) then + -- Okay, the missile was fired within the CLEANUP.ZoneNames, destroy the fired weapon. + --_SEADmissile:destroy() + --routines.scheduleFunction( CLEANUP._DestroyMissile, { self, Event.Weapon }, timer.getTime() + 0.1) + SCHEDULER:New( self, CLEANUP._DestroyMissile, { Event.Weapon }, 0.1 ) + end +end + + +--- Detects if the Unit has an S_EVENT_HIT within the given ZoneNames. If this is the case, destroy the unit. +-- @param #CLEANUP self +-- @param DCSTypes#Event event +function CLEANUP:_EventHitCleanUp( Event ) + self:F( { Event } ) + + if Event.IniDCSUnit then + if routines.IsUnitInZones( Event.IniDCSUnit, self.ZoneNames ) ~= nil then + self:T( { "Life: ", Event.IniDCSUnitName, ' = ', Event.IniDCSUnit:getLife(), "/", Event.IniDCSUnit:getLife0() } ) + if Event.IniDCSUnit:getLife() < Event.IniDCSUnit:getLife0() then + self:T( "CleanUp: Destroy: " .. Event.IniDCSUnitName ) + --routines.scheduleFunction( CLEANUP._DestroyUnit, { self, Event.IniDCSUnit }, timer.getTime() + 0.1) + SCHEDULER:New( self, CLEANUP._DestroyUnit, { Event.IniDCSUnit }, 0.1 ) + end + end + end + + if Event.TgtDCSUnit then + if routines.IsUnitInZones( Event.TgtDCSUnit, self.ZoneNames ) ~= nil then + self:T( { "Life: ", Event.TgtDCSUnitName, ' = ', Event.TgtDCSUnit:getLife(), "/", Event.TgtDCSUnit:getLife0() } ) + if Event.TgtDCSUnit:getLife() < Event.TgtDCSUnit:getLife0() then + self:T( "CleanUp: Destroy: " .. Event.TgtDCSUnitName ) + --routines.scheduleFunction( CLEANUP._DestroyUnit, { self, Event.TgtDCSUnit }, timer.getTime() + 0.1 ) + SCHEDULER:New( self, CLEANUP._DestroyUnit, { Event.TgtDCSUnit }, 0.1 ) + end + end + end +end + +--- Add the @{DCSUnit#Unit} to the CleanUpList for CleanUp. +function CLEANUP:_AddForCleanUp( CleanUpUnit, CleanUpUnitName ) + self:F( { CleanUpUnit, CleanUpUnitName } ) + + self.CleanUpList[CleanUpUnitName] = {} + self.CleanUpList[CleanUpUnitName].CleanUpUnit = CleanUpUnit + self.CleanUpList[CleanUpUnitName].CleanUpUnitName = CleanUpUnitName + self.CleanUpList[CleanUpUnitName].CleanUpGroup = Unit.getGroup(CleanUpUnit) + self.CleanUpList[CleanUpUnitName].CleanUpGroupName = Unit.getGroup(CleanUpUnit):getName() + self.CleanUpList[CleanUpUnitName].CleanUpTime = timer.getTime() + self.CleanUpList[CleanUpUnitName].CleanUpMoved = false + + self:T( { "CleanUp: Add to CleanUpList: ", Unit.getGroup(CleanUpUnit):getName(), CleanUpUnitName } ) + +end + +--- Detects if the Unit has an S_EVENT_ENGINE_SHUTDOWN or an S_EVENT_HIT within the given ZoneNames. If this is the case, add the Group to the CLEANUP List. +-- @param #CLEANUP self +-- @param DCSTypes#Event event +function CLEANUP:_EventAddForCleanUp( Event ) + + if Event.IniDCSUnit then + if self.CleanUpList[Event.IniDCSUnitName] == nil then + if routines.IsUnitInZones( Event.IniDCSUnit, self.ZoneNames ) ~= nil then + self:_AddForCleanUp( Event.IniDCSUnit, Event.IniDCSUnitName ) + end + end + end + + if Event.TgtDCSUnit then + if self.CleanUpList[Event.TgtDCSUnitName] == nil then + if routines.IsUnitInZones( Event.TgtDCSUnit, self.ZoneNames ) ~= nil then + self:_AddForCleanUp( Event.TgtDCSUnit, Event.TgtDCSUnitName ) + end + end + end + +end + +local CleanUpSurfaceTypeText = { + "LAND", + "SHALLOW_WATER", + "WATER", + "ROAD", + "RUNWAY" + } + +--- At the defined time interval, CleanUp the Groups within the CleanUpList. +-- @param #CLEANUP self +function CLEANUP:_CleanUpScheduler() + self:F( { "CleanUp Scheduler" } ) + + local CleanUpCount = 0 + for CleanUpUnitName, UnitData in pairs( self.CleanUpList ) do + CleanUpCount = CleanUpCount + 1 + + self:T( { CleanUpUnitName, UnitData } ) + local CleanUpUnit = Unit.getByName(UnitData.CleanUpUnitName) + local CleanUpGroupName = UnitData.CleanUpGroupName + local CleanUpUnitName = UnitData.CleanUpUnitName + if CleanUpUnit then + self:T( { "CleanUp Scheduler", "Checking:", CleanUpUnitName } ) + if _DATABASE:GetStatusGroup( CleanUpGroupName ) ~= "ReSpawn" then + local CleanUpUnitVec3 = CleanUpUnit:getPoint() + --self:T( CleanUpUnitVec3 ) + local CleanUpUnitVec2 = {} + CleanUpUnitVec2.x = CleanUpUnitVec3.x + CleanUpUnitVec2.y = CleanUpUnitVec3.z + --self:T( CleanUpUnitVec2 ) + local CleanUpSurfaceType = land.getSurfaceType(CleanUpUnitVec2) + --self:T( CleanUpSurfaceType ) + --MESSAGE:New( "Surface " .. CleanUpUnitName .. " = " .. CleanUpSurfaceTypeText[CleanUpSurfaceType], CleanUpUnitName, 10, CleanUpUnitName ):ToAll() + + if CleanUpUnit and CleanUpUnit:getLife() <= CleanUpUnit:getLife0() * 0.95 then + if CleanUpSurfaceType == land.SurfaceType.RUNWAY then + if CleanUpUnit:inAir() then + local CleanUpLandHeight = land.getHeight(CleanUpUnitVec2) + local CleanUpUnitHeight = CleanUpUnitVec3.y - CleanUpLandHeight + self:T( { "CleanUp Scheduler", "Height = " .. CleanUpUnitHeight } ) + if CleanUpUnitHeight < 30 then + self:T( { "CleanUp Scheduler", "Destroy " .. CleanUpUnitName .. " because below safe height and damaged." } ) + self:_DestroyUnit(CleanUpUnit, CleanUpUnitName) + end + else + self:T( { "CleanUp Scheduler", "Destroy " .. CleanUpUnitName .. " because on runway and damaged." } ) + self:_DestroyUnit(CleanUpUnit, CleanUpUnitName) + end + end + end + -- Clean Units which are waiting for a very long time in the CleanUpZone. + if CleanUpUnit then + local CleanUpUnitVelocity = CleanUpUnit:getVelocity() + local CleanUpUnitVelocityTotal = math.abs(CleanUpUnitVelocity.x) + math.abs(CleanUpUnitVelocity.y) + math.abs(CleanUpUnitVelocity.z) + if CleanUpUnitVelocityTotal < 1 then + if UnitData.CleanUpMoved then + if UnitData.CleanUpTime + 180 <= timer.getTime() then + self:T( { "CleanUp Scheduler", "Destroy due to not moving anymore " .. CleanUpUnitName } ) + self:_DestroyUnit(CleanUpUnit, CleanUpUnitName) + end + end + else + UnitData.CleanUpTime = timer.getTime() + UnitData.CleanUpMoved = true + --MESSAGE:New( "Moved " .. CleanUpUnitName, CleanUpUnitName, 10, CleanUpUnitName ):ToAll() + end + end + + else + -- Do nothing ... + self.CleanUpList[CleanUpUnitName] = nil -- Not anymore in the DCSRTE + end + else + self:T( "CleanUp: Group " .. CleanUpUnitName .. " cannot be found in DCS RTE, removing ..." ) + self.CleanUpList[CleanUpUnitName] = nil -- Not anymore in the DCSRTE + end + end + self:T(CleanUpCount) + + return true +end + +--- This module contains the SPAWN class. +-- +-- 1) @{Spawn#SPAWN} class, extends @{Base#BASE} +-- ============================================= +-- The @{#SPAWN} class allows to spawn dynamically new groups, based on pre-defined initialization settings, modifying the behaviour when groups are spawned. +-- For each group to be spawned, within the mission editor, a group has to be created with the "late activation flag" set. We call this group the *"Spawn Template"* of the SPAWN object. +-- A reference to this Spawn Template needs to be provided when constructing the SPAWN object, by indicating the name of the group within the mission editor in the constructor methods. +-- +-- Within the SPAWN object, there is an internal index that keeps track of which group from the internal group list was spawned. +-- When new groups get spawned by using the SPAWN functions (see below), it will be validated whether the Limits (@{#SPAWN.Limit}) of the SPAWN object are not reached. +-- When all is valid, a new group will be created by the spawning methods, and the internal index will be increased with 1. +-- +-- Regarding the name of new spawned groups, a _SpawnPrefix_ will be assigned for each new group created. +-- If you want to have the Spawn Template name to be used as the _SpawnPrefix_ name, use the @{#SPAWN.New} constructor. +-- However, when the @{#SPAWN.NewWithAlias} constructor was used, the Alias name will define the _SpawnPrefix_ name. +-- Groups will follow the following naming structure when spawned at run-time: +-- +-- 1. Spawned groups will have the name _SpawnPrefix_#ggg, where ggg is a counter from 0 to 999. +-- 2. Spawned units will have the name _SpawnPrefix_#ggg-uu, where uu is a counter from 0 to 99 for each new spawned unit belonging to the group. +-- +-- Some additional notes that need to be remembered: +-- +-- * Templates are actually groups defined within the mission editor, with the flag "Late Activation" set. As such, these groups are never used within the mission, but are used by the @{#SPAWN} module. +-- * It is important to defined BEFORE you spawn new groups, a proper initialization of the SPAWN instance is done with the options you want to use. +-- * When designing a mission, NEVER name groups using a "#" within the name of the group Spawn Template(s), or the SPAWN module logic won't work anymore. +-- +-- 1.1) SPAWN construction methods +-- ------------------------------- +-- Create a new SPAWN object with the @{#SPAWN.New} or the @{#SPAWN.NewWithAlias} methods: +-- +-- * @{#SPAWN.New}: Creates a new SPAWN object taking the name of the group that functions as the Template. +-- +-- It is important to understand how the SPAWN class works internally. The SPAWN object created will contain internally a list of groups that will be spawned and that are already spawned. +-- The initialization functions will modify this list of groups so that when a group gets spawned, ALL information is already prepared when spawning. This is done for performance reasons. +-- So in principle, the group list will contain all parameters and configurations after initialization, and when groups get actually spawned, this spawning can be done quickly and efficient. +-- +-- 1.2) SPAWN initialization methods +-- --------------------------------- +-- A spawn object will behave differently based on the usage of initialization methods: +-- +-- * @{#SPAWN.Limit}: Limits the amount of groups that can be alive at the same time and that can be dynamically spawned. +-- * @{#SPAWN.RandomizeRoute}: Randomize the routes of spawned groups. +-- * @{#SPAWN.RandomizeTemplate}: Randomize the group templates so that when a new group is spawned, a random group template is selected from one of the templates defined. +-- * @{#SPAWN.Uncontrolled}: Spawn plane groups uncontrolled. +-- * @{#SPAWN.Array}: Make groups visible before they are actually activated, and order these groups like a batallion in an array. +-- * @{#SPAWN.InitRepeat}: Re-spawn groups when they land at the home base. Similar functions are @{#SPAWN.InitRepeatOnLanding} and @{#SPAWN.InitRepeatOnEngineShutDown}. +-- +-- 1.3) SPAWN spawning methods +-- --------------------------- +-- Groups can be spawned at different times and methods: +-- +-- * @{#SPAWN.Spawn}: Spawn one new group based on the last spawned index. +-- * @{#SPAWN.ReSpawn}: Re-spawn a group based on a given index. +-- * @{#SPAWN.SpawnScheduled}: Spawn groups at scheduled but randomized intervals. You can use @{#SPAWN.SpawnScheduleStart} and @{#SPAWN.SpawnScheduleStop} to start and stop the schedule respectively. +-- * @{#SPAWN.SpawnFromUnit}: Spawn a new group taking the position of a @{UNIT}. +-- * @{#SPAWN.SpawnInZone}: Spawn a new group in a @{ZONE}. +-- +-- Note that @{#SPAWN.Spawn} and @{#SPAWN.ReSpawn} return a @{GROUP#GROUP.New} object, that contains a reference to the DCSGroup object. +-- You can use the @{GROUP} object to do further actions with the DCSGroup. +-- +-- 1.4) SPAWN object cleaning +-- -------------------------- +-- Sometimes, it will occur during a mission run-time, that ground or especially air objects get damaged, and will while being damged stop their activities, while remaining alive. +-- In such cases, the SPAWN object will just sit there and wait until that group gets destroyed, but most of the time it won't, +-- and it may occur that no new groups are or can be spawned as limits are reached. +-- To prevent this, a @{#SPAWN.CleanUp} initialization method has been defined that will silently monitor the status of each spawned group. +-- Once a group has a velocity = 0, and has been waiting for a defined interval, that group will be cleaned or removed from run-time. +-- There is a catch however :-) If a damaged group has returned to an airbase within the coalition, that group will not be considered as "lost"... +-- In such a case, when the inactive group is cleaned, a new group will Re-spawned automatically. +-- This models AI that has succesfully returned to their airbase, to restart their combat activities. +-- Check the @{#SPAWN.CleanUp} for further info. +-- +-- +-- @module Spawn +-- @author FlightControl + +Include.File( "Routines" ) +Include.File( "Base" ) +Include.File( "Database" ) +Include.File( "Group" ) +Include.File( "Zone" ) +Include.File( "Event" ) +Include.File( "Scheduler" ) + +--- SPAWN Class +-- @type SPAWN +-- @extends Base#BASE +-- @field ClassName +-- @field #string SpawnTemplatePrefix +-- @field #string SpawnAliasPrefix +SPAWN = { + ClassName = "SPAWN", + SpawnTemplatePrefix = nil, + SpawnAliasPrefix = nil, +} + + + +--- Creates the main object to spawn a GROUP defined in the DCS ME. +-- @param #SPAWN self +-- @param #string SpawnTemplatePrefix is the name of the Group in the ME that defines the Template. Each new group will have the name starting with SpawnTemplatePrefix. +-- @return #SPAWN +-- @usage +-- -- NATO helicopters engaging in the battle field. +-- Spawn_BE_KA50 = SPAWN:New( 'BE KA-50@RAMP-Ground Defense' ) +-- @usage local Plane = SPAWN:New( "Plane" ) -- Creates a new local variable that can initiate new planes with the name "Plane#ddd" using the template "Plane" as defined within the ME. +function SPAWN:New( SpawnTemplatePrefix ) + local self = BASE:Inherit( self, BASE:New() ) + self:F( { SpawnTemplatePrefix } ) + + local TemplateGroup = Group.getByName( SpawnTemplatePrefix ) + if TemplateGroup then + self.SpawnTemplatePrefix = SpawnTemplatePrefix + self.SpawnIndex = 0 + self.SpawnCount = 0 -- The internal counter of the amount of spawning the has happened since SpawnStart. + self.AliveUnits = 0 -- Contains the counter how many units are currently alive + self.SpawnIsScheduled = false -- Reflects if the spawning for this SpawnTemplatePrefix is going to be scheduled or not. + self.SpawnTemplate = self._GetTemplate( self, SpawnTemplatePrefix ) -- Contains the template structure for a Group Spawn from the Mission Editor. Note that this group must have lateActivation always on!!! + self.Repeat = false -- Don't repeat the group from Take-Off till Landing and back Take-Off by ReSpawning. + self.UnControlled = false -- When working in UnControlled mode, all planes are Spawned in UnControlled mode before the scheduler starts. + self.SpawnMaxUnitsAlive = 0 -- The maximum amount of groups that can be alive of SpawnTemplatePrefix at the same time. + self.SpawnMaxGroups = 0 -- The maximum amount of groups that can be spawned. + self.SpawnRandomize = false -- Sets the randomization flag of new Spawned units to false. + self.SpawnVisible = false -- Flag that indicates if all the Groups of the SpawnGroup need to be visible when Spawned. + + self.SpawnGroups = {} -- Array containing the descriptions of each Group to be Spawned. + else + error( "SPAWN:New: There is no group declared in the mission editor with SpawnTemplatePrefix = '" .. SpawnTemplatePrefix .. "'" ) + end + + return self +end + +--- Creates a new SPAWN instance to create new groups based on the defined template and using a new alias for each new group. +-- @param #SPAWN self +-- @param #string SpawnTemplatePrefix is the name of the Group in the ME that defines the Template. +-- @param #string SpawnAliasPrefix is the name that will be given to the Group at runtime. +-- @return #SPAWN +-- @usage +-- -- NATO helicopters engaging in the battle field. +-- Spawn_BE_KA50 = SPAWN:NewWithAlias( 'BE KA-50@RAMP-Ground Defense', 'Helicopter Attacking a City' ) +-- @usage local PlaneWithAlias = SPAWN:NewWithAlias( "Plane", "Bomber" ) -- Creates a new local variable that can instantiate new planes with the name "Bomber#ddd" using the template "Plane" as defined within the ME. +function SPAWN:NewWithAlias( SpawnTemplatePrefix, SpawnAliasPrefix ) + local self = BASE:Inherit( self, BASE:New() ) + self:F( { SpawnTemplatePrefix, SpawnAliasPrefix } ) + + local TemplateGroup = Group.getByName( SpawnTemplatePrefix ) + if TemplateGroup then + self.SpawnTemplatePrefix = SpawnTemplatePrefix + self.SpawnAliasPrefix = SpawnAliasPrefix + self.SpawnIndex = 0 + self.SpawnCount = 0 -- The internal counter of the amount of spawning the has happened since SpawnStart. + self.AliveUnits = 0 -- Contains the counter how many units are currently alive + self.SpawnIsScheduled = false -- Reflects if the spawning for this SpawnTemplatePrefix is going to be scheduled or not. + self.SpawnTemplate = self._GetTemplate( self, SpawnTemplatePrefix ) -- Contains the template structure for a Group Spawn from the Mission Editor. Note that this group must have lateActivation always on!!! + self.Repeat = false -- Don't repeat the group from Take-Off till Landing and back Take-Off by ReSpawning. + self.UnControlled = false -- When working in UnControlled mode, all planes are Spawned in UnControlled mode before the scheduler starts. + self.SpawnMaxUnitsAlive = 0 -- The maximum amount of groups that can be alive of SpawnTemplatePrefix at the same time. + self.SpawnMaxGroups = 0 -- The maximum amount of groups that can be spawned. + self.SpawnRandomize = false -- Sets the randomization flag of new Spawned units to false. + self.SpawnVisible = false -- Flag that indicates if all the Groups of the SpawnGroup need to be visible when Spawned. + + self.SpawnGroups = {} -- Array containing the descriptions of each Group to be Spawned. + else + error( "SPAWN:New: There is no group declared in the mission editor with SpawnTemplatePrefix = '" .. SpawnTemplatePrefix .. "'" ) + end + + return self +end + + +--- Limits the Maximum amount of Units that can be alive at the same time, and the maximum amount of groups that can be spawned. +-- Note that this method is exceptionally important to balance the performance of the mission. Depending on the machine etc, a mission can only process a maximum amount of units. +-- If the time interval must be short, but there should not be more Units or Groups alive than a maximum amount of units, then this function should be used... +-- When a @{#SPAWN.New} is executed and the limit of the amount of units alive is reached, then no new spawn will happen of the group, until some of these units of the spawn object will be destroyed. +-- @param #SPAWN self +-- @param #number SpawnMaxUnitsAlive The maximum amount of units that can be alive at runtime. +-- @param #number SpawnMaxGroups The maximum amount of groups that can be spawned. When the limit is reached, then no more actual spawns will happen of the group. +-- This parameter is useful to define a maximum amount of airplanes, ground troops, helicopters, ships etc within a supply area. +-- This parameter accepts the value 0, which defines that there are no maximum group limits, but there are limits on the maximum of units that can be alive at the same time. +-- @return #SPAWN self +-- @usage +-- -- NATO helicopters engaging in the battle field. +-- -- This helicopter group consists of one Unit. So, this group will SPAWN maximum 2 groups simultaneously within the DCSRTE. +-- -- There will be maximum 24 groups spawned during the whole mission lifetime. +-- Spawn_BE_KA50 = SPAWN:New( 'BE KA-50@RAMP-Ground Defense' ):Limit( 2, 24 ) +function SPAWN:Limit( SpawnMaxUnitsAlive, SpawnMaxGroups ) + self:F( { self.SpawnTemplatePrefix, SpawnMaxUnitsAlive, SpawnMaxGroups } ) + + self.SpawnMaxUnitsAlive = SpawnMaxUnitsAlive -- The maximum amount of groups that can be alive of SpawnTemplatePrefix at the same time. + self.SpawnMaxGroups = SpawnMaxGroups -- The maximum amount of groups that can be spawned. + + for SpawnGroupID = 1, self.SpawnMaxGroups do + self:_InitializeSpawnGroups( SpawnGroupID ) + end + + return self +end + + +--- Randomizes the defined route of the SpawnTemplatePrefix group in the ME. This is very useful to define extra variation of the behaviour of groups. +-- @param #SPAWN self +-- @param #number SpawnStartPoint is the waypoint where the randomization begins. +-- Note that the StartPoint = 0 equaling the point where the group is spawned. +-- @param #number SpawnEndPoint is the waypoint where the randomization ends counting backwards. +-- This parameter is useful to avoid randomization to end at a waypoint earlier than the last waypoint on the route. +-- @param #number SpawnRadius is the radius in meters in which the randomization of the new waypoints, with the original waypoint of the original template located in the middle ... +-- @return #SPAWN +-- @usage +-- -- NATO helicopters engaging in the battle field. +-- -- The KA-50 has waypoints Start point ( =0 or SP ), 1, 2, 3, 4, End point (= 5 or DP). +-- -- Waypoints 2 and 3 will only be randomized. The others will remain on their original position with each new spawn of the helicopter. +-- -- The randomization of waypoint 2 and 3 will take place within a radius of 2000 meters. +-- Spawn_BE_KA50 = SPAWN:New( 'BE KA-50@RAMP-Ground Defense' ):RandomizeRoute( 2, 2, 2000 ) +function SPAWN:RandomizeRoute( SpawnStartPoint, SpawnEndPoint, SpawnRadius ) + self:F( { self.SpawnTemplatePrefix, SpawnStartPoint, SpawnEndPoint, SpawnRadius } ) + + self.SpawnRandomizeRoute = true + self.SpawnRandomizeRouteStartPoint = SpawnStartPoint + self.SpawnRandomizeRouteEndPoint = SpawnEndPoint + self.SpawnRandomizeRouteRadius = SpawnRadius + + for GroupID = 1, self.SpawnMaxGroups do + self:_RandomizeRoute( GroupID ) + end + + return self +end + + +--- This function is rather complicated to understand. But I'll try to explain. +-- This function becomes useful when you need to spawn groups with random templates of groups defined within the mission editor, +-- but they will all follow the same Template route and have the same prefix name. +-- In other words, this method randomizes between a defined set of groups the template to be used for each new spawn of a group. +-- @param #SPAWN self +-- @param #string SpawnTemplatePrefixTable A table with the names of the groups defined within the mission editor, from which one will be choosen when a new group will be spawned. +-- @return #SPAWN +-- @usage +-- -- NATO Tank Platoons invading Gori. +-- -- Choose between 13 different 'US Tank Platoon' configurations for each new SPAWN the Group to be spawned for the +-- -- 'US Tank Platoon Left', 'US Tank Platoon Middle' and 'US Tank Platoon Right' SpawnTemplatePrefixes. +-- -- Each new SPAWN will randomize the route, with a defined time interval of 200 seconds with 40% time variation (randomization) and +-- -- with a limit set of maximum 12 Units alive simulteneously and 150 Groups to be spawned during the whole mission. +-- Spawn_US_Platoon = { 'US Tank Platoon 1', 'US Tank Platoon 2', 'US Tank Platoon 3', 'US Tank Platoon 4', 'US Tank Platoon 5', +-- 'US Tank Platoon 6', 'US Tank Platoon 7', 'US Tank Platoon 8', 'US Tank Platoon 9', 'US Tank Platoon 10', +-- 'US Tank Platoon 11', 'US Tank Platoon 12', 'US Tank Platoon 13' } +-- Spawn_US_Platoon_Left = SPAWN:New( 'US Tank Platoon Left' ):Limit( 12, 150 ):Schedule( 200, 0.4 ):RandomizeTemplate( Spawn_US_Platoon ):RandomizeRoute( 3, 3, 2000 ) +-- Spawn_US_Platoon_Middle = SPAWN:New( 'US Tank Platoon Middle' ):Limit( 12, 150 ):Schedule( 200, 0.4 ):RandomizeTemplate( Spawn_US_Platoon ):RandomizeRoute( 3, 3, 2000 ) +-- Spawn_US_Platoon_Right = SPAWN:New( 'US Tank Platoon Right' ):Limit( 12, 150 ):Schedule( 200, 0.4 ):RandomizeTemplate( Spawn_US_Platoon ):RandomizeRoute( 3, 3, 2000 ) +function SPAWN:RandomizeTemplate( SpawnTemplatePrefixTable ) + self:F( { self.SpawnTemplatePrefix, SpawnTemplatePrefixTable } ) + + self.SpawnTemplatePrefixTable = SpawnTemplatePrefixTable + self.SpawnRandomizeTemplate = true + + for SpawnGroupID = 1, self.SpawnMaxGroups do + self:_RandomizeTemplate( SpawnGroupID ) + end + + return self +end + + + + + +--- For planes and helicopters, when these groups go home and land on their home airbases and farps, they normally would taxi to the parking spot, shut-down their engines and wait forever until the Group is removed by the runtime environment. +-- This function is used to re-spawn automatically (so no extra call is needed anymore) the same group after it has landed. +-- This will enable a spawned group to be re-spawned after it lands, until it is destroyed... +-- Note: When the group is respawned, it will re-spawn from the original airbase where it took off. +-- So ensure that the routes for groups that respawn, always return to the original airbase, or players may get confused ... +-- @param #SPAWN self +-- @return #SPAWN self +-- @usage +-- -- RU Su-34 - AI Ship Attack +-- -- Re-SPAWN the Group(s) after each landing and Engine Shut-Down automatically. +-- SpawnRU_SU34 = SPAWN:New( 'TF1 RU Su-34 Krymsk@AI - Attack Ships' ):Schedule( 2, 3, 1800, 0.4 ):SpawnUncontrolled():RandomizeRoute( 1, 1, 3000 ):RepeatOnEngineShutDown() +function SPAWN:InitRepeat() + self:F( { self.SpawnTemplatePrefix, self.SpawnIndex } ) + + self.Repeat = true + self.RepeatOnEngineShutDown = false + self.RepeatOnLanding = true + + return self +end + +--- Respawn group after landing. +-- @param #SPAWN self +-- @return #SPAWN self +function SPAWN:InitRepeatOnLanding() + self:F( { self.SpawnTemplatePrefix } ) + + self:InitRepeat() + self.RepeatOnEngineShutDown = false + self.RepeatOnLanding = true + + return self +end + + +--- Respawn after landing when its engines have shut down. +-- @param #SPAWN self +-- @return #SPAWN self +function SPAWN:InitRepeatOnEngineShutDown() + self:F( { self.SpawnTemplatePrefix } ) + + self:InitRepeat() + self.RepeatOnEngineShutDown = true + self.RepeatOnLanding = false + + return self +end + + +--- CleanUp groups when they are still alive, but inactive. +-- When groups are still alive and have become inactive due to damage and are unable to contribute anything, then this group will be removed at defined intervals in seconds. +-- @param #SPAWN self +-- @param #string SpawnCleanUpInterval The interval to check for inactive groups within seconds. +-- @return #SPAWN self +-- @usage Spawn_Helicopter:CleanUp( 20 ) -- CleanUp the spawning of the helicopters every 20 seconds when they become inactive. +function SPAWN:CleanUp( SpawnCleanUpInterval ) + self:F( { self.SpawnTemplatePrefix, SpawnCleanUpInterval } ) + + self.SpawnCleanUpInterval = SpawnCleanUpInterval + self.SpawnCleanUpTimeStamps = {} + --self.CleanUpFunction = routines.scheduleFunction( self._SpawnCleanUpScheduler, { self }, timer.getTime() + 1, SpawnCleanUpInterval ) + self.CleanUpScheduler = SCHEDULER:New( self, self._SpawnCleanUpScheduler, {}, 1, SpawnCleanUpInterval, 0.2 ) + return self +end + + + +--- Makes the groups visible before start (like a batallion). +-- The method will take the position of the group as the first position in the array. +-- @param #SPAWN self +-- @param #number SpawnAngle The angle in degrees how the groups and each unit of the group will be positioned. +-- @param #number SpawnWidth The amount of Groups that will be positioned on the X axis. +-- @param #number SpawnDeltaX The space between each Group on the X-axis. +-- @param #number SpawnDeltaY The space between each Group on the Y-axis. +-- @return #SPAWN self +-- @usage +-- -- Define an array of Groups. +-- Spawn_BE_Ground = SPAWN:New( 'BE Ground' ):Limit( 2, 24 ):Visible( 90, "Diamond", 10, 100, 50 ) +function SPAWN:Array( SpawnAngle, SpawnWidth, SpawnDeltaX, SpawnDeltaY ) + self:F( { self.SpawnTemplatePrefix, SpawnAngle, SpawnWidth, SpawnDeltaX, SpawnDeltaY } ) + + self.SpawnVisible = true -- When the first Spawn executes, all the Groups need to be made visible before start. + + local SpawnX = 0 + local SpawnY = 0 + local SpawnXIndex = 0 + local SpawnYIndex = 0 + + for SpawnGroupID = 1, self.SpawnMaxGroups do + self:T( { SpawnX, SpawnY, SpawnXIndex, SpawnYIndex } ) + + self.SpawnGroups[SpawnGroupID].Visible = true + self.SpawnGroups[SpawnGroupID].Spawned = false + + SpawnXIndex = SpawnXIndex + 1 + if SpawnWidth and SpawnWidth ~= 0 then + if SpawnXIndex >= SpawnWidth then + SpawnXIndex = 0 + SpawnYIndex = SpawnYIndex + 1 + end + end + + local SpawnRootX = self.SpawnGroups[SpawnGroupID].SpawnTemplate.x + local SpawnRootY = self.SpawnGroups[SpawnGroupID].SpawnTemplate.y + + self:_TranslateRotate( SpawnGroupID, SpawnRootX, SpawnRootY, SpawnX, SpawnY, SpawnAngle ) + + self.SpawnGroups[SpawnGroupID].SpawnTemplate.lateActivation = true + self.SpawnGroups[SpawnGroupID].SpawnTemplate.visible = true + + self.SpawnGroups[SpawnGroupID].Visible = true + + _EVENTDISPATCHER:OnBirthForTemplate( self.SpawnGroups[SpawnGroupID].SpawnTemplate, self._OnBirth, self ) + _EVENTDISPATCHER:OnCrashForTemplate( self.SpawnGroups[SpawnGroupID].SpawnTemplate, self._OnDeadOrCrash, self ) + _EVENTDISPATCHER:OnDeadForTemplate( self.SpawnGroups[SpawnGroupID].SpawnTemplate, self._OnDeadOrCrash, self ) + + if self.Repeat then + _EVENTDISPATCHER:OnTakeOffForTemplate( self.SpawnGroups[SpawnGroupID].SpawnTemplate, self._OnTakeOff, self ) + _EVENTDISPATCHER:OnLandForTemplate( self.SpawnGroups[SpawnGroupID].SpawnTemplate, self._OnLand, self ) + end + if self.RepeatOnEngineShutDown then + _EVENTDISPATCHER:OnEngineShutDownForTemplate( self.SpawnGroups[SpawnGroupID].SpawnTemplate, self._OnEngineShutDown, self ) + end + + self.SpawnGroups[SpawnGroupID].Group = _DATABASE:Spawn( self.SpawnGroups[SpawnGroupID].SpawnTemplate ) + + SpawnX = SpawnXIndex * SpawnDeltaX + SpawnY = SpawnYIndex * SpawnDeltaY + end + + return self +end + + + +--- Will spawn a group based on the internal index. +-- Note: Uses @{DATABASE} module defined in MOOSE. +-- @param #SPAWN self +-- @return Group#GROUP The group that was spawned. You can use this group for further actions. +function SPAWN:Spawn() + self:F( { self.SpawnTemplatePrefix, self.SpawnIndex } ) + + return self:SpawnWithIndex( self.SpawnIndex + 1 ) +end + +--- Will re-spawn a group based on a given index. +-- Note: Uses @{DATABASE} module defined in MOOSE. +-- @param #SPAWN self +-- @param #string SpawnIndex The index of the group to be spawned. +-- @return Group#GROUP The group that was spawned. You can use this group for further actions. +function SPAWN:ReSpawn( SpawnIndex ) + self:F( { self.SpawnTemplatePrefix, SpawnIndex } ) + + if not SpawnIndex then + SpawnIndex = 1 + end + +-- TODO: This logic makes DCS crash and i don't know why (yet). + local SpawnGroup = self:GetGroupFromIndex( SpawnIndex ) + if SpawnGroup then + local SpawnDCSGroup = SpawnGroup:GetDCSGroup() + if SpawnDCSGroup then + SpawnGroup:Destroy() + end + end + + return self:SpawnWithIndex( SpawnIndex ) +end + +--- Will spawn a group with a specified index number. +-- Uses @{DATABASE} global object defined in MOOSE. +-- @param #SPAWN self +-- @return Group#GROUP The group that was spawned. You can use this group for further actions. +function SPAWN:SpawnWithIndex( SpawnIndex ) + self:F( { self.SpawnTemplatePrefix, SpawnIndex, self.SpawnMaxGroups } ) + + if self:_GetSpawnIndex( SpawnIndex ) then + + if self.SpawnGroups[self.SpawnIndex].Visible then + self.SpawnGroups[self.SpawnIndex].Group:Activate() + else + self:T( self.SpawnGroups[self.SpawnIndex].SpawnTemplate ) + _EVENTDISPATCHER:OnBirthForTemplate( self.SpawnGroups[self.SpawnIndex].SpawnTemplate, self._OnBirth, self ) + _EVENTDISPATCHER:OnCrashForTemplate( self.SpawnGroups[self.SpawnIndex].SpawnTemplate, self._OnDeadOrCrash, self ) + _EVENTDISPATCHER:OnDeadForTemplate( self.SpawnGroups[self.SpawnIndex].SpawnTemplate, self._OnDeadOrCrash, self ) + + if self.Repeat then + _EVENTDISPATCHER:OnTakeOffForTemplate( self.SpawnGroups[self.SpawnIndex].SpawnTemplate, self._OnTakeOff, self ) + _EVENTDISPATCHER:OnLandForTemplate( self.SpawnGroups[self.SpawnIndex].SpawnTemplate, self._OnLand, self ) + end + if self.RepeatOnEngineShutDown then + _EVENTDISPATCHER:OnEngineShutDownForTemplate( self.SpawnGroups[self.SpawnIndex].SpawnTemplate, self._OnEngineShutDown, self ) + end + + self:T( self.SpawnGroups[self.SpawnIndex].SpawnTemplate ) + + self.SpawnGroups[self.SpawnIndex].Group = _DATABASE:Spawn( self.SpawnGroups[self.SpawnIndex].SpawnTemplate ) + + -- If there is a SpawnFunction hook defined, call it. + if self.SpawnFunctionHook then + self.SpawnFunctionHook( self.SpawnGroups[self.SpawnIndex].Group, unpack( self.SpawnFunctionArguments ) ) + end + -- TODO: Need to fix this by putting an "R" in the name of the group when the group repeats. + --if self.Repeat then + -- _DATABASE:SetStatusGroup( SpawnTemplate.name, "ReSpawn" ) + --end + end + + self.SpawnGroups[self.SpawnIndex].Spawned = true + + local SpawnGroup = self.SpawnGroups[self.SpawnIndex].Group -- Group#GROUP + local Route = SpawnGroup:GetTaskRoute() + SpawnGroup:Route(Route) + + + return self.SpawnGroups[self.SpawnIndex].Group + else + --self:E( { self.SpawnTemplatePrefix, "No more Groups to Spawn:", SpawnIndex, self.SpawnMaxGroups } ) + end + + return nil +end + +--- Spawns new groups at varying time intervals. +-- This is useful if you want to have continuity within your missions of certain (AI) groups to be present (alive) within your missions. +-- @param #SPAWN self +-- @param #number SpawnTime The time interval defined in seconds between each new spawn of new groups. +-- @param #number SpawnTimeVariation The variation to be applied on the defined time interval between each new spawn. +-- The variation is a number between 0 and 1, representing the %-tage of variation to be applied on the time interval. +-- @return #SPAWN self +-- @usage +-- -- NATO helicopters engaging in the battle field. +-- -- The time interval is set to SPAWN new helicopters between each 600 seconds, with a time variation of 50%. +-- -- The time variation in this case will be between 450 seconds and 750 seconds. +-- -- This is calculated as follows: +-- -- Low limit: 600 * ( 1 - 0.5 / 2 ) = 450 +-- -- High limit: 600 * ( 1 + 0.5 / 2 ) = 750 +-- -- Between these two values, a random amount of seconds will be choosen for each new spawn of the helicopters. +-- Spawn_BE_KA50 = SPAWN:New( 'BE KA-50@RAMP-Ground Defense' ):Schedule( 600, 0.5 ) +function SPAWN:SpawnScheduled( SpawnTime, SpawnTimeVariation ) + self:F( { SpawnTime, SpawnTimeVariation } ) + + if SpawnTime ~= nil and SpawnTimeVariation ~= nil then + self.SpawnScheduler = SCHEDULER:New( self, self._Scheduler, {}, 1, SpawnTime, SpawnTimeVariation ) + end + + return self +end + +--- Will re-start the spawning scheduler. +-- Note: This function is only required to be called when the schedule was stopped. +function SPAWN:SpawnScheduleStart() + self:F( { self.SpawnTemplatePrefix } ) + + self.SpawnScheduler:Start() +end + +--- Will stop the scheduled spawning scheduler. +function SPAWN:SpawnScheduleStop() + self:F( { self.SpawnTemplatePrefix } ) + + self.SpawnScheduler:Stop() +end + + +--- Allows to place a CallFunction hook when a new group spawns. +-- The provided function will be called when a new group is spawned, including its given parameters. +-- The first parameter of the SpawnFunction is the @{Group#GROUP} that was spawned. +-- @param #SPAWN self +-- @param #function SpawnFunctionHook The function to be called when a group spawns. +-- @param SpawnFunctionArguments A random amount of arguments to be provided to the function when the group spawns. +-- @return #SPAWN +function SPAWN:SpawnFunction( SpawnFunctionHook, ... ) + self:F( SpawnFunction ) + + self.SpawnFunctionHook = SpawnFunctionHook + self.SpawnFunctionArguments = {} + if arg then + self.SpawnFunctionArguments = arg + end + + return self +end + + + + +--- Will spawn a group from a hosting unit. This function is mostly advisable to be used if you want to simulate spawning from air units, like helicopters, which are dropping infantry into a defined Landing Zone. +-- Note that each point in the route assigned to the spawning group is reset to the point of the spawn. +-- You can use the returned group to further define the route to be followed. +-- @param #SPAWN self +-- @param Unit#UNIT HostUnit The air or ground unit dropping or unloading the group. +-- @param #number OuterRadius The outer radius in meters where the new group will be spawned. +-- @param #number InnerRadius The inner radius in meters where the new group will NOT be spawned. +-- @param #number SpawnIndex (Optional) The index which group to spawn within the given zone. +-- @return Group#GROUP that was spawned. +-- @return #nil Nothing was spawned. +function SPAWN:SpawnFromUnit( HostUnit, OuterRadius, InnerRadius, SpawnIndex ) + self:F( { self.SpawnTemplatePrefix, HostUnit, OuterRadius, InnerRadius, SpawnIndex } ) + + if HostUnit and HostUnit:IsAlive() then -- and HostUnit:getUnit(1):inAir() == false then + + if SpawnIndex then + else + SpawnIndex = self.SpawnIndex + 1 + end + + if self:_GetSpawnIndex( SpawnIndex ) then + + local SpawnTemplate = self.SpawnGroups[self.SpawnIndex].SpawnTemplate + + if SpawnTemplate then + + local UnitPoint = HostUnit:GetPointVec2() + + self:T( { "Current point of ", self.SpawnTemplatePrefix, UnitPoint } ) + + --for PointID, Point in pairs( SpawnTemplate.route.points ) do + --Point.x = UnitPoint.x + --Point.y = UnitPoint.y + --Point.alt = nil + --Point.alt_type = nil + --end + + SpawnTemplate.route.points[1].x = UnitPoint.x + SpawnTemplate.route.points[1].y = UnitPoint.y + + if not InnerRadius then + InnerRadius = 10 + end + + if not OuterRadius then + OuterRadius = 50 + end + + -- Apply SpawnFormation + for UnitID = 1, #SpawnTemplate.units do + if InnerRadius == 0 then + SpawnTemplate.units[UnitID].x = UnitPoint.x + SpawnTemplate.units[UnitID].y = UnitPoint.y + else + local CirclePos = routines.getRandPointInCircle( UnitPoint, OuterRadius, InnerRadius ) + SpawnTemplate.units[UnitID].x = CirclePos.x + SpawnTemplate.units[UnitID].y = CirclePos.y + end + self:T( 'SpawnTemplate.units['..UnitID..'].x = ' .. SpawnTemplate.units[UnitID].x .. ', SpawnTemplate.units['..UnitID..'].y = ' .. SpawnTemplate.units[UnitID].y ) + end + + local SpawnPos = routines.getRandPointInCircle( UnitPoint, OuterRadius, InnerRadius ) + local Point = {} + Point.type = "Turning Point" + Point.x = SpawnPos.x + Point.y = SpawnPos.y + Point.action = "Cone" + Point.speed = 5 + + table.insert( SpawnTemplate.route.points, 2, Point ) + + return self:SpawnWithIndex( self.SpawnIndex ) + end + end + end + + return nil +end + +--- Will spawn a Group within a given @{Zone#ZONE}. +-- Once the group is spawned within the zone, it will continue on its route. +-- The first waypoint (where the group is spawned) is replaced with the zone coordinates. +-- @param #SPAWN self +-- @param Zone#ZONE Zone The zone where the group is to be spawned. +-- @param #number ZoneRandomize (Optional) Set to true if you want to randomize the starting point in the zone. +-- @param #number SpawnIndex (Optional) The index which group to spawn within the given zone. +-- @return Group#GROUP that was spawned. +-- @return #nil when nothing was spawned. +function SPAWN:SpawnInZone( Zone, ZoneRandomize, SpawnIndex ) + self:F( { self.SpawnTemplatePrefix, Zone, ZoneRandomize, SpawnIndex } ) + + if Zone then + + if SpawnIndex then + else + SpawnIndex = self.SpawnIndex + 1 + end + + if self:_GetSpawnIndex( SpawnIndex ) then + + local SpawnTemplate = self.SpawnGroups[self.SpawnIndex].SpawnTemplate + + if SpawnTemplate then + + local ZonePoint + + if ZoneRandomize == true then + ZonePoint = Zone:GetRandomPointVec2() + else + ZonePoint = Zone:GetPointVec2() + end + + SpawnTemplate.route.points[1].x = ZonePoint.x + SpawnTemplate.route.points[1].y = ZonePoint.y + + -- Apply SpawnFormation + for UnitID = 1, #SpawnTemplate.units do + local ZonePointUnit = Zone:GetRandomPointVec2() + SpawnTemplate.units[UnitID].x = ZonePointUnit.x + SpawnTemplate.units[UnitID].y = ZonePointUnit.y + self:T( 'SpawnTemplate.units['..UnitID..'].x = ' .. SpawnTemplate.units[UnitID].x .. ', SpawnTemplate.units['..UnitID..'].y = ' .. SpawnTemplate.units[UnitID].y ) + end + + return self:SpawnWithIndex( self.SpawnIndex ) + end + end + end + + return nil +end + + + + +--- Will spawn a plane group in uncontrolled mode... +-- This will be similar to the uncontrolled flag setting in the ME. +-- @return #SPAWN self +function SPAWN:UnControlled() + self:F( { self.SpawnTemplatePrefix } ) + + self.SpawnUnControlled = true + + for SpawnGroupID = 1, self.SpawnMaxGroups do + self.SpawnGroups[SpawnGroupID].UnControlled = true + end + + return self +end + + + +--- Will return the SpawnGroupName either with with a specific count number or without any count. +-- @param #SPAWN self +-- @param #number SpawnIndex Is the number of the Group that is to be spawned. +-- @return #string SpawnGroupName +function SPAWN:SpawnGroupName( SpawnIndex ) + self:F( { self.SpawnTemplatePrefix, SpawnIndex } ) + + local SpawnPrefix = self.SpawnTemplatePrefix + if self.SpawnAliasPrefix then + SpawnPrefix = self.SpawnAliasPrefix + end + + if SpawnIndex then + local SpawnName = string.format( '%s#%03d', SpawnPrefix, SpawnIndex ) + self:T( SpawnName ) + return SpawnName + else + self:T( SpawnPrefix ) + return SpawnPrefix + end + +end + +--- Find the first alive group. +-- @param #SPAWN self +-- @param #number SpawnCursor A number holding the index from where to find the first group from. +-- @return Group#GROUP, #number The group found, the new index where the group was found. +-- @return #nil, #nil When no group is found, #nil is returned. +function SPAWN:GetFirstAliveGroup( SpawnCursor ) + self:F( { self.SpawnTemplatePrefix, self.SpawnAliasPrefix, SpawnCursor } ) + + for SpawnIndex = 1, self.SpawnCount do + local SpawnGroup = self:GetGroupFromIndex( SpawnIndex ) + if SpawnGroup and SpawnGroup:IsAlive() then + SpawnCursor = SpawnIndex + return SpawnGroup, SpawnCursor + end + end + + return nil, nil +end + + +--- Find the next alive group. +-- @param #SPAWN self +-- @param #number SpawnCursor A number holding the last found previous index. +-- @return Group#GROUP, #number The group found, the new index where the group was found. +-- @return #nil, #nil When no group is found, #nil is returned. +function SPAWN:GetNextAliveGroup( SpawnCursor ) + self:F( { self.SpawnTemplatePrefix, self.SpawnAliasPrefix, SpawnCursor } ) + + SpawnCursor = SpawnCursor + 1 + for SpawnIndex = SpawnCursor, self.SpawnCount do + local SpawnGroup = self:GetGroupFromIndex( SpawnIndex ) + if SpawnGroup and SpawnGroup:IsAlive() then + SpawnCursor = SpawnIndex + return SpawnGroup, SpawnCursor + end + end + + return nil, nil +end + +--- Find the last alive group during runtime. +function SPAWN:GetLastAliveGroup() + self:F( { self.SpawnTemplatePrefixself.SpawnAliasPrefix } ) + + self.SpawnIndex = self:_GetLastIndex() + for SpawnIndex = self.SpawnIndex, 1, -1 do + local SpawnGroup = self:GetGroupFromIndex( SpawnIndex ) + if SpawnGroup and SpawnGroup:IsAlive() then + self.SpawnIndex = SpawnIndex + return SpawnGroup + end + end + + self.SpawnIndex = nil + return nil +end + + + +--- Get the group from an index. +-- Returns the group from the SpawnGroups list. +-- If no index is given, it will return the first group in the list. +-- @param #SPAWN self +-- @param #number SpawnIndex The index of the group to return. +-- @return Group#GROUP +function SPAWN:GetGroupFromIndex( SpawnIndex ) + self:F( { self.SpawnTemplatePrefix, self.SpawnAliasPrefix, SpawnIndex } ) + + if not SpawnIndex then + SpawnIndex = 1 + end + + if self.SpawnGroups and self.SpawnGroups[SpawnIndex] then + local SpawnGroup = self.SpawnGroups[SpawnIndex].Group + return SpawnGroup + else + return nil + end +end + +--- Get the group index from a DCSUnit. +-- The method will search for a #-mark, and will return the index behind the #-mark of the DCSUnit. +-- It will return nil of no prefix was found. +-- @param #SPAWN self +-- @param DCSUnit The DCS unit to be searched. +-- @return #string The prefix +-- @return #nil Nothing found +function SPAWN:_GetGroupIndexFromDCSUnit( DCSUnit ) + self:F( { self.SpawnTemplatePrefix, self.SpawnAliasPrefix, DCSUnit } ) + + if DCSUnit and DCSUnit:getName() then + local IndexString = string.match( DCSUnit:getName(), "#.*-" ):sub( 2, -2 ) + self:T( IndexString ) + + if IndexString then + local Index = tonumber( IndexString ) + self:T( { "Index:", IndexString, Index } ) + return Index + end + end + + return nil +end + +--- Return the prefix of a DCSUnit. +-- The method will search for a #-mark, and will return the text before the #-mark. +-- It will return nil of no prefix was found. +-- @param #SPAWN self +-- @param DCSUnit The DCS unit to be searched. +-- @return #string The prefix +-- @return #nil Nothing found +function SPAWN:_GetPrefixFromDCSUnit( DCSUnit ) + self:F( { self.SpawnTemplatePrefix, self.SpawnAliasPrefix, DCSUnit } ) + + if DCSUnit and DCSUnit:getName() then + local SpawnPrefix = string.match( DCSUnit:getName(), ".*#" ) + if SpawnPrefix then + SpawnPrefix = SpawnPrefix:sub( 1, -2 ) + end + self:T( SpawnPrefix ) + return SpawnPrefix + end + + return nil +end + +--- Return the group within the SpawnGroups collection with input a DCSUnit. +function SPAWN:_GetGroupFromDCSUnit( DCSUnit ) + self:F( { self.SpawnTemplatePrefix, self.SpawnAliasPrefix, DCSUnit } ) + + if DCSUnit then + local SpawnPrefix = self:_GetPrefixFromDCSUnit( DCSUnit ) + + if self.SpawnTemplatePrefix == SpawnPrefix or ( self.SpawnAliasPrefix and self.SpawnAliasPrefix == SpawnPrefix ) then + local SpawnGroupIndex = self:_GetGroupIndexFromDCSUnit( DCSUnit ) + local SpawnGroup = self.SpawnGroups[SpawnGroupIndex].Group + self:T( SpawnGroup ) + return SpawnGroup + end + end + + return nil +end + + +--- Get the index from a given group. +-- The function will search the name of the group for a #, and will return the number behind the #-mark. +function SPAWN:GetSpawnIndexFromGroup( SpawnGroup ) + self:F( { self.SpawnTemplatePrefix, self.SpawnAliasPrefix, SpawnGroup } ) + + local IndexString = string.match( SpawnGroup:GetName(), "#.*$" ):sub( 2 ) + local Index = tonumber( IndexString ) + + self:T( IndexString, Index ) + return Index + +end + +--- Return the last maximum index that can be used. +function SPAWN:_GetLastIndex() + self:F( { self.SpawnTemplatePrefix, self.SpawnAliasPrefix } ) + + return self.SpawnMaxGroups +end + +--- Initalize the SpawnGroups collection. +function SPAWN:_InitializeSpawnGroups( SpawnIndex ) + self:F( { self.SpawnTemplatePrefix, self.SpawnAliasPrefix, SpawnIndex } ) + + if not self.SpawnGroups[SpawnIndex] then + self.SpawnGroups[SpawnIndex] = {} + self.SpawnGroups[SpawnIndex].Visible = false + self.SpawnGroups[SpawnIndex].Spawned = false + self.SpawnGroups[SpawnIndex].UnControlled = false + self.SpawnGroups[SpawnIndex].SpawnTime = 0 + + self.SpawnGroups[SpawnIndex].SpawnTemplatePrefix = self.SpawnTemplatePrefix + self.SpawnGroups[SpawnIndex].SpawnTemplate = self:_Prepare( self.SpawnGroups[SpawnIndex].SpawnTemplatePrefix, SpawnIndex ) + end + + self:_RandomizeTemplate( SpawnIndex ) + self:_RandomizeRoute( SpawnIndex ) + --self:_TranslateRotate( SpawnIndex ) + + return self.SpawnGroups[SpawnIndex] +end + + + +--- Gets the CategoryID of the Group with the given SpawnPrefix +function SPAWN:_GetGroupCategoryID( SpawnPrefix ) + local TemplateGroup = Group.getByName( SpawnPrefix ) + + if TemplateGroup then + return TemplateGroup:getCategory() + else + return nil + end +end + +--- Gets the CoalitionID of the Group with the given SpawnPrefix +function SPAWN:_GetGroupCoalitionID( SpawnPrefix ) + local TemplateGroup = Group.getByName( SpawnPrefix ) + + if TemplateGroup then + return TemplateGroup:getCoalition() + else + return nil + end +end + +--- Gets the CountryID of the Group with the given SpawnPrefix +function SPAWN:_GetGroupCountryID( SpawnPrefix ) + self:F( { self.SpawnTemplatePrefix, self.SpawnAliasPrefix, SpawnPrefix } ) + + local TemplateGroup = Group.getByName( SpawnPrefix ) + + if TemplateGroup then + local TemplateUnits = TemplateGroup:getUnits() + return TemplateUnits[1]:getCountry() + else + return nil + end +end + +--- Gets the Group Template from the ME environment definition. +-- This method used the @{DATABASE} object, which contains ALL initial and new spawned object in MOOSE. +-- @param #SPAWN self +-- @param #string SpawnTemplatePrefix +-- @return @SPAWN self +function SPAWN:_GetTemplate( SpawnTemplatePrefix ) + self:F( { self.SpawnTemplatePrefix, self.SpawnAliasPrefix, SpawnTemplatePrefix } ) + + local SpawnTemplate = nil + + SpawnTemplate = routines.utils.deepCopy( _DATABASE.Templates.Groups[SpawnTemplatePrefix].Template ) + + if SpawnTemplate == nil then + error( 'No Template returned for SpawnTemplatePrefix = ' .. SpawnTemplatePrefix ) + end + + SpawnTemplate.SpawnCoalitionID = self:_GetGroupCoalitionID( SpawnTemplatePrefix ) + SpawnTemplate.SpawnCategoryID = self:_GetGroupCategoryID( SpawnTemplatePrefix ) + SpawnTemplate.SpawnCountryID = self:_GetGroupCountryID( SpawnTemplatePrefix ) + + self:T( { SpawnTemplate } ) + return SpawnTemplate +end + +--- Prepares the new Group Template. +-- @param #SPAWN self +-- @param #string SpawnTemplatePrefix +-- @param #number SpawnIndex +-- @return #SPAWN self +function SPAWN:_Prepare( SpawnTemplatePrefix, SpawnIndex ) + self:F( { self.SpawnTemplatePrefix, self.SpawnAliasPrefix } ) + + local SpawnTemplate = self:_GetTemplate( SpawnTemplatePrefix ) + SpawnTemplate.name = self:SpawnGroupName( SpawnIndex ) + + SpawnTemplate.groupId = nil + --SpawnTemplate.lateActivation = false + SpawnTemplate.lateActivation = false -- TODO BUGFIX + + if SpawnTemplate.SpawnCategoryID == Group.Category.GROUND then + self:T( "For ground units, visible needs to be false..." ) + SpawnTemplate.visible = false -- TODO BUGFIX + end + + if SpawnTemplate.SpawnCategoryID == Group.Category.HELICOPTER or SpawnTemplate.SpawnCategoryID == Group.Category.AIRPLANE then + SpawnTemplate.uncontrolled = false + end + + for UnitID = 1, #SpawnTemplate.units do + SpawnTemplate.units[UnitID].name = string.format( SpawnTemplate.name .. '-%02d', UnitID ) + SpawnTemplate.units[UnitID].unitId = nil + SpawnTemplate.units[UnitID].x = SpawnTemplate.route.points[1].x + SpawnTemplate.units[UnitID].y = SpawnTemplate.route.points[1].y + end + + self:T( { "Template:", SpawnTemplate } ) + return SpawnTemplate + +end + +--- Private method randomizing the routes. +-- @param #SPAWN self +-- @param #number SpawnIndex The index of the group to be spawned. +-- @return #SPAWN +function SPAWN:_RandomizeRoute( SpawnIndex ) + self:F( { self.SpawnTemplatePrefix, SpawnIndex, self.SpawnRandomizeRoute, self.SpawnRandomizeRouteStartPoint, self.SpawnRandomizeRouteEndPoint, self.SpawnRandomizeRouteRadius } ) + + if self.SpawnRandomizeRoute then + local SpawnTemplate = self.SpawnGroups[SpawnIndex].SpawnTemplate + local RouteCount = #SpawnTemplate.route.points + + for t = self.SpawnRandomizeRouteStartPoint + 1, ( RouteCount - self.SpawnRandomizeRouteEndPoint ) do + SpawnTemplate.route.points[t].x = SpawnTemplate.route.points[t].x + math.random( self.SpawnRandomizeRouteRadius * -1, self.SpawnRandomizeRouteRadius ) + SpawnTemplate.route.points[t].y = SpawnTemplate.route.points[t].y + math.random( self.SpawnRandomizeRouteRadius * -1, self.SpawnRandomizeRouteRadius ) + -- TODO: manage altitude for airborne units ... + SpawnTemplate.route.points[t].alt = nil + --SpawnGroup.route.points[t].alt_type = nil + self:T( 'SpawnTemplate.route.points[' .. t .. '].x = ' .. SpawnTemplate.route.points[t].x .. ', SpawnTemplate.route.points[' .. t .. '].y = ' .. SpawnTemplate.route.points[t].y ) + end + end + + return self +end + +--- Private method that randomizes the template of the group. +-- @param #SPAWN self +-- @param #number SpawnIndex +-- @return #SPAWN self +function SPAWN:_RandomizeTemplate( SpawnIndex ) + self:F( { self.SpawnTemplatePrefix, SpawnIndex, self.SpawnRandomizeTemplate } ) + + if self.SpawnRandomizeTemplate then + self.SpawnGroups[SpawnIndex].SpawnTemplatePrefix = self.SpawnTemplatePrefixTable[ math.random( 1, #self.SpawnTemplatePrefixTable ) ] + self.SpawnGroups[SpawnIndex].SpawnTemplate = self:_Prepare( self.SpawnGroups[SpawnIndex].SpawnTemplatePrefix, SpawnIndex ) + self.SpawnGroups[SpawnIndex].SpawnTemplate.route = routines.utils.deepCopy( self.SpawnTemplate.route ) + self.SpawnGroups[SpawnIndex].SpawnTemplate.x = self.SpawnTemplate.x + self.SpawnGroups[SpawnIndex].SpawnTemplate.y = self.SpawnTemplate.y + self.SpawnGroups[SpawnIndex].SpawnTemplate.start_time = self.SpawnTemplate.start_time + for UnitID = 1, #self.SpawnGroups[SpawnIndex].SpawnTemplate.units do + self.SpawnGroups[SpawnIndex].SpawnTemplate.units[UnitID].heading = self.SpawnTemplate.units[1].heading + end + end + + self:_RandomizeRoute( SpawnIndex ) + + return self +end + +function SPAWN:_TranslateRotate( SpawnIndex, SpawnRootX, SpawnRootY, SpawnX, SpawnY, SpawnAngle ) + self:F( { self.SpawnTemplatePrefix, SpawnIndex, SpawnRootX, SpawnRootY, SpawnX, SpawnY, SpawnAngle } ) + + -- Translate + local TranslatedX = SpawnX + local TranslatedY = SpawnY + + -- Rotate + -- From Wikipedia: https://en.wikipedia.org/wiki/Rotation_matrix#Common_rotations + -- x' = x \cos \theta - y \sin \theta\ + -- y' = x \sin \theta + y \cos \theta\ + local RotatedX = - TranslatedX * math.cos( math.rad( SpawnAngle ) ) + + TranslatedY * math.sin( math.rad( SpawnAngle ) ) + local RotatedY = TranslatedX * math.sin( math.rad( SpawnAngle ) ) + + TranslatedY * math.cos( math.rad( SpawnAngle ) ) + + -- Assign + self.SpawnGroups[SpawnIndex].SpawnTemplate.x = SpawnRootX - RotatedX + self.SpawnGroups[SpawnIndex].SpawnTemplate.y = SpawnRootY + RotatedY + + + local SpawnUnitCount = table.getn( self.SpawnGroups[SpawnIndex].SpawnTemplate.units ) + for u = 1, SpawnUnitCount do + + -- Translate + local TranslatedX = SpawnX + local TranslatedY = SpawnY - 10 * ( u - 1 ) + + -- Rotate + local RotatedX = - TranslatedX * math.cos( math.rad( SpawnAngle ) ) + + TranslatedY * math.sin( math.rad( SpawnAngle ) ) + local RotatedY = TranslatedX * math.sin( math.rad( SpawnAngle ) ) + + TranslatedY * math.cos( math.rad( SpawnAngle ) ) + + -- Assign + self.SpawnGroups[SpawnIndex].SpawnTemplate.units[u].x = SpawnRootX - RotatedX + self.SpawnGroups[SpawnIndex].SpawnTemplate.units[u].y = SpawnRootY + RotatedY + self.SpawnGroups[SpawnIndex].SpawnTemplate.units[u].heading = self.SpawnGroups[SpawnIndex].SpawnTemplate.units[u].heading + math.rad( SpawnAngle ) + end + + return self +end + +--- Get the next index of the groups to be spawned. This function is complicated, as it is used at several spaces. +function SPAWN:_GetSpawnIndex( SpawnIndex ) + self:F( { self.SpawnTemplatePrefix, SpawnIndex, self.SpawnMaxGroups, self.SpawnMaxUnitsAlive, self.AliveUnits, #self.SpawnTemplate.units } ) + + + if ( self.SpawnMaxGroups == 0 ) or ( SpawnIndex <= self.SpawnMaxGroups ) then + if ( self.SpawnMaxUnitsAlive == 0 ) or ( self.AliveUnits < self.SpawnMaxUnitsAlive * #self.SpawnTemplate.units ) or self.UnControlled then + if SpawnIndex and SpawnIndex >= self.SpawnCount + 1 then + self.SpawnCount = self.SpawnCount + 1 + SpawnIndex = self.SpawnCount + end + self.SpawnIndex = SpawnIndex + if not self.SpawnGroups[self.SpawnIndex] then + self:_InitializeSpawnGroups( self.SpawnIndex ) + end + else + return nil + end + else + return nil + end + + return self.SpawnIndex +end + + +-- TODO Need to delete this... _DATABASE does this now ... +function SPAWN:_OnBirth( event ) + + if timer.getTime0() < timer.getAbsTime() then -- dont need to add units spawned in at the start of the mission if mist is loaded in init line + if event.initiator and event.initiator:getName() then + local EventPrefix = self:_GetPrefixFromDCSUnit( event.initiator ) + if EventPrefix == self.SpawnTemplatePrefix or ( self.SpawnAliasPrefix and EventPrefix == self.SpawnAliasPrefix ) then + self:T( { "Birth event: " .. event.initiator:getName(), event } ) + --MessageToAll( "Mission command: unit " .. SpawnTemplatePrefix .. " spawned." , 5, EventPrefix .. '/Event') + self.AliveUnits = self.AliveUnits + 1 + self:T( "Alive Units: " .. self.AliveUnits ) + end + end + end + +end + +--- Obscolete +-- @todo Need to delete this... _DATABASE does this now ... +function SPAWN:_OnDeadOrCrash( event ) + self:F( self.SpawnTemplatePrefix, event ) + + if event.initiator and event.initiator:getName() then + local EventPrefix = self:_GetPrefixFromDCSUnit( event.initiator ) + if EventPrefix == self.SpawnTemplatePrefix or ( self.SpawnAliasPrefix and EventPrefix == self.SpawnAliasPrefix ) then + self:T( { "Dead event: " .. event.initiator:getName(), event } ) +-- local DestroyedUnit = Unit.getByName( EventPrefix ) +-- if DestroyedUnit and DestroyedUnit.getLife() <= 1.0 then + --MessageToAll( "Mission command: unit " .. SpawnTemplatePrefix .. " crashed." , 5, EventPrefix .. '/Event') + self.AliveUnits = self.AliveUnits - 1 + self:T( "Alive Units: " .. self.AliveUnits ) +-- end + end + end +end + +--- Will detect AIR Units taking off... When the event takes place, the spawned Group is registered as airborne... +-- This is needed to ensure that Re-SPAWNing only is done for landed AIR Groups. +-- @todo Need to test for AIR Groups only... +function SPAWN:_OnTakeOff( event ) + self:F( self.SpawnTemplatePrefix, event ) + + if event.initiator and event.initiator:getName() then + local SpawnGroup = self:_GetGroupFromDCSUnit( event.initiator ) + if SpawnGroup then + self:T( { "TakeOff event: " .. event.initiator:getName(), event } ) + self:T( "self.Landed = false" ) + self.Landed = false + end + end +end + +--- Will detect AIR Units landing... When the event takes place, the spawned Group is registered as landed. +-- This is needed to ensure that Re-SPAWNing is only done for landed AIR Groups. +-- @todo Need to test for AIR Groups only... +function SPAWN:_OnLand( event ) + self:F( self.SpawnTemplatePrefix, event ) + + local SpawnUnit = event.initiator + if SpawnUnit and SpawnUnit:isExist() and Object.getCategory(SpawnUnit) == Object.Category.UNIT then + local SpawnGroup = self:_GetGroupFromDCSUnit( SpawnUnit ) + if SpawnGroup then + self:T( { "Landed event:" .. SpawnUnit:getName(), event } ) + self.Landed = true + self:T( "self.Landed = true" ) + if self.Landed and self.RepeatOnLanding then + local SpawnGroupIndex = self:GetSpawnIndexFromGroup( SpawnGroup ) + self:T( { "Landed:", "ReSpawn:", SpawnGroup:GetName(), SpawnGroupIndex } ) + self:ReSpawn( SpawnGroupIndex ) + end + end + end +end + +--- Will detect AIR Units shutting down their engines ... +-- When the event takes place, and the method @{RepeatOnEngineShutDown} was called, the spawned Group will Re-SPAWN. +-- But only when the Unit was registered to have landed. +-- @param #SPAWN self +-- @see _OnTakeOff +-- @see _OnLand +-- @todo Need to test for AIR Groups only... +function SPAWN:_OnEngineShutDown( event ) + self:F( self.SpawnTemplatePrefix, event ) + + local SpawnUnit = event.initiator + if SpawnUnit and SpawnUnit:isExist() and Object.getCategory(SpawnUnit) == Object.Category.UNIT then + local SpawnGroup = self:_GetGroupFromDCSUnit( SpawnUnit ) + if SpawnGroup then + self:T( { "EngineShutDown event: " .. SpawnUnit:getName(), event } ) + if self.Landed and self.RepeatOnEngineShutDown then + local SpawnGroupIndex = self:GetSpawnIndexFromGroup( SpawnGroup ) + self:T( { "EngineShutDown: ", "ReSpawn:", SpawnGroup:GetName(), SpawnGroupIndex } ) + self:ReSpawn( SpawnGroupIndex ) + end + end + end +end + +--- This function is called automatically by the Spawning scheduler. +-- It is the internal worker method SPAWNing new Groups on the defined time intervals. +function SPAWN:_Scheduler() + self:F( { "_Scheduler", self.SpawnTemplatePrefix, self.SpawnAliasPrefix, self.SpawnIndex, self.SpawnMaxGroups, self.SpawnMaxUnitsAlive } ) + + -- Validate if there are still groups left in the batch... + self:Spawn() + + return true +end + +function SPAWN:_SpawnCleanUpScheduler() + self:F( { "CleanUp Scheduler:", self.SpawnTemplatePrefix } ) + + local SpawnCursor + local SpawnGroup, SpawnCursor = self:GetFirstAliveGroup( SpawnCursor ) + + self:T( { "CleanUp Scheduler:", SpawnGroup } ) + + while SpawnGroup do + + if SpawnGroup:AllOnGround() and SpawnGroup:GetMaxVelocity() < 1 then + if not self.SpawnCleanUpTimeStamps[SpawnGroup:GetName()] then + self.SpawnCleanUpTimeStamps[SpawnGroup:GetName()] = timer.getTime() + else + if self.SpawnCleanUpTimeStamps[SpawnGroup:GetName()] + self.SpawnCleanUpInterval < timer.getTime() then + self:T( { "CleanUp Scheduler:", "Cleaning:", SpawnGroup } ) + SpawnGroup:Destroy() + end + end + else + self.SpawnCleanUpTimeStamps[SpawnGroup:GetName()] = nil + end + + SpawnGroup, SpawnCursor = self:GetNextAliveGroup( SpawnCursor ) + + self:T( { "CleanUp Scheduler:", SpawnGroup } ) + + end + + return true -- Repeat + +end +--- Limit the simultaneous movement of Groups within a running Mission. +-- This module is defined to improve the performance in missions, and to bring additional realism for GROUND vehicles. +-- Performance: If in a DCSRTE there are a lot of moving GROUND units, then in a multi player mission, this WILL create lag if +-- the main DCS execution core of your CPU is fully utilized. So, this class will limit the amount of simultaneous moving GROUND units +-- on defined intervals (currently every minute). +-- @module MOVEMENT + +Include.File( "Routines" ) + +--- the MOVEMENT class +-- @type +MOVEMENT = { + ClassName = "MOVEMENT", +} + +--- Creates the main object which is handling the GROUND forces movement. +-- @param table{string,...}|string MovePrefixes is a table of the Prefixes (names) of the GROUND Groups that need to be controlled by the MOVEMENT Object. +-- @param number MoveMaximum is a number that defines the maximum amount of GROUND Units to be moving during one minute. +-- @return MOVEMENT +-- @usage +-- -- Limit the amount of simultaneous moving units on the ground to prevent lag. +-- Movement_US_Platoons = MOVEMENT:New( { 'US Tank Platoon Left', 'US Tank Platoon Middle', 'US Tank Platoon Right', 'US CH-47D Troops' }, 15 ) + +function MOVEMENT:New( MovePrefixes, MoveMaximum ) + local self = BASE:Inherit( self, BASE:New() ) + self:F( { MovePrefixes, MoveMaximum } ) + + if type( MovePrefixes ) == 'table' then + self.MovePrefixes = MovePrefixes + else + self.MovePrefixes = { MovePrefixes } + end + self.MoveCount = 0 -- The internal counter of the amount of Moveing the has happened since MoveStart. + self.MoveMaximum = MoveMaximum -- Contains the Maximum amount of units that are allowed to move... + self.AliveUnits = 0 -- Contains the counter how many units are currently alive + self.MoveUnits = {} -- Reflects if the Moving for this MovePrefixes is going to be scheduled or not. + + _EVENTDISPATCHER:OnBirth( self.OnBirth, self ) + +-- self:AddEvent( world.event.S_EVENT_BIRTH, self.OnBirth ) +-- +-- self:EnableEvents() + + self:ScheduleStart() + + return self +end + +--- Call this function to start the MOVEMENT scheduling. +function MOVEMENT:ScheduleStart() + self:F() + --self.MoveFunction = routines.scheduleFunction( self._Scheduler, { self }, timer.getTime() + 1, 120 ) + self.MoveFunction = SCHEDULER:New( self, self._Scheduler, {}, 1, 120 ) +end + +--- Call this function to stop the MOVEMENT scheduling. +-- @todo need to implement it ... Forgot. +function MOVEMENT:ScheduleStop() + self:F() + +end + +--- Captures the birth events when new Units were spawned. +-- @todo This method should become obsolete. The new @{DATABASE} class will handle the collection administration. +function MOVEMENT:OnBirth( Event ) + self:F( { Event } ) + + if timer.getTime0() < timer.getAbsTime() then -- dont need to add units spawned in at the start of the mission if mist is loaded in init line + if Event.IniDCSUnit then + self:T( "Birth object : " .. Event.IniDCSUnitName ) + if Event.IniDCSGroup and Event.IniDCSGroup:isExist() then + for MovePrefixID, MovePrefix in pairs( self.MovePrefixes ) do + if string.find( Event.IniDCSUnitName, MovePrefix, 1, true ) then + self.AliveUnits = self.AliveUnits + 1 + self.MoveUnits[Event.IniDCSUnitName] = Event.IniDCSGroupName + self:T( self.AliveUnits ) + end + end + end + end + _EVENTDISPATCHER:OnCrashForUnit( Event.IniDCSUnitName, self.OnDeadOrCrash, self ) + _EVENTDISPATCHER:OnDeadForUnit( Event.IniDCSUnitName, self.OnDeadOrCrash, self ) + end + +end + +--- Captures the Dead or Crash events when Units crash or are destroyed. +-- @todo This method should become obsolete. The new @{DATABASE} class will handle the collection administration. +function MOVEMENT:OnDeadOrCrash( Event ) + self:F( { Event } ) + + if Event.IniDCSUnit then + self:T( "Dead object : " .. Event.IniDCSUnitName ) + for MovePrefixID, MovePrefix in pairs( self.MovePrefixes ) do + if string.find( Event.IniDCSUnitName, MovePrefix, 1, true ) then + self.AliveUnits = self.AliveUnits - 1 + self.MoveUnits[Event.IniDCSUnitName] = nil + self:T( self.AliveUnits ) + end + end + end +end + +--- This function is called automatically by the MOVEMENT scheduler. A new function is scheduled when MoveScheduled is true. +function MOVEMENT:_Scheduler() + self:F( { self.MovePrefixes, self.MoveMaximum, self.AliveUnits, self.MovementGroups } ) + + if self.AliveUnits > 0 then + local MoveProbability = ( self.MoveMaximum * 100 ) / self.AliveUnits + self:T( 'Move Probability = ' .. MoveProbability ) + + for MovementUnitName, MovementGroupName in pairs( self.MoveUnits ) do + local MovementGroup = Group.getByName( MovementGroupName ) + if MovementGroup and MovementGroup:isExist() then + local MoveOrStop = math.random( 1, 100 ) + self:T( 'MoveOrStop = ' .. MoveOrStop ) + if MoveOrStop <= MoveProbability then + self:T( 'Group continues moving = ' .. MovementGroupName ) + trigger.action.groupContinueMoving( MovementGroup ) + else + self:T( 'Group stops moving = ' .. MovementGroupName ) + trigger.action.groupStopMoving( MovementGroup ) + end + else + self.MoveUnits[MovementUnitName] = nil + end + end + end + return true +end +--- Provides defensive behaviour to a set of SAM sites within a running Mission. +-- @module Sead +-- @author to be searched on the forum +-- @author (co) Flightcontrol (Modified and enriched with functionality) + +Include.File( "Routines" ) +Include.File( "Event" ) +Include.File( "Base" ) +Include.File( "Mission" ) +Include.File( "Client" ) +Include.File( "Task" ) + +--- The SEAD class +-- @type SEAD +-- @extends Base#BASE +SEAD = { + ClassName = "SEAD", + TargetSkill = { + Average = { Evade = 50, DelayOff = { 10, 25 }, DelayOn = { 10, 30 } } , + Good = { Evade = 30, DelayOff = { 8, 20 }, DelayOn = { 20, 40 } } , + High = { Evade = 15, DelayOff = { 5, 17 }, DelayOn = { 30, 50 } } , + Excellent = { Evade = 10, DelayOff = { 3, 10 }, DelayOn = { 30, 60 } } + }, + SEADGroupPrefixes = {} +} + +--- Creates the main object which is handling defensive actions for SA sites or moving SA vehicles. +-- When an anti radiation missile is fired (KH-58, KH-31P, KH-31A, KH-25MPU, HARM missiles), the SA will shut down their radars and will take evasive actions... +-- Chances are big that the missile will miss. +-- @param table{string,...}|string SEADGroupPrefixes which is a table of Prefixes of the SA Groups in the DCSRTE on which evasive actions need to be taken. +-- @return SEAD +-- @usage +-- -- CCCP SEAD Defenses +-- -- Defends the Russian SA installations from SEAD attacks. +-- SEAD_RU_SAM_Defenses = SEAD:New( { 'RU SA-6 Kub', 'RU SA-6 Defenses', 'RU MI-26 Troops', 'RU Attack Gori' } ) +function SEAD:New( SEADGroupPrefixes ) + local self = BASE:Inherit( self, BASE:New() ) + self:F( SEADGroupPrefixes ) + if type( SEADGroupPrefixes ) == 'table' then + for SEADGroupPrefixID, SEADGroupPrefix in pairs( SEADGroupPrefixes ) do + self.SEADGroupPrefixes[SEADGroupPrefix] = SEADGroupPrefix + end + else + self.SEADGroupNames[SEADGroupPrefixes] = SEADGroupPrefixes + end + _EVENTDISPATCHER:OnShot( self.EventShot, self ) + + return self +end + +--- Detects if an SA site was shot with an anti radiation missile. In this case, take evasive actions based on the skill level set within the ME. +-- @see SEAD +function SEAD:EventShot( Event ) + self:F( { Event } ) + + local SEADUnit = Event.IniDCSUnit + local SEADUnitName = Event.IniDCSUnitName + local SEADWeapon = Event.Weapon -- Identify the weapon fired + local SEADWeaponName = Event.WeaponName -- return weapon type + --trigger.action.outText( string.format("Alerte, depart missile " ..string.format(SEADWeaponName)), 20) --debug message + -- Start of the 2nd loop + self:T( "Missile Launched = " .. SEADWeaponName ) + if SEADWeaponName == "KH-58" or SEADWeaponName == "KH-25MPU" or SEADWeaponName == "AGM-88" or SEADWeaponName == "KH-31A" or SEADWeaponName == "KH-31P" then -- Check if the missile is a SEAD + local _evade = math.random (1,100) -- random number for chance of evading action + local _targetMim = Event.Weapon:getTarget() -- Identify target + local _targetMimname = Unit.getName(_targetMim) + local _targetMimgroup = Unit.getGroup(Weapon.getTarget(SEADWeapon)) + local _targetMimgroupName = _targetMimgroup:getName() + local _targetMimcont= _targetMimgroup:getController() + local _targetskill = _DATABASE.Templates.Units[_targetMimname].Template.skill + self:T( self.SEADGroupPrefixes ) + self:T( _targetMimgroupName ) + local SEADGroupFound = false + for SEADGroupPrefixID, SEADGroupPrefix in pairs( self.SEADGroupPrefixes ) do + if string.find( _targetMimgroupName, SEADGroupPrefix, 1, true ) then + SEADGroupFound = true + self:T( 'Group Found' ) + break + end + end + if SEADGroupFound == true then + if _targetskill == "Random" then -- when skill is random, choose a skill + local Skills = { "Average", "Good", "High", "Excellent" } + _targetskill = Skills[ math.random(1,4) ] + end + self:T( _targetskill ) -- debug message for skill check + if self.TargetSkill[_targetskill] then + if (_evade > self.TargetSkill[_targetskill].Evade) then + self:T( string.format("Evading, target skill " ..string.format(_targetskill)) ) --debug message + local _targetMim = Weapon.getTarget(SEADWeapon) + local _targetMimname = Unit.getName(_targetMim) + local _targetMimgroup = Unit.getGroup(Weapon.getTarget(SEADWeapon)) + local _targetMimcont= _targetMimgroup:getController() + routines.groupRandomDistSelf(_targetMimgroup,300,'Diamond',250,20) -- move randomly + local SuppressedGroups1 = {} -- unit suppressed radar off for a random time + local function SuppressionEnd1(id) + id.ctrl:setOption(AI.Option.Ground.id.ALARM_STATE,AI.Option.Ground.val.ALARM_STATE.GREEN) + SuppressedGroups1[id.groupName] = nil + end + local id = { + groupName = _targetMimgroup, + ctrl = _targetMimcont + } + local delay1 = math.random(self.TargetSkill[_targetskill].DelayOff[1], self.TargetSkill[_targetskill].DelayOff[2]) + if SuppressedGroups1[id.groupName] == nil then + SuppressedGroups1[id.groupName] = { + SuppressionEndTime1 = timer.getTime() + delay1, + SuppressionEndN1 = SuppressionEndCounter1 --Store instance of SuppressionEnd() scheduled function + } + Controller.setOption(_targetMimcont, AI.Option.Ground.id.ALARM_STATE,AI.Option.Ground.val.ALARM_STATE.GREEN) + timer.scheduleFunction(SuppressionEnd1, id, SuppressedGroups1[id.groupName].SuppressionEndTime1) --Schedule the SuppressionEnd() function + --trigger.action.outText( string.format("Radar Off " ..string.format(delay1)), 20) + end + + local SuppressedGroups = {} + local function SuppressionEnd(id) + id.ctrl:setOption(AI.Option.Ground.id.ALARM_STATE,AI.Option.Ground.val.ALARM_STATE.RED) + SuppressedGroups[id.groupName] = nil + end + local id = { + groupName = _targetMimgroup, + ctrl = _targetMimcont + } + local delay = math.random(self.TargetSkill[_targetskill].DelayOn[1], self.TargetSkill[_targetskill].DelayOn[2]) + if SuppressedGroups[id.groupName] == nil then + SuppressedGroups[id.groupName] = { + SuppressionEndTime = timer.getTime() + delay, + SuppressionEndN = SuppressionEndCounter --Store instance of SuppressionEnd() scheduled function + } + timer.scheduleFunction(SuppressionEnd, id, SuppressedGroups[id.groupName].SuppressionEndTime) --Schedule the SuppressionEnd() function + --trigger.action.outText( string.format("Radar On " ..string.format(delay)), 20) + end + end + end + end + end +end +--- Taking the lead of AI escorting your flight. +-- +-- @{#ESCORT} class +-- ================ +-- The @{#ESCORT} class allows you to interact with escorting AI on your flight and take the lead. +-- Each escorting group can be commanded with a whole set of radio commands (radio menu in your flight, and then F10). +-- +-- The radio commands will vary according the category of the group. The richest set of commands are with Helicopters and AirPlanes. +-- Ships and Ground troops will have a more limited set, but they can provide support through the bombing of targets designated by the other escorts. +-- +-- RADIO MENUs that can be created: +-- ================================ +-- Find a summary below of the current available commands: +-- +-- Navigation ...: +-- --------------- +-- Escort group navigation functions: +-- +-- * **"Join-Up and Follow at x meters":** The escort group fill follow you at about x meters, and they will follow you. +-- * **"Flare":** Provides menu commands to let the escort group shoot a flare in the air in a color. +-- * **"Smoke":** Provides menu commands to let the escort group smoke the air in a color. Note that smoking is only available for ground and naval troops. +-- +-- Hold position ...: +-- ------------------ +-- Escort group navigation functions: +-- +-- * **"At current location":** Stops the escort group and they will hover 30 meters above the ground at the position they stopped. +-- * **"At client location":** Stops the escort group and they will hover 30 meters above the ground at the position they stopped. +-- +-- Report targets ...: +-- ------------------- +-- Report targets will make the escort group to report any target that it identifies within a 8km range. Any detected target can be attacked using the 4. Attack nearby targets function. (see below). +-- +-- * **"Report now":** Will report the current detected targets. +-- * **"Report targets on":** Will make the escort group to report detected targets and will fill the "Attack nearby targets" menu list. +-- * **"Report targets off":** Will stop detecting targets. +-- +-- Scan targets ...: +-- ----------------- +-- Menu items to pop-up the escort group for target scanning. After scanning, the escort group will resume with the mission or defined task. +-- +-- * **"Scan targets 30 seconds":** Scan 30 seconds for targets. +-- * **"Scan targets 60 seconds":** Scan 60 seconds for targets. +-- +-- Attack targets ...: +-- ------------------- +-- This menu item will list all detected targets within a 15km range. Depending on the level of detection (known/unknown) and visuality, the targets type will also be listed. +-- +-- Request assistance from ...: +-- ---------------------------- +-- This menu item will list all detected targets within a 15km range, as with the menu item **Attack Targets**. +-- This menu item allows to request attack support from other escorts supporting the current client group. +-- eg. the function allows a player to request support from the Ship escort to attack a target identified by the Plane escort with its Tomahawk missiles. +-- eg. the function allows a player to request support from other Planes escorting to bomb the unit with illumination missiles or bombs, so that the main plane escort can attack the area. +-- +-- ROE ...: +-- -------- +-- Sets the Rules of Engagement (ROE) of the escort group when in flight. +-- +-- * **"Hold Fire":** The escort group will hold fire. +-- * **"Return Fire":** The escort group will return fire. +-- * **"Open Fire":** The escort group will open fire on designated targets. +-- * **"Weapon Free":** The escort group will engage with any target. +-- +-- Evasion ...: +-- ------------ +-- Will define the evasion techniques that the escort group will perform during flight or combat. +-- +-- * **"Fight until death":** The escort group will have no reaction to threats. +-- * **"Use flares, chaff and jammers":** The escort group will use passive defense using flares and jammers. No evasive manoeuvres are executed. +-- * **"Evade enemy fire":** The rescort group will evade enemy fire before firing. +-- * **"Go below radar and evade fire":** The escort group will perform evasive vertical manoeuvres. +-- +-- Resume Mission ...: +-- ------------------- +-- Escort groups can have their own mission. This menu item will allow the escort group to resume their Mission from a given waypoint. +-- Note that this is really fantastic, as you now have the dynamic of taking control of the escort groups, and allowing them to resume their path or mission. +-- +-- ESCORT construction methods. +-- ============================ +-- Create a new SPAWN object with the @{#ESCORT.New} method: +-- +-- * @{#ESCORT.New}: Creates a new ESCORT object from a @{Group#GROUP} for a @{Client#CLIENT}, with an optional briefing text. +-- +-- ESCORT initialization methods. +-- ============================== +-- The following menus are created within the RADIO MENU of an active unit hosted by a player: +-- +-- * @{#ESCORT.MenuFollowAt}: Creates a menu to make the escort follow the client. +-- * @{#ESCORT.MenuHoldAtEscortPosition}: Creates a menu to hold the escort at its current position. +-- * @{#ESCORT.MenuHoldAtLeaderPosition}: Creates a menu to hold the escort at the client position. +-- * @{#ESCORT.MenuScanForTargets}: Creates a menu so that the escort scans targets. +-- * @{#ESCORT.MenuFlare}: Creates a menu to disperse flares. +-- * @{#ESCORT.MenuSmoke}: Creates a menu to disparse smoke. +-- * @{#ESCORT.MenuReportTargets}: Creates a menu so that the escort reports targets. +-- * @{#ESCORT.MenuReportPosition}: Creates a menu so that the escort reports its current position from bullseye. +-- * @{#ESCORT.MenuAssistedAttack: Creates a menu so that the escort supportes assisted attack from other escorts with the client. +-- * @{#ESCORT.MenuROE: Creates a menu structure to set the rules of engagement of the escort. +-- * @{#ESCORT.MenuEvasion: Creates a menu structure to set the evasion techniques when the escort is under threat. +-- * @{#ESCORT.MenuResumeMission}: Creates a menu structure so that the escort can resume from a waypoint. +-- +-- @module Escort +-- @author FlightControl + +Include.File( "Routines" ) +Include.File( "Base" ) +Include.File( "Database" ) +Include.File( "Group" ) +Include.File( "Zone" ) + +--- +-- @type ESCORT +-- @extends Base#BASE +-- @field Client#CLIENT EscortClient +-- @field Group#GROUP EscortGroup +-- @field #string EscortName +-- @field #ESCORT.MODE EscortMode The mode the escort is in. +-- @field #number FollowScheduler The id of the _FollowScheduler function. +-- @field #boolean ReportTargets If true, nearby targets are reported. +-- @Field DCSTypes#AI.Option.Air.val.ROE OptionROE Which ROE is set to the EscortGroup. +-- @field DCSTypes#AI.Option.Air.val.REACTION_ON_THREAT OptionReactionOnThreat Which REACTION_ON_THREAT is set to the EscortGroup. +-- @field Menu#MENU_CLIENT EscortMenuResumeMission +ESCORT = { + ClassName = "ESCORT", + EscortName = nil, -- The Escort Name + EscortClient = nil, + EscortGroup = nil, + EscortMode = nil, + MODE = { + FOLLOW = 1, + MISSION = 2, + }, + Targets = {}, -- The identified targets + FollowScheduler = nil, + ReportTargets = true, + OptionROE = AI.Option.Air.val.ROE.OPEN_FIRE, + OptionReactionOnThreat = AI.Option.Air.val.REACTION_ON_THREAT.ALLOW_ABORT_MISSION, + TaskPoints = {} +} + +--- ESCORT.Mode class +-- @type ESCORT.MODE +-- @field #number FOLLOW +-- @field #number MISSION + +--- MENUPARAM type +-- @type MENUPARAM +-- @field #ESCORT ParamSelf +-- @field #Distance ParamDistance +-- @field #function ParamFunction +-- @field #string ParamMessage + +--- ESCORT class constructor for an AI group +-- @param #ESCORT self +-- @param Client#CLIENT EscortClient The client escorted by the EscortGroup. +-- @param Group#GROUP EscortGroup The group AI escorting the EscortClient. +-- @param #string EscortName Name of the escort. +-- @return #ESCORT self +function ESCORT:New( EscortClient, EscortGroup, EscortName, EscortBriefing ) + local self = BASE:Inherit( self, BASE:New() ) + self:F( { EscortClient, EscortGroup, EscortName } ) + + self.EscortClient = EscortClient -- Client#CLIENT + self.EscortGroup = EscortGroup -- Group#GROUP + self.EscortName = EscortName + self.EscortBriefing = EscortBriefing + + self:T( EscortGroup:GetClassNameAndID() ) + + -- Set EscortGroup known at EscortClient. + if not self.EscortClient._EscortGroups then + self.EscortClient._EscortGroups = {} + end + + if not self.EscortClient._EscortGroups[EscortGroup:GetName()] then + self.EscortClient._EscortGroups[EscortGroup:GetName()] = {} + self.EscortClient._EscortGroups[EscortGroup:GetName()].EscortGroup = self.EscortGroup + self.EscortClient._EscortGroups[EscortGroup:GetName()].EscortName = self.EscortName + self.EscortClient._EscortGroups[EscortGroup:GetName()].Targets = {} + self.EscortMode = ESCORT.MODE.FOLLOW + end + + + self.EscortMenu = MENU_CLIENT:New( self.EscortClient, self.EscortName ) + + self.EscortGroup:WayPointInitialize(1) + + self.EscortGroup:OptionROTVertical() + self.EscortGroup:OptionROEOpenFire() + + EscortGroup:MessageToClient( EscortGroup:GetCategoryName() .. " '" .. EscortName .. "' (" .. EscortGroup:GetCallsign() .. ") reporting! " .. + "We're escorting your flight. " .. + "Use the Radio Menu and F10 and use the options under + " .. EscortName .. "\n", + 60, EscortClient + ) + + return self +end + + +--- Defines the default menus +-- @param #ESCORT self +-- @return #ESCORT +function ESCORT:Menus() + self:F() + + self:MenuFollowAt( 100 ) + self:MenuFollowAt( 200 ) + self:MenuFollowAt( 300 ) + self:MenuFollowAt( 400 ) + + self:MenuScanForTargets( 100, 60 ) + + self:MenuHoldAtEscortPosition( 30 ) + self:MenuHoldAtLeaderPosition( 30 ) + + self:MenuFlare() + self:MenuSmoke() + + self:MenuReportTargets( 60 ) + self:MenuAssistedAttack() + self:MenuROE() + self:MenuEvasion() + self:MenuResumeMission() + + return self +end + + + +--- Defines a menu slot to let the escort Join and Follow you at a certain distance. +-- This menu will appear under **Navigation**. +-- @param #ESCORT self +-- @param DCSTypes#Distance Distance The distance in meters that the escort needs to follow the client. +-- @return #ESCORT +function ESCORT:MenuFollowAt( Distance ) + self:F(Distance) + + if self.EscortGroup:IsAir() then + if not self.EscortMenuReportNavigation then + self.EscortMenuReportNavigation = MENU_CLIENT:New( self.EscortClient, "Navigation", self.EscortMenu ) + end + + if not self.EscortMenuJoinUpAndFollow then + self.EscortMenuJoinUpAndFollow = {} + end + + self.EscortMenuJoinUpAndFollow[#self.EscortMenuJoinUpAndFollow+1] = MENU_CLIENT_COMMAND:New( self.EscortClient, "Join-Up and Follow at " .. Distance, self.EscortMenuReportNavigation, ESCORT._JoinUpAndFollow, { ParamSelf = self, ParamDistance = Distance } ) + + self.EscortMode = ESCORT.MODE.FOLLOW + end + + return self +end + +--- Defines a menu slot to let the escort hold at their current position and stay low with a specified height during a specified time in seconds. +-- This menu will appear under **Hold position**. +-- @param #ESCORT self +-- @param DCSTypes#Distance Height Optional parameter that sets the height in meters to let the escort orbit at the current location. The default value is 30 meters. +-- @param DCSTypes#Time Seconds Optional parameter that lets the escort orbit at the current position for a specified time. (not implemented yet). The default value is 0 seconds, meaning, that the escort will orbit forever until a sequent command is given. +-- @param #string MenuTextFormat Optional parameter that shows the menu option text. The text string is formatted, and should contain two %d tokens in the string. The first for the Height, the second for the Time (if given). If no text is given, the default text will be displayed. +-- @return #ESCORT +-- TODO: Implement Seconds parameter. Challenge is to first develop the "continue from last activity" function. +function ESCORT:MenuHoldAtEscortPosition( Height, Seconds, MenuTextFormat ) + self:F( { Height, Seconds, MenuTextFormat } ) + + if self.EscortGroup:IsAir() then + + if not self.EscortMenuHold then + self.EscortMenuHold = MENU_CLIENT:New( self.EscortClient, "Hold position", self.EscortMenu ) + end + + if not Height then + Height = 30 + end + + if not Seconds then + Seconds = 0 + end + + local MenuText = "" + if not MenuTextFormat then + if Seconds == 0 then + MenuText = string.format( "Hold at %d meter", Height ) + else + MenuText = string.format( "Hold at %d meter for %d seconds", Height, Seconds ) + end + else + if Seconds == 0 then + MenuText = string.format( MenuTextFormat, Height ) + else + MenuText = string.format( MenuTextFormat, Height, Seconds ) + end + end + + if not self.EscortMenuHoldPosition then + self.EscortMenuHoldPosition = {} + end + + self.EscortMenuHoldPosition[#self.EscortMenuHoldPosition+1] = MENU_CLIENT_COMMAND + :New( + self.EscortClient, + MenuText, + self.EscortMenuHold, + ESCORT._HoldPosition, + { ParamSelf = self, + ParamOrbitGroup = self.EscortGroup, + ParamHeight = Height, + ParamSeconds = Seconds + } + ) + end + + return self +end + + +--- Defines a menu slot to let the escort hold at the client position and stay low with a specified height during a specified time in seconds. +-- This menu will appear under **Navigation**. +-- @param #ESCORT self +-- @param DCSTypes#Distance Height Optional parameter that sets the height in meters to let the escort orbit at the current location. The default value is 30 meters. +-- @param DCSTypes#Time Seconds Optional parameter that lets the escort orbit at the current position for a specified time. (not implemented yet). The default value is 0 seconds, meaning, that the escort will orbit forever until a sequent command is given. +-- @param #string MenuTextFormat Optional parameter that shows the menu option text. The text string is formatted, and should contain one or two %d tokens in the string. The first for the Height, the second for the Time (if given). If no text is given, the default text will be displayed. +-- @return #ESCORT +-- TODO: Implement Seconds parameter. Challenge is to first develop the "continue from last activity" function. +function ESCORT:MenuHoldAtLeaderPosition( Height, Seconds, MenuTextFormat ) + self:F( { Height, Seconds, MenuTextFormat } ) + + if self.EscortGroup:IsAir() then + + if not self.EscortMenuHold then + self.EscortMenuHold = MENU_CLIENT:New( self.EscortClient, "Hold position", self.EscortMenu ) + end + + if not Height then + Height = 30 + end + + if not Seconds then + Seconds = 0 + end + + local MenuText = "" + if not MenuTextFormat then + if Seconds == 0 then + MenuText = string.format( "Rejoin and hold at %d meter", Height ) + else + MenuText = string.format( "Rejoin and hold at %d meter for %d seconds", Height, Seconds ) + end + else + if Seconds == 0 then + MenuText = string.format( MenuTextFormat, Height ) + else + MenuText = string.format( MenuTextFormat, Height, Seconds ) + end + end + + if not self.EscortMenuHoldAtLeaderPosition then + self.EscortMenuHoldAtLeaderPosition = {} + end + + self.EscortMenuHoldAtLeaderPosition[#self.EscortMenuHoldAtLeaderPosition+1] = MENU_CLIENT_COMMAND + :New( + self.EscortClient, + MenuText, + self.EscortMenuHold, + ESCORT._HoldPosition, + { ParamSelf = self, + ParamOrbitGroup = self.EscortClient, + ParamHeight = Height, + ParamSeconds = Seconds + } + ) + end + + return self +end + +--- Defines a menu slot to let the escort scan for targets at a certain height for a certain time in seconds. +-- This menu will appear under **Scan targets**. +-- @param #ESCORT self +-- @param DCSTypes#Distance Height Optional parameter that sets the height in meters to let the escort orbit at the current location. The default value is 30 meters. +-- @param DCSTypes#Time Seconds Optional parameter that lets the escort orbit at the current position for a specified time. (not implemented yet). The default value is 0 seconds, meaning, that the escort will orbit forever until a sequent command is given. +-- @param #string MenuTextFormat Optional parameter that shows the menu option text. The text string is formatted, and should contain one or two %d tokens in the string. The first for the Height, the second for the Time (if given). If no text is given, the default text will be displayed. +-- @return #ESCORT +function ESCORT:MenuScanForTargets( Height, Seconds, MenuTextFormat ) + self:F( { Height, Seconds, MenuTextFormat } ) + + if self.EscortGroup:IsAir() then + if not self.EscortMenuScan then + self.EscortMenuScan = MENU_CLIENT:New( self.EscortClient, "Scan for targets", self.EscortMenu ) + end + + if not Height then + Height = 100 + end + + if not Seconds then + Seconds = 30 + end + + local MenuText = "" + if not MenuTextFormat then + if Seconds == 0 then + MenuText = string.format( "At %d meter", Height ) + else + MenuText = string.format( "At %d meter for %d seconds", Height, Seconds ) + end + else + if Seconds == 0 then + MenuText = string.format( MenuTextFormat, Height ) + else + MenuText = string.format( MenuTextFormat, Height, Seconds ) + end + end + + if not self.EscortMenuScanForTargets then + self.EscortMenuScanForTargets = {} + end + + self.EscortMenuScanForTargets[#self.EscortMenuScanForTargets+1] = MENU_CLIENT_COMMAND + :New( + self.EscortClient, + MenuText, + self.EscortMenuScan, + ESCORT._ScanTargets, + { ParamSelf = self, + ParamScanDuration = 30 + } + ) + end + + return self +end + + + +--- Defines a menu slot to let the escort disperse a flare in a certain color. +-- This menu will appear under **Navigation**. +-- The flare will be fired from the first unit in the group. +-- @param #ESCORT self +-- @param #string MenuTextFormat Optional parameter that shows the menu option text. If no text is given, the default text will be displayed. +-- @return #ESCORT +function ESCORT:MenuFlare( MenuTextFormat ) + self:F() + + if not self.EscortMenuReportNavigation then + self.EscortMenuReportNavigation = MENU_CLIENT:New( self.EscortClient, "Navigation", self.EscortMenu ) + end + + local MenuText = "" + if not MenuTextFormat then + MenuText = "Flare" + else + MenuText = MenuTextFormat + end + + if not self.EscortMenuFlare then + self.EscortMenuFlare = MENU_CLIENT:New( self.EscortClient, MenuText, self.EscortMenuReportNavigation, ESCORT._Flare, { ParamSelf = self } ) + self.EscortMenuFlareGreen = MENU_CLIENT_COMMAND:New( self.EscortClient, "Release green flare", self.EscortMenuFlare, ESCORT._Flare, { ParamSelf = self, ParamColor = UNIT.FlareColor.Green, ParamMessage = "Released a green flare!" } ) + self.EscortMenuFlareRed = MENU_CLIENT_COMMAND:New( self.EscortClient, "Release red flare", self.EscortMenuFlare, ESCORT._Flare, { ParamSelf = self, ParamColor = UNIT.FlareColor.Red, ParamMessage = "Released a red flare!" } ) + self.EscortMenuFlareWhite = MENU_CLIENT_COMMAND:New( self.EscortClient, "Release white flare", self.EscortMenuFlare, ESCORT._Flare, { ParamSelf = self, ParamColor = UNIT.FlareColor.White, ParamMessage = "Released a white flare!" } ) + self.EscortMenuFlareYellow = MENU_CLIENT_COMMAND:New( self.EscortClient, "Release yellow flare", self.EscortMenuFlare, ESCORT._Flare, { ParamSelf = self, ParamColor = UNIT.FlareColor.Yellow, ParamMessage = "Released a yellow flare!" } ) + end + + return self +end + +--- Defines a menu slot to let the escort disperse a smoke in a certain color. +-- This menu will appear under **Navigation**. +-- Note that smoke menu options will only be displayed for ships and ground units. Not for air units. +-- The smoke will be fired from the first unit in the group. +-- @param #ESCORT self +-- @param #string MenuTextFormat Optional parameter that shows the menu option text. If no text is given, the default text will be displayed. +-- @return #ESCORT +function ESCORT:MenuSmoke( MenuTextFormat ) + self:F() + + if not self.EscortGroup:IsAir() then + if not self.EscortMenuReportNavigation then + self.EscortMenuReportNavigation = MENU_CLIENT:New( self.EscortClient, "Navigation", self.EscortMenu ) + end + + local MenuText = "" + if not MenuTextFormat then + MenuText = "Smoke" + else + MenuText = MenuTextFormat + end + + if not self.EscortMenuSmoke then + self.EscortMenuSmoke = MENU_CLIENT:New( self.EscortClient, "Smoke", self.EscortMenuReportNavigation, ESCORT._Smoke, { ParamSelf = self } ) + self.EscortMenuSmokeGreen = MENU_CLIENT_COMMAND:New( self.EscortClient, "Release green smoke", self.EscortMenuSmoke, ESCORT._Smoke, { ParamSelf = self, ParamColor = UNIT.SmokeColor.Green, ParamMessage = "Releasing green smoke!" } ) + self.EscortMenuSmokeRed = MENU_CLIENT_COMMAND:New( self.EscortClient, "Release red smoke", self.EscortMenuSmoke, ESCORT._Smoke, { ParamSelf = self, ParamColor = UNIT.SmokeColor.Red, ParamMessage = "Releasing red smoke!" } ) + self.EscortMenuSmokeWhite = MENU_CLIENT_COMMAND:New( self.EscortClient, "Release white smoke", self.EscortMenuSmoke, ESCORT._Smoke, { ParamSelf = self, ParamColor = UNIT.SmokeColor.White, ParamMessage = "Releasing white smoke!" } ) + self.EscortMenuSmokeOrange = MENU_CLIENT_COMMAND:New( self.EscortClient, "Release orange smoke", self.EscortMenuSmoke, ESCORT._Smoke, { ParamSelf = self, ParamColor = UNIT.SmokeColor.Orange, ParamMessage = "Releasing orange smoke!" } ) + self.EscortMenuSmokeBlue = MENU_CLIENT_COMMAND:New( self.EscortClient, "Release blue smoke", self.EscortMenuSmoke, ESCORT._Smoke, { ParamSelf = self, ParamColor = UNIT.SmokeColor.Blue, ParamMessage = "Releasing blue smoke!" } ) + end + end + + return self +end + +--- Defines a menu slot to let the escort report their current detected targets with a specified time interval in seconds. +-- This menu will appear under **Report targets**. +-- Note that if a report targets menu is not specified, no targets will be detected by the escort, and the attack and assisted attack menus will not be displayed. +-- @param #ESCORT self +-- @param DCSTypes#Time Seconds Optional parameter that lets the escort report their current detected targets after specified time interval in seconds. The default time is 30 seconds. +-- @return #ESCORT +function ESCORT:MenuReportTargets( Seconds ) + self:F( { Seconds } ) + + if not self.EscortMenuReportNearbyTargets then + self.EscortMenuReportNearbyTargets = MENU_CLIENT:New( self.EscortClient, "Report targets", self.EscortMenu ) + end + + if not Seconds then + Seconds = 30 + end + + -- Report Targets + self.EscortMenuReportNearbyTargetsNow = MENU_CLIENT_COMMAND:New( self.EscortClient, "Report targets now!", self.EscortMenuReportNearbyTargets, ESCORT._ReportNearbyTargetsNow, { ParamSelf = self } ) + self.EscortMenuReportNearbyTargetsOn = MENU_CLIENT_COMMAND:New( self.EscortClient, "Report targets on", self.EscortMenuReportNearbyTargets, ESCORT._SwitchReportNearbyTargets, { ParamSelf = self, ParamReportTargets = true } ) + self.EscortMenuReportNearbyTargetsOff = MENU_CLIENT_COMMAND:New( self.EscortClient, "Report targets off", self.EscortMenuReportNearbyTargets, ESCORT._SwitchReportNearbyTargets, { ParamSelf = self, ParamReportTargets = false, } ) + + -- Attack Targets + self.EscortMenuAttackNearbyTargets = MENU_CLIENT:New( self.EscortClient, "Attack targets", self.EscortMenu ) + + + --self.ReportTargetsScheduler = routines.scheduleFunction( self._ReportTargetsScheduler, { self }, timer.getTime() + 1, Seconds ) + self.ReportTargetsScheduler = SCHEDULER:New( self, self._ReportTargetsScheduler, {}, 1, Seconds ) + + return self +end + +--- Defines a menu slot to let the escort attack its detected targets using assisted attack from another escort joined also with the client. +-- This menu will appear under **Request assistance from**. +-- Note that this method needs to be preceded with the method MenuReportTargets. +-- @param #ESCORT self +-- @return #ESCORT +function ESCORT:MenuAssistedAttack() + self:F() + + -- Request assistance from other escorts. + -- This is very useful to let f.e. an escorting ship attack a target detected by an escorting plane... + self.EscortMenuTargetAssistance = MENU_CLIENT:New( self.EscortClient, "Request assistance from", self.EscortMenu ) + + return self +end + +--- Defines a menu to let the escort set its rules of engagement. +-- All rules of engagement will appear under the menu **ROE**. +-- @param #ESCORT self +-- @return #ESCORT +function ESCORT:MenuROE( MenuTextFormat ) + self:F( MenuTextFormat ) + + if not self.EscortMenuROE then + -- Rules of Engagement + self.EscortMenuROE = MENU_CLIENT:New( self.EscortClient, "ROE", self.EscortMenu ) + if self.EscortGroup:OptionROEHoldFirePossible() then + self.EscortMenuROEHoldFire = MENU_CLIENT_COMMAND:New( self.EscortClient, "Hold Fire", self.EscortMenuROE, ESCORT._ROE, { ParamSelf = self, ParamFunction = self.EscortGroup:OptionROEHoldFire(), ParamMessage = "Holding weapons!" } ) + end + if self.EscortGroup:OptionROEReturnFirePossible() then + self.EscortMenuROEReturnFire = MENU_CLIENT_COMMAND:New( self.EscortClient, "Return Fire", self.EscortMenuROE, ESCORT._ROE, { ParamSelf = self, ParamFunction = self.EscortGroup:OptionROEReturnFire(), ParamMessage = "Returning fire!" } ) + end + if self.EscortGroup:OptionROEOpenFirePossible() then + self.EscortMenuROEOpenFire = MENU_CLIENT_COMMAND:New( self.EscortClient, "Open Fire", self.EscortMenuROE, ESCORT._ROE, { ParamSelf = self, ParamFunction = self.EscortGroup:OptionROEOpenFire(), ParamMessage = "Opening fire on designated targets!!" } ) + end + if self.EscortGroup:OptionROEWeaponFreePossible() then + self.EscortMenuROEWeaponFree = MENU_CLIENT_COMMAND:New( self.EscortClient, "Weapon Free", self.EscortMenuROE, ESCORT._ROE, { ParamSelf = self, ParamFunction = self.EscortGroup:OptionROEWeaponFree(), ParamMessage = "Opening fire on targets of opportunity!" } ) + end + end + + return self +end + + +--- Defines a menu to let the escort set its evasion when under threat. +-- All rules of engagement will appear under the menu **Evasion**. +-- @param #ESCORT self +-- @return #ESCORT +function ESCORT:MenuEvasion( MenuTextFormat ) + self:F( MenuTextFormat ) + + if self.EscortGroup:IsAir() then + if not self.EscortMenuEvasion then + -- Reaction to Threats + self.EscortMenuEvasion = MENU_CLIENT:New( self.EscortClient, "Evasion", self.EscortMenu ) + if self.EscortGroup:OptionROTNoReactionPossible() then + self.EscortMenuEvasionNoReaction = MENU_CLIENT_COMMAND:New( self.EscortClient, "Fight until death", self.EscortMenuEvasion, ESCORT._ROT, { ParamSelf = self, ParamFunction = self.EscortGroup:OptionROTNoReaction(), ParamMessage = "Fighting until death!" } ) + end + if self.EscortGroup:OptionROTPassiveDefensePossible() then + self.EscortMenuEvasionPassiveDefense = MENU_CLIENT_COMMAND:New( self.EscortClient, "Use flares, chaff and jammers", self.EscortMenuEvasion, ESCORT._ROT, { ParamSelf = self, ParamFunction = self.EscortGroup:OptionROTPassiveDefense(), ParamMessage = "Defending using jammers, chaff and flares!" } ) + end + if self.EscortGroup:OptionROTEvadeFirePossible() then + self.EscortMenuEvasionEvadeFire = MENU_CLIENT_COMMAND:New( self.EscortClient, "Evade enemy fire", self.EscortMenuEvasion, ESCORT._ROT, { ParamSelf = self, ParamFunction = self.EscortGroup:OptionROTEvadeFire(), ParamMessage = "Evading on enemy fire!" } ) + end + if self.EscortGroup:OptionROTVerticalPossible() then + self.EscortMenuOptionEvasionVertical = MENU_CLIENT_COMMAND:New( self.EscortClient, "Go below radar and evade fire", self.EscortMenuEvasion, ESCORT._ROT, { ParamSelf = self, ParamFunction = self.EscortGroup:OptionROTVertical(), ParamMessage = "Evading on enemy fire with vertical manoeuvres!" } ) + end + end + end + + return self +end + +--- Defines a menu to let the escort resume its mission from a waypoint on its route. +-- All rules of engagement will appear under the menu **Resume mission from**. +-- @param #ESCORT self +-- @return #ESCORT +function ESCORT:MenuResumeMission() + self:F() + + if not self.EscortMenuResumeMission then + -- Mission Resume Menu Root + self.EscortMenuResumeMission = MENU_CLIENT:New( self.EscortClient, "Resume mission from", self.EscortMenu ) + end + + return self +end + + +--- @param #MENUPARAM MenuParam +function ESCORT._HoldPosition( MenuParam ) + + local self = MenuParam.ParamSelf + local EscortGroup = self.EscortGroup + local EscortClient = self.EscortClient + + local OrbitGroup = MenuParam.ParamOrbitGroup -- Group#GROUP + local OrbitUnit = OrbitGroup:GetUnit(1) -- Unit#UNIT + local OrbitHeight = MenuParam.ParamHeight + local OrbitSeconds = MenuParam.ParamSeconds -- Not implemented yet + + routines.removeFunction( self.FollowScheduler ) + + local PointFrom = {} + local GroupPoint = EscortGroup:GetUnit(1):GetPointVec3() + PointFrom = {} + PointFrom.x = GroupPoint.x + PointFrom.y = GroupPoint.z + PointFrom.speed = 250 + PointFrom.type = AI.Task.WaypointType.TURNING_POINT + PointFrom.alt = GroupPoint.y + PointFrom.alt_type = AI.Task.AltitudeType.BARO + + local OrbitPoint = OrbitUnit:GetPointVec2() + local PointTo = {} + PointTo.x = OrbitPoint.x + PointTo.y = OrbitPoint.y + PointTo.speed = 250 + PointTo.type = AI.Task.WaypointType.TURNING_POINT + PointTo.alt = OrbitHeight + PointTo.alt_type = AI.Task.AltitudeType.BARO + PointTo.task = EscortGroup:TaskOrbitCircleAtVec2( OrbitPoint, OrbitHeight, 0 ) + + local Points = { PointFrom, PointTo } + + EscortGroup:OptionROEHoldFire() + EscortGroup:OptionROTPassiveDefense() + + EscortGroup:SetTask( EscortGroup:TaskRoute( Points ) ) + EscortGroup:MessageToClient( "Orbiting at location.", 10, EscortClient ) +end + +--- @param #MENUPARAM MenuParam +function ESCORT._JoinUpAndFollow( MenuParam ) + + local self = MenuParam.ParamSelf + local EscortGroup = self.EscortGroup + local EscortClient = self.EscortClient + + self.Distance = MenuParam.ParamDistance + + self:JoinUpAndFollow( EscortGroup, EscortClient, self.Distance ) +end + +--- JoinsUp and Follows a CLIENT. +-- @param Escort#ESCORT self +-- @param Group#GROUP EscortGroup +-- @param Client#CLIENT EscortClient +-- @param DCSTypes#Distance Distance +function ESCORT:JoinUpAndFollow( EscortGroup, EscortClient, Distance ) + self:F( { EscortGroup, EscortClient, Distance } ) + + if self.FollowScheduler then + routines.removeFunction( self.FollowScheduler ) + end + + EscortGroup:OptionROEHoldFire() + EscortGroup:OptionROTPassiveDefense() + + self.EscortMode = ESCORT.MODE.FOLLOW + + self.CT1 = 0 + self.GT1 = 0 + --self.FollowScheduler = routines.scheduleFunction( self._FollowScheduler, { self, Distance }, timer.getTime() + 1, .5 ) + self.FollowScheduler = SCHEDULER:New( self, self._FollowScheduler, { Distance }, 1, .5, .1 ) + EscortGroup:MessageToClient( "Rejoining and Following at " .. Distance .. "!", 30, EscortClient ) +end + +--- @param #MENUPARAM MenuParam +function ESCORT._Flare( MenuParam ) + + local self = MenuParam.ParamSelf + local EscortGroup = self.EscortGroup + local EscortClient = self.EscortClient + + local Color = MenuParam.ParamColor + local Message = MenuParam.ParamMessage + + EscortGroup:GetUnit(1):Flare( Color ) + EscortGroup:MessageToClient( Message, 10, EscortClient ) +end + +--- @param #MENUPARAM MenuParam +function ESCORT._Smoke( MenuParam ) + + local self = MenuParam.ParamSelf + local EscortGroup = self.EscortGroup + local EscortClient = self.EscortClient + + local Color = MenuParam.ParamColor + local Message = MenuParam.ParamMessage + + EscortGroup:GetUnit(1):Smoke( Color ) + EscortGroup:MessageToClient( Message, 10, EscortClient ) +end + + +--- @param #MENUPARAM MenuParam +function ESCORT._ReportNearbyTargetsNow( MenuParam ) + + local self = MenuParam.ParamSelf + local EscortGroup = self.EscortGroup + local EscortClient = self.EscortClient + + self:_ReportTargetsScheduler() + +end + +function ESCORT._SwitchReportNearbyTargets( MenuParam ) + + local self = MenuParam.ParamSelf + local EscortGroup = self.EscortGroup + local EscortClient = self.EscortClient + + self.ReportTargets = MenuParam.ParamReportTargets + + if self.ReportTargets then + if not self.ReportTargetsScheduler then + --self.ReportTargetsScheduler = routines.scheduleFunction( self._ReportTargetsScheduler, { self }, timer.getTime() + 1, 30 ) + self.ReportTargetsScheduler = SCHEDULER:New( self, self._ReportTargetsScheduler, {}, 1, 30 ) + end + else + routines.removeFunction( self.ReportTargetsScheduler ) + self.ReportTargetsScheduler = nil + end +end + +--- @param #MENUPARAM MenuParam +function ESCORT._ScanTargets( MenuParam ) + + local self = MenuParam.ParamSelf + local EscortGroup = self.EscortGroup + local EscortClient = self.EscortClient + + local ScanDuration = MenuParam.ParamScanDuration + + if self.FollowScheduler then + routines.removeFunction( self.FollowScheduler ) + end + + self:T( { "FollowScheduler after removefunction: ", self.FollowScheduler } ) + + if EscortGroup:IsHelicopter() then + SCHEDULER:New( EscortGroup, EscortGroup.PushTask, + { EscortGroup:TaskControlled( + EscortGroup:TaskOrbitCircle( 200, 20 ), + EscortGroup:TaskCondition( nil, nil, nil, nil, ScanDuration, nil ) + ) + }, + 1 + ) + elseif EscortGroup:IsAirPlane() then + SCHEDULER:New( EscortGroup, EscortGroup.PushTask, + { EscortGroup:TaskControlled( + EscortGroup:TaskOrbitCircle( 1000, 500 ), + EscortGroup:TaskCondition( nil, nil, nil, nil, ScanDuration, nil ) + ) + }, + 1 + ) + end + + EscortGroup:MessageToClient( "Scanning targets for " .. ScanDuration .. " seconds.", ScanDuration, EscortClient ) + + if self.EscortMode == ESCORT.MODE.FOLLOW then + --self.FollowScheduler = routines.scheduleFunction( self._FollowScheduler, { self, Distance }, timer.getTime() + ScanDuration, 1 ) + self.FollowScheduler:Start() + end + +end + +function _Resume( EscortGroup ) + env.info( '_Resume' ) + + local Escort = EscortGroup.Escort -- #ESCORT + env.info( "EscortMode = " .. Escort.EscortMode ) + if Escort.EscortMode == ESCORT.MODE.FOLLOW then + Escort:JoinUpAndFollow( EscortGroup, Escort.EscortClient, Escort.Distance ) + end + +end + +--- @param #MENUPARAM MenuParam +function ESCORT._AttackTarget( MenuParam ) + + local self = MenuParam.ParamSelf + local EscortGroup = self.EscortGroup + local EscortClient = self.EscortClient + local AttackUnit = MenuParam.ParamUnit -- Unit#UNIT + + if self.FollowScheduler then + routines.removeFunction( self.FollowScheduler ) + end + + self:T( AttackUnit ) + + if EscortGroup:IsAir() then + EscortGroup:OptionROEOpenFire() + EscortGroup:OptionROTPassiveDefense() + EscortGroup.Escort = self -- Need to do this trick to get the reference for the escort in the _Resume function. +-- routines.scheduleFunction( +-- EscortGroup.PushTask, +-- { EscortGroup, +-- EscortGroup:TaskCombo( +-- { EscortGroup:TaskAttackUnit( AttackUnit ), +-- EscortGroup:TaskFunction( 1, 2, "_Resume", {"''"} ) +-- } +-- ) +-- }, timer.getTime() + 10 +-- ) + SCHEDULER:New( EscortGroup, + EscortGroup.PushTask, + { EscortGroup:TaskCombo( + { EscortGroup:TaskAttackUnit( AttackUnit ), + EscortGroup:TaskFunction( 1, 2, "_Resume", {"''"} ) + } + ) + }, 10 + ) + else +-- routines.scheduleFunction( +-- EscortGroup.PushTask, +-- { EscortGroup, +-- EscortGroup:TaskCombo( +-- { EscortGroup:TaskFireAtPoint( AttackUnit:GetPointVec2(), 50 ) +-- } +-- ) +-- }, timer.getTime() + 10 +-- ) + SCHEDULER:New( EscortGroup, + EscortGroup.PushTask, + { EscortGroup:TaskCombo( + { EscortGroup:TaskFireAtPoint( AttackUnit:GetPointVec2(), 50 ) + } + ) + }, 10 + ) + end + EscortGroup:MessageToClient( "Engaging Designated Unit!", 10, EscortClient ) + + +end + +--- @param #MENUPARAM MenuParam +function ESCORT._AssistTarget( MenuParam ) + + local self = MenuParam.ParamSelf + local EscortGroup = self.EscortGroup + local EscortClient = self.EscortClient + local EscortGroupAttack = MenuParam.ParamEscortGroup + local AttackUnit = MenuParam.ParamUnit -- Unit#UNIT + + if self.FollowScheduler then + routines.removeFunction( self.FollowScheduler ) + end + + + self:T( AttackUnit ) + + if EscortGroupAttack:IsAir() then + EscortGroupAttack:OptionROEOpenFire() + EscortGroupAttack:OptionROTVertical() +-- routines.scheduleFunction( +-- EscortGroupAttack.PushTask, +-- { EscortGroupAttack, +-- EscortGroupAttack:TaskCombo( +-- { EscortGroupAttack:TaskAttackUnit( AttackUnit ), +-- EscortGroupAttack:TaskOrbitCircle( 500, 350 ) +-- } +-- ) +-- }, timer.getTime() + 10 +-- ) + SCHDULER:New( EscortGroupAttack, + EscortGroupAttack.PushTask, + { EscortGroupAttack:TaskCombo( + { EscortGroupAttack:TaskAttackUnit( AttackUnit ), + EscortGroupAttack:TaskOrbitCircle( 500, 350 ) + } + ) + }, 10 + ) + else +-- routines.scheduleFunction( +-- EscortGroupAttack.PushTask, +-- { EscortGroupAttack, +-- EscortGroupAttack:TaskCombo( +-- { EscortGroupAttack:TaskFireAtPoint( AttackUnit:GetPointVec2(), 50 ) +-- } +-- ) +-- }, timer.getTime() + 10 +-- ) + SCHEDULER:New( EscortGroupAttack, + EscortGroupAttack.PushTask, + { EscortGroupAttack:TaskCombo( + { EscortGroupAttack:TaskFireAtPoint( AttackUnit:GetPointVec2(), 50 ) + } + ) + }, 10 + ) + end + EscortGroupAttack:MessageToClient( "Assisting with the destroying the enemy unit!", 10, EscortClient ) + +end + +--- @param #MENUPARAM MenuParam +function ESCORT._ROE( MenuParam ) + + local self = MenuParam.ParamSelf + local EscortGroup = self.EscortGroup + local EscortClient = self.EscortClient + + local EscortROEFunction = MenuParam.ParamFunction + local EscortROEMessage = MenuParam.ParamMessage + + pcall( function() EscortROEFunction() end ) + EscortGroup:MessageToClient( EscortROEMessage, 10, EscortClient ) +end + +--- @param #MENUPARAM MenuParam +function ESCORT._ROT( MenuParam ) + + local self = MenuParam.ParamSelf + local EscortGroup = self.EscortGroup + local EscortClient = self.EscortClient + + local EscortROTFunction = MenuParam.ParamFunction + local EscortROTMessage = MenuParam.ParamMessage + + pcall( function() EscortROTFunction() end ) + EscortGroup:MessageToClient( EscortROTMessage, 10, EscortClient ) +end + +--- @param #MENUPARAM MenuParam +function ESCORT._ResumeMission( MenuParam ) + + local self = MenuParam.ParamSelf + local EscortGroup = self.EscortGroup + local EscortClient = self.EscortClient + + local WayPoint = MenuParam.ParamWayPoint + + routines.removeFunction( self.FollowScheduler ) + self.FollowScheduler = nil + + local WayPoints = EscortGroup:GetTaskRoute() + self:T( WayPoint, WayPoints ) + + for WayPointIgnore = 1, WayPoint do + table.remove( WayPoints, 1 ) + end + + --routines.scheduleFunction( EscortGroup.SetTask, {EscortGroup, EscortGroup:TaskRoute( WayPoints ) }, timer.getTime() + 1 ) + SCHEDULER:New( EscortGroup, EscortGroup.SetTask, { EscortGroup:TaskRoute( WayPoints ) }, 1 ) + + EscortGroup:MessageToClient( "Resuming mission from waypoint " .. WayPoint .. ".", 10, EscortClient ) +end + +--- Registers the waypoints +-- @param #ESCORT self +-- @return #table +function ESCORT:RegisterRoute() + self:F() + + local EscortGroup = self.EscortGroup -- Group#GROUP + + local TaskPoints = EscortGroup:GetTaskRoute() + + self:T( TaskPoints ) + + return TaskPoints +end + +--- @param Escort#ESCORT self +function ESCORT:_FollowScheduler( FollowDistance ) + self:F( { FollowDistance }) + + if self.EscortGroup:IsAlive() and self.EscortClient:IsAlive() then + + local ClientUnit = self.EscortClient:GetClientGroupUnit() + local GroupUnit = self.EscortGroup:GetUnit( 1 ) + + if self.CT1 == 0 and self.GT1 == 0 then + self.CV1 = ClientUnit:GetPointVec3() + self.CT1 = timer.getTime() + self.GV1 = GroupUnit:GetPointVec3() + self.GT1 = timer.getTime() + else + local CT1 = self.CT1 + local CT2 = timer.getTime() + local CV1 = self.CV1 + local CV2 = ClientUnit:GetPointVec3() + self.CT1 = CT2 + self.CV1 = CV2 + + local CD = ( ( CV2.x - CV1.x )^2 + ( CV2.y - CV1.y )^2 + ( CV2.z - CV1.z )^2 ) ^ 0.5 + local CT = CT2 - CT1 + + local CS = ( 3600 / CT ) * ( CD / 1000 ) + + self:T2( { "Client:", CS, CD, CT, CV2, CV1, CT2, CT1 } ) + + local GT1 = self.GT1 + local GT2 = timer.getTime() + local GV1 = self.GV1 + local GV2 = GroupUnit:GetPointVec3() + self.GT1 = GT2 + self.GV1 = GV2 + + local GD = ( ( GV2.x - GV1.x )^2 + ( GV2.y - GV1.y )^2 + ( GV2.z - GV1.z )^2 ) ^ 0.5 + local GT = GT2 - GT1 + + local GS = ( 3600 / GT ) * ( GD / 1000 ) + + self:T2( { "Group:", GS, GD, GT, GV2, GV1, GT2, GT1 } ) + + -- Calculate the group direction vector + local GV = { x = GV2.x - CV2.x, y = GV2.y - CV2.y, z = GV2.z - CV2.z } + + -- Calculate GH2, GH2 with the same height as CV2. + local GH2 = { x = GV2.x, y = CV2.y, z = GV2.z } + + -- Calculate the angle of GV to the orthonormal plane + local alpha = math.atan2( GV.z, GV.x ) + + -- Now we calculate the intersecting vector between the circle around CV2 with radius FollowDistance and GH2. + -- From the GeoGebra model: CVI = (x(CV2) + FollowDistance cos(alpha), y(GH2) + FollowDistance sin(alpha), z(CV2)) + local CVI = { x = CV2.x + FollowDistance * math.cos(alpha), + y = GH2.y, + z = CV2.z + FollowDistance * math.sin(alpha), + } + + -- Calculate the direction vector DV of the escort group. We use CVI as the base and CV2 as the direction. + local DV = { x = CV2.x - CVI.x, y = CV2.y - CVI.y, z = CV2.z - CVI.z } + + -- We now calculate the unary direction vector DVu, so that we can multiply DVu with the speed, which is expressed in meters / s. + -- We need to calculate this vector to predict the point the escort group needs to fly to according its speed. + -- The distance of the destination point should be far enough not to have the aircraft starting to swipe left to right... + local DVu = { x = DV.x / FollowDistance, y = DV.y / FollowDistance, z = DV.z / FollowDistance } + + -- Now we can calculate the group destination vector GDV. + local GDV = { x = DVu.x * CS * 8 + CVI.x, y = CVI.y, z = DVu.z * CS * 8 + CVI.z } + + --trigger.action.smoke( GDV, trigger.smokeColor.Red ) + self:T2( { "CV2:", CV2 } ) + self:T2( { "CVI:", CVI } ) + self:T2( { "GDV:", GDV } ) + + -- Measure distance between client and group + local CatchUpDistance = ( ( GDV.x - GV2.x )^2 + ( GDV.y - GV2.y )^2 + ( GDV.z - GV2.z )^2 ) ^ 0.5 + + -- The calculation of the Speed would simulate that the group would take 30 seconds to overcome + -- the requested Distance). + local Time = 10 + local CatchUpSpeed = ( CatchUpDistance - ( CS * 8.4 ) ) / Time + + local Speed = CS + CatchUpSpeed + if Speed < 0 then + Speed = 0 + end + + self:T( { "Client Speed, Escort Speed, Speed, FlyDistance, Time:", CS, GS, Speed, Distance, Time } ) + + -- Now route the escort to the desired point with the desired speed. + self.EscortGroup:TaskRouteToVec3( GDV, Speed / 3.6 ) -- DCS models speed in Mps (Miles per second) + end + return true + end + + return false +end + + +--- Report Targets Scheduler. +-- @param #ESCORT self +function ESCORT:_ReportTargetsScheduler() + self:F( self.EscortGroup:GetName() ) + + if self.EscortGroup:IsAlive() and self.EscortClient:IsAlive() then + local EscortGroupName = self.EscortGroup:GetName() + local EscortTargets = self.EscortGroup:GetDetectedTargets() + + local ClientEscortTargets = self.EscortClient._EscortGroups[EscortGroupName].Targets + + local EscortTargetMessages = "" + for EscortTargetID, EscortTarget in pairs( EscortTargets ) do + local EscortObject = EscortTarget.object + self:T( EscortObject ) + if EscortObject and EscortObject:isExist() and EscortObject.id_ < 50000000 then + + local EscortTargetUnit = UNIT:Find( EscortObject ) + local EscortTargetUnitName = EscortTargetUnit:GetName() + + + + -- local EscortTargetIsDetected, + -- EscortTargetIsVisible, + -- EscortTargetLastTime, + -- EscortTargetKnowType, + -- EscortTargetKnowDistance, + -- EscortTargetLastPos, + -- EscortTargetLastVelocity + -- = self.EscortGroup:IsTargetDetected( EscortObject ) + -- + -- self:T( { EscortTargetIsDetected, + -- EscortTargetIsVisible, + -- EscortTargetLastTime, + -- EscortTargetKnowType, + -- EscortTargetKnowDistance, + -- EscortTargetLastPos, + -- EscortTargetLastVelocity } ) + + + local EscortTargetUnitPositionVec3 = EscortTargetUnit:GetPointVec3() + local EscortPositionVec3 = self.EscortGroup:GetPointVec3() + local Distance = ( ( EscortTargetUnitPositionVec3.x - EscortPositionVec3.x )^2 + + ( EscortTargetUnitPositionVec3.y - EscortPositionVec3.y )^2 + + ( EscortTargetUnitPositionVec3.z - EscortPositionVec3.z )^2 + ) ^ 0.5 / 1000 + + self:T( { self.EscortGroup:GetName(), EscortTargetUnit:GetName(), Distance, EscortTarget } ) + + if Distance <= 15 then + + if not ClientEscortTargets[EscortTargetUnitName] then + ClientEscortTargets[EscortTargetUnitName] = {} + end + ClientEscortTargets[EscortTargetUnitName].AttackUnit = EscortTargetUnit + ClientEscortTargets[EscortTargetUnitName].visible = EscortTarget.visible + ClientEscortTargets[EscortTargetUnitName].type = EscortTarget.type + ClientEscortTargets[EscortTargetUnitName].distance = EscortTarget.distance + else + if ClientEscortTargets[EscortTargetUnitName] then + ClientEscortTargets[EscortTargetUnitName] = nil + end + end + end + end + + self:T( { "Sorting Targets Table:", ClientEscortTargets } ) + table.sort( ClientEscortTargets, function( a, b ) return a.Distance < b.Distance end ) + self:T( { "Sorted Targets Table:", ClientEscortTargets } ) + + -- Remove the sub menus of the Attack menu of the Escort for the EscortGroup. + self.EscortMenuAttackNearbyTargets:RemoveSubMenus() + + if self.EscortMenuTargetAssistance then + self.EscortMenuTargetAssistance:RemoveSubMenus() + end + + --for MenuIndex = 1, #self.EscortMenuAttackTargets do + -- self:T( { "Remove Menu:", self.EscortMenuAttackTargets[MenuIndex] } ) + -- self.EscortMenuAttackTargets[MenuIndex] = self.EscortMenuAttackTargets[MenuIndex]:Remove() + --end + + + if ClientEscortTargets then + for ClientEscortTargetUnitName, ClientEscortTargetData in pairs( ClientEscortTargets ) do + + for ClientEscortGroupName, EscortGroupData in pairs( self.EscortClient._EscortGroups ) do + + if ClientEscortTargetData and ClientEscortTargetData.AttackUnit:IsAlive() then + + local EscortTargetMessage = "" + local EscortTargetCategoryName = ClientEscortTargetData.AttackUnit:GetCategoryName() + local EscortTargetCategoryType = ClientEscortTargetData.AttackUnit:GetTypeName() + if ClientEscortTargetData.type then + EscortTargetMessage = EscortTargetMessage .. EscortTargetCategoryName .. " (" .. EscortTargetCategoryType .. ") at " + else + EscortTargetMessage = EscortTargetMessage .. "Unknown target at " + end + + local EscortTargetUnitPositionVec3 = ClientEscortTargetData.AttackUnit:GetPointVec3() + local EscortPositionVec3 = self.EscortGroup:GetPointVec3() + local Distance = ( ( EscortTargetUnitPositionVec3.x - EscortPositionVec3.x )^2 + + ( EscortTargetUnitPositionVec3.y - EscortPositionVec3.y )^2 + + ( EscortTargetUnitPositionVec3.z - EscortPositionVec3.z )^2 + ) ^ 0.5 / 1000 + + self:T( { self.EscortGroup:GetName(), ClientEscortTargetData.AttackUnit:GetName(), Distance, ClientEscortTargetData.AttackUnit } ) + if ClientEscortTargetData.visible == false then + EscortTargetMessage = EscortTargetMessage .. string.format( "%.2f", Distance ) .. " estimated km" + else + EscortTargetMessage = EscortTargetMessage .. string.format( "%.2f", Distance ) .. " km" + end + + if ClientEscortTargetData.visible then + EscortTargetMessage = EscortTargetMessage .. ", visual" + end + + if ClientEscortGroupName == EscortGroupName then + + MENU_CLIENT_COMMAND:New( self.EscortClient, + EscortTargetMessage, + self.EscortMenuAttackNearbyTargets, + ESCORT._AttackTarget, + { ParamSelf = self, + ParamUnit = ClientEscortTargetData.AttackUnit + } + ) + EscortTargetMessages = EscortTargetMessages .. "\n - " .. EscortTargetMessage + else + if self.EscortMenuTargetAssistance then + local MenuTargetAssistance = MENU_CLIENT:New( self.EscortClient, EscortGroupData.EscortName, self.EscortMenuTargetAssistance ) + MENU_CLIENT_COMMAND:New( self.EscortClient, + EscortTargetMessage, + MenuTargetAssistance, + ESCORT._AssistTarget, + { ParamSelf = self, + ParamEscortGroup = EscortGroupData.EscortGroup, + ParamUnit = ClientEscortTargetData.AttackUnit + } + ) + end + end + else + ClientEscortTargetData = nil + end + end + end + + if EscortTargetMessages ~= "" and self.ReportTargets == true then + self.EscortGroup:MessageToClient( "Detected targets within 15 km range:" .. EscortTargetMessages:gsub("\n$",""), 20, self.EscortClient ) + else + self.EscortGroup:MessageToClient( "No targets detected!", 20, self.EscortClient ) + end + end + + if self.EscortMenuResumeMission then + self.EscortMenuResumeMission:RemoveSubMenus() + + -- if self.EscortMenuResumeWayPoints then + -- for MenuIndex = 1, #self.EscortMenuResumeWayPoints do + -- self:T( { "Remove Menu:", self.EscortMenuResumeWayPoints[MenuIndex] } ) + -- self.EscortMenuResumeWayPoints[MenuIndex] = self.EscortMenuResumeWayPoints[MenuIndex]:Remove() + -- end + -- end + + local TaskPoints = self:RegisterRoute() + for WayPointID, WayPoint in pairs( TaskPoints ) do + local EscortPositionVec3 = self.EscortGroup:GetPointVec3() + local Distance = ( ( WayPoint.x - EscortPositionVec3.x )^2 + + ( WayPoint.y - EscortPositionVec3.z )^2 + ) ^ 0.5 / 1000 + MENU_CLIENT_COMMAND:New( self.EscortClient, "Waypoint " .. WayPointID .. " at " .. string.format( "%.2f", Distance ).. "km", self.EscortMenuResumeMission, ESCORT._ResumeMission, { ParamSelf = self, ParamWayPoint = WayPointID } ) + end + end + return true + end + + return false +end +--- Provides missile training functions. +-- +-- @{#MISSILETRAINER} class +-- ======================== +-- The @{#MISSILETRAINER} class uses the DCS world messaging system to be alerted of any missiles fired, and when a missile would hit your aircraft, +-- the class will destroy the missile within a certain range, to avoid damage to your aircraft. +-- It suports the following functionality: +-- +-- * Track the missiles fired at you and other players, providing bearing and range information of the missiles towards the airplanes. +-- * Provide alerts of missile launches, including detailed information of the units launching, including bearing, range … +-- * Provide alerts when a missile would have killed your aircraft. +-- * Provide alerts when the missile self destructs. +-- * Enable / Disable and Configure the Missile Trainer using the various menu options. +-- +-- When running a mission where MISSILETRAINER is used, the following radio menu structure ( 'Radio Menu' -> 'Other (F10)' -> 'MissileTrainer' ) options are available for the players: +-- +-- * **Messages**: Menu to configure all messages. +-- * **Messages On**: Show all messages. +-- * **Messages Off**: Disable all messages. +-- * **Tracking**: Menu to configure missile tracking messages. +-- * **To All**: Shows missile tracking messages to all players. +-- * **To Target**: Shows missile tracking messages only to the player where the missile is targetted at. +-- * **Tracking On**: Show missile tracking messages. +-- * **Tracking Off**: Disable missile tracking messages. +-- * **Frequency Increase**: Increases the missile tracking message frequency with one second. +-- * **Frequency Decrease**: Decreases the missile tracking message frequency with one second. +-- * **Alerts**: Menu to configure alert messages. +-- * **To All**: Shows alert messages to all players. +-- * **To Target**: Shows alert messages only to the player where the missile is (was) targetted at. +-- * **Hits On**: Show missile hit alert messages. +-- * **Hits Off**: Disable missile hit alert messages. +-- * **Launches On**: Show missile launch messages. +-- * **Launches Off**: Disable missile launch messages. +-- * **Details**: Menu to configure message details. +-- * **Range On**: Shows range information when a missile is fired to a target. +-- * **Range Off**: Disable range information when a missile is fired to a target. +-- * **Bearing On**: Shows bearing information when a missile is fired to a target. +-- * **Bearing Off**: Disable bearing information when a missile is fired to a target. +-- * **Distance**: Menu to configure the distance when a missile needs to be destroyed when near to a player, during tracking. This will improve/influence hit calculation accuracy, but has the risk of damaging the aircraft when the missile reaches the aircraft before the distance is measured. +-- * **50 meter**: Destroys the missile when the distance to the aircraft is below or equal to 50 meter. +-- * **100 meter**: Destroys the missile when the distance to the aircraft is below or equal to 100 meter. +-- * **150 meter**: Destroys the missile when the distance to the aircraft is below or equal to 150 meter. +-- * **200 meter**: Destroys the missile when the distance to the aircraft is below or equal to 200 meter. +-- +-- +-- MISSILETRAINER construction methods: +-- ==================================== +-- Create a new MISSILETRAINER object with the @{#MISSILETRAINER.New} method: +-- +-- * @{#MISSILETRAINER.New}: Creates a new MISSILETRAINER object taking the maximum distance to your aircraft to evaluate when a missile needs to be destroyed. +-- +-- MISSILETRAINER will collect each unit declared in the mission with a skill level "Client" and "Player", and will monitor the missiles shot at those. +-- +-- MISSILETRAINER initialization methods: +-- ====================================== +-- A MISSILETRAINER object will behave differently based on the usage of initialization methods: +-- +-- * @{#MISSILETRAINER.InitMessagesOnOff}: Sets by default the display of any message to be ON or OFF. +-- * @{#MISSILETRAINER.InitTrackingToAll}: Sets by default the missile tracking report for all players or only for those missiles targetted to you. +-- * @{#MISSILETRAINER.InitTrackingOnOff}: Sets by default the display of missile tracking report to be ON or OFF. +-- * @{#MISSILETRAINER.InitTrackingFrequency}: Increases, decreases the missile tracking message display frequency with the provided time interval in seconds. +-- * @{#MISSILETRAINER.InitAlertsToAll}: Sets by default the display of alerts to be shown to all players or only to you. +-- * @{#MISSILETRAINER.InitAlertsHitsOnOff}: Sets by default the display of hit alerts ON or OFF. +-- * @{#MISSILETRAINER.InitAlertsLaunchesOnOff}: Sets by default the display of launch alerts ON or OFF. +-- * @{#MISSILETRAINER.InitRangeOnOff}: Sets by default the display of range information of missiles ON of OFF. +-- * @{#MISSILETRAINER.InitBearingOnOff}: Sets by default the display of bearing information of missiles ON of OFF. +-- * @{#MISSILETRAINER.InitMenusOnOff}: Allows to configure the options through the radio menu. +-- +-- @module MissileTrainer +-- @author FlightControl + + +Include.File( "Client" ) +Include.File( "Scheduler" ) + +--- The MISSILETRAINER class +-- @type MISSILETRAINER +-- @extends Base#BASE +MISSILETRAINER = { + ClassName = "MISSILETRAINER", +} + +--- Creates the main object which is handling missile tracking. +-- When a missile is fired a SCHEDULER is set off that follows the missile. When near a certain a client player, the missile will be destroyed. +-- @param #MISSILETRAINER self +-- @param #number Distance The distance in meters when a tracked missile needs to be destroyed when close to a player. +-- @param #string Briefing (Optional) Will show a text to the players when starting their mission. Can be used for briefing purposes. +-- @return #MISSILETRAINER +function MISSILETRAINER:New( Distance, Briefing ) + local self = BASE:Inherit( self, BASE:New() ) + self:F( Distance ) + + if Briefing then + self.Briefing = Briefing + end + + self.Schedulers = {} + self.SchedulerID = 0 + + self.MessageInterval = 2 + self.MessageLastTime = timer.getTime() + + self.Distance = Distance / 1000 + + _EVENTDISPATCHER:OnShot( self._EventShot, self ) + + self.DB = DATABASE:New():FilterStart() + self.DBClients = self.DB.Clients + self.DBUnits = self.DB.Units + + for ClientID, Client in pairs( self.DBClients ) do + + local function _Alive( Client ) + + if self.Briefing then + Client:Message( self.Briefing, 15, "HELLO WORLD", "Trainer" ) + end + + if self.MenusOnOff == true then + Client:Message( "Use the 'Radio Menu' -> 'Other (F10)' -> 'Missile Trainer' menu options to change the Missile Trainer settings (for all players).", 15, "MENU", "Trainer" ) + + Client.MainMenu = MENU_CLIENT:New( Client, "Missile Trainer", nil ) -- Menu#MENU_CLIENT + + Client.MenuMessages = MENU_CLIENT:New( Client, "Messages", Client.MainMenu ) + Client.MenuOn = MENU_CLIENT_COMMAND:New( Client, "Messages On", Client.MenuMessages, self._MenuMessages, { MenuSelf = self, MessagesOnOff = true } ) + Client.MenuOff = MENU_CLIENT_COMMAND:New( Client, "Messages Off", Client.MenuMessages, self._MenuMessages, { MenuSelf = self, MessagesOnOff = false } ) + + Client.MenuTracking = MENU_CLIENT:New( Client, "Tracking", Client.MainMenu ) + Client.MenuTrackingToAll = MENU_CLIENT_COMMAND:New( Client, "To All", Client.MenuTracking, self._MenuMessages, { MenuSelf = self, TrackingToAll = true } ) + Client.MenuTrackingToTarget = MENU_CLIENT_COMMAND:New( Client, "To Target", Client.MenuTracking, self._MenuMessages, { MenuSelf = self, TrackingToAll = false } ) + Client.MenuTrackOn = MENU_CLIENT_COMMAND:New( Client, "Tracking On", Client.MenuTracking, self._MenuMessages, { MenuSelf = self, TrackingOnOff = true } ) + Client.MenuTrackOff = MENU_CLIENT_COMMAND:New( Client, "Tracking Off", Client.MenuTracking, self._MenuMessages, { MenuSelf = self, TrackingOnOff = false } ) + Client.MenuTrackIncrease = MENU_CLIENT_COMMAND:New( Client, "Frequency Increase", Client.MenuTracking, self._MenuMessages, { MenuSelf = self, TrackingFrequency = -1 } ) + Client.MenuTrackDecrease = MENU_CLIENT_COMMAND:New( Client, "Frequency Decrease", Client.MenuTracking, self._MenuMessages, { MenuSelf = self, TrackingFrequency = 1 } ) + + Client.MenuAlerts = MENU_CLIENT:New( Client, "Alerts", Client.MainMenu ) + Client.MenuAlertsToAll = MENU_CLIENT_COMMAND:New( Client, "To All", Client.MenuAlerts, self._MenuMessages, { MenuSelf = self, AlertsToAll = true } ) + Client.MenuAlertsToTarget = MENU_CLIENT_COMMAND:New( Client, "To Target", Client.MenuAlerts, self._MenuMessages, { MenuSelf = self, AlertsToAll = false } ) + Client.MenuHitsOn = MENU_CLIENT_COMMAND:New( Client, "Hits On", Client.MenuAlerts, self._MenuMessages, { MenuSelf = self, AlertsHitsOnOff = true } ) + Client.MenuHitsOff = MENU_CLIENT_COMMAND:New( Client, "Hits Off", Client.MenuAlerts, self._MenuMessages, { MenuSelf = self, AlertsHitsOnOff = false } ) + Client.MenuLaunchesOn = MENU_CLIENT_COMMAND:New( Client, "Launches On", Client.MenuAlerts, self._MenuMessages, { MenuSelf = self, AlertsLaunchesOnOff = true } ) + Client.MenuLaunchesOff = MENU_CLIENT_COMMAND:New( Client, "Launches Off", Client.MenuAlerts, self._MenuMessages, { MenuSelf = self, AlertsLaunchesOnOff = false } ) + + Client.MenuDetails = MENU_CLIENT:New( Client, "Details", Client.MainMenu ) + Client.MenuDetailsDistanceOn = MENU_CLIENT_COMMAND:New( Client, "Range On", Client.MenuDetails, self._MenuMessages, { MenuSelf = self, DetailsRangeOnOff = true } ) + Client.MenuDetailsDistanceOff = MENU_CLIENT_COMMAND:New( Client, "Range Off", Client.MenuDetails, self._MenuMessages, { MenuSelf = self, DetailsRangeOnOff = false } ) + Client.MenuDetailsBearingOn = MENU_CLIENT_COMMAND:New( Client, "Bearing On", Client.MenuDetails, self._MenuMessages, { MenuSelf = self, DetailsBearingOnOff = true } ) + Client.MenuDetailsBearingOff = MENU_CLIENT_COMMAND:New( Client, "Bearing Off", Client.MenuDetails, self._MenuMessages, { MenuSelf = self, DetailsBearingOnOff = false } ) + + Client.MenuDistance = MENU_CLIENT:New( Client, "Set distance to plane", Client.MainMenu ) + Client.MenuDistance50 = MENU_CLIENT_COMMAND:New( Client, "50 meter", Client.MenuDistance, self._MenuMessages, { MenuSelf = self, Distance = 50 / 1000 } ) + Client.MenuDistance100 = MENU_CLIENT_COMMAND:New( Client, "100 meter", Client.MenuDistance, self._MenuMessages, { MenuSelf = self, Distance = 100 / 1000 } ) + Client.MenuDistance150 = MENU_CLIENT_COMMAND:New( Client, "150 meter", Client.MenuDistance, self._MenuMessages, { MenuSelf = self, Distance = 150 / 1000 } ) + Client.MenuDistance200 = MENU_CLIENT_COMMAND:New( Client, "200 meter", Client.MenuDistance, self._MenuMessages, { MenuSelf = self, Distance = 200 / 1000 } ) + else + if Client.MainMenu then + Client.MainMenu:Remove() + end + end + + + local ClientID = Client:GetID() + self:T( ClientID ) + if not self.TrackingMissiles[ClientID] then + self.TrackingMissiles[ClientID] = {} + end + self.TrackingMissiles[ClientID].Client = Client + if not self.TrackingMissiles[ClientID].MissileData then + self.TrackingMissiles[ClientID].MissileData = {} + end + end + + Client:Alive( _Alive ) + + end + +-- self.DB:ForEachClient( +-- --- @param Client#CLIENT Client +-- function( Client ) +-- +-- ... actions ... +-- +-- end +-- ) + + self.MessagesOnOff = true + + self.TrackingToAll = false + self.TrackingOnOff = true + self.TrackingFrequency = 3 + + self.AlertsToAll = true + self.AlertsHitsOnOff = true + self.AlertsLaunchesOnOff = true + + self.DetailsRangeOnOff = true + self.DetailsBearingOnOff = true + + self.MenusOnOff = true + + self.TrackingMissiles = {} + + self.TrackingScheduler = SCHEDULER:New( self, self._TrackMissiles, {}, 0.5, 0.05, 0 ) + + return self +end + +-- Initialization methods. + + +--- Sets by default the display of any message to be ON or OFF. +-- @param #MISSILETRAINER self +-- @param #boolean MessagesOnOff true or false +-- @return #MISSILETRAINER self +function MISSILETRAINER:InitMessagesOnOff( MessagesOnOff ) + self:F( MessagesOnOff ) + + self.MessagesOnOff = MessagesOnOff + if self.MessagesOnOff == true then + MESSAGE:New( "Messages ON", "Menu", 15, "ID" ):ToAll() + else + MESSAGE:New( "Messages OFF", "Menu", 15, "ID" ):ToAll() + end + + return self +end + +--- Sets by default the missile tracking report for all players or only for those missiles targetted to you. +-- @param #MISSILETRAINER self +-- @param #boolean TrackingToAll true or false +-- @return #MISSILETRAINER self +function MISSILETRAINER:InitTrackingToAll( TrackingToAll ) + self:F( TrackingToAll ) + + self.TrackingToAll = TrackingToAll + if self.TrackingToAll == true then + MESSAGE:New( "Missile tracking to all players ON", "Menu", 15, "ID" ):ToAll() + else + MESSAGE:New( "Missile tracking to all players OFF", "Menu", 15, "ID" ):ToAll() + end + + return self +end + +--- Sets by default the display of missile tracking report to be ON or OFF. +-- @param #MISSILETRAINER self +-- @param #boolean TrackingOnOff true or false +-- @return #MISSILETRAINER self +function MISSILETRAINER:InitTrackingOnOff( TrackingOnOff ) + self:F( TrackingOnOff ) + + self.TrackingOnOff = TrackingOnOff + if self.TrackingOnOff == true then + MESSAGE:New( "Missile tracking ON", "Menu", 15, "ID" ):ToAll() + else + MESSAGE:New( "Missile tracking OFF", "Menu", 15, "ID" ):ToAll() + end + + return self +end + +--- Increases, decreases the missile tracking message display frequency with the provided time interval in seconds. +-- The default frequency is a 3 second interval, so the Tracking Frequency parameter specifies the increase or decrease from the default 3 seconds or the last frequency update. +-- @param #MISSILETRAINER self +-- @param #number TrackingFrequency Provide a negative or positive value in seconds to incraese or decrease the display frequency. +-- @return #MISSILETRAINER self +function MISSILETRAINER:InitTrackingFrequency( TrackingFrequency ) + self:F( TrackingFrequency ) + + self.TrackingFrequency = self.TrackingFrequency + TrackingFrequency + if self.TrackingFrequency < 0.5 then + self.TrackingFrequency = 0.5 + end + if self.TrackingFrequency then + MESSAGE:New( "Missile tracking frequency is " .. self.TrackingFrequency .. " seconds.", "Menu", 15, "ID" ):ToAll() + end + + return self +end + +--- Sets by default the display of alerts to be shown to all players or only to you. +-- @param #MISSILETRAINER self +-- @param #boolean AlertsToAll true or false +-- @return #MISSILETRAINER self +function MISSILETRAINER:InitAlertsToAll( AlertsToAll ) + self:F( AlertsToAll ) + + self.AlertsToAll = AlertsToAll + if self.AlertsToAll == true then + MESSAGE:New( "Alerts to all players ON", "Menu", 15, "ID" ):ToAll() + else + MESSAGE:New( "Alerts to all players OFF", "Menu", 15, "ID" ):ToAll() + end + + return self +end + +--- Sets by default the display of hit alerts ON or OFF. +-- @param #MISSILETRAINER self +-- @param #boolean AlertsHitsOnOff true or false +-- @return #MISSILETRAINER self +function MISSILETRAINER:InitAlertsHitsOnOff( AlertsHitsOnOff ) + self:F( AlertsHitsOnOff ) + + self.AlertsHitsOnOff = AlertsHitsOnOff + if self.AlertsHitsOnOff == true then + MESSAGE:New( "Alerts Hits ON", "Menu", 15, "ID" ):ToAll() + else + MESSAGE:New( "Alerts Hits OFF", "Menu", 15, "ID" ):ToAll() + end + + return self +end + +--- Sets by default the display of launch alerts ON or OFF. +-- @param #MISSILETRAINER self +-- @param #boolean AlertsLaunchesOnOff true or false +-- @return #MISSILETRAINER self +function MISSILETRAINER:InitAlertsLaunchesOnOff( AlertsLaunchesOnOff ) + self:F( AlertsLaunchesOnOff ) + + self.AlertsLaunchesOnOff = AlertsLaunchesOnOff + if self.AlertsLaunchesOnOff == true then + MESSAGE:New( "Alerts Launches ON", "Menu", 15, "ID" ):ToAll() + else + MESSAGE:New( "Alerts Launches OFF", "Menu", 15, "ID" ):ToAll() + end + + return self +end + +--- Sets by default the display of range information of missiles ON of OFF. +-- @param #MISSILETRAINER self +-- @param #boolean DetailsRangeOnOff true or false +-- @return #MISSILETRAINER self +function MISSILETRAINER:InitRangeOnOff( DetailsRangeOnOff ) + self:F( DetailsRangeOnOff ) + + self.DetailsRangeOnOff = DetailsRangeOnOff + if self.DetailsRangeOnOff == true then + MESSAGE:New( "Range display ON", "Menu", 15, "ID" ):ToAll() + else + MESSAGE:New( "Range display OFF", "Menu", 15, "ID" ):ToAll() + end + + return self +end + +--- Sets by default the display of bearing information of missiles ON of OFF. +-- @param #MISSILETRAINER self +-- @param #boolean DetailsBearingOnOff true or false +-- @return #MISSILETRAINER self +function MISSILETRAINER:InitBearingOnOff( DetailsBearingOnOff ) + self:F( DetailsBearingOnOff ) + + self.DetailsBearingOnOff = DetailsBearingOnOff + if self.DetailsBearingOnOff == true then + MESSAGE:New( "Bearing display OFF", "Menu", 15, "ID" ):ToAll() + else + MESSAGE:New( "Bearing display OFF", "Menu", 15, "ID" ):ToAll() + end + + return self +end + +--- Enables / Disables the menus. +-- @param #MISSILETRAINER self +-- @param #boolean MenusOnOff true or false +-- @return #MISSILETRAINER self +function MISSILETRAINER:InitMenusOnOff( MenusOnOff ) + self:F( MenusOnOff ) + + self.MenusOnOff = MenusOnOff + if self.MenusOnOff == true then + MESSAGE:New( "Menus are ENABLED (only when a player rejoins a slot)", "Menu", 15, "ID" ):ToAll() + else + MESSAGE:New( "Menus are DISABLED", "Menu", 15, "ID" ):ToAll() + end + + return self +end + + +-- Menu functions + +function MISSILETRAINER._MenuMessages( MenuParameters ) + + local self = MenuParameters.MenuSelf + + if MenuParameters.MessagesOnOff ~= nil then + self:InitMessagesOnOff( MenuParameters.MessagesOnOff ) + end + + if MenuParameters.TrackingToAll ~= nil then + self:InitTrackingToAll( MenuParameters.TrackingToAll ) + end + + if MenuParameters.TrackingOnOff ~= nil then + self:InitTrackingOnOff( MenuParameters.TrackingOnOff ) + end + + if MenuParameters.TrackingFrequency ~= nil then + self:InitTrackingFrequency( MenuParameters.TrackingFrequency ) + end + + if MenuParameters.AlertsToAll ~= nil then + self:InitAlertsToAll( MenuParameters.AlertsToAll ) + end + + if MenuParameters.AlertsHitsOnOff ~= nil then + self:InitAlertsHitsOnOff( MenuParameters.AlertsHitsOnOff ) + end + + if MenuParameters.AlertsLaunchesOnOff ~= nil then + self:InitAlertsLaunchesOnOff( MenuParameters.AlertsLaunchesOnOff ) + end + + if MenuParameters.DetailsRangeOnOff ~= nil then + self:InitRangeOnOff( MenuParameters.DetailsRangeOnOff ) + end + + if MenuParameters.DetailsBearingOnOff ~= nil then + self:InitBearingOnOff( MenuParameters.DetailsBearingOnOff ) + end + + if MenuParameters.Distance ~= nil then + self.Distance = MenuParameters.Distance + MESSAGE:New( "Hit detection distance set to " .. self.Distance .. " meters", "Menu", 15, "ID" ):ToAll() + end + +end + +--- Detects if an SA site was shot with an anti radiation missile. In this case, take evasive actions based on the skill level set within the ME. +-- @param #MISSILETRAINER self +-- @param Event#EVENTDATA Event +function MISSILETRAINER:_EventShot( Event ) + self:F( { Event } ) + + local TrainerSourceDCSUnit = Event.IniDCSUnit + local TrainerSourceDCSUnitName = Event.IniDCSUnitName + local TrainerWeapon = Event.Weapon -- Identify the weapon fired + local TrainerWeaponName = Event.WeaponName -- return weapon type + + self:T( "Missile Launched = " .. TrainerWeaponName ) + + local TrainerTargetDCSUnit = TrainerWeapon:getTarget() -- Identify target + local TrainerTargetDCSUnitName = Unit.getName( TrainerTargetDCSUnit ) + local TrainerTargetSkill = _DATABASE.Templates.Units[TrainerTargetDCSUnitName].Template.skill + + self:T(TrainerTargetDCSUnitName ) + + local Client = self.DBClients[TrainerTargetDCSUnitName] + if Client then + + local TrainerSourceUnit = UNIT:Find( TrainerSourceDCSUnit ) + local TrainerTargetUnit = UNIT:Find( TrainerTargetDCSUnit ) + + if self.MessagesOnOff == true and self.AlertsLaunchesOnOff == true then + + local Message = MESSAGE:New( + string.format( "%s launched a %s", + TrainerSourceUnit:GetTypeName(), + TrainerWeaponName + ) .. self:_AddRange( Client, TrainerWeapon ) .. self:_AddBearing( Client, TrainerWeapon ),"Launch Alert", 5, "ID" ) + + if self.AlertsToAll then + Message:ToAll() + else + Message:ToClient( Client ) + end + end + + local ClientID = Client:GetID() + local MissileData = {} + MissileData.TrainerSourceUnit = TrainerSourceUnit + MissileData.TrainerWeapon = TrainerWeapon + MissileData.TrainerTargetUnit = TrainerTargetUnit + MissileData.TrainerWeaponTypeName = TrainerWeapon:getTypeName() + MissileData.TrainerWeaponLaunched = true + table.insert( self.TrackingMissiles[ClientID].MissileData, MissileData ) + --self:T( self.TrackingMissiles ) + end +end + +function MISSILETRAINER:_AddRange( Client, TrainerWeapon ) + + local RangeText = "" + + if self.DetailsRangeOnOff then + + local PositionMissile = TrainerWeapon:getPoint() + local PositionTarget = Client:GetPointVec3() + + local Range = ( ( PositionMissile.x - PositionTarget.x )^2 + + ( PositionMissile.y - PositionTarget.y )^2 + + ( PositionMissile.z - PositionTarget.z )^2 + ) ^ 0.5 / 1000 + + RangeText = string.format( ", at %4.2fkm", Range ) + end + + return RangeText +end + +function MISSILETRAINER:_AddBearing( Client, TrainerWeapon ) + + local BearingText = "" + + if self.DetailsBearingOnOff then + + local PositionMissile = TrainerWeapon:getPoint() + local PositionTarget = Client:GetPointVec3() + + self:T2( { PositionTarget, PositionMissile }) + + local DirectionVector = { x = PositionMissile.x - PositionTarget.x, y = PositionMissile.y - PositionTarget.y, z = PositionMissile.z - PositionTarget.z } + local DirectionRadians = math.atan2( DirectionVector.z, DirectionVector.x ) + --DirectionRadians = DirectionRadians + routines.getNorthCorrection( PositionTarget ) + if DirectionRadians < 0 then + DirectionRadians = DirectionRadians + 2 * math.pi + end + local DirectionDegrees = DirectionRadians * 180 / math.pi + + BearingText = string.format( ", %d degrees", DirectionDegrees ) + end + + return BearingText +end + + +function MISSILETRAINER:_TrackMissiles() + self:F2() + + + local ShowMessages = false + if self.MessagesOnOff and self.MessageLastTime + self.TrackingFrequency <= timer.getTime() then + self.MessageLastTime = timer.getTime() + ShowMessages = true + end + + -- ALERTS PART + + -- Loop for all Player Clients to check the alerts and deletion of missiles. + for ClientDataID, ClientData in pairs( self.TrackingMissiles ) do + + local Client = ClientData.Client + self:T2( { Client:GetName() } ) + + for MissileDataID, MissileData in pairs( ClientData.MissileData ) do + self:T3( MissileDataID ) + + local TrainerSourceUnit = MissileData.TrainerSourceUnit + local TrainerWeapon = MissileData.TrainerWeapon + local TrainerTargetUnit = MissileData.TrainerTargetUnit + local TrainerWeaponTypeName = MissileData.TrainerWeaponTypeName + local TrainerWeaponLaunched = MissileData.TrainerWeaponLaunched + + if Client and Client:IsAlive() and TrainerSourceUnit and TrainerSourceUnit:IsAlive() and TrainerWeapon and TrainerWeapon:isExist() and TrainerTargetUnit and TrainerTargetUnit:IsAlive() then + local PositionMissile = TrainerWeapon:getPosition().p + local PositionTarget = Client:GetPointVec3() + + local Distance = ( ( PositionMissile.x - PositionTarget.x )^2 + + ( PositionMissile.y - PositionTarget.y )^2 + + ( PositionMissile.z - PositionTarget.z )^2 + ) ^ 0.5 / 1000 + + if Distance <= self.Distance then + -- Hit alert + TrainerWeapon:destroy() + if self.MessagesOnOff == true and self.AlertsHitsOnOff == true then + + self:T( "killed" ) + + local Message = MESSAGE:New( + string.format( "%s launched by %s killed %s", + TrainerWeapon:getTypeName(), + TrainerSourceUnit:GetTypeName(), + TrainerTargetUnit:GetPlayerName() + ),"Hit Alert", 15, "ID" ) + + if self.AlertsToAll == true then + Message:ToAll() + else + Message:ToClient( Client ) + end + + MissileData = nil + table.remove( ClientData.MissileData, MissileDataID ) + self:T(ClientData.MissileData) + end + end + else + if not ( TrainerWeapon and TrainerWeapon:isExist() ) then + if self.MessagesOnOff == true and self.AlertsLaunchesOnOff == true then + -- Weapon does not exist anymore. Delete from Table + local Message = MESSAGE:New( + string.format( "%s launched by %s self destructed!", + TrainerWeaponTypeName, + TrainerSourceUnit:GetTypeName() + ),"Tracking", 5, "ID" ) + + if self.AlertsToAll == true then + Message:ToAll() + else + Message:ToClient( Client ) + end + end + MissileData = nil + table.remove( ClientData.MissileData, MissileDataID ) + self:T( ClientData.MissileData ) + end + end + end + end + + if ShowMessages == true and self.MessagesOnOff == true and self.TrackingOnOff == true then -- Only do this when tracking information needs to be displayed. + + -- TRACKING PART + + -- For the current client, the missile range and bearing details are displayed To the Player Client. + -- For the other clients, the missile range and bearing details are displayed To the other Player Clients. + -- To achieve this, a cross loop is done for each Player Client <-> Other Player Client missile information. + + -- Main Player Client loop + for ClientDataID, ClientData in pairs( self.TrackingMissiles ) do + + local Client = ClientData.Client + self:T2( { Client:GetName() } ) + + + ClientData.MessageToClient = "" + ClientData.MessageToAll = "" + + -- Other Players Client loop + for TrackingDataID, TrackingData in pairs( self.TrackingMissiles ) do + + for MissileDataID, MissileData in pairs( TrackingData.MissileData ) do + self:T3( MissileDataID ) + + local TrainerSourceUnit = MissileData.TrainerSourceUnit + local TrainerWeapon = MissileData.TrainerWeapon + local TrainerTargetUnit = MissileData.TrainerTargetUnit + local TrainerWeaponTypeName = MissileData.TrainerWeaponTypeName + local TrainerWeaponLaunched = MissileData.TrainerWeaponLaunched + + if Client and Client:IsAlive() and TrainerSourceUnit and TrainerSourceUnit:IsAlive() and TrainerWeapon and TrainerWeapon:isExist() and TrainerTargetUnit and TrainerTargetUnit:IsAlive() then + + if ShowMessages == true then + local TrackingTo + TrackingTo = string.format( " -> %s", + TrainerWeaponTypeName + ) + + if ClientDataID == TrackingDataID then + if ClientData.MessageToClient == "" then + ClientData.MessageToClient = "Missiles to You:\n" + end + ClientData.MessageToClient = ClientData.MessageToClient .. TrackingTo .. self:_AddRange( ClientData.Client, TrainerWeapon ) .. self:_AddBearing( ClientData.Client, TrainerWeapon ) .. "\n" + else + if self.TrackingToAll == true then + if ClientData.MessageToAll == "" then + ClientData.MessageToAll = "Missiles to other Players:\n" + end + ClientData.MessageToAll = ClientData.MessageToAll .. TrackingTo .. self:_AddRange( ClientData.Client, TrainerWeapon ) .. self:_AddBearing( ClientData.Client, TrainerWeapon ) .. " ( " .. TrainerTargetUnit:GetPlayerName() .. " )\n" + end + end + end + end + end + end + + -- Once the Player Client and the Other Player Client tracking messages are prepared, show them. + if ClientData.MessageToClient ~= "" or ClientData.MessageToAll ~= "" then + local Message = MESSAGE:New( ClientData.MessageToClient .. ClientData.MessageToAll, "Tracking", 1, "ID" ):ToClient( Client ) + end + end + end + + return true +end +env.info( '*** MOOSE INCLUDE END *** ' ) diff --git a/Moose Mission Setup/Moose.lua b/Moose Mission Setup/Moose.lua index 114a0f7fe..c8fd0f133 100644 --- a/Moose Mission Setup/Moose.lua +++ b/Moose Mission Setup/Moose.lua @@ -1,6 +1,5 @@ -env.info( '*** MOOSE DYNAMIC INCLUDE START *** ' ) -env.info( 'Moose Generation Timestamp: 20160605_2147' ) - +env.info( '*** MOOSE STATIC INCLUDE START *** ' ) +env.info( 'Moose Generation Timestamp: 20160606_1343' ) local base = _G env.info("Loading MOOSE " .. base.timer.getAbsTime() ) @@ -12,27 +11,9 @@ Include.Path = function() end Include.File = function( IncludeFile ) - if not Include.Files[ IncludeFile ] then - Include.Files[IncludeFile] = IncludeFile - env.info( "Include:" .. IncludeFile .. " from " .. Include.ProgramPath ) - local f = assert( base.loadfile( Include.ProgramPath .. IncludeFile .. ".lua" ) ) - if f == nil then - env.info( "Include:" .. IncludeFile .. " from " .. Include.MissionPath ) - local f = assert( base.loadfile( Include.MissionPath .. IncludeFile .. ".lua" ) ) - if f == nil then - error ("Could not load MOOSE file " .. IncludeFile .. ".lua" ) - else - env.info( "Include:" .. IncludeFile .. " loaded from " .. Include.MissionPath ) - return f() - end - else - env.info( "Include:" .. IncludeFile .. " loaded from " .. Include.ProgramPath ) - return f() - end - end end -Include.ProgramPath = "Scripts/Moose/" +Include.ProgramPath = "Scripts/Moose/Moose/" Include.MissionPath = Include.Path() env.info( "Include.ProgramPath = " .. Include.ProgramPath) @@ -42,4 +23,17983 @@ Include.Files = {} Include.File( "Moose" ) -env.info("Loaded MOOSE Include Engine")env.info( '*** MOOSE INCLUDE END *** ' ) +env.info("Loaded MOOSE Include Engine") +--- Various routines +-- @module routines +-- @author Flightcontrol + +--Include.File( "Trace" ) +--Include.File( "Message" ) + + +env.setErrorMessageBoxEnabled(false) + +--- Extract of MIST functions. +-- @author Grimes + +routines = {} + + +-- don't change these +routines.majorVersion = 3 +routines.minorVersion = 3 +routines.build = 22 + +----------------------------------------------------------------------------------------------------------------- + +---------------------------------------------------------------------------------------------- +-- Utils- conversion, Lua utils, etc. +routines.utils = {} + +--from http://lua-users.org/wiki/CopyTable +routines.utils.deepCopy = function(object) + local lookup_table = {} + local function _copy(object) + if type(object) ~= "table" then + return object + elseif lookup_table[object] then + return lookup_table[object] + end + local new_table = {} + lookup_table[object] = new_table + for index, value in pairs(object) do + new_table[_copy(index)] = _copy(value) + end + return setmetatable(new_table, getmetatable(object)) + end + local objectreturn = _copy(object) + return objectreturn +end + + +-- porting in Slmod's serialize_slmod2 +routines.utils.oneLineSerialize = function(tbl) -- serialization of a table all on a single line, no comments, made to replace old get_table_string function + + lookup_table = {} + + local function _Serialize( tbl ) + + if type(tbl) == 'table' then --function only works for tables! + + if lookup_table[tbl] then + return lookup_table[object] + end + + local tbl_str = {} + + lookup_table[tbl] = tbl_str + + tbl_str[#tbl_str + 1] = '{' + + for ind,val in pairs(tbl) do -- serialize its fields + local ind_str = {} + if type(ind) == "number" then + ind_str[#ind_str + 1] = '[' + ind_str[#ind_str + 1] = tostring(ind) + ind_str[#ind_str + 1] = ']=' + else --must be a string + ind_str[#ind_str + 1] = '[' + ind_str[#ind_str + 1] = routines.utils.basicSerialize(ind) + ind_str[#ind_str + 1] = ']=' + end + + local val_str = {} + if ((type(val) == 'number') or (type(val) == 'boolean')) then + val_str[#val_str + 1] = tostring(val) + val_str[#val_str + 1] = ',' + tbl_str[#tbl_str + 1] = table.concat(ind_str) + tbl_str[#tbl_str + 1] = table.concat(val_str) + elseif type(val) == 'string' then + val_str[#val_str + 1] = routines.utils.basicSerialize(val) + val_str[#val_str + 1] = ',' + tbl_str[#tbl_str + 1] = table.concat(ind_str) + tbl_str[#tbl_str + 1] = table.concat(val_str) + elseif type(val) == 'nil' then -- won't ever happen, right? + val_str[#val_str + 1] = 'nil,' + tbl_str[#tbl_str + 1] = table.concat(ind_str) + tbl_str[#tbl_str + 1] = table.concat(val_str) + elseif type(val) == 'table' then + if ind == "__index" then + -- tbl_str[#tbl_str + 1] = "__index" + -- tbl_str[#tbl_str + 1] = ',' --I think this is right, I just added it + else + + val_str[#val_str + 1] = _Serialize(val) + val_str[#val_str + 1] = ',' --I think this is right, I just added it + tbl_str[#tbl_str + 1] = table.concat(ind_str) + tbl_str[#tbl_str + 1] = table.concat(val_str) + end + elseif type(val) == 'function' then + -- tbl_str[#tbl_str + 1] = "function " .. tostring(ind) + -- tbl_str[#tbl_str + 1] = ',' --I think this is right, I just added it + else +-- env.info('unable to serialize value type ' .. routines.utils.basicSerialize(type(val)) .. ' at index ' .. tostring(ind)) +-- env.info( debug.traceback() ) + end + + end + tbl_str[#tbl_str + 1] = '}' + return table.concat(tbl_str) + else + return tostring(tbl) + end + end + + local objectreturn = _Serialize(tbl) + return objectreturn +end + +--porting in Slmod's "safestring" basic serialize +routines.utils.basicSerialize = function(s) + if s == nil then + return "\"\"" + else + if ((type(s) == 'number') or (type(s) == 'boolean') or (type(s) == 'function') or (type(s) == 'table') or (type(s) == 'userdata') ) then + return tostring(s) + elseif type(s) == 'string' then + s = string.format('%q', s) + return s + end + end +end + + +routines.utils.toDegree = function(angle) + return angle*180/math.pi +end + +routines.utils.toRadian = function(angle) + return angle*math.pi/180 +end + +routines.utils.metersToNM = function(meters) + return meters/1852 +end + +routines.utils.metersToFeet = function(meters) + return meters/0.3048 +end + +routines.utils.NMToMeters = function(NM) + return NM*1852 +end + +routines.utils.feetToMeters = function(feet) + return feet*0.3048 +end + +routines.utils.mpsToKnots = function(mps) + return mps*3600/1852 +end + +routines.utils.mpsToKmph = function(mps) + return mps*3.6 +end + +routines.utils.knotsToMps = function(knots) + return knots*1852/3600 +end + +routines.utils.kmphToMps = function(kmph) + return kmph/3.6 +end + +function routines.utils.makeVec2(Vec3) + if Vec3.z then + return {x = Vec3.x, y = Vec3.z} + else + return {x = Vec3.x, y = Vec3.y} -- it was actually already vec2. + end +end + +function routines.utils.makeVec3(Vec2, y) + if not Vec2.z then + if not y then + y = 0 + end + return {x = Vec2.x, y = y, z = Vec2.y} + else + return {x = Vec2.x, y = Vec2.y, z = Vec2.z} -- it was already Vec3, actually. + end +end + +function routines.utils.makeVec3GL(Vec2, offset) + local adj = offset or 0 + + if not Vec2.z then + return {x = Vec2.x, y = (land.getHeight(Vec2) + adj), z = Vec2.y} + else + return {x = Vec2.x, y = (land.getHeight({x = Vec2.x, y = Vec2.z}) + adj), z = Vec2.z} + end +end + +routines.utils.zoneToVec3 = function(zone) + local new = {} + if type(zone) == 'table' and zone.point then + new.x = zone.point.x + new.y = zone.point.y + new.z = zone.point.z + return new + elseif type(zone) == 'string' then + zone = trigger.misc.getZone(zone) + if zone then + new.x = zone.point.x + new.y = zone.point.y + new.z = zone.point.z + return new + end + end +end + +-- gets heading-error corrected direction from point along vector vec. +function routines.utils.getDir(vec, point) + local dir = math.atan2(vec.z, vec.x) + dir = dir + routines.getNorthCorrection(point) + if dir < 0 then + dir = dir + 2*math.pi -- put dir in range of 0 to 2*pi + end + return dir +end + +-- gets distance in meters between two points (2 dimensional) +function routines.utils.get2DDist(point1, point2) + point1 = routines.utils.makeVec3(point1) + point2 = routines.utils.makeVec3(point2) + return routines.vec.mag({x = point1.x - point2.x, y = 0, z = point1.z - point2.z}) +end + +-- gets distance in meters between two points (3 dimensional) +function routines.utils.get3DDist(point1, point2) + return routines.vec.mag({x = point1.x - point2.x, y = point1.y - point2.y, z = point1.z - point2.z}) +end + + + +-- From http://lua-users.org/wiki/SimpleRound +-- use negative idp for rounding ahead of decimal place, positive for rounding after decimal place +routines.utils.round = function(num, idp) + local mult = 10^(idp or 0) + return math.floor(num * mult + 0.5) / mult +end + +-- porting in Slmod's dostring +routines.utils.dostring = function(s) + local f, err = loadstring(s) + if f then + return true, f() + else + return false, err + end +end + + +--3D Vector manipulation +routines.vec = {} + +routines.vec.add = function(vec1, vec2) + return {x = vec1.x + vec2.x, y = vec1.y + vec2.y, z = vec1.z + vec2.z} +end + +routines.vec.sub = function(vec1, vec2) + return {x = vec1.x - vec2.x, y = vec1.y - vec2.y, z = vec1.z - vec2.z} +end + +routines.vec.scalarMult = function(vec, mult) + return {x = vec.x*mult, y = vec.y*mult, z = vec.z*mult} +end + +routines.vec.scalar_mult = routines.vec.scalarMult + +routines.vec.dp = function(vec1, vec2) + return vec1.x*vec2.x + vec1.y*vec2.y + vec1.z*vec2.z +end + +routines.vec.cp = function(vec1, vec2) + return { x = vec1.y*vec2.z - vec1.z*vec2.y, y = vec1.z*vec2.x - vec1.x*vec2.z, z = vec1.x*vec2.y - vec1.y*vec2.x} +end + +routines.vec.mag = function(vec) + return (vec.x^2 + vec.y^2 + vec.z^2)^0.5 +end + +routines.vec.getUnitVec = function(vec) + local mag = routines.vec.mag(vec) + return { x = vec.x/mag, y = vec.y/mag, z = vec.z/mag } +end + +routines.vec.rotateVec2 = function(vec2, theta) + return { x = vec2.x*math.cos(theta) - vec2.y*math.sin(theta), y = vec2.x*math.sin(theta) + vec2.y*math.cos(theta)} +end +--------------------------------------------------------------------------------------------------------------------------- + + + + +-- acc- the accuracy of each easting/northing. 0, 1, 2, 3, 4, or 5. +routines.tostringMGRS = function(MGRS, acc) + if acc == 0 then + return MGRS.UTMZone .. ' ' .. MGRS.MGRSDigraph + else + return MGRS.UTMZone .. ' ' .. MGRS.MGRSDigraph .. ' ' .. string.format('%0' .. acc .. 'd', routines.utils.round(MGRS.Easting/(10^(5-acc)), 0)) + .. ' ' .. string.format('%0' .. acc .. 'd', routines.utils.round(MGRS.Northing/(10^(5-acc)), 0)) + end +end + +--[[acc: +in DM: decimal point of minutes. +In DMS: decimal point of seconds. +position after the decimal of the least significant digit: +So: +42.32 - acc of 2. +]] +routines.tostringLL = function(lat, lon, acc, DMS) + + local latHemi, lonHemi + if lat > 0 then + latHemi = 'N' + else + latHemi = 'S' + end + + if lon > 0 then + lonHemi = 'E' + else + lonHemi = 'W' + end + + lat = math.abs(lat) + lon = math.abs(lon) + + local latDeg = math.floor(lat) + local latMin = (lat - latDeg)*60 + + local lonDeg = math.floor(lon) + local lonMin = (lon - lonDeg)*60 + + if DMS then -- degrees, minutes, and seconds. + local oldLatMin = latMin + latMin = math.floor(latMin) + local latSec = routines.utils.round((oldLatMin - latMin)*60, acc) + + local oldLonMin = lonMin + lonMin = math.floor(lonMin) + local lonSec = routines.utils.round((oldLonMin - lonMin)*60, acc) + + if latSec == 60 then + latSec = 0 + latMin = latMin + 1 + end + + if lonSec == 60 then + lonSec = 0 + lonMin = lonMin + 1 + end + + local secFrmtStr -- create the formatting string for the seconds place + if acc <= 0 then -- no decimal place. + secFrmtStr = '%02d' + else + local width = 3 + acc -- 01.310 - that's a width of 6, for example. + secFrmtStr = '%0' .. width .. '.' .. acc .. 'f' + end + + return string.format('%02d', latDeg) .. ' ' .. string.format('%02d', latMin) .. '\' ' .. string.format(secFrmtStr, latSec) .. '"' .. latHemi .. ' ' + .. string.format('%02d', lonDeg) .. ' ' .. string.format('%02d', lonMin) .. '\' ' .. string.format(secFrmtStr, lonSec) .. '"' .. lonHemi + + else -- degrees, decimal minutes. + latMin = routines.utils.round(latMin, acc) + lonMin = routines.utils.round(lonMin, acc) + + if latMin == 60 then + latMin = 0 + latDeg = latDeg + 1 + end + + if lonMin == 60 then + lonMin = 0 + lonDeg = lonDeg + 1 + end + + local minFrmtStr -- create the formatting string for the minutes place + if acc <= 0 then -- no decimal place. + minFrmtStr = '%02d' + else + local width = 3 + acc -- 01.310 - that's a width of 6, for example. + minFrmtStr = '%0' .. width .. '.' .. acc .. 'f' + end + + return string.format('%02d', latDeg) .. ' ' .. string.format(minFrmtStr, latMin) .. '\'' .. latHemi .. ' ' + .. string.format('%02d', lonDeg) .. ' ' .. string.format(minFrmtStr, lonMin) .. '\'' .. lonHemi + + end +end + +--[[ required: az - radian + required: dist - meters + optional: alt - meters (set to false or nil if you don't want to use it). + optional: metric - set true to get dist and alt in km and m. + precision will always be nearest degree and NM or km.]] +routines.tostringBR = function(az, dist, alt, metric) + az = routines.utils.round(routines.utils.toDegree(az), 0) + + if metric then + dist = routines.utils.round(dist/1000, 2) + else + dist = routines.utils.round(routines.utils.metersToNM(dist), 2) + end + + local s = string.format('%03d', az) .. ' for ' .. dist + + if alt then + if metric then + s = s .. ' at ' .. routines.utils.round(alt, 0) + else + s = s .. ' at ' .. routines.utils.round(routines.utils.metersToFeet(alt), 0) + end + end + return s +end + +routines.getNorthCorrection = function(point) --gets the correction needed for true north + if not point.z then --Vec2; convert to Vec3 + point.z = point.y + point.y = 0 + end + local lat, lon = coord.LOtoLL(point) + local north_posit = coord.LLtoLO(lat + 1, lon) + return math.atan2(north_posit.z - point.z, north_posit.x - point.x) +end + + +-- the main area +do + -- THE MAIN FUNCTION -- Accessed 100 times/sec. + routines.main = function() + timer.scheduleFunction(routines.main, {}, timer.getTime() + 2) --reschedule first in case of Lua error + ---------------------------------------------------------------------------------------------------------- + --area to add new stuff in + + routines.do_scheduled_functions() + end -- end of routines.main + + timer.scheduleFunction(routines.main, {}, timer.getTime() + 2) + +end + + +do + local idNum = 0 + + --Simplified event handler + routines.addEventHandler = function(f) --id is optional! + local handler = {} + idNum = idNum + 1 + handler.id = idNum + handler.f = f + handler.onEvent = function(self, event) + self.f(event) + end + world.addEventHandler(handler) + end + + routines.removeEventHandler = function(id) + for key, handler in pairs(world.eventHandlers) do + if handler.id and handler.id == id then + world.eventHandlers[key] = nil + return true + end + end + return false + end +end + +-- need to return a Vec3 or Vec2? +function routines.getRandPointInCircle(point, radius, innerRadius) + local theta = 2*math.pi*math.random() + local rad = math.random() + math.random() + if rad > 1 then + rad = 2 - rad + end + + local radMult + if innerRadius and innerRadius <= radius then + radMult = (radius - innerRadius)*rad + innerRadius + else + radMult = radius*rad + end + + if not point.z then --might as well work with vec2/3 + point.z = point.y + end + + local rndCoord + if radius > 0 then + rndCoord = {x = math.cos(theta)*radMult + point.x, y = math.sin(theta)*radMult + point.z} + else + rndCoord = {x = point.x, y = point.z} + end + return rndCoord +end + +routines.goRoute = function(group, path) + local misTask = { + id = 'Mission', + params = { + route = { + points = routines.utils.deepCopy(path), + }, + }, + } + if type(group) == 'string' then + group = Group.getByName(group) + end + local groupCon = group:getController() + if groupCon then + groupCon:setTask(misTask) + return true + end + + Controller.setTask(groupCon, misTask) + return false +end + + +-- Useful atomic functions from mist, ported. + +routines.ground = {} +routines.fixedWing = {} +routines.heli = {} + +routines.ground.buildWP = function(point, overRideForm, overRideSpeed) + + local wp = {} + wp.x = point.x + + if point.z then + wp.y = point.z + else + wp.y = point.y + end + local form, speed + + if point.speed and not overRideSpeed then + wp.speed = point.speed + elseif type(overRideSpeed) == 'number' then + wp.speed = overRideSpeed + else + wp.speed = routines.utils.kmphToMps(20) + end + + if point.form and not overRideForm then + form = point.form + else + form = overRideForm + end + + if not form then + wp.action = 'Cone' + else + form = string.lower(form) + if form == 'off_road' or form == 'off road' then + wp.action = 'Off Road' + elseif form == 'on_road' or form == 'on road' then + wp.action = 'On Road' + elseif form == 'rank' or form == 'line_abrest' or form == 'line abrest' or form == 'lineabrest'then + wp.action = 'Rank' + elseif form == 'cone' then + wp.action = 'Cone' + elseif form == 'diamond' then + wp.action = 'Diamond' + elseif form == 'vee' then + wp.action = 'Vee' + elseif form == 'echelon_left' or form == 'echelon left' or form == 'echelonl' then + wp.action = 'EchelonL' + elseif form == 'echelon_right' or form == 'echelon right' or form == 'echelonr' then + wp.action = 'EchelonR' + else + wp.action = 'Cone' -- if nothing matched + end + end + + wp.type = 'Turning Point' + + return wp + +end + +routines.fixedWing.buildWP = function(point, WPtype, speed, alt, altType) + + local wp = {} + wp.x = point.x + + if point.z then + wp.y = point.z + else + wp.y = point.y + end + + if alt and type(alt) == 'number' then + wp.alt = alt + else + wp.alt = 2000 + end + + if altType then + altType = string.lower(altType) + if altType == 'radio' or 'agl' then + wp.alt_type = 'RADIO' + elseif altType == 'baro' or 'asl' then + wp.alt_type = 'BARO' + end + else + wp.alt_type = 'RADIO' + end + + if point.speed then + speed = point.speed + end + + if point.type then + WPtype = point.type + end + + if not speed then + wp.speed = routines.utils.kmphToMps(500) + else + wp.speed = speed + end + + if not WPtype then + wp.action = 'Turning Point' + else + WPtype = string.lower(WPtype) + if WPtype == 'flyover' or WPtype == 'fly over' or WPtype == 'fly_over' then + wp.action = 'Fly Over Point' + elseif WPtype == 'turningpoint' or WPtype == 'turning point' or WPtype == 'turning_point' then + wp.action = 'Turning Point' + else + wp.action = 'Turning Point' + end + end + + wp.type = 'Turning Point' + return wp +end + +routines.heli.buildWP = function(point, WPtype, speed, alt, altType) + + local wp = {} + wp.x = point.x + + if point.z then + wp.y = point.z + else + wp.y = point.y + end + + if alt and type(alt) == 'number' then + wp.alt = alt + else + wp.alt = 500 + end + + if altType then + altType = string.lower(altType) + if altType == 'radio' or 'agl' then + wp.alt_type = 'RADIO' + elseif altType == 'baro' or 'asl' then + wp.alt_type = 'BARO' + end + else + wp.alt_type = 'RADIO' + end + + if point.speed then + speed = point.speed + end + + if point.type then + WPtype = point.type + end + + if not speed then + wp.speed = routines.utils.kmphToMps(200) + else + wp.speed = speed + end + + if not WPtype then + wp.action = 'Turning Point' + else + WPtype = string.lower(WPtype) + if WPtype == 'flyover' or WPtype == 'fly over' or WPtype == 'fly_over' then + wp.action = 'Fly Over Point' + elseif WPtype == 'turningpoint' or WPtype == 'turning point' or WPtype == 'turning_point' then + wp.action = 'Turning Point' + else + wp.action = 'Turning Point' + end + end + + wp.type = 'Turning Point' + return wp +end + +routines.groupToRandomPoint = function(vars) + local group = vars.group --Required + local point = vars.point --required + local radius = vars.radius or 0 + local innerRadius = vars.innerRadius + local form = vars.form or 'Cone' + local heading = vars.heading or math.random()*2*math.pi + local headingDegrees = vars.headingDegrees + local speed = vars.speed or routines.utils.kmphToMps(20) + + + local useRoads + if not vars.disableRoads then + useRoads = true + else + useRoads = false + end + + local path = {} + + if headingDegrees then + heading = headingDegrees*math.pi/180 + end + + if heading >= 2*math.pi then + heading = heading - 2*math.pi + end + + local rndCoord = routines.getRandPointInCircle(point, radius, innerRadius) + + local offset = {} + local posStart = routines.getLeadPos(group) + + offset.x = routines.utils.round(math.sin(heading - (math.pi/2)) * 50 + rndCoord.x, 3) + offset.z = routines.utils.round(math.cos(heading + (math.pi/2)) * 50 + rndCoord.y, 3) + path[#path + 1] = routines.ground.buildWP(posStart, form, speed) + + + if useRoads == true and ((point.x - posStart.x)^2 + (point.z - posStart.z)^2)^0.5 > radius * 1.3 then + path[#path + 1] = routines.ground.buildWP({['x'] = posStart.x + 11, ['z'] = posStart.z + 11}, 'off_road', speed) + path[#path + 1] = routines.ground.buildWP(posStart, 'on_road', speed) + path[#path + 1] = routines.ground.buildWP(offset, 'on_road', speed) + else + path[#path + 1] = routines.ground.buildWP({['x'] = posStart.x + 25, ['z'] = posStart.z + 25}, form, speed) + end + + path[#path + 1] = routines.ground.buildWP(offset, form, speed) + path[#path + 1] = routines.ground.buildWP(rndCoord, form, speed) + + routines.goRoute(group, path) + + return +end + +routines.groupRandomDistSelf = function(gpData, dist, form, heading, speed) + local pos = routines.getLeadPos(gpData) + local fakeZone = {} + fakeZone.radius = dist or math.random(300, 1000) + fakeZone.point = {x = pos.x, y, pos.y, z = pos.z} + routines.groupToRandomZone(gpData, fakeZone, form, heading, speed) + + return +end + +routines.groupToRandomZone = function(gpData, zone, form, heading, speed) + if type(gpData) == 'string' then + gpData = Group.getByName(gpData) + end + + if type(zone) == 'string' then + zone = trigger.misc.getZone(zone) + elseif type(zone) == 'table' and not zone.radius then + zone = trigger.misc.getZone(zone[math.random(1, #zone)]) + end + + if speed then + speed = routines.utils.kmphToMps(speed) + end + + local vars = {} + vars.group = gpData + vars.radius = zone.radius + vars.form = form + vars.headingDegrees = heading + vars.speed = speed + vars.point = routines.utils.zoneToVec3(zone) + + routines.groupToRandomPoint(vars) + + return +end + +routines.isTerrainValid = function(coord, terrainTypes) -- vec2/3 and enum or table of acceptable terrain types + if coord.z then + coord.y = coord.z + end + local typeConverted = {} + + if type(terrainTypes) == 'string' then -- if its a string it does this check + for constId, constData in pairs(land.SurfaceType) do + if string.lower(constId) == string.lower(terrainTypes) or string.lower(constData) == string.lower(terrainTypes) then + table.insert(typeConverted, constId) + end + end + elseif type(terrainTypes) == 'table' then -- if its a table it does this check + for typeId, typeData in pairs(terrainTypes) do + for constId, constData in pairs(land.SurfaceType) do + if string.lower(constId) == string.lower(typeData) or string.lower(constData) == string.lower(typeId) then + table.insert(typeConverted, constId) + end + end + end + end + for validIndex, validData in pairs(typeConverted) do + if land.getSurfaceType(coord) == land.SurfaceType[validData] then + return true + end + end + return false +end + +routines.groupToPoint = function(gpData, point, form, heading, speed, useRoads) + if type(point) == 'string' then + point = trigger.misc.getZone(point) + end + if speed then + speed = routines.utils.kmphToMps(speed) + end + + local vars = {} + vars.group = gpData + vars.form = form + vars.headingDegrees = heading + vars.speed = speed + vars.disableRoads = useRoads + vars.point = routines.utils.zoneToVec3(point) + routines.groupToRandomPoint(vars) + + return +end + + +routines.getLeadPos = function(group) + if type(group) == 'string' then -- group name + group = Group.getByName(group) + end + + local units = group:getUnits() + + local leader = units[1] + if not leader then -- SHOULD be good, but if there is a bug, this code future-proofs it then. + local lowestInd = math.huge + for ind, unit in pairs(units) do + if ind < lowestInd then + lowestInd = ind + leader = unit + end + end + end + if leader and Unit.isExist(leader) then -- maybe a little too paranoid now... + return leader:getPosition().p + end +end + +--[[ vars for routines.getMGRSString: +vars.units - table of unit names (NOT unitNameTable- maybe this should change). +vars.acc - integer between 0 and 5, inclusive +]] +routines.getMGRSString = function(vars) + local units = vars.units + local acc = vars.acc or 5 + local avgPos = routines.getAvgPos(units) + if avgPos then + return routines.tostringMGRS(coord.LLtoMGRS(coord.LOtoLL(avgPos)), acc) + end +end + +--[[ vars for routines.getLLString +vars.units - table of unit names (NOT unitNameTable- maybe this should change). +vars.acc - integer, number of numbers after decimal place +vars.DMS - if true, output in degrees, minutes, seconds. Otherwise, output in degrees, minutes. + + +]] +routines.getLLString = function(vars) + local units = vars.units + local acc = vars.acc or 3 + local DMS = vars.DMS + local avgPos = routines.getAvgPos(units) + if avgPos then + local lat, lon = coord.LOtoLL(avgPos) + return routines.tostringLL(lat, lon, acc, DMS) + end +end + +--[[ +vars.zone - table of a zone name. +vars.ref - vec3 ref point, maybe overload for vec2 as well? +vars.alt - boolean, if used, includes altitude in string +vars.metric - boolean, gives distance in km instead of NM. +]] +routines.getBRStringZone = function(vars) + local zone = trigger.misc.getZone( vars.zone ) + local ref = routines.utils.makeVec3(vars.ref, 0) -- turn it into Vec3 if it is not already. + local alt = vars.alt + local metric = vars.metric + if zone then + local vec = {x = zone.point.x - ref.x, y = zone.point.y - ref.y, z = zone.point.z - ref.z} + local dir = routines.utils.getDir(vec, ref) + local dist = routines.utils.get2DDist(zone.point, ref) + if alt then + alt = zone.y + end + return routines.tostringBR(dir, dist, alt, metric) + else + env.info( 'routines.getBRStringZone: error: zone is nil' ) + end +end + +--[[ +vars.units- table of unit names (NOT unitNameTable- maybe this should change). +vars.ref - vec3 ref point, maybe overload for vec2 as well? +vars.alt - boolean, if used, includes altitude in string +vars.metric - boolean, gives distance in km instead of NM. +]] +routines.getBRString = function(vars) + local units = vars.units + local ref = routines.utils.makeVec3(vars.ref, 0) -- turn it into Vec3 if it is not already. + local alt = vars.alt + local metric = vars.metric + local avgPos = routines.getAvgPos(units) + if avgPos then + local vec = {x = avgPos.x - ref.x, y = avgPos.y - ref.y, z = avgPos.z - ref.z} + local dir = routines.utils.getDir(vec, ref) + local dist = routines.utils.get2DDist(avgPos, ref) + if alt then + alt = avgPos.y + end + return routines.tostringBR(dir, dist, alt, metric) + end +end + + +-- Returns the Vec3 coordinates of the average position of the concentration of units most in the heading direction. +--[[ vars for routines.getLeadingPos: +vars.units - table of unit names +vars.heading - direction +vars.radius - number +vars.headingDegrees - boolean, switches heading to degrees +]] +routines.getLeadingPos = function(vars) + local units = vars.units + local heading = vars.heading + local radius = vars.radius + if vars.headingDegrees then + heading = routines.utils.toRadian(vars.headingDegrees) + end + + local unitPosTbl = {} + for i = 1, #units do + local unit = Unit.getByName(units[i]) + if unit and unit:isExist() then + unitPosTbl[#unitPosTbl + 1] = unit:getPosition().p + end + end + if #unitPosTbl > 0 then -- one more more units found. + -- first, find the unit most in the heading direction + local maxPos = -math.huge + + local maxPosInd -- maxPos - the furthest in direction defined by heading; maxPosInd = + for i = 1, #unitPosTbl do + local rotatedVec2 = routines.vec.rotateVec2(routines.utils.makeVec2(unitPosTbl[i]), heading) + if (not maxPos) or maxPos < rotatedVec2.x then + maxPos = rotatedVec2.x + maxPosInd = i + end + end + + --now, get all the units around this unit... + local avgPos + if radius then + local maxUnitPos = unitPosTbl[maxPosInd] + local avgx, avgy, avgz, totNum = 0, 0, 0, 0 + for i = 1, #unitPosTbl do + if routines.utils.get2DDist(maxUnitPos, unitPosTbl[i]) <= radius then + avgx = avgx + unitPosTbl[i].x + avgy = avgy + unitPosTbl[i].y + avgz = avgz + unitPosTbl[i].z + totNum = totNum + 1 + end + end + avgPos = { x = avgx/totNum, y = avgy/totNum, z = avgz/totNum} + else + avgPos = unitPosTbl[maxPosInd] + end + + return avgPos + end +end + + +--[[ vars for routines.getLeadingMGRSString: +vars.units - table of unit names +vars.heading - direction +vars.radius - number +vars.headingDegrees - boolean, switches heading to degrees +vars.acc - number, 0 to 5. +]] +routines.getLeadingMGRSString = function(vars) + local pos = routines.getLeadingPos(vars) + if pos then + local acc = vars.acc or 5 + return routines.tostringMGRS(coord.LLtoMGRS(coord.LOtoLL(pos)), acc) + end +end + +--[[ vars for routines.getLeadingLLString: +vars.units - table of unit names +vars.heading - direction, number +vars.radius - number +vars.headingDegrees - boolean, switches heading to degrees +vars.acc - number of digits after decimal point (can be negative) +vars.DMS - boolean, true if you want DMS. +]] +routines.getLeadingLLString = function(vars) + local pos = routines.getLeadingPos(vars) + if pos then + local acc = vars.acc or 3 + local DMS = vars.DMS + local lat, lon = coord.LOtoLL(pos) + return routines.tostringLL(lat, lon, acc, DMS) + end +end + + + +--[[ vars for routines.getLeadingBRString: +vars.units - table of unit names +vars.heading - direction, number +vars.radius - number +vars.headingDegrees - boolean, switches heading to degrees +vars.metric - boolean, if true, use km instead of NM. +vars.alt - boolean, if true, include altitude. +vars.ref - vec3/vec2 reference point. +]] +routines.getLeadingBRString = function(vars) + local pos = routines.getLeadingPos(vars) + if pos then + local ref = vars.ref + local alt = vars.alt + local metric = vars.metric + + local vec = {x = pos.x - ref.x, y = pos.y - ref.y, z = pos.z - ref.z} + local dir = routines.utils.getDir(vec, ref) + local dist = routines.utils.get2DDist(pos, ref) + if alt then + alt = pos.y + end + return routines.tostringBR(dir, dist, alt, metric) + end +end + +--[[ vars for routines.message.add + vars.text = 'Hello World' + vars.displayTime = 20 + vars.msgFor = {coa = {'red'}, countries = {'Ukraine', 'Georgia'}, unitTypes = {'A-10C'}} + +]] + +--[[ vars for routines.msgMGRS +vars.units - table of unit names (NOT unitNameTable- maybe this should change). +vars.acc - integer between 0 and 5, inclusive +vars.text - text in the message +vars.displayTime - self explanatory +vars.msgFor - scope +]] +routines.msgMGRS = function(vars) + local units = vars.units + local acc = vars.acc + local text = vars.text + local displayTime = vars.displayTime + local msgFor = vars.msgFor + + local s = routines.getMGRSString{units = units, acc = acc} + local newText + if string.find(text, '%%s') then -- look for %s + newText = string.format(text, s) -- insert the coordinates into the message + else -- else, just append to the end. + newText = text .. s + end + + routines.message.add{ + text = newText, + displayTime = displayTime, + msgFor = msgFor + } +end + +--[[ vars for routines.msgLL +vars.units - table of unit names (NOT unitNameTable- maybe this should change) (Yes). +vars.acc - integer, number of numbers after decimal place +vars.DMS - if true, output in degrees, minutes, seconds. Otherwise, output in degrees, minutes. +vars.text - text in the message +vars.displayTime - self explanatory +vars.msgFor - scope +]] +routines.msgLL = function(vars) + local units = vars.units -- technically, I don't really need to do this, but it helps readability. + local acc = vars.acc + local DMS = vars.DMS + local text = vars.text + local displayTime = vars.displayTime + local msgFor = vars.msgFor + + local s = routines.getLLString{units = units, acc = acc, DMS = DMS} + local newText + if string.find(text, '%%s') then -- look for %s + newText = string.format(text, s) -- insert the coordinates into the message + else -- else, just append to the end. + newText = text .. s + end + + routines.message.add{ + text = newText, + displayTime = displayTime, + msgFor = msgFor + } + +end + + +--[[ +vars.units- table of unit names (NOT unitNameTable- maybe this should change). +vars.ref - vec3 ref point, maybe overload for vec2 as well? +vars.alt - boolean, if used, includes altitude in string +vars.metric - boolean, gives distance in km instead of NM. +vars.text - text of the message +vars.displayTime +vars.msgFor - scope +]] +routines.msgBR = function(vars) + local units = vars.units -- technically, I don't really need to do this, but it helps readability. + local ref = vars.ref -- vec2/vec3 will be handled in routines.getBRString + local alt = vars.alt + local metric = vars.metric + local text = vars.text + local displayTime = vars.displayTime + local msgFor = vars.msgFor + + local s = routines.getBRString{units = units, ref = ref, alt = alt, metric = metric} + local newText + if string.find(text, '%%s') then -- look for %s + newText = string.format(text, s) -- insert the coordinates into the message + else -- else, just append to the end. + newText = text .. s + end + + routines.message.add{ + text = newText, + displayTime = displayTime, + msgFor = msgFor + } + +end + + +-------------------------------------------------------------------------------------------- +-- basically, just sub-types of routines.msgBR... saves folks the work of getting the ref point. +--[[ +vars.units- table of unit names (NOT unitNameTable- maybe this should change). +vars.ref - string red, blue +vars.alt - boolean, if used, includes altitude in string +vars.metric - boolean, gives distance in km instead of NM. +vars.text - text of the message +vars.displayTime +vars.msgFor - scope +]] +routines.msgBullseye = function(vars) + if string.lower(vars.ref) == 'red' then + vars.ref = routines.DBs.missionData.bullseye.red + routines.msgBR(vars) + elseif string.lower(vars.ref) == 'blue' then + vars.ref = routines.DBs.missionData.bullseye.blue + routines.msgBR(vars) + end +end + +--[[ +vars.units- table of unit names (NOT unitNameTable- maybe this should change). +vars.ref - unit name of reference point +vars.alt - boolean, if used, includes altitude in string +vars.metric - boolean, gives distance in km instead of NM. +vars.text - text of the message +vars.displayTime +vars.msgFor - scope +]] + +routines.msgBRA = function(vars) + if Unit.getByName(vars.ref) then + vars.ref = Unit.getByName(vars.ref):getPosition().p + if not vars.alt then + vars.alt = true + end + routines.msgBR(vars) + end +end +-------------------------------------------------------------------------------------------- + +--[[ vars for routines.msgLeadingMGRS: +vars.units - table of unit names +vars.heading - direction +vars.radius - number +vars.headingDegrees - boolean, switches heading to degrees (optional) +vars.acc - number, 0 to 5. +vars.text - text of the message +vars.displayTime +vars.msgFor - scope +]] +routines.msgLeadingMGRS = function(vars) + local units = vars.units -- technically, I don't really need to do this, but it helps readability. + local heading = vars.heading + local radius = vars.radius + local headingDegrees = vars.headingDegrees + local acc = vars.acc + local text = vars.text + local displayTime = vars.displayTime + local msgFor = vars.msgFor + + local s = routines.getLeadingMGRSString{units = units, heading = heading, radius = radius, headingDegrees = headingDegrees, acc = acc} + local newText + if string.find(text, '%%s') then -- look for %s + newText = string.format(text, s) -- insert the coordinates into the message + else -- else, just append to the end. + newText = text .. s + end + + routines.message.add{ + text = newText, + displayTime = displayTime, + msgFor = msgFor + } + + +end +--[[ vars for routines.msgLeadingLL: +vars.units - table of unit names +vars.heading - direction, number +vars.radius - number +vars.headingDegrees - boolean, switches heading to degrees (optional) +vars.acc - number of digits after decimal point (can be negative) +vars.DMS - boolean, true if you want DMS. (optional) +vars.text - text of the message +vars.displayTime +vars.msgFor - scope +]] +routines.msgLeadingLL = function(vars) + local units = vars.units -- technically, I don't really need to do this, but it helps readability. + local heading = vars.heading + local radius = vars.radius + local headingDegrees = vars.headingDegrees + local acc = vars.acc + local DMS = vars.DMS + local text = vars.text + local displayTime = vars.displayTime + local msgFor = vars.msgFor + + local s = routines.getLeadingLLString{units = units, heading = heading, radius = radius, headingDegrees = headingDegrees, acc = acc, DMS = DMS} + local newText + if string.find(text, '%%s') then -- look for %s + newText = string.format(text, s) -- insert the coordinates into the message + else -- else, just append to the end. + newText = text .. s + end + + routines.message.add{ + text = newText, + displayTime = displayTime, + msgFor = msgFor + } + +end + +--[[ +vars.units - table of unit names +vars.heading - direction, number +vars.radius - number +vars.headingDegrees - boolean, switches heading to degrees (optional) +vars.metric - boolean, if true, use km instead of NM. (optional) +vars.alt - boolean, if true, include altitude. (optional) +vars.ref - vec3/vec2 reference point. +vars.text - text of the message +vars.displayTime +vars.msgFor - scope +]] +routines.msgLeadingBR = function(vars) + local units = vars.units -- technically, I don't really need to do this, but it helps readability. + local heading = vars.heading + local radius = vars.radius + local headingDegrees = vars.headingDegrees + local metric = vars.metric + local alt = vars.alt + local ref = vars.ref -- vec2/vec3 will be handled in routines.getBRString + local text = vars.text + local displayTime = vars.displayTime + local msgFor = vars.msgFor + + local s = routines.getLeadingBRString{units = units, heading = heading, radius = radius, headingDegrees = headingDegrees, metric = metric, alt = alt, ref = ref} + local newText + if string.find(text, '%%s') then -- look for %s + newText = string.format(text, s) -- insert the coordinates into the message + else -- else, just append to the end. + newText = text .. s + end + + routines.message.add{ + text = newText, + displayTime = displayTime, + msgFor = msgFor + } +end + + +function spairs(t, order) + -- collect the keys + local keys = {} + for k in pairs(t) do keys[#keys+1] = k end + + -- if order function given, sort by it by passing the table and keys a, b, + -- otherwise just sort the keys + if order then + table.sort(keys, function(a,b) return order(t, a, b) end) + else + table.sort(keys) + end + + -- return the iterator function + local i = 0 + return function() + i = i + 1 + if keys[i] then + return keys[i], t[keys[i]] + end + end +end + + +function routines.IsPartOfGroupInZones( CargoGroup, LandingZones ) +--trace.f() + + local CurrentZoneID = nil + + if CargoGroup then + local CargoUnits = CargoGroup:getUnits() + for CargoUnitID, CargoUnit in pairs( CargoUnits ) do + if CargoUnit and CargoUnit:getLife() >= 1.0 then + CurrentZoneID = routines.IsUnitInZones( CargoUnit, LandingZones ) + if CurrentZoneID then + break + end + end + end + end + +--trace.r( "", "", { CurrentZoneID } ) + return CurrentZoneID +end + + + +function routines.IsUnitInZones( TransportUnit, LandingZones ) +--trace.f("", "routines.IsUnitInZones" ) + + local TransportZoneResult = nil + local TransportZonePos = nil + local TransportZone = nil + + -- fill-up some local variables to support further calculations to determine location of units within the zone. + if TransportUnit then + local TransportUnitPos = TransportUnit:getPosition().p + if type( LandingZones ) == "table" then + for LandingZoneID, LandingZoneName in pairs( LandingZones ) do + TransportZone = trigger.misc.getZone( LandingZoneName ) + if TransportZone then + TransportZonePos = {radius = TransportZone.radius, x = TransportZone.point.x, y = TransportZone.point.y, z = TransportZone.point.z} + if ((( TransportUnitPos.x - TransportZonePos.x)^2 + (TransportUnitPos.z - TransportZonePos.z)^2)^0.5 <= TransportZonePos.radius) then + TransportZoneResult = LandingZoneID + break + end + end + end + else + TransportZone = trigger.misc.getZone( LandingZones ) + TransportZonePos = {radius = TransportZone.radius, x = TransportZone.point.x, y = TransportZone.point.y, z = TransportZone.point.z} + if ((( TransportUnitPos.x - TransportZonePos.x)^2 + (TransportUnitPos.z - TransportZonePos.z)^2)^0.5 <= TransportZonePos.radius) then + TransportZoneResult = 1 + end + end + if TransportZoneResult then + --trace.i( "routines", "TransportZone:" .. TransportZoneResult ) + else + --trace.i( "routines", "TransportZone:nil logic" ) + end + return TransportZoneResult + else + --trace.i( "routines", "TransportZone:nil hard" ) + return nil + end +end + +function routines.IsUnitNearZonesRadius( TransportUnit, LandingZones, ZoneRadius ) +--trace.f("", "routines.IsUnitInZones" ) + + local TransportZoneResult = nil + local TransportZonePos = nil + local TransportZone = nil + + -- fill-up some local variables to support further calculations to determine location of units within the zone. + if TransportUnit then + local TransportUnitPos = TransportUnit:getPosition().p + if type( LandingZones ) == "table" then + for LandingZoneID, LandingZoneName in pairs( LandingZones ) do + TransportZone = trigger.misc.getZone( LandingZoneName ) + if TransportZone then + TransportZonePos = {radius = TransportZone.radius, x = TransportZone.point.x, y = TransportZone.point.y, z = TransportZone.point.z} + if ((( TransportUnitPos.x - TransportZonePos.x)^2 + (TransportUnitPos.z - TransportZonePos.z)^2)^0.5 <= ZoneRadius ) then + TransportZoneResult = LandingZoneID + break + end + end + end + else + TransportZone = trigger.misc.getZone( LandingZones ) + TransportZonePos = {radius = TransportZone.radius, x = TransportZone.point.x, y = TransportZone.point.y, z = TransportZone.point.z} + if ((( TransportUnitPos.x - TransportZonePos.x)^2 + (TransportUnitPos.z - TransportZonePos.z)^2)^0.5 <= ZoneRadius ) then + TransportZoneResult = 1 + end + end + if TransportZoneResult then + --trace.i( "routines", "TransportZone:" .. TransportZoneResult ) + else + --trace.i( "routines", "TransportZone:nil logic" ) + end + return TransportZoneResult + else + --trace.i( "routines", "TransportZone:nil hard" ) + return nil + end +end + + +function routines.IsStaticInZones( TransportStatic, LandingZones ) +--trace.f() + + local TransportZoneResult = nil + local TransportZonePos = nil + local TransportZone = nil + + -- fill-up some local variables to support further calculations to determine location of units within the zone. + local TransportStaticPos = TransportStatic:getPosition().p + if type( LandingZones ) == "table" then + for LandingZoneID, LandingZoneName in pairs( LandingZones ) do + TransportZone = trigger.misc.getZone( LandingZoneName ) + if TransportZone then + TransportZonePos = {radius = TransportZone.radius, x = TransportZone.point.x, y = TransportZone.point.y, z = TransportZone.point.z} + if ((( TransportStaticPos.x - TransportZonePos.x)^2 + (TransportStaticPos.z - TransportZonePos.z)^2)^0.5 <= TransportZonePos.radius) then + TransportZoneResult = LandingZoneID + break + end + end + end + else + TransportZone = trigger.misc.getZone( LandingZones ) + TransportZonePos = {radius = TransportZone.radius, x = TransportZone.point.x, y = TransportZone.point.y, z = TransportZone.point.z} + if ((( TransportStaticPos.x - TransportZonePos.x)^2 + (TransportStaticPos.z - TransportZonePos.z)^2)^0.5 <= TransportZonePos.radius) then + TransportZoneResult = 1 + end + end + +--trace.r( "", "", { TransportZoneResult } ) + return TransportZoneResult +end + + +function routines.IsUnitInRadius( CargoUnit, ReferencePosition, Radius ) +--trace.f() + + local Valid = true + + -- fill-up some local variables to support further calculations to determine location of units within the zone. + local CargoPos = CargoUnit:getPosition().p + local ReferenceP = ReferencePosition.p + + if (((CargoPos.x - ReferenceP.x)^2 + (CargoPos.z - ReferenceP.z)^2)^0.5 <= Radius) then + else + Valid = false + end + + return Valid +end + +function routines.IsPartOfGroupInRadius( CargoGroup, ReferencePosition, Radius ) +--trace.f() + + local Valid = true + + Valid = routines.ValidateGroup( CargoGroup, "CargoGroup", Valid ) + + -- fill-up some local variables to support further calculations to determine location of units within the zone + local CargoUnits = CargoGroup:getUnits() + for CargoUnitId, CargoUnit in pairs( CargoUnits ) do + local CargoUnitPos = CargoUnit:getPosition().p +-- env.info( 'routines.IsPartOfGroupInRadius: CargoUnitPos.x = ' .. CargoUnitPos.x .. ' CargoUnitPos.z = ' .. CargoUnitPos.z ) + local ReferenceP = ReferencePosition.p +-- env.info( 'routines.IsPartOfGroupInRadius: ReferenceGroupPos.x = ' .. ReferenceGroupPos.x .. ' ReferenceGroupPos.z = ' .. ReferenceGroupPos.z ) + + if ((( CargoUnitPos.x - ReferenceP.x)^2 + (CargoUnitPos.z - ReferenceP.z)^2)^0.5 <= Radius) then + else + Valid = false + break + end + end + + return Valid +end + + +function routines.ValidateString( Variable, VariableName, Valid ) +--trace.f() + + if type( Variable ) == "string" then + if Variable == "" then + error( "routines.ValidateString: error: " .. VariableName .. " must be filled out!" ) + Valid = false + end + else + error( "routines.ValidateString: error: " .. VariableName .. " is not a string." ) + Valid = false + end + +--trace.r( "", "", { Valid } ) + return Valid +end + +function routines.ValidateNumber( Variable, VariableName, Valid ) +--trace.f() + + if type( Variable ) == "number" then + else + error( "routines.ValidateNumber: error: " .. VariableName .. " is not a number." ) + Valid = false + end + +--trace.r( "", "", { Valid } ) + return Valid + +end + +function routines.ValidateGroup( Variable, VariableName, Valid ) +--trace.f() + + if Variable == nil then + error( "routines.ValidateGroup: error: " .. VariableName .. " is a nil value!" ) + Valid = false + end + +--trace.r( "", "", { Valid } ) + return Valid +end + +function routines.ValidateZone( LandingZones, VariableName, Valid ) +--trace.f() + + if LandingZones == nil then + error( "routines.ValidateGroup: error: " .. VariableName .. " is a nil value!" ) + Valid = false + end + + if type( LandingZones ) == "table" then + for LandingZoneID, LandingZoneName in pairs( LandingZones ) do + if trigger.misc.getZone( LandingZoneName ) == nil then + error( "routines.ValidateGroup: error: Zone " .. LandingZoneName .. " does not exist!" ) + Valid = false + break + end + end + else + if trigger.misc.getZone( LandingZones ) == nil then + error( "routines.ValidateGroup: error: Zone " .. LandingZones .. " does not exist!" ) + Valid = false + end + end + +--trace.r( "", "", { Valid } ) + return Valid +end + +function routines.ValidateEnumeration( Variable, VariableName, Enum, Valid ) +--trace.f() + + local ValidVariable = false + + for EnumId, EnumData in pairs( Enum ) do + if Variable == EnumData then + ValidVariable = true + break + end + end + + if ValidVariable then + else + error( 'TransportValidateEnum: " .. VariableName .. " is not a valid type.' .. Variable ) + Valid = false + end + +--trace.r( "", "", { Valid } ) + return Valid +end + +function routines.getGroupRoute(groupIdent, task) -- same as getGroupPoints but returns speed and formation type along with vec2 of point} + -- refactor to search by groupId and allow groupId and groupName as inputs + local gpId = groupIdent + if type(groupIdent) == 'string' and not tonumber(groupIdent) then + gpId = _DATABASE.Templates.Groups[groupIdent].groupId + end + + for coa_name, coa_data in pairs(env.mission.coalition) do + if (coa_name == 'red' or coa_name == 'blue') and type(coa_data) == 'table' then + if coa_data.country then --there is a country table + for cntry_id, cntry_data in pairs(coa_data.country) do + for obj_type_name, obj_type_data in pairs(cntry_data) do + if obj_type_name == "helicopter" or obj_type_name == "ship" or obj_type_name == "plane" or obj_type_name == "vehicle" then -- only these types have points + if ((type(obj_type_data) == 'table') and obj_type_data.group and (type(obj_type_data.group) == 'table') and (#obj_type_data.group > 0)) then --there's a group! + for group_num, group_data in pairs(obj_type_data.group) do + if group_data and group_data.groupId == gpId then -- this is the group we are looking for + if group_data.route and group_data.route.points and #group_data.route.points > 0 then + local points = {} + + for point_num, point in pairs(group_data.route.points) do + local routeData = {} + if not point.point then + routeData.x = point.x + routeData.y = point.y + else + routeData.point = point.point --it's possible that the ME could move to the point = Vec2 notation. + end + routeData.form = point.action + routeData.speed = point.speed + routeData.alt = point.alt + routeData.alt_type = point.alt_type + routeData.airdromeId = point.airdromeId + routeData.helipadId = point.helipadId + routeData.type = point.type + routeData.action = point.action + if task then + routeData.task = point.task + end + points[point_num] = routeData + end + + return points + end + return + end --if group_data and group_data.name and group_data.name == 'groupname' + end --for group_num, group_data in pairs(obj_type_data.group) do + end --if ((type(obj_type_data) == 'table') and obj_type_data.group and (type(obj_type_data.group) == 'table') and (#obj_type_data.group > 0)) then + end --if obj_type_name == "helicopter" or obj_type_name == "ship" or obj_type_name == "plane" or obj_type_name == "vehicle" or obj_type_name == "static" then + end --for obj_type_name, obj_type_data in pairs(cntry_data) do + end --for cntry_id, cntry_data in pairs(coa_data.country) do + end --if coa_data.country then --there is a country table + end --if coa_name == 'red' or coa_name == 'blue' and type(coa_data) == 'table' then + end --for coa_name, coa_data in pairs(mission.coalition) do +end + +routines.ground.patrolRoute = function(vars) + + + local tempRoute = {} + local useRoute = {} + local gpData = vars.gpData + if type(gpData) == 'string' then + gpData = Group.getByName(gpData) + end + + local useGroupRoute + if not vars.useGroupRoute then + useGroupRoute = vars.gpData + else + useGroupRoute = vars.useGroupRoute + end + local routeProvided = false + if not vars.route then + if useGroupRoute then + tempRoute = routines.getGroupRoute(useGroupRoute) + end + else + useRoute = vars.route + local posStart = routines.getLeadPos(gpData) + useRoute[1] = routines.ground.buildWP(posStart, useRoute[1].action, useRoute[1].speed) + routeProvided = true + end + + + local overRideSpeed = vars.speed or 'default' + local pType = vars.pType + local offRoadForm = vars.offRoadForm or 'default' + local onRoadForm = vars.onRoadForm or 'default' + + if routeProvided == false and #tempRoute > 0 then + local posStart = routines.getLeadPos(gpData) + + + useRoute[#useRoute + 1] = routines.ground.buildWP(posStart, offRoadForm, overRideSpeed) + for i = 1, #tempRoute do + local tempForm = tempRoute[i].action + local tempSpeed = tempRoute[i].speed + + if offRoadForm == 'default' then + tempForm = tempRoute[i].action + end + if onRoadForm == 'default' then + onRoadForm = 'On Road' + end + if (string.lower(tempRoute[i].action) == 'on road' or string.lower(tempRoute[i].action) == 'onroad' or string.lower(tempRoute[i].action) == 'on_road') then + tempForm = onRoadForm + else + tempForm = offRoadForm + end + + if type(overRideSpeed) == 'number' then + tempSpeed = overRideSpeed + end + + + useRoute[#useRoute + 1] = routines.ground.buildWP(tempRoute[i], tempForm, tempSpeed) + end + + if pType and string.lower(pType) == 'doubleback' then + local curRoute = routines.utils.deepCopy(useRoute) + for i = #curRoute, 2, -1 do + useRoute[#useRoute + 1] = routines.ground.buildWP(curRoute[i], curRoute[i].action, curRoute[i].speed) + end + end + + useRoute[1].action = useRoute[#useRoute].action -- make it so the first WP matches the last WP + end + + local cTask3 = {} + local newPatrol = {} + newPatrol.route = useRoute + newPatrol.gpData = gpData:getName() + cTask3[#cTask3 + 1] = 'routines.ground.patrolRoute(' + cTask3[#cTask3 + 1] = routines.utils.oneLineSerialize(newPatrol) + cTask3[#cTask3 + 1] = ')' + cTask3 = table.concat(cTask3) + local tempTask = { + id = 'WrappedAction', + params = { + action = { + id = 'Script', + params = { + command = cTask3, + + }, + }, + }, + } + + + useRoute[#useRoute].task = tempTask + routines.goRoute(gpData, useRoute) + + return +end + +routines.ground.patrol = function(gpData, pType, form, speed) + local vars = {} + + if type(gpData) == 'table' and gpData:getName() then + gpData = gpData:getName() + end + + vars.useGroupRoute = gpData + vars.gpData = gpData + vars.pType = pType + vars.offRoadForm = form + vars.speed = speed + + routines.ground.patrolRoute(vars) + + return +end + +function routines.GetUnitHeight( CheckUnit ) +--trace.f( "routines" ) + + local UnitPoint = CheckUnit:getPoint() + local UnitPosition = { x = UnitPoint.x, y = UnitPoint.z } + local UnitHeight = UnitPoint.y + + local LandHeight = land.getHeight( UnitPosition ) + + --env.info(( 'CarrierHeight: LandHeight = ' .. LandHeight .. ' CarrierHeight = ' .. CarrierHeight )) + + --trace.f( "routines", "Unit Height = " .. UnitHeight - LandHeight ) + + return UnitHeight - LandHeight + +end + + + +Su34Status = { status = {} } +boardMsgRed = { statusMsg = "" } +boardMsgAll = { timeMsg = "" } +SpawnSettings = {} +Su34MenuPath = {} +Su34Menus = 0 + + +function Su34AttackCarlVinson(groupName) +--trace.menu("", "Su34AttackCarlVinson") + local groupSu34 = Group.getByName( groupName ) + local controllerSu34 = groupSu34.getController(groupSu34) + local groupCarlVinson = Group.getByName("US Carl Vinson #001") + controllerSu34.setOption( controllerSu34, AI.Option.Air.id.ROE, AI.Option.Air.val.ROE.OPEN_FIRE ) + controllerSu34.setOption( controllerSu34, AI.Option.Air.id.REACTION_ON_THREAT, AI.Option.Air.val.REACTION_ON_THREAT.EVADE_FIRE ) + if groupCarlVinson ~= nil then + controllerSu34.pushTask(controllerSu34,{id = 'AttackGroup', params = { groupId = groupCarlVinson:getID(), expend = AI.Task.WeaponExpend.ALL, attackQtyLimit = true}}) + end + Su34Status.status[groupName] = 1 + MessageToRed( string.format('%s: ',groupName) .. 'Attacking carrier Carl Vinson. ', 10, 'RedStatus' .. groupName ) +end + +function Su34AttackWest(groupName) +--trace.f("","Su34AttackWest") + local groupSu34 = Group.getByName( groupName ) + local controllerSu34 = groupSu34.getController(groupSu34) + local groupShipWest1 = Group.getByName("US Ship West #001") + local groupShipWest2 = Group.getByName("US Ship West #002") + controllerSu34.setOption( controllerSu34, AI.Option.Air.id.ROE, AI.Option.Air.val.ROE.OPEN_FIRE ) + controllerSu34.setOption( controllerSu34, AI.Option.Air.id.REACTION_ON_THREAT, AI.Option.Air.val.REACTION_ON_THREAT.EVADE_FIRE ) + if groupShipWest1 ~= nil then + controllerSu34.pushTask(controllerSu34,{id = 'AttackGroup', params = { groupId = groupShipWest1:getID(), expend = AI.Task.WeaponExpend.ALL, attackQtyLimit = true}}) + end + if groupShipWest2 ~= nil then + controllerSu34.pushTask(controllerSu34,{id = 'AttackGroup', params = { groupId = groupShipWest2:getID(), expend = AI.Task.WeaponExpend.ALL, attackQtyLimit = true}}) + end + Su34Status.status[groupName] = 2 + MessageToRed( string.format('%s: ',groupName) .. 'Attacking invading ships in the west. ', 10, 'RedStatus' .. groupName ) +end + +function Su34AttackNorth(groupName) +--trace.menu("","Su34AttackNorth") + local groupSu34 = Group.getByName( groupName ) + local controllerSu34 = groupSu34.getController(groupSu34) + local groupShipNorth1 = Group.getByName("US Ship North #001") + local groupShipNorth2 = Group.getByName("US Ship North #002") + local groupShipNorth3 = Group.getByName("US Ship North #003") + controllerSu34.setOption( controllerSu34, AI.Option.Air.id.ROE, AI.Option.Air.val.ROE.OPEN_FIRE ) + controllerSu34.setOption( controllerSu34, AI.Option.Air.id.REACTION_ON_THREAT, AI.Option.Air.val.REACTION_ON_THREAT.EVADE_FIRE ) + if groupShipNorth1 ~= nil then + controllerSu34.pushTask(controllerSu34,{id = 'AttackGroup', params = { groupId = groupShipNorth1:getID(), expend = AI.Task.WeaponExpend.ALL, attackQtyLimit = false}}) + end + if groupShipNorth2 ~= nil then + controllerSu34.pushTask(controllerSu34,{id = 'AttackGroup', params = { groupId = groupShipNorth2:getID(), expend = AI.Task.WeaponExpend.ALL, attackQtyLimit = false}}) + end + if groupShipNorth3 ~= nil then + controllerSu34.pushTask(controllerSu34,{id = 'AttackGroup', params = { groupId = groupShipNorth3:getID(), expend = AI.Task.WeaponExpend.ALL, attackQtyLimit = false}}) + end + Su34Status.status[groupName] = 3 + MessageToRed( string.format('%s: ',groupName) .. 'Attacking invading ships in the north. ', 10, 'RedStatus' .. groupName ) +end + +function Su34Orbit(groupName) +--trace.menu("","Su34Orbit") + local groupSu34 = Group.getByName( groupName ) + local controllerSu34 = groupSu34:getController() + controllerSu34.setOption( controllerSu34, AI.Option.Air.id.ROE, AI.Option.Air.val.ROE.WEAPON_HOLD ) + controllerSu34.setOption( controllerSu34, AI.Option.Air.id.REACTION_ON_THREAT, AI.Option.Air.val.REACTION_ON_THREAT.EVADE_FIRE ) + controllerSu34:pushTask( {id = 'ControlledTask', params = { task = { id = 'Orbit', params = { pattern = AI.Task.OrbitPattern.RACE_TRACK } }, stopCondition = { duration = 600 } } } ) + Su34Status.status[groupName] = 4 + MessageToRed( string.format('%s: ',groupName) .. 'In orbit and awaiting further instructions. ', 10, 'RedStatus' .. groupName ) +end + +function Su34TakeOff(groupName) +--trace.menu("","Su34TakeOff") + local groupSu34 = Group.getByName( groupName ) + local controllerSu34 = groupSu34:getController() + controllerSu34.setOption( controllerSu34, AI.Option.Air.id.ROE, AI.Option.Air.val.ROE.WEAPON_HOLD ) + controllerSu34.setOption( controllerSu34, AI.Option.Air.id.REACTION_ON_THREAT, AI.Option.Air.val.REACTION_ON_THREAT.BYPASS_AND_ESCAPE ) + Su34Status.status[groupName] = 8 + MessageToRed( string.format('%s: ',groupName) .. 'Take-Off. ', 10, 'RedStatus' .. groupName ) +end + +function Su34Hold(groupName) +--trace.menu("","Su34Hold") + local groupSu34 = Group.getByName( groupName ) + local controllerSu34 = groupSu34:getController() + controllerSu34.setOption( controllerSu34, AI.Option.Air.id.ROE, AI.Option.Air.val.ROE.WEAPON_HOLD ) + controllerSu34.setOption( controllerSu34, AI.Option.Air.id.REACTION_ON_THREAT, AI.Option.Air.val.REACTION_ON_THREAT.BYPASS_AND_ESCAPE ) + Su34Status.status[groupName] = 5 + MessageToRed( string.format('%s: ',groupName) .. 'Holding Weapons. ', 10, 'RedStatus' .. groupName ) +end + +function Su34RTB(groupName) +--trace.menu("","Su34RTB") + Su34Status.status[groupName] = 6 + MessageToRed( string.format('%s: ',groupName) .. 'Return to Krasnodar. ', 10, 'RedStatus' .. groupName ) +end + +function Su34Destroyed(groupName) +--trace.menu("","Su34Destroyed") + Su34Status.status[groupName] = 7 + MessageToRed( string.format('%s: ',groupName) .. 'Destroyed. ', 30, 'RedStatus' .. groupName ) +end + +function GroupAlive( groupName ) +--trace.menu("","GroupAlive") + local groupTest = Group.getByName( groupName ) + + local groupExists = false + + if groupTest then + groupExists = groupTest:isExist() + end + + --trace.r( "", "", { groupExists } ) + return groupExists +end + +function Su34IsDead() +--trace.f() + +end + +function Su34OverviewStatus() +--trace.menu("","Su34OverviewStatus") + local msg = "" + local currentStatus = 0 + local Exists = false + + for groupName, currentStatus in pairs(Su34Status.status) do + + env.info(('Su34 Overview Status: GroupName = ' .. groupName )) + Alive = GroupAlive( groupName ) + + if Alive then + if currentStatus == 1 then + msg = msg .. string.format("%s: ",groupName) + msg = msg .. "Attacking carrier Carl Vinson. " + elseif currentStatus == 2 then + msg = msg .. string.format("%s: ",groupName) + msg = msg .. "Attacking supporting ships in the west. " + elseif currentStatus == 3 then + msg = msg .. string.format("%s: ",groupName) + msg = msg .. "Attacking invading ships in the north. " + elseif currentStatus == 4 then + msg = msg .. string.format("%s: ",groupName) + msg = msg .. "In orbit and awaiting further instructions. " + elseif currentStatus == 5 then + msg = msg .. string.format("%s: ",groupName) + msg = msg .. "Holding Weapons. " + elseif currentStatus == 6 then + msg = msg .. string.format("%s: ",groupName) + msg = msg .. "Return to Krasnodar. " + elseif currentStatus == 7 then + msg = msg .. string.format("%s: ",groupName) + msg = msg .. "Destroyed. " + elseif currentStatus == 8 then + msg = msg .. string.format("%s: ",groupName) + msg = msg .. "Take-Off. " + end + else + if currentStatus == 7 then + msg = msg .. string.format("%s: ",groupName) + msg = msg .. "Destroyed. " + else + Su34Destroyed(groupName) + end + end + end + + boardMsgRed.statusMsg = msg +end + + +function UpdateBoardMsg() +--trace.f() + Su34OverviewStatus() + MessageToRed( boardMsgRed.statusMsg, 15, 'RedStatus' ) +end + +function MusicReset( flg ) +--trace.f() + trigger.action.setUserFlag(95,flg) +end + +function PlaneActivate(groupNameFormat, flg) +--trace.f() + local groupName = groupNameFormat .. string.format("#%03d", trigger.misc.getUserFlag(flg)) + --trigger.action.outText(groupName,10) + trigger.action.activateGroup(Group.getByName(groupName)) +end + +function Su34Menu(groupName) +--trace.f() + + --env.info(( 'Su34Menu(' .. groupName .. ')' )) + local groupSu34 = Group.getByName( groupName ) + + if Su34Status.status[groupName] == 1 or + Su34Status.status[groupName] == 2 or + Su34Status.status[groupName] == 3 or + Su34Status.status[groupName] == 4 or + Su34Status.status[groupName] == 5 then + if Su34MenuPath[groupName] == nil then + if planeMenuPath == nil then + planeMenuPath = missionCommands.addSubMenuForCoalition( + coalition.side.RED, + "SU-34 anti-ship flights", + nil + ) + end + Su34MenuPath[groupName] = missionCommands.addSubMenuForCoalition( + coalition.side.RED, + "Flight " .. groupName, + planeMenuPath + ) + + missionCommands.addCommandForCoalition( + coalition.side.RED, + "Attack carrier Carl Vinson", + Su34MenuPath[groupName], + Su34AttackCarlVinson, + groupName + ) + + missionCommands.addCommandForCoalition( + coalition.side.RED, + "Attack ships in the west", + Su34MenuPath[groupName], + Su34AttackWest, + groupName + ) + + missionCommands.addCommandForCoalition( + coalition.side.RED, + "Attack ships in the north", + Su34MenuPath[groupName], + Su34AttackNorth, + groupName + ) + + missionCommands.addCommandForCoalition( + coalition.side.RED, + "Hold position and await instructions", + Su34MenuPath[groupName], + Su34Orbit, + groupName + ) + + missionCommands.addCommandForCoalition( + coalition.side.RED, + "Report status", + Su34MenuPath[groupName], + Su34OverviewStatus + ) + end + else + if Su34MenuPath[groupName] then + missionCommands.removeItemForCoalition(coalition.side.RED, Su34MenuPath[groupName]) + end + end +end + +--- Obsolete function, but kept to rework in framework. + +function ChooseInfantry ( TeleportPrefixTable, TeleportMax ) +--trace.f("Spawn") + --env.info(( 'ChooseInfantry: ' )) + + TeleportPrefixTableCount = #TeleportPrefixTable + TeleportPrefixTableIndex = math.random( 1, TeleportPrefixTableCount ) + + --env.info(( 'ChooseInfantry: TeleportPrefixTableIndex = ' .. TeleportPrefixTableIndex .. ' TeleportPrefixTableCount = ' .. TeleportPrefixTableCount .. ' TeleportMax = ' .. TeleportMax )) + + local TeleportFound = false + local TeleportLoop = true + local Index = TeleportPrefixTableIndex + local TeleportPrefix = '' + + while TeleportLoop do + TeleportPrefix = TeleportPrefixTable[Index] + if SpawnSettings[TeleportPrefix] then + if SpawnSettings[TeleportPrefix]['SpawnCount'] - 1 < TeleportMax then + SpawnSettings[TeleportPrefix]['SpawnCount'] = SpawnSettings[TeleportPrefix]['SpawnCount'] + 1 + TeleportFound = true + else + TeleportFound = false + end + else + SpawnSettings[TeleportPrefix] = {} + SpawnSettings[TeleportPrefix]['SpawnCount'] = 0 + TeleportFound = true + end + if TeleportFound then + TeleportLoop = false + else + if Index < TeleportPrefixTableCount then + Index = Index + 1 + else + TeleportLoop = false + end + end + --env.info(( 'ChooseInfantry: Loop 1 - TeleportPrefix = ' .. TeleportPrefix .. ' Index = ' .. Index )) + end + + if TeleportFound == false then + TeleportLoop = true + Index = 1 + while TeleportLoop do + TeleportPrefix = TeleportPrefixTable[Index] + if SpawnSettings[TeleportPrefix] then + if SpawnSettings[TeleportPrefix]['SpawnCount'] - 1 < TeleportMax then + SpawnSettings[TeleportPrefix]['SpawnCount'] = SpawnSettings[TeleportPrefix]['SpawnCount'] + 1 + TeleportFound = true + else + TeleportFound = false + end + else + SpawnSettings[TeleportPrefix] = {} + SpawnSettings[TeleportPrefix]['SpawnCount'] = 0 + TeleportFound = true + end + if TeleportFound then + TeleportLoop = false + else + if Index < TeleportPrefixTableIndex then + Index = Index + 1 + else + TeleportLoop = false + end + end + --env.info(( 'ChooseInfantry: Loop 2 - TeleportPrefix = ' .. TeleportPrefix .. ' Index = ' .. Index )) + end + end + + local TeleportGroupName = '' + if TeleportFound == true then + TeleportGroupName = TeleportPrefix .. string.format("#%03d", SpawnSettings[TeleportPrefix]['SpawnCount'] ) + else + TeleportGroupName = '' + end + + --env.info(('ChooseInfantry: TeleportGroupName = ' .. TeleportGroupName )) + --env.info(('ChooseInfantry: return')) + + return TeleportGroupName +end + +SpawnedInfantry = 0 + +function LandCarrier ( CarrierGroup, LandingZonePrefix ) +--trace.f() + --env.info(( 'LandCarrier: ' )) + --env.info(( 'LandCarrier: CarrierGroup = ' .. CarrierGroup:getName() )) + --env.info(( 'LandCarrier: LandingZone = ' .. LandingZonePrefix )) + + local controllerGroup = CarrierGroup:getController() + + local LandingZone = trigger.misc.getZone(LandingZonePrefix) + local LandingZonePos = {} + LandingZonePos.x = LandingZone.point.x + math.random(LandingZone.radius * -1, LandingZone.radius) + LandingZonePos.y = LandingZone.point.z + math.random(LandingZone.radius * -1, LandingZone.radius) + + controllerGroup:pushTask( { id = 'Land', params = { point = LandingZonePos, durationFlag = true, duration = 10 } } ) + + --env.info(( 'LandCarrier: end' )) +end + +EscortCount = 0 +function EscortCarrier ( CarrierGroup, EscortPrefix, EscortLastWayPoint, EscortEngagementDistanceMax, EscortTargetTypes ) +--trace.f() + --env.info(( 'EscortCarrier: ' )) + --env.info(( 'EscortCarrier: CarrierGroup = ' .. CarrierGroup:getName() )) + --env.info(( 'EscortCarrier: EscortPrefix = ' .. EscortPrefix )) + + local CarrierName = CarrierGroup:getName() + + local EscortMission = {} + local CarrierMission = {} + + local EscortMission = SpawnMissionGroup( EscortPrefix ) + local CarrierMission = SpawnMissionGroup( CarrierGroup:getName() ) + + if EscortMission ~= nil and CarrierMission ~= nil then + + EscortCount = EscortCount + 1 + EscortMissionName = string.format( EscortPrefix .. '#Escort %s', CarrierName ) + EscortMission.name = EscortMissionName + EscortMission.groupId = nil + EscortMission.lateActivation = false + EscortMission.taskSelected = false + + local EscortUnits = #EscortMission.units + for u = 1, EscortUnits do + EscortMission.units[u].name = string.format( EscortPrefix .. '#Escort %s %02d', CarrierName, u ) + EscortMission.units[u].unitId = nil + end + + + EscortMission.route.points[1].task = { id = "ComboTask", + params = + { + tasks = + { + [1] = + { + enabled = true, + auto = false, + id = "Escort", + number = 1, + params = + { + lastWptIndexFlagChangedManually = false, + groupId = CarrierGroup:getID(), + lastWptIndex = nil, + lastWptIndexFlag = false, + engagementDistMax = EscortEngagementDistanceMax, + targetTypes = EscortTargetTypes, + pos = + { + y = 20, + x = 20, + z = 0, + } -- end of ["pos"] + } -- end of ["params"] + } -- end of [1] + } -- end of ["tasks"] + } -- end of ["params"] + } -- end of ["task"] + + SpawnGroupAdd( EscortPrefix, EscortMission ) + + end +end + +function SendMessageToCarrier( CarrierGroup, CarrierMessage ) +--trace.f() + + if CarrierGroup ~= nil then + MessageToGroup( CarrierGroup, CarrierMessage, 30, 'Carrier/' .. CarrierGroup:getName() ) + end + +end + +function MessageToGroup( MsgGroup, MsgText, MsgTime, MsgName ) +--trace.f() + + if type(MsgGroup) == 'string' then + --env.info( 'MessageToGroup: Converted MsgGroup string "' .. MsgGroup .. '" into a Group structure.' ) + MsgGroup = Group.getByName( MsgGroup ) + end + + if MsgGroup ~= nil then + local MsgTable = {} + MsgTable.text = MsgText + MsgTable.displayTime = MsgTime + MsgTable.msgFor = { units = { MsgGroup:getUnits()[1]:getName() } } + MsgTable.name = MsgName + --routines.message.add( MsgTable ) + --env.info(('MessageToGroup: Message sent to ' .. MsgGroup:getUnits()[1]:getName() .. ' -> ' .. MsgText )) + end +end + +function MessageToUnit( UnitName, MsgText, MsgTime, MsgName ) +--trace.f() + + if UnitName ~= nil then + local MsgTable = {} + MsgTable.text = MsgText + MsgTable.displayTime = MsgTime + MsgTable.msgFor = { units = { UnitName } } + MsgTable.name = MsgName + --routines.message.add( MsgTable ) + end +end + +function MessageToAll( MsgText, MsgTime, MsgName ) +--trace.f() + + MESSAGE:New( MsgText, "Message", MsgTime, MsgName ):ToCoalition( coalition.side.RED ):ToCoalition( coalition.side.BLUE ) +end + +function MessageToRed( MsgText, MsgTime, MsgName ) +--trace.f() + + MESSAGE:New( MsgText, "To Red Coalition", MsgTime, MsgName ):ToCoalition( coalition.side.RED ) +end + +function MessageToBlue( MsgText, MsgTime, MsgName ) +--trace.f() + + MESSAGE:New( MsgText, "To Blue Coalition", MsgTime, MsgName ):ToCoalition( coalition.side.RED ) +end + +function getCarrierHeight( CarrierGroup ) +--trace.f() + + if CarrierGroup ~= nil then + if table.getn(CarrierGroup:getUnits()) == 1 then + local CarrierUnit = CarrierGroup:getUnits()[1] + local CurrentPoint = CarrierUnit:getPoint() + + local CurrentPosition = { x = CurrentPoint.x, y = CurrentPoint.z } + local CarrierHeight = CurrentPoint.y + + local LandHeight = land.getHeight( CurrentPosition ) + + --env.info(( 'CarrierHeight: LandHeight = ' .. LandHeight .. ' CarrierHeight = ' .. CarrierHeight )) + + return CarrierHeight - LandHeight + else + return 999999 + end + else + return 999999 + end + +end + +function GetUnitHeight( CheckUnit ) +--trace.f() + + local UnitPoint = CheckUnit:getPoint() + local UnitPosition = { x = CurrentPoint.x, y = CurrentPoint.z } + local UnitHeight = CurrentPoint.y + + local LandHeight = land.getHeight( CurrentPosition ) + + --env.info(( 'CarrierHeight: LandHeight = ' .. LandHeight .. ' CarrierHeight = ' .. CarrierHeight )) + + return UnitHeight - LandHeight + +end + + +_MusicTable = {} +_MusicTable.Files = {} +_MusicTable.Queue = {} +_MusicTable.FileCnt = 0 + + +function MusicRegister( SndRef, SndFile, SndTime ) +--trace.f() + + env.info(( 'MusicRegister: SndRef = ' .. SndRef )) + env.info(( 'MusicRegister: SndFile = ' .. SndFile )) + env.info(( 'MusicRegister: SndTime = ' .. SndTime )) + + + _MusicTable.FileCnt = _MusicTable.FileCnt + 1 + + _MusicTable.Files[_MusicTable.FileCnt] = {} + _MusicTable.Files[_MusicTable.FileCnt].Ref = SndRef + _MusicTable.Files[_MusicTable.FileCnt].File = SndFile + _MusicTable.Files[_MusicTable.FileCnt].Time = SndTime + + if not _MusicTable.Function then + _MusicTable.Function = routines.scheduleFunction( MusicScheduler, { }, timer.getTime() + 10, 10) + end + +end + +function MusicToPlayer( SndRef, PlayerName, SndContinue ) +--trace.f() + + --env.info(( 'MusicToPlayer: SndRef = ' .. SndRef )) + + local PlayerUnits = AlivePlayerUnits() + for PlayerUnitIdx, PlayerUnit in pairs(PlayerUnits) do + local PlayerUnitName = PlayerUnit:getPlayerName() + --env.info(( 'MusicToPlayer: PlayerUnitName = ' .. PlayerUnitName )) + if PlayerName == PlayerUnitName then + PlayerGroup = PlayerUnit:getGroup() + if PlayerGroup then + --env.info(( 'MusicToPlayer: PlayerGroup = ' .. PlayerGroup:getName() )) + MusicToGroup( SndRef, PlayerGroup, SndContinue ) + end + break + end + end + + --env.info(( 'MusicToPlayer: end' )) + +end + +function MusicToGroup( SndRef, SndGroup, SndContinue ) +--trace.f() + + --env.info(( 'MusicToGroup: SndRef = ' .. SndRef )) + + if SndGroup ~= nil then + if _MusicTable and _MusicTable.FileCnt > 0 then + if SndGroup:isExist() then + if MusicCanStart(SndGroup:getUnit(1):getPlayerName()) then + --env.info(( 'MusicToGroup: OK for Sound.' )) + local SndIdx = 0 + if SndRef == '' then + --env.info(( 'MusicToGroup: SndRef as empty. Queueing at random.' )) + SndIdx = math.random( 1, _MusicTable.FileCnt ) + else + for SndIdx = 1, _MusicTable.FileCnt do + if _MusicTable.Files[SndIdx].Ref == SndRef then + break + end + end + end + --env.info(( 'MusicToGroup: SndIdx = ' .. SndIdx )) + --env.info(( 'MusicToGroup: Queueing Music ' .. _MusicTable.Files[SndIdx].File .. ' for Group ' .. SndGroup:getID() )) + trigger.action.outSoundForGroup( SndGroup:getID(), _MusicTable.Files[SndIdx].File ) + MessageToGroup( SndGroup, 'Playing ' .. _MusicTable.Files[SndIdx].File, 15, 'Music-' .. SndGroup:getUnit(1):getPlayerName() ) + + local SndQueueRef = SndGroup:getUnit(1):getPlayerName() + if _MusicTable.Queue[SndQueueRef] == nil then + _MusicTable.Queue[SndQueueRef] = {} + end + _MusicTable.Queue[SndQueueRef].Start = timer.getTime() + _MusicTable.Queue[SndQueueRef].PlayerName = SndGroup:getUnit(1):getPlayerName() + _MusicTable.Queue[SndQueueRef].Group = SndGroup + _MusicTable.Queue[SndQueueRef].ID = SndGroup:getID() + _MusicTable.Queue[SndQueueRef].Ref = SndIdx + _MusicTable.Queue[SndQueueRef].Continue = SndContinue + _MusicTable.Queue[SndQueueRef].Type = Group + end + end + end + end +end + +function MusicCanStart(PlayerName) +--trace.f() + + --env.info(( 'MusicCanStart:' )) + + local MusicOut = false + + if _MusicTable['Queue'] ~= nil and _MusicTable.FileCnt > 0 then + --env.info(( 'MusicCanStart: PlayerName = ' .. PlayerName )) + local PlayerFound = false + local MusicStart = 0 + local MusicTime = 0 + for SndQueueIdx, SndQueue in pairs( _MusicTable.Queue ) do + if SndQueue.PlayerName == PlayerName then + PlayerFound = true + MusicStart = SndQueue.Start + MusicTime = _MusicTable.Files[SndQueue.Ref].Time + break + end + end + if PlayerFound then + --env.info(( 'MusicCanStart: MusicStart = ' .. MusicStart )) + --env.info(( 'MusicCanStart: MusicTime = ' .. MusicTime )) + --env.info(( 'MusicCanStart: timer.getTime() = ' .. timer.getTime() )) + + if MusicStart + MusicTime <= timer.getTime() then + MusicOut = true + end + else + MusicOut = true + end + end + + if MusicOut then + --env.info(( 'MusicCanStart: true' )) + else + --env.info(( 'MusicCanStart: false' )) + end + + return MusicOut +end + +function MusicScheduler() +--trace.scheduled("", "MusicScheduler") + + --env.info(( 'MusicScheduler:' )) + if _MusicTable['Queue'] ~= nil and _MusicTable.FileCnt > 0 then + --env.info(( 'MusicScheduler: Walking Sound Queue.')) + for SndQueueIdx, SndQueue in pairs( _MusicTable.Queue ) do + if SndQueue.Continue then + if MusicCanStart(SndQueue.PlayerName) then + --env.info(('MusicScheduler: MusicToGroup')) + MusicToPlayer( '', SndQueue.PlayerName, true ) + end + end + end + end + +end + + +env.info(( 'Init: Scripts Loaded v1.1' )) + +--- BASE classes. +-- +-- @{#BASE} class +-- ============== +-- The @{#BASE} class is the super class for most of the classes defined within MOOSE. +-- +-- It handles: +-- +-- * The construction and inheritance of child classes. +-- * The tracing of objects during mission execution within the DCS.log file (under saved games folder). +-- +-- Note: Normally you would not use the BASE class unless you are extending the MOOSE framework with new classes. +-- +-- BASE Trace functionality +-- ======================== +-- The BASE class contains trace methods to trace progress within a mission execution of a certain object. +-- Note that these trace methods are inherited by each MOOSE class interiting BASE. +-- As such, each object created from derived class from BASE can use the tracing functions to trace its execution. +-- +-- Trace a function call +-- --------------------- +-- There are basically 3 types of tracing methods available within BASE: +-- +-- * @{#BASE.F}: Trace the beginning of a function and its given parameters. +-- * @{#BASE.T}: Trace further logic within a function giving optional variables or parameters. +-- * @{#BASE.E}: Trace an execption within a function giving optional variables or parameters. An exception will always be traced. +-- +-- Tracing levels +-- -------------- +-- There are 3 tracing levels within MOOSE. +-- These tracing levels were defined to avoid bulks of tracing to be generated by lots of objects. +-- +-- As such, the F and T methods have additional variants to trace level 2 and 3 respectively: +-- +-- * @{#BASE.F2}: Trace the beginning of a function and its given parameters with tracing level 2. +-- * @{#BASE.F3}: Trace the beginning of a function and its given parameters with tracing level 3. +-- * @{#BASE.T2}: Trace further logic within a function giving optional variables or parameters with tracing level 2. +-- * @{#BASE.T3}: Trace further logic within a function giving optional variables or parameters with tracing level 3. +-- +-- BASE Inheritance support +-- ======================== +-- The following methods are available to support inheritance: +-- +-- * @{#BASE.Inherit}: Inherits from a class. +-- * @{#BASE.Inherited}: Returns the parent class from the class. +-- +-- Future +-- ====== +-- Further methods may be added to BASE whenever there is a need to make "overall" functions available within MOOSE. +-- +-- ==== +-- +-- @module Base +-- @author FlightControl + +Include.File( "Routines" ) + +local _TraceOn = true +local _TraceLevel = 1 +local _TraceClass = { + --DATABASE = true, + --SEAD = true, + --DESTROYBASETASK = true, + --MOVEMENT = true, + --SPAWN = true, + --STAGE = true, + --ZONE = true, + --GROUP = true, + --UNIT = true, + --CLIENT = true, + --CARGO = true, + --CARGO_GROUP = true, + --CARGO_PACKAGE = true, + --CARGO_SLINGLOAD = true, + --CARGO_ZONE = true, + --CLEANUP = true, + --MENU_CLIENT = true, + --MENU_CLIENT_COMMAND = true, + --ESCORT = true, + } +local _TraceClassMethod = {} + +--- The BASE Class +-- @type BASE +-- @field ClassName The name of the class. +-- @field ClassID The ID number of the class. +BASE = { + ClassName = "BASE", + ClassID = 0, + Events = {} +} + +--- The Formation Class +-- @type FORMATION +-- @field Cone A cone formation. +FORMATION = { + Cone = "Cone" +} + + + +--- The base constructor. This is the top top class of all classed defined within the MOOSE. +-- Any new class needs to be derived from this class for proper inheritance. +-- @param #BASE self +-- @return #BASE The new instance of the BASE class. +-- @usage +-- function TASK:New() +-- +-- local self = BASE:Inherit( self, BASE:New() ) +-- +-- -- assign Task default values during construction +-- self.TaskBriefing = "Task: No Task." +-- self.Time = timer.getTime() +-- self.ExecuteStage = _TransportExecuteStage.NONE +-- +-- return self +-- end +-- @todo need to investigate if the deepCopy is really needed... Don't think so. +function BASE:New() + local Child = routines.utils.deepCopy( self ) + local Parent = {} + setmetatable( Child, Parent ) + Child.__index = Child + self.ClassID = self.ClassID + 1 + Child.ClassID = self.ClassID + --Child.AddEvent( Child, S_EVENT_BIRTH, Child.EventBirth ) + return Child +end + +--- This is the worker method to inherit from a parent class. +-- @param #BASE self +-- @param Child is the Child class that inherits. +-- @param #BASE Parent is the Parent class that the Child inherits from. +-- @return #BASE Child +function BASE:Inherit( Child, Parent ) + local Child = routines.utils.deepCopy( Child ) + local Parent = routines.utils.deepCopy( Parent ) + if Child ~= nil then + setmetatable( Child, Parent ) + Child.__index = Child + end + --Child.ClassName = Child.ClassName .. '.' .. Child.ClassID + self:T( 'Inherited from ' .. Parent.ClassName ) + return Child +end + +--- This is the worker method to retrieve the Parent class. +-- @param #BASE self +-- @param #BASE Child is the Child class from which the Parent class needs to be retrieved. +-- @return #BASE +function BASE:Inherited( Child ) + local Parent = getmetatable( Child ) +-- env.info('Inherited class of ' .. Child.ClassName .. ' is ' .. Parent.ClassName ) + return Parent +end + +--- Get the ClassName + ClassID of the class instance. +-- The ClassName + ClassID is formatted as '%s#%09d'. +-- @param #BASE self +-- @return #string The ClassName + ClassID of the class instance. +function BASE:GetClassNameAndID() + return string.format( '%s#%09d', self:GetClassName(), self:GetClassID() ) +end + +--- Get the ClassName of the class instance. +-- @param #BASE self +-- @return #string The ClassName of the class instance. +function BASE:GetClassName() + return self.ClassName +end + +--- Get the ClassID of the class instance. +-- @param #BASE self +-- @return #string The ClassID of the class instance. +function BASE:GetClassID() + return self.ClassID +end + +--- Set a new listener for the class. +-- @param self +-- @param DCSTypes#Event Event +-- @param #function EventFunction +-- @return #BASE +function BASE:AddEvent( Event, EventFunction ) + self:F( Event ) + + self.Events[#self.Events+1] = {} + self.Events[#self.Events].Event = Event + self.Events[#self.Events].EventFunction = EventFunction + self.Events[#self.Events].EventEnabled = false + + return self +end + +--- Returns the event dispatcher +-- @param #BASE self +-- @return Event#EVENT +function BASE:Event() + + return _EVENTDISPATCHER +end + + + + + +--- Enable the event listeners for the class. +-- @param #BASE self +-- @return #BASE +function BASE:EnableEvents() + self:F( #self.Events ) + + for EventID, Event in pairs( self.Events ) do + Event.Self = self + Event.EventEnabled = true + end + self.Events.Handler = world.addEventHandler( self ) + + return self +end + + +--- Disable the event listeners for the class. +-- @param #BASE self +-- @return #BASE +function BASE:DisableEvents() + self:F() + + world.removeEventHandler( self ) + for EventID, Event in pairs( self.Events ) do + Event.Self = nil + Event.EventEnabled = false + end + + return self +end + + +local BaseEventCodes = { + "S_EVENT_SHOT", + "S_EVENT_HIT", + "S_EVENT_TAKEOFF", + "S_EVENT_LAND", + "S_EVENT_CRASH", + "S_EVENT_EJECTION", + "S_EVENT_REFUELING", + "S_EVENT_DEAD", + "S_EVENT_PILOT_DEAD", + "S_EVENT_BASE_CAPTURED", + "S_EVENT_MISSION_START", + "S_EVENT_MISSION_END", + "S_EVENT_TOOK_CONTROL", + "S_EVENT_REFUELING_STOP", + "S_EVENT_BIRTH", + "S_EVENT_HUMAN_FAILURE", + "S_EVENT_ENGINE_STARTUP", + "S_EVENT_ENGINE_SHUTDOWN", + "S_EVENT_PLAYER_ENTER_UNIT", + "S_EVENT_PLAYER_LEAVE_UNIT", + "S_EVENT_PLAYER_COMMENT", + "S_EVENT_SHOOTING_START", + "S_EVENT_SHOOTING_END", + "S_EVENT_MAX", +} + +--onEvent( {[1]="S_EVENT_BIRTH",[2]={["subPlace"]=5,["time"]=0,["initiator"]={["id_"]=16884480,},["place"]={["id_"]=5000040,},["id"]=15,["IniUnitName"]="US F-15C@RAMP-Air Support Mountains#001-01",},} +-- Event = { +-- id = enum world.event, +-- time = Time, +-- initiator = Unit, +-- target = Unit, +-- place = Unit, +-- subPlace = enum world.BirthPlace, +-- weapon = Weapon +-- } + +--- Creation of a Birth Event. +-- @param #BASE self +-- @param DCSTypes#Time EventTime The time stamp of the event. +-- @param DCSObject#Object Initiator The initiating object of the event. +-- @param #string IniUnitName The initiating unit name. +-- @param place +-- @param subplace +function BASE:CreateEventBirth( EventTime, Initiator, IniUnitName, place, subplace ) + self:F( { EventTime, Initiator, IniUnitName, place, subplace } ) + + local Event = { + id = world.event.S_EVENT_BIRTH, + time = EventTime, + initiator = Initiator, + IniUnitName = IniUnitName, + place = place, + subplace = subplace + } + + world.onEvent( Event ) +end + +--- Creation of a Crash Event. +-- @param #BASE self +-- @param DCSTypes#Time EventTime The time stamp of the event. +-- @param DCSObject#Object Initiator The initiating object of the event. +function BASE:CreateEventCrash( EventTime, Initiator ) + self:F( { EventTime, Initiator } ) + + local Event = { + id = world.event.S_EVENT_CRASH, + time = EventTime, + initiator = Initiator, + } + + world.onEvent( Event ) +end + +-- TODO: Complete DCSTypes#Event structure. +--- The main event handling function... This function captures all events generated for the class. +-- @param #BASE self +-- @param DCSTypes#Event event +function BASE:onEvent(event) + --self:F( { BaseEventCodes[event.id], event } ) + + if self then + for EventID, EventObject in pairs( self.Events ) do + if EventObject.EventEnabled then + --env.info( 'onEvent Table EventObject.Self = ' .. tostring(EventObject.Self) ) + --env.info( 'onEvent event.id = ' .. tostring(event.id) ) + --env.info( 'onEvent EventObject.Event = ' .. tostring(EventObject.Event) ) + if event.id == EventObject.Event then + if self == EventObject.Self then + if event.initiator and event.initiator:isExist() then + event.IniUnitName = event.initiator:getName() + end + if event.target and event.target:isExist() then + event.TgtUnitName = event.target:getName() + end + --self:T( { BaseEventCodes[event.id], event } ) + --EventObject.EventFunction( self, event ) + end + end + end + end + end +end + +-- Trace section + +-- Log a trace (only shown when trace is on) +-- TODO: Make trace function using variable parameters. + +--- Set trace level +-- @param #BASE self +-- @param #number Level +function BASE:TraceLevel( Level ) + _TraceLevel = Level + self:E( "Tracing level " .. Level ) +end + +--- Set tracing for a class +-- @param #BASE self +-- @param #string Class +function BASE:TraceClass( Class ) + _TraceClass[Class] = true + _TraceClassMethod[Class] = {} + self:E( "Tracing class " .. Class ) +end + +--- Set tracing for a specific method of class +-- @param #BASE self +-- @param #string Class +-- @param #string Method +function BASE:TraceClassMethod( Class, Method ) + if not _TraceClassMethod[Class] then + _TraceClassMethod[Class] = {} + _TraceClassMethod[Class].Method = {} + end + _TraceClassMethod[Class].Method[Method] = true + self:E( "Tracing method " .. Method .. " of class " .. Class ) +end + +--- Trace a function call. Must be at the beginning of the function logic. +-- @param #BASE self +-- @param Arguments A #table or any field. +function BASE:F( Arguments, DebugInfoCurrentParam, DebugInfoFromParam ) + + if _TraceOn and ( _TraceClass[self.ClassName] or _TraceClassMethod[self.ClassName] ) then + + local DebugInfoCurrent = DebugInfoCurrentParam and DebugInfoCurrentParam or debug.getinfo( 2, "nl" ) + local DebugInfoFrom = DebugInfoFromParam and DebugInfoFromParam or debug.getinfo( 3, "l" ) + + local Function = "function" + if DebugInfoCurrent.name then + Function = DebugInfoCurrent.name + end + + if _TraceClass[self.ClassName] or _TraceClassMethod[self.ClassName].Method[Function] then + local LineCurrent = DebugInfoCurrent.currentline + local LineFrom = 0 + if DebugInfoFrom then + LineFrom = DebugInfoFrom.currentline + end + env.info( string.format( "%6d(%6d)/%1s:%20s%05d.%s(%s)" , LineCurrent, LineFrom, "F", self.ClassName, self.ClassID, Function, routines.utils.oneLineSerialize( Arguments ) ) ) + end + end +end + +--- Trace a function call level 2. Must be at the beginning of the function logic. +-- @param #BASE self +-- @param Arguments A #table or any field. +function BASE:F2( Arguments ) + + local DebugInfoCurrent = debug.getinfo( 2, "nl" ) + local DebugInfoFrom = debug.getinfo( 3, "l" ) + + if _TraceLevel >= 2 then + self:F( Arguments, DebugInfoCurrent, DebugInfoFrom ) + end + +end + +--- Trace a function call level 3. Must be at the beginning of the function logic. +-- @param #BASE self +-- @param Arguments A #table or any field. +function BASE:F3( Arguments ) + + local DebugInfoCurrent = debug.getinfo( 2, "nl" ) + local DebugInfoFrom = debug.getinfo( 3, "l" ) + + if _TraceLevel >= 3 then + self:F( Arguments, DebugInfoCurrent, DebugInfoFrom ) + end + +end + +--- Trace a function logic. Can be anywhere within the function logic. +-- @param #BASE self +-- @param Arguments A #table or any field. +function BASE:T( Arguments, DebugInfoCurrentParam, DebugInfoFromParam ) + + if _TraceOn and ( _TraceClass[self.ClassName] or _TraceClassMethod[self.ClassName] ) then + + local DebugInfoCurrent = DebugInfoCurrentParam and DebugInfoCurrentParam or debug.getinfo( 2, "nl" ) + local DebugInfoFrom = DebugInfoFromParam and DebugInfoFromParam or debug.getinfo( 3, "l" ) + + local Function = "function" + if DebugInfoCurrent.name then + Function = DebugInfoCurrent.name + end + + if _TraceClass[self.ClassName] or _TraceClassMethod[self.ClassName].Method[Function] then + local LineCurrent = DebugInfoCurrent.currentline + local LineFrom = 0 + if DebugInfoFrom then + LineFrom = DebugInfoFrom.currentline + end + env.info( string.format( "%6d(%6d)/%1s:%20s%05d.%s" , LineCurrent, LineFrom, "T", self.ClassName, self.ClassID, routines.utils.oneLineSerialize( Arguments ) ) ) + end + end +end + +--- Trace a function logic level 2. Can be anywhere within the function logic. +-- @param #BASE self +-- @param Arguments A #table or any field. +function BASE:T2( Arguments ) + + local DebugInfoCurrent = debug.getinfo( 2, "nl" ) + local DebugInfoFrom = debug.getinfo( 3, "l" ) + + if _TraceLevel >= 2 then + self:T( Arguments, DebugInfoCurrent, DebugInfoFrom ) + end + +end + +--- Trace a function logic level 3. Can be anywhere within the function logic. +-- @param #BASE self +-- @param Arguments A #table or any field. +function BASE:T3( Arguments ) + + local DebugInfoCurrent = debug.getinfo( 2, "nl" ) + local DebugInfoFrom = debug.getinfo( 3, "l" ) + + if _TraceLevel >= 3 then + self:T( Arguments, DebugInfoCurrent, DebugInfoFrom ) + end + +end + +--- Log an exception which will be traced always. Can be anywhere within the function logic. +-- @param #BASE self +-- @param Arguments A #table or any field. +function BASE:E( Arguments ) + + local DebugInfoCurrent = debug.getinfo( 2, "nl" ) + local DebugInfoFrom = debug.getinfo( 3, "l" ) + + local Function = "function" + if DebugInfoCurrent.name then + Function = DebugInfoCurrent.name + end + + local LineCurrent = DebugInfoCurrent.currentline + local LineFrom = -1 + if DebugInfoFrom then + LineFrom = DebugInfoFrom.currentline + end + + env.info( string.format( "%6d(%6d)/%1s:%20s%05d.%s(%s)" , LineCurrent, LineFrom, "E", self.ClassName, self.ClassID, Function, routines.utils.oneLineSerialize( Arguments ) ) ) +end + + + +--- Models time events calling event handing functions. +-- +-- @{SCHEDULER} class +-- =================== +-- The @{SCHEDULER} class models time events calling given event handling functions. +-- +-- SCHEDULER constructor +-- ===================== +-- The SCHEDULER class is quite easy to use: +-- +-- * @{#SCHEDULER.New}: Setup a new scheduler and start it with the specified parameters. +-- +-- SCHEDULER timer methods +-- ======================= +-- The SCHEDULER can be stopped and restarted with the following methods: +-- +-- * @{#SCHEDULER.Start}: (Re-)Start the scheduler. +-- * @{#SCHEDULER.Start}: Stop the scheduler. +-- +-- @module Scheduler +-- @author FlightControl + +Include.File( "Routines" ) +Include.File( "Base" ) + + +--- The SCHEDULER class +-- @type SCHEDULER +-- @extends Base#BASE +SCHEDULER = { + ClassName = "SCHEDULER", +} + + +--- Constructor. +-- @param #SCHEDULER self +-- @param #table TimeEventObject Specified for which Moose object the timer is setup. If a value of nil is provided, a scheduler will be setup without an object reference. +-- @param #function TimeEventFunction The event function to be called when a timer event occurs. The event function needs to accept the parameters specified in TimeEventFunctionArguments. +-- @param #table TimeEventFunctionArguments Optional arguments that can be given as part of scheduler. The arguments need to be given as a table { param1, param 2, ... }. +-- @param #number StartSeconds Specifies the amount of seconds that will be waited before the scheduling is started, and the event function is called. +-- @param #number RepeatSecondsInterval Specifies the interval in seconds when the scheduler will call the event function. +-- @param #number RandomizationFactor Specifies a randomization factor between 0 and 1 to randomize the RepeatSecondsInterval. +-- @param #number StopSeconds Specifies the amount of seconds when the scheduler will be stopped. +-- @return #SCHEDULER self +function SCHEDULER:New( TimeEventObject, TimeEventFunction, TimeEventFunctionArguments, StartSeconds, RepeatSecondsInterval, RandomizationFactor, StopSeconds ) + local self = BASE:Inherit( self, BASE:New() ) + self:F2( { TimeEventObject, TimeEventFunction, TimeEventFunctionArguments, StartSeconds, RepeatSecondsInterval, RandomizationFactor, StopSeconds } ) + + self.TimeEventObject = TimeEventObject + self.TimeEventFunction = TimeEventFunction + self.TimeEventFunctionArguments = TimeEventFunctionArguments + self.StartSeconds = StartSeconds + + if RepeatSecondsInterval then + self.RepeatSecondsInterval = RepeatSecondsInterval + else + self.RepeatSecondsInterval = 0 + end + + if RandomizationFactor then + self.RandomizationFactor = RandomizationFactor + else + self.RandomizationFactor = 0 + end + + if StopSeconds then + self.StopSeconds = StopSeconds + end + + self.Repeat = false + + self.StartTime = timer.getTime() + + self:Start() + + return self +end + +--- (Re-)Starts the scheduler. +-- @param #SCHEDULER self +-- @return #SCHEDULER self +function SCHEDULER:Start() + self:F2( self.TimeEventObject ) + + self.Repeat = true + timer.scheduleFunction( self._Scheduler, self, timer.getTime() + self.StartSeconds + .01 ) + + return self +end + +--- Stops the scheduler. +-- @param #SCHEDULER self +-- @return #SCHEDULER self +function SCHEDULER:Stop() + self:F2( self.TimeEventObject ) + + self.Repeat = false + + return self +end + +-- Private Functions + +function SCHEDULER:_Scheduler() + self:F2( self.TimeEventFunctionArguments ) + + local ErrorHandler = function( errmsg ) + + env.info( "Error in SCHEDULER function:" .. errmsg ) + env.info( debug.traceback() ) + + return errmsg + end + + local Status, Result + if self.TimeEventObject then + Status, Result = xpcall( function() return self.TimeEventFunction( self.TimeEventObject, unpack( self.TimeEventFunctionArguments ) ) end, ErrorHandler ) + else + Status, Result = xpcall( function() return self.TimeEventFunction( unpack( self.TimeEventFunctionArguments ) ) end, ErrorHandler ) + end + + self:T( { Status, Result } ) + + if Status and ( ( not Result ) or ( Result and Result ~= false ) ) then + if self.Repeat and ( not self.StopSeconds or ( self.StopSeconds and timer.getTime() <= self.StartTime + self.StopSeconds ) ) then + timer.scheduleFunction( + self._Scheduler, + self, + timer.getTime() + self.RepeatSecondsInterval + math.random( - ( self.RandomizationFactor * self.RepeatSecondsInterval / 2 ), ( self.RandomizationFactor * self.RepeatSecondsInterval / 2 ) ) + 0.01 + ) + end + end + +end + + + + + + + + +--- The EVENT class models an efficient event handling process between other classes and its units, weapons. +-- @module Event +-- @author FlightControl + +Include.File( "Routines" ) +Include.File( "Base" ) + +--- The EVENT structure +-- @type EVENT +-- @field #EVENT.Events Events +EVENT = { + ClassName = "EVENT", + ClassID = 0, +} + +local _EVENTCODES = { + "S_EVENT_SHOT", + "S_EVENT_HIT", + "S_EVENT_TAKEOFF", + "S_EVENT_LAND", + "S_EVENT_CRASH", + "S_EVENT_EJECTION", + "S_EVENT_REFUELING", + "S_EVENT_DEAD", + "S_EVENT_PILOT_DEAD", + "S_EVENT_BASE_CAPTURED", + "S_EVENT_MISSION_START", + "S_EVENT_MISSION_END", + "S_EVENT_TOOK_CONTROL", + "S_EVENT_REFUELING_STOP", + "S_EVENT_BIRTH", + "S_EVENT_HUMAN_FAILURE", + "S_EVENT_ENGINE_STARTUP", + "S_EVENT_ENGINE_SHUTDOWN", + "S_EVENT_PLAYER_ENTER_UNIT", + "S_EVENT_PLAYER_LEAVE_UNIT", + "S_EVENT_PLAYER_COMMENT", + "S_EVENT_SHOOTING_START", + "S_EVENT_SHOOTING_END", + "S_EVENT_MAX", +} + +--- The Event structure +-- @type EVENTDATA +-- @field id +-- @field initiator +-- @field target +-- @field weapon +-- @field IniDCSUnit +-- @field IniDCSUnitName +-- @field IniDCSGroup +-- @field IniDCSGroupName +-- @field TgtDCSUnit +-- @field TgtDCSUnitName +-- @field TgtDCSGroup +-- @field TgtDCSGroupName +-- @field Weapon +-- @field WeaponName +-- @field WeaponTgtDCSUnit + +--- The Events structure +-- @type EVENT.Events +-- @field #number IniUnit + +function EVENT:New() + local self = BASE:Inherit( self, BASE:New() ) + self:F2() + self.EventHandler = world.addEventHandler( self ) + return self +end + +function EVENT:EventText( EventID ) + + local EventText = _EVENTCODES[EventID] + + return EventText +end + + +--- Initializes the Events structure for the event +-- @param #EVENT self +-- @param DCSWorld#world.event EventID +-- @param #string EventClass +-- @return #EVENT.Events +function EVENT:Init( EventID, EventClass ) + self:F3( { _EVENTCODES[EventID], EventClass } ) + if not self.Events[EventID] then + self.Events[EventID] = {} + end + if not self.Events[EventID][EventClass] then + self.Events[EventID][EventClass] = {} + end + return self.Events[EventID][EventClass] +end + + +--- Create an OnDead event handler for a group +-- @param #EVENT self +-- @param #table EventTemplate +-- @param #function EventFunction The function to be called when the event occurs for the unit. +-- @param EventSelf The self instance of the class for which the event is. +-- @param #function OnEventFunction +-- @return #EVENT +function EVENT:OnEventForTemplate( EventTemplate, EventFunction, EventSelf, OnEventFunction ) + self:F2( EventTemplate.name ) + + for EventUnitID, EventUnit in pairs( EventTemplate.units ) do + OnEventFunction( self, EventUnit.name, EventFunction, EventSelf ) + end + return self +end + +--- Set a new listener for an S_EVENT_X event independent from a unit or a weapon. +-- @param #EVENT self +-- @param #function EventFunction The function to be called when the event occurs for the unit. +-- @param Base#BASE EventSelf The self instance of the class for which the event is. +-- @param EventID +-- @return #EVENT +function EVENT:OnEventGeneric( EventFunction, EventSelf, EventID ) + self:F2( { EventID } ) + + local Event = self:Init( EventID, EventSelf:GetClassNameAndID() ) + Event.EventFunction = EventFunction + Event.EventSelf = EventSelf + return self +end + + +--- Set a new listener for an S_EVENT_X event +-- @param #EVENT self +-- @param #string EventDCSUnitName +-- @param #function EventFunction The function to be called when the event occurs for the unit. +-- @param Base#BASE EventSelf The self instance of the class for which the event is. +-- @param EventID +-- @return #EVENT +function EVENT:OnEventForUnit( EventDCSUnitName, EventFunction, EventSelf, EventID ) + self:F2( EventDCSUnitName ) + + local Event = self:Init( EventID, EventSelf:GetClassNameAndID() ) + if not Event.IniUnit then + Event.IniUnit = {} + end + Event.IniUnit[EventDCSUnitName] = {} + Event.IniUnit[EventDCSUnitName].EventFunction = EventFunction + Event.IniUnit[EventDCSUnitName].EventSelf = EventSelf + return self +end + + +--- Create an OnBirth event handler for a group +-- @param #EVENT self +-- @param Group#GROUP EventGroup +-- @param #function EventFunction The function to be called when the event occurs for the unit. +-- @param EventSelf The self instance of the class for which the event is. +-- @return #EVENT +function EVENT:OnBirthForTemplate( EventTemplate, EventFunction, EventSelf ) + self:F2( EventTemplate.name ) + + self:OnEventForTemplate( EventTemplate, EventFunction, EventSelf, self.OnBirthForUnit ) + + return self +end + +--- Set a new listener for an S_EVENT_BIRTH event, and registers the unit born. +-- @param #EVENT self +-- @param #function EventFunction The function to be called when the event occurs for the unit. +-- @param Base#BASE EventSelf +-- @return #EVENT +function EVENT:OnBirth( EventFunction, EventSelf ) + self:F2() + + self:OnEventGeneric( EventFunction, EventSelf, world.event.S_EVENT_BIRTH ) + + return self +end + +--- Set a new listener for an S_EVENT_BIRTH event. +-- @param #EVENT self +-- @param #string EventDCSUnitName The id of the unit for the event to be handled. +-- @param #function EventFunction The function to be called when the event occurs for the unit. +-- @param Base#BASE EventSelf +-- @return #EVENT +function EVENT:OnBirthForUnit( EventDCSUnitName, EventFunction, EventSelf ) + self:F2( EventDCSUnitName ) + + self:OnEventForUnit( EventDCSUnitName, EventFunction, EventSelf, world.event.S_EVENT_BIRTH ) + + return self +end + +--- Create an OnCrash event handler for a group +-- @param #EVENT self +-- @param Group#GROUP EventGroup +-- @param #function EventFunction The function to be called when the event occurs for the unit. +-- @param EventSelf The self instance of the class for which the event is. +-- @return #EVENT +function EVENT:OnCrashForTemplate( EventTemplate, EventFunction, EventSelf ) + self:F2( EventTemplate.name ) + + self:OnEventForTemplate( EventTemplate, EventFunction, EventSelf, self.OnCrashForUnit ) + + return self +end + +--- Set a new listener for an S_EVENT_CRASH event. +-- @param #EVENT self +-- @param #function EventFunction The function to be called when the event occurs for the unit. +-- @param Base#BASE EventSelf +-- @return #EVENT +function EVENT:OnCrash( EventFunction, EventSelf ) + self:F2() + + self:OnEventGeneric( EventFunction, EventSelf, world.event.S_EVENT_CRASH ) + + return self +end + +--- Set a new listener for an S_EVENT_CRASH event. +-- @param #EVENT self +-- @param #string EventDCSUnitName +-- @param #function EventFunction The function to be called when the event occurs for the unit. +-- @param Base#BASE EventSelf The self instance of the class for which the event is. +-- @return #EVENT +function EVENT:OnCrashForUnit( EventDCSUnitName, EventFunction, EventSelf ) + self:F2( EventDCSUnitName ) + + self:OnEventForUnit( EventDCSUnitName, EventFunction, EventSelf, world.event.S_EVENT_CRASH ) + + return self +end + +--- Create an OnDead event handler for a group +-- @param #EVENT self +-- @param Group#GROUP EventGroup +-- @param #function EventFunction The function to be called when the event occurs for the unit. +-- @param EventSelf The self instance of the class for which the event is. +-- @return #EVENT +function EVENT:OnDeadForTemplate( EventTemplate, EventFunction, EventSelf ) + self:F2( EventTemplate.name ) + + self:OnEventForTemplate( EventTemplate, EventFunction, EventSelf, self.OnDeadForUnit ) + + return self +end + +--- Set a new listener for an S_EVENT_DEAD event. +-- @param #EVENT self +-- @param #function EventFunction The function to be called when the event occurs for the unit. +-- @param Base#BASE EventSelf +-- @return #EVENT +function EVENT:OnDead( EventFunction, EventSelf ) + self:F2() + + self:OnEventGeneric( EventFunction, EventSelf, world.event.S_EVENT_DEAD ) + + return self +end + + +--- Set a new listener for an S_EVENT_DEAD event. +-- @param #EVENT self +-- @param #string EventDCSUnitName +-- @param #function EventFunction The function to be called when the event occurs for the unit. +-- @param Base#BASE EventSelf The self instance of the class for which the event is. +-- @return #EVENT +function EVENT:OnDeadForUnit( EventDCSUnitName, EventFunction, EventSelf ) + self:F2( EventDCSUnitName ) + + self:OnEventForUnit( EventDCSUnitName, EventFunction, EventSelf, world.event.S_EVENT_DEAD ) + + return self +end + +--- Set a new listener for an S_EVENT_PILOT_DEAD event. +-- @param #EVENT self +-- @param #string EventDCSUnitName +-- @param #function EventFunction The function to be called when the event occurs for the unit. +-- @param Base#BASE EventSelf The self instance of the class for which the event is. +-- @return #EVENT +function EVENT:OnPilotDeadForUnit( EventDCSUnitName, EventFunction, EventSelf ) + self:F2( EventDCSUnitName ) + + self:OnEventForUnit( EventDCSUnitName, EventFunction, EventSelf, world.event.S_EVENT_PILOT_DEAD ) + + return self +end + +--- Create an OnDead event handler for a group +-- @param #EVENT self +-- @param #table EventTemplate +-- @param #function EventFunction The function to be called when the event occurs for the unit. +-- @param EventSelf The self instance of the class for which the event is. +-- @return #EVENT +function EVENT:OnLandForTemplate( EventTemplate, EventFunction, EventSelf ) + self:F2( EventTemplate.name ) + + self:OnEventForTemplate( EventTemplate, EventFunction, EventSelf, self.OnLandForUnit ) + + return self +end + +--- Set a new listener for an S_EVENT_LAND event. +-- @param #EVENT self +-- @param #string EventDCSUnitName +-- @param #function EventFunction The function to be called when the event occurs for the unit. +-- @param Base#BASE EventSelf The self instance of the class for which the event is. +-- @return #EVENT +function EVENT:OnLandForUnit( EventDCSUnitName, EventFunction, EventSelf ) + self:F2( EventDCSUnitName ) + + self:OnEventForUnit( EventDCSUnitName, EventFunction, EventSelf, world.event.S_EVENT_LAND ) + + return self +end + +--- Create an OnDead event handler for a group +-- @param #EVENT self +-- @param #table EventTemplate +-- @param #function EventFunction The function to be called when the event occurs for the unit. +-- @param EventSelf The self instance of the class for which the event is. +-- @return #EVENT +function EVENT:OnTakeOffForTemplate( EventTemplate, EventFunction, EventSelf ) + self:F2( EventTemplate.name ) + + self:OnEventForTemplate( EventTemplate, EventFunction, EventSelf, self.OnTakeOffForUnit ) + + return self +end + +--- Set a new listener for an S_EVENT_TAKEOFF event. +-- @param #EVENT self +-- @param #string EventDCSUnitName +-- @param #function EventFunction The function to be called when the event occurs for the unit. +-- @param Base#BASE EventSelf The self instance of the class for which the event is. +-- @return #EVENT +function EVENT:OnTakeOffForUnit( EventDCSUnitName, EventFunction, EventSelf ) + self:F2( EventDCSUnitName ) + + self:OnEventForUnit( EventDCSUnitName, EventFunction, EventSelf, world.event.S_EVENT_TAKEOFF ) + + return self +end + +--- Create an OnDead event handler for a group +-- @param #EVENT self +-- @param #table EventTemplate +-- @param #function EventFunction The function to be called when the event occurs for the unit. +-- @param EventSelf The self instance of the class for which the event is. +-- @return #EVENT +function EVENT:OnEngineShutDownForTemplate( EventTemplate, EventFunction, EventSelf ) + self:F2( EventTemplate.name ) + + self:OnEventForTemplate( EventTemplate, EventFunction, EventSelf, self.OnEngineShutDownForUnit ) + + return self +end + +--- Set a new listener for an S_EVENT_ENGINE_SHUTDOWN event. +-- @param #EVENT self +-- @param #string EventDCSUnitName +-- @param #function EventFunction The function to be called when the event occurs for the unit. +-- @param Base#BASE EventSelf The self instance of the class for which the event is. +-- @return #EVENT +function EVENT:OnEngineShutDownForUnit( EventDCSUnitName, EventFunction, EventSelf ) + self:F2( EventDCSUnitName ) + + self:OnEventForUnit( EventDCSUnitName, EventFunction, EventSelf, world.event.S_EVENT_ENGINE_SHUTDOWN ) + + return self +end + +--- Set a new listener for an S_EVENT_ENGINE_STARTUP event. +-- @param #EVENT self +-- @param #string EventDCSUnitName +-- @param #function EventFunction The function to be called when the event occurs for the unit. +-- @param Base#BASE EventSelf The self instance of the class for which the event is. +-- @return #EVENT +function EVENT:OnEngineStartUpForUnit( EventDCSUnitName, EventFunction, EventSelf ) + self:F2( EventDCSUnitName ) + + self:OnEventForUnit( EventDCSUnitName, EventFunction, EventSelf, world.event.S_EVENT_ENGINE_STARTUP ) + + return self +end + +--- Set a new listener for an S_EVENT_SHOT event. +-- @param #EVENT self +-- @param #function EventFunction The function to be called when the event occurs for the unit. +-- @param Base#BASE EventSelf The self instance of the class for which the event is. +-- @return #EVENT +function EVENT:OnShot( EventFunction, EventSelf ) + self:F2() + + self:OnEventGeneric( EventFunction, EventSelf, world.event.S_EVENT_SHOT ) + + return self +end + +--- Set a new listener for an S_EVENT_SHOT event for a unit. +-- @param #EVENT self +-- @param #string EventDCSUnitName +-- @param #function EventFunction The function to be called when the event occurs for the unit. +-- @param Base#BASE EventSelf The self instance of the class for which the event is. +-- @return #EVENT +function EVENT:OnShotForUnit( EventDCSUnitName, EventFunction, EventSelf ) + self:F2( EventDCSUnitName ) + + self:OnEventForUnit( EventDCSUnitName, EventFunction, EventSelf, world.event.S_EVENT_SHOT ) + + return self +end + +--- Set a new listener for an S_EVENT_HIT event. +-- @param #EVENT self +-- @param #function EventFunction The function to be called when the event occurs for the unit. +-- @param Base#BASE EventSelf The self instance of the class for which the event is. +-- @return #EVENT +function EVENT:OnHit( EventFunction, EventSelf ) + self:F2() + + self:OnEventGeneric( EventFunction, EventSelf, world.event.S_EVENT_HIT ) + + return self +end + +--- Set a new listener for an S_EVENT_HIT event. +-- @param #EVENT self +-- @param #string EventDCSUnitName +-- @param #function EventFunction The function to be called when the event occurs for the unit. +-- @param Base#BASE EventSelf The self instance of the class for which the event is. +-- @return #EVENT +function EVENT:OnHitForUnit( EventDCSUnitName, EventFunction, EventSelf ) + self:F2( EventDCSUnitName ) + + self:OnEventForUnit( EventDCSUnitName, EventFunction, EventSelf, world.event.S_EVENT_HIT ) + + return self +end + +--- Set a new listener for an S_EVENT_PLAYER_ENTER_UNIT event. +-- @param #EVENT self +-- @param #function EventFunction The function to be called when the event occurs for the unit. +-- @param Base#BASE EventSelf The self instance of the class for which the event is. +-- @return #EVENT +function EVENT:OnPlayerEnterUnit( EventFunction, EventSelf ) + self:F2() + + self:OnEventGeneric( EventFunction, EventSelf, world.event.S_EVENT_PLAYER_ENTER_UNIT ) + + return self +end + +--- Set a new listener for an S_EVENT_PLAYER_LEAVE_UNIT event. +-- @param #EVENT self +-- @param #function EventFunction The function to be called when the event occurs for the unit. +-- @param Base#BASE EventSelf The self instance of the class for which the event is. +-- @return #EVENT +function EVENT:OnPlayerLeaveUnit( EventFunction, EventSelf ) + self:F2() + + self:OnEventGeneric( EventFunction, EventSelf, world.event.S_EVENT_PLAYER_LEAVE_UNIT ) + + return self +end + + + +function EVENT:onEvent( Event ) + self:F2( { _EVENTCODES[Event.id], Event } ) + + if self and self.Events and self.Events[Event.id] then + if Event.initiator and Event.initiator:getCategory() == Object.Category.UNIT then + Event.IniDCSUnit = Event.initiator + Event.IniDCSGroup = Event.IniDCSUnit:getGroup() + Event.IniDCSUnitName = Event.IniDCSUnit:getName() + Event.IniDCSGroupName = "" + if Event.IniDCSGroup and Event.IniDCSGroup:isExist() then + Event.IniDCSGroupName = Event.IniDCSGroup:getName() + end + end + if Event.target then + if Event.target and Event.target:getCategory() == Object.Category.UNIT then + Event.TgtDCSUnit = Event.target + Event.TgtDCSGroup = Event.TgtDCSUnit:getGroup() + Event.TgtDCSUnitName = Event.TgtDCSUnit:getName() + Event.TgtDCSGroupName = "" + if Event.TgtDCSGroup and Event.TgtDCSGroup:isExist() then + Event.TgtDCSGroupName = Event.TgtDCSGroup:getName() + end + end + end + if Event.weapon then + Event.Weapon = Event.weapon + Event.WeaponName = Event.Weapon:getTypeName() + --Event.WeaponTgtDCSUnit = Event.Weapon:getTarget() + end + self:E( { _EVENTCODES[Event.id], Event } ) + for ClassName, EventData in pairs( self.Events[Event.id] ) do + if Event.IniDCSUnitName and EventData.IniUnit and EventData.IniUnit[Event.IniDCSUnitName] then + self:T2( { "Calling event function for class ", ClassName, " unit ", Event.IniDCSUnitName } ) + EventData.IniUnit[Event.IniDCSUnitName].EventFunction( EventData.IniUnit[Event.IniDCSUnitName].EventSelf, Event ) + else + if Event.IniDCSUnit and not EventData.IniUnit then + self:T2( { "Calling event function for class ", ClassName } ) + EventData.EventFunction( EventData.EventSelf, Event ) + end + end + end + end +end + +--- Encapsulation of DCS World Menu system in a set of MENU classes. +-- @module Menu + +Include.File( "Routines" ) +Include.File( "Base" ) + +--- The MENU class +-- @type MENU +-- @extends Base#BASE +MENU = { + ClassName = "MENU", + MenuPath = nil, + MenuText = "", + MenuParentPath = nil +} + +--- +function MENU:New( MenuText, MenuParentPath ) + + -- Arrange meta tables + local Child = BASE:Inherit( self, BASE:New() ) + + Child.MenuPath = nil + Child.MenuText = MenuText + Child.MenuParentPath = MenuParentPath + return Child +end + +--- The COMMANDMENU class +-- @type COMMANDMENU +-- @extends Menu#MENU +COMMANDMENU = { + ClassName = "COMMANDMENU", + CommandMenuFunction = nil, + CommandMenuArgument = nil +} + +function COMMANDMENU:New( MenuText, ParentMenu, CommandMenuFunction, CommandMenuArgument ) + + -- Arrange meta tables + + local MenuParentPath = nil + if ParentMenu ~= nil then + MenuParentPath = ParentMenu.MenuPath + end + + local Child = BASE:Inherit( self, MENU:New( MenuText, MenuParentPath ) ) + + Child.MenuPath = missionCommands.addCommand( MenuText, MenuParentPath, CommandMenuFunction, CommandMenuArgument ) + Child.CommandMenuFunction = CommandMenuFunction + Child.CommandMenuArgument = CommandMenuArgument + return Child +end + +--- The SUBMENU class +-- @type SUBMENU +-- @extends Menu#MENU +SUBMENU = { + ClassName = "SUBMENU" +} + +function SUBMENU:New( MenuText, ParentMenu ) + + -- Arrange meta tables + local MenuParentPath = nil + if ParentMenu ~= nil then + MenuParentPath = ParentMenu.MenuPath + end + + local Child = BASE:Inherit( self, MENU:New( MenuText, MenuParentPath ) ) + + Child.MenuPath = missionCommands.addSubMenu( MenuText, MenuParentPath ) + return Child +end + +-- This local variable is used to cache the menus registered under clients. +-- Menus don't dissapear when clients are destroyed and restarted. +-- So every menu for a client created must be tracked so that program logic accidentally does not create +-- the same menus twice during initialization logic. +-- These menu classes are handling this logic with this variable. +local _MENUCLIENTS = {} + +--- The MENU_CLIENT class +-- @type MENU_CLIENT +-- @extends Menu#MENU +MENU_CLIENT = { + ClassName = "MENU_CLIENT" +} + +--- Creates a new menu item for a group +-- @param self +-- @param Client#CLIENT MenuClient The Client owning the menu. +-- @param #string MenuText The text for the menu. +-- @param #table ParentMenu The parent menu. +-- @return #MENU_CLIENT self +function MENU_CLIENT:New( MenuClient, MenuText, ParentMenu ) + + -- Arrange meta tables + local MenuParentPath = {} + if ParentMenu ~= nil then + MenuParentPath = ParentMenu.MenuPath + end + + local self = BASE:Inherit( self, MENU:New( MenuText, MenuParentPath ) ) + self:F( { MenuClient, MenuText, ParentMenu } ) + + self.MenuClient = MenuClient + self.MenuClientGroupID = MenuClient:GetClientGroupID() + self.MenuParentPath = MenuParentPath + self.MenuText = MenuText + self.ParentMenu = ParentMenu + + self.Menus = {} + + if not _MENUCLIENTS[self.MenuClientGroupID] then + _MENUCLIENTS[self.MenuClientGroupID] = {} + end + + local MenuPath = _MENUCLIENTS[self.MenuClientGroupID] + + self:T( { MenuClient:GetClientGroupName(), MenuPath[table.concat(MenuParentPath)], MenuParentPath, MenuText } ) + + local MenuPathID = table.concat(MenuParentPath) .. "/" .. MenuText + if MenuPath[MenuPathID] then + missionCommands.removeItemForGroup( self.MenuClient:GetClientGroupID(), MenuPath[MenuPathID] ) + end + + self.MenuPath = missionCommands.addSubMenuForGroup( self.MenuClient:GetClientGroupID(), MenuText, MenuParentPath ) + MenuPath[MenuPathID] = self.MenuPath + + self:T( { MenuClient:GetClientGroupName(), self.MenuPath } ) + + if ParentMenu and ParentMenu.Menus then + ParentMenu.Menus[self.MenuPath] = self + end + return self +end + +--- Removes the sub menus recursively of this MENU_CLIENT. +-- @param #MENU_CLIENT self +-- @return #MENU_CLIENT self +function MENU_CLIENT:RemoveSubMenus() + self:F( self.MenuPath ) + + for MenuID, Menu in pairs( self.Menus ) do + Menu:Remove() + end + +end + +--- Removes the sub menus recursively of this MENU_CLIENT. +-- @param #MENU_CLIENT self +-- @return #MENU_CLIENT self +function MENU_CLIENT:Remove() + self:F( self.MenuPath ) + + self:RemoveSubMenus() + + if not _MENUCLIENTS[self.MenuClientGroupID] then + _MENUCLIENTS[self.MenuClientGroupID] = {} + end + + local MenuPath = _MENUCLIENTS[self.MenuClientGroupID] + + if MenuPath[table.concat(self.MenuParentPath) .. "/" .. self.MenuText] then + MenuPath[table.concat(self.MenuParentPath) .. "/" .. self.MenuText] = nil + end + + missionCommands.removeItemForGroup( self.MenuClient:GetClientGroupID(), self.MenuPath ) + self.ParentMenu.Menus[self.MenuPath] = nil + return nil +end + + +--- The MENU_CLIENT_COMMAND class +-- @type MENU_CLIENT_COMMAND +-- @extends Menu#MENU +MENU_CLIENT_COMMAND = { + ClassName = "MENU_CLIENT_COMMAND" +} + +--- Creates a new radio command item for a group +-- @param self +-- @param Client#CLIENT MenuClient The Client owning the menu. +-- @param MenuText The text for the menu. +-- @param ParentMenu The parent menu. +-- @param CommandMenuFunction A function that is called when the menu key is pressed. +-- @param CommandMenuArgument An argument for the function. +-- @return Menu#MENU_CLIENT_COMMAND self +function MENU_CLIENT_COMMAND:New( MenuClient, MenuText, ParentMenu, CommandMenuFunction, CommandMenuArgument ) + + -- Arrange meta tables + + local MenuParentPath = {} + if ParentMenu ~= nil then + MenuParentPath = ParentMenu.MenuPath + end + + local self = BASE:Inherit( self, MENU:New( MenuText, MenuParentPath ) ) + + self.MenuClient = MenuClient + self.MenuClientGroupID = MenuClient:GetClientGroupID() + self.MenuParentPath = MenuParentPath + self.MenuText = MenuText + self.ParentMenu = ParentMenu + + if not _MENUCLIENTS[self.MenuClientGroupID] then + _MENUCLIENTS[self.MenuClientGroupID] = {} + end + + local MenuPath = _MENUCLIENTS[self.MenuClientGroupID] + + self:T( { MenuClient:GetClientGroupName(), MenuPath[table.concat(MenuParentPath)], MenuParentPath, MenuText, CommandMenuFunction, CommandMenuArgument } ) + + local MenuPathID = table.concat(MenuParentPath) .. "/" .. MenuText + if MenuPath[MenuPathID] then + missionCommands.removeItemForGroup( self.MenuClient:GetClientGroupID(), MenuPath[MenuPathID] ) + end + + self.MenuPath = missionCommands.addCommandForGroup( self.MenuClient:GetClientGroupID(), MenuText, MenuParentPath, CommandMenuFunction, CommandMenuArgument ) + MenuPath[MenuPathID] = self.MenuPath + + self.CommandMenuFunction = CommandMenuFunction + self.CommandMenuArgument = CommandMenuArgument + + ParentMenu.Menus[self.MenuPath] = self + + return self +end + +function MENU_CLIENT_COMMAND:Remove() + self:F( self.MenuPath ) + + if not _MENUCLIENTS[self.MenuClientGroupID] then + _MENUCLIENTS[self.MenuClientGroupID] = {} + end + + local MenuPath = _MENUCLIENTS[self.MenuClientGroupID] + + if MenuPath[table.concat(self.MenuParentPath) .. "/" .. self.MenuText] then + MenuPath[table.concat(self.MenuParentPath) .. "/" .. self.MenuText] = nil + end + + missionCommands.removeItemForGroup( self.MenuClient:GetClientGroupID(), self.MenuPath ) + self.ParentMenu.Menus[self.MenuPath] = nil + return nil +end + + +--- The MENU_COALITION class +-- @type MENU_COALITION +-- @extends Menu#MENU +MENU_COALITION = { + ClassName = "MENU_COALITION" +} + +--- Creates a new coalition menu item +-- @param #MENU_COALITION self +-- @param DCSCoalition#coalition.side MenuCoalition The coalition owning the menu. +-- @param #string MenuText The text for the menu. +-- @param #table ParentMenu The parent menu. +-- @return #MENU_COALITION self +function MENU_COALITION:New( MenuCoalition, MenuText, ParentMenu ) + + -- Arrange meta tables + local MenuParentPath = {} + if ParentMenu ~= nil then + MenuParentPath = ParentMenu.MenuPath + end + + local self = BASE:Inherit( self, MENU:New( MenuText, MenuParentPath ) ) + self:F( { MenuCoalition, MenuText, ParentMenu } ) + + self.MenuCoalition = MenuCoalition + self.MenuParentPath = MenuParentPath + self.MenuText = MenuText + self.ParentMenu = ParentMenu + + self.Menus = {} + + self:T( { MenuParentPath, MenuText } ) + + self.MenuPath = missionCommands.addSubMenuForCoalition( self.MenuCoalition, MenuText, MenuParentPath ) + + self:T( { self.MenuPath } ) + + if ParentMenu and ParentMenu.Menus then + ParentMenu.Menus[self.MenuPath] = self + end + return self +end + +--- Removes the sub menus recursively of this MENU_COALITION. +-- @param #MENU_COALITION self +-- @return #MENU_COALITION self +function MENU_COALITION:RemoveSubMenus() + self:F( self.MenuPath ) + + for MenuID, Menu in pairs( self.Menus ) do + Menu:Remove() + end + +end + +--- Removes the sub menus recursively of this MENU_COALITION. +-- @param #MENU_COALITION self +-- @return #MENU_COALITION self +function MENU_COALITION:Remove() + self:F( self.MenuPath ) + + self:RemoveSubMenus() + missionCommands.removeItemForCoalition( self.MenuCoalition, self.MenuPath ) + self.ParentMenu.Menus[self.MenuPath] = nil + + return nil +end + + +--- The MENU_COALITION_COMMAND class +-- @type MENU_COALITION_COMMAND +-- @extends Menu#MENU +MENU_COALITION_COMMAND = { + ClassName = "MENU_COALITION_COMMAND" +} + +--- Creates a new radio command item for a group +-- @param #MENU_COALITION_COMMAND self +-- @param DCSCoalition#coalition.side MenuCoalition The coalition owning the menu. +-- @param MenuText The text for the menu. +-- @param ParentMenu The parent menu. +-- @param CommandMenuFunction A function that is called when the menu key is pressed. +-- @param CommandMenuArgument An argument for the function. +-- @return #MENU_COALITION_COMMAND self +function MENU_COALITION_COMMAND:New( MenuCoalition, MenuText, ParentMenu, CommandMenuFunction, CommandMenuArgument ) + + -- Arrange meta tables + + local MenuParentPath = {} + if ParentMenu ~= nil then + MenuParentPath = ParentMenu.MenuPath + end + + local self = BASE:Inherit( self, MENU:New( MenuText, MenuParentPath ) ) + + self.MenuCoalition = MenuCoalition + self.MenuParentPath = MenuParentPath + self.MenuText = MenuText + self.ParentMenu = ParentMenu + + self:T( { MenuParentPath, MenuText, CommandMenuFunction, CommandMenuArgument } ) + + self.MenuPath = missionCommands.addCommandForCoalition( self.MenuCoalition, MenuText, MenuParentPath, CommandMenuFunction, CommandMenuArgument ) + + self.CommandMenuFunction = CommandMenuFunction + self.CommandMenuArgument = CommandMenuArgument + + ParentMenu.Menus[self.MenuPath] = self + + return self +end + +--- Removes a radio command item for a coalition +-- @param #MENU_COALITION_COMMAND self +-- @return #MENU_COALITION_COMMAND self +function MENU_COALITION_COMMAND:Remove() + self:F( self.MenuPath ) + + missionCommands.removeItemForCoalition( self.MenuCoalition, self.MenuPath ) + self.ParentMenu.Menus[self.MenuPath] = nil + return nil +end +--- This module contains the GROUP class. +-- +-- 1) @{Group#GROUP} class, extends @{Base#BASE} +-- ============================================= +-- The @{Group#GROUP} class is a wrapper class to handle the DCS Group objects: +-- +-- * Support all DCS Group APIs. +-- * Enhance with Group specific APIs not in the DCS Group API set. +-- * Handle local Group Controller. +-- * Manage the "state" of the DCS Group. +-- +-- **IMPORTANT: ONE SHOULD NEVER SANATIZE these GROUP OBJECT REFERENCES! (make the GROUP object references nil).** +-- +-- 1.1) GROUP reference methods +-- ----------------------- +-- For each DCS Group object alive within a running mission, a GROUP wrapper object (instance) will be created within the _@{DATABASE} object. +-- This is done at the beginning of the mission (when the mission starts), and dynamically when new DCS Group objects are spawned (using the @{SPAWN} class). +-- +-- The GROUP class does not contain a :New() method, rather it provides :Find() methods to retrieve the object reference +-- using the DCS Group or the DCS GroupName. +-- +-- Another thing to know is that GROUP objects do not "contain" the DCS Group object. +-- The GROUP methods will reference the DCS Group object by name when it is needed during API execution. +-- If the DCS Group object does not exist or is nil, the GROUP methods will return nil and log an exception in the DCS.log file. +-- +-- The GROUP class provides the following functions to retrieve quickly the relevant GROUP instance: +-- +-- * @{#GROUP.Find}(): Find a GROUP instance from the _DATABASE object using a DCS Group object. +-- * @{#GROUP.FindByName}(): Find a GROUP instance from the _DATABASE object using a DCS Group name. +-- +-- 1.2) GROUP task methods +-- ----------------------- +-- Several group task methods are available that help you to prepare tasks. +-- These methods return a string consisting of the task description, which can then be given to either a @{Group#GROUP.PushTask} or @{Group#SetTask} method to assign the task to the GROUP. +-- Tasks are specific for the category of the GROUP, more specific, for AIR, GROUND or AIR and GROUND. +-- Each task description where applicable indicates for which group category the task is valid. +-- There are 2 main subdivisions of tasks: Assigned tasks and EnRoute tasks. +-- +-- ### 1.2.1) Assigned task methods +-- +-- Assigned task methods make the group execute the task where the location of the (possible) targets of the task are known before being detected. +-- This is different from the EnRoute tasks, where the targets of the task need to be detected before the task can be executed. +-- +-- Find below a list of the **assigned task** methods: +-- +-- * @{#GROUP.TaskAttackGroup}: (AIR) Attack a Group. +-- * @{#GROUP.TaskAttackMapObject}: (AIR) Attacking the map object (building, structure, e.t.c). +-- * @{#GROUP.TaskAttackUnit}: (AIR) Attack the Unit. +-- * @{#GROUP.TaskBombing}: (AIR) Delivering weapon at the point on the ground. +-- * @{#GROUP.TaskBombingRunway}: (AIR) Delivering weapon on the runway. +-- * @{#GROUP.TaskEmbarking}: (AIR) Move the group to a Vec2 Point, wait for a defined duration and embark a group. +-- * @{#GROUP.TaskEmbarkToTransport}: (GROUND) Embark to a Transport landed at a location. +-- * @{#GROUP.TaskEscort}: (AIR) Escort another airborne group. +-- * @{#GROUP.TaskFAC_AttackGroup}: (AIR + GROUND) The task makes the group/unit a FAC and orders the FAC to control the target (enemy ground group) destruction. +-- * @{#GROUP.TaskFireAtPoint}: (GROUND) Fire at a VEC2 point until ammunition is finished. +-- * @{#GROUP.TaskFollow}: (AIR) Following another airborne group. +-- * @{#GROUP.TaskHold}: (GROUND) Hold ground group from moving. +-- * @{#GROUP.TaskHoldPosition}: (AIR) Hold position at the current position of the first unit of the group. +-- * @{#GROUP.TaskLand}: (AIR HELICOPTER) Landing at the ground. For helicopters only. +-- * @{#GROUP.TaskLandAtZone}: (AIR) Land the group at a @{Zone#ZONE_RADIUS). +-- * @{#GROUP.TaskOrbitCircle}: (AIR) Orbit at the current position of the first unit of the group at a specified alititude. +-- * @{#GROUP.TaskOrbitCircleAtVec2}: (AIR) Orbit at a specified position at a specified alititude during a specified duration with a specified speed. +-- * @{#GROUP.TaskRefueling}: (AIR) Refueling from the nearest tanker. No parameters. +-- * @{#GROUP.TaskRoute}: (AIR + GROUND) Return a Misson task to follow a given route defined by Points. +-- * @{#GROUP.TaskRouteToVec2}: (AIR + GROUND) Make the Group move to a given point. +-- * @{#GROUP.TaskRouteToVec3}: (AIR + GROUND) Make the Group move to a given point. +-- * @{#GROUP.TaskRouteToZone}: (AIR + GROUND) Route the group to a given zone. +-- +-- ### 1.2.2) EnRoute task methods +-- +-- EnRoute tasks require the targets of the task need to be detected by the group (using its sensors) before the task can be executed: +-- +-- * @{#GROUP.EnRouteTaskAWACS}: (AIR) Aircraft will act as an AWACS for friendly units (will provide them with information about contacts). No parameters. +-- * @{#GROUP.EnRouteTaskEngageGroup}: (AIR) Engaging a group. The task does not assign the target group to the unit/group to attack now; it just allows the unit/group to engage the target group as well as other assigned targets. +-- * @{#GROUP.EnRouteTaskEngageTargets}: (AIR) Engaging targets of defined types. +-- * @{#GROUP.EnRouteTaskEWR}: (AIR) Attack the Unit. +-- * @{#GROUP.EnRouteTaskFAC}: (AIR + GROUND) The task makes the group/unit a FAC and lets the FAC to choose a targets (enemy ground group) around as well as other assigned targets. +-- * @{#GROUP.EnRouteTaskFAC_EngageGroup}: (AIR + GROUND) The task makes the group/unit a FAC and lets the FAC to choose the target (enemy ground group) as well as other assigned targets. +-- * @{#GROUP.EnRouteTaskTanker}: (AIR) Aircraft will act as a tanker for friendly units. No parameters. +-- +-- ### 1.2.3) Preparation task methods +-- +-- There are certain task methods that allow to tailor the task behaviour: +-- +-- * @{#GROUP.TaskWrappedAction}: Return a WrappedAction Task taking a Command. +-- * @{#GROUP.TaskCombo}: Return a Combo Task taking an array of Tasks. +-- * @{#GROUP.TaskCondition}: Return a condition section for a controlled task. +-- * @{#GROUP.TaskControlled}: Return a Controlled Task taking a Task and a TaskCondition. +-- +-- ### 1.2.4) Obtain the mission from group templates +-- +-- Group templates contain complete mission descriptions. Sometimes you want to copy a complete mission from a group and assign it to another: +-- +-- * @{#GROUP.TaskMission}: (AIR + GROUND) Return a mission task from a mission template. +-- +-- 1.3) GROUP Command methods +-- -------------------------- +-- Group **command methods** prepare the execution of commands using the @{#GROUP.SetCommand} method: +-- +-- * @{#GROUP.CommandDoScript}: Do Script command. +-- * @{#GROUP.CommandSwitchWayPoint}: Perform a switch waypoint command. +-- +-- 1.4) GROUP Option methods +-- ------------------------- +-- Group **Option methods** change the behaviour of the Group while being alive. +-- +-- ### 1.4.1) Rule of Engagement: +-- +-- * @{#GROUP.OptionROEWeaponFree} +-- * @{#GROUP.OptionROEOpenFire} +-- * @{#GROUP.OptionROEReturnFire} +-- * @{#GROUP.OptionROEEvadeFire} +-- +-- To check whether an ROE option is valid for a specific group, use: +-- +-- * @{#GROUP.OptionROEWeaponFreePossible} +-- * @{#GROUP.OptionROEOpenFirePossible} +-- * @{#GROUP.OptionROEReturnFirePossible} +-- * @{#GROUP.OptionROEEvadeFirePossible} +-- +-- ### 1.4.2) Rule on thread: +-- +-- * @{#GROUP.OptionROTNoReaction} +-- * @{#GROUP.OptionROTPassiveDefense} +-- * @{#GROUP.OptionROTEvadeFire} +-- * @{#GROUP.OptionROTVertical} +-- +-- To test whether an ROT option is valid for a specific group, use: +-- +-- * @{#GROUP.OptionROTNoReactionPossible} +-- * @{#GROUP.OptionROTPassiveDefensePossible} +-- * @{#GROUP.OptionROTEvadeFirePossible} +-- * @{#GROUP.OptionROTVerticalPossible} +-- +-- 1.5) GROUP Zone validation methods +-- ---------------------------------- +-- The group can be validated whether it is completely, partly or not within a @{Zone}. +-- Use the following Zone validation methods on the group: +-- +-- * @{#GROUP.IsCompletelyInZone}: Returns true if all units of the group are within a @{Zone}. +-- * @{#GROUP.IsPartlyInZone}: Returns true if some units of the group are within a @{Zone}. +-- * @{#GROUP.IsNotInZone}: Returns true if none of the group units of the group are within a @{Zone}. +-- +-- The zone can be of any @{Zone} class derived from @{Zone#ZONE_BASE}. So, these methods are polymorphic to the zones tested on. +-- +-- @module Group +-- @author FlightControl + +Include.File( "Routines" ) +Include.File( "Base" ) +Include.File( "Message" ) +Include.File( "Unit" ) + +--- The GROUP class +-- @type GROUP +-- @extends Base#BASE +-- @field DCSGroup#Group DCSGroup The DCS group class. +-- @field #string GroupName The name of the group. +GROUP = { + ClassName = "GROUP", + GroupName = "", + GroupID = 0, + Controller = nil, + DCSGroup = nil, + WayPointFunctions = {}, +} + +--- A DCSGroup +-- @type DCSGroup +-- @field id_ The ID of the group in DCS + +--- Create a new GROUP from a DCSGroup +-- @param #GROUP self +-- @param DCSGroup#Group GroupName The DCS Group name +-- @return #GROUP self +function GROUP:Register( GroupName ) + local self = BASE:Inherit( self, BASE:New() ) + self:F2( GroupName ) + self.GroupName = GroupName + return self +end + +-- Reference methods. + +--- Find the GROUP wrapper class instance using the DCS Group. +-- @param #GROUP self +-- @param DCSGroup#Group DCSGroup The DCS Group. +-- @return #GROUP The GROUP. +function GROUP:Find( DCSGroup ) + + local GroupName = DCSGroup:getName() -- Group#GROUP + local GroupFound = _DATABASE:FindGroup( GroupName ) + return GroupFound +end + +--- Find the created GROUP using the DCS Group Name. +-- @param #GROUP self +-- @param #string GroupName The DCS Group Name. +-- @return #GROUP The GROUP. +function GROUP:FindByName( GroupName ) + + local GroupFound = _DATABASE:FindGroup( GroupName ) + return GroupFound +end + +-- DCS Group methods support. + +--- Returns the DCS Group. +-- @param #GROUP self +-- @return DCSGroup#Group The DCS Group. +function GROUP:GetDCSGroup() + local DCSGroup = Group.getByName( self.GroupName ) + + if DCSGroup then + return DCSGroup + end + + return nil +end + + +--- Returns if the DCS Group is alive. +-- When the group exists at run-time, this method will return true, otherwise false. +-- @param #GROUP self +-- @return #boolean true if the DCS Group is alive. +function GROUP:IsAlive() + self:F2( self.GroupName ) + + local DCSGroup = self:GetDCSGroup() + + if DCSGroup then + local GroupIsAlive = DCSGroup:isExist() + self:T3( GroupIsAlive ) + return GroupIsAlive + end + + return nil +end + +--- Destroys the DCS Group and all of its DCS Units. +-- Note that this destroy method also raises a destroy event at run-time. +-- So all event listeners will catch the destroy event of this DCS Group. +-- @param #GROUP self +function GROUP:Destroy() + self:F2( self.GroupName ) + + local DCSGroup = self:GetDCSGroup() + + if DCSGroup then + for Index, UnitData in pairs( DCSGroup:getUnits() ) do + self:CreateEventCrash( timer.getTime(), UnitData ) + end + DCSGroup:destroy() + DCSGroup = nil + end + + return nil +end + +--- Returns category of the DCS Group. +-- @param #GROUP self +-- @return DCSGroup#Group.Category The category ID +function GROUP:GetCategory() + self:F2( self.GroupName ) + + local DCSGroup = self:GetDCSGroup() + if DCSGroup then + local GroupCategory = DCSGroup:getCategory() + self:T3( GroupCategory ) + return GroupCategory + end + + return nil +end + +--- Returns the category name of the DCS Group. +-- @param #GROUP self +-- @return #string Category name = Helicopter, Airplane, Ground Unit, Ship +function GROUP:GetCategoryName() + self:F2( self.GroupName ) + + local DCSGroup = self:GetDCSGroup() + if DCSGroup then + local CategoryNames = { + [Group.Category.AIRPLANE] = "Airplane", + [Group.Category.HELICOPTER] = "Helicopter", + [Group.Category.GROUND] = "Ground Unit", + [Group.Category.SHIP] = "Ship", + } + local GroupCategory = DCSGroup:getCategory() + self:T3( GroupCategory ) + + return CategoryNames[GroupCategory] + end + + return nil +end + + +--- Returns the coalition of the DCS Group. +-- @param #GROUP self +-- @return DCSCoalitionObject#coalition.side The coalition side of the DCS Group. +function GROUP:GetCoalition() + self:F2( self.GroupName ) + + local DCSGroup = self:GetDCSGroup() + if DCSGroup then + local GroupCoalition = DCSGroup:getCoalition() + self:T3( GroupCoalition ) + return GroupCoalition + end + + return nil +end + +--- Returns the country of the DCS Group. +-- @param #GROUP self +-- @return DCScountry#country.id The country identifier. +-- @return #nil The DCS Group is not existing or alive. +function GROUP:GetCountry() + self:F2( self.GroupName ) + + local DCSGroup = self:GetDCSGroup() + if DCSGroup then + local GroupCountry = DCSGroup:getUnit(1):getCountry() + self:T3( GroupCountry ) + return GroupCountry + end + + return nil +end + +--- Returns the name of the DCS Group. +-- @param #GROUP self +-- @return #string The DCS Group name. +function GROUP:GetName() + self:F2( self.GroupName ) + + local DCSGroup = self:GetDCSGroup() + + if DCSGroup then + local GroupName = DCSGroup:getName() + self:T3( GroupName ) + return GroupName + end + + return nil +end + +--- Returns the DCS Group identifier. +-- @param #GROUP self +-- @return #number The identifier of the DCS Group. +function GROUP:GetID() + self:F2( self.GroupName ) + + local DCSGroup = self:GetDCSGroup() + + if DCSGroup then + local GroupID = DCSGroup:getID() + self:T3( GroupID ) + return GroupID + end + + return nil +end + +--- Returns the UNIT wrapper class with number UnitNumber. +-- If the underlying DCS Unit does not exist, the method will return nil. . +-- @param #GROUP self +-- @param #number UnitNumber The number of the UNIT wrapper class to be returned. +-- @return Unit#UNIT The UNIT wrapper class. +function GROUP:GetUnit( UnitNumber ) + self:F2( { self.GroupName, UnitNumber } ) + + local DCSGroup = self:GetDCSGroup() + + if DCSGroup then + local UnitFound = UNIT:Find( DCSGroup:getUnit( UnitNumber ) ) + self:T3( UnitFound.UnitName ) + self:T2( UnitFound ) + return UnitFound + end + + return nil +end + +--- Returns the DCS Unit with number UnitNumber. +-- If the underlying DCS Unit does not exist, the method will return nil. . +-- @param #GROUP self +-- @param #number UnitNumber The number of the DCS Unit to be returned. +-- @return DCSUnit#Unit The DCS Unit. +function GROUP:GetDCSUnit( UnitNumber ) + self:F2( { self.GroupName, UnitNumber } ) + + local DCSGroup = self:GetDCSGroup() + + if DCSGroup then + local DCSUnitFound = DCSGroup:getUnit( UnitNumber ) + self:T3( DCSUnitFound ) + return DCSUnitFound + end + + return nil +end + +--- Returns current size of the DCS Group. +-- If some of the DCS Units of the DCS Group are destroyed the size of the DCS Group is changed. +-- @param #GROUP self +-- @return #number The DCS Group size. +function GROUP:GetSize() + self:F2( { self.GroupName } ) + local DCSGroup = self:GetDCSGroup() + + if DCSGroup then + local GroupSize = DCSGroup:getSize() + self:T3( GroupSize ) + return GroupSize + end + + return nil +end + +--- +--- Returns the initial size of the DCS Group. +-- If some of the DCS Units of the DCS Group are destroyed, the initial size of the DCS Group is unchanged. +-- @param #GROUP self +-- @return #number The DCS Group initial size. +function GROUP:GetInitialSize() + self:F2( { self.GroupName } ) + local DCSGroup = self:GetDCSGroup() + + if DCSGroup then + local GroupInitialSize = DCSGroup:getInitialSize() + self:T3( GroupInitialSize ) + return GroupInitialSize + end + + return nil +end + +--- Returns the UNITs wrappers of the DCS Units of the DCS Group. +-- @param #GROUP self +-- @return #table The UNITs wrappers. +function GROUP:GetUnits() + self:F2( { self.GroupName } ) + local DCSGroup = self:GetDCSGroup() + + if DCSGroup then + local DCSUnits = DCSGroup:getUnits() + local Units = {} + for Index, UnitData in pairs( DCSUnits ) do + Units[#Units+1] = UNIT:Find( UnitData ) + end + self:T3( Units ) + return Units + end + + return nil +end + + +--- Returns the DCS Units of the DCS Group. +-- @param #GROUP self +-- @return #table The DCS Units. +function GROUP:GetDCSUnits() + self:F2( { self.GroupName } ) + local DCSGroup = self:GetDCSGroup() + + if DCSGroup then + local DCSUnits = DCSGroup:getUnits() + self:T3( DCSUnits ) + return DCSUnits + end + + return nil +end + +--- Get the controller for the GROUP. +-- @param #GROUP self +-- @return DCSController#Controller +function GROUP:_GetController() + self:F2( { self.GroupName } ) + local DCSGroup = self:GetDCSGroup() + + if DCSGroup then + local GroupController = DCSGroup:getController() + self:T3( GroupController ) + return GroupController + end + + return nil +end + + +--- Retrieve the group mission and allow to place function hooks within the mission waypoint plan. +-- Use the method @{Group#GROUP:WayPointFunction} to define the hook functions for specific waypoints. +-- Use the method @{Group@GROUP:WayPointExecute) to start the execution of the new mission plan. +-- Note that when WayPointInitialize is called, the Mission of the group is RESTARTED! +-- @param #GROUP self +-- @return #GROUP +function GROUP:WayPointInitialize() + + self.WayPoints = self:GetTaskRoute() + + return self +end + + +--- Registers a waypoint function that will be executed when the group moves over the WayPoint. +-- @param #GROUP self +-- @param #number WayPoint The waypoint number. Note that the start waypoint on the route is WayPoint 1! +-- @param #number WayPointIndex When defining multiple WayPoint functions for one WayPoint, use WayPointIndex to set the sequence of actions. +-- @param #function WayPointFunction The waypoint function to be called when the group moves over the waypoint. The waypoint function takes variable parameters. +-- @return #GROUP +function GROUP:WayPointFunction( WayPoint, WayPointIndex, WayPointFunction, ... ) + self:F2( { WayPoint, WayPointIndex, WayPointFunction } ) + + table.insert( self.WayPoints[WayPoint].task.params.tasks, WayPointIndex ) + self.WayPoints[WayPoint].task.params.tasks[WayPointIndex] = self:TaskFunction( WayPoint, WayPointIndex, WayPointFunction, arg ) + return self +end + + +function GROUP:TaskFunction( WayPoint, WayPointIndex, FunctionString, FunctionArguments ) + + local DCSTask + + local DCSScript = {} + DCSScript[#DCSScript+1] = "local MissionGroup = GROUP:Find( ... ) " + + if FunctionArguments.n > 0 then + DCSScript[#DCSScript+1] = FunctionString .. "( MissionGroup, " .. table.concat( FunctionArguments, "," ) .. ")" + else + DCSScript[#DCSScript+1] = FunctionString .. "( MissionGroup )" + end + + DCSTask = self:TaskWrappedAction( + self:CommandDoScript( + table.concat( DCSScript ) + ), WayPointIndex + ) + + self:T3( DCSTask ) + + return DCSTask + +end + + + +--- Executes the WayPoint plan. +-- The function gets a WayPoint parameter, that you can use to restart the mission at a specific WayPoint. +-- Note that when the WayPoint parameter is used, the new start mission waypoint of the group will be 1! +-- @param #GROUP self +-- @param #number WayPoint The WayPoint from where to execute the mission. +-- @param #number WaitTime The amount seconds to wait before initiating the mission. +-- @return #GROUP +function GROUP:WayPointExecute( WayPoint, WaitTime ) + + if not WayPoint then + WayPoint = 1 + end + + -- When starting the mission from a certain point, the TaskPoints need to be deleted before the given WayPoint. + for TaskPointID = 1, WayPoint - 1 do + table.remove( self.WayPoints, 1 ) + end + + self:T3( self.WayPoints ) + + self:SetTask( self:TaskRoute( self.WayPoints ), WaitTime ) + + return self +end + + +--- Activates a GROUP. +-- @param #GROUP self +function GROUP:Activate() + self:F2( { self.GroupName } ) + trigger.action.activateGroup( self:GetDCSGroup() ) + return self:GetDCSGroup() +end + + +--- Gets the type name of the group. +-- @param #GROUP self +-- @return #string The type name of the group. +function GROUP:GetTypeName() + self:F2( self.GroupName ) + + local DCSGroup = self:GetDCSGroup() + + if DCSGroup then + local GroupTypeName = DCSGroup:getUnit(1):getTypeName() + self:T3( GroupTypeName ) + return( GroupTypeName ) + end + + return nil +end + +--- Gets the CallSign of the first DCS Unit of the DCS Group. +-- @param #GROUP self +-- @return #string The CallSign of the first DCS Unit of the DCS Group. +function GROUP:GetCallsign() + self:F2( self.GroupName ) + + local DCSGroup = self:GetDCSGroup() + + if DCSGroup then + local GroupCallSign = DCSGroup:getUnit(1):getCallsign() + self:T3( GroupCallSign ) + return GroupCallSign + end + + return nil +end + +--- Returns the current point (Vec2 vector) of the first DCS Unit in the DCS Group. +-- @return DCSTypes#Vec2 Current Vec2 point of the first DCS Unit of the DCS Group. +function GROUP:GetPointVec2() + self:F2( self.GroupName ) + + local GroupPointVec2 = self:GetUnit(1):GetPointVec2() + self:T3( GroupPointVec2 ) + return GroupPointVec2 +end + +--- Returns the current point (Vec3 vector) of the first DCS Unit in the DCS Group. +-- @return DCSTypes#Vec3 Current Vec3 point of the first DCS Unit of the DCS Group. +function GROUP:GetPointVec3() + self:F2( self.GroupName ) + + local GroupPointVec3 = self:GetUnit(1):GetPointVec3() + self:T3( GroupPointVec3 ) + return GroupPointVec3 +end + + + +-- Is Zone Functions + +--- Returns true if all units of the group are within a @{Zone}. +-- @param #GROUP self +-- @param Zone#ZONE_BASE Zone The zone to test. +-- @return #boolean Returns true if the Group is completely within the @{Zone#ZONE_BASE} +function GROUP:IsCompletelyInZone( Zone ) + self:F2( { self.GroupName, Zone } ) + + for UnitID, UnitData in pairs( self:GetUnits() ) do + local Unit = UnitData -- Unit#UNIT + if Zone:IsPointVec3InZone( Unit:GetPointVec3() ) then + else + return false + end + end + + return true +end + +--- Returns true if some units of the group are within a @{Zone}. +-- @param #GROUP self +-- @param Zone#ZONE_BASE Zone The zone to test. +-- @return #boolean Returns true if the Group is completely within the @{Zone#ZONE_BASE} +function GROUP:IsPartlyInZone( Zone ) + self:F2( { self.GroupName, Zone } ) + + for UnitID, UnitData in pairs( self:GetUnits() ) do + local Unit = UnitData -- Unit#UNIT + if Zone:IsPointVec3InZone( Unit:GetPointVec3() ) then + return true + end + end + + return false +end + +--- Returns true if none of the group units of the group are within a @{Zone}. +-- @param #GROUP self +-- @param Zone#ZONE_BASE Zone The zone to test. +-- @return #boolean Returns true if the Group is completely within the @{Zone#ZONE_BASE} +function GROUP:IsNotInZone( Zone ) + self:F2( { self.GroupName, Zone } ) + + for UnitID, UnitData in pairs( self:GetUnits() ) do + local Unit = UnitData -- Unit#UNIT + if Zone:IsPointVec3InZone( Unit:GetPointVec3() ) then + return false + end + end + + return true +end + +--- Returns if the group is of an air category. +-- If the group is a helicopter or a plane, then this method will return true, otherwise false. +-- @param #GROUP self +-- @return #boolean Air category evaluation result. +function GROUP:IsAir() + self:F2( self.GroupName ) + + local DCSGroup = self:GetDCSGroup() + + if DCSGroup then + local IsAirResult = DCSGroup:getCategory() == Group.Category.AIRPLANE or DCSGroup:getCategory() == Group.Category.HELICOPTER + self:T3( IsAirResult ) + return IsAirResult + end + + return nil +end + +--- Returns if the DCS Group contains Helicopters. +-- @param #GROUP self +-- @return #boolean true if DCS Group contains Helicopters. +function GROUP:IsHelicopter() + self:F2( self.GroupName ) + + local DCSGroup = self:GetDCSGroup() + + if DCSGroup then + local GroupCategory = DCSGroup:getCategory() + self:T2( GroupCategory ) + return GroupCategory == Group.Category.HELICOPTER + end + + return nil +end + +--- Returns if the DCS Group contains AirPlanes. +-- @param #GROUP self +-- @return #boolean true if DCS Group contains AirPlanes. +function GROUP:IsAirPlane() + self:F2() + + local DCSGroup = self:GetDCSGroup() + + if DCSGroup then + local GroupCategory = DCSGroup:getCategory() + self:T2( GroupCategory ) + return GroupCategory == Group.Category.AIRPLANE + end + + return nil +end + +--- Returns if the DCS Group contains Ground troops. +-- @param #GROUP self +-- @return #boolean true if DCS Group contains Ground troops. +function GROUP:IsGround() + self:F2() + + local DCSGroup = self:GetDCSGroup() + + if DCSGroup then + local GroupCategory = DCSGroup:getCategory() + self:T2( GroupCategory ) + return GroupCategory == Group.Category.GROUND + end + + return nil +end + +--- Returns if the DCS Group contains Ships. +-- @param #GROUP self +-- @return #boolean true if DCS Group contains Ships. +function GROUP:IsShip() + self:F2() + + local DCSGroup = self:GetDCSGroup() + + if DCSGroup then + local GroupCategory = DCSGroup:getCategory() + self:T2( GroupCategory ) + return GroupCategory == Group.Category.SHIP + end + + return nil +end + +--- Returns if all units of the group are on the ground or landed. +-- If all units of this group are on the ground, this function will return true, otherwise false. +-- @param #GROUP self +-- @return #boolean All units on the ground result. +function GROUP:AllOnGround() + self:F2() + + local DCSGroup = self:GetDCSGroup() + + if DCSGroup then + local AllOnGroundResult = true + + for Index, UnitData in pairs( DCSGroup:getUnits() ) do + if UnitData:inAir() then + AllOnGroundResult = false + end + end + + self:T3( AllOnGroundResult ) + return AllOnGroundResult + end + + return nil +end + +--- Returns the current maximum velocity of the group. +-- Each unit within the group gets evaluated, and the maximum velocity (= the unit which is going the fastest) is returned. +-- @param #GROUP self +-- @return #number Maximum velocity found. +function GROUP:GetMaxVelocity() + self:F2() + + local DCSGroup = self:GetDCSGroup() + + if DCSGroup then + local MaxVelocity = 0 + + for Index, UnitData in pairs( DCSGroup:getUnits() ) do + + local Velocity = UnitData:getVelocity() + local VelocityTotal = math.abs( Velocity.x ) + math.abs( Velocity.y ) + math.abs( Velocity.z ) + + if VelocityTotal < MaxVelocity then + MaxVelocity = VelocityTotal + end + end + + return MaxVelocity + end + + return nil +end + +--- Returns the current minimum height of the group. +-- Each unit within the group gets evaluated, and the minimum height (= the unit which is the lowest elevated) is returned. +-- @param #GROUP self +-- @return #number Minimum height found. +function GROUP:GetMinHeight() + self:F2() + +end + +--- Returns the current maximum height of the group. +-- Each unit within the group gets evaluated, and the maximum height (= the unit which is the highest elevated) is returned. +-- @param #GROUP self +-- @return #number Maximum height found. +function GROUP:GetMaxHeight() + self:F2() + +end + +-- Tasks + +--- Popping current Task from the group. +-- @param #GROUP self +-- @return Group#GROUP self +function GROUP:PopCurrentTask() + self:F2() + + local DCSGroup = self:GetDCSGroup() + + if DCSGroup then + local Controller = self:_GetController() + Controller:popTask() + return self + end + + return nil +end + +--- Pushing Task on the queue from the group. +-- @param #GROUP self +-- @return Group#GROUP self +function GROUP:PushTask( DCSTask, WaitTime ) + self:F2() + + local DCSGroup = self:GetDCSGroup() + + if DCSGroup then + local Controller = self:_GetController() + + -- When a group SPAWNs, it takes about a second to get the group in the simulator. Setting tasks to unspawned groups provides unexpected results. + -- Therefore we schedule the functions to set the mission and options for the Group. + -- Controller:pushTask( DCSTask ) + + if WaitTime then + --routines.scheduleFunction( Controller.pushTask, { Controller, DCSTask }, timer.getTime() + WaitTime ) + SCHEDULER:New( Controller, Controller.pushTask, { DCSTask }, WaitTime ) + else + Controller:pushTask( DCSTask ) + end + + return self + end + + return nil +end + +--- Clearing the Task Queue and Setting the Task on the queue from the group. +-- @param #GROUP self +-- @return Group#GROUP self +function GROUP:SetTask( DCSTask, WaitTime ) + self:F2( { DCSTask } ) + + local DCSGroup = self:GetDCSGroup() + + if DCSGroup then + + local Controller = self:_GetController() + + -- When a group SPAWNs, it takes about a second to get the group in the simulator. Setting tasks to unspawned groups provides unexpected results. + -- Therefore we schedule the functions to set the mission and options for the Group. + -- Controller.setTask( Controller, DCSTask ) + + if not WaitTime then + WaitTime = 1 + end + --routines.scheduleFunction( Controller.setTask, { Controller, DCSTask }, timer.getTime() + WaitTime ) + SCHEDULER:New( Controller, Controller.setTask, { DCSTask }, WaitTime ) + + return self + end + + return nil +end + + +--- Return a condition section for a controlled task. +-- @param #GROUP self +-- @param DCSTime#Time time +-- @param #string userFlag +-- @param #boolean userFlagValue +-- @param #string condition +-- @param DCSTime#Time duration +-- @param #number lastWayPoint +-- return DCSTask#Task +function GROUP:TaskCondition( time, userFlag, userFlagValue, condition, duration, lastWayPoint ) + self:F2( { time, userFlag, userFlagValue, condition, duration, lastWayPoint } ) + + local DCSStopCondition = {} + DCSStopCondition.time = time + DCSStopCondition.userFlag = userFlag + DCSStopCondition.userFlagValue = userFlagValue + DCSStopCondition.condition = condition + DCSStopCondition.duration = duration + DCSStopCondition.lastWayPoint = lastWayPoint + + self:T3( { DCSStopCondition } ) + return DCSStopCondition +end + +--- Return a Controlled Task taking a Task and a TaskCondition. +-- @param #GROUP self +-- @param DCSTask#Task DCSTask +-- @param #DCSStopCondition DCSStopCondition +-- @return DCSTask#Task +function GROUP:TaskControlled( DCSTask, DCSStopCondition ) + self:F2( { DCSTask, DCSStopCondition } ) + + local DCSTaskControlled + + DCSTaskControlled = { + id = 'ControlledTask', + params = { + task = DCSTask, + stopCondition = DCSStopCondition + } + } + + self:T3( { DCSTaskControlled } ) + return DCSTaskControlled +end + +--- Return a Combo Task taking an array of Tasks. +-- @param #GROUP self +-- @param DCSTask#TaskArray DCSTasks Array of @{DCSTask#Task} +-- @return DCSTask#Task +function GROUP:TaskCombo( DCSTasks ) + self:F2( { DCSTasks } ) + + local DCSTaskCombo + + DCSTaskCombo = { + id = 'ComboTask', + params = { + tasks = DCSTasks + } + } + + self:T3( { DCSTaskCombo } ) + return DCSTaskCombo +end + +--- Return a WrappedAction Task taking a Command. +-- @param #GROUP self +-- @param DCSCommand#Command DCSCommand +-- @return DCSTask#Task +function GROUP:TaskWrappedAction( DCSCommand, Index ) + self:F2( { DCSCommand } ) + + local DCSTaskWrappedAction + + DCSTaskWrappedAction = { + id = "WrappedAction", + enabled = true, + number = Index, + auto = false, + params = { + action = DCSCommand, + }, + } + + self:T3( { DCSTaskWrappedAction } ) + return DCSTaskWrappedAction +end + +--- Executes a command action +-- @param #GROUP self +-- @param DCSCommand#Command DCSCommand +-- @return #GROUP self +function GROUP:SetCommand( DCSCommand ) + self:F2( DCSCommand ) + + local DCSGroup = self:GetDCSGroup() + + if DCSGroup then + local Controller = self:_GetController() + Controller:setCommand( DCSCommand ) + return self + end + + return nil +end + +--- Perform a switch waypoint command +-- @param #GROUP self +-- @param #number FromWayPoint +-- @param #number ToWayPoint +-- @return DCSTask#Task +function GROUP:CommandSwitchWayPoint( FromWayPoint, ToWayPoint, Index ) + self:F2( { FromWayPoint, ToWayPoint, Index } ) + + local CommandSwitchWayPoint = { + id = 'SwitchWaypoint', + params = { + fromWaypointIndex = FromWayPoint, + goToWaypointIndex = ToWayPoint, + }, + } + + self:T3( { CommandSwitchWayPoint } ) + return CommandSwitchWayPoint +end + + +-- TASKS FOR AIR GROUPS + + +--- (AIR) Attack a Group. +-- @param #GROUP self +-- @param Group#GROUP AttackGroup The Group to be attacked. +-- @param #number WeaponType (optional) Bitmask of weapon types those allowed to use. If parameter is not defined that means no limits on weapon usage. +-- @param DCSTypes#AI.Task.WeaponExpend WeaponExpend (optional) Determines how much weapon will be released at each attack. If parameter is not defined the unit / group will choose expend on its own discretion. +-- @param #number AttackQty (optional) This parameter limits maximal quantity of attack. The aicraft/group will not make more attack than allowed even if the target group not destroyed and the aicraft/group still have ammo. If not defined the aircraft/group will attack target until it will be destroyed or until the aircraft/group will run out of ammo. +-- @param DCSTypes#Azimuth Direction (optional) Desired ingress direction from the target to the attacking aircraft. Group/aircraft will make its attacks from the direction. Of course if there is no way to attack from the direction due the terrain group/aircraft will choose another direction. +-- @param DCSTypes#Distance Altitude (optional) Desired attack start altitude. Group/aircraft will make its attacks from the altitude. If the altitude is too low or too high to use weapon aircraft/group will choose closest altitude to the desired attack start altitude. If the desired altitude is defined group/aircraft will not attack from safe altitude. +-- @param #boolean AttackQtyLimit (optional) The flag determines how to interpret attackQty parameter. If the flag is true then attackQty is a limit on maximal attack quantity for "AttackGroup" and "AttackUnit" tasks. If the flag is false then attackQty is a desired attack quantity for "Bombing" and "BombingRunway" tasks. +-- @return DCSTask#Task The DCS task structure. +function GROUP:TaskAttackGroup( AttackGroup, WeaponType, WeaponExpend, AttackQty, Direction, Altitude, AttackQtyLimit ) + self:F2( { self.GroupName, AttackGroup, WeaponType, WeaponExpend, AttackQty, Direction, Altitude, AttackQtyLimit } ) + + -- AttackGroup = { + -- id = 'AttackGroup', + -- params = { + -- groupId = Group.ID, + -- weaponType = number, + -- expend = enum AI.Task.WeaponExpend, + -- attackQty = number, + -- directionEnabled = boolean, + -- direction = Azimuth, + -- altitudeEnabled = boolean, + -- altitude = Distance, + -- attackQtyLimit = boolean, + -- } + -- } + + local DirectionEnabled = nil + if Direction then + DirectionEnabled = true + end + + local AltitudeEnabled = nil + if Altitude then + AltitudeEnabled = true + end + + local DCSTask + DCSTask = { id = 'AttackGroup', + params = { + groupId = AttackGroup:GetID(), + weaponType = WeaponType, + expend = WeaponExpend, + attackQty = AttackQty, + directionEnabled = DirectionEnabled, + direction = Direction, + altitudeEnabled = AltitudeEnabled, + altitude = Altitude, + attackQtyLimit = AttackQtyLimit, + }, + }, + + self:T3( { DCSTask } ) + return DCSTask +end + + +--- (AIR) Attack the Unit. +-- @param #GROUP self +-- @param Unit#UNIT AttackUnit The unit. +-- @param #number WeaponType (optional) Bitmask of weapon types those allowed to use. If parameter is not defined that means no limits on weapon usage. +-- @param DCSTypes#AI.Task.WeaponExpend WeaponExpend (optional) Determines how much weapon will be released at each attack. If parameter is not defined the unit / group will choose expend on its own discretion. +-- @param #number AttackQty (optional) This parameter limits maximal quantity of attack. The aicraft/group will not make more attack than allowed even if the target group not destroyed and the aicraft/group still have ammo. If not defined the aircraft/group will attack target until it will be destroyed or until the aircraft/group will run out of ammo. +-- @param DCSTypes#Azimuth Direction (optional) Desired ingress direction from the target to the attacking aircraft. Group/aircraft will make its attacks from the direction. Of course if there is no way to attack from the direction due the terrain group/aircraft will choose another direction. +-- @param #boolean AttackQtyLimit (optional) The flag determines how to interpret attackQty parameter. If the flag is true then attackQty is a limit on maximal attack quantity for "AttackGroup" and "AttackUnit" tasks. If the flag is false then attackQty is a desired attack quantity for "Bombing" and "BombingRunway" tasks. +-- @param #boolean GroupAttack (optional) Flag indicates that the target must be engaged by all aircrafts of the group. Has effect only if the task is assigned to a group, not to a single aircraft. +-- @return DCSTask#Task The DCS task structure. +function GROUP:TaskAttackUnit( AttackUnit, WeaponType, WeaponExpend, AttackQty, Direction, AttackQtyLimit, GroupAttack ) + self:F2( { self.GroupName, AttackUnit, WeaponType, WeaponExpend, AttackQty, Direction, AttackQtyLimit, GroupAttack } ) + + -- AttackUnit = { + -- id = 'AttackUnit', + -- params = { + -- unitId = Unit.ID, + -- weaponType = number, + -- expend = enum AI.Task.WeaponExpend + -- attackQty = number, + -- direction = Azimuth, + -- attackQtyLimit = boolean, + -- groupAttack = boolean, + -- } + -- } + + local DCSTask + DCSTask = { id = 'AttackUnit', + params = { + unitId = AttackUnit:GetID(), + weaponType = WeaponType, + expend = WeaponExpend, + attackQty = AttackQty, + direction = Direction, + attackQtyLimit = AttackQtyLimit, + groupAttack = GroupAttack, + }, + }, + + self:T3( { DCSTask } ) + return DCSTask +end + + +--- (AIR) Delivering weapon at the point on the ground. +-- @param #GROUP self +-- @param DCSTypes#Vec2 PointVec2 2D-coordinates of the point to deliver weapon at. +-- @param #number WeaponType (optional) Bitmask of weapon types those allowed to use. If parameter is not defined that means no limits on weapon usage. +-- @param DCSTypes#AI.Task.WeaponExpend WeaponExpend (optional) Determines how much weapon will be released at each attack. If parameter is not defined the unit / group will choose expend on its own discretion. +-- @param #number AttackQty (optional) Desired quantity of passes. The parameter is not the same in AttackGroup and AttackUnit tasks. +-- @param DCSTypes#Azimuth Direction (optional) Desired ingress direction from the target to the attacking aircraft. Group/aircraft will make its attacks from the direction. Of course if there is no way to attack from the direction due the terrain group/aircraft will choose another direction. +-- @param #boolean GroupAttack (optional) Flag indicates that the target must be engaged by all aircrafts of the group. Has effect only if the task is assigned to a group, not to a single aircraft. +-- @return DCSTask#Task The DCS task structure. +function GROUP:TaskBombing( PointVec2, WeaponType, WeaponExpend, AttackQty, Direction, GroupAttack ) + self:F2( { self.GroupName, PointVec2, WeaponType, WeaponExpend, AttackQty, Direction, GroupAttack } ) + +-- Bombing = { +-- id = 'Bombing', +-- params = { +-- point = Vec2, +-- weaponType = number, +-- expend = enum AI.Task.WeaponExpend, +-- attackQty = number, +-- direction = Azimuth, +-- groupAttack = boolean, +-- } +-- } + + local DCSTask + DCSTask = { id = 'Bombing', + params = { + point = PointVec2, + weaponType = WeaponType, + expend = WeaponExpend, + attackQty = AttackQty, + direction = Direction, + groupAttack = GroupAttack, + }, + }, + + self:T3( { DCSTask } ) + return DCSTask +end + +--- (AIR) Orbit at a specified position at a specified alititude during a specified duration with a specified speed. +-- @param #GROUP self +-- @param DCSTypes#Vec2 Point The point to hold the position. +-- @param #number Altitude The altitude to hold the position. +-- @param #number Speed The speed flying when holding the position. +-- @return #GROUP self +function GROUP:TaskOrbitCircleAtVec2( Point, Altitude, Speed ) + self:F2( { self.GroupName, Point, Altitude, Speed } ) + + -- pattern = enum AI.Task.OribtPattern, + -- point = Vec2, + -- point2 = Vec2, + -- speed = Distance, + -- altitude = Distance + + local LandHeight = land.getHeight( Point ) + + self:T3( { LandHeight } ) + + local DCSTask = { id = 'Orbit', + params = { pattern = AI.Task.OrbitPattern.CIRCLE, + point = Point, + speed = Speed, + altitude = Altitude + LandHeight + } + } + + + -- local AITask = { id = 'ControlledTask', + -- params = { task = { id = 'Orbit', + -- params = { pattern = AI.Task.OrbitPattern.CIRCLE, + -- point = Point, + -- speed = Speed, + -- altitude = Altitude + LandHeight + -- } + -- }, + -- stopCondition = { duration = Duration + -- } + -- } + -- } + -- ) + + return DCSTask +end + +--- (AIR) Orbit at the current position of the first unit of the group at a specified alititude. +-- @param #GROUP self +-- @param #number Altitude The altitude to hold the position. +-- @param #number Speed The speed flying when holding the position. +-- @return #GROUP self +function GROUP:TaskOrbitCircle( Altitude, Speed ) + self:F2( { self.GroupName, Altitude, Speed } ) + + local DCSGroup = self:GetDCSGroup() + + if DCSGroup then + local GroupPoint = self:GetPointVec2() + return self:TaskOrbitCircleAtVec2( GroupPoint, Altitude, Speed ) + end + + return nil +end + + + +--- (AIR) Hold position at the current position of the first unit of the group. +-- @param #GROUP self +-- @param #number Duration The maximum duration in seconds to hold the position. +-- @return #GROUP self +function GROUP:TaskHoldPosition() + self:F2( { self.GroupName } ) + + return self:TaskOrbitCircle( 30, 10 ) +end + + + + +--- (AIR) Attacking the map object (building, structure, e.t.c). +-- @param #GROUP self +-- @param DCSTypes#Vec2 PointVec2 2D-coordinates of the point the map object is closest to. The distance between the point and the map object must not be greater than 2000 meters. Object id is not used here because Mission Editor doesn't support map object identificators. +-- @param #number WeaponType (optional) Bitmask of weapon types those allowed to use. If parameter is not defined that means no limits on weapon usage. +-- @param DCSTypes#AI.Task.WeaponExpend WeaponExpend (optional) Determines how much weapon will be released at each attack. If parameter is not defined the unit / group will choose expend on its own discretion. +-- @param #number AttackQty (optional) This parameter limits maximal quantity of attack. The aicraft/group will not make more attack than allowed even if the target group not destroyed and the aicraft/group still have ammo. If not defined the aircraft/group will attack target until it will be destroyed or until the aircraft/group will run out of ammo. +-- @param DCSTypes#Azimuth Direction (optional) Desired ingress direction from the target to the attacking aircraft. Group/aircraft will make its attacks from the direction. Of course if there is no way to attack from the direction due the terrain group/aircraft will choose another direction. +-- @param #boolean GroupAttack (optional) Flag indicates that the target must be engaged by all aircrafts of the group. Has effect only if the task is assigned to a group, not to a single aircraft. +-- @return DCSTask#Task The DCS task structure. +function GROUP:TaskAttackMapObject( PointVec2, WeaponType, WeaponExpend, AttackQty, Direction, GroupAttack ) + self:F2( { self.GroupName, PointVec2, WeaponType, WeaponExpend, AttackQty, Direction, GroupAttack } ) + +-- AttackMapObject = { +-- id = 'AttackMapObject', +-- params = { +-- point = Vec2, +-- weaponType = number, +-- expend = enum AI.Task.WeaponExpend, +-- attackQty = number, +-- direction = Azimuth, +-- groupAttack = boolean, +-- } +-- } + + local DCSTask + DCSTask = { id = 'AttackMapObject', + params = { + point = PointVec2, + weaponType = WeaponType, + expend = WeaponExpend, + attackQty = AttackQty, + direction = Direction, + groupAttack = GroupAttack, + }, + }, + + self:T3( { DCSTask } ) + return DCSTask +end + + +--- (AIR) Delivering weapon on the runway. +-- @param #GROUP self +-- @param Airbase#AIRBASE Airbase Airbase to attack. +-- @param #number WeaponType (optional) Bitmask of weapon types those allowed to use. If parameter is not defined that means no limits on weapon usage. +-- @param DCSTypes#AI.Task.WeaponExpend WeaponExpend (optional) Determines how much weapon will be released at each attack. If parameter is not defined the unit / group will choose expend on its own discretion. +-- @param #number AttackQty (optional) This parameter limits maximal quantity of attack. The aicraft/group will not make more attack than allowed even if the target group not destroyed and the aicraft/group still have ammo. If not defined the aircraft/group will attack target until it will be destroyed or until the aircraft/group will run out of ammo. +-- @param DCSTypes#Azimuth Direction (optional) Desired ingress direction from the target to the attacking aircraft. Group/aircraft will make its attacks from the direction. Of course if there is no way to attack from the direction due the terrain group/aircraft will choose another direction. +-- @param #boolean GroupAttack (optional) Flag indicates that the target must be engaged by all aircrafts of the group. Has effect only if the task is assigned to a group, not to a single aircraft. +-- @return DCSTask#Task The DCS task structure. +function GROUP:TaskBombingRunway( Airbase, WeaponType, WeaponExpend, AttackQty, Direction, GroupAttack ) + self:F2( { self.GroupName, Airbase, WeaponType, WeaponExpend, AttackQty, Direction, GroupAttack } ) + +-- BombingRunway = { +-- id = 'BombingRunway', +-- params = { +-- runwayId = AirdromeId, +-- weaponType = number, +-- expend = enum AI.Task.WeaponExpend, +-- attackQty = number, +-- direction = Azimuth, +-- groupAttack = boolean, +-- } +-- } + + local DCSTask + DCSTask = { id = 'BombingRunway', + params = { + point = Airbase:GetID(), + weaponType = WeaponType, + expend = WeaponExpend, + attackQty = AttackQty, + direction = Direction, + groupAttack = GroupAttack, + }, + }, + + self:T3( { DCSTask } ) + return DCSTask +end + + +--- (AIR) Refueling from the nearest tanker. No parameters. +-- @param #GROUP self +-- @return DCSTask#Task The DCS task structure. +function GROUP:TaskRefueling() + self:F2( { self.GroupName } ) + +-- Refueling = { +-- id = 'Refueling', +-- params = {} +-- } + + local DCSTask + DCSTask = { id = 'Refueling', + params = { + }, + }, + + self:T3( { DCSTask } ) + return DCSTask +end + + +--- (AIR HELICOPTER) Landing at the ground. For helicopters only. +-- @param #GROUP self +-- @param DCSTypes#Vec2 Point The point where to land. +-- @param #number Duration The duration in seconds to stay on the ground. +-- @return #GROUP self +function GROUP:TaskLandAtVec2( Point, Duration ) + self:F2( { self.GroupName, Point, Duration } ) + +-- Land = { +-- id= 'Land', +-- params = { +-- point = Vec2, +-- durationFlag = boolean, +-- duration = Time +-- } +-- } + + local DCSTask + if Duration and Duration > 0 then + DCSTask = { id = 'Land', + params = { + point = Point, + durationFlag = true, + duration = Duration, + }, + } + else + DCSTask = { id = 'Land', + params = { + point = Point, + durationFlag = false, + }, + } + end + + self:T3( DCSTask ) + return DCSTask +end + +--- (AIR) Land the group at a @{Zone#ZONE_RADIUS). +-- @param #GROUP self +-- @param Zone#ZONE Zone The zone where to land. +-- @param #number Duration The duration in seconds to stay on the ground. +-- @return #GROUP self +function GROUP:TaskLandAtZone( Zone, Duration, RandomPoint ) + self:F2( { self.GroupName, Zone, Duration, RandomPoint } ) + + local Point + if RandomPoint then + Point = Zone:GetRandomPointVec2() + else + Point = Zone:GetPointVec2() + end + + local DCSTask = self:TaskLandAtVec2( Point, Duration ) + + self:T3( DCSTask ) + return DCSTask +end + + + +--- (AIR) Following another airborne group. +-- The unit / group will follow lead unit of another group, wingmens of both groups will continue following their leaders. +-- If another group is on land the unit / group will orbit around. +-- @param #GROUP self +-- @param Group#GROUP FollowGroup The group to be followed. +-- @param DCSTypes#Vec3 PointVec3 Position of the unit / lead unit of the group relative lead unit of another group in frame reference oriented by course of lead unit of another group. If another group is on land the unit / group will orbit around. +-- @param #number LastWaypointIndex Detach waypoint of another group. Once reached the unit / group Follow task is finished. +-- @return DCSTask#Task The DCS task structure. +function GROUP:TaskFollow( FollowGroup, PointVec3, LastWaypointIndex ) + self:F2( { self.GroupName, FollowGroup, PointVec3, LastWaypointIndex } ) + +-- Follow = { +-- id = 'Follow', +-- params = { +-- groupId = Group.ID, +-- pos = Vec3, +-- lastWptIndexFlag = boolean, +-- lastWptIndex = number +-- } +-- } + + local LastWaypointIndexFlag = nil + if LastWaypointIndex then + LastWaypointIndexFlag = true + end + + local DCSTask + DCSTask = { id = 'Follow', + params = { + groupId = FollowGroup:GetID(), + pos = PointVec3, + lastWptIndexFlag = LastWaypointIndexFlag, + lastWptIndex = LastWaypointIndex, + }, + }, + + self:T3( { DCSTask } ) + return DCSTask +end + + +--- (AIR) Escort another airborne group. +-- The unit / group will follow lead unit of another group, wingmens of both groups will continue following their leaders. +-- The unit / group will also protect that group from threats of specified types. +-- @param #GROUP self +-- @param Group#GROUP EscortGroup The group to be escorted. +-- @param DCSTypes#Vec3 PointVec3 Position of the unit / lead unit of the group relative lead unit of another group in frame reference oriented by course of lead unit of another group. If another group is on land the unit / group will orbit around. +-- @param #number LastWaypointIndex Detach waypoint of another group. Once reached the unit / group Follow task is finished. +-- @param #number EngagementDistanceMax Maximal distance from escorted group to threat. If the threat is already engaged by escort escort will disengage if the distance becomes greater than 1.5 * engagementDistMax. +-- @param DCSTypes#AttributeNameArray TargetTypes Array of AttributeName that is contains threat categories allowed to engage. +-- @return DCSTask#Task The DCS task structure. +function GROUP:TaskEscort( FollowGroup, PointVec3, LastWaypointIndex, EngagementDistance, TargetTypes ) + self:F2( { self.GroupName, FollowGroup, PointVec3, LastWaypointIndex, EngagementDistance, TargetTypes } ) + +-- Escort = { +-- id = 'Escort', +-- params = { +-- groupId = Group.ID, +-- pos = Vec3, +-- lastWptIndexFlag = boolean, +-- lastWptIndex = number, +-- engagementDistMax = Distance, +-- targetTypes = array of AttributeName, +-- } +-- } + + local LastWaypointIndexFlag = nil + if LastWaypointIndex then + LastWaypointIndexFlag = true + end + + local DCSTask + DCSTask = { id = 'Follow', + params = { + groupId = FollowGroup:GetID(), + pos = PointVec3, + lastWptIndexFlag = LastWaypointIndexFlag, + lastWptIndex = LastWaypointIndex, + engagementDistMax = EngagementDistance, + targetTypes = TargetTypes, + }, + }, + + self:T3( { DCSTask } ) + return DCSTask +end + + +-- GROUND TASKS + +--- (GROUND) Fire at a VEC2 point until ammunition is finished. +-- @param #GROUP self +-- @param DCSTypes#Vec2 PointVec2 The point to fire at. +-- @param DCSTypes#Distance Radius The radius of the zone to deploy the fire at. +-- @return DCSTask#Task The DCS task structure. +function GROUP:TaskFireAtPoint( PointVec2, Radius ) + self:F2( { self.GroupName, PointVec2, Radius } ) + + -- FireAtPoint = { + -- id = 'FireAtPoint', + -- params = { + -- point = Vec2, + -- radius = Distance, + -- } + -- } + + local DCSTask + DCSTask = { id = 'FireAtPoint', + params = { + point = PointVec2, + radius = Radius, + } + } + + self:T3( { DCSTask } ) + return DCSTask +end + +--- (GROUND) Hold ground group from moving. +-- @param #GROUP self +-- @return DCSTask#Task The DCS task structure. +function GROUP:TaskHold() + self:F2( { self.GroupName } ) + +-- Hold = { +-- id = 'Hold', +-- params = { +-- } +-- } + + local DCSTask + DCSTask = { id = 'Hold', + params = { + } + } + + self:T3( { DCSTask } ) + return DCSTask +end + + +-- TASKS FOR AIRBORNE AND GROUND UNITS/GROUPS + +--- (AIR + GROUND) The task makes the group/unit a FAC and orders the FAC to control the target (enemy ground group) destruction. +-- The killer is player-controlled allied CAS-aircraft that is in contact with the FAC. +-- If the task is assigned to the group lead unit will be a FAC. +-- @param #GROUP self +-- @param Group#GROUP AttackGroup Target GROUP. +-- @param #number WeaponType Bitmask of weapon types those allowed to use. If parameter is not defined that means no limits on weapon usage. +-- @param DCSTypes#AI.Task.Designation Designation (optional) Designation type. +-- @param #boolean Datalink (optional) Allows to use datalink to send the target information to attack aircraft. Enabled by default. +-- @return DCSTask#Task The DCS task structure. +function GROUP:TaskFAC_AttackGroup( AttackGroup, WeaponType, Designation, Datalink ) + self:F2( { self.GroupName, AttackGroup, WeaponType, Designation, Datalink } ) + +-- FAC_AttackGroup = { +-- id = 'FAC_AttackGroup', +-- params = { +-- groupId = Group.ID, +-- weaponType = number, +-- designation = enum AI.Task.Designation, +-- datalink = boolean +-- } +-- } + + local DCSTask + DCSTask = { id = 'FAC_AttackGroup', + params = { + groupId = AttackGroup:GetID(), + weaponType = WeaponType, + designation = Designation, + datalink = Datalink, + } + } + + self:T3( { DCSTask } ) + return DCSTask +end + +-- EN-ROUTE TASKS FOR AIRBORNE GROUPS + +--- (AIR) Engaging targets of defined types. +-- @param #GROUP self +-- @param DCSTypes#Distance Distance Maximal distance from the target to a route leg. If the target is on a greater distance it will be ignored. +-- @param DCSTypes#AttributeNameArray TargetTypes Array of target categories allowed to engage. +-- @param #number Priority All enroute tasks have the priority parameter. This is a number (less value - higher priority) that determines actions related to what task will be performed first. +-- @return DCSTask#Task The DCS task structure. +function GROUP:EnRouteTaskEngageTargets( Distance, TargetTypes, Priority ) + self:F2( { self.GroupName, Distance, TargetTypes, Priority } ) + +-- EngageTargets ={ +-- id = 'EngageTargets', +-- params = { +-- maxDist = Distance, +-- targetTypes = array of AttributeName, +-- priority = number +-- } +-- } + + local DCSTask + DCSTask = { id = 'EngageTargets', + params = { + maxDist = Distance, + targetTypes = TargetTypes, + priority = Priority + } + } + + self:T3( { DCSTask } ) + return DCSTask +end + + + +--- (AIR) Engaging a targets of defined types at circle-shaped zone. +-- @param #GROUP self +-- @param DCSTypes#Vec2 PointVec2 2D-coordinates of the zone. +-- @param DCSTypes#Distance Radius Radius of the zone. +-- @param DCSTypes#AttributeNameArray TargetTypes Array of target categories allowed to engage. +-- @param #number Priority All en-route tasks have the priority parameter. This is a number (less value - higher priority) that determines actions related to what task will be performed first. +-- @return DCSTask#Task The DCS task structure. +function GROUP:EnRouteTaskEngageTargets( PointVec2, Radius, TargetTypes, Priority ) + self:F2( { self.GroupName, PointVec2, Radius, TargetTypes, Priority } ) + +-- EngageTargetsInZone = { +-- id = 'EngageTargetsInZone', +-- params = { +-- point = Vec2, +-- zoneRadius = Distance, +-- targetTypes = array of AttributeName, +-- priority = number +-- } +-- } + + local DCSTask + DCSTask = { id = 'EngageTargetsInZone', + params = { + point = PointVec2, + zoneRadius = Radius, + targetTypes = TargetTypes, + priority = Priority + } + } + + self:T3( { DCSTask } ) + return DCSTask +end + + +--- (AIR) Engaging a group. The task does not assign the target group to the unit/group to attack now; it just allows the unit/group to engage the target group as well as other assigned targets. +-- @param #GROUP self +-- @param Group#GROUP AttackGroup The Group to be attacked. +-- @param #number Priority All en-route tasks have the priority parameter. This is a number (less value - higher priority) that determines actions related to what task will be performed first. +-- @param #number WeaponType (optional) Bitmask of weapon types those allowed to use. If parameter is not defined that means no limits on weapon usage. +-- @param DCSTypes#AI.Task.WeaponExpend WeaponExpend (optional) Determines how much weapon will be released at each attack. If parameter is not defined the unit / group will choose expend on its own discretion. +-- @param #number AttackQty (optional) This parameter limits maximal quantity of attack. The aicraft/group will not make more attack than allowed even if the target group not destroyed and the aicraft/group still have ammo. If not defined the aircraft/group will attack target until it will be destroyed or until the aircraft/group will run out of ammo. +-- @param DCSTypes#Azimuth Direction (optional) Desired ingress direction from the target to the attacking aircraft. Group/aircraft will make its attacks from the direction. Of course if there is no way to attack from the direction due the terrain group/aircraft will choose another direction. +-- @param DCSTypes#Distance Altitude (optional) Desired attack start altitude. Group/aircraft will make its attacks from the altitude. If the altitude is too low or too high to use weapon aircraft/group will choose closest altitude to the desired attack start altitude. If the desired altitude is defined group/aircraft will not attack from safe altitude. +-- @param #boolean AttackQtyLimit (optional) The flag determines how to interpret attackQty parameter. If the flag is true then attackQty is a limit on maximal attack quantity for "AttackGroup" and "AttackUnit" tasks. If the flag is false then attackQty is a desired attack quantity for "Bombing" and "BombingRunway" tasks. +-- @return DCSTask#Task The DCS task structure. +function GROUP:EnRouteTaskEngageGroup( AttackGroup, Priority, WeaponType, WeaponExpend, AttackQty, Direction, Altitude, AttackQtyLimit ) + self:F2( { self.GroupName, AttackGroup, Priority, WeaponType, WeaponExpend, AttackQty, Direction, Altitude, AttackQtyLimit } ) + + -- EngageGroup = { + -- id = 'EngageGroup ', + -- params = { + -- groupId = Group.ID, + -- weaponType = number, + -- expend = enum AI.Task.WeaponExpend, + -- attackQty = number, + -- directionEnabled = boolean, + -- direction = Azimuth, + -- altitudeEnabled = boolean, + -- altitude = Distance, + -- attackQtyLimit = boolean, + -- priority = number, + -- } + -- } + + local DirectionEnabled = nil + if Direction then + DirectionEnabled = true + end + + local AltitudeEnabled = nil + if Altitude then + AltitudeEnabled = true + end + + local DCSTask + DCSTask = { id = 'EngageGroup', + params = { + groupId = AttackGroup:GetID(), + weaponType = WeaponType, + expend = WeaponExpend, + attackQty = AttackQty, + directionEnabled = DirectionEnabled, + direction = Direction, + altitudeEnabled = AltitudeEnabled, + altitude = Altitude, + attackQtyLimit = AttackQtyLimit, + priority = Priority, + }, + }, + + self:T3( { DCSTask } ) + return DCSTask +end + + +--- (AIR) Attack the Unit. +-- @param #GROUP self +-- @param Unit#UNIT AttackUnit The UNIT. +-- @param #number Priority All en-route tasks have the priority parameter. This is a number (less value - higher priority) that determines actions related to what task will be performed first. +-- @param #number WeaponType (optional) Bitmask of weapon types those allowed to use. If parameter is not defined that means no limits on weapon usage. +-- @param DCSTypes#AI.Task.WeaponExpend WeaponExpend (optional) Determines how much weapon will be released at each attack. If parameter is not defined the unit / group will choose expend on its own discretion. +-- @param #number AttackQty (optional) This parameter limits maximal quantity of attack. The aicraft/group will not make more attack than allowed even if the target group not destroyed and the aicraft/group still have ammo. If not defined the aircraft/group will attack target until it will be destroyed or until the aircraft/group will run out of ammo. +-- @param DCSTypes#Azimuth Direction (optional) Desired ingress direction from the target to the attacking aircraft. Group/aircraft will make its attacks from the direction. Of course if there is no way to attack from the direction due the terrain group/aircraft will choose another direction. +-- @param #boolean AttackQtyLimit (optional) The flag determines how to interpret attackQty parameter. If the flag is true then attackQty is a limit on maximal attack quantity for "AttackGroup" and "AttackUnit" tasks. If the flag is false then attackQty is a desired attack quantity for "Bombing" and "BombingRunway" tasks. +-- @param #boolean GroupAttack (optional) Flag indicates that the target must be engaged by all aircrafts of the group. Has effect only if the task is assigned to a group, not to a single aircraft. +-- @return DCSTask#Task The DCS task structure. +function GROUP:EnRouteTaskEngageUnit( AttackUnit, Priority, WeaponType, WeaponExpend, AttackQty, Direction, AttackQtyLimit, GroupAttack ) + self:F2( { self.GroupName, AttackUnit, Priority, WeaponType, WeaponExpend, AttackQty, Direction, AttackQtyLimit, GroupAttack } ) + + -- EngageUnit = { + -- id = 'EngageUnit', + -- params = { + -- unitId = Unit.ID, + -- weaponType = number, + -- expend = enum AI.Task.WeaponExpend + -- attackQty = number, + -- direction = Azimuth, + -- attackQtyLimit = boolean, + -- groupAttack = boolean, + -- priority = number, + -- } + -- } + + local DCSTask + DCSTask = { id = 'EngageUnit', + params = { + unitId = AttackUnit:GetID(), + weaponType = WeaponType, + expend = WeaponExpend, + attackQty = AttackQty, + direction = Direction, + attackQtyLimit = AttackQtyLimit, + groupAttack = GroupAttack, + priority = Priority, + }, + }, + + self:T3( { DCSTask } ) + return DCSTask +end + + + +--- (AIR) Aircraft will act as an AWACS for friendly units (will provide them with information about contacts). No parameters. +-- @param #GROUP self +-- @return DCSTask#Task The DCS task structure. +function GROUP:EnRouteTaskAWACS( ) + self:F2( { self.GroupName } ) + +-- AWACS = { +-- id = 'AWACS', +-- params = { +-- } +-- } + + local DCSTask + DCSTask = { id = 'AWACS', + params = { + } + } + + self:T3( { DCSTask } ) + return DCSTask +end + + +--- (AIR) Aircraft will act as a tanker for friendly units. No parameters. +-- @param #GROUP self +-- @return DCSTask#Task The DCS task structure. +function GROUP:EnRouteTaskTanker( ) + self:F2( { self.GroupName } ) + +-- Tanker = { +-- id = 'Tanker', +-- params = { +-- } +-- } + + local DCSTask + DCSTask = { id = 'Tanker', + params = { + } + } + + self:T3( { DCSTask } ) + return DCSTask +end + + +-- En-route tasks for ground units/groups + +--- (GROUND) Ground unit (EW-radar) will act as an EWR for friendly units (will provide them with information about contacts). No parameters. +-- @param #GROUP self +-- @return DCSTask#Task The DCS task structure. +function GROUP:EnRouteTaskEWR( ) + self:F2( { self.GroupName } ) + +-- EWR = { +-- id = 'EWR', +-- params = { +-- } +-- } + + local DCSTask + DCSTask = { id = 'EWR', + params = { + } + } + + self:T3( { DCSTask } ) + return DCSTask +end + + +-- En-route tasks for airborne and ground units/groups + +--- (AIR + GROUND) The task makes the group/unit a FAC and lets the FAC to choose the target (enemy ground group) as well as other assigned targets. +-- The killer is player-controlled allied CAS-aircraft that is in contact with the FAC. +-- If the task is assigned to the group lead unit will be a FAC. +-- @param #GROUP self +-- @param Group#GROUP AttackGroup Target GROUP. +-- @param #number Priority All en-route tasks have the priority parameter. This is a number (less value - higher priority) that determines actions related to what task will be performed first. +-- @param #number WeaponType Bitmask of weapon types those allowed to use. If parameter is not defined that means no limits on weapon usage. +-- @param DCSTypes#AI.Task.Designation Designation (optional) Designation type. +-- @param #boolean Datalink (optional) Allows to use datalink to send the target information to attack aircraft. Enabled by default. +-- @return DCSTask#Task The DCS task structure. +function GROUP:EnRouteTaskFAC_EngageGroup( AttackGroup, Priority, WeaponType, Designation, Datalink ) + self:F2( { self.GroupName, AttackGroup, WeaponType, Priority, Designation, Datalink } ) + +-- FAC_EngageGroup = { +-- id = 'FAC_EngageGroup', +-- params = { +-- groupId = Group.ID, +-- weaponType = number, +-- designation = enum AI.Task.Designation, +-- datalink = boolean, +-- priority = number, +-- } +-- } + + local DCSTask + DCSTask = { id = 'FAC_EngageGroup', + params = { + groupId = AttackGroup:GetID(), + weaponType = WeaponType, + designation = Designation, + datalink = Datalink, + priority = Priority, + } + } + + self:T3( { DCSTask } ) + return DCSTask +end + + +--- (AIR + GROUND) The task makes the group/unit a FAC and lets the FAC to choose a targets (enemy ground group) around as well as other assigned targets. +-- The killer is player-controlled allied CAS-aircraft that is in contact with the FAC. +-- If the task is assigned to the group lead unit will be a FAC. +-- @param #GROUP self +-- @param DCSTypes#Distance Radius The maximal distance from the FAC to a target. +-- @param #number Priority All en-route tasks have the priority parameter. This is a number (less value - higher priority) that determines actions related to what task will be performed first. +-- @return DCSTask#Task The DCS task structure. +function GROUP:EnRouteTaskFAC( Radius, Priority ) + self:F2( { self.GroupName, Radius, Priority } ) + +-- FAC = { +-- id = 'FAC', +-- params = { +-- radius = Distance, +-- priority = number +-- } +-- } + + local DCSTask + DCSTask = { id = 'FAC', + params = { + radius = Radius, + priority = Priority + } + } + + self:T3( { DCSTask } ) + return DCSTask +end + + + + +--- (AIR) Move the group to a Vec2 Point, wait for a defined duration and embark a group. +-- @param #GROUP self +-- @param DCSTypes#Vec2 Point The point where to wait. +-- @param #number Duration The duration in seconds to wait. +-- @param #GROUP EmbarkingGroup The group to be embarked. +-- @return DCSTask#Task The DCS task structure +function GROUP:TaskEmbarking( Point, Duration, EmbarkingGroup ) + self:F2( { self.GroupName, Point, Duration, EmbarkingGroup.DCSGroup } ) + + local DCSTask + DCSTask = { id = 'Embarking', + params = { x = Point.x, + y = Point.y, + duration = Duration, + groupsForEmbarking = { EmbarkingGroup.GroupID }, + durationFlag = true, + distributionFlag = false, + distribution = {}, + } + } + + self:T3( { DCSTask } ) + return DCSTask +end + +--- (GROUND) Embark to a Transport landed at a location. + +--- Move to a defined Vec2 Point, and embark to a group when arrived within a defined Radius. +-- @param #GROUP self +-- @param DCSTypes#Vec2 Point The point where to wait. +-- @param #number Radius The radius of the embarking zone around the Point. +-- @return DCSTask#Task The DCS task structure. +function GROUP:TaskEmbarkToTransport( Point, Radius ) + self:F2( { self.GroupName, Point, Radius } ) + + local DCSTask --DCSTask#Task + DCSTask = { id = 'EmbarkToTransport', + params = { x = Point.x, + y = Point.y, + zoneRadius = Radius, + } + } + + self:T3( { DCSTask } ) + return DCSTask +end + + + +--- (AIR + GROUND) Return a mission task from a mission template. +-- @param #GROUP self +-- @param #table TaskMission A table containing the mission task. +-- @return DCSTask#Task +function GROUP:TaskMission( TaskMission ) + self:F2( Points ) + + local DCSTask + DCSTask = { id = 'Mission', params = { TaskMission, }, } + + self:T3( { DCSTask } ) + return DCSTask +end + +--- Return a Misson task to follow a given route defined by Points. +-- @param #GROUP self +-- @param #table Points A table of route points. +-- @return DCSTask#Task +function GROUP:TaskRoute( Points ) + self:F2( Points ) + + local DCSTask + DCSTask = { id = 'Mission', params = { route = { points = Points, }, }, } + + self:T3( { DCSTask } ) + return DCSTask +end + +--- (AIR + GROUND) Make the Group move to fly to a given point. +-- @param #GROUP self +-- @param DCSTypes#Vec3 Point The destination point in Vec3 format. +-- @param #number Speed The speed to travel. +-- @return #GROUP self +function GROUP:TaskRouteToVec2( Point, Speed ) + self:F2( { Point, Speed } ) + + local GroupPoint = self:GetUnit( 1 ):GetPointVec2() + + local PointFrom = {} + PointFrom.x = GroupPoint.x + PointFrom.y = GroupPoint.y + PointFrom.type = "Turning Point" + PointFrom.action = "Turning Point" + PointFrom.speed = Speed + PointFrom.speed_locked = true + PointFrom.properties = { + ["vnav"] = 1, + ["scale"] = 0, + ["angle"] = 0, + ["vangle"] = 0, + ["steer"] = 2, + } + + + local PointTo = {} + PointTo.x = Point.x + PointTo.y = Point.y + PointTo.type = "Turning Point" + PointTo.action = "Fly Over Point" + PointTo.speed = Speed + PointTo.speed_locked = true + PointTo.properties = { + ["vnav"] = 1, + ["scale"] = 0, + ["angle"] = 0, + ["vangle"] = 0, + ["steer"] = 2, + } + + + local Points = { PointFrom, PointTo } + + self:T3( Points ) + + self:Route( Points ) + + return self +end + +--- (AIR + GROUND) Make the Group move to a given point. +-- @param #GROUP self +-- @param DCSTypes#Vec3 Point The destination point in Vec3 format. +-- @param #number Speed The speed to travel. +-- @return #GROUP self +function GROUP:TaskRouteToVec3( Point, Speed ) + self:F2( { Point, Speed } ) + + local GroupPoint = self:GetUnit( 1 ):GetPointVec3() + + local PointFrom = {} + PointFrom.x = GroupPoint.x + PointFrom.y = GroupPoint.z + PointFrom.alt = GroupPoint.y + PointFrom.alt_type = "BARO" + PointFrom.type = "Turning Point" + PointFrom.action = "Turning Point" + PointFrom.speed = Speed + PointFrom.speed_locked = true + PointFrom.properties = { + ["vnav"] = 1, + ["scale"] = 0, + ["angle"] = 0, + ["vangle"] = 0, + ["steer"] = 2, + } + + + local PointTo = {} + PointTo.x = Point.x + PointTo.y = Point.z + PointTo.alt = Point.y + PointTo.alt_type = "BARO" + PointTo.type = "Turning Point" + PointTo.action = "Fly Over Point" + PointTo.speed = Speed + PointTo.speed_locked = true + PointTo.properties = { + ["vnav"] = 1, + ["scale"] = 0, + ["angle"] = 0, + ["vangle"] = 0, + ["steer"] = 2, + } + + + local Points = { PointFrom, PointTo } + + self:T3( Points ) + + self:Route( Points ) + + return self +end + + + +--- Make the group to follow a given route. +-- @param #GROUP self +-- @param #table GoPoints A table of Route Points. +-- @return #GROUP self +function GROUP:Route( GoPoints ) + self:F2( GoPoints ) + + local DCSGroup = self:GetDCSGroup() + + if DCSGroup then + local Points = routines.utils.deepCopy( GoPoints ) + local MissionTask = { id = 'Mission', params = { route = { points = Points, }, }, } + local Controller = self:_GetController() + --Controller.setTask( Controller, MissionTask ) + --routines.scheduleFunction( Controller.setTask, { Controller, MissionTask}, timer.getTime() + 1 ) + SCHEDULER:New( Controller, Controller.setTask, { MissionTask }, 1 ) + return self + end + + return nil +end + + + +--- (AIR + GROUND) Route the group to a given zone. +-- The group final destination point can be randomized. +-- A speed can be given in km/h. +-- A given formation can be given. +-- @param #GROUP self +-- @param Zone#ZONE Zone The zone where to route to. +-- @param #boolean Randomize Defines whether to target point gets randomized within the Zone. +-- @param #number Speed The speed. +-- @param Base#FORMATION Formation The formation string. +function GROUP:TaskRouteToZone( Zone, Randomize, Speed, Formation ) + self:F2( Zone ) + + local DCSGroup = self:GetDCSGroup() + + if DCSGroup then + + local GroupPoint = self:GetPointVec2() + + local PointFrom = {} + PointFrom.x = GroupPoint.x + PointFrom.y = GroupPoint.y + PointFrom.type = "Turning Point" + PointFrom.action = "Cone" + PointFrom.speed = 20 / 1.6 + + + local PointTo = {} + local ZonePoint + + if Randomize then + ZonePoint = Zone:GetRandomPointVec2() + else + ZonePoint = Zone:GetPointVec2() + end + + PointTo.x = ZonePoint.x + PointTo.y = ZonePoint.y + PointTo.type = "Turning Point" + + if Formation then + PointTo.action = Formation + else + PointTo.action = "Cone" + end + + if Speed then + PointTo.speed = Speed + else + PointTo.speed = 20 / 1.6 + end + + local Points = { PointFrom, PointTo } + + self:T3( Points ) + + self:Route( Points ) + + return self + end + + return nil +end + +-- Commands + +--- Do Script command +-- @param #GROUP self +-- @param #string DoScript +-- @return #DCSCommand +function GROUP:CommandDoScript( DoScript ) + + local DCSDoScript = { + id = "Script", + params = { + command = DoScript, + }, + } + + self:T3( DCSDoScript ) + return DCSDoScript +end + + +--- Return the mission template of the group. +-- @param #GROUP self +-- @return #table The MissionTemplate +function GROUP:GetTaskMission() + self:F2( self.GroupName ) + + return routines.utils.deepCopy( _DATABASE.Templates.Groups[self.GroupName].Template ) +end + +--- Return the mission route of the group. +-- @param #GROUP self +-- @return #table The mission route defined by points. +function GROUP:GetTaskRoute() + self:F2( self.GroupName ) + + return routines.utils.deepCopy( _DATABASE.Templates.Groups[self.GroupName].Template.route.points ) +end + +--- Return the route of a group by using the @{Database#DATABASE} class. +-- @param #GROUP self +-- @param #number Begin The route point from where the copy will start. The base route point is 0. +-- @param #number End The route point where the copy will end. The End point is the last point - the End point. The last point has base 0. +-- @param #boolean Randomize Randomization of the route, when true. +-- @param #number Radius When randomization is on, the randomization is within the radius. +function GROUP:CopyRoute( Begin, End, Randomize, Radius ) + self:F2( { Begin, End } ) + + local Points = {} + + -- Could be a Spawned Group + local GroupName = string.match( self:GetName(), ".*#" ) + if GroupName then + GroupName = GroupName:sub( 1, -2 ) + else + GroupName = self:GetName() + end + + self:T3( { GroupName } ) + + local Template = _DATABASE.Templates.Groups[GroupName].Template + + if Template then + if not Begin then + Begin = 0 + end + if not End then + End = 0 + end + + for TPointID = Begin + 1, #Template.route.points - End do + if Template.route.points[TPointID] then + Points[#Points+1] = routines.utils.deepCopy( Template.route.points[TPointID] ) + if Randomize then + if not Radius then + Radius = 500 + end + Points[#Points].x = Points[#Points].x + math.random( Radius * -1, Radius ) + Points[#Points].y = Points[#Points].y + math.random( Radius * -1, Radius ) + end + end + end + return Points + end + + return nil +end + + +function GROUP:GetDetectedTargets() + self:F2( self.GroupName ) + + local DCSGroup = self:GetDCSGroup() + if DCSGroup then + return self:_GetController():getDetectedTargets() + end + + return nil +end + +function GROUP:IsTargetDetected( DCSObject ) + self:F2( self.GroupName ) + + local DCSGroup = self:GetDCSGroup() + if DCSGroup then + + local TargetIsDetected, TargetIsVisible, TargetLastTime, TargetKnowType, TargetKnowDistance, TargetLastPos, TargetLastVelocity + = self:_GetController().isTargetDetected( self:_GetController(), DCSObject, + Controller.Detection.VISUAL, + Controller.Detection.OPTIC, + Controller.Detection.RADAR, + Controller.Detection.IRST, + Controller.Detection.RWR, + Controller.Detection.DLINK + ) + return TargetIsDetected, TargetIsVisible, TargetLastTime, TargetKnowType, TargetKnowDistance, TargetLastPos, TargetLastVelocity + end + + return nil +end + +-- Options + +--- Can the GROUP hold their weapons? +-- @param #GROUP self +-- @return #boolean +function GROUP:OptionROEHoldFirePossible() + self:F2( { self.GroupName } ) + + local DCSGroup = self:GetDCSGroup() + if DCSGroup then + if self:IsAir() or self:IsGround() or self:IsShip() then + return true + end + + return false + end + + return nil +end + +--- Holding weapons. +-- @param Group#GROUP self +-- @return Group#GROUP self +function GROUP:OptionROEHoldFire() + self:F2( { self.GroupName } ) + + local DCSGroup = self:GetDCSGroup() + if DCSGroup then + local Controller = self:_GetController() + + if self:IsAir() then + Controller:setOption( AI.Option.Air.id.ROE, AI.Option.Air.val.ROE.WEAPON_HOLD ) + elseif self:IsGround() then + Controller:setOption( AI.Option.Ground.id.ROE, AI.Option.Ground.val.ROE.WEAPON_HOLD ) + elseif self:IsShip() then + Controller:setOption( AI.Option.Naval.id.ROE, AI.Option.Naval.val.ROE.WEAPON_HOLD ) + end + + return self + end + + return nil +end + +--- Can the GROUP attack returning on enemy fire? +-- @param #GROUP self +-- @return #boolean +function GROUP:OptionROEReturnFirePossible() + self:F2( { self.GroupName } ) + + local DCSGroup = self:GetDCSGroup() + if DCSGroup then + if self:IsAir() or self:IsGround() or self:IsShip() then + return true + end + + return false + end + + return nil +end + +--- Return fire. +-- @param #GROUP self +-- @return #GROUP self +function GROUP:OptionROEReturnFire() + self:F2( { self.GroupName } ) + + local DCSGroup = self:GetDCSGroup() + if DCSGroup then + local Controller = self:_GetController() + + if self:IsAir() then + Controller:setOption( AI.Option.Air.id.ROE, AI.Option.Air.val.ROE.RETURN_FIRE ) + elseif self:IsGround() then + Controller:setOption( AI.Option.Ground.id.ROE, AI.Option.Ground.val.ROE.RETURN_FIRE ) + elseif self:IsShip() then + Controller:setOption( AI.Option.Naval.id.ROE, AI.Option.Naval.val.ROE.RETURN_FIRE ) + end + + return self + end + + return nil +end + +--- Can the GROUP attack designated targets? +-- @param #GROUP self +-- @return #boolean +function GROUP:OptionROEOpenFirePossible() + self:F2( { self.GroupName } ) + + local DCSGroup = self:GetDCSGroup() + if DCSGroup then + if self:IsAir() or self:IsGround() or self:IsShip() then + return true + end + + return false + end + + return nil +end + +--- Openfire. +-- @param #GROUP self +-- @return #GROUP self +function GROUP:OptionROEOpenFire() + self:F2( { self.GroupName } ) + + local DCSGroup = self:GetDCSGroup() + if DCSGroup then + local Controller = self:_GetController() + + if self:IsAir() then + Controller:setOption( AI.Option.Air.id.ROE, AI.Option.Air.val.ROE.OPEN_FIRE ) + elseif self:IsGround() then + Controller:setOption( AI.Option.Ground.id.ROE, AI.Option.Ground.val.ROE.OPEN_FIRE ) + elseif self:IsShip() then + Controller:setOption( AI.Option.Naval.id.ROE, AI.Option.Naval.val.ROE.OPEN_FIRE ) + end + + return self + end + + return nil +end + +--- Can the GROUP attack targets of opportunity? +-- @param #GROUP self +-- @return #boolean +function GROUP:OptionROEWeaponFreePossible() + self:F2( { self.GroupName } ) + + local DCSGroup = self:GetDCSGroup() + if DCSGroup then + if self:IsAir() then + return true + end + + return false + end + + return nil +end + +--- Weapon free. +-- @param #GROUP self +-- @return #GROUP self +function GROUP:OptionROEWeaponFree() + self:F2( { self.GroupName } ) + + local DCSGroup = self:GetDCSGroup() + if DCSGroup then + local Controller = self:_GetController() + + if self:IsAir() then + Controller:setOption( AI.Option.Air.id.ROE, AI.Option.Air.val.ROE.WEAPON_FREE ) + end + + return self + end + + return nil +end + +--- Can the GROUP ignore enemy fire? +-- @param #GROUP self +-- @return #boolean +function GROUP:OptionROTNoReactionPossible() + self:F2( { self.GroupName } ) + + local DCSGroup = self:GetDCSGroup() + if DCSGroup then + if self:IsAir() then + return true + end + + return false + end + + return nil +end + + +--- No evasion on enemy threats. +-- @param #GROUP self +-- @return #GROUP self +function GROUP:OptionROTNoReaction() + self:F2( { self.GroupName } ) + + local DCSGroup = self:GetDCSGroup() + if DCSGroup then + local Controller = self:_GetController() + + if self:IsAir() then + Controller:setOption( AI.Option.Air.id.REACTION_ON_THREAT, AI.Option.Air.val.REACTION_ON_THREAT.NO_REACTION ) + end + + return self + end + + return nil +end + +--- Can the GROUP evade using passive defenses? +-- @param #GROUP self +-- @return #boolean +function GROUP:OptionROTPassiveDefensePossible() + self:F2( { self.GroupName } ) + + local DCSGroup = self:GetDCSGroup() + if DCSGroup then + if self:IsAir() then + return true + end + + return false + end + + return nil +end + +--- Evasion passive defense. +-- @param #GROUP self +-- @return #GROUP self +function GROUP:OptionROTPassiveDefense() + self:F2( { self.GroupName } ) + + local DCSGroup = self:GetDCSGroup() + if DCSGroup then + local Controller = self:_GetController() + + if self:IsAir() then + Controller:setOption( AI.Option.Air.id.REACTION_ON_THREAT, AI.Option.Air.val.REACTION_ON_THREAT.PASSIVE_DEFENCE ) + end + + return self + end + + return nil +end + +--- Can the GROUP evade on enemy fire? +-- @param #GROUP self +-- @return #boolean +function GROUP:OptionROTEvadeFirePossible() + self:F2( { self.GroupName } ) + + local DCSGroup = self:GetDCSGroup() + if DCSGroup then + if self:IsAir() then + return true + end + + return false + end + + return nil +end + + +--- Evade on fire. +-- @param #GROUP self +-- @return #GROUP self +function GROUP:OptionROTEvadeFire() + self:F2( { self.GroupName } ) + + local DCSGroup = self:GetDCSGroup() + if DCSGroup then + local Controller = self:_GetController() + + if self:IsAir() then + Controller:setOption( AI.Option.Air.id.REACTION_ON_THREAT, AI.Option.Air.val.REACTION_ON_THREAT.EVADE_FIRE ) + end + + return self + end + + return nil +end + +--- Can the GROUP evade on fire using vertical manoeuvres? +-- @param #GROUP self +-- @return #boolean +function GROUP:OptionROTVerticalPossible() + self:F2( { self.GroupName } ) + + local DCSGroup = self:GetDCSGroup() + if DCSGroup then + if self:IsAir() then + return true + end + + return false + end + + return nil +end + + +--- Evade on fire using vertical manoeuvres. +-- @param #GROUP self +-- @return #GROUP self +function GROUP:OptionROTVertical() + self:F2( { self.GroupName } ) + + local DCSGroup = self:GetDCSGroup() + if DCSGroup then + local Controller = self:_GetController() + + if self:IsAir() then + Controller:setOption( AI.Option.Air.id.REACTION_ON_THREAT, AI.Option.Air.val.REACTION_ON_THREAT.BYPASS_AND_ESCAPE ) + end + + return self + end + + return nil +end + +-- Message APIs + +--- Returns a message for a coalition or a client. +-- @param #GROUP self +-- @param #string Message The message text +-- @param DCSTypes#Duration Duration The duration of the message. +-- @return Message#MESSAGE +function GROUP:Message( Message, Duration ) + self:F2( { Message, Duration } ) + + local DCSGroup = self:GetDCSGroup() + if DCSGroup then + return MESSAGE:New( Message, self:GetCallsign() .. " (" .. self:GetTypeName() .. ")", Duration, self:GetClassNameAndID() ) + end + + return nil +end + +--- Send a message to all coalitions. +-- The message will appear in the message area. The message will begin with the callsign of the group and the type of the first unit sending the message. +-- @param #GROUP self +-- @param #string Message The message text +-- @param DCSTypes#Duration Duration The duration of the message. +function GROUP:MessageToAll( Message, Duration ) + self:F2( { Message, Duration } ) + + local DCSGroup = self:GetDCSGroup() + if DCSGroup then + self:Message( Message, Duration ):ToAll() + end + + return nil +end + +--- Send a message to the red coalition. +-- The message will appear in the message area. The message will begin with the callsign of the group and the type of the first unit sending the message. +-- @param #GROUP self +-- @param #string Message The message text +-- @param DCSTYpes#Duration Duration The duration of the message. +function GROUP:MessageToRed( Message, Duration ) + self:F2( { Message, Duration } ) + + local DCSGroup = self:GetDCSGroup() + if DCSGroup then + self:Message( Message, Duration ):ToRed() + end + + return nil +end + +--- Send a message to the blue coalition. +-- The message will appear in the message area. The message will begin with the callsign of the group and the type of the first unit sending the message. +-- @param #GROUP self +-- @param #string Message The message text +-- @param DCSTypes#Duration Duration The duration of the message. +function GROUP:MessageToBlue( Message, Duration ) + self:F2( { Message, Duration } ) + + local DCSGroup = self:GetDCSGroup() + if DCSGroup then + self:Message( Message, Duration ):ToBlue() + end + + return nil +end + +--- Send a message to a client. +-- The message will appear in the message area. The message will begin with the callsign of the group and the type of the first unit sending the message. +-- @param #GROUP self +-- @param #string Message The message text +-- @param DCSTypes#Duration Duration The duration of the message. +-- @param Client#CLIENT Client The client object receiving the message. +function GROUP:MessageToClient( Message, Duration, Client ) + self:F2( { Message, Duration } ) + + local DCSGroup = self:GetDCSGroup() + if DCSGroup then + self:Message( Message, Duration ):ToClient( Client ) + end + + return nil +end +--- This module contains the UNIT class. +-- +-- 1) @{Unit#UNIT} class, extends @{Base#BASE} +-- =========================================== +-- The @{Unit#UNIT} class is a wrapper class to handle the DCS Unit objects: +-- +-- * Support all DCS Unit APIs. +-- * Enhance with Unit specific APIs not in the DCS Unit API set. +-- * Handle local Unit Controller. +-- * Manage the "state" of the DCS Unit. +-- +-- +-- 1.1) UNIT reference methods +-- ---------------------- +-- For each DCS Unit object alive within a running mission, a UNIT wrapper object (instance) will be created within the _@{DATABASE} object. +-- This is done at the beginning of the mission (when the mission starts), and dynamically when new DCS Unit objects are spawned (using the @{SPAWN} class). +-- +-- The UNIT class **does not contain a :New()** method, rather it provides **:Find()** methods to retrieve the object reference +-- using the DCS Unit or the DCS UnitName. +-- +-- Another thing to know is that UNIT objects do not "contain" the DCS Unit object. +-- The UNIT methods will reference the DCS Unit object by name when it is needed during API execution. +-- If the DCS Unit object does not exist or is nil, the UNIT methods will return nil and log an exception in the DCS.log file. +-- +-- The UNIT class provides the following functions to retrieve quickly the relevant UNIT instance: +-- +-- * @{#UNIT.Find}(): Find a UNIT instance from the _DATABASE object using a DCS Unit object. +-- * @{#UNIT.FindByName}(): Find a UNIT instance from the _DATABASE object using a DCS Unit name. +-- +-- IMPORTANT: ONE SHOULD NEVER SANATIZE these UNIT OBJECT REFERENCES! (make the UNIT object references nil). +-- +-- 1.2) DCS UNIT APIs +-- ------------------ +-- The DCS Unit APIs are used extensively within MOOSE. The UNIT class has for each DCS Unit API a corresponding method. +-- To be able to distinguish easily in your code the difference between a UNIT API call and a DCS Unit API call, +-- the first letter of the method is also capitalized. So, by example, the DCS Unit method @{DCSUnit#Unit.getName}() +-- is implemented in the UNIT class as @{#UNIT.GetName}(). +-- +-- 1.3) Smoke, Flare Units +-- ----------------------- +-- The UNIT class provides methods to smoke or flare units easily. +-- The @{#UNIT.SmokeBlue}(), @{#UNIT.SmokeGreen}(),@{#UNIT.SmokeOrange}(), @{#UNIT.SmokeRed}(), @{#UNIT.SmokeRed}() methods +-- will smoke the unit in the corresponding color. Note that smoking a unit is done at the current position of the DCS Unit. +-- When the DCS Unit moves for whatever reason, the smoking will still continue! +-- The @{#UNIT.FlareGreen}(), @{#UNIT.FlareRed}(), @{#UNIT.FlareWhite}(), @{#UNIT.FlareYellow}() +-- methods will fire off a flare in the air with the corresponding color. Note that a flare is a one-off shot and its effect is of very short duration. +-- +-- 1.4) Location Position, Point +-- ----------------------------- +-- The UNIT class provides methods to obtain the current point or position of the DCS Unit. +-- The @{#UNIT.GetPointVec2}(), @{#UNIT.GetPointVec3}() will obtain the current **location** of the DCS Unit in a Vec2 (2D) or a **point** in a Vec3 (3D) vector respectively. +-- If you want to obtain the complete **3D position** including oriëntation and direction vectors, consult the @{#UNIT.GetPositionVec3}() method respectively. +-- +-- 1.5) Test if alive +-- ------------------ +-- The @{#UNIT.IsAlive}(), @{#UNIT.IsActive}() methods determines if the DCS Unit is alive, meaning, it is existing and active. +-- +-- 1.6) Test for proximity +-- ----------------------- +-- The UNIT class contains methods to test the location or proximity against zones or other objects. +-- +-- ### 1.6.1) Zones +-- To test whether the Unit is within a **zone**, use the @{#UNIT.IsInZone}() or the @{#UNIT.IsNotInZone}() methods. Any zone can be tested on, but the zone must be derived from @{Zone#ZONE_BASE}. +-- +-- ### 1.6.2) Units +-- Test if another DCS Unit is within a given radius of the current DCS Unit, use the @{#UNIT.OtherUnitInRadius}() method. +-- +-- @module Unit +-- @author FlightControl + +Include.File( "Routines" ) +Include.File( "Base" ) +Include.File( "Message" ) + +--- The UNIT class +-- @type UNIT +-- @extends Base#BASE +-- @field #UNIT.FlareColor FlareColor +-- @field #UNIT.SmokeColor SmokeColor +UNIT = { + ClassName="UNIT", + CategoryName = { + [Unit.Category.AIRPLANE] = "Airplane", + [Unit.Category.HELICOPTER] = "Helicoper", + [Unit.Category.GROUND_UNIT] = "Ground Unit", + [Unit.Category.SHIP] = "Ship", + [Unit.Category.STRUCTURE] = "Structure", + }, + FlareColor = { + Green = trigger.flareColor.Green, + Red = trigger.flareColor.Red, + White = trigger.flareColor.White, + Yellow = trigger.flareColor.Yellow + }, + SmokeColor = { + Green = trigger.smokeColor.Green, + Red = trigger.smokeColor.Red, + White = trigger.smokeColor.White, + Orange = trigger.smokeColor.Orange, + Blue = trigger.smokeColor.Blue + }, + } + +--- FlareColor +-- @type UNIT.FlareColor +-- @field Green +-- @field Red +-- @field White +-- @field Yellow + +--- SmokeColor +-- @type UNIT.SmokeColor +-- @field Green +-- @field Red +-- @field White +-- @field Orange +-- @field Blue + +-- Registration. + +--- Create a new UNIT from DCSUnit. +-- @param #UNIT self +-- @param DCSUnit#Unit DCSUnit +-- @param Database#DATABASE Database +-- @return Unit#UNIT +function UNIT:Register( UnitName ) + + local self = BASE:Inherit( self, BASE:New() ) + self:F2( UnitName ) + self.UnitName = UnitName + return self +end + +-- Reference methods. + +--- Finds a UNIT from the _DATABASE using a DCSUnit object. +-- @param #UNIT self +-- @param DCSUnit#Unit DCSUnit An existing DCS Unit object reference. +-- @return Unit#UNIT self +function UNIT:Find( DCSUnit ) + + local UnitName = DCSUnit:getName() + local UnitFound = _DATABASE:FindUnit( UnitName ) + return UnitFound +end + +--- Find a UNIT in the _DATABASE using the name of an existing DCS Unit. +-- @param #UNIT self +-- @param #string UnitName The Unit Name. +-- @return Unit#UNIT self +function UNIT:FindByName( UnitName ) + + local UnitFound = _DATABASE:FindUnit( UnitName ) + return UnitFound +end + +function UNIT:GetDCSUnit() + local DCSUnit = Unit.getByName( self.UnitName ) + + if DCSUnit then + return DCSUnit + end + + return nil +end + +--- Returns coalition of the Unit. +-- @param Unit#UNIT self +-- @return DCSCoalitionObject#coalition.side The side of the coalition. +-- @return #nil The DCS Unit is not existing or alive. +function UNIT:GetCoalition() + self:F2( self.UnitName ) + + local DCSUnit = self:GetDCSUnit() + + if DCSUnit then + local UnitCoalition = DCSUnit:getCoalition() + self:T3( UnitCoalition ) + return UnitCoalition + end + + return nil +end + +--- Returns country of the Unit. +-- @param Unit#UNIT self +-- @return DCScountry#country.id The country identifier. +-- @return #nil The DCS Unit is not existing or alive. +function UNIT:GetCountry() + self:F2( self.UnitName ) + + local DCSUnit = self:GetDCSUnit() + + if DCSUnit then + local UnitCountry = DCSUnit:getCountry() + self:T3( UnitCountry ) + return UnitCountry + end + + return nil +end + + +--- Returns DCS Unit object name. +-- The function provides access to non-activated units too. +-- @param Unit#UNIT self +-- @return #string The name of the DCS Unit. +-- @return #nil The DCS Unit is not existing or alive. +function UNIT:GetName() + self:F2( self.UnitName ) + + local DCSUnit = self:GetDCSUnit() + + if DCSUnit then + local UnitName = self.UnitName + return UnitName + end + + return nil +end + + +--- Returns if the unit is alive. +-- @param Unit#UNIT self +-- @return #boolean true if Unit is alive. +-- @return #nil The DCS Unit is not existing or alive. +function UNIT:IsAlive() + self:F2( self.UnitName ) + + local DCSUnit = self:GetDCSUnit() + + if DCSUnit then + local UnitIsAlive = DCSUnit:isExist() + return UnitIsAlive + end + + return false +end + +--- Returns if the unit is activated. +-- @param Unit#UNIT self +-- @return #boolean true if Unit is activated. +-- @return #nil The DCS Unit is not existing or alive. +function UNIT:IsActive() + self:F2( self.UnitName ) + + local DCSUnit = self:GetDCSUnit() + + if DCSUnit then + + local UnitIsActive = DCSUnit:isActive() + return UnitIsActive + end + + return nil +end + +--- Returns name of the player that control the unit or nil if the unit is controlled by A.I. +-- @param Unit#UNIT self +-- @return #string Player Name +-- @return #nil The DCS Unit is not existing or alive. +function UNIT:GetPlayerName() + self:F2( self.UnitName ) + + local DCSUnit = self:GetDCSUnit() + + if DCSUnit then + + local PlayerName = DCSUnit:getPlayerName() + if PlayerName == nil then + PlayerName = "" + end + return PlayerName + end + + return nil +end + +--- Returns the unit's unique identifier. +-- @param Unit#UNIT self +-- @return DCSUnit#Unit.ID Unit ID +-- @return #nil The DCS Unit is not existing or alive. +function UNIT:GetID() + self:F2( self.UnitName ) + + local DCSUnit = self:GetDCSUnit() + + if DCSUnit then + local UnitID = DCSUnit:getID() + return UnitID + end + + return nil +end + +--- Returns the unit's number in the group. +-- The number is the same number the unit has in ME. +-- It may not be changed during the mission. +-- If any unit in the group is destroyed, the numbers of another units will not be changed. +-- @param Unit#UNIT self +-- @return #number The Unit number. +-- @return #nil The DCS Unit is not existing or alive. +function UNIT:GetNumber() + self:F2( self.UnitName ) + + local DCSUnit = self:GetDCSUnit() + + if DCSUnit then + local UnitNumber = DCSUnit:getNumber() + return UnitNumber + end + + return nil +end + +--- Returns the unit's group if it exist and nil otherwise. +-- @param Unit#UNIT self +-- @return Group#GROUP The Group of the Unit. +-- @return #nil The DCS Unit is not existing or alive. +function UNIT:GetGroup() + self:F2( self.UnitName ) + + local DCSUnit = self:GetDCSUnit() + + if DCSUnit then + local UnitGroup = DCSUnit:getGroup() + return UnitGroup + end + + return nil +end + + +--- Returns the unit's callsign - the localized string. +-- @param Unit#UNIT self +-- @return #string The Callsign of the Unit. +-- @return #nil The DCS Unit is not existing or alive. +function UNIT:GetCallSign() + self:F2( self.UnitName ) + + local DCSUnit = self:GetDCSUnit() + + if DCSUnit then + local UnitCallSign = DCSUnit:getCallsign() + return UnitCallSign + end + + return nil +end + +--- Returns the unit's health. Dead units has health <= 1.0. +-- @param Unit#UNIT self +-- @return #number The Unit's health value. +-- @return #nil The DCS Unit is not existing or alive. +function UNIT:GetLife() + self:F2( self.UnitName ) + + local DCSUnit = self:GetDCSUnit() + + if DCSUnit then + local UnitLife = DCSUnit:getLife() + return UnitLife + end + + return nil +end + +--- Returns the Unit's initial health. +-- @param Unit#UNIT self +-- @return #number The Unit's initial health value. +-- @return #nil The DCS Unit is not existing or alive. +function UNIT:GetLife0() + self:F2( self.UnitName ) + + local DCSUnit = self:GetDCSUnit() + + if DCSUnit then + local UnitLife0 = DCSUnit:getLife0() + return UnitLife0 + end + + return nil +end + +--- Returns relative amount of fuel (from 0.0 to 1.0) the unit has in its internal tanks. If there are additional fuel tanks the value may be greater than 1.0. +-- @param Unit#UNIT self +-- @return #number The relative amount of fuel (from 0.0 to 1.0). +-- @return #nil The DCS Unit is not existing or alive. +function UNIT:GetFuel() + self:F2( self.UnitName ) + + local DCSUnit = self:GetDCSUnit() + + if DCSUnit then + local UnitFuel = DCSUnit:getFuel() + return UnitFuel + end + + return nil +end + +--- Returns the Unit's ammunition. +-- @param Unit#UNIT self +-- @return DCSUnit#Unit.Ammo +-- @return #nil The DCS Unit is not existing or alive. +function UNIT:GetAmmo() + self:F2( self.UnitName ) + + local DCSUnit = self:GetDCSUnit() + + if DCSUnit then + local UnitAmmo = DCSUnit:getAmmo() + return UnitAmmo + end + + return nil +end + +--- Returns the unit sensors. +-- @param Unit#UNIT self +-- @return DCSUnit#Unit.Sensors +-- @return #nil The DCS Unit is not existing or alive. +function UNIT:GetSensors() + self:F2( self.UnitName ) + + local DCSUnit = self:GetDCSUnit() + + if DCSUnit then + local UnitSensors = DCSUnit:getSensors() + return UnitSensors + end + + return nil +end + +-- Need to add here a function per sensortype +-- unit:hasSensors(Unit.SensorType.RADAR, Unit.RadarType.AS) + +--- Returns two values: +-- +-- * First value indicates if at least one of the unit's radar(s) is on. +-- * Second value is the object of the radar's interest. Not nil only if at least one radar of the unit is tracking a target. +-- @param Unit#UNIT self +-- @return #boolean Indicates if at least one of the unit's radar(s) is on. +-- @return DCSObject#Object The object of the radar's interest. Not nil only if at least one radar of the unit is tracking a target. +-- @return #nil The DCS Unit is not existing or alive. +function UNIT:GetRadar() + self:F2( self.UnitName ) + + local DCSUnit = self:GetDCSUnit() + + if DCSUnit then + local UnitRadarOn, UnitRadarObject = DCSUnit:getRadar() + return UnitRadarOn, UnitRadarObject + end + + return nil, nil +end + +-- Need to add here functions to check if radar is on and which object etc. + +--- Returns unit descriptor. Descriptor type depends on unit category. +-- @param Unit#UNIT self +-- @return DCSUnit#Unit.Desc The Unit descriptor. +-- @return #nil The DCS Unit is not existing or alive. +function UNIT:GetDesc() + self:F2( self.UnitName ) + + local DCSUnit = self:GetDCSUnit() + + if DCSUnit then + local UnitDesc = DCSUnit:getDesc() + return UnitDesc + end + + return nil +end + + +--- Returns the type name of the DCS Unit. +-- @param Unit#UNIT self +-- @return #string The type name of the DCS Unit. +-- @return #nil The DCS Unit is not existing or alive. +function UNIT:GetTypeName() + self:F2( self.UnitName ) + + local DCSUnit = self:GetDCSUnit() + + if DCSUnit then + local UnitTypeName = DCSUnit:getTypeName() + self:T3( UnitTypeName ) + return UnitTypeName + end + + return nil +end + + + +--- Returns the prefix name of the DCS Unit. A prefix name is a part of the name before a '#'-sign. +-- DCS Units spawned with the @{SPAWN} class contain a '#'-sign to indicate the end of the (base) DCS Unit name. +-- The spawn sequence number and unit number are contained within the name after the '#' sign. +-- @param Unit#UNIT self +-- @return #string The name of the DCS Unit. +-- @return #nil The DCS Unit is not existing or alive. +function UNIT:GetPrefix() + self:F2( self.UnitName ) + + local DCSUnit = self:GetDCSUnit() + + if DCSUnit then + local UnitPrefix = string.match( self.UnitName, ".*#" ):sub( 1, -2 ) + self:T3( UnitPrefix ) + return UnitPrefix + end + + return nil +end + + + +--- Returns the @{DCSTypes#Vec2} vector indicating the point in 2D of the DCS Unit within the mission. +-- @param Unit#UNIT self +-- @return DCSTypes#Vec2 The 2D point vector of the DCS Unit. +-- @return #nil The DCS Unit is not existing or alive. +function UNIT:GetPointVec2() + self:F2( self.UnitName ) + + local DCSUnit = self:GetDCSUnit() + + if DCSUnit then + local UnitPointVec3 = DCSUnit:getPosition().p + + local UnitPointVec2 = {} + UnitPointVec2.x = UnitPointVec3.x + UnitPointVec2.y = UnitPointVec3.z + + self:T2( UnitPointVec2 ) + return UnitPointVec2 + end + + return nil +end + + +--- Returns the @{DCSTypes#Vec3} vector indicating the point in 3D of the DCS Unit within the mission. +-- @param Unit#UNIT self +-- @return DCSTypes#Vec3 The 3D point vector of the DCS Unit. +-- @return #nil The DCS Unit is not existing or alive. +function UNIT:GetPointVec3() + self:F2( self.UnitName ) + + local DCSUnit = self:GetDCSUnit() + + if DCSUnit then + local UnitPointVec3 = DCSUnit:getPosition().p + self:T3( UnitPointVec3 ) + return UnitPointVec3 + end + + return nil +end + +--- Returns the @{DCSTypes#Position3} position vectors indicating the point and direction vectors in 3D of the DCS Unit within the mission. +-- @param Unit#UNIT self +-- @return DCSTypes#Position The 3D position vectors of the DCS Unit. +-- @return #nil The DCS Unit is not existing or alive. +function UNIT:GetPositionVec3() + self:F2( self.UnitName ) + + local DCSUnit = self:GetDCSUnit() + + if DCSUnit then + local UnitPosition = DCSUnit:getPosition() + self:T3( UnitPosition ) + return UnitPosition + end + + return nil +end + +--- Returns the DCS Unit velocity vector. +-- @param Unit#UNIT self +-- @return DCSTypes#Vec3 The velocity vector +-- @return #nil The DCS Unit is not existing or alive. +function UNIT:GetVelocity() + self:F2( self.UnitName ) + + local DCSUnit = self:GetDCSUnit() + + if DCSUnit then + local UnitVelocityVec3 = DCSUnit:getVelocity() + self:T3( UnitVelocityVec3 ) + return UnitVelocityVec3 + end + + return nil +end + +-- Is functions + +--- Returns true if the unit is within a @{Zone}. +-- @param #UNIT self +-- @param Zone#ZONE_BASE Zone The zone to test. +-- @return #boolean Returns true if the unit is within the @{Zone#ZONE_BASE} +function UNIT:IsInZone( Zone ) + self:F2( { self.UnitName, Zone } ) + + local IsInZone = Zone:IsPointVec3InZone( self:GetPointVec3() ) + + self:T( { IsInZone } ) + return IsInZone +end + +--- Returns true if the unit is not within a @{Zone}. +-- @param #UNIT self +-- @param Zone#ZONE_BASE Zone The zone to test. +-- @return #boolean Returns true if the unit is not within the @{Zone#ZONE_BASE} +function UNIT:IsNotInZone( Zone ) + self:F2( { self.UnitName, Zone } ) + + local IsInZone = not Zone:IsPointVec3InZone( self:GetPointVec3() ) + + self:T( { IsInZone } ) + return IsInZone +end + +--- Returns true if the DCS Unit is in the air. +-- @param Unit#UNIT self +-- @return #boolean true if in the air. +-- @return #nil The DCS Unit is not existing or alive. +function UNIT:InAir() + self:F2( self.UnitName ) + + local DCSUnit = self:GetDCSUnit() + + if DCSUnit then + local UnitInAir = DCSUnit:inAir() + self:T3( UnitInAir ) + return UnitInAir + end + + return nil +end + +--- Returns the altitude of the DCS Unit. +-- @param Unit#UNIT self +-- @return DCSTypes#Distance The altitude of the DCS Unit. +-- @return #nil The DCS Unit is not existing or alive. +function UNIT:GetAltitude() + self:F2() + + local DCSUnit = self:GetDCSUnit() + + if DCSUnit then + local UnitPointVec3 = DCSUnit:getPoint() --DCSTypes#Vec3 + return UnitPointVec3.y + end + + return nil +end + +--- Returns true if there is an **other** DCS Unit within a radius of the current 2D point of the DCS Unit. +-- @param Unit#UNIT self +-- @param Unit#UNIT AwaitUnit The other UNIT wrapper object. +-- @param Radius The radius in meters with the DCS Unit in the centre. +-- @return true If the other DCS Unit is within the radius of the 2D point of the DCS Unit. +-- @return #nil The DCS Unit is not existing or alive. +function UNIT:OtherUnitInRadius( AwaitUnit, Radius ) + self:F2( { self.UnitName, AwaitUnit.UnitName, Radius } ) + + local DCSUnit = self:GetDCSUnit() + + if DCSUnit then + local UnitPos = self:GetPointVec3() + local AwaitUnitPos = AwaitUnit:GetPointVec3() + + if (((UnitPos.x - AwaitUnitPos.x)^2 + (UnitPos.z - AwaitUnitPos.z)^2)^0.5 <= Radius) then + self:T3( "true" ) + return true + else + self:T3( "false" ) + return false + end + end + + return nil +end + +--- Returns the DCS Unit category name as defined within the DCS Unit Descriptor. +-- @param Unit#UNIT self +-- @return #string The DCS Unit Category Name +function UNIT:GetCategoryName() + local DCSUnit = self:GetDCSUnit() + + if DCSUnit then + local UnitCategoryName = self.CategoryName[ self:GetDesc().category ] + return UnitCategoryName + end + + return nil +end + +--- Signal a flare at the position of the UNIT. +-- @param #UNIT self +function UNIT:Flare( FlareColor ) + self:F2() + trigger.action.signalFlare( self:GetPointVec3(), FlareColor , 0 ) +end + +--- Signal a white flare at the position of the UNIT. +-- @param #UNIT self +function UNIT:FlareWhite() + self:F2() + trigger.action.signalFlare( self:GetPointVec3(), trigger.flareColor.White , 0 ) +end + +--- Signal a yellow flare at the position of the UNIT. +-- @param #UNIT self +function UNIT:FlareYellow() + self:F2() + trigger.action.signalFlare( self:GetPointVec3(), trigger.flareColor.Yellow , 0 ) +end + +--- Signal a green flare at the position of the UNIT. +-- @param #UNIT self +function UNIT:FlareGreen() + self:F2() + trigger.action.signalFlare( self:GetPointVec3(), trigger.flareColor.Green , 0 ) +end + +--- Signal a red flare at the position of the UNIT. +-- @param #UNIT self +function UNIT:FlareRed() + self:F2() + trigger.action.signalFlare( self:GetPointVec3(), trigger.flareColor.Red, 0 ) +end + +--- Smoke the UNIT. +-- @param #UNIT self +function UNIT:Smoke( SmokeColor ) + self:F2() + trigger.action.smoke( self:GetPointVec3(), SmokeColor ) +end + +--- Smoke the UNIT Green. +-- @param #UNIT self +function UNIT:SmokeGreen() + self:F2() + trigger.action.smoke( self:GetPointVec3(), trigger.smokeColor.Green ) +end + +--- Smoke the UNIT Red. +-- @param #UNIT self +function UNIT:SmokeRed() + self:F2() + trigger.action.smoke( self:GetPointVec3(), trigger.smokeColor.Red ) +end + +--- Smoke the UNIT White. +-- @param #UNIT self +function UNIT:SmokeWhite() + self:F2() + trigger.action.smoke( self:GetPointVec3(), trigger.smokeColor.White ) +end + +--- Smoke the UNIT Orange. +-- @param #UNIT self +function UNIT:SmokeOrange() + self:F2() + trigger.action.smoke( self:GetPointVec3(), trigger.smokeColor.Orange ) +end + +--- Smoke the UNIT Blue. +-- @param #UNIT self +function UNIT:SmokeBlue() + self:F2() + trigger.action.smoke( self:GetPointVec3(), trigger.smokeColor.Blue ) +end + +-- Is methods + +--- Returns if the unit is of an air category. +-- If the unit is a helicopter or a plane, then this method will return true, otherwise false. +-- @param #UNIT self +-- @return #boolean Air category evaluation result. +function UNIT:IsAir() + self:F2() + + local UnitDescriptor = self.DCSUnit:getDesc() + self:T3( { UnitDescriptor.category, Unit.Category.AIRPLANE, Unit.Category.HELICOPTER } ) + + local IsAirResult = ( UnitDescriptor.category == Unit.Category.AIRPLANE ) or ( UnitDescriptor.category == Unit.Category.HELICOPTER ) + + self:T3( IsAirResult ) + return IsAirResult +end + +--- This module contains the ZONE classes, inherited from @{Zone#ZONE_BASE}. +-- There are essentially two core functions that zones accomodate: +-- +-- * Test if an object is within the zone boundaries. +-- * Provide the zone behaviour. Some zones are static, while others are moveable. +-- +-- The object classes are using the zone classes to test the zone boundaries, which can take various forms: +-- +-- * Test if completely within the zone. +-- * Test if partly within the zone (for @{Group#GROUP} objects). +-- * Test if not in the zone. +-- * Distance to the nearest intersecting point of the zone. +-- * Distance to the center of the zone. +-- * ... +-- +-- Each of these ZONE classes have a zone name, and specific parameters defining the zone type: +-- +-- * @{Zone#ZONE_BASE}: The ZONE_BASE class defining the base for all other zone classes. +-- * @{Zone#ZONE_RADIUS}: The ZONE_RADIUS class defined by a zone name, a location and a radius. +-- * @{Zone#ZONE}: The ZONE class, defined by the zone name as defined within the Mission Editor. +-- * @{Zone#ZONE_UNIT}: The ZONE_UNIT class defined by a zone around a @{Unit#UNIT} with a radius. +-- * @{Zone#ZONE_POLYGON}: The ZONE_POLYGON class defined by a sequence of @{Group#GROUP} waypoints within the Mission Editor, forming a polygon. +-- +-- Each zone implements two polymorphic functions defined in @{Zone#ZONE_BASE}: +-- +-- * @{#ZONE_BASE.IsPointVec2InZone}: Returns if a location is within the zone. +-- * @{#ZONE_BASE.IsPointVec3InZone}: Returns if a point is within the zone. +-- +-- === +-- +-- 1) @{Zone#ZONE_BASE} class, extends @{Base#BASE} +-- ================================================ +-- The ZONE_BASE class defining the base for all other zone classes. +-- +-- === +-- +-- 2) @{Zone#ZONE_RADIUS} class, extends @{Zone#ZONE_BASE} +-- ======================================================= +-- The ZONE_RADIUS class defined by a zone name, a location and a radius. +-- +-- === +-- +-- 3) @{Zone#ZONE} class, extends @{Zone#ZONE_RADIUS} +-- ========================================== +-- The ZONE class, defined by the zone name as defined within the Mission Editor. +-- +-- === +-- +-- 4) @{Zone#ZONE_UNIT} class, extends @{Zone#ZONE_RADIUS} +-- ======================================================= +-- The ZONE_UNIT class defined by a zone around a @{Unit#UNIT} with a radius. +-- +-- === +-- +-- 5) @{Zone#ZONE_POLYGON} class, extends @{Zone#ZONE_BASE} +-- ======================================================== +-- The ZONE_POLYGON class defined by a sequence of @{Group#GROUP} waypoints within the Mission Editor, forming a polygon. +-- +-- === +-- +-- @module Zone +-- @author FlightControl + + +Include.File( "Routines" ) +Include.File( "Base" ) +Include.File( "Message" ) +Include.File( "Point" ) + + + +--- The ZONE_BASE class +-- @type ZONE_BASE +-- @extends Base#BASE +ZONE_BASE = { + ClassName = "ZONE_BASE", + } + +--- ZONE_BASE constructor +-- @param #ZONE_BASE self +-- @param #string ZoneName Name of the zone. +-- @return #ZONE_BASE self +function ZONE_BASE:New( ZoneName ) + local self = BASE:Inherit( self, BASE:New() ) + self:F( ZoneName ) + + self.ZoneName = ZoneName + + return self +end + +--- Returns if a location is within the zone. +-- @param #ZONE_RADIUS self +-- @param DCSTypes#Vec2 PointVec2 The location to test. +-- @return #boolean true if the location is within the zone. +function ZONE_BASE:IsPointVec2InZone( PointVec2 ) + self:F2( PointVec2 ) + + return false +end + +--- Returns if a point is within the zone. +-- @param #ZONE_RADIUS self +-- @param DCSTypes#Vec3 PointVec3 The point to test. +-- @return #boolean true if the point is within the zone. +function ZONE_BASE:IsPointVec3InZone( PointVec3 ) + self:F2( PointVec3 ) + + local InZone = self:IsPointVec2InZone( { x = PointVec3.x, y = PointVec3.z } ) + + return InZone +end + +--- Smokes the zone boundaries in a color. +-- @param #ZONE_BASE self +-- @param SmokeColor The smoke color. +function ZONE_BASE:SmokeZone( SmokeColor ) + self:F2( SmokeColor ) + +end + + +--- The ZONE_RADIUS class, defined by a zone name, a location and a radius. +-- @type ZONE_RADIUS +-- @field DCSTypes#Vec2 PointVec2 The current location of the zone. +-- @field DCSTypes#Distance Radius The radius of the zone. +-- @extends Zone#ZONE_BASE +ZONE_RADIUS = { + ClassName="ZONE_RADIUS", + } + +--- Constructor of ZONE_RADIUS, taking the zone name, the zone location and a radius. +-- @param #ZONE_RADIUS self +-- @param #string ZoneName Name of the zone. +-- @param DCSTypes#Vec2 PointVec2 The location of the zone. +-- @param DCSTypes#Distance Radius The radius of the zone. +-- @return #ZONE_RADIUS self +function ZONE_RADIUS:New( ZoneName, PointVec2, Radius ) + local self = BASE:Inherit( self, ZONE_BASE:New( ZoneName ) ) + self:F( { ZoneName, PointVec2, Radius } ) + + self.Radius = Radius + self.PointVec2 = PointVec2 + + return self +end + +--- Smokes the zone boundaries in a color. +-- @param #ZONE_RADIUS self +-- @param #POINT_VEC3.SmokeColor SmokeColor The smoke color. +-- @param #number Points (optional) The amount of points in the circle. +-- @return #ZONE_RADIUS self +function ZONE_RADIUS:SmokeZone( SmokeColor, Points ) + self:F2( SmokeColor ) + + local Point = {} + local PointVec2 = self:GetPointVec2() + + Points = Points and Points or 360 + + local Angle + local RadialBase = math.pi*2 + + for Angle = 0, 360, 360 / Points do + local Radial = Angle * RadialBase / 360 + Point.x = PointVec2.x + math.cos( Radial ) * self:GetRadius() + Point.y = PointVec2.y + math.sin( Radial ) * self:GetRadius() + POINT_VEC2:New( Point.x, Point.y ):Smoke( SmokeColor ) + end + + return self +end + + +--- Flares the zone boundaries in a color. +-- @param #ZONE_RADIUS self +-- @param #POINT_VEC3.FlareColor FlareColor The flare color. +-- @param #number Points (optional) The amount of points in the circle. +-- @param DCSTypes#Azimuth Azimuth (optional) Azimuth The azimuth of the flare. +-- @return #ZONE_RADIUS self +function ZONE_RADIUS:FlareZone( FlareColor, Points, Azimuth ) + self:F2( { FlareColor, Azimuth } ) + + local Point = {} + local PointVec2 = self:GetPointVec2() + + Points = Points and Points or 360 + + local Angle + local RadialBase = math.pi*2 + + for Angle = 0, 360, 360 / Points do + local Radial = Angle * RadialBase / 360 + Point.x = PointVec2.x + math.cos( Radial ) * self:GetRadius() + Point.y = PointVec2.y + math.sin( Radial ) * self:GetRadius() + POINT_VEC2:New( Point.x, Point.y ):Flare( FlareColor, Azimuth ) + end + + return self +end + +--- Returns the radius of the zone. +-- @param #ZONE_RADIUS self +-- @return DCSTypes#Distance The radius of the zone. +function ZONE_RADIUS:GetRadius() + self:F2( self.ZoneName ) + + self:T2( { self.Radius } ) + + return self.Radius +end + +--- Sets the radius of the zone. +-- @param #ZONE_RADIUS self +-- @param DCSTypes#Distance Radius The radius of the zone. +-- @return DCSTypes#Distance The radius of the zone. +function ZONE_RADIUS:SetRadius( Radius ) + self:F2( self.ZoneName ) + + self.Radius = Radius + self:T2( { self.Radius } ) + + return self.Radius +end + +--- Returns the location of the zone. +-- @param #ZONE_RADIUS self +-- @return DCSTypes#Vec2 The location of the zone. +function ZONE_RADIUS:GetPointVec2() + self:F2( self.ZoneName ) + + self:T2( { self.PointVec2 } ) + + return self.PointVec2 +end + +--- Sets the location of the zone. +-- @param #ZONE_RADIUS self +-- @param DCSTypes#Vec2 PointVec2 The new location of the zone. +-- @return DCSTypes#Vec2 The new location of the zone. +function ZONE_RADIUS:SetPointVec2( PointVec2 ) + self:F2( self.ZoneName ) + + self.PointVec2 = PointVec2 + + self:T2( { self.PointVec2 } ) + + return self.PointVec2 +end + +--- Returns the point of the zone. +-- @param #ZONE_RADIUS self +-- @param DCSTypes#Distance Height The height to add to the land height where the center of the zone is located. +-- @return DCSTypes#Vec3 The point of the zone. +function ZONE_RADIUS:GetPointVec3( Height ) + self:F2( self.ZoneName ) + + local PointVec2 = self:GetPointVec2() + + local PointVec3 = { x = PointVec2.x, y = land.getHeight( self:GetPointVec2() ) + Height, z = PointVec2.y } + + self:T2( { PointVec3 } ) + + return PointVec3 +end + + +--- Returns if a location is within the zone. +-- @param #ZONE_RADIUS self +-- @param DCSTypes#Vec2 PointVec2 The location to test. +-- @return #boolean true if the location is within the zone. +function ZONE_RADIUS:IsPointVec2InZone( PointVec2 ) + self:F2( PointVec2 ) + + local ZonePointVec2 = self:GetPointVec2() + + if (( PointVec2.x - ZonePointVec2.x )^2 + ( PointVec2.y - ZonePointVec2.y ) ^2 ) ^ 0.5 <= self:GetRadius() then + return true + end + + return false +end + +--- Returns if a point is within the zone. +-- @param #ZONE_RADIUS self +-- @param DCSTypes#Vec3 PointVec3 The point to test. +-- @return #boolean true if the point is within the zone. +function ZONE_RADIUS:IsPointVec3InZone( PointVec3 ) + self:F2( PointVec3 ) + + local InZone = self:IsPointVec2InZone( { x = PointVec3.x, y = PointVec3.z } ) + + return InZone +end + +--- Returns a random location within the zone. +-- @param #ZONE_RADIUS self +-- @return DCSTypes#Vec2 The random location within the zone. +function ZONE_RADIUS:GetRandomPointVec2() + self:F( self.ZoneName ) + + local Point = {} + local PointVec2 = self:GetPointVec2() + + local angle = math.random() * math.pi*2; + Point.x = PointVec2.x + math.cos( angle ) * math.random() * self:GetRadius(); + Point.y = PointVec2.y + math.sin( angle ) * math.random() * self:GetRadius(); + + self:T( { Point } ) + + return Point +end + + + +--- The ZONE class, defined by the zone name as defined within the Mission Editor. The location and the radius are automatically collected from the mission settings. +-- @type ZONE +-- @extends Zone#ZONE_RADIUS +ZONE = { + ClassName="ZONE", + } + + +--- Constructor of ZONE, taking the zone name. +-- @param #ZONE self +-- @param #string ZoneName The name of the zone as defined within the mission editor. +-- @return #ZONE +function ZONE:New( ZoneName ) + + local Zone = trigger.misc.getZone( ZoneName ) + + if not Zone then + error( "Zone " .. ZoneName .. " does not exist." ) + return nil + end + + local self = BASE:Inherit( self, ZONE_RADIUS:New( ZoneName, { x = Zone.point.x, y = Zone.point.z }, Zone.radius ) ) + self:F( ZoneName ) + + self.Zone = Zone + + return self +end + + +--- The ZONE_UNIT class defined by a zone around a @{Unit#UNIT} with a radius. +-- @type ZONE_UNIT +-- @field Unit#UNIT ZoneUNIT +-- @extends Zone#ZONE_RADIUS +ZONE_UNIT = { + ClassName="ZONE_UNIT", + } + +--- Constructor to create a ZONE_UNIT instance, taking the zone name, a zone unit and a radius. +-- @param #ZONE_UNIT self +-- @param #string ZoneName Name of the zone. +-- @param Unit#UNIT ZoneUNIT The unit as the center of the zone. +-- @param DCSTypes#Distance Radius The radius of the zone. +-- @return #ZONE_UNIT self +function ZONE_UNIT:New( ZoneName, ZoneUNIT, Radius ) + local self = BASE:Inherit( self, ZONE_RADIUS:New( ZoneName, ZoneUNIT:GetPointVec2(), Radius ) ) + self:F( { ZoneName, ZoneUNIT:GetPointVec2(), Radius } ) + + self.ZoneUNIT = ZoneUNIT + + return self +end + + +--- Returns the current location of the @{Unit#UNIT}. +-- @param #ZONE_UNIT self +-- @return DCSTypes#Vec2 The location of the zone based on the @{Unit#UNIT}location. +function ZONE_UNIT:GetPointVec2() + self:F( self.ZoneName ) + + local ZonePointVec2 = self.ZoneUNIT:GetPointVec2() + + self:T( { ZonePointVec2 } ) + + return ZonePointVec2 +end + + +--- The ZONE_POLYGON class defined by a sequence of @{Group#GROUP} waypoints within the Mission Editor, forming a polygon. +-- @type ZONE_POLYGON +-- @extends Zone#ZONE_BASE +ZONE_POLYGON = { + ClassName="ZONE_POLYGON", + } + +--- Constructor to create a ZONE_POLYGON instance, taking the zone name and the name of the @{Group#GROUP} defined within the Mission Editor. +-- The @{Group#GROUP} waypoints define the polygon corners. The first and the last point are automatically connected by ZONE_POLYGON. +-- @param #ZONE_POLYGON self +-- @param #string ZoneName Name of the zone. +-- @param Group#GROUP ZoneGroup The GROUP waypoints as defined within the Mission Editor define the polygon shape. +-- @return #ZONE_POLYGON self +function ZONE_POLYGON:New( ZoneName, ZoneGroup ) + local self = BASE:Inherit( self, ZONE_BASE:New( ZoneName ) ) + self:F( { ZoneName, ZoneGroup } ) + + local GroupPoints = ZoneGroup:GetTaskRoute() + local i = 0 + + self.Polygon = {} + + for i = 1, #GroupPoints do + self.Polygon[i] = {} + self.Polygon[i].x = GroupPoints[i].x + self.Polygon[i].y = GroupPoints[i].y + end + + return self +end + +--- Smokes the zone boundaries in a color. +-- @param #ZONE_POLYGON self +-- @param #POINT_VEC3.SmokeColor SmokeColor The smoke color. +-- @return #ZONE_POLYGON self +function ZONE_POLYGON:SmokeZone( SmokeColor ) + self:F2( SmokeColor ) + + local i + local j + local Segments = 10 + + i = 1 + j = #self.Polygon + + while i <= #self.Polygon do + self:T( { i, j, self.Polygon[i], self.Polygon[j] } ) + + local DeltaX = self.Polygon[j].x - self.Polygon[i].x + local DeltaY = self.Polygon[j].y - self.Polygon[i].y + + for Segment = 0, Segments do -- We divide each line in 5 segments and smoke a point on the line. + local PointX = self.Polygon[i].x + ( Segment * DeltaX / Segments ) + local PointY = self.Polygon[i].y + ( Segment * DeltaY / Segments ) + POINT_VEC2:New( PointX, PointY ):Smoke( SmokeColor ) + end + j = i + i = i + 1 + end + + return self +end + + + + +--- Returns if a location is within the zone. +-- @param #ZONE_POLYGON self +-- @param DCSTypes#Vec2 PointVec2 The location to test. +-- @return #boolean true if the location is within the zone. +function ZONE_POLYGON:IsPointVec2InZone( PointVec2 ) + self:F2( PointVec2 ) + + local i + local j + local c = false + + i = 1 + j = #self.Polygon + + while i < #self.Polygon do + j = i + i = i + 1 + self:T( { i, j, self.Polygon[i], self.Polygon[j] } ) + if ( ( ( self.Polygon[i].y > PointVec2.y ) ~= ( self.Polygon[j].y > PointVec2.y ) ) and + ( PointVec2.x < ( self.Polygon[j].x - self.Polygon[i].x ) * ( PointVec2.y - self.Polygon[i].y ) / ( self.Polygon[j].y - self.Polygon[i].y ) + self.Polygon[i].x ) + ) then + c = not c + end + self:T2( { "c = ", c } ) + end + + self:T( { "c = ", c } ) + return c +end + +--- This module contains the CLIENT class. +-- +-- 1) @{Client#CLIENT} class, extends @{Unit#UNIT} +-- =============================================== +-- Clients are those **Units** defined within the Mission Editor that have the skillset defined as __Client__ or __Player__. +-- Note that clients are NOT the same as Units, they are NOT necessarily alive. +-- The @{Client#CLIENT} class is a wrapper class to handle the DCS Unit objects that have the skillset defined as __Client__ or __Player__: +-- +-- * Wraps the DCS Unit objects with skill level set to Player or Client. +-- * Support all DCS Unit APIs. +-- * Enhance with Unit specific APIs not in the DCS Group API set. +-- * When player joins Unit, execute alive init logic. +-- * Handles messages to players. +-- * Manage the "state" of the DCS Unit. +-- +-- Clients are being used by the @{MISSION} class to follow players and register their successes. +-- +-- 1.1) CLIENT reference methods +-- ----------------------------- +-- For each DCS Unit having skill level Player or Client, a CLIENT wrapper object (instance) will be created within the _@{DATABASE} object. +-- This is done at the beginning of the mission (when the mission starts). +-- +-- The CLIENT class does not contain a :New() method, rather it provides :Find() methods to retrieve the object reference +-- using the DCS Unit or the DCS UnitName. +-- +-- Another thing to know is that CLIENT objects do not "contain" the DCS Unit object. +-- The CLIENT methods will reference the DCS Unit object by name when it is needed during API execution. +-- If the DCS Unit object does not exist or is nil, the CLIENT methods will return nil and log an exception in the DCS.log file. +-- +-- The CLIENT class provides the following functions to retrieve quickly the relevant CLIENT instance: +-- +-- * @{#CLIENT.Find}(): Find a CLIENT instance from the _DATABASE object using a DCS Unit object. +-- * @{#CLIENT.FindByName}(): Find a CLIENT instance from the _DATABASE object using a DCS Unit name. +-- +-- IMPORTANT: ONE SHOULD NEVER SANATIZE these CLIENT OBJECT REFERENCES! (make the CLIENT object references nil). +-- +-- @module Client +-- @author FlightControl + +Include.File( "Routines" ) +Include.File( "Base" ) +Include.File( "Cargo" ) +Include.File( "Message" ) + + +--- The CLIENT class +-- @type CLIENT +-- @extends Unit#UNIT +CLIENT = { + ONBOARDSIDE = { + NONE = 0, + LEFT = 1, + RIGHT = 2, + BACK = 3, + FRONT = 4 + }, + ClassName = "CLIENT", + ClientName = nil, + ClientAlive = false, + ClientTransport = false, + ClientBriefingShown = false, + _Menus = {}, + _Tasks = {}, + Messages = { + } +} + + +--- Finds a CLIENT from the _DATABASE using the relevant DCS Unit. +-- @param #CLIENT self +-- @param #string ClientName Name of the DCS **Unit** as defined within the Mission Editor. +-- @param #string ClientBriefing Text that describes the briefing of the mission when a Player logs into the Client. +-- @return #CLIENT +-- @usage +-- -- Create new Clients. +-- local Mission = MISSIONSCHEDULER.AddMission( 'Russia Transport Troops SA-6', 'Operational', 'Transport troops from the control center to one of the SA-6 SAM sites to activate their operation.', 'Russia' ) +-- Mission:AddGoal( DeploySA6TroopsGoal ) +-- +-- Mission:AddClient( CLIENT:FindByName( 'RU MI-8MTV2*HOT-Deploy Troops 1' ):Transport() ) +-- Mission:AddClient( CLIENT:FindByName( 'RU MI-8MTV2*RAMP-Deploy Troops 3' ):Transport() ) +-- Mission:AddClient( CLIENT:FindByName( 'RU MI-8MTV2*HOT-Deploy Troops 2' ):Transport() ) +-- Mission:AddClient( CLIENT:FindByName( 'RU MI-8MTV2*RAMP-Deploy Troops 4' ):Transport() ) +function CLIENT:Find( DCSUnit ) + local ClientName = DCSUnit:getName() + local ClientFound = _DATABASE:FindClient( ClientName ) + + if ClientFound then + ClientFound:F( ClientName ) + return ClientFound + end + + error( "CLIENT not found for: " .. ClientName ) +end + + +--- Finds a CLIENT from the _DATABASE using the relevant Client Unit Name. +-- As an optional parameter, a briefing text can be given also. +-- @param #CLIENT self +-- @param #string ClientName Name of the DCS **Unit** as defined within the Mission Editor. +-- @param #string ClientBriefing Text that describes the briefing of the mission when a Player logs into the Client. +-- @return #CLIENT +-- @usage +-- -- Create new Clients. +-- local Mission = MISSIONSCHEDULER.AddMission( 'Russia Transport Troops SA-6', 'Operational', 'Transport troops from the control center to one of the SA-6 SAM sites to activate their operation.', 'Russia' ) +-- Mission:AddGoal( DeploySA6TroopsGoal ) +-- +-- Mission:AddClient( CLIENT:FindByName( 'RU MI-8MTV2*HOT-Deploy Troops 1' ):Transport() ) +-- Mission:AddClient( CLIENT:FindByName( 'RU MI-8MTV2*RAMP-Deploy Troops 3' ):Transport() ) +-- Mission:AddClient( CLIENT:FindByName( 'RU MI-8MTV2*HOT-Deploy Troops 2' ):Transport() ) +-- Mission:AddClient( CLIENT:FindByName( 'RU MI-8MTV2*RAMP-Deploy Troops 4' ):Transport() ) +function CLIENT:FindByName( ClientName, ClientBriefing ) + local ClientFound = _DATABASE:FindClient( ClientName ) + + if ClientFound then + ClientFound:F( { ClientName, ClientBriefing } ) + ClientFound:AddBriefing( ClientBriefing ) + ClientFound.MessageSwitch = true + + return ClientFound + end + + error( "CLIENT not found for: " .. ClientName ) +end + +function CLIENT:Register( ClientName ) + local self = BASE:Inherit( self, UNIT:Register( ClientName ) ) + + self:F( ClientName ) + self.ClientName = ClientName + self.MessageSwitch = true + self.ClientAlive2 = false + + --self.AliveCheckScheduler = routines.scheduleFunction( self._AliveCheckScheduler, { self }, timer.getTime() + 1, 5 ) + self.AliveCheckScheduler = SCHEDULER:New( self, self._AliveCheckScheduler, {}, 1, 5 ) + + return self +end + + +--- Transport defines that the Client is a Transport. Transports show cargo. +-- @param #CLIENT self +-- @return #CLIENT +function CLIENT:Transport() + self:F() + + self.ClientTransport = true + return self +end + +--- AddBriefing adds a briefing to a CLIENT when a player joins a mission. +-- @param #CLIENT self +-- @param #string ClientBriefing is the text defining the Mission briefing. +-- @return #CLIENT self +function CLIENT:AddBriefing( ClientBriefing ) + self:F( ClientBriefing ) + self.ClientBriefing = ClientBriefing + self.ClientBriefingShown = false + + return self +end + +--- Show the briefing of a CLIENT. +-- @param #CLIENT self +-- @return #CLIENT self +function CLIENT:ShowBriefing() + self:F( { self.ClientName, self.ClientBriefingShown } ) + + if not self.ClientBriefingShown then + self.ClientBriefingShown = true + local Briefing = "" + if self.ClientBriefing then + Briefing = Briefing .. self.ClientBriefing + end + Briefing = Briefing .. " Press [LEFT ALT]+[B] to view the complete mission briefing." + self:Message( Briefing, 60, self.ClientName .. '/ClientBriefing', "Briefing" ) + end + + return self +end + +--- Show the mission briefing of a MISSION to the CLIENT. +-- @param #CLIENT self +-- @param #string MissionBriefing +-- @return #CLIENT self +function CLIENT:ShowMissionBriefing( MissionBriefing ) + self:F( { self.ClientName } ) + + if MissionBriefing then + self:Message( MissionBriefing, 60, self.ClientName .. '/MissionBriefing', "Mission Briefing" ) + end + + return self +end + + + +--- Resets a CLIENT. +-- @param #CLIENT self +-- @param #string ClientName Name of the Group as defined within the Mission Editor. The Group must have a Unit with the type Client. +function CLIENT:Reset( ClientName ) + self:F() + self._Menus = {} +end + +-- Is Functions + +--- Checks if the CLIENT is a multi-seated UNIT. +-- @param #CLIENT self +-- @return #boolean true if multi-seated. +function CLIENT:IsMultiSeated() + self:F( self.ClientName ) + + local ClientMultiSeatedTypes = { + ["Mi-8MT"] = "Mi-8MT", + ["UH-1H"] = "UH-1H", + ["P-51B"] = "P-51B" + } + + if self:IsAlive() then + local ClientTypeName = self:GetClientGroupUnit():GetTypeName() + if ClientMultiSeatedTypes[ClientTypeName] then + return true + end + end + + return false +end + +--- Checks for a client alive event and calls a function on a continuous basis. +-- @param #CLIENT self +-- @param #function CallBack Function. +-- @return #CLIENT +function CLIENT:Alive( CallBack, ... ) + self:F() + + self.ClientCallBack = CallBack + self.ClientParameters = arg + + return self +end + +--- @param #CLIENT self +function CLIENT:_AliveCheckScheduler() + self:F( { self.ClientName, self.ClientAlive2, self.ClientBriefingShown } ) + + if self:IsAlive() then -- Polymorphic call of UNIT + if self.ClientAlive2 == false then + self:ShowBriefing() + if self.ClientCallBack then + self:T("Calling Callback function") + self.ClientCallBack( self, unpack( self.ClientParameters ) ) + end + self.ClientAlive2 = true + end + else + if self.ClientAlive2 == true then + self.ClientAlive2 = false + end + end + + return true +end + +--- Return the DCSGroup of a Client. +-- This function is modified to deal with a couple of bugs in DCS 1.5.3 +-- @param #CLIENT self +-- @return DCSGroup#Group +function CLIENT:GetDCSGroup() + self:F3() + +-- local ClientData = Group.getByName( self.ClientName ) +-- if ClientData and ClientData:isExist() then +-- self:T( self.ClientName .. " : group found!" ) +-- return ClientData +-- else +-- return nil +-- end + + local ClientUnit = Unit.getByName( self.ClientName ) + + local CoalitionsData = { AlivePlayersRed = coalition.getPlayers( coalition.side.RED ), AlivePlayersBlue = coalition.getPlayers( coalition.side.BLUE ) } + for CoalitionId, CoalitionData in pairs( CoalitionsData ) do + self:T3( { "CoalitionData:", CoalitionData } ) + for UnitId, UnitData in pairs( CoalitionData ) do + self:T3( { "UnitData:", UnitData } ) + if UnitData and UnitData:isExist() then + + --self:E(self.ClientName) + if ClientUnit then + local ClientGroup = ClientUnit:getGroup() + if ClientGroup then + self:T3( "ClientGroup = " .. self.ClientName ) + if ClientGroup:isExist() and UnitData:getGroup():isExist() then + if ClientGroup:getID() == UnitData:getGroup():getID() then + self:T3( "Normal logic" ) + self:T3( self.ClientName .. " : group found!" ) + self.ClientGroupID = ClientGroup:getID() + self.ClientGroupName = ClientGroup:getName() + return ClientGroup + end + else + -- Now we need to resolve the bugs in DCS 1.5 ... + -- Consult the database for the units of the Client Group. (ClientGroup:getUnits() returns nil) + self:T3( "Bug 1.5 logic" ) + local ClientGroupTemplate = _DATABASE.Templates.Units[self.ClientName].GroupTemplate + self.ClientGroupID = ClientGroupTemplate.groupId + self.ClientGroupName = _DATABASE.Templates.Units[self.ClientName].GroupName + self:T3( self.ClientName .. " : group found in bug 1.5 resolvement logic!" ) + return ClientGroup + end + -- else + -- error( "Client " .. self.ClientName .. " not found!" ) + end + else + --self:E( { "Client not found!", self.ClientName } ) + end + end + end + end + + -- For non player clients + if ClientUnit then + local ClientGroup = ClientUnit:getGroup() + if ClientGroup then + self:T3( "ClientGroup = " .. self.ClientName ) + if ClientGroup:isExist() then + self:T3( "Normal logic" ) + self:T3( self.ClientName .. " : group found!" ) + return ClientGroup + end + end + end + + self.ClientGroupID = nil + self.ClientGroupUnit = nil + + return nil +end + + +-- TODO: Check DCSTypes#Group.ID +--- Get the group ID of the client. +-- @param #CLIENT self +-- @return DCSTypes#Group.ID +function CLIENT:GetClientGroupID() + + local ClientGroup = self:GetDCSGroup() + + --self:E( self.ClientGroupID ) -- Determined in GetDCSGroup() + return self.ClientGroupID +end + + +--- Get the name of the group of the client. +-- @param #CLIENT self +-- @return #string +function CLIENT:GetClientGroupName() + + local ClientGroup = self:GetDCSGroup() + + self:T( self.ClientGroupName ) -- Determined in GetDCSGroup() + return self.ClientGroupName +end + +--- Returns the UNIT of the CLIENT. +-- @param #CLIENT self +-- @return Unit#UNIT +function CLIENT:GetClientGroupUnit() + self:F2() + + local ClientDCSUnit = Unit.getByName( self.ClientName ) + + self:T( self.ClientDCSUnit ) + if ClientDCSUnit and ClientDCSUnit:isExist() then + local ClientUnit = _DATABASE:FindUnit( self.ClientName ) + self:T2( ClientUnit ) + return ClientUnit + end +end + +--- Returns the DCSUnit of the CLIENT. +-- @param #CLIENT self +-- @return DCSTypes#Unit +function CLIENT:GetClientGroupDCSUnit() + self:F2() + + local ClientDCSUnit = Unit.getByName( self.ClientName ) + + if ClientDCSUnit and ClientDCSUnit:isExist() then + self:T2( ClientDCSUnit ) + return ClientDCSUnit + end +end + + +--- Evaluates if the CLIENT is a transport. +-- @param #CLIENT self +-- @return #boolean true is a transport. +function CLIENT:IsTransport() + self:F() + return self.ClientTransport +end + +--- Shows the @{Cargo#CARGO} contained within the CLIENT to the player as a message. +-- The @{Cargo#CARGO} is shown using the @{Message#MESSAGE} distribution system. +-- @param #CLIENT self +function CLIENT:ShowCargo() + self:F() + + local CargoMsg = "" + + for CargoName, Cargo in pairs( CARGOS ) do + if self == Cargo:IsLoadedInClient() then + CargoMsg = CargoMsg .. Cargo.CargoName .. " Type:" .. Cargo.CargoType .. " Weight: " .. Cargo.CargoWeight .. "\n" + end + end + + if CargoMsg == "" then + CargoMsg = "empty" + end + + self:Message( CargoMsg, 15, self.ClientName .. "/Cargo", "Co-Pilot: Cargo Status", 30 ) + +end + +-- TODO (1) I urgently need to revise this. +--- A local function called by the DCS World Menu system to switch off messages. +function CLIENT.SwitchMessages( PrmTable ) + PrmTable[1].MessageSwitch = PrmTable[2] +end + +--- The main message driver for the CLIENT. +-- This function displays various messages to the Player logged into the CLIENT through the DCS World Messaging system. +-- @param #CLIENT self +-- @param #string Message is the text describing the message. +-- @param #number MessageDuration is the duration in seconds that the Message should be displayed. +-- @param #string MessageId is a text identifying the Message in the MessageQueue. The Message system overwrites Messages with the same MessageId +-- @param #string MessageCategory is the category of the message (the title). +-- @param #number MessageInterval is the interval in seconds between the display of the @{Message#MESSAGE} when the CLIENT is in the air. +function CLIENT:Message( Message, MessageDuration, MessageId, MessageCategory, MessageInterval ) + self:F( { Message, MessageDuration, MessageId, MessageCategory, MessageInterval } ) + + if not self.MenuMessages then + if self:GetClientGroupID() then + self.MenuMessages = MENU_CLIENT:New( self, 'Messages' ) + self.MenuRouteMessageOn = MENU_CLIENT_COMMAND:New( self, 'Messages On', self.MenuMessages, CLIENT.SwitchMessages, { self, true } ) + self.MenuRouteMessageOff = MENU_CLIENT_COMMAND:New( self,'Messages Off', self.MenuMessages, CLIENT.SwitchMessages, { self, false } ) + end + end + + if self.MessageSwitch == true then + if MessageCategory == nil then + MessageCategory = "Messages" + end + if self.Messages[MessageId] == nil then + self.Messages[MessageId] = {} + self.Messages[MessageId].MessageId = MessageId + self.Messages[MessageId].MessageTime = timer.getTime() + self.Messages[MessageId].MessageDuration = MessageDuration + if MessageInterval == nil then + self.Messages[MessageId].MessageInterval = 600 + else + self.Messages[MessageId].MessageInterval = MessageInterval + end + MESSAGE:New( Message, MessageCategory, MessageDuration, MessageId ):ToClient( self ) + else + if self:GetClientGroupDCSUnit() and not self:GetClientGroupDCSUnit():inAir() then + if timer.getTime() - self.Messages[MessageId].MessageTime >= self.Messages[MessageId].MessageDuration + 10 then + MESSAGE:New( Message, MessageCategory, MessageDuration, MessageId ):ToClient( self ) + self.Messages[MessageId].MessageTime = timer.getTime() + end + else + if timer.getTime() - self.Messages[MessageId].MessageTime >= self.Messages[MessageId].MessageDuration + self.Messages[MessageId].MessageInterval then + MESSAGE:New( Message, MessageCategory, MessageDuration, MessageId ):ToClient( self ) + self.Messages[MessageId].MessageTime = timer.getTime() + end + end + end + end +end +--- Manage the mission database. +-- +-- @{#DATABASE} class +-- ================== +-- Mission designers can use the DATABASE class to refer to: +-- +-- * UNITS +-- * GROUPS +-- * players +-- * alive players +-- * CLIENTS +-- * alive CLIENTS +-- +-- On top, for internal MOOSE administration purposes, the DATBASE administers the Unit and Gruop templates as defined within the Mission Editor. +-- +-- Moose will automatically create one instance of the DATABASE class into the **global** object _DATABASE. +-- Moose refers to _DATABASE within the framework extensively, but you can also refer to the _DATABASE object within your missions if required. +-- +-- DATABASE iterators: +-- =================== +-- You can iterate the database with the available iterator methods. +-- The iterator methods will walk the DATABASE set, and call for each element within the set a function that you provide. +-- The following iterator methods are currently available within the DATABASE: +-- +-- * @{#DATABASE.ForEachUnit}: Calls a function for each @{UNIT} it finds within the DATABASE. +-- * @{#DATABASE.ForEachGroup}: Calls a function for each @{GROUP} it finds within the DATABASE. +-- * @{#DATABASE.ForEachPlayer}: Calls a function for each player it finds within the DATABASE. +-- * @{#DATABASE.ForEachPlayerAlive}: Calls a function for each alive player it finds within the DATABASE. +-- * @{#DATABASE.ForEachClient}: Calls a function for each @{CLIENT} it finds within the DATABASE. +-- * @{#DATABASE.ForEachClientAlive}: Calls a function for each alive @{CLIENT} it finds within the DATABASE. +-- +-- @module Database +-- @author FlightControl + +Include.File( "Routines" ) +Include.File( "Base" ) +Include.File( "Menu" ) +Include.File( "Group" ) +Include.File( "Static" ) +Include.File( "Unit" ) +Include.File( "Event" ) +Include.File( "Client" ) +Include.File( "Scheduler" ) + + +--- DATABASE class +-- @type DATABASE +-- @extends Base#BASE +DATABASE = { + ClassName = "DATABASE", + Templates = { + Units = {}, + Groups = {}, + ClientsByName = {}, + ClientsByID = {}, + }, + DCSUnits = {}, + DCSGroups = {}, + DCSStatics = {}, + UNITS = {}, + STATICS = {}, + GROUPS = {}, + PLAYERS = {}, + PLAYERSALIVE = {}, + CLIENTS = {}, + CLIENTSALIVE = {}, + NavPoints = {}, +} + +local _DATABASECoalition = + { + [1] = "Red", + [2] = "Blue", + } + +local _DATABASECategory = + { + [Unit.Category.AIRPLANE] = "Plane", + [Unit.Category.HELICOPTER] = "Helicopter", + [Unit.Category.GROUND_UNIT] = "Vehicle", + [Unit.Category.SHIP] = "Ship", + [Unit.Category.STRUCTURE] = "Structure", + } + + +--- Creates a new DATABASE object, building a set of units belonging to a coalitions, categories, countries, types or with defined prefix names. +-- @param #DATABASE self +-- @return #DATABASE +-- @usage +-- -- Define a new DATABASE Object. This DBObject will contain a reference to all Group and Unit Templates defined within the ME and the DCSRTE. +-- DBObject = DATABASE:New() +function DATABASE:New() + + -- Inherits from BASE + local self = BASE:Inherit( self, BASE:New() ) + + _EVENTDISPATCHER:OnBirth( self._EventOnBirth, self ) + _EVENTDISPATCHER:OnDead( self._EventOnDeadOrCrash, self ) + _EVENTDISPATCHER:OnCrash( self._EventOnDeadOrCrash, self ) + + + -- Follow alive players and clients + _EVENTDISPATCHER:OnPlayerEnterUnit( self._EventOnPlayerEnterUnit, self ) + _EVENTDISPATCHER:OnPlayerLeaveUnit( self._EventOnPlayerLeaveUnit, self ) + + self:_RegisterTemplates() + self:_RegisterGroupsAndUnits() + self:_RegisterStatics() + self:_RegisterPlayers() + + return self +end + +--- Finds a Unit based on the Unit Name. +-- @param #DATABASE self +-- @param #string UnitName +-- @return Unit#UNIT The found Unit. +function DATABASE:FindUnit( UnitName ) + + local UnitFound = self.UNITS[UnitName] + return UnitFound +end + + +--- Adds a Unit based on the Unit Name in the DATABASE. +-- @param #DATABASE self +function DATABASE:AddUnit( DCSUnit, DCSUnitName ) + + self.DCSUnits[DCSUnitName] = DCSUnit + self.UNITS[DCSUnitName] = UNIT:Register( DCSUnitName ) +end + + +--- Deletes a Unit from the DATABASE based on the Unit Name. +-- @param #DATABASE self +function DATABASE:DeleteUnit( DCSUnitName ) + + self.DCSUnits[DCSUnitName] = nil +end + +--- Adds a Static based on the Static Name in the DATABASE. +-- @param #DATABASE self +function DATABASE:AddStatic( DCSStatic, DCSStaticName ) + + self.DCSStatics[DCSStaticName] = DCSStatic + self.STATICS[DCSStaticName] = STATIC:Register( DCSStaticName ) +end + + +--- Deletes a Static from the DATABASE based on the Static Name. +-- @param #DATABASE self +function DATABASE:DeleteStatic( DCSStaticName ) + + self.DCSStatics[DCSStaticName] = nil +end + +--- Finds a STATIC based on the StaticName. +-- @param #DATABASE self +-- @param #string StaticName +-- @return Static#STATIC The found STATIC. +function DATABASE:FindStatic( StaticName ) + + local StaticFound = self.STATICS[StaticName] + return StaticFound +end + + +--- Finds a CLIENT based on the ClientName. +-- @param #DATABASE self +-- @param #string ClientName +-- @return Client#CLIENT The found CLIENT. +function DATABASE:FindClient( ClientName ) + + local ClientFound = self.CLIENTS[ClientName] + return ClientFound +end + + +--- Adds a CLIENT based on the ClientName in the DATABASE. +-- @param #DATABASE self +function DATABASE:AddClient( ClientName ) + + self.CLIENTS[ClientName] = CLIENT:Register( ClientName ) + self:E( self.CLIENTS[ClientName]:GetClassNameAndID() ) +end + + +--- Finds a GROUP based on the GroupName. +-- @param #DATABASE self +-- @param #string GroupName +-- @return Group#GROUP The found GROUP. +function DATABASE:FindGroup( GroupName ) + + local GroupFound = self.GROUPS[GroupName] + return GroupFound +end + + +--- Adds a GROUP based on the GroupName in the DATABASE. +-- @param #DATABASE self +function DATABASE:AddGroup( DCSGroup, GroupName ) + + self.DCSGroups[GroupName] = DCSGroup + self.GROUPS[GroupName] = GROUP:Register( GroupName ) +end + +--- Adds a player based on the Player Name in the DATABASE. +-- @param #DATABASE self +function DATABASE:AddPlayer( UnitName, PlayerName ) + + if PlayerName then + self:E( { "Add player for unit:", UnitName, PlayerName } ) + self.PLAYERS[PlayerName] = PlayerName + self.PLAYERSALIVE[PlayerName] = PlayerName + self.CLIENTSALIVE[PlayerName] = self:FindClient( UnitName ) + end +end + +--- Deletes a player from the DATABASE based on the Player Name. +-- @param #DATABASE self +function DATABASE:DeletePlayer( PlayerName ) + + if PlayerName then + self:E( { "Clean player:", PlayerName } ) + self.PLAYERSALIVE[PlayerName] = nil + self.CLIENTSALIVE[PlayerName] = nil + end +end + + +--- Instantiate new Groups within the DCSRTE. +-- This method expects EXACTLY the same structure as a structure within the ME, and needs 2 additional fields defined: +-- SpawnCountryID, SpawnCategoryID +-- This method is used by the SPAWN class. +-- @param #DATABASE self +-- @param #table SpawnTemplate +-- @return #DATABASE self +function DATABASE:Spawn( SpawnTemplate ) + self:F2( SpawnTemplate.name ) + + self:T2( { SpawnTemplate.SpawnCountryID, SpawnTemplate.SpawnCategoryID } ) + + -- Copy the spawn variables of the template in temporary storage, nullify, and restore the spawn variables. + local SpawnCoalitionID = SpawnTemplate.SpawnCoalitionID + local SpawnCountryID = SpawnTemplate.SpawnCountryID + local SpawnCategoryID = SpawnTemplate.SpawnCategoryID + + -- Nullify + SpawnTemplate.SpawnCoalitionID = nil + SpawnTemplate.SpawnCountryID = nil + SpawnTemplate.SpawnCategoryID = nil + + self:_RegisterTemplate( SpawnTemplate ) + + self:T3( SpawnTemplate ) + coalition.addGroup( SpawnCountryID, SpawnCategoryID, SpawnTemplate ) + + -- Restore + SpawnTemplate.SpawnCoalitionID = SpawnCoalitionID + SpawnTemplate.SpawnCountryID = SpawnCountryID + SpawnTemplate.SpawnCategoryID = SpawnCategoryID + + local SpawnGroup = GROUP:Register( SpawnTemplate.name ) + return SpawnGroup +end + +--- Set a status to a Group within the Database, this to check crossing events for example. +function DATABASE:SetStatusGroup( GroupName, Status ) + self:F2( Status ) + + self.Templates.Groups[GroupName].Status = Status +end + +--- Get a status to a Group within the Database, this to check crossing events for example. +function DATABASE:GetStatusGroup( GroupName ) + self:F2( Status ) + + if self.Templates.Groups[GroupName] then + return self.Templates.Groups[GroupName].Status + else + return "" + end +end + + +--- Private method that registers new Group Templates within the DATABASE Object. +-- @param #DATABASE self +-- @param #table GroupTemplate +-- @return #DATABASE self +function DATABASE:_RegisterTemplate( GroupTemplate ) + + local GroupTemplateName = env.getValueDictByKey(GroupTemplate.name) + + if not self.Templates.Groups[GroupTemplateName] then + self.Templates.Groups[GroupTemplateName] = {} + self.Templates.Groups[GroupTemplateName].Status = nil + end + + -- Delete the spans from the route, it is not needed and takes memory. + if GroupTemplate.route and GroupTemplate.route.spans then + GroupTemplate.route.spans = nil + end + + self.Templates.Groups[GroupTemplateName].GroupName = GroupTemplateName + self.Templates.Groups[GroupTemplateName].Template = GroupTemplate + self.Templates.Groups[GroupTemplateName].groupId = GroupTemplate.groupId + self.Templates.Groups[GroupTemplateName].UnitCount = #GroupTemplate.units + self.Templates.Groups[GroupTemplateName].Units = GroupTemplate.units + + self:T2( { "Group", self.Templates.Groups[GroupTemplateName].GroupName, self.Templates.Groups[GroupTemplateName].UnitCount } ) + + for unit_num, UnitTemplate in pairs( GroupTemplate.units ) do + + local UnitTemplateName = env.getValueDictByKey(UnitTemplate.name) + self.Templates.Units[UnitTemplateName] = {} + self.Templates.Units[UnitTemplateName].UnitName = UnitTemplateName + self.Templates.Units[UnitTemplateName].Template = UnitTemplate + self.Templates.Units[UnitTemplateName].GroupName = GroupTemplateName + self.Templates.Units[UnitTemplateName].GroupTemplate = GroupTemplate + self.Templates.Units[UnitTemplateName].GroupId = GroupTemplate.groupId + self:E( {"skill",UnitTemplate.skill}) + if UnitTemplate.skill and (UnitTemplate.skill == "Client" or UnitTemplate.skill == "Player") then + self.Templates.ClientsByName[UnitTemplateName] = UnitTemplate + self.Templates.ClientsByID[UnitTemplate.unitId] = UnitTemplate + end + self:E( { "Unit", self.Templates.Units[UnitTemplateName].UnitName } ) + end +end + + +--- Private method that registers all alive players in the mission. +-- @param #DATABASE self +-- @return #DATABASE self +function DATABASE:_RegisterPlayers() + + local CoalitionsData = { AlivePlayersRed = coalition.getPlayers( coalition.side.RED ), AlivePlayersBlue = coalition.getPlayers( coalition.side.BLUE ) } + for CoalitionId, CoalitionData in pairs( CoalitionsData ) do + for UnitId, UnitData in pairs( CoalitionData ) do + self:T3( { "UnitData:", UnitData } ) + if UnitData and UnitData:isExist() then + local UnitName = UnitData:getName() + local PlayerName = UnitData:getPlayerName() + if not self.PLAYERS[PlayerName] then + self:E( { "Add player for unit:", UnitName, PlayerName } ) + self:AddPlayer( UnitName, PlayerName ) + end + end + end + end + + return self +end + + +--- Private method that registers all Groups and Units within in the mission. +-- @param #DATABASE self +-- @return #DATABASE self +function DATABASE:_RegisterGroupsAndUnits() + + local CoalitionsData = { GroupsRed = coalition.getGroups( coalition.side.RED ), GroupsBlue = coalition.getGroups( coalition.side.BLUE ) } + for CoalitionId, CoalitionData in pairs( CoalitionsData ) do + for DCSGroupId, DCSGroup in pairs( CoalitionData ) do + + if DCSGroup:isExist() then + local DCSGroupName = DCSGroup:getName() + + self:E( { "Register Group:", DCSGroup, DCSGroupName } ) + self:AddGroup( DCSGroup, DCSGroupName ) + + for DCSUnitId, DCSUnit in pairs( DCSGroup:getUnits() ) do + + local DCSUnitName = DCSUnit:getName() + self:E( { "Register Unit:", DCSUnit, DCSUnitName } ) + self:AddUnit( DCSUnit, DCSUnitName ) + end + else + self:E( { "Group does not exist: ", DCSGroup } ) + end + + end + end + + for ClientName, ClientTemplate in pairs( self.Templates.ClientsByName ) do + self:E( { "Adding Client:", ClientName } ) + self:AddClient( ClientName ) + end + + return self +end + +function DATABASE:_RegisterStatics() + + local CoalitionsData = { GroupsRed = coalition.getStaticObjects( coalition.side.RED ), GroupsBlue = coalition.getStaticObjects( coalition.side.BLUE ) } + for CoalitionId, CoalitionData in pairs( CoalitionsData ) do + for DCSStaticId, DCSStatic in pairs( CoalitionData ) do + + if DCSStatic:isExist() then + local DCSStaticName = DCSStatic:getName() + + self:E( { "Register Static:", DCSStatic, DCSStaticName } ) + self:AddStatic( DCSStatic, DCSStaticName ) + else + self:E( { "Static does not exist: ", DCSStatic } ) + end + end + end + + return self +end + + +--- Events + +--- Handles the OnBirth event for the alive units set. +-- @param #DATABASE self +-- @param Event#EVENTDATA Event +function DATABASE:_EventOnBirth( Event ) + self:F2( { Event } ) + + if Event.IniDCSUnit then + self:AddUnit( Event.IniDCSUnit, Event.IniDCSUnitName ) + self:AddGroup( Event.IniDCSGroup, Event.IniDCSGroupName ) + self:_EventOnPlayerEnterUnit( Event ) + end +end + + +--- Handles the OnDead or OnCrash event for alive units set. +-- @param #DATABASE self +-- @param Event#EVENTDATA Event +function DATABASE:_EventOnDeadOrCrash( Event ) + self:F2( { Event } ) + + if Event.IniDCSUnit then + if self.DCSUnits[Event.IniDCSUnitName] then + self:DeleteUnit( Event.IniDCSUnitName ) + -- add logic to correctly remove a group once all units are destroyed... + end + end +end + + +--- Handles the OnPlayerEnterUnit event to fill the active players table (with the unit filter applied). +-- @param #DATABASE self +-- @param Event#EVENTDATA Event +function DATABASE:_EventOnPlayerEnterUnit( Event ) + self:F2( { Event } ) + + if Event.IniDCSUnit then + local PlayerName = Event.IniDCSUnit:getPlayerName() + if not self.PLAYERSALIVE[PlayerName] then + self:AddPlayer( Event.IniDCSUnitName, PlayerName ) + end + end +end + + +--- Handles the OnPlayerLeaveUnit event to clean the active players table. +-- @param #DATABASE self +-- @param Event#EVENTDATA Event +function DATABASE:_EventOnPlayerLeaveUnit( Event ) + self:F2( { Event } ) + + if Event.IniDCSUnit then + local PlayerName = Event.IniDCSUnit:getPlayerName() + if self.PLAYERSALIVE[PlayerName] then + self:DeletePlayer( PlayerName ) + end + end +end + +--- Iterators + +--- Iterate the DATABASE and call an iterator function for the given set, providing the Object for each element within the set and optional parameters. +-- @param #DATABASE self +-- @param #function IteratorFunction The function that will be called when there is an alive player in the database. +-- @return #DATABASE self +function DATABASE:ForEach( IteratorFunction, arg, Set ) + self:F2( arg ) + + local function CoRoutine() + local Count = 0 + for ObjectID, Object in pairs( Set ) do + self:T2( Object ) + IteratorFunction( Object, unpack( arg ) ) + Count = Count + 1 + if Count % 10 == 0 then + coroutine.yield( false ) + end + end + return true + end + + local co = coroutine.create( CoRoutine ) + + local function Schedule() + + local status, res = coroutine.resume( co ) + self:T2( { status, res } ) + + if status == false then + error( res ) + end + if res == false then + return true -- resume next time the loop + end + + return false + end + + local Scheduler = SCHEDULER:New( self, Schedule, {}, 0.001, 0.001, 0 ) + + return self +end + + +--- Iterate the DATABASE and call an iterator function for each **alive** unit, providing the DCSUnit and optional parameters. +-- @param #DATABASE self +-- @param #function IteratorFunction The function that will be called when there is an alive unit in the database. The function needs to accept a DCSUnit parameter. +-- @return #DATABASE self +function DATABASE:ForEachDCSUnit( IteratorFunction, ... ) + self:F2( arg ) + + self:ForEach( IteratorFunction, arg, self.DCSUnits ) + + return self +end + + +--- Iterate the DATABASE and call an iterator function for each **alive** UNIT, providing the UNIT and optional parameters. +-- @param #DATABASE self +-- @param #function IteratorFunction The function that will be called when there is an alive UNIT in the database. The function needs to accept a UNIT parameter. +-- @return #DATABASE self +function DATABASE:ForEachUnit( IteratorFunction, ... ) + self:F2( arg ) + + self:ForEach( IteratorFunction, arg, self.UNITS ) + + return self +end + +--- Iterate the DATABASE and call an iterator function for each **alive** GROUP, providing the GROUP and optional parameters. +-- @param #DATABASE self +-- @param #function IteratorFunction The function that will be called when there is an alive GROUP in the database. The function needs to accept a GROUP parameter. +-- @return #DATABASE self +function DATABASE:ForEachGroup( IteratorFunction, ... ) + self:F2( arg ) + + self:ForEach( IteratorFunction, arg, self.GROUPS ) + + return self +end + + +--- Iterate the DATABASE and call an iterator function for each player, providing the player name and optional parameters. +-- @param #DATABASE self +-- @param #function IteratorFunction The function that will be called when there is an player in the database. The function needs to accept the player name. +-- @return #DATABASE self +function DATABASE:ForEachPlayer( IteratorFunction, ... ) + self:F2( arg ) + + self:ForEach( IteratorFunction, arg, self.PLAYERS ) + + return self +end + + +--- Iterate the DATABASE and call an iterator function for each **alive** player, providing the Unit of the player and optional parameters. +-- @param #DATABASE self +-- @param #function IteratorFunction The function that will be called when there is an alive player in the database. The function needs to accept a UNIT parameter. +-- @return #DATABASE self +function DATABASE:ForEachPlayerAlive( IteratorFunction, ... ) + self:F2( arg ) + + self:ForEach( IteratorFunction, arg, self.PLAYERSALIVE ) + + return self +end + +--- Iterate the DATABASE and call an iterator function for each CLIENT, providing the CLIENT to the function and optional parameters. +-- @param #DATABASE self +-- @param #function IteratorFunction The function that will be called when there is an alive player in the database. The function needs to accept a CLIENT parameter. +-- @return #DATABASE self +function DATABASE:ForEachClient( IteratorFunction, ... ) + self:F2( arg ) + + self:ForEach( IteratorFunction, arg, self.CLIENTS ) + + return self +end + +--- Iterate the DATABASE and call an iterator function for each **ALIVE** CLIENT, providing the CLIENT to the function and optional parameters. +-- @param #DATABASE self +-- @param #function IteratorFunction The function that will be called when there is an alive CLIENT in the database. The function needs to accept a CLIENT parameter. +-- @return #DATABASE self +function DATABASE:ForEachClientAlive( IteratorFunction, ... ) + self:F2( arg ) + + self:ForEach( IteratorFunction, arg, self.CLIENTSALIVE ) + + return self +end + + +function DATABASE:_RegisterTemplates() + self:F2() + + self.Navpoints = {} + self.UNITS = {} + --Build routines.db.units and self.Navpoints + for coa_name, coa_data in pairs(env.mission.coalition) do + + if (coa_name == 'red' or coa_name == 'blue') and type(coa_data) == 'table' then + --self.Units[coa_name] = {} + + ---------------------------------------------- + -- build nav points DB + self.Navpoints[coa_name] = {} + if coa_data.nav_points then --navpoints + for nav_ind, nav_data in pairs(coa_data.nav_points) do + + if type(nav_data) == 'table' then + self.Navpoints[coa_name][nav_ind] = routines.utils.deepCopy(nav_data) + + self.Navpoints[coa_name][nav_ind]['name'] = nav_data.callsignStr -- name is a little bit more self-explanatory. + self.Navpoints[coa_name][nav_ind]['point'] = {} -- point is used by SSE, support it. + self.Navpoints[coa_name][nav_ind]['point']['x'] = nav_data.x + self.Navpoints[coa_name][nav_ind]['point']['y'] = 0 + self.Navpoints[coa_name][nav_ind]['point']['z'] = nav_data.y + end + end + end + ------------------------------------------------- + if coa_data.country then --there is a country table + for cntry_id, cntry_data in pairs(coa_data.country) do + + local countryName = string.lower(cntry_data.name) + --self.Units[coa_name][countryName] = {} + --self.Units[coa_name][countryName]["countryId"] = cntry_data.id + + if type(cntry_data) == 'table' then --just making sure + + for obj_type_name, obj_type_data in pairs(cntry_data) do + + if obj_type_name == "helicopter" or obj_type_name == "ship" or obj_type_name == "plane" or obj_type_name == "vehicle" or obj_type_name == "static" then --should be an unncessary check + + local category = obj_type_name + + if ((type(obj_type_data) == 'table') and obj_type_data.group and (type(obj_type_data.group) == 'table') and (#obj_type_data.group > 0)) then --there's a group! + + --self.Units[coa_name][countryName][category] = {} + + for group_num, GroupTemplate in pairs(obj_type_data.group) do + + if GroupTemplate and GroupTemplate.units and type(GroupTemplate.units) == 'table' then --making sure again- this is a valid group + self:_RegisterTemplate( GroupTemplate ) + end --if GroupTemplate and GroupTemplate.units then + end --for group_num, GroupTemplate in pairs(obj_type_data.group) do + end --if ((type(obj_type_data) == 'table') and obj_type_data.group and (type(obj_type_data.group) == 'table') and (#obj_type_data.group > 0)) then + end --if obj_type_name == "helicopter" or obj_type_name == "ship" or obj_type_name == "plane" or obj_type_name == "vehicle" or obj_type_name == "static" then + end --for obj_type_name, obj_type_data in pairs(cntry_data) do + end --if type(cntry_data) == 'table' then + end --for cntry_id, cntry_data in pairs(coa_data.country) do + end --if coa_data.country then --there is a country table + end --if coa_name == 'red' or coa_name == 'blue' and type(coa_data) == 'table' then + end --for coa_name, coa_data in pairs(mission.coalition) do + + return self +end + + + + +--- The main include file for the MOOSE system. + +Include.File( "Routines" ) +Include.File( "Base" ) +Include.File( "Database" ) +Include.File( "Event" ) + +-- The order of the declarations is important here. Don't touch it. + +--- Declare the event dispatcher based on the EVENT class +_EVENTDISPATCHER = EVENT:New() -- #EVENT + +--- Declare the main database object, which is used internally by the MOOSE classes. +_DATABASE = DATABASE:New() -- Database#DATABASE + +--- Scoring system for MOOSE. +-- This scoring class calculates the hits and kills that players make within a simulation session. +-- Scoring is calculated using a defined algorithm. +-- With a small change in MissionScripting.lua, the scoring can also be logged in a CSV file, that can then be uploaded +-- to a database or a BI tool to publish the scoring results to the player community. +-- @module Scoring +-- @author FlightControl + + +Include.File( "Routines" ) +Include.File( "Base" ) +Include.File( "Menu" ) +Include.File( "Group" ) +Include.File( "Event" ) + + +--- The Scoring class +-- @type SCORING +-- @field Players A collection of the current players that have joined the game. +-- @extends Base#BASE +SCORING = { + ClassName = "SCORING", + ClassID = 0, + Players = {}, +} + +local _SCORINGCoalition = + { + [1] = "Red", + [2] = "Blue", + } + +local _SCORINGCategory = + { + [Unit.Category.AIRPLANE] = "Plane", + [Unit.Category.HELICOPTER] = "Helicopter", + [Unit.Category.GROUND_UNIT] = "Vehicle", + [Unit.Category.SHIP] = "Ship", + [Unit.Category.STRUCTURE] = "Structure", + } + +--- Creates a new SCORING object to administer the scoring achieved by players. +-- @param #SCORING self +-- @param #string GameName The name of the game. This name is also logged in the CSV score file. +-- @return #SCORING self +-- @usage +-- -- Define a new scoring object for the mission Gori Valley. +-- ScoringObject = SCORING:New( "Gori Valley" ) +function SCORING:New( GameName ) + + -- Inherits from BASE + local self = BASE:Inherit( self, BASE:New() ) + + if GameName then + self.GameName = GameName + else + error( "A game name must be given to register the scoring results" ) + end + + + _EVENTDISPATCHER:OnDead( self._EventOnDeadOrCrash, self ) + _EVENTDISPATCHER:OnCrash( self._EventOnDeadOrCrash, self ) + _EVENTDISPATCHER:OnHit( self._EventOnHit, self ) + + --self.SchedulerId = routines.scheduleFunction( SCORING._FollowPlayersScheduled, { self }, 0, 5 ) + self.SchedulerId = SCHEDULER:New( self, self._FollowPlayersScheduled, {}, 0, 5 ) + + self:ScoreMenu() + + return self + +end + +--- Creates a score radio menu. Can be accessed using Radio -> F10. +-- @param #SCORING self +-- @return #SCORING self +function SCORING:ScoreMenu() + self.Menu = SUBMENU:New( 'Scoring' ) + self.AllScoresMenu = COMMANDMENU:New( 'Score All Active Players', self.Menu, SCORING.ReportScoreAll, self ) + --- = COMMANDMENU:New('Your Current Score', ReportScore, SCORING.ReportScorePlayer, self ) + return self +end + +--- Follows new players entering Clients within the DCSRTE. +-- TODO: Need to see if i can catch this also with an event. It will eliminate the schedule ... +function SCORING:_FollowPlayersScheduled() + self:F3( "_FollowPlayersScheduled" ) + + local ClientUnit = 0 + local CoalitionsData = { AlivePlayersRed = coalition.getPlayers(coalition.side.RED), AlivePlayersBlue = coalition.getPlayers(coalition.side.BLUE) } + local unitId + local unitData + local AlivePlayerUnits = {} + + for CoalitionId, CoalitionData in pairs( CoalitionsData ) do + self:T3( { "_FollowPlayersScheduled", CoalitionData } ) + for UnitId, UnitData in pairs( CoalitionData ) do + self:_AddPlayerFromUnit( UnitData ) + end + end + + return true +end + + +--- Track DEAD or CRASH events for the scoring. +-- @param #SCORING self +-- @param Event#EVENTDATA Event +function SCORING:_EventOnDeadOrCrash( Event ) + self:F( { Event } ) + + local TargetUnit = nil + local TargetGroup = nil + local TargetUnitName = "" + local TargetGroupName = "" + local TargetPlayerName = "" + local TargetCoalition = nil + local TargetCategory = nil + local TargetType = nil + local TargetUnitCoalition = nil + local TargetUnitCategory = nil + local TargetUnitType = nil + + if Event.IniDCSUnit then + + TargetUnit = Event.IniDCSUnit + TargetUnitName = Event.IniDCSUnitName + TargetGroup = Event.IniDCSGroup + TargetGroupName = Event.IniDCSGroupName + TargetPlayerName = TargetUnit:getPlayerName() + + TargetCoalition = TargetUnit:getCoalition() + --TargetCategory = TargetUnit:getCategory() + TargetCategory = TargetUnit:getDesc().category -- Workaround + TargetType = TargetUnit:getTypeName() + + TargetUnitCoalition = _SCORINGCoalition[TargetCoalition] + TargetUnitCategory = _SCORINGCategory[TargetCategory] + TargetUnitType = TargetType + + self:T( { TargetUnitName, TargetGroupName, TargetPlayerName, TargetCoalition, TargetCategory, TargetType } ) + end + + for PlayerName, PlayerData in pairs( self.Players ) do + if PlayerData then -- This should normally not happen, but i'll test it anyway. + self:T( "Something got killed" ) + + -- Some variables + local InitUnitName = PlayerData.UnitName + local InitUnitType = PlayerData.UnitType + local InitCoalition = PlayerData.UnitCoalition + local InitCategory = PlayerData.UnitCategory + local InitUnitCoalition = _SCORINGCoalition[InitCoalition] + local InitUnitCategory = _SCORINGCategory[InitCategory] + + self:T( { InitUnitName, InitUnitType, InitUnitCoalition, InitCoalition, InitUnitCategory, InitCategory } ) + + -- What is he hitting? + if TargetCategory then + if PlayerData and PlayerData.Hit and PlayerData.Hit[TargetCategory] and PlayerData.Hit[TargetCategory][TargetUnitName] then -- Was there a hit for this unit for this player before registered??? + if not PlayerData.Kill[TargetCategory] then + PlayerData.Kill[TargetCategory] = {} + end + if not PlayerData.Kill[TargetCategory][TargetType] then + PlayerData.Kill[TargetCategory][TargetType] = {} + PlayerData.Kill[TargetCategory][TargetType].Score = 0 + PlayerData.Kill[TargetCategory][TargetType].ScoreKill = 0 + PlayerData.Kill[TargetCategory][TargetType].Penalty = 0 + PlayerData.Kill[TargetCategory][TargetType].PenaltyKill = 0 + end + + if InitCoalition == TargetCoalition then + PlayerData.Penalty = PlayerData.Penalty + 25 + PlayerData.Kill[TargetCategory][TargetType].Penalty = PlayerData.Kill[TargetCategory][TargetType].Penalty + 25 + PlayerData.Kill[TargetCategory][TargetType].PenaltyKill = PlayerData.Kill[TargetCategory][TargetType].PenaltyKill + 1 + MESSAGE:New( "Player '" .. PlayerName .. "' killed a friendly " .. TargetUnitCategory .. " ( " .. TargetType .. " ) " .. + PlayerData.Kill[TargetCategory][TargetType].PenaltyKill .. " times. Penalty: -" .. PlayerData.Kill[TargetCategory][TargetType].Penalty .. + ". Score Total:" .. PlayerData.Score - PlayerData.Penalty, + "", 5, "/PENALTY" .. PlayerName .. "/" .. InitUnitName ):ToAll() + self:ScoreCSV( PlayerName, "KILL_PENALTY", 1, -125, InitUnitName, InitUnitCoalition, InitUnitCategory, InitUnitType, TargetUnitName, TargetUnitCoalition, TargetUnitCategory, TargetUnitType ) + else + PlayerData.Score = PlayerData.Score + 10 + PlayerData.Kill[TargetCategory][TargetType].Score = PlayerData.Kill[TargetCategory][TargetType].Score + 10 + PlayerData.Kill[TargetCategory][TargetType].ScoreKill = PlayerData.Kill[TargetCategory][TargetType].ScoreKill + 1 + MESSAGE:New( "Player '" .. PlayerName .. "' killed an enemy " .. TargetUnitCategory .. " ( " .. TargetType .. " ) " .. + PlayerData.Kill[TargetCategory][TargetType].ScoreKill .. " times. Score: " .. PlayerData.Kill[TargetCategory][TargetType].Score .. + ". Score Total:" .. PlayerData.Score - PlayerData.Penalty, + "", 5, "/SCORE" .. PlayerName .. "/" .. InitUnitName ):ToAll() + self:ScoreCSV( PlayerName, "KILL_SCORE", 1, 10, InitUnitName, InitUnitCoalition, InitUnitCategory, InitUnitType, TargetUnitName, TargetUnitCoalition, TargetUnitCategory, TargetUnitType ) + end + end + end + end + end +end + + + +--- Add a new player entering a Unit. +function SCORING:_AddPlayerFromUnit( UnitData ) + self:F( UnitData ) + + if UnitData and UnitData:isExist() then + local UnitName = UnitData:getName() + local PlayerName = UnitData:getPlayerName() + local UnitDesc = UnitData:getDesc() + local UnitCategory = UnitDesc.category + local UnitCoalition = UnitData:getCoalition() + local UnitTypeName = UnitData:getTypeName() + + self:T( { PlayerName, UnitName, UnitCategory, UnitCoalition, UnitTypeName } ) + + if self.Players[PlayerName] == nil then -- I believe this is the place where a Player gets a life in a mission when he enters a unit ... + self.Players[PlayerName] = {} + self.Players[PlayerName].Hit = {} + self.Players[PlayerName].Kill = {} + self.Players[PlayerName].Mission = {} + + -- for CategoryID, CategoryName in pairs( SCORINGCategory ) do + -- self.Players[PlayerName].Hit[CategoryID] = {} + -- self.Players[PlayerName].Kill[CategoryID] = {} + -- end + self.Players[PlayerName].HitPlayers = {} + self.Players[PlayerName].HitUnits = {} + self.Players[PlayerName].Score = 0 + self.Players[PlayerName].Penalty = 0 + self.Players[PlayerName].PenaltyCoalition = 0 + self.Players[PlayerName].PenaltyWarning = 0 + end + + if not self.Players[PlayerName].UnitCoalition then + self.Players[PlayerName].UnitCoalition = UnitCoalition + else + if self.Players[PlayerName].UnitCoalition ~= UnitCoalition then + self.Players[PlayerName].Penalty = self.Players[PlayerName].Penalty + 50 + self.Players[PlayerName].PenaltyCoalition = self.Players[PlayerName].PenaltyCoalition + 1 + MESSAGE:New( "Player '" .. PlayerName .. "' changed coalition from " .. _SCORINGCoalition[self.Players[PlayerName].UnitCoalition] .. " to " .. _SCORINGCoalition[UnitCoalition] .. + "(changed " .. self.Players[PlayerName].PenaltyCoalition .. " times the coalition). 50 Penalty points added.", + "", + 2, + "/PENALTYCOALITION" .. PlayerName + ):ToAll() + self:ScoreCSV( PlayerName, "COALITION_PENALTY", 1, -50, self.Players[PlayerName].UnitName, _SCORINGCoalition[self.Players[PlayerName].UnitCoalition], _SCORINGCategory[self.Players[PlayerName].UnitCategory], self.Players[PlayerName].UnitType, + UnitName, _SCORINGCoalition[UnitCoalition], _SCORINGCategory[UnitCategory], UnitData:getTypeName() ) + end + end + self.Players[PlayerName].UnitName = UnitName + self.Players[PlayerName].UnitCoalition = UnitCoalition + self.Players[PlayerName].UnitCategory = UnitCategory + self.Players[PlayerName].UnitType = UnitTypeName + + if self.Players[PlayerName].Penalty > 100 then + if self.Players[PlayerName].PenaltyWarning < 1 then + MESSAGE:New( "Player '" .. PlayerName .. "': WARNING! If you continue to commit FRATRICIDE and have a PENALTY score higher than 150, you will be COURT MARTIALED and DISMISSED from this mission! \nYour total penalty is: " .. self.Players[PlayerName].Penalty, + "", + 30, + "/PENALTYCOALITION" .. PlayerName + ):ToAll() + self.Players[PlayerName].PenaltyWarning = self.Players[PlayerName].PenaltyWarning + 1 + end + end + + if self.Players[PlayerName].Penalty > 150 then + ClientGroup = GROUP:NewFromDCSUnit( UnitData ) + ClientGroup:Destroy() + MESSAGE:New( "Player '" .. PlayerName .. "' committed FRATRICIDE, he will be COURT MARTIALED and is DISMISSED from this mission!", + "", + 10, + "/PENALTYCOALITION" .. PlayerName + ):ToAll() + end + + end +end + + +--- Registers Scores the players completing a Mission Task. +function SCORING:_AddMissionTaskScore( PlayerUnit, MissionName, Score ) + self:F( { PlayerUnit, MissionName, Score } ) + + local PlayerName = PlayerUnit:getPlayerName() + + if not self.Players[PlayerName].Mission[MissionName] then + self.Players[PlayerName].Mission[MissionName] = {} + self.Players[PlayerName].Mission[MissionName].ScoreTask = 0 + self.Players[PlayerName].Mission[MissionName].ScoreMission = 0 + end + + self:T( PlayerName ) + self:T( self.Players[PlayerName].Mission[MissionName] ) + + self.Players[PlayerName].Score = self.Players[PlayerName].Score + Score + self.Players[PlayerName].Mission[MissionName].ScoreTask = self.Players[PlayerName].Mission[MissionName].ScoreTask + Score + + MESSAGE:New( "Player '" .. PlayerName .. "' has finished another Task in Mission '" .. MissionName .. "'. " .. + Score .. " Score points added.", + "", 20, "/SCORETASK" .. PlayerName ):ToAll() + + self:ScoreCSV( PlayerName, "TASK_" .. MissionName:gsub( ' ', '_' ), 1, Score, PlayerUnit:getName() ) +end + + +--- Registers Mission Scores for possible multiple players that contributed in the Mission. +function SCORING:_AddMissionScore( MissionName, Score ) + self:F( { MissionName, Score } ) + + for PlayerName, PlayerData in pairs( self.Players ) do + + if PlayerData.Mission[MissionName] then + PlayerData.Score = PlayerData.Score + Score + PlayerData.Mission[MissionName].ScoreMission = PlayerData.Mission[MissionName].ScoreMission + Score + MESSAGE:New( "Player '" .. PlayerName .. "' has finished Mission '" .. MissionName .. "'. " .. + Score .. " Score points added.", + "", 20, "/SCOREMISSION" .. PlayerName ):ToAll() + self:ScoreCSV( PlayerName, "MISSION_" .. MissionName:gsub( ' ', '_' ), 1, Score ) + end + end +end + +--- Handles the OnHit event for the scoring. +-- @param #SCORING self +-- @param Event#EVENTDATA Event +function SCORING:_EventOnHit( Event ) + self:F( { Event } ) + + local InitUnit = nil + local InitUnitName = "" + local InitGroup = nil + local InitGroupName = "" + local InitPlayerName = nil + + local InitCoalition = nil + local InitCategory = nil + local InitType = nil + local InitUnitCoalition = nil + local InitUnitCategory = nil + local InitUnitType = nil + + local TargetUnit = nil + local TargetUnitName = "" + local TargetGroup = nil + local TargetGroupName = "" + local TargetPlayerName = "" + + local TargetCoalition = nil + local TargetCategory = nil + local TargetType = nil + local TargetUnitCoalition = nil + local TargetUnitCategory = nil + local TargetUnitType = nil + + if Event.IniDCSUnit then + + InitUnit = Event.IniDCSUnit + InitUnitName = Event.IniDCSUnitName + InitGroup = Event.IniDCSGroup + InitGroupName = Event.IniDCSGroupName + InitPlayerName = InitUnit:getPlayerName() + + InitCoalition = InitUnit:getCoalition() + --TODO: Workaround Client DCS Bug + --InitCategory = InitUnit:getCategory() + InitCategory = InitUnit:getDesc().category + InitType = InitUnit:getTypeName() + + InitUnitCoalition = _SCORINGCoalition[InitCoalition] + InitUnitCategory = _SCORINGCategory[InitCategory] + InitUnitType = InitType + + self:T( { InitUnitName, InitGroupName, InitPlayerName, InitCoalition, InitCategory, InitType , InitUnitCoalition, InitUnitCategory, InitUnitType } ) + end + + + if Event.TgtDCSUnit then + + TargetUnit = Event.TgtDCSUnit + TargetUnitName = Event.TgtDCSUnitName + TargetGroup = Event.TgtDCSGroup + TargetGroupName = Event.TgtDCSGroupName + TargetPlayerName = TargetUnit:getPlayerName() + + TargetCoalition = TargetUnit:getCoalition() + --TODO: Workaround Client DCS Bug + --TargetCategory = TargetUnit:getCategory() + TargetCategory = TargetUnit:getDesc().category + TargetType = TargetUnit:getTypeName() + + TargetUnitCoalition = _SCORINGCoalition[TargetCoalition] + TargetUnitCategory = _SCORINGCategory[TargetCategory] + TargetUnitType = TargetType + + self:T( { TargetUnitName, TargetGroupName, TargetPlayerName, TargetCoalition, TargetCategory, TargetType, TargetUnitCoalition, TargetUnitCategory, TargetUnitType } ) + end + + if InitPlayerName ~= nil then -- It is a player that is hitting something + self:_AddPlayerFromUnit( InitUnit ) + if self.Players[InitPlayerName] then -- This should normally not happen, but i'll test it anyway. + if TargetPlayerName ~= nil then -- It is a player hitting another player ... + self:_AddPlayerFromUnit( TargetUnit ) + self.Players[InitPlayerName].HitPlayers = self.Players[InitPlayerName].HitPlayers + 1 + end + + self:T( "Hitting Something" ) + -- What is he hitting? + if TargetCategory then + if not self.Players[InitPlayerName].Hit[TargetCategory] then + self.Players[InitPlayerName].Hit[TargetCategory] = {} + end + if not self.Players[InitPlayerName].Hit[TargetCategory][TargetUnitName] then + self.Players[InitPlayerName].Hit[TargetCategory][TargetUnitName] = {} + self.Players[InitPlayerName].Hit[TargetCategory][TargetUnitName].Score = 0 + self.Players[InitPlayerName].Hit[TargetCategory][TargetUnitName].Penalty = 0 + self.Players[InitPlayerName].Hit[TargetCategory][TargetUnitName].ScoreHit = 0 + self.Players[InitPlayerName].Hit[TargetCategory][TargetUnitName].PenaltyHit = 0 + end + local Score = 0 + if InitCoalition == TargetCoalition then + self.Players[InitPlayerName].Penalty = self.Players[InitPlayerName].Penalty + 10 + self.Players[InitPlayerName].Hit[TargetCategory][TargetUnitName].Penalty = self.Players[InitPlayerName].Hit[TargetCategory][TargetUnitName].Penalty + 10 + self.Players[InitPlayerName].Hit[TargetCategory][TargetUnitName].PenaltyHit = self.Players[InitPlayerName].Hit[TargetCategory][TargetUnitName].PenaltyHit + 1 + MESSAGE:New( "Player '" .. InitPlayerName .. "' hit a friendly " .. TargetUnitCategory .. " ( " .. TargetType .. " ) " .. + self.Players[InitPlayerName].Hit[TargetCategory][TargetUnitName].PenaltyHit .. " times. Penalty: -" .. self.Players[InitPlayerName].Hit[TargetCategory][TargetUnitName].Penalty .. + ". Score Total:" .. self.Players[InitPlayerName].Score - self.Players[InitPlayerName].Penalty, + "", + 2, + "/PENALTY" .. InitPlayerName .. "/" .. InitUnitName + ):ToAll() + self:ScoreCSV( InitPlayerName, "HIT_PENALTY", 1, -25, InitUnitName, InitUnitCoalition, InitUnitCategory, InitUnitType, TargetUnitName, TargetUnitCoalition, TargetUnitCategory, TargetUnitType ) + else + self.Players[InitPlayerName].Score = self.Players[InitPlayerName].Score + 10 + self.Players[InitPlayerName].Hit[TargetCategory][TargetUnitName].Score = self.Players[InitPlayerName].Hit[TargetCategory][TargetUnitName].Score + 1 + self.Players[InitPlayerName].Hit[TargetCategory][TargetUnitName].ScoreHit = self.Players[InitPlayerName].Hit[TargetCategory][TargetUnitName].ScoreHit + 1 + MESSAGE:New( "Player '" .. InitPlayerName .. "' hit a target " .. TargetUnitCategory .. " ( " .. TargetType .. " ) " .. + self.Players[InitPlayerName].Hit[TargetCategory][TargetUnitName].ScoreHit .. " times. Score: " .. self.Players[InitPlayerName].Hit[TargetCategory][TargetUnitName].Score .. + ". Score Total:" .. self.Players[InitPlayerName].Score - self.Players[InitPlayerName].Penalty, + "", + 2, + "/SCORE" .. InitPlayerName .. "/" .. InitUnitName + ):ToAll() + self:ScoreCSV( InitPlayerName, "HIT_SCORE", 1, 1, InitUnitName, InitUnitCoalition, InitUnitCategory, InitUnitType, TargetUnitName, TargetUnitCoalition, TargetUnitCategory, TargetUnitType ) + end + end + end + elseif InitPlayerName == nil then -- It is an AI hitting a player??? + + end +end + + +function SCORING:ReportScoreAll() + + env.info( "Hello World " ) + + local ScoreMessage = "" + local PlayerMessage = "" + + self:T( "Score Report" ) + + for PlayerName, PlayerData in pairs( self.Players ) do + if PlayerData then -- This should normally not happen, but i'll test it anyway. + self:T( "Score Player: " .. PlayerName ) + + -- Some variables + local InitUnitCoalition = _SCORINGCoalition[PlayerData.UnitCoalition] + local InitUnitCategory = _SCORINGCategory[PlayerData.UnitCategory] + local InitUnitType = PlayerData.UnitType + local InitUnitName = PlayerData.UnitName + + local PlayerScore = 0 + local PlayerPenalty = 0 + + ScoreMessage = ":\n" + + local ScoreMessageHits = "" + + for CategoryID, CategoryName in pairs( _SCORINGCategory ) do + self:T( CategoryName ) + if PlayerData.Hit[CategoryID] then + local Score = 0 + local ScoreHit = 0 + local Penalty = 0 + local PenaltyHit = 0 + self:T( "Hit scores exist for player " .. PlayerName ) + for UnitName, UnitData in pairs( PlayerData.Hit[CategoryID] ) do + Score = Score + UnitData.Score + ScoreHit = ScoreHit + UnitData.ScoreHit + Penalty = Penalty + UnitData.Penalty + PenaltyHit = UnitData.PenaltyHit + end + local ScoreMessageHit = string.format( "%s:%d ", CategoryName, Score - Penalty ) + self:T( ScoreMessageHit ) + ScoreMessageHits = ScoreMessageHits .. ScoreMessageHit + PlayerScore = PlayerScore + Score + PlayerPenalty = PlayerPenalty + Penalty + else + --ScoreMessageHits = ScoreMessageHits .. string.format( "%s:%d ", string.format(CategoryName, 1, 1), 0 ) + end + end + if ScoreMessageHits ~= "" then + ScoreMessage = ScoreMessage .. " Hits: " .. ScoreMessageHits .. "\n" + end + + local ScoreMessageKills = "" + for CategoryID, CategoryName in pairs( _SCORINGCategory ) do + self:T( "Kill scores exist for player " .. PlayerName ) + if PlayerData.Kill[CategoryID] then + local Score = 0 + local ScoreKill = 0 + local Penalty = 0 + local PenaltyKill = 0 + + for UnitName, UnitData in pairs( PlayerData.Kill[CategoryID] ) do + Score = Score + UnitData.Score + ScoreKill = ScoreKill + UnitData.ScoreKill + Penalty = Penalty + UnitData.Penalty + PenaltyKill = PenaltyKill + UnitData.PenaltyKill + end + + local ScoreMessageKill = string.format( " %s:%d ", CategoryName, Score - Penalty ) + self:T( ScoreMessageKill ) + ScoreMessageKills = ScoreMessageKills .. ScoreMessageKill + + PlayerScore = PlayerScore + Score + PlayerPenalty = PlayerPenalty + Penalty + else + --ScoreMessageKills = ScoreMessageKills .. string.format( "%s:%d ", string.format(CategoryName, 1, 1), 0 ) + end + end + if ScoreMessageKills ~= "" then + ScoreMessage = ScoreMessage .. " Kills: " .. ScoreMessageKills .. "\n" + end + + local ScoreMessageCoalitionChangePenalties = "" + if PlayerData.PenaltyCoalition ~= 0 then + ScoreMessageCoalitionChangePenalties = ScoreMessageCoalitionChangePenalties .. string.format( " -%d (%d changed)", PlayerData.Penalty, PlayerData.PenaltyCoalition ) + PlayerPenalty = PlayerPenalty + PlayerData.Penalty + end + if ScoreMessageCoalitionChangePenalties ~= "" then + ScoreMessage = ScoreMessage .. " Coalition Penalties: " .. ScoreMessageCoalitionChangePenalties .. "\n" + end + + local ScoreMessageMission = "" + local ScoreMission = 0 + local ScoreTask = 0 + for MissionName, MissionData in pairs( PlayerData.Mission ) do + ScoreMission = ScoreMission + MissionData.ScoreMission + ScoreTask = ScoreTask + MissionData.ScoreTask + ScoreMessageMission = ScoreMessageMission .. "'" .. MissionName .. "'; " + end + PlayerScore = PlayerScore + ScoreMission + ScoreTask + + if ScoreMessageMission ~= "" then + ScoreMessage = ScoreMessage .. " Tasks: " .. ScoreTask .. " Mission: " .. ScoreMission .. " ( " .. ScoreMessageMission .. ")\n" + end + + PlayerMessage = PlayerMessage .. string.format( "Player '%s' Score:%d (%d Score -%d Penalties)%s", PlayerName, PlayerScore - PlayerPenalty, PlayerScore, PlayerPenalty, ScoreMessage ) + end + end + MESSAGE:New( PlayerMessage, "Player Scores", 30, "AllPlayerScores"):ToAll() +end + + +function SCORING:ReportScorePlayer() + + env.info( "Hello World " ) + + local ScoreMessage = "" + local PlayerMessage = "" + + self:T( "Score Report" ) + + for PlayerName, PlayerData in pairs( self.Players ) do + if PlayerData then -- This should normally not happen, but i'll test it anyway. + self:T( "Score Player: " .. PlayerName ) + + -- Some variables + local InitUnitCoalition = _SCORINGCoalition[PlayerData.UnitCoalition] + local InitUnitCategory = _SCORINGCategory[PlayerData.UnitCategory] + local InitUnitType = PlayerData.UnitType + local InitUnitName = PlayerData.UnitName + + local PlayerScore = 0 + local PlayerPenalty = 0 + + ScoreMessage = "" + + local ScoreMessageHits = "" + + for CategoryID, CategoryName in pairs( _SCORINGCategory ) do + self:T( CategoryName ) + if PlayerData.Hit[CategoryID] then + local Score = 0 + local ScoreHit = 0 + local Penalty = 0 + local PenaltyHit = 0 + self:T( "Hit scores exist for player " .. PlayerName ) + for UnitName, UnitData in pairs( PlayerData.Hit[CategoryID] ) do + Score = Score + UnitData.Score + ScoreHit = ScoreHit + UnitData.ScoreHit + Penalty = Penalty + UnitData.Penalty + PenaltyHit = UnitData.PenaltyHit + end + local ScoreMessageHit = string.format( "\n %s = %d score(%d;-%d) hits(#%d;#-%d)", CategoryName, Score - Penalty, Score, Penalty, ScoreHit, PenaltyHit ) + self:T( ScoreMessageHit ) + ScoreMessageHits = ScoreMessageHits .. ScoreMessageHit + PlayerScore = PlayerScore + Score + PlayerPenalty = PlayerPenalty + Penalty + else + --ScoreMessageHits = ScoreMessageHits .. string.format( "%s:%d ", string.format(CategoryName, 1, 1), 0 ) + end + end + if ScoreMessageHits ~= "" then + ScoreMessage = ScoreMessage .. "\n Hits: " .. ScoreMessageHits .. " " + end + + local ScoreMessageKills = "" + for CategoryID, CategoryName in pairs( _SCORINGCategory ) do + self:T( "Kill scores exist for player " .. PlayerName ) + if PlayerData.Kill[CategoryID] then + local Score = 0 + local ScoreKill = 0 + local Penalty = 0 + local PenaltyKill = 0 + + for UnitName, UnitData in pairs( PlayerData.Kill[CategoryID] ) do + Score = Score + UnitData.Score + ScoreKill = ScoreKill + UnitData.ScoreKill + Penalty = Penalty + UnitData.Penalty + PenaltyKill = PenaltyKill + UnitData.PenaltyKill + end + + local ScoreMessageKill = string.format( "\n %s = %d score(%d;-%d) hits(#%d;#-%d)", CategoryName, Score - Penalty, Score, Penalty, ScoreKill, PenaltyKill ) + self:T( ScoreMessageKill ) + ScoreMessageKills = ScoreMessageKills .. ScoreMessageKill + + PlayerScore = PlayerScore + Score + PlayerPenalty = PlayerPenalty + Penalty + else + --ScoreMessageKills = ScoreMessageKills .. string.format( "%s:%d ", string.format(CategoryName, 1, 1), 0 ) + end + end + if ScoreMessageKills ~= "" then + ScoreMessage = ScoreMessage .. "\n Kills: " .. ScoreMessageKills .. " " + end + + local ScoreMessageCoalitionChangePenalties = "" + if PlayerData.PenaltyCoalition ~= 0 then + ScoreMessageCoalitionChangePenalties = ScoreMessageCoalitionChangePenalties .. string.format( " -%d (%d changed)", PlayerData.Penalty, PlayerData.PenaltyCoalition ) + PlayerPenalty = PlayerPenalty + PlayerData.Penalty + end + if ScoreMessageCoalitionChangePenalties ~= "" then + ScoreMessage = ScoreMessage .. "\n Coalition: " .. ScoreMessageCoalitionChangePenalties .. " " + end + + local ScoreMessageMission = "" + local ScoreMission = 0 + local ScoreTask = 0 + for MissionName, MissionData in pairs( PlayerData.Mission ) do + ScoreMission = ScoreMission + MissionData.ScoreMission + ScoreTask = ScoreTask + MissionData.ScoreTask + ScoreMessageMission = ScoreMessageMission .. "'" .. MissionName .. "'; " + end + PlayerScore = PlayerScore + ScoreMission + ScoreTask + + if ScoreMessageMission ~= "" then + ScoreMessage = ScoreMessage .. "\n Tasks: " .. ScoreTask .. " Mission: " .. ScoreMission .. " ( " .. ScoreMessageMission .. ") " + end + + PlayerMessage = PlayerMessage .. string.format( "Player '%s' Score = %d ( %d Score, -%d Penalties ):%s", PlayerName, PlayerScore - PlayerPenalty, PlayerScore, PlayerPenalty, ScoreMessage ) + end + end + MESSAGE:New( PlayerMessage, "Player Scores", 30, "AllPlayerScores"):ToAll() + +end + + +function SCORING:SecondsToClock(sSeconds) + local nSeconds = sSeconds + if nSeconds == 0 then + --return nil; + return "00:00:00"; + else + nHours = string.format("%02.f", math.floor(nSeconds/3600)); + nMins = string.format("%02.f", math.floor(nSeconds/60 - (nHours*60))); + nSecs = string.format("%02.f", math.floor(nSeconds - nHours*3600 - nMins *60)); + return nHours..":"..nMins..":"..nSecs + end +end + +--- Opens a score CSV file to log the scores. +-- @param #SCORING self +-- @param #string ScoringCSV +-- @return #SCORING self +-- @usage +-- -- Open a new CSV file to log the scores of the game Gori Valley. Let the name of the CSV file begin with "Player Scores". +-- ScoringObject = SCORING:New( "Gori Valley" ) +-- ScoringObject:OpenCSV( "Player Scores" ) +function SCORING:OpenCSV( ScoringCSV ) + self:F( ScoringCSV ) + + if lfs and io and os then + if ScoringCSV then + self.ScoringCSV = ScoringCSV + local fdir = lfs.writedir() .. [[Logs\]] .. self.ScoringCSV .. " " .. os.date( "%Y-%m-%d %H-%M-%S" ) .. ".csv" + + self.CSVFile, self.err = io.open( fdir, "w+" ) + if not self.CSVFile then + error( "Error: Cannot open CSV file in " .. lfs.writedir() ) + end + + self.CSVFile:write( '"GameName","RunTime","Time","PlayerName","ScoreType","PlayerUnitCoaltion","PlayerUnitCategory","PlayerUnitType","PlayerUnitName","TargetUnitCoalition","TargetUnitCategory","TargetUnitType","TargetUnitName","Times","Score"\n' ) + + self.RunTime = os.date("%y-%m-%d_%H-%M-%S") + else + error( "A string containing the CSV file name must be given." ) + end + else + self:E( "The MissionScripting.lua file has not been changed to allow lfs, io and os modules to be used..." ) + end + return self +end + + +--- Registers a score for a player. +-- @param #SCORING self +-- @param #string PlayerName The name of the player. +-- @param #string ScoreType The type of the score. +-- @param #string ScoreTimes The amount of scores achieved. +-- @param #string ScoreAmount The score given. +-- @param #string PlayerUnitName The unit name of the player. +-- @param #string PlayerUnitCoalition The coalition of the player unit. +-- @param #string PlayerUnitCategory The category of the player unit. +-- @param #string PlayerUnitType The type of the player unit. +-- @param #string TargetUnitName The name of the target unit. +-- @param #string TargetUnitCoalition The coalition of the target unit. +-- @param #string TargetUnitCategory The category of the target unit. +-- @param #string TargetUnitType The type of the target unit. +-- @return #SCORING self +function SCORING:ScoreCSV( PlayerName, ScoreType, ScoreTimes, ScoreAmount, PlayerUnitName, PlayerUnitCoalition, PlayerUnitCategory, PlayerUnitType, TargetUnitName, TargetUnitCoalition, TargetUnitCategory, TargetUnitType ) + --write statistic information to file + local ScoreTime = self:SecondsToClock( timer.getTime() ) + PlayerName = PlayerName:gsub( '"', '_' ) + + if PlayerUnitName and PlayerUnitName ~= '' then + local PlayerUnit = Unit.getByName( PlayerUnitName ) + + if PlayerUnit then + if not PlayerUnitCategory then + --PlayerUnitCategory = SCORINGCategory[PlayerUnit:getCategory()] + PlayerUnitCategory = _SCORINGCategory[PlayerUnit:getDesc().category] + end + + if not PlayerUnitCoalition then + PlayerUnitCoalition = _SCORINGCoalition[PlayerUnit:getCoalition()] + end + + if not PlayerUnitType then + PlayerUnitType = PlayerUnit:getTypeName() + end + else + PlayerUnitName = '' + PlayerUnitCategory = '' + PlayerUnitCoalition = '' + PlayerUnitType = '' + end + else + PlayerUnitName = '' + PlayerUnitCategory = '' + PlayerUnitCoalition = '' + PlayerUnitType = '' + end + + if not TargetUnitCoalition then + TargetUnitCoalition = '' + end + + if not TargetUnitCategory then + TargetUnitCategory = '' + end + + if not TargetUnitType then + TargetUnitType = '' + end + + if not TargetUnitName then + TargetUnitName = '' + end + + if lfs and io and os then + self.CSVFile:write( + '"' .. self.GameName .. '"' .. ',' .. + '"' .. self.RunTime .. '"' .. ',' .. + '' .. ScoreTime .. '' .. ',' .. + '"' .. PlayerName .. '"' .. ',' .. + '"' .. ScoreType .. '"' .. ',' .. + '"' .. PlayerUnitCoalition .. '"' .. ',' .. + '"' .. PlayerUnitCategory .. '"' .. ',' .. + '"' .. PlayerUnitType .. '"' .. ',' .. + '"' .. PlayerUnitName .. '"' .. ',' .. + '"' .. TargetUnitCoalition .. '"' .. ',' .. + '"' .. TargetUnitCategory .. '"' .. ',' .. + '"' .. TargetUnitType .. '"' .. ',' .. + '"' .. TargetUnitName .. '"' .. ',' .. + '' .. ScoreTimes .. '' .. ',' .. + '' .. ScoreAmount + ) + + self.CSVFile:write( "\n" ) + end +end + + +function SCORING:CloseCSV() + if lfs and io and os then + self.CSVFile:close() + end +end + +--- CARGO Classes +-- @module CARGO + +Include.File( "Routines" ) +Include.File( "Base" ) +Include.File( "Message" ) +Include.File( "Scheduler" ) + + +--- Clients are those Groups defined within the Mission Editor that have the skillset defined as "Client" or "Player". +-- These clients are defined within the Mission Orchestration Framework (MOF) + +CARGOS = {} + + +CARGO_ZONE = { + ClassName="CARGO_ZONE", + CargoZoneName = '', + CargoHostUnitName = '', + SIGNAL = { + TYPE = { + SMOKE = { ID = 1, TEXT = "smoke" }, + FLARE = { ID = 2, TEXT = "flare" } + }, + COLOR = { + GREEN = { ID = 1, TRIGGERCOLOR = trigger.smokeColor.Green, TEXT = "A green" }, + RED = { ID = 2, TRIGGERCOLOR = trigger.smokeColor.Red, TEXT = "A red" }, + WHITE = { ID = 3, TRIGGERCOLOR = trigger.smokeColor.White, TEXT = "A white" }, + ORANGE = { ID = 4, TRIGGERCOLOR = trigger.smokeColor.Orange, TEXT = "An orange" }, + BLUE = { ID = 5, TRIGGERCOLOR = trigger.smokeColor.Blue, TEXT = "A blue" }, + YELLOW = { ID = 6, TRIGGERCOLOR = trigger.flareColor.Yellow, TEXT = "A yellow" } + } + } +} + +--- Creates a new zone where cargo can be collected or deployed. +-- The zone functionality is useful to smoke or indicate routes for cargo pickups or deployments. +-- Provide the zone name as declared in the mission file into the CargoZoneName in the :New method. +-- An optional parameter is the CargoHostName, which is a Group declared with Late Activation switched on in the mission file. +-- The CargoHostName is the "host" of the cargo zone: +-- +-- * It will smoke the zone position when a client is approaching the zone. +-- * Depending on the cargo type, it will assist in the delivery of the cargo by driving to and from the client. +-- +-- @param #CARGO_ZONE self +-- @param #string CargoZoneName The name of the zone as declared within the mission editor. +-- @param #string CargoHostName The name of the Group "hosting" the zone. The Group MUST NOT be a static, and must be a "mobile" unit. +function CARGO_ZONE:New( CargoZoneName, CargoHostName ) local self = BASE:Inherit( self, ZONE:New( CargoZoneName ) ) + self:F( { CargoZoneName, CargoHostName } ) + + self.CargoZoneName = CargoZoneName + self.SignalHeight = 2 + --self.CargoZone = trigger.misc.getZone( CargoZoneName ) + + + if CargoHostName then + self.CargoHostName = CargoHostName + end + + self:T( self.CargoZoneName ) + + return self +end + +function CARGO_ZONE:Spawn() + self:F( self.CargoHostName ) + + if self.CargoHostName then -- Only spawn a host in the zone when there is one given as a parameter in the New function. + if self.CargoHostSpawn then + local CargoHostGroup = self.CargoHostSpawn:GetGroupFromIndex() + if CargoHostGroup and CargoHostGroup:IsAlive() then + else + self.CargoHostSpawn:ReSpawn( 1 ) + end + else + self:T( "Initialize CargoHostSpawn" ) + self.CargoHostSpawn = SPAWN:New( self.CargoHostName ):Limit( 1, 1 ) + self.CargoHostSpawn:ReSpawn( 1 ) + end + end + + return self +end + +function CARGO_ZONE:GetHostUnit() + self:F( self ) + + if self.CargoHostName then + + -- A Host has been given, signal the host + local CargoHostGroup = self.CargoHostSpawn:GetGroupFromIndex() + local CargoHostUnit + if CargoHostGroup and CargoHostGroup:IsAlive() then + CargoHostUnit = CargoHostGroup:GetUnit(1) + else + CargoHostUnit = StaticObject.getByName( self.CargoHostName ) + end + + return CargoHostUnit + end + + return nil +end + +function CARGO_ZONE:ReportCargosToClient( Client, CargoType ) + self:F() + + local SignalUnit = self:GetHostUnit() + + if SignalUnit then + + local SignalUnitTypeName = SignalUnit:getTypeName() + + local HostMessage = "" + + local IsCargo = false + for CargoID, Cargo in pairs( CARGOS ) do + if Cargo.CargoType == Task.CargoType then + if Cargo:IsStatusNone() then + HostMessage = HostMessage .. " - " .. Cargo.CargoName .. " - " .. Cargo.CargoType .. " (" .. Cargo.Weight .. "kg)" .. "\n" + IsCargo = true + end + end + end + + if not IsCargo then + HostMessage = "No Cargo Available." + end + + Client:Message( HostMessage, 20, Mission.Name .. "/StageHosts." .. SignalUnitTypeName, SignalUnitTypeName .. ": Reporting Cargo", 10 ) + end +end + + +function CARGO_ZONE:Signal() + self:F() + + local Signalled = false + + if self.SignalType then + + if self.CargoHostName then + + -- A Host has been given, signal the host + + local SignalUnit = self:GetHostUnit() + + if SignalUnit then + + self:T( 'Signalling Unit' ) + local SignalVehiclePos = SignalUnit:GetPointVec3() + SignalVehiclePos.y = SignalVehiclePos.y + 2 + + if self.SignalType.ID == CARGO_ZONE.SIGNAL.TYPE.SMOKE.ID then + + trigger.action.smoke( SignalVehiclePos, self.SignalColor.TRIGGERCOLOR ) + Signalled = true + + elseif self.SignalType.ID == CARGO_ZONE.SIGNAL.TYPE.FLARE.ID then + + trigger.action.signalFlare( SignalVehiclePos, self.SignalColor.TRIGGERCOLOR , 0 ) + Signalled = false + + end + end + + else + + local ZonePointVec3 = self:GetPointVec3( self.SignalHeight ) -- Get the zone position + the landheight + 2 meters + + if self.SignalType.ID == CARGO_ZONE.SIGNAL.TYPE.SMOKE.ID then + + trigger.action.smoke( ZonePointVec3, self.SignalColor.TRIGGERCOLOR ) + Signalled = true + + elseif self.SignalType.ID == CARGO_ZONE.SIGNAL.TYPE.FLARE.ID then + trigger.action.signalFlare( ZonePointVec3, self.SignalColor.TRIGGERCOLOR, 0 ) + Signalled = false + + end + end + end + + return Signalled + +end + +function CARGO_ZONE:WhiteSmoke( SignalHeight ) + self:F() + + self.SignalType = CARGO_ZONE.SIGNAL.TYPE.SMOKE + self.SignalColor = CARGO_ZONE.SIGNAL.COLOR.WHITE + + if SignalHeight then + self.SignalHeight = SignalHeight + end + + return self +end + +function CARGO_ZONE:BlueSmoke( SignalHeight ) + self:F() + + self.SignalType = CARGO_ZONE.SIGNAL.TYPE.SMOKE + self.SignalColor = CARGO_ZONE.SIGNAL.COLOR.BLUE + + if SignalHeight then + self.SignalHeight = SignalHeight + end + + return self +end + +function CARGO_ZONE:RedSmoke( SignalHeight ) + self:F() + + self.SignalType = CARGO_ZONE.SIGNAL.TYPE.SMOKE + self.SignalColor = CARGO_ZONE.SIGNAL.COLOR.RED + + if SignalHeight then + self.SignalHeight = SignalHeight + end + + return self +end + +function CARGO_ZONE:OrangeSmoke( SignalHeight ) + self:F() + + self.SignalType = CARGO_ZONE.SIGNAL.TYPE.SMOKE + self.SignalColor = CARGO_ZONE.SIGNAL.COLOR.ORANGE + + if SignalHeight then + self.SignalHeight = SignalHeight + end + + return self +end + +function CARGO_ZONE:GreenSmoke( SignalHeight ) + self:F() + + self.SignalType = CARGO_ZONE.SIGNAL.TYPE.SMOKE + self.SignalColor = CARGO_ZONE.SIGNAL.COLOR.GREEN + + if SignalHeight then + self.SignalHeight = SignalHeight + end + + return self +end + + +function CARGO_ZONE:WhiteFlare( SignalHeight ) + self:F() + + self.SignalType = CARGO_ZONE.SIGNAL.TYPE.FLARE + self.SignalColor = CARGO_ZONE.SIGNAL.COLOR.WHITE + + if SignalHeight then + self.SignalHeight = SignalHeight + end + + return self +end + +function CARGO_ZONE:RedFlare( SignalHeight ) + self:F() + + self.SignalType = CARGO_ZONE.SIGNAL.TYPE.FLARE + self.SignalColor = CARGO_ZONE.SIGNAL.COLOR.RED + + if SignalHeight then + self.SignalHeight = SignalHeight + end + + return self +end + +function CARGO_ZONE:GreenFlare( SignalHeight ) + self:F() + + self.SignalType = CARGO_ZONE.SIGNAL.TYPE.FLARE + self.SignalColor = CARGO_ZONE.SIGNAL.COLOR.GREEN + + if SignalHeight then + self.SignalHeight = SignalHeight + end + + return self +end + +function CARGO_ZONE:YellowFlare( SignalHeight ) + self:F() + + self.SignalType = CARGO_ZONE.SIGNAL.TYPE.FLARE + self.SignalColor = CARGO_ZONE.SIGNAL.COLOR.YELLOW + + if SignalHeight then + self.SignalHeight = SignalHeight + end + + return self +end + + +function CARGO_ZONE:GetCargoHostUnit() + self:F( self ) + + if self.CargoHostSpawn then + local CargoHostGroup = self.CargoHostSpawn:GetGroupFromIndex(1) + if CargoHostGroup and CargoHostGroup:IsAlive() then + local CargoHostUnit = CargoHostGroup:GetUnit(1) + if CargoHostUnit and CargoHostUnit:IsAlive() then + return CargoHostUnit + end + end + end + + return nil +end + +function CARGO_ZONE:GetCargoZoneName() + self:F() + + return self.CargoZoneName +end + +CARGO = { + ClassName = "CARGO", + STATUS = { + NONE = 0, + LOADED = 1, + UNLOADED = 2, + LOADING = 3 + }, + CargoClient = nil +} + +--- Add Cargo to the mission... Cargo functionality needs to be reworked a bit, so this is still under construction. I need to make a CARGO Class... +function CARGO:New( CargoType, CargoName, CargoWeight ) local self = BASE:Inherit( self, BASE:New() ) + self:F( { CargoType, CargoName, CargoWeight } ) + + + self.CargoType = CargoType + self.CargoName = CargoName + self.CargoWeight = CargoWeight + + self:StatusNone() + + return self +end + +function CARGO:Spawn( Client ) + self:F() + + return self + +end + +function CARGO:IsNear( Client, LandingZone ) + self:F() + + local Near = true + + return Near + +end + + +function CARGO:IsLoadingToClient() + self:F() + + if self:IsStatusLoading() then + return self.CargoClient + end + + return nil + +end + + +function CARGO:IsLoadedInClient() + self:F() + + if self:IsStatusLoaded() then + return self.CargoClient + end + + return nil + +end + + +function CARGO:UnLoad( Client, TargetZoneName ) + self:F() + + self:StatusUnLoaded() + + return self +end + +function CARGO:OnBoard( Client, LandingZone ) + self:F() + + local Valid = true + + self.CargoClient = Client + local ClientUnit = Client:GetClientGroupDCSUnit() + + return Valid +end + +function CARGO:OnBoarded( Client, LandingZone ) + self:F() + + local OnBoarded = true + + return OnBoarded +end + +function CARGO:Load( Client ) + self:F() + + self:StatusLoaded( Client ) + + return self +end + +function CARGO:IsLandingRequired() + self:F() + return true +end + +function CARGO:IsSlingLoad() + self:F() + return false +end + + +function CARGO:StatusNone() + self:F() + + self.CargoClient = nil + self.CargoStatus = CARGO.STATUS.NONE + + return self +end + +function CARGO:StatusLoading( Client ) + self:F() + + self.CargoClient = Client + self.CargoStatus = CARGO.STATUS.LOADING + self:T( "Cargo " .. self.CargoName .. " loading to Client: " .. self.CargoClient:GetClientGroupName() ) + + return self +end + +function CARGO:StatusLoaded( Client ) + self:F() + + self.CargoClient = Client + self.CargoStatus = CARGO.STATUS.LOADED + self:T( "Cargo " .. self.CargoName .. " loaded in Client: " .. self.CargoClient:GetClientGroupName() ) + + return self +end + +function CARGO:StatusUnLoaded() + self:F() + + self.CargoClient = nil + self.CargoStatus = CARGO.STATUS.UNLOADED + + return self +end + + +function CARGO:IsStatusNone() + self:F() + + return self.CargoStatus == CARGO.STATUS.NONE +end + +function CARGO:IsStatusLoading() + self:F() + + return self.CargoStatus == CARGO.STATUS.LOADING +end + +function CARGO:IsStatusLoaded() + self:F() + + return self.CargoStatus == CARGO.STATUS.LOADED +end + +function CARGO:IsStatusUnLoaded() + self:F() + + return self.CargoStatus == CARGO.STATUS.UNLOADED +end + + +CARGO_GROUP = { + ClassName = "CARGO_GROUP" +} + + +function CARGO_GROUP:New( CargoType, CargoName, CargoWeight, CargoGroupTemplate, CargoZone ) local self = BASE:Inherit( self, CARGO:New( CargoType, CargoName, CargoWeight ) ) + self:F( { CargoType, CargoName, CargoWeight, CargoGroupTemplate, CargoZone } ) + + self.CargoSpawn = SPAWN:NewWithAlias( CargoGroupTemplate, CargoName ) + self.CargoZone = CargoZone + + CARGOS[self.CargoName] = self + + return self + +end + +function CARGO_GROUP:Spawn( Client ) + self:F( { Client } ) + + local SpawnCargo = true + + if self:IsStatusNone() then + local CargoGroup = Group.getByName( self.CargoName ) + if CargoGroup and CargoGroup:isExist() then + SpawnCargo = false + end + + elseif self:IsStatusLoading() then + + local Client = self:IsLoadingToClient() + if Client and Client:GetDCSGroup() then + SpawnCargo = false + else + local CargoGroup = Group.getByName( self.CargoName ) + if CargoGroup and CargoGroup:isExist() then + SpawnCargo = false + end + end + + elseif self:IsStatusLoaded() then + + local ClientLoaded = self:IsLoadedInClient() + -- Now test if another Client is alive (not this one), and it has the CARGO, then this cargo does not need to be initialized and spawned. + if ClientLoaded and ClientLoaded ~= Client then + local ClientGroup = Client:GetDCSGroup() + if ClientLoaded:GetClientGroupDCSUnit() and ClientLoaded:GetClientGroupDCSUnit():isExist() then + SpawnCargo = false + else + self:StatusNone() + end + else + -- Same Client, but now in initialize, so set back the status to None. + self:StatusNone() + end + + elseif self:IsStatusUnLoaded() then + + SpawnCargo = false + + end + + if SpawnCargo then + if self.CargoZone:GetCargoHostUnit() then + --- ReSpawn the Cargo from the CargoHost + self.CargoGroupName = self.CargoSpawn:SpawnFromUnit( self.CargoZone:GetCargoHostUnit(), 60, 30, 1 ):GetName() + else + --- ReSpawn the Cargo in the CargoZone without a host ... + self:T( self.CargoZone ) + self.CargoGroupName = self.CargoSpawn:SpawnInZone( self.CargoZone, true, 1 ):GetName() + end + self:StatusNone() + end + + self:T( { self.CargoGroupName, CARGOS[self.CargoName].CargoGroupName } ) + + return self +end + +function CARGO_GROUP:IsNear( Client, LandingZone ) + self:F() + + local Near = false + + if self.CargoGroupName then + local CargoGroup = Group.getByName( self.CargoGroupName ) + if routines.IsPartOfGroupInRadius( CargoGroup, Client:GetPositionVec3(), 250 ) then + Near = true + end + end + + return Near + +end + + +function CARGO_GROUP:OnBoard( Client, LandingZone, OnBoardSide ) + self:F() + + local Valid = true + + local ClientUnit = Client:GetClientGroupDCSUnit() + + local CarrierPos = ClientUnit:getPoint() + local CarrierPosMove = ClientUnit:getPoint() + local CarrierPosOnBoard = ClientUnit:getPoint() + + local CargoGroup = Group.getByName( self.CargoGroupName ) + + local CargoUnit = CargoGroup:getUnit(1) + local CargoPos = CargoUnit:getPoint() + + self.CargoInAir = CargoUnit:inAir() + + self:T( self.CargoInAir ) + + -- Only move the group to the carrier when the cargo is not in the air + -- (eg. cargo can be on a oil derrick, moving the cargo on the oil derrick will drop the cargo on the sea). + if not self.CargoInAir then + + local Points = {} + + self:T( 'CargoPos x = ' .. CargoPos.x .. " z = " .. CargoPos.z ) + self:T( 'CarrierPosMove x = ' .. CarrierPosMove.x .. " z = " .. CarrierPosMove.z ) + + Points[#Points+1] = routines.ground.buildWP( CargoPos, "Cone", 10 ) + + self:T( 'Points[1] x = ' .. Points[1].x .. " y = " .. Points[1].y ) + + if OnBoardSide == nil then + OnBoardSide = CLIENT.ONBOARDSIDE.NONE + end + + if OnBoardSide == CLIENT.ONBOARDSIDE.LEFT then + + self:T( "TransportCargoOnBoard: Onboarding LEFT" ) + CarrierPosMove.z = CarrierPosMove.z - 25 + CarrierPosOnBoard.z = CarrierPosOnBoard.z - 5 + Points[#Points+1] = routines.ground.buildWP( CarrierPosMove, "Cone", 10 ) + Points[#Points+1] = routines.ground.buildWP( CarrierPosOnBoard, "Cone", 10 ) + + elseif OnBoardSide == CLIENT.ONBOARDSIDE.RIGHT then + + self:T( "TransportCargoOnBoard: Onboarding RIGHT" ) + CarrierPosMove.z = CarrierPosMove.z + 25 + CarrierPosOnBoard.z = CarrierPosOnBoard.z + 5 + Points[#Points+1] = routines.ground.buildWP( CarrierPosMove, "Cone", 10 ) + Points[#Points+1] = routines.ground.buildWP( CarrierPosOnBoard, "Cone", 10 ) + + elseif OnBoardSide == CLIENT.ONBOARDSIDE.BACK then + + self:T( "TransportCargoOnBoard: Onboarding BACK" ) + CarrierPosMove.x = CarrierPosMove.x - 25 + CarrierPosOnBoard.x = CarrierPosOnBoard.x - 5 + Points[#Points+1] = routines.ground.buildWP( CarrierPosMove, "Cone", 10 ) + Points[#Points+1] = routines.ground.buildWP( CarrierPosOnBoard, "Cone", 10 ) + + elseif OnBoardSide == CLIENT.ONBOARDSIDE.FRONT then + + self:T( "TransportCargoOnBoard: Onboarding FRONT" ) + CarrierPosMove.x = CarrierPosMove.x + 25 + CarrierPosOnBoard.x = CarrierPosOnBoard.x + 5 + Points[#Points+1] = routines.ground.buildWP( CarrierPosMove, "Cone", 10 ) + Points[#Points+1] = routines.ground.buildWP( CarrierPosOnBoard, "Cone", 10 ) + + elseif OnBoardSide == CLIENT.ONBOARDSIDE.NONE then + + self:T( "TransportCargoOnBoard: Onboarding CENTRAL" ) + Points[#Points+1] = routines.ground.buildWP( CarrierPos, "Cone", 10 ) + + end + self:T( "TransportCargoOnBoard: Routing " .. self.CargoGroupName ) + + --routines.scheduleFunction( routines.goRoute, { self.CargoGroupName, Points}, timer.getTime() + 4 ) + SCHEDULER:New( self, routines.goRoute, { self.CargoGroupName, Points}, 4 ) + end + + self:StatusLoading( Client ) + + return Valid + +end + + +function CARGO_GROUP:OnBoarded( Client, LandingZone ) + self:F() + + local OnBoarded = false + + local CargoGroup = Group.getByName( self.CargoGroupName ) + + if not self.CargoInAir then + if routines.IsPartOfGroupInRadius( CargoGroup, Client:GetPositionVec3(), 25 ) then + CargoGroup:destroy() + self:StatusLoaded( Client ) + OnBoarded = true + end + else + CargoGroup:destroy() + self:StatusLoaded( Client ) + OnBoarded = true + end + + return OnBoarded +end + + +function CARGO_GROUP:UnLoad( Client, TargetZoneName ) + self:F() + + self:T( 'self.CargoName = ' .. self.CargoName ) + + local CargoGroup = self.CargoSpawn:SpawnFromUnit( Client:GetClientGroupUnit(), 60, 30 ) + + self.CargoGroupName = CargoGroup:GetName() + self:T( 'self.CargoGroupName = ' .. self.CargoGroupName ) + + CargoGroup:TaskRouteToZone( ZONE:New( TargetZoneName ), true ) + + self:StatusUnLoaded() + + return self +end + + +CARGO_PACKAGE = { + ClassName = "CARGO_PACKAGE" +} + + +function CARGO_PACKAGE:New( CargoType, CargoName, CargoWeight, CargoClient ) local self = BASE:Inherit( self, CARGO:New( CargoType, CargoName, CargoWeight ) ) + self:F( { CargoType, CargoName, CargoWeight, CargoClient } ) + + self.CargoClient = CargoClient + + CARGOS[self.CargoName] = self + + return self + +end + + +function CARGO_PACKAGE:Spawn( Client ) + self:F( { self, Client } ) + + -- this needs to be checked thoroughly + + local CargoClientGroup = self.CargoClient:GetDCSGroup() + if not CargoClientGroup then + if not self.CargoClientSpawn then + self.CargoClientSpawn = SPAWN:New( self.CargoClient:GetClientGroupName() ):Limit( 1, 1 ) + end + self.CargoClientSpawn:ReSpawn( 1 ) + end + + local SpawnCargo = true + + if self:IsStatusNone() then + + elseif self:IsStatusLoading() or self:IsStatusLoaded() then + + local CargoClientLoaded = self:IsLoadedInClient() + if CargoClientLoaded and CargoClientLoaded:GetDCSGroup() then + SpawnCargo = false + end + + elseif self:IsStatusUnLoaded() then + + SpawnCargo = false + + else + + end + + if SpawnCargo then + self:StatusLoaded( self.CargoClient ) + end + + return self +end + + +function CARGO_PACKAGE:IsNear( Client, LandingZone ) + self:F() + + local Near = false + + if self.CargoClient and self.CargoClient:GetDCSGroup() then + self:T( self.CargoClient.ClientName ) + self:T( 'Client Exists.' ) + + if routines.IsUnitInRadius( self.CargoClient:GetClientGroupDCSUnit(), Client:GetPositionVec3(), 150 ) then + Near = true + end + end + + return Near + +end + + +function CARGO_PACKAGE:OnBoard( Client, LandingZone, OnBoardSide ) + self:F() + + local Valid = true + + local ClientUnit = Client:GetClientGroupDCSUnit() + + local CarrierPos = ClientUnit:getPoint() + local CarrierPosMove = ClientUnit:getPoint() + local CarrierPosOnBoard = ClientUnit:getPoint() + local CarrierPosMoveAway = ClientUnit:getPoint() + + local CargoHostGroup = self.CargoClient:GetDCSGroup() + local CargoHostName = self.CargoClient:GetDCSGroup():getName() + + local CargoHostUnits = CargoHostGroup:getUnits() + local CargoPos = CargoHostUnits[1]:getPoint() + + local Points = {} + + self:T( 'CargoPos x = ' .. CargoPos.x .. " z = " .. CargoPos.z ) + self:T( 'CarrierPosMove x = ' .. CarrierPosMove.x .. " z = " .. CarrierPosMove.z ) + + Points[#Points+1] = routines.ground.buildWP( CargoPos, "Cone", 10 ) + + self:T( 'Points[1] x = ' .. Points[1].x .. " y = " .. Points[1].y ) + + if OnBoardSide == nil then + OnBoardSide = CLIENT.ONBOARDSIDE.NONE + end + + if OnBoardSide == CLIENT.ONBOARDSIDE.LEFT then + + self:T( "TransportCargoOnBoard: Onboarding LEFT" ) + CarrierPosMove.z = CarrierPosMove.z - 25 + CarrierPosOnBoard.z = CarrierPosOnBoard.z - 5 + CarrierPosMoveAway.z = CarrierPosMoveAway.z - 20 + Points[#Points+1] = routines.ground.buildWP( CarrierPosMove, "Cone", 10 ) + Points[#Points+1] = routines.ground.buildWP( CarrierPosOnBoard, "Cone", 10 ) + Points[#Points+1] = routines.ground.buildWP( CarrierPosMoveAway, "Cone", 10 ) + + elseif OnBoardSide == CLIENT.ONBOARDSIDE.RIGHT then + + self:T( "TransportCargoOnBoard: Onboarding RIGHT" ) + CarrierPosMove.z = CarrierPosMove.z + 25 + CarrierPosOnBoard.z = CarrierPosOnBoard.z + 5 + CarrierPosMoveAway.z = CarrierPosMoveAway.z + 20 + Points[#Points+1] = routines.ground.buildWP( CarrierPosMove, "Cone", 10 ) + Points[#Points+1] = routines.ground.buildWP( CarrierPosOnBoard, "Cone", 10 ) + Points[#Points+1] = routines.ground.buildWP( CarrierPosMoveAway, "Cone", 10 ) + + elseif OnBoardSide == CLIENT.ONBOARDSIDE.BACK then + + self:T( "TransportCargoOnBoard: Onboarding BACK" ) + CarrierPosMove.x = CarrierPosMove.x - 25 + CarrierPosOnBoard.x = CarrierPosOnBoard.x - 5 + CarrierPosMoveAway.x = CarrierPosMoveAway.x - 20 + Points[#Points+1] = routines.ground.buildWP( CarrierPosMove, "Cone", 10 ) + Points[#Points+1] = routines.ground.buildWP( CarrierPosOnBoard, "Cone", 10 ) + Points[#Points+1] = routines.ground.buildWP( CarrierPosMoveAway, "Cone", 10 ) + + elseif OnBoardSide == CLIENT.ONBOARDSIDE.FRONT then + + self:T( "TransportCargoOnBoard: Onboarding FRONT" ) + CarrierPosMove.x = CarrierPosMove.x + 25 + CarrierPosOnBoard.x = CarrierPosOnBoard.x + 5 + CarrierPosMoveAway.x = CarrierPosMoveAway.x + 20 + Points[#Points+1] = routines.ground.buildWP( CarrierPosMove, "Cone", 10 ) + Points[#Points+1] = routines.ground.buildWP( CarrierPosOnBoard, "Cone", 10 ) + Points[#Points+1] = routines.ground.buildWP( CarrierPosMoveAway, "Cone", 10 ) + + elseif OnBoardSide == CLIENT.ONBOARDSIDE.NONE then + + self:T( "TransportCargoOnBoard: Onboarding FRONT" ) + CarrierPosMove.x = CarrierPosMove.x + 25 + CarrierPosOnBoard.x = CarrierPosOnBoard.x + 5 + CarrierPosMoveAway.x = CarrierPosMoveAway.x + 20 + Points[#Points+1] = routines.ground.buildWP( CarrierPosMove, "Cone", 10 ) + Points[#Points+1] = routines.ground.buildWP( CarrierPosOnBoard, "Cone", 10 ) + Points[#Points+1] = routines.ground.buildWP( CarrierPosMoveAway, "Cone", 10 ) + + end + self:T( "Routing " .. CargoHostName ) + + --routines.scheduleFunction( routines.goRoute, { CargoHostName, Points}, timer.getTime() + 4 ) + SCHEDULER:New( self, routines.goRoute, { CargoHostName, Points }, 4 ) + + return Valid + +end + + +function CARGO_PACKAGE:OnBoarded( Client, LandingZone ) + self:F() + + local OnBoarded = false + + if self.CargoClient and self.CargoClient:GetDCSGroup() then + if routines.IsUnitInRadius( self.CargoClient:GetClientGroupDCSUnit(), self.CargoClient:GetPositionVec3(), 10 ) then + + -- Switch Cargo from self.CargoClient to Client ... Each cargo can have only one client. So assigning the new client for the cargo is enough. + self:StatusLoaded( Client ) + + -- All done, onboarded the Cargo to the new Client. + OnBoarded = true + end + end + + return OnBoarded +end + + +function CARGO_PACKAGE:UnLoad( Client, TargetZoneName ) + self:F() + + self:T( 'self.CargoName = ' .. self.CargoName ) + --self:T( 'self.CargoHostName = ' .. self.CargoHostName ) + + --self.CargoSpawn:FromCarrier( Client:GetDCSGroup(), TargetZoneName, self.CargoHostName ) + self:StatusUnLoaded() + + return Cargo +end + + +CARGO_SLINGLOAD = { + ClassName = "CARGO_SLINGLOAD" +} + + +function CARGO_SLINGLOAD:New( CargoType, CargoName, CargoWeight, CargoZone, CargoHostName, CargoCountryID ) + local self = BASE:Inherit( self, CARGO:New( CargoType, CargoName, CargoWeight ) ) + self:F( { CargoType, CargoName, CargoWeight, CargoZone, CargoHostName, CargoCountryID } ) + + self.CargoHostName = CargoHostName + + -- Cargo will be initialized around the CargoZone position. + self.CargoZone = CargoZone + + self.CargoCount = 0 + self.CargoStaticName = string.format( "%s#%03d", self.CargoName, self.CargoCount ) + + -- The country ID needs to be correctly set. + self.CargoCountryID = CargoCountryID + + CARGOS[self.CargoName] = self + + return self + +end + + +function CARGO_SLINGLOAD:IsLandingRequired() + self:F() + return false +end + + +function CARGO_SLINGLOAD:IsSlingLoad() + self:F() + return true +end + + +function CARGO_SLINGLOAD:Spawn( Client ) + self:F( { self, Client } ) + + local Zone = trigger.misc.getZone( self.CargoZone ) + + local ZonePos = {} + ZonePos.x = Zone.point.x + math.random( Zone.radius / 2 * -1, Zone.radius / 2 ) + ZonePos.y = Zone.point.z + math.random( Zone.radius / 2 * -1, Zone.radius / 2 ) + + self:T( "Cargo Location = " .. ZonePos.x .. ", " .. ZonePos.y ) + + --[[ + -- This does not work in 1.5.2. + CargoStatic = StaticObject.getByName( self.CargoName ) + if CargoStatic then + CargoStatic:destroy() + end + --]] + + CargoStatic = StaticObject.getByName( self.CargoStaticName ) + + if CargoStatic and CargoStatic:isExist() then + CargoStatic:destroy() + end + + -- I need to make every time a new cargo due to bugs in 1.5.2. + + self.CargoCount = self.CargoCount + 1 + self.CargoStaticName = string.format( "%s#%03d", self.CargoName, self.CargoCount ) + + local CargoTemplate = { + ["category"] = "Cargo", + ["shape_name"] = "ab-212_cargo", + ["type"] = "Cargo1", + ["x"] = ZonePos.x, + ["y"] = ZonePos.y, + ["mass"] = self.CargoWeight, + ["name"] = self.CargoStaticName, + ["canCargo"] = true, + ["heading"] = 0, + } + + coalition.addStaticObject( self.CargoCountryID, CargoTemplate ) + +-- end + + return self +end + + +function CARGO_SLINGLOAD:IsNear( Client, LandingZone ) + self:F() + + local Near = false + + return Near +end + + +function CARGO_SLINGLOAD:IsInLandingZone( Client, LandingZone ) + self:F() + + local Near = false + + local CargoStaticUnit = StaticObject.getByName( self.CargoName ) + if CargoStaticUnit then + if routines.IsStaticInZones( CargoStaticUnit, LandingZone ) then + Near = true + end + end + + return Near +end + + +function CARGO_SLINGLOAD:OnBoard( Client, LandingZone, OnBoardSide ) + self:F() + + local Valid = true + + + return Valid +end + + +function CARGO_SLINGLOAD:OnBoarded( Client, LandingZone ) + self:F() + + local OnBoarded = false + + local CargoStaticUnit = StaticObject.getByName( self.CargoName ) + if CargoStaticUnit then + if not routines.IsStaticInZones( CargoStaticUnit, LandingZone ) then + OnBoarded = true + end + end + + return OnBoarded +end + + +function CARGO_SLINGLOAD:UnLoad( Client, TargetZoneName ) + self:F() + + self:T( 'self.CargoName = ' .. self.CargoName ) + self:T( 'self.CargoGroupName = ' .. self.CargoGroupName ) + + self:StatusUnLoaded() + + return Cargo +end +--- Message System to display Messages for Clients and Coalitions or All. +-- Messages are grouped on the display panel per Category to improve readability for the players. +-- Messages are shown on the display panel for an amount of seconds, and will then disappear. +-- Messages are identified by an ID. The messages with the same ID belonging to the same category will be overwritten if they were still being displayed on the display panel. +-- Messages are created with MESSAGE:@{New}(). +-- Messages are sent to Clients with MESSAGE:@{ToClient}(). +-- Messages are sent to Coalitions with MESSAGE:@{ToCoalition}(). +-- Messages are sent to All Players with MESSAGE:@{ToAll}(). +-- @module Message + +Include.File( "Base" ) + +--- The MESSAGE class +-- @type MESSAGE +MESSAGE = { + ClassName = "MESSAGE", + MessageCategory = 0, + MessageID = 0, +} + + +--- Creates a new MESSAGE object. Note that these MESSAGE objects are not yet displayed on the display panel. You must use the functions @{ToClient} or @{ToCoalition} or @{ToAll} to send these Messages to the respective recipients. +-- @param self +-- @param #string MessageText is the text of the Message. +-- @param #string MessageCategory is a string expressing the Category of the Message. Messages are grouped on the display panel per Category to improve readability. +-- @param #number MessageDuration is a number in seconds of how long the MESSAGE should be shown on the display panel. +-- @param #string MessageID is a string expressing the ID of the Message. +-- @return #MESSAGE +-- @usage +-- -- Create a series of new Messages. +-- -- MessageAll is meant to be sent to all players, for 25 seconds, and is classified as "Score". +-- -- MessageRED is meant to be sent to the RED players only, for 10 seconds, and is classified as "End of Mission", with ID "Win". +-- -- MessageClient1 is meant to be sent to a Client, for 25 seconds, and is classified as "Score", with ID "Score". +-- -- MessageClient1 is meant to be sent to a Client, for 25 seconds, and is classified as "Score", with ID "Score". +-- MessageAll = MESSAGE:New( "To all Players: BLUE has won! Each player of BLUE wins 50 points!", "End of Mission", 25, "Win" ) +-- MessageRED = MESSAGE:New( "To the RED Players: You receive a penalty because you've killed one of your own units", "Penalty", 25, "Score" ) +-- MessageClient1 = MESSAGE:New( "Congratulations, you've just hit a target", "Score", 25, "Score" ) +-- MessageClient2 = MESSAGE:New( "Congratulations, you've just killed a target", "Score", 25, "Score" ) +function MESSAGE:New( MessageText, MessageCategory, MessageDuration, MessageID ) + local self = BASE:Inherit( self, BASE:New() ) + self:F( { MessageText, MessageCategory, MessageDuration, MessageID } ) + + -- When no messagecategory is given, we don't show it as a title... + if MessageCategory and MessageCategory ~= "" then + self.MessageCategory = MessageCategory .. ": " + else + self.MessageCategory = "" + end + + self.MessageDuration = MessageDuration + self.MessageID = MessageID + self.MessageTime = timer.getTime() + self.MessageText = MessageText + + self.MessageSent = false + self.MessageGroup = false + self.MessageCoalition = false + + return self +end + +--- Sends a MESSAGE to a Client Group. Note that the Group needs to be defined within the ME with the skillset "Client" or "Player". +-- @param #MESSAGE self +-- @param Client#CLIENT Client is the Group of the Client. +-- @return #MESSAGE +-- @usage +-- -- Send the 2 messages created with the @{New} method to the Client Group. +-- -- Note that the Message of MessageClient2 is overwriting the Message of MessageClient1. +-- ClientGroup = Group.getByName( "ClientGroup" ) +-- +-- MessageClient1 = MESSAGE:New( "Congratulations, you've just hit a target", "Score", 25, "Score" ):ToClient( ClientGroup ) +-- MessageClient2 = MESSAGE:New( "Congratulations, you've just killed a target", "Score", 25, "Score" ):ToClient( ClientGroup ) +-- or +-- MESSAGE:New( "Congratulations, you've just hit a target", "Score", 25, "Score" ):ToClient( ClientGroup ) +-- MESSAGE:New( "Congratulations, you've just killed a target", "Score", 25, "Score" ):ToClient( ClientGroup ) +-- or +-- MessageClient1 = MESSAGE:New( "Congratulations, you've just hit a target", "Score", 25, "Score" ) +-- MessageClient2 = MESSAGE:New( "Congratulations, you've just killed a target", "Score", 25, "Score" ) +-- MessageClient1:ToClient( ClientGroup ) +-- MessageClient2:ToClient( ClientGroup ) +function MESSAGE:ToClient( Client ) + self:F( Client ) + + if Client and Client:GetClientGroupID() then + + local ClientGroupID = Client:GetClientGroupID() + self:T( self.MessageCategory .. self.MessageText:gsub("\n$",""):gsub("\n$","") .. " / " .. self.MessageDuration ) + trigger.action.outTextForGroup( ClientGroupID, self.MessageCategory .. self.MessageText:gsub("\n$",""):gsub("\n$",""), self.MessageDuration ) + end + + return self +end + +--- Sends a MESSAGE to the Blue coalition. +-- @param #MESSAGE self +-- @return #MESSAGE +-- @usage +-- -- Send a message created with the @{New} method to the BLUE coalition. +-- MessageBLUE = MESSAGE:New( "To the BLUE Players: You receive a penalty because you've killed one of your own units", "Penalty", 25, "Score" ):ToBlue() +-- or +-- MESSAGE:New( "To the BLUE Players: You receive a penalty because you've killed one of your own units", "Penalty", 25, "Score" ):ToBlue() +-- or +-- MessageBLUE = MESSAGE:New( "To the BLUE Players: You receive a penalty because you've killed one of your own units", "Penalty", 25, "Score" ) +-- MessageBLUE:ToBlue() +function MESSAGE:ToBlue() + self:F() + + self:ToCoalition( coalition.side.BLUE ) + + return self +end + +--- Sends a MESSAGE to the Red Coalition. +-- @param #MESSAGE self +-- @return #MESSAGE +-- @usage +-- -- Send a message created with the @{New} method to the RED coalition. +-- MessageRED = MESSAGE:New( "To the RED Players: You receive a penalty because you've killed one of your own units", "Penalty", 25, "Score" ):ToRed() +-- or +-- MESSAGE:New( "To the RED Players: You receive a penalty because you've killed one of your own units", "Penalty", 25, "Score" ):ToRed() +-- or +-- MessageRED = MESSAGE:New( "To the RED Players: You receive a penalty because you've killed one of your own units", "Penalty", 25, "Score" ) +-- MessageRED:ToRed() +function MESSAGE:ToRed( ) + self:F() + + self:ToCoalition( coalition.side.RED ) + + return self +end + +--- Sends a MESSAGE to a Coalition. +-- @param #MESSAGE self +-- @param CoalitionSide needs to be filled out by the defined structure of the standard scripting engine @{coalition.side}. +-- @return #MESSAGE +-- @usage +-- -- Send a message created with the @{New} method to the RED coalition. +-- MessageRED = MESSAGE:New( "To the RED Players: You receive a penalty because you've killed one of your own units", "Penalty", 25, "Score" ):ToCoalition( coalition.side.RED ) +-- or +-- MESSAGE:New( "To the RED Players: You receive a penalty because you've killed one of your own units", "Penalty", 25, "Score" ):ToCoalition( coalition.side.RED ) +-- or +-- MessageRED = MESSAGE:New( "To the RED Players: You receive a penalty because you've killed one of your own units", "Penalty", 25, "Score" ) +-- MessageRED:ToCoalition( coalition.side.RED ) +function MESSAGE:ToCoalition( CoalitionSide ) + self:F( CoalitionSide ) + + if CoalitionSide then + self:T( self.MessageCategory .. self.MessageText:gsub("\n$",""):gsub("\n$","") .. " / " .. self.MessageDuration ) + trigger.action.outTextForCoalition( CoalitionSide, self.MessageCategory .. self.MessageText:gsub("\n$",""):gsub("\n$",""), self.MessageDuration ) + end + + return self +end + +--- Sends a MESSAGE to all players. +-- @param #MESSAGE self +-- @return #MESSAGE +-- @usage +-- -- Send a message created to all players. +-- MessageAll = MESSAGE:New( "To all Players: BLUE has won! Each player of BLUE wins 50 points!", "End of Mission", 25, "Win" ):ToAll() +-- or +-- MESSAGE:New( "To all Players: BLUE has won! Each player of BLUE wins 50 points!", "End of Mission", 25, "Win" ):ToAll() +-- or +-- MessageAll = MESSAGE:New( "To all Players: BLUE has won! Each player of BLUE wins 50 points!", "End of Mission", 25, "Win" ) +-- MessageAll:ToAll() +function MESSAGE:ToAll() + self:F() + + self:ToCoalition( coalition.side.RED ) + self:ToCoalition( coalition.side.BLUE ) + + return self +end + + + +--- The MESSAGEQUEUE class +-- @type MESSAGEQUEUE +MESSAGEQUEUE = { + ClientGroups = {}, + CoalitionSides = {} +} + +function MESSAGEQUEUE:New( RefreshInterval ) + local self = BASE:Inherit( self, BASE:New() ) + self:F( { RefreshInterval } ) + + self.RefreshInterval = RefreshInterval + + --self.DisplayFunction = routines.scheduleFunction( self._DisplayMessages, { self }, 0, RefreshInterval ) + self.DisplayFunction = SCHEDULER:New( self, self._DisplayMessages, {}, 0, RefreshInterval ) + + return self +end + +--- This function is called automatically by the MESSAGEQUEUE scheduler. +function MESSAGEQUEUE:_DisplayMessages() + + -- First we display all messages that a coalition needs to receive... Also those who are not in a client (CA module clients...). + for CoalitionSideID, CoalitionSideData in pairs( self.CoalitionSides ) do + for MessageID, MessageData in pairs( CoalitionSideData.Messages ) do + if MessageData.MessageSent == false then + --trigger.action.outTextForCoalition( CoalitionSideID, MessageData.MessageCategory .. '\n' .. MessageData.MessageText:gsub("\n$",""):gsub("\n$",""), MessageData.MessageDuration ) + MessageData.MessageSent = true + end + local MessageTimeLeft = ( MessageData.MessageTime + MessageData.MessageDuration ) - timer.getTime() + if MessageTimeLeft <= 0 then + MessageData = nil + end + end + end + + -- Then we send the messages for each individual client, but also to be included are those Coalition messages for the Clients who belong to a coalition. + -- Because the Client messages will overwrite the Coalition messages (for that Client). + for ClientGroupName, ClientGroupData in pairs( self.ClientGroups ) do + for MessageID, MessageData in pairs( ClientGroupData.Messages ) do + if MessageData.MessageGroup == false then + trigger.action.outTextForGroup( Group.getByName(ClientGroupName):getID(), MessageData.MessageCategory .. '\n' .. MessageData.MessageText:gsub("\n$",""):gsub("\n$",""), MessageData.MessageDuration ) + MessageData.MessageGroup = true + end + local MessageTimeLeft = ( MessageData.MessageTime + MessageData.MessageDuration ) - timer.getTime() + if MessageTimeLeft <= 0 then + MessageData = nil + end + end + + -- Now check if the Client also has messages that belong to the Coalition of the Client... + for CoalitionSideID, CoalitionSideData in pairs( self.CoalitionSides ) do + for MessageID, MessageData in pairs( CoalitionSideData.Messages ) do + local CoalitionGroup = Group.getByName( ClientGroupName ) + if CoalitionGroup and CoalitionGroup:getCoalition() == CoalitionSideID then + if MessageData.MessageCoalition == false then + trigger.action.outTextForGroup( Group.getByName(ClientGroupName):getID(), MessageData.MessageCategory .. '\n' .. MessageData.MessageText:gsub("\n$",""):gsub("\n$",""), MessageData.MessageDuration ) + MessageData.MessageCoalition = true + end + end + local MessageTimeLeft = ( MessageData.MessageTime + MessageData.MessageDuration ) - timer.getTime() + if MessageTimeLeft <= 0 then + MessageData = nil + end + end + end + end + + return true +end + +--- The _MessageQueue object is created when the MESSAGE class module is loaded. +--_MessageQueue = MESSAGEQUEUE:New( 0.5 ) + +--- Stages within a @{TASK} within a @{MISSION}. All of the STAGE functionality is considered internally administered and not to be used by any Mission designer. +-- @module STAGE +-- @author Flightcontrol + +Include.File( "Routines" ) +Include.File( "Base" ) +Include.File( "Mission" ) +Include.File( "Client" ) +Include.File( "Task" ) + +--- The STAGE class +-- @type +STAGE = { + ClassName = "STAGE", + MSG = { ID = "None", TIME = 10 }, + FREQUENCY = { NONE = 0, ONCE = 1, REPEAT = -1 }, + + Name = "NoStage", + StageType = '', + WaitTime = 1, + Frequency = 1, + MessageCount = 0, + MessageInterval = 15, + MessageShown = {}, + MessageShow = false, + MessageFlash = false +} + + +function STAGE:New() + local self = BASE:Inherit( self, BASE:New() ) + self:F() + return self +end + +function STAGE:Execute( Mission, Client, Task ) + + local Valid = true + + return Valid +end + +function STAGE:Executing( Mission, Client, Task ) + +end + +function STAGE:Validate( Mission, Client, Task ) + local Valid = true + + return Valid +end + + +STAGEBRIEF = { + ClassName = "BRIEF", + MSG = { ID = "Brief", TIME = 1 }, + Name = "Brief", + StageBriefingTime = 0, + StageBriefingDuration = 1 +} + +function STAGEBRIEF:New() + local self = BASE:Inherit( self, STAGE:New() ) + self:F() + self.StageType = 'CLIENT' + return self +end + +--- Execute +-- @param #STAGEBRIEF self +-- @param Mission#MISSION Mission +-- @param Client#CLIENT Client +-- @param Task#TASK Task +-- @return #boolean +function STAGEBRIEF:Execute( Mission, Client, Task ) + local Valid = BASE:Inherited(self):Execute( Mission, Client, Task ) + self:F() + Client:ShowMissionBriefing( Mission.MissionBriefing ) + self.StageBriefingTime = timer.getTime() + return Valid +end + +function STAGEBRIEF:Validate( Mission, Client, Task ) + local Valid = STAGE:Validate( Mission, Client, Task ) + self:T() + + if timer.getTime() - self.StageBriefingTime <= self.StageBriefingDuration then + return 0 + else + self.StageBriefingTime = timer.getTime() + return 1 + end + +end + + +STAGESTART = { + ClassName = "START", + MSG = { ID = "Start", TIME = 1 }, + Name = "Start", + StageStartTime = 0, + StageStartDuration = 1 +} + +function STAGESTART:New() + local self = BASE:Inherit( self, STAGE:New() ) + self:F() + self.StageType = 'CLIENT' + return self +end + +function STAGESTART:Execute( Mission, Client, Task ) + self:F() + local Valid = BASE:Inherited(self):Execute( Mission, Client, Task ) + if Task.TaskBriefing then + Client:Message( Task.TaskBriefing, 30, Mission.Name .. "/Stage", "Command" ) + else + Client:Message( 'Task ' .. Task.TaskNumber .. '.', 30, Mission.Name .. "/Stage", "Command" ) + end + self.StageStartTime = timer.getTime() + return Valid +end + +function STAGESTART:Validate( Mission, Client, Task ) + self:F() + local Valid = STAGE:Validate( Mission, Client, Task ) + + if timer.getTime() - self.StageStartTime <= self.StageStartDuration then + return 0 + else + self.StageStartTime = timer.getTime() + return 1 + end + + return 1 + +end + +STAGE_CARGO_LOAD = { + ClassName = "STAGE_CARGO_LOAD" +} + +function STAGE_CARGO_LOAD:New() + local self = BASE:Inherit( self, STAGE:New() ) + self:F() + self.StageType = 'CLIENT' + return self +end + +function STAGE_CARGO_LOAD:Execute( Mission, Client, Task ) + self:F() + local Valid = BASE:Inherited(self):Execute( Mission, Client, Task ) + + for LoadCargoID, LoadCargo in pairs( Task.Cargos.LoadCargos ) do + LoadCargo:Load( Client ) + end + + if Mission.MissionReportFlash and Client:IsTransport() then + Client:ShowCargo() + end + + return Valid +end + +function STAGE_CARGO_LOAD:Validate( Mission, Client, Task ) + self:F() + local Valid = STAGE:Validate( Mission, Client, Task ) + + return 1 +end + + +STAGE_CARGO_INIT = { + ClassName = "STAGE_CARGO_INIT" +} + +function STAGE_CARGO_INIT:New() + local self = BASE:Inherit( self, STAGE:New() ) + self:F() + self.StageType = 'CLIENT' + return self +end + +function STAGE_CARGO_INIT:Execute( Mission, Client, Task ) + self:F() + local Valid = BASE:Inherited(self):Execute( Mission, Client, Task ) + + for InitLandingZoneID, InitLandingZone in pairs( Task.LandingZones.LandingZones ) do + self:T( InitLandingZone ) + InitLandingZone:Spawn() + end + + + self:T( Task.Cargos.InitCargos ) + for InitCargoID, InitCargoData in pairs( Task.Cargos.InitCargos ) do + self:T( { InitCargoData } ) + InitCargoData:Spawn( Client ) + end + + return Valid +end + + +function STAGE_CARGO_INIT:Validate( Mission, Client, Task ) + self:F() + local Valid = STAGE:Validate( Mission, Client, Task ) + + return 1 +end + + + +STAGEROUTE = { + ClassName = "STAGEROUTE", + MSG = { ID = "Route", TIME = 5 }, + Frequency = STAGE.FREQUENCY.REPEAT, + Name = "Route" +} + +function STAGEROUTE:New() + local self = BASE:Inherit( self, STAGE:New() ) + self:F() + self.StageType = 'CLIENT' + self.MessageSwitch = true + return self +end + + +--- Execute the routing. +-- @param #STAGEROUTE self +-- @param Mission#MISSION Mission +-- @param Client#CLIENT Client +-- @param Task#TASK Task +function STAGEROUTE:Execute( Mission, Client, Task ) + self:F() + local Valid = BASE:Inherited(self):Execute( Mission, Client, Task ) + + local RouteMessage = "Fly to: " + self:T( Task.LandingZones ) + for LandingZoneID, LandingZoneName in pairs( Task.LandingZones.LandingZoneNames ) do + RouteMessage = RouteMessage .. "\n " .. LandingZoneName .. ' at ' .. routines.getBRStringZone( { zone = LandingZoneName, ref = Client:GetClientGroupDCSUnit():getPoint(), true, true } ) .. ' km.' + end + + if Client:IsMultiSeated() then + Client:Message( RouteMessage, self.MSG.TIME, Mission.Name .. "/StageRoute", "Co-Pilot", 20 ) + else + Client:Message( RouteMessage, self.MSG.TIME, Mission.Name .. "/StageRoute", "Command", 20 ) + end + + + if Mission.MissionReportFlash and Client:IsTransport() then + Client:ShowCargo() + end + + return Valid +end + +function STAGEROUTE:Validate( Mission, Client, Task ) + self:F() + local Valid = STAGE:Validate( Mission, Client, Task ) + + -- check if the Client is in the landing zone + self:T( Task.LandingZones.LandingZoneNames ) + Task.CurrentLandingZoneName = routines.IsUnitNearZonesRadius( Client:GetClientGroupDCSUnit(), Task.LandingZones.LandingZoneNames, 500 ) + + if Task.CurrentLandingZoneName then + + Task.CurrentLandingZone = Task.LandingZones.LandingZones[Task.CurrentLandingZoneName].CargoZone + Task.CurrentCargoZone = Task.LandingZones.LandingZones[Task.CurrentLandingZoneName] + + if Task.CurrentCargoZone then + if not Task.Signalled then + Task.Signalled = Task.CurrentCargoZone:Signal() + end + end + + self:T( 1 ) + return 1 + end + + self:T( 0 ) + return 0 +end + + + +STAGELANDING = { + ClassName = "STAGELANDING", + MSG = { ID = "Landing", TIME = 10 }, + Name = "Landing", + Signalled = false +} + +function STAGELANDING:New() + local self = BASE:Inherit( self, STAGE:New() ) + self:F() + self.StageType = 'CLIENT' + return self +end + +--- Execute the landing coordination. +-- @param #STAGELANDING self +-- @param Mission#MISSION Mission +-- @param Client#CLIENT Client +-- @param Task#TASK Task +function STAGELANDING:Execute( Mission, Client, Task ) + self:F() + + if Client:IsMultiSeated() then + Client:Message( "We have arrived at the landing zone.", self.MSG.TIME, Mission.Name .. "/StageArrived", "Co-Pilot", 10 ) + else + Client:Message( "You have arrived at the landing zone.", self.MSG.TIME, Mission.Name .. "/StageArrived", "Command", 10 ) + end + + Task.HostUnit = Task.CurrentCargoZone:GetHostUnit() + + self:T( { Task.HostUnit } ) + + if Task.HostUnit then + + Task.HostUnitName = Task.HostUnit:GetPrefix() + Task.HostUnitTypeName = Task.HostUnit:GetTypeName() + + local HostMessage = "" + Task.CargoNames = "" + + local IsFirst = true + + for CargoID, Cargo in pairs( CARGOS ) do + if Cargo.CargoType == Task.CargoType then + + if Cargo:IsLandingRequired() then + self:T( "Task for cargo " .. Cargo.CargoType .. " requires landing.") + Task.IsLandingRequired = true + end + + if Cargo:IsSlingLoad() then + self:T( "Task for cargo " .. Cargo.CargoType .. " is a slingload.") + Task.IsSlingLoad = true + end + + if IsFirst then + IsFirst = false + Task.CargoNames = Task.CargoNames .. Cargo.CargoName .. "( " .. Cargo.CargoWeight .. " )" + else + Task.CargoNames = Task.CargoNames .. "; " .. Cargo.CargoName .. "( " .. Cargo.CargoWeight .. " )" + end + end + end + + if Task.IsLandingRequired then + HostMessage = "Land the helicopter to " .. Task.TEXT[1] .. " " .. Task.CargoNames .. "." + else + HostMessage = "Use the Radio menu and F6 to find the cargo, then fly or land near the cargo and " .. Task.TEXT[1] .. " " .. Task.CargoNames .. "." + end + + local Host = "Command" + if Task.HostUnitName then + Host = Task.HostUnitName .. " (" .. Task.HostUnitTypeName .. ")" + else + if Client:IsMultiSeated() then + Host = "Co-Pilot" + end + end + + Client:Message( HostMessage, self.MSG.TIME, Mission.Name .. "/STAGELANDING.EXEC." .. Host, Host, 10 ) + + end +end + +function STAGELANDING:Validate( Mission, Client, Task ) + self:F() + + Task.CurrentLandingZoneName = routines.IsUnitNearZonesRadius( Client:GetClientGroupDCSUnit(), Task.LandingZones.LandingZoneNames, 500 ) + if Task.CurrentLandingZoneName then + + -- Client is in de landing zone. + self:T( Task.CurrentLandingZoneName ) + + Task.CurrentLandingZone = Task.LandingZones.LandingZones[Task.CurrentLandingZoneName].CargoZone + Task.CurrentCargoZone = Task.LandingZones.LandingZones[Task.CurrentLandingZoneName] + + if Task.CurrentCargoZone then + if not Task.Signalled then + Task.Signalled = Task.CurrentCargoZone:Signal() + end + end + else + if Task.CurrentLandingZone then + Task.CurrentLandingZone = nil + end + if Task.CurrentCargoZone then + Task.CurrentCargoZone = nil + end + Task.Signalled = false + Task:RemoveCargoMenus( Client ) + self:T( -1 ) + return -1 + end + + + local DCSUnitVelocityVec3 = Client:GetClientGroupDCSUnit():getVelocity() + local DCSUnitVelocity = ( DCSUnitVelocityVec3.x ^2 + DCSUnitVelocityVec3.y ^2 + DCSUnitVelocityVec3.z ^2 ) ^ 0.5 + + local DCSUnitPointVec3 = Client:GetClientGroupDCSUnit():getPoint() + local LandHeight = land.getHeight( { x = DCSUnitPointVec3.x, y = DCSUnitPointVec3.z } ) + local DCSUnitHeight = DCSUnitPointVec3.y - LandHeight + + self:T( { Task.IsLandingRequired, Client:GetClientGroupDCSUnit():inAir() } ) + if Task.IsLandingRequired and not Client:GetClientGroupDCSUnit():inAir() then + self:T( 1 ) + Task.IsInAirTestRequired = true + return 1 + end + + self:T( { DCSUnitVelocity, DCSUnitHeight, LandHeight, Task.CurrentCargoZone.SignalHeight } ) + if Task.IsLandingRequired and DCSUnitVelocity <= 0.05 and DCSUnitHeight <= Task.CurrentCargoZone.SignalHeight then + self:T( 1 ) + Task.IsInAirTestRequired = false + return 1 + end + + self:T( 0 ) + return 0 +end + +STAGELANDED = { + ClassName = "STAGELANDED", + MSG = { ID = "Land", TIME = 10 }, + Name = "Landed", + MenusAdded = false +} + +function STAGELANDED:New() + local self = BASE:Inherit( self, STAGE:New() ) + self:F() + self.StageType = 'CLIENT' + return self +end + +function STAGELANDED:Execute( Mission, Client, Task ) + self:F() + + if Task.IsLandingRequired then + + local Host = "Command" + if Task.HostUnitName then + Host = Task.HostUnitName .. " (" .. Task.HostUnitTypeName .. ")" + else + if Client:IsMultiSeated() then + Host = "Co-Pilot" + end + end + + Client:Message( 'You have landed within the landing zone. Use the radio menu (F10) to ' .. Task.TEXT[1] .. ' the ' .. Task.CargoType .. '.', + self.MSG.TIME, Mission.Name .. "/STAGELANDED.EXEC" .. Host, Host ) + + if not self.MenusAdded then + Task.Cargo = nil + Task:RemoveCargoMenus( Client ) + Task:AddCargoMenus( Client, CARGOS, 250 ) + end + end +end + + + +function STAGELANDED:Validate( Mission, Client, Task ) + self:F() + + if not routines.IsUnitNearZonesRadius( Client:GetClientGroupDCSUnit(), Task.CurrentLandingZoneName, 500 ) then + self:T( "Client is not anymore in the landing zone, go back to stage Route, and remove cargo menus." ) + Task.Signalled = false + Task:RemoveCargoMenus( Client ) + self:T( -2 ) + return -2 + end + + local DCSUnitVelocityVec3 = Client:GetClientGroupDCSUnit():getVelocity() + local DCSUnitVelocity = ( DCSUnitVelocityVec3.x ^2 + DCSUnitVelocityVec3.y ^2 + DCSUnitVelocityVec3.z ^2 ) ^ 0.5 + + local DCSUnitPointVec3 = Client:GetClientGroupDCSUnit():getPoint() + local LandHeight = land.getHeight( { x = DCSUnitPointVec3.x, y = DCSUnitPointVec3.z } ) + local DCSUnitHeight = DCSUnitPointVec3.y - LandHeight + + self:T( { Task.IsLandingRequired, Client:GetClientGroupDCSUnit():inAir() } ) + if Task.IsLandingRequired and Task.IsInAirTestRequired == true and Client:GetClientGroupDCSUnit():inAir() then + self:T( "Client went back in the air. Go back to stage Landing." ) + self:T( -1 ) + return -1 + end + + self:T( { DCSUnitVelocity, DCSUnitHeight, LandHeight, Task.CurrentCargoZone.SignalHeight } ) + if Task.IsLandingRequired and Task.IsInAirTestRequired == false and DCSUnitVelocity >= 2 and DCSUnitHeight >= Task.CurrentCargoZone.SignalHeight then + self:T( "It seems the Client went back in the air and over the boundary limits. Go back to stage Landing." ) + self:T( -1 ) + return -1 + end + + -- Wait until cargo is selected from the menu. + if Task.IsLandingRequired then + if not Task.Cargo then + self:T( 0 ) + return 0 + end + end + + self:T( 1 ) + return 1 +end + +STAGEUNLOAD = { + ClassName = "STAGEUNLOAD", + MSG = { ID = "Unload", TIME = 10 }, + Name = "Unload" +} + +function STAGEUNLOAD:New() + local self = BASE:Inherit( self, STAGE:New() ) + self:F() + self.StageType = 'CLIENT' + return self +end + +--- Coordinate UnLoading +-- @param #STAGEUNLOAD self +-- @param Mission#MISSION Mission +-- @param Client#CLIENT Client +-- @param Task#TASK Task +function STAGEUNLOAD:Execute( Mission, Client, Task ) + self:F() + + if Client:IsMultiSeated() then + Client:Message( 'The ' .. Task.CargoType .. ' are being ' .. Task.TEXT[2] .. ' within the landing zone. Wait until the helicopter is ' .. Task.TEXT[3] .. '.', + self.MSG.TIME, Mission.Name .. "/StageUnLoad", "Co-Pilot" ) + else + Client:Message( 'You are unloading the ' .. Task.CargoType .. ' ' .. Task.TEXT[2] .. ' within the landing zone. Wait until the helicopter is ' .. Task.TEXT[3] .. '.', + self.MSG.TIME, Mission.Name .. "/StageUnLoad", "Command" ) + end + Task:RemoveCargoMenus( Client ) +end + +function STAGEUNLOAD:Executing( Mission, Client, Task ) + self:F() + env.info( 'STAGEUNLOAD:Executing() Task.Cargo.CargoName = ' .. Task.Cargo.CargoName ) + + local TargetZoneName + + if Task.TargetZoneName then + TargetZoneName = Task.TargetZoneName + else + TargetZoneName = Task.CurrentLandingZoneName + end + + if Task.Cargo:UnLoad( Client, TargetZoneName ) then + Task.ExecuteStage = _TransportExecuteStage.SUCCESS + if Mission.MissionReportFlash then + Client:ShowCargo() + end + end +end + +--- Validate UnLoading +-- @param #STAGEUNLOAD self +-- @param Mission#MISSION Mission +-- @param Client#CLIENT Client +-- @param Task#TASK Task +function STAGEUNLOAD:Validate( Mission, Client, Task ) + self:F() + env.info( 'STAGEUNLOAD:Validate()' ) + + if routines.IsUnitNearZonesRadius( Client:GetClientGroupDCSUnit(), Task.CurrentLandingZoneName, 500 ) then + else + Task.ExecuteStage = _TransportExecuteStage.FAILED + Task:RemoveCargoMenus( Client ) + if Client:IsMultiSeated() then + Client:Message( 'The ' .. Task.CargoType .. " haven't been successfully " .. Task.TEXT[3] .. ' within the landing zone. Task and mission has failed.', + _TransportStageMsgTime.DONE, Mission.Name .. "/StageFailure", "Co-Pilot" ) + else + Client:Message( 'The ' .. Task.CargoType .. " haven't been successfully " .. Task.TEXT[3] .. ' within the landing zone. Task and mission has failed.', + _TransportStageMsgTime.DONE, Mission.Name .. "/StageFailure", "Command" ) + end + return 1 + end + + if not Client:GetClientGroupDCSUnit():inAir() then + else + Task.ExecuteStage = _TransportExecuteStage.FAILED + Task:RemoveCargoMenus( Client ) + if Client:IsMultiSeated() then + Client:Message( 'The ' .. Task.CargoType .. " haven't been successfully " .. Task.TEXT[3] .. ' within the landing zone. Task and mission has failed.', + _TransportStageMsgTime.DONE, Mission.Name .. "/StageFailure", "Co-Pilot" ) + else + Client:Message( 'The ' .. Task.CargoType .. " haven't been successfully " .. Task.TEXT[3] .. ' within the landing zone. Task and mission has failed.', + _TransportStageMsgTime.DONE, Mission.Name .. "/StageFailure", "Command" ) + end + return 1 + end + + if Task.ExecuteStage == _TransportExecuteStage.SUCCESS then + if Client:IsMultiSeated() then + Client:Message( 'The ' .. Task.CargoType .. ' have been sucessfully ' .. Task.TEXT[3] .. ' within the landing zone.', _TransportStageMsgTime.DONE, Mission.Name .. "/Stage", "Co-Pilot" ) + else + Client:Message( 'The ' .. Task.CargoType .. ' have been sucessfully ' .. Task.TEXT[3] .. ' within the landing zone.', _TransportStageMsgTime.DONE, Mission.Name .. "/Stage", "Command" ) + end + Task:RemoveCargoMenus( Client ) + Task.MissionTask:AddGoalCompletion( Task.MissionTask.GoalVerb, Task.CargoName, 1 ) -- We set the cargo as one more goal completed in the mission. + return 1 + end + + return 1 +end + +STAGELOAD = { + ClassName = "STAGELOAD", + MSG = { ID = "Load", TIME = 10 }, + Name = "Load" +} + +function STAGELOAD:New() + local self = BASE:Inherit( self, STAGE:New() ) + self:F() + self.StageType = 'CLIENT' + return self +end + +function STAGELOAD:Execute( Mission, Client, Task ) + self:F() + + if not Task.IsSlingLoad then + + local Host = "Command" + if Task.HostUnitName then + Host = Task.HostUnitName .. " (" .. Task.HostUnitTypeName .. ")" + else + if Client:IsMultiSeated() then + Host = "Co-Pilot" + end + end + + Client:Message( 'The ' .. Task.CargoType .. ' are being ' .. Task.TEXT[2] .. ' within the landing zone. Wait until the helicopter is ' .. Task.TEXT[3] .. '.', + _TransportStageMsgTime.EXECUTING, Mission.Name .. "/STAGELOAD.EXEC." .. Host, Host ) + + -- Route the cargo to the Carrier + + Task.Cargo:OnBoard( Client, Task.CurrentCargoZone, Task.OnBoardSide ) + Task.ExecuteStage = _TransportExecuteStage.EXECUTING + else + Task.ExecuteStage = _TransportExecuteStage.EXECUTING + end +end + +function STAGELOAD:Executing( Mission, Client, Task ) + self:F() + + -- If the Cargo is ready to be loaded, load it into the Client. + + local Host = "Command" + if Task.HostUnitName then + Host = Task.HostUnitName .. " (" .. Task.HostUnitTypeName .. ")" + else + if Client:IsMultiSeated() then + Host = "Co-Pilot" + end + end + + if not Task.IsSlingLoad then + self:T( Task.Cargo.CargoName) + + if Task.Cargo:OnBoarded( Client, Task.CurrentCargoZone ) then + + -- Load the Cargo onto the Client + Task.Cargo:Load( Client ) + + -- Message to the pilot that cargo has been loaded. + Client:Message( "The cargo " .. Task.Cargo.CargoName .. " has been loaded in our helicopter.", + 20, Mission.Name .. "/STAGELANDING.LOADING1." .. Host, Host ) + Task.ExecuteStage = _TransportExecuteStage.SUCCESS + + Client:ShowCargo() + end + else + Client:Message( "Hook the " .. Task.CargoNames .. " onto the helicopter " .. Task.TEXT[3] .. " within the landing zone.", + _TransportStageMsgTime.EXECUTING, Mission.Name .. "/STAGELOAD.LOADING.1." .. Host, Host , 10 ) + for CargoID, Cargo in pairs( CARGOS ) do + self:T( "Cargo.CargoName = " .. Cargo.CargoName ) + + if Cargo:IsSlingLoad() then + local CargoStatic = StaticObject.getByName( Cargo.CargoStaticName ) + if CargoStatic then + self:T( "Cargo is found in the DCS simulator.") + local CargoStaticPosition = CargoStatic:getPosition().p + self:T( "Cargo Position x = " .. CargoStaticPosition.x .. ", y = " .. CargoStaticPosition.y .. ", z = " .. CargoStaticPosition.z ) + local CargoStaticHeight = routines.GetUnitHeight( CargoStatic ) + if CargoStaticHeight > 5 then + self:T( "Cargo is airborne.") + Cargo:StatusLoaded() + Task.Cargo = Cargo + Client:Message( 'The Cargo has been successfully hooked onto the helicopter and is now being sling loaded. Fly outside the landing zone.', + self.MSG.TIME, Mission.Name .. "/STAGELANDING.LOADING.2." .. Host, Host ) + Task.ExecuteStage = _TransportExecuteStage.SUCCESS + break + end + else + self:T( "Cargo not found in the DCS simulator." ) + end + end + end + end + +end + +function STAGELOAD:Validate( Mission, Client, Task ) + self:F() + + self:T( "Task.CurrentLandingZoneName = " .. Task.CurrentLandingZoneName ) + + local Host = "Command" + if Task.HostUnitName then + Host = Task.HostUnitName .. " (" .. Task.HostUnitTypeName .. ")" + else + if Client:IsMultiSeated() then + Host = "Co-Pilot" + end + end + + if not Task.IsSlingLoad then + if not routines.IsUnitNearZonesRadius( Client:GetClientGroupDCSUnit(), Task.CurrentLandingZoneName, 500 ) then + Task:RemoveCargoMenus( Client ) + Task.ExecuteStage = _TransportExecuteStage.FAILED + Task.CargoName = nil + Client:Message( "The " .. Task.CargoType .. " loading has been aborted. You flew outside the pick-up zone while loading. ", + self.MSG.TIME, Mission.Name .. "/STAGELANDING.VALIDATE.1." .. Host, Host ) + self:T( -1 ) + return -1 + end + + local DCSUnitVelocityVec3 = Client:GetClientGroupDCSUnit():getVelocity() + local DCSUnitVelocity = ( DCSUnitVelocityVec3.x ^2 + DCSUnitVelocityVec3.y ^2 + DCSUnitVelocityVec3.z ^2 ) ^ 0.5 + + local DCSUnitPointVec3 = Client:GetClientGroupDCSUnit():getPoint() + local LandHeight = land.getHeight( { x = DCSUnitPointVec3.x, y = DCSUnitPointVec3.z } ) + local DCSUnitHeight = DCSUnitPointVec3.y - LandHeight + + self:T( { Task.IsLandingRequired, Client:GetClientGroupDCSUnit():inAir() } ) + if Task.IsLandingRequired and Task.IsInAirTestRequired == true and Client:GetClientGroupDCSUnit():inAir() then + Task:RemoveCargoMenus( Client ) + Task.ExecuteStage = _TransportExecuteStage.FAILED + Task.CargoName = nil + Client:Message( "The " .. Task.CargoType .. " loading has been aborted. Re-start the " .. Task.TEXT[3] .. " process. Don't fly outside the pick-up zone.", + self.MSG.TIME, Mission.Name .. "/STAGELANDING.VALIDATE.1." .. Host, Host ) + self:T( -1 ) + return -1 + end + + self:T( { DCSUnitVelocity, DCSUnitHeight, LandHeight, Task.CurrentCargoZone.SignalHeight } ) + if Task.IsLandingRequired and Task.IsInAirTestRequired == false and DCSUnitVelocity >= 2 and DCSUnitHeight >= Task.CurrentCargoZone.SignalHeight then + Task:RemoveCargoMenus( Client ) + Task.ExecuteStage = _TransportExecuteStage.FAILED + Task.CargoName = nil + Client:Message( "The " .. Task.CargoType .. " loading has been aborted. Re-start the " .. Task.TEXT[3] .. " process. Don't fly outside the pick-up zone.", + self.MSG.TIME, Mission.Name .. "/STAGELANDING.VALIDATE.1." .. Host, Host ) + self:T( -1 ) + return -1 + end + + if Task.ExecuteStage == _TransportExecuteStage.SUCCESS then + Task:RemoveCargoMenus( Client ) + Client:Message( "Good Job. The " .. Task.CargoType .. " has been sucessfully " .. Task.TEXT[3] .. " within the landing zone.", + self.MSG.TIME, Mission.Name .. "/STAGELANDING.VALIDATE.3." .. Host, Host ) + Task.MissionTask:AddGoalCompletion( Task.MissionTask.GoalVerb, Task.CargoName, 1 ) + self:T( 1 ) + return 1 + end + + else + if Task.ExecuteStage == _TransportExecuteStage.SUCCESS then + CargoStatic = StaticObject.getByName( Task.Cargo.CargoStaticName ) + if CargoStatic and not routines.IsStaticInZones( CargoStatic, Task.CurrentLandingZoneName ) then + Client:Message( "Good Job. The " .. Task.CargoType .. " has been sucessfully " .. Task.TEXT[3] .. " and flown outside of the landing zone.", + self.MSG.TIME, Mission.Name .. "/STAGELANDING.VALIDATE.4." .. Host, Host ) + Task.MissionTask:AddGoalCompletion( Task.MissionTask.GoalVerb, Task.Cargo.CargoName, 1 ) + self:T( 1 ) + return 1 + end + end + + end + + + self:T( 0 ) + return 0 +end + + +STAGEDONE = { + ClassName = "STAGEDONE", + MSG = { ID = "Done", TIME = 10 }, + Name = "Done" +} + +function STAGEDONE:New() + local self = BASE:Inherit( self, STAGE:New() ) + self:F() + self.StageType = 'AI' + return self +end + +function STAGEDONE:Execute( Mission, Client, Task ) + self:F() + +end + +function STAGEDONE:Validate( Mission, Client, Task ) + self:F() + + Task:Done() + + return 0 +end + +STAGEARRIVE = { + ClassName = "STAGEARRIVE", + MSG = { ID = "Arrive", TIME = 10 }, + Name = "Arrive" +} + +function STAGEARRIVE:New() + local self = BASE:Inherit( self, STAGE:New() ) + self:F() + self.StageType = 'CLIENT' + return self +end + + +--- Execute Arrival +-- @param #STAGEARRIVE self +-- @param Mission#MISSION Mission +-- @param Client#CLIENT Client +-- @param Task#TASK Task +function STAGEARRIVE:Execute( Mission, Client, Task ) + self:F() + + if Client:IsMultiSeated() then + Client:Message( 'We have arrived at ' .. Task.CurrentLandingZoneName .. ".", self.MSG.TIME, Mission.Name .. "/Stage", "Co-Pilot" ) + else + Client:Message( 'We have arrived at ' .. Task.CurrentLandingZoneName .. ".", self.MSG.TIME, Mission.Name .. "/Stage", "Command" ) + end + +end + +function STAGEARRIVE:Validate( Mission, Client, Task ) + self:F() + + Task.CurrentLandingZoneID = routines.IsUnitInZones( Client:GetClientGroupDCSUnit(), Task.LandingZones ) + if ( Task.CurrentLandingZoneID ) then + else + return -1 + end + + return 1 +end + +STAGEGROUPSDESTROYED = { + ClassName = "STAGEGROUPSDESTROYED", + DestroyGroupSize = -1, + Frequency = STAGE.FREQUENCY.REPEAT, + MSG = { ID = "DestroyGroup", TIME = 10 }, + Name = "GroupsDestroyed" +} + +function STAGEGROUPSDESTROYED:New() + local self = BASE:Inherit( self, STAGE:New() ) + self:F() + self.StageType = 'AI' + return self +end + +--function STAGEGROUPSDESTROYED:Execute( Mission, Client, Task ) +-- +-- Client:Message( 'Task: Still ' .. DestroyGroupSize .. " of " .. Task.DestroyGroupCount .. " " .. Task.DestroyGroupType .. " to be destroyed!", self.MSG.TIME, Mission.Name .. "/Stage" ) +-- +--end + +function STAGEGROUPSDESTROYED:Validate( Mission, Client, Task ) + self:F() + + if Task.MissionTask:IsGoalReached() then + return 1 + else + return 0 + end +end + +function STAGEGROUPSDESTROYED:Execute( Mission, Client, Task ) + self:F() + self:T( { Task.ClassName, Task.Destroyed } ) + --env.info( 'Event Table Task = ' .. tostring(Task) ) + +end + + + + + + + + + + + + + +--[[ + _TransportStage: Defines the different stages of which of transport missions can be in. This table is internal and is used to control the sequence of messages, actions and flow. + + - _TransportStage.START + - _TransportStage.ROUTE + - _TransportStage.LAND + - _TransportStage.EXECUTE + - _TransportStage.DONE + - _TransportStage.REMOVE +--]] +_TransportStage = { + HOLD = "HOLD", + START = "START", + ROUTE = "ROUTE", + LANDING = "LANDING", + LANDED = "LANDED", + EXECUTING = "EXECUTING", + LOAD = "LOAD", + UNLOAD = "UNLOAD", + DONE = "DONE", + NEXT = "NEXT" +} + +_TransportStageMsgTime = { + HOLD = 10, + START = 60, + ROUTE = 5, + LANDING = 10, + LANDED = 30, + EXECUTING = 30, + LOAD = 30, + UNLOAD = 30, + DONE = 30, + NEXT = 0 +} + +_TransportStageTime = { + HOLD = 10, + START = 5, + ROUTE = 5, + LANDING = 1, + LANDED = 1, + EXECUTING = 5, + LOAD = 5, + UNLOAD = 5, + DONE = 1, + NEXT = 0 +} + +_TransportStageAction = { + REPEAT = -1, + NONE = 0, + ONCE = 1 +} +--- The TASK Classes define major end-to-end activities within a MISSION. The TASK Class is the Master Class to orchestrate these activities. From this class, many concrete TASK classes are inherited. +-- @module TASK + +Include.File( "Routines" ) +Include.File( "Base" ) +Include.File( "Mission" ) +Include.File( "Client" ) +Include.File( "Stage" ) + +--- The TASK class +-- @type TASK +-- @extends Base#BASE +TASK = { + + -- Defines the different signal types with a Task. + SIGNAL = { + COLOR = { + RED = { ID = 1, COLOR = trigger.smokeColor.Red, TEXT = "A red" }, + GREEN = { ID = 2, COLOR = trigger.smokeColor.Green, TEXT = "A green" }, + BLUE = { ID = 3, COLOR = trigger.smokeColor.Blue, TEXT = "A blue" }, + WHITE = { ID = 4, COLOR = trigger.smokeColor.White, TEXT = "A white" }, + ORANGE = { ID = 5, COLOR = trigger.smokeColor.Orange, TEXT = "An orange" } + }, + TYPE = { + SMOKE = { ID = 1, TEXT = "smoke" }, + FLARE = { ID = 2, TEXT = "flare" } + } + }, + ClassName = "TASK", + Mission = {}, -- Owning mission of the Task + Name = '', + Stages = {}, + Stage = {}, + Cargos = { + InitCargos = {}, + LoadCargos = {} + }, + LandingZones = { + LandingZoneNames = {}, + LandingZones = {} + }, + ActiveStage = 0, + TaskDone = false, + TaskFailed = false, + GoalTasks = {} +} + +--- Instantiates a new TASK Base. Should never be used. Interface Class. +-- @return TASK +function TASK:New() + local self = BASE:Inherit( self, BASE:New() ) + self:F() + + -- assign Task default values during construction + self.TaskBriefing = "Task: No Task." + self.Time = timer.getTime() + self.ExecuteStage = _TransportExecuteStage.NONE + + return self +end + +function TASK:SetStage( StageSequenceIncrement ) + self:F( { StageSequenceIncrement } ) + + local Valid = false + if StageSequenceIncrement ~= 0 then + self.ActiveStage = self.ActiveStage + StageSequenceIncrement + if 1 <= self.ActiveStage and self.ActiveStage <= #self.Stages then + self.Stage = self.Stages[self.ActiveStage] + self:T( { self.Stage.Name } ) + self.Frequency = self.Stage.Frequency + Valid = true + else + Valid = false + env.info( "TASK:SetStage() self.ActiveStage is smaller or larger than self.Stages array. self.ActiveStage = " .. self.ActiveStage ) + end + end + self.Time = timer.getTime() + return Valid +end + +function TASK:Init() + self:F() + self.ActiveStage = 0 + self:SetStage(1) + self.TaskDone = false + self.TaskFailed = false +end + + +--- Get progress of a TASK. +-- @return string GoalsText +function TASK:GetGoalProgress() + self:F2() + + local GoalsText = "" + for GoalVerb, GoalVerbData in pairs( self.GoalTasks ) do + local Goals = self:GetGoalCompletion( GoalVerb ) + if Goals and Goals ~= "" then + Goals = '(' .. Goals .. ')' + else + Goals = '( - )' + end + GoalsText = GoalsText .. GoalVerb .. ': ' .. self:GetGoalCount(GoalVerb) .. ' goals ' .. Goals .. ' of ' .. self:GetGoalTotal(GoalVerb) .. ' goals completed (' .. self:GetGoalPercentage(GoalVerb) .. '%); ' + end + + if GoalsText == "" then + GoalsText = "( - )" + end + + return GoalsText +end + +--- Show progress of a TASK. +-- @param MISSION Mission Group structure describing the Mission. +-- @param CLIENT Client Group structure describing the Client. +function TASK:ShowGoalProgress( Mission, Client ) + self:F2() + + local GoalsText = "" + for GoalVerb, GoalVerbData in pairs( self.GoalTasks ) do + if Mission:IsCompleted() then + else + local Goals = self:GetGoalCompletion( GoalVerb ) + if Goals and Goals ~= "" then + else + Goals = "-" + end + GoalsText = GoalsText .. self:GetGoalProgress() + end + end + + if Mission.MissionReportFlash or Mission.MissionReportShow then + Client:Message( GoalsText, 10, "/TASKPROGRESS" .. self.ClassName, "Mission Command: Task Status", 30 ) + end +end + +--- Sets a TASK to status Done. +function TASK:Done() + self:F2() + self.TaskDone = true +end + +--- Returns if a TASK is done. +-- @return bool +function TASK:IsDone() + self:F2( self.TaskDone ) + return self.TaskDone +end + +--- Sets a TASK to status failed. +function TASK:Failed() + self:F() + self.TaskFailed = true +end + +--- Returns if a TASk has failed. +-- @return bool +function TASK:IsFailed() + self:F2( self.TaskFailed ) + return self.TaskFailed +end + +function TASK:Reset( Mission, Client ) + self:F2() + self.ExecuteStage = _TransportExecuteStage.NONE +end + +--- Returns the Goals of a TASK +-- @return @table Goals +function TASK:GetGoals() + return self.GoalTasks +end + +--- Returns if a TASK has Goal(s). +-- @param #TASK self +-- @param #string GoalVerb is the name of the Goal of the TASK. +-- @return bool +function TASK:Goal( GoalVerb ) + self:F2( { GoalVerb } ) + if not GoalVerb then + GoalVerb = self.GoalVerb + end + self:T2( {self.GoalTasks[GoalVerb] } ) + if self.GoalTasks[GoalVerb] and self.GoalTasks[GoalVerb].GoalTotal > 0 then + return true + else + return false + end +end + +--- Sets the total Goals to be achieved of the Goal Name +-- @param number GoalTotal is the number of times the GoalVerb needs to be achieved. +-- @param ?string GoalVerb is the name of the Goal of the TASK. If the GoalVerb is not given, then the default TASK Goals will be used. +function TASK:SetGoalTotal( GoalTotal, GoalVerb ) + self:F2( { GoalTotal, GoalVerb } ) + + if not GoalVerb then + GoalVerb = self.GoalVerb + end + self.GoalTasks[GoalVerb] = {} + self.GoalTasks[GoalVerb].Goals = {} + self.GoalTasks[GoalVerb].GoalTotal = GoalTotal + self.GoalTasks[GoalVerb].GoalCount = 0 + return self +end + +--- Gets the total of Goals to be achieved within the TASK of the GoalVerb. +-- @param ?string GoalVerb is the name of the Goal of the TASK. If the GoalVerb is not given, then the default TASK Goals will be used. +function TASK:GetGoalTotal( GoalVerb ) + self:F2( { GoalVerb } ) + if not GoalVerb then + GoalVerb = self.GoalVerb + end + if self:Goal( GoalVerb ) then + return self.GoalTasks[GoalVerb].GoalTotal + else + return 0 + end +end + +--- Sets the total of Goals currently achieved within the TASK of the GoalVerb. +-- @param number GoalCount is the total number of Goals achieved within the TASK. +-- @param ?string GoalVerb is the name of the Goal of the TASK. If the GoalVerb is not given, then the default TASK Goals will be used. +-- @return TASK +function TASK:SetGoalCount( GoalCount, GoalVerb ) + self:F2() + if not GoalVerb then + GoalVerb = self.GoalVerb + end + if self:Goal( GoalVerb) then + self.GoalTasks[GoalVerb].GoalCount = GoalCount + end + return self +end + +--- Increments the total of Goals currently achieved within the TASK of the GoalVerb, with the given GoalCountIncrease. +-- @param number GoalCountIncrease is the number of new Goals achieved within the TASK. +-- @param ?string GoalVerb is the name of the Goal of the TASK. If the GoalVerb is not given, then the default TASK Goals will be used. +-- @return TASK +function TASK:IncreaseGoalCount( GoalCountIncrease, GoalVerb ) + self:F2( { GoalCountIncrease, GoalVerb } ) + if not GoalVerb then + GoalVerb = self.GoalVerb + end + if self:Goal( GoalVerb) then + self.GoalTasks[GoalVerb].GoalCount = self.GoalTasks[GoalVerb].GoalCount + GoalCountIncrease + end + return self +end + +--- Gets the total of Goals currently achieved within the TASK of the GoalVerb. +-- @param ?string GoalVerb is the name of the Goal of the TASK. If the GoalVerb is not given, then the default TASK Goals will be used. +-- @return TASK +function TASK:GetGoalCount( GoalVerb ) + self:F2() + if not GoalVerb then + GoalVerb = self.GoalVerb + end + if self:Goal( GoalVerb ) then + return self.GoalTasks[GoalVerb].GoalCount + else + return 0 + end +end + +--- Gets the percentage of Goals currently achieved within the TASK of the GoalVerb. +-- @param ?string GoalVerb is the name of the Goal of the TASK. If the GoalVerb is not given, then the default TASK Goals will be used. +-- @return TASK +function TASK:GetGoalPercentage( GoalVerb ) + self:F2() + if not GoalVerb then + GoalVerb = self.GoalVerb + end + if self:Goal( GoalVerb ) then + return math.floor( self:GetGoalCount( GoalVerb ) / self:GetGoalTotal( GoalVerb ) * 100 + .5 ) + else + return 100 + end +end + +--- Returns if all the Goals of the TASK were achieved. +-- @return bool +function TASK:IsGoalReached() + self:F2() + + local GoalReached = true + + for GoalVerb, Goals in pairs( self.GoalTasks ) do + self:T2( { "GoalVerb", GoalVerb } ) + if self:Goal( GoalVerb ) then + local GoalToDo = self:GetGoalTotal( GoalVerb ) - self:GetGoalCount( GoalVerb ) + self:T2( "GoalToDo = " .. GoalToDo ) + if GoalToDo <= 0 then + else + GoalReached = false + break + end + else + break + end + end + + self:T( { GoalReached, self.GoalTasks } ) + return GoalReached +end + +--- Adds an Additional Goal for the TASK to be achieved. +-- @param string GoalVerb is the name of the Goal of the TASK. +-- @param string GoalTask is a text describing the Goal of the TASK to be achieved. +-- @param number GoalIncrease is a number by which the Goal achievement is increasing. +function TASK:AddGoalCompletion( GoalVerb, GoalTask, GoalIncrease ) + self:F2( { GoalVerb, GoalTask, GoalIncrease } ) + + if self:Goal( GoalVerb ) then + self.GoalTasks[GoalVerb].Goals[#self.GoalTasks[GoalVerb].Goals+1] = GoalTask + self.GoalTasks[GoalVerb].GoalCount = self.GoalTasks[GoalVerb].GoalCount + GoalIncrease + end + return self +end + +--- Returns if the additional Goal for the TASK was completed. +-- @param ?string GoalVerb is the name of the Goal of the TASK. If the GoalVerb is not given, then the default TASK Goals will be used. +-- @return string Goals +function TASK:GetGoalCompletion( GoalVerb ) + self:F2( { GoalVerb } ) + + if self:Goal( GoalVerb ) then + local Goals = "" + for GoalID, GoalName in pairs( self.GoalTasks[GoalVerb].Goals ) do Goals = Goals .. GoalName .. " + " end + return Goals:gsub(" + $", ""), self.GoalTasks[GoalVerb].GoalCount + end +end + +function TASK.MenuAction( Parameter ) + Parameter.ReferenceTask.ExecuteStage = _TransportExecuteStage.EXECUTING + Parameter.ReferenceTask.Cargo = Parameter.CargoTask +end + +function TASK:StageExecute() + self:F() + + local Execute = false + + if self.Frequency == STAGE.FREQUENCY.REPEAT then + Execute = true + elseif self.Frequency == STAGE.FREQUENCY.NONE then + Execute = false + elseif self.Frequency >= 0 then + Execute = true + self.Frequency = self.Frequency - 1 + end + + return Execute + +end + +--- Work function to set signal events within a TASK. +function TASK:AddSignal( SignalUnitNames, SignalType, SignalColor, SignalHeight ) + self:F() + + local Valid = true + + if Valid then + if type( SignalUnitNames ) == "table" then + self.LandingZoneSignalUnitNames = SignalUnitNames + else + self.LandingZoneSignalUnitNames = { SignalUnitNames } + end + self.LandingZoneSignalType = SignalType + self.LandingZoneSignalColor = SignalColor + self.Signalled = false + if SignalHeight ~= nil then + self.LandingZoneSignalHeight = SignalHeight + else + self.LandingZoneSignalHeight = 0 + end + + if self.TaskBriefing then + self.TaskBriefing = self.TaskBriefing .. " " .. SignalColor.TEXT .. " " .. SignalType.TEXT .. " will be fired when entering the landing zone." + end + end + + return Valid +end + +--- When the CLIENT is approaching the landing zone, a RED SMOKE will be fired by an optional SignalUnitNames. +-- @param table|string SignalUnitNames Name of the Group that will fire the signal. If this parameter is NIL, the signal will be fired from the center of the landing zone. +-- @param number SignalHeight Altitude that the Signal should be fired... +function TASK:AddSmokeRed( SignalUnitNames, SignalHeight ) + self:F() + self:AddSignal( SignalUnitNames, TASK.SIGNAL.TYPE.SMOKE, TASK.SIGNAL.COLOR.RED, SignalHeight ) +end + +--- When the CLIENT is approaching the landing zone, a GREEN SMOKE will be fired by an optional SignalUnitNames. +-- @param table|string SignalUnitNames Name of the Group that will fire the signal. If this parameter is NIL, the signal will be fired from the center of the landing zone. +-- @param number SignalHeight Altitude that the Signal should be fired... +function TASK:AddSmokeGreen( SignalUnitNames, SignalHeight ) + self:F() + self:AddSignal( SignalUnitNames, TASK.SIGNAL.TYPE.SMOKE, TASK.SIGNAL.COLOR.GREEN, SignalHeight ) +end + +--- When the CLIENT is approaching the landing zone, a BLUE SMOKE will be fired by an optional SignalUnitNames. +-- @param table|string SignalUnitNames Name of the Group that will fire the signal. If this parameter is NIL, the signal will be fired from the center of the landing zone. +-- @param number SignalHeight Altitude that the Signal should be fired... +function TASK:AddSmokeBlue( SignalUnitNames, SignalHeight ) + self:F() + self:AddSignal( SignalUnitNames, TASK.SIGNAL.TYPE.SMOKE, TASK.SIGNAL.COLOR.BLUE, SignalHeight ) +end + +--- When the CLIENT is approaching the landing zone, a WHITE SMOKE will be fired by an optional SignalUnitNames. +-- @param table|string SignalUnitNames Name of the Group that will fire the signal. If this parameter is NIL, the signal will be fired from the center of the landing zone. +-- @param number SignalHeight Altitude that the Signal should be fired... +function TASK:AddSmokeWhite( SignalUnitNames, SignalHeight ) + self:F() + self:AddSignal( SignalUnitNames, TASK.SIGNAL.TYPE.SMOKE, TASK.SIGNAL.COLOR.WHITE, SignalHeight ) +end + +--- When the CLIENT is approaching the landing zone, an ORANGE SMOKE will be fired by an optional SignalUnitNames. +-- @param table|string SignalUnitNames Name of the Group that will fire the signal. If this parameter is NIL, the signal will be fired from the center of the landing zone. +-- @param number SignalHeight Altitude that the Signal should be fired... +function TASK:AddSmokeOrange( SignalUnitNames, SignalHeight ) + self:F() + self:AddSignal( SignalUnitNames, TASK.SIGNAL.TYPE.SMOKE, TASK.SIGNAL.COLOR.ORANGE, SignalHeight ) +end + +--- When the CLIENT is approaching the landing zone, a RED FLARE will be fired by an optional SignalUnitNames. +-- @param table|string SignalUnitNames Name of the Group that will fire the signal. If this parameter is NIL, the signal will be fired from the center of the landing zone. +-- @param number SignalHeight Altitude that the Signal should be fired... +function TASK:AddFlareRed( SignalUnitNames, SignalHeight ) + self:F() + self:AddSignal( SignalUnitNames, TASK.SIGNAL.TYPE.FLARE, TASK.SIGNAL.COLOR.RED, SignalHeight ) +end + +--- When the CLIENT is approaching the landing zone, a GREEN FLARE will be fired by an optional SignalUnitNames. +-- @param table|string SignalUnitNames Name of the Group that will fire the signal. If this parameter is NIL, the signal will be fired from the center of the landing zone. +-- @param number SignalHeight Altitude that the Signal should be fired... +function TASK:AddFlareGreen( SignalUnitNames, SignalHeight ) + self:F() + self:AddSignal( SignalUnitNames, TASK.SIGNAL.TYPE.FLARE, TASK.SIGNAL.COLOR.GREEN, SignalHeight ) +end + +--- When the CLIENT is approaching the landing zone, a BLUE FLARE will be fired by an optional SignalUnitNames. +-- @param table|string SignalUnitNames Name of the Group that will fire the signal. If this parameter is NIL, the signal will be fired from the center of the landing zone. +-- @param number SignalHeight Altitude that the Signal should be fired... +function TASK:AddFlareBlue( SignalUnitNames, SignalHeight ) + self:F() + self:AddSignal( SignalUnitNames, TASK.SIGNAL.TYPE.FLARE, TASK.SIGNAL.COLOR.BLUE, SignalHeight ) +end + +--- When the CLIENT is approaching the landing zone, a WHITE FLARE will be fired by an optional SignalUnitNames. +-- @param table|string SignalUnitNames Name of the Group that will fire the signal. If this parameter is NIL, the signal will be fired from the center of the landing zone. +-- @param number SignalHeight Altitude that the Signal should be fired... +function TASK:AddFlareWhite( SignalUnitNames, SignalHeight ) + self:F() + self:AddSignal( SignalUnitNames, TASK.SIGNAL.TYPE.FLARE, TASK.SIGNAL.COLOR.WHITE, SignalHeight ) +end + +--- When the CLIENT is approaching the landing zone, an ORANGE FLARE will be fired by an optional SignalUnitNames. +-- @param table|string SignalUnitNames Name of the Group that will fire the signal. If this parameter is NIL, the signal will be fired from the center of the landing zone. +-- @param number SignalHeight Altitude that the Signal should be fired... +function TASK:AddFlareOrange( SignalUnitNames, SignalHeight ) + self:F() + self:AddSignal( SignalUnitNames, TASK.SIGNAL.TYPE.FLARE, TASK.SIGNAL.COLOR.ORANGE, SignalHeight ) +end +--- A GOHOMETASK orchestrates the travel back to the home base, which is a specific zone defined within the ME. +-- @module GOHOMETASK + +Include.File("Task") + +--- The GOHOMETASK class +-- @type +GOHOMETASK = { + ClassName = "GOHOMETASK", +} + +--- Creates a new GOHOMETASK. +-- @param table{string,...}|string LandingZones Table of Landing Zone names where Home(s) are located. +-- @return GOHOMETASK +function GOHOMETASK:New( LandingZones ) + local self = BASE:Inherit( self, TASK:New() ) + self:F( { LandingZones } ) + local Valid = true + + Valid = routines.ValidateZone( LandingZones, "LandingZones", Valid ) + + if Valid then + self.Name = 'Fly Home' + self.TaskBriefing = "Task: Fly back to your home base. Your co-pilot will provide you with the directions (required flight angle in degrees) and the distance (in km) to your home base." + if type( LandingZones ) == "table" then + self.LandingZones = LandingZones + else + self.LandingZones = { LandingZones } + end + self.Stages = { STAGEBRIEF:New(), STAGESTART:New(), STAGEROUTE:New(), STAGEARRIVE:New(), STAGEDONE:New() } + self.SetStage( self, 1 ) + end + + return self +end +--- A DESTROYBASETASK will monitor the destruction of Groups and Units. This is a BASE class, other classes are derived from this class. +-- @module DESTROYBASETASK +-- @see DESTROYGROUPSTASK +-- @see DESTROYUNITTYPESTASK +-- @see DESTROY_RADARS_TASK + +Include.File("Task") + +--- The DESTROYBASETASK class +-- @type DESTROYBASETASK +DESTROYBASETASK = { + ClassName = "DESTROYBASETASK", + Destroyed = 0, + GoalVerb = "Destroy", + DestroyPercentage = 100, +} + +--- Creates a new DESTROYBASETASK. +-- @param #DESTROYBASETASK self +-- @param #string DestroyGroupType Text describing the group to be destroyed. f.e. "Radar Installations", "Ships", "Vehicles", "Command Centers". +-- @param #string DestroyUnitType Text describing the unit types to be destroyed. f.e. "SA-6", "Row Boats", "Tanks", "Tents". +-- @param #list<#string> DestroyGroupPrefixes Table of Prefixes of the Groups to be destroyed before task is completed. +-- @param #number DestroyPercentage defines the %-tage that needs to be destroyed to achieve mission success. eg. If in the Group there are 10 units, then a value of 75 would require 8 units to be destroyed from the Group to complete the @{TASK}. +-- @return DESTROYBASETASK +function DESTROYBASETASK:New( DestroyGroupType, DestroyUnitType, DestroyGroupPrefixes, DestroyPercentage ) + local self = BASE:Inherit( self, TASK:New() ) + self:F() + + self.Name = 'Destroy' + self.Destroyed = 0 + self.DestroyGroupPrefixes = DestroyGroupPrefixes + self.DestroyGroupType = DestroyGroupType + self.DestroyUnitType = DestroyUnitType + if DestroyPercentage then + self.DestroyPercentage = DestroyPercentage + end + self.TaskBriefing = "Task: Destroy " .. DestroyGroupType .. "." + self.Stages = { STAGEBRIEF:New(), STAGESTART:New(), STAGEGROUPSDESTROYED:New(), STAGEDONE:New() } + self.SetStage( self, 1 ) + + return self +end + +--- Handle the S_EVENT_DEAD events to validate the destruction of units for the task monitoring. +-- @param #DESTROYBASETASK self +-- @param Event#EVENTDATA Event structure of MOOSE. +function DESTROYBASETASK:EventDead( Event ) + self:F( { Event } ) + + if Event.IniDCSUnit then + local DestroyUnit = Event.IniDCSUnit + local DestroyUnitName = Event.IniDCSUnitName + local DestroyGroup = Event.IniDCSGroup + local DestroyGroupName = Event.IniDCSGroupName + + --TODO: I need to fix here if 2 groups in the mission have a similar name with GroupPrefix equal, then i should differentiate for which group the goal was reached! + --I may need to test if for the goalverb that group goal was reached or something. Need to think about it a bit more ... + local UnitsDestroyed = 0 + for DestroyGroupPrefixID, DestroyGroupPrefix in pairs( self.DestroyGroupPrefixes ) do + self:T( DestroyGroupPrefix ) + if string.find( DestroyGroupName, DestroyGroupPrefix, 1, true ) then + self:T( BASE:Inherited(self).ClassName ) + UnitsDestroyed = self:ReportGoalProgress( DestroyGroup, DestroyUnit ) + self:T( UnitsDestroyed ) + end + end + + self:T( { UnitsDestroyed } ) + self:IncreaseGoalCount( UnitsDestroyed, self.GoalVerb ) + end + +end + +--- Validate task completeness of DESTROYBASETASK. +-- @param DestroyGroup Group structure describing the group to be evaluated. +-- @param DestroyUnit Unit structure describing the Unit to be evaluated. +function DESTROYBASETASK:ReportGoalProgress( DestroyGroup, DestroyUnit ) + self:F() + + return 0 +end +--- DESTROYGROUPSTASK +-- @module DESTROYGROUPSTASK + +Include.File("DestroyBaseTask") + +--- The DESTROYGROUPSTASK class +-- @type +DESTROYGROUPSTASK = { + ClassName = "DESTROYGROUPSTASK", + GoalVerb = "Destroy Groups", +} + +--- Creates a new DESTROYGROUPSTASK. +-- @param #DESTROYGROUPSTASK self +-- @param #string DestroyGroupType String describing the group to be destroyed. +-- @param #string DestroyUnitType String describing the unit to be destroyed. +-- @param #list<#string> DestroyGroupNames Table of string containing the name of the groups to be destroyed before task is completed. +-- @param #number DestroyPercentage defines the %-tage that needs to be destroyed to achieve mission success. eg. If in the Group there are 10 units, then a value of 75 would require 8 units to be destroyed from the Group to complete the @{TASK}. +---@return DESTROYGROUPSTASK +function DESTROYGROUPSTASK:New( DestroyGroupType, DestroyUnitType, DestroyGroupNames, DestroyPercentage ) + local self = BASE:Inherit( self, DESTROYBASETASK:New( DestroyGroupType, DestroyUnitType, DestroyGroupNames, DestroyPercentage ) ) + self:F() + + self.Name = 'Destroy Groups' + self.GoalVerb = "Destroy " .. DestroyGroupType + + _EVENTDISPATCHER:OnDead( self.EventDead , self ) + _EVENTDISPATCHER:OnCrash( self.EventDead , self ) + + return self +end + +--- Report Goal Progress. +-- @param #DESTROYGROUPSTASK self +-- @param DCSGroup#Group DestroyGroup Group structure describing the group to be evaluated. +-- @param DCSUnit#Unit DestroyUnit Unit structure describing the Unit to be evaluated. +-- @return #number The DestroyCount reflecting the amount of units destroyed within the group. +function DESTROYGROUPSTASK:ReportGoalProgress( DestroyGroup, DestroyUnit ) + self:F( { DestroyGroup, DestroyUnit, self.DestroyPercentage } ) + + local DestroyGroupSize = DestroyGroup:getSize() - 1 -- When a DEAD event occurs, the getSize is still one larger than the destroyed unit. + local DestroyGroupInitialSize = DestroyGroup:getInitialSize() + self:T( { DestroyGroupSize, DestroyGroupInitialSize - ( DestroyGroupInitialSize * self.DestroyPercentage / 100 ) } ) + + local DestroyCount = 0 + if DestroyGroup then + if DestroyGroupSize <= DestroyGroupInitialSize - ( DestroyGroupInitialSize * self.DestroyPercentage / 100 ) then + DestroyCount = 1 + end + else + DestroyCount = 1 + end + + self:T( DestroyCount ) + + return DestroyCount +end +--- Task class to destroy radar installations. +-- @module DESTROYRADARSTASK + +Include.File("DestroyBaseTask") + +--- The DESTROYRADARS class +-- @type +DESTROYRADARSTASK = { + ClassName = "DESTROYRADARSTASK", + GoalVerb = "Destroy Radars" +} + +--- Creates a new DESTROYRADARSTASK. +-- @param table{string,...} DestroyGroupNames Table of string containing the group names of which the radars are be destroyed. +-- @return DESTROYRADARSTASK +function DESTROYRADARSTASK:New( DestroyGroupNames ) + local self = BASE:Inherit( self, DESTROYGROUPSTASK:New( 'radar installations', 'radars', DestroyGroupNames ) ) + self:F() + + self.Name = 'Destroy Radars' + + _EVENTDISPATCHER:OnDead( self.EventDead , self ) + + return self +end + +--- Report Goal Progress. +-- @param Group DestroyGroup Group structure describing the group to be evaluated. +-- @param Unit DestroyUnit Unit structure describing the Unit to be evaluated. +function DESTROYRADARSTASK:ReportGoalProgress( DestroyGroup, DestroyUnit ) + self:F( { DestroyGroup, DestroyUnit } ) + + local DestroyCount = 0 + if DestroyUnit and DestroyUnit:hasSensors( Unit.SensorType.RADAR, Unit.RadarType.AS ) then + if DestroyUnit and DestroyUnit:getLife() <= 1.0 then + self:T( 'Destroyed a radar' ) + DestroyCount = 1 + end + end + return DestroyCount +end +--- Set TASK to destroy certain unit types. +-- @module DESTROYUNITTYPESTASK + +Include.File("DestroyBaseTask") + +--- The DESTROYUNITTYPESTASK class +-- @type +DESTROYUNITTYPESTASK = { + ClassName = "DESTROYUNITTYPESTASK", + GoalVerb = "Destroy", +} + +--- Creates a new DESTROYUNITTYPESTASK. +-- @param string DestroyGroupType String describing the group to be destroyed. f.e. "Radar Installations", "Fleet", "Batallion", "Command Centers". +-- @param string DestroyUnitType String describing the unit to be destroyed. f.e. "radars", "ships", "tanks", "centers". +-- @param table{string,...} DestroyGroupNames Table of string containing the group names of which the radars are be destroyed. +-- @param string DestroyUnitTypes Table of string containing the type names of the units to achieve mission success. +-- @return DESTROYUNITTYPESTASK +function DESTROYUNITTYPESTASK:New( DestroyGroupType, DestroyUnitType, DestroyGroupNames, DestroyUnitTypes ) + local self = BASE:Inherit( self, DESTROYBASETASK:New( DestroyGroupType, DestroyUnitType, DestroyGroupNames ) ) + self:F( { DestroyGroupType, DestroyUnitType, DestroyGroupNames, DestroyUnitTypes } ) + + if type(DestroyUnitTypes) == 'table' then + self.DestroyUnitTypes = DestroyUnitTypes + else + self.DestroyUnitTypes = { DestroyUnitTypes } + end + + self.Name = 'Destroy Unit Types' + self.GoalVerb = "Destroy " .. DestroyGroupType + + _EVENTDISPATCHER:OnDead( self.EventDead , self ) + + return self +end + +--- Report Goal Progress. +-- @param Group DestroyGroup Group structure describing the group to be evaluated. +-- @param Unit DestroyUnit Unit structure describing the Unit to be evaluated. +function DESTROYUNITTYPESTASK:ReportGoalProgress( DestroyGroup, DestroyUnit ) + self:F( { DestroyGroup, DestroyUnit } ) + + local DestroyCount = 0 + for UnitTypeID, UnitType in pairs( self.DestroyUnitTypes ) do + if DestroyUnit and DestroyUnit:getTypeName() == UnitType then + if DestroyUnit and DestroyUnit:getLife() <= 1.0 then + DestroyCount = DestroyCount + 1 + end + end + end + return DestroyCount +end +--- A PICKUPTASK orchestrates the loading of CARGO at a specific landing zone. +-- @module PICKUPTASK +-- @parent TASK + +Include.File("Task") +Include.File("Cargo") + +--- The PICKUPTASK class +-- @type +PICKUPTASK = { + ClassName = "PICKUPTASK", + TEXT = { "Pick-Up", "picked-up", "loaded" }, + GoalVerb = "Pick-Up" +} + +--- Creates a new PICKUPTASK. +-- @param table{string,...}|string LandingZones Table of Zone names where Cargo is to be loaded. +-- @param CARGO_TYPE CargoType Type of the Cargo. The type must be of the following Enumeration:.. +-- @param number OnBoardSide Reflects from which side the cargo Group will be on-boarded on the Carrier. +function PICKUPTASK:New( CargoType, OnBoardSide ) + local self = BASE:Inherit( self, TASK:New() ) + self:F() + + -- self holds the inherited instance of the PICKUPTASK Class to the BASE class. + + local Valid = true + + if Valid then + self.Name = 'Pickup Cargo' + self.TaskBriefing = "Task: Fly to the indicated landing zones and pickup " .. CargoType .. ". Your co-pilot will provide you with the directions (required flight angle in degrees) and the distance (in km) to the pickup zone." + self.CargoType = CargoType + self.GoalVerb = CargoType .. " " .. self.GoalVerb + self.OnBoardSide = OnBoardSide + self.IsLandingRequired = true -- required to decide whether the client needs to land or not + self.IsSlingLoad = false -- Indicates whether the cargo is a sling load cargo + self.Stages = { STAGE_CARGO_INIT:New(), STAGE_CARGO_LOAD:New(), STAGEBRIEF:New(), STAGESTART:New(), STAGEROUTE:New(), STAGELANDING:New(), STAGELANDED:New(), STAGELOAD:New(), STAGEDONE:New() } + self.SetStage( self, 1 ) + end + + return self +end + +function PICKUPTASK:FromZone( LandingZone ) + self:F() + + self.LandingZones.LandingZoneNames[LandingZone.CargoZoneName] = LandingZone.CargoZoneName + self.LandingZones.LandingZones[LandingZone.CargoZoneName] = LandingZone + + return self +end + +function PICKUPTASK:InitCargo( InitCargos ) + self:F( { InitCargos } ) + + if type( InitCargos ) == "table" then + self.Cargos.InitCargos = InitCargos + else + self.Cargos.InitCargos = { InitCargos } + end + + return self +end + +function PICKUPTASK:LoadCargo( LoadCargos ) + self:F( { LoadCargos } ) + + if type( LoadCargos ) == "table" then + self.Cargos.LoadCargos = LoadCargos + else + self.Cargos.LoadCargos = { LoadCargos } + end + + return self +end + +function PICKUPTASK:AddCargoMenus( Client, Cargos, TransportRadius ) + self:F() + + for CargoID, Cargo in pairs( Cargos ) do + + self:T( { Cargo.ClassName, Cargo.CargoName, Cargo.CargoType, Cargo:IsStatusNone(), Cargo:IsStatusLoaded(), Cargo:IsStatusLoading(), Cargo:IsStatusUnLoaded() } ) + + -- If the Cargo has no status, allow the menu option. + if Cargo:IsStatusNone() or ( Cargo:IsStatusLoading() and Client == Cargo:IsLoadingToClient() ) then + + local MenuAdd = false + if Cargo:IsNear( Client, self.CurrentCargoZone ) then + MenuAdd = true + end + + if MenuAdd then + if Client._Menus[Cargo.CargoType] == nil then + Client._Menus[Cargo.CargoType] = {} + end + + if not Client._Menus[Cargo.CargoType].PickupMenu then + Client._Menus[Cargo.CargoType].PickupMenu = missionCommands.addSubMenuForGroup( + Client:GetClientGroupID(), + self.TEXT[1] .. " " .. Cargo.CargoType, + nil + ) + self:T( 'Added PickupMenu: ' .. self.TEXT[1] .. " " .. Cargo.CargoType ) + end + + if Client._Menus[Cargo.CargoType].PickupSubMenus == nil then + Client._Menus[Cargo.CargoType].PickupSubMenus = {} + end + + Client._Menus[Cargo.CargoType].PickupSubMenus[ #Client._Menus[Cargo.CargoType].PickupSubMenus + 1 ] = missionCommands.addCommandForGroup( + Client:GetClientGroupID(), + Cargo.CargoName .. " ( " .. Cargo.CargoWeight .. "kg )", + Client._Menus[Cargo.CargoType].PickupMenu, + self.MenuAction, + { ReferenceTask = self, CargoTask = Cargo } + ) + self:T( 'Added PickupSubMenu' .. Cargo.CargoType .. ":" .. Cargo.CargoName .. " ( " .. Cargo.CargoWeight .. "kg )" ) + end + end + end + +end + +function PICKUPTASK:RemoveCargoMenus( Client ) + self:F() + + for MenuID, MenuData in pairs( Client._Menus ) do + for SubMenuID, SubMenuData in pairs( MenuData.PickupSubMenus ) do + missionCommands.removeItemForGroup( Client:GetClientGroupID(), SubMenuData ) + self:T( "Removed PickupSubMenu " ) + SubMenuData = nil + end + if MenuData.PickupMenu then + missionCommands.removeItemForGroup( Client:GetClientGroupID(), MenuData.PickupMenu ) + self:T( "Removed PickupMenu " ) + MenuData.PickupMenu = nil + end + end + + for CargoID, Cargo in pairs( CARGOS ) do + self:T( { Cargo.ClassName, Cargo.CargoName, Cargo.CargoType, Cargo:IsStatusNone(), Cargo:IsStatusLoaded(), Cargo:IsStatusLoading(), Cargo:IsStatusUnLoaded() } ) + if Cargo:IsStatusLoading() and Client == Cargo:IsLoadingToClient() then + Cargo:StatusNone() + end + end + +end + + + +function PICKUPTASK:HasFailed( ClientDead ) + self:F() + + local TaskHasFailed = self.TaskFailed + return TaskHasFailed +end + +--- A DEPLOYTASK orchestrates the deployment of CARGO within a specific landing zone. +-- @module DEPLOYTASK + +Include.File( "Task" ) + +--- A DeployTask +-- @type DEPLOYTASK +DEPLOYTASK = { + ClassName = "DEPLOYTASK", + TEXT = { "Deploy", "deployed", "unloaded" }, + GoalVerb = "Deployment" +} + + +--- Creates a new DEPLOYTASK object, which models the sequence of STAGEs to unload a cargo. +-- @function [parent=#DEPLOYTASK] New +-- @param #string CargoType Type of the Cargo. +-- @return #DEPLOYTASK The created DeployTask +function DEPLOYTASK:New( CargoType ) + local self = BASE:Inherit( self, TASK:New() ) + self:F() + + local Valid = true + + if Valid then + self.Name = 'Deploy Cargo' + self.TaskBriefing = "Fly to one of the indicated landing zones and deploy " .. CargoType .. ". Your co-pilot will provide you with the directions (required flight angle in degrees) and the distance (in km) to the deployment zone." + self.CargoType = CargoType + self.GoalVerb = CargoType .. " " .. self.GoalVerb + self.Stages = { STAGE_CARGO_INIT:New(), STAGE_CARGO_LOAD:New(), STAGEBRIEF:New(), STAGESTART:New(), STAGEROUTE:New(), STAGELANDING:New(), STAGELANDED:New(), STAGEUNLOAD:New(), STAGEDONE:New() } + self.SetStage( self, 1 ) + end + + return self +end + +function DEPLOYTASK:ToZone( LandingZone ) + self:F() + + self.LandingZones.LandingZoneNames[LandingZone.CargoZoneName] = LandingZone.CargoZoneName + self.LandingZones.LandingZones[LandingZone.CargoZoneName] = LandingZone + + return self +end + + +function DEPLOYTASK:InitCargo( InitCargos ) + self:F( { InitCargos } ) + + if type( InitCargos ) == "table" then + self.Cargos.InitCargos = InitCargos + else + self.Cargos.InitCargos = { InitCargos } + end + + return self +end + + +function DEPLOYTASK:LoadCargo( LoadCargos ) + self:F( { LoadCargos } ) + + if type( LoadCargos ) == "table" then + self.Cargos.LoadCargos = LoadCargos + else + self.Cargos.LoadCargos = { LoadCargos } + end + + return self +end + + +--- When the cargo is unloaded, it will move to the target zone name. +-- @param string TargetZoneName Name of the Zone to where the Cargo should move after unloading. +function DEPLOYTASK:SetCargoTargetZoneName( TargetZoneName ) + self:F() + + local Valid = true + + Valid = routines.ValidateString( TargetZoneName, "TargetZoneName", Valid ) + + if Valid then + self.TargetZoneName = TargetZoneName + end + + return Valid + +end + +function DEPLOYTASK:AddCargoMenus( Client, Cargos, TransportRadius ) + self:F() + + local ClientGroupID = Client:GetClientGroupID() + + self:T( ClientGroupID ) + + for CargoID, Cargo in pairs( Cargos ) do + + self:T( { Cargo.ClassName, Cargo.CargoName, Cargo.CargoType, Cargo.CargoWeight } ) + + if Cargo:IsStatusLoaded() and Client == Cargo:IsLoadedInClient() then + + if Client._Menus[Cargo.CargoType] == nil then + Client._Menus[Cargo.CargoType] = {} + end + + if not Client._Menus[Cargo.CargoType].DeployMenu then + Client._Menus[Cargo.CargoType].DeployMenu = missionCommands.addSubMenuForGroup( + ClientGroupID, + self.TEXT[1] .. " " .. Cargo.CargoType, + nil + ) + self:T( 'Added DeployMenu ' .. self.TEXT[1] ) + end + + if Client._Menus[Cargo.CargoType].DeploySubMenus == nil then + Client._Menus[Cargo.CargoType].DeploySubMenus = {} + end + + if Client._Menus[Cargo.CargoType].DeployMenu == nil then + self:T( 'deploymenu is nil' ) + end + + Client._Menus[Cargo.CargoType].DeploySubMenus[ #Client._Menus[Cargo.CargoType].DeploySubMenus + 1 ] = missionCommands.addCommandForGroup( + ClientGroupID, + Cargo.CargoName .. " ( " .. Cargo.CargoWeight .. "kg )", + Client._Menus[Cargo.CargoType].DeployMenu, + self.MenuAction, + { ReferenceTask = self, CargoTask = Cargo } + ) + self:T( 'Added DeploySubMenu ' .. Cargo.CargoType .. ":" .. Cargo.CargoName .. " ( " .. Cargo.CargoWeight .. "kg )" ) + end + end + +end + +function DEPLOYTASK:RemoveCargoMenus( Client ) + self:F() + + local ClientGroupID = Client:GetClientGroupID() + self:T( ClientGroupID ) + + for MenuID, MenuData in pairs( Client._Menus ) do + if MenuData.DeploySubMenus ~= nil then + for SubMenuID, SubMenuData in pairs( MenuData.DeploySubMenus ) do + missionCommands.removeItemForGroup( ClientGroupID, SubMenuData ) + self:T( "Removed DeploySubMenu " ) + SubMenuData = nil + end + end + if MenuData.DeployMenu then + missionCommands.removeItemForGroup( ClientGroupID, MenuData.DeployMenu ) + self:T( "Removed DeployMenu " ) + MenuData.DeployMenu = nil + end + end + +end +--- A NOTASK is a dummy activity... But it will show a Mission Briefing... +-- @module NOTASK + +Include.File("Task") + +--- The NOTASK class +-- @type +NOTASK = { + ClassName = "NOTASK", +} + +--- Creates a new NOTASK. +function NOTASK:New() + local self = BASE:Inherit( self, TASK:New() ) + self:F() + + local Valid = true + + if Valid then + self.Name = 'Nothing' + self.TaskBriefing = "Task: Execute your mission." + self.Stages = { STAGEBRIEF:New(), STAGESTART:New(), STAGEDONE:New() } + self.SetStage( self, 1 ) + end + + return self +end +--- A ROUTETASK orchestrates the travel to a specific zone defined within the ME. +-- @module ROUTETASK + +--- The ROUTETASK class +-- @type +ROUTETASK = { + ClassName = "ROUTETASK", + GoalVerb = "Route", +} + +--- Creates a new ROUTETASK. +-- @param table{sring,...}|string LandingZones Table of Zone Names where the target is located. +-- @param string TaskBriefing (optional) Defines a text describing the briefing of the task. +-- @return ROUTETASK +function ROUTETASK:New( LandingZones, TaskBriefing ) + local self = BASE:Inherit( self, TASK:New() ) + self:F( { LandingZones, TaskBriefing } ) + + local Valid = true + + Valid = routines.ValidateZone( LandingZones, "LandingZones", Valid ) + + if Valid then + self.Name = 'Route To Zone' + if TaskBriefing then + self.TaskBriefing = TaskBriefing .. " Your co-pilot will provide you with the directions (required flight angle in degrees) and the distance (in km) to the target objective." + else + self.TaskBriefing = "Task: Fly to specified zone(s). Your co-pilot will provide you with the directions (required flight angle in degrees) and the distance (in km) to the target objective." + end + if type( LandingZones ) == "table" then + self.LandingZones = LandingZones + else + self.LandingZones = { LandingZones } + end + self.Stages = { STAGEBRIEF:New(), STAGESTART:New(), STAGEROUTE:New(), STAGEARRIVE:New(), STAGEDONE:New() } + self.SetStage( self, 1 ) + end + + return self +end + +--- A MISSION is the main owner of a Mission orchestration within MOOSE . The Mission framework orchestrates @{CLIENT}s, @{TASK}s, @{STAGE}s etc. +-- A @{CLIENT} needs to be registered within the @{MISSION} through the function @{AddClient}. A @{TASK} needs to be registered within the @{MISSION} through the function @{AddTask}. +-- @module Mission + +Include.File( "Routines" ) +Include.File( "Base" ) +Include.File( "Client" ) +Include.File( "Task" ) + +--- The MISSION class +-- @type MISSION +-- @extends Base#BASE +-- @field #MISSION.Clients _Clients +-- @field #string MissionBriefing +MISSION = { + ClassName = "MISSION", + Name = "", + MissionStatus = "PENDING", + _Clients = {}, + _Tasks = {}, + _ActiveTasks = {}, + GoalFunction = nil, + MissionReportTrigger = 0, + MissionProgressTrigger = 0, + MissionReportShow = false, + MissionReportFlash = false, + MissionTimeInterval = 0, + MissionCoalition = "", + SUCCESS = 1, + FAILED = 2, + REPEAT = 3, + _GoalTasks = {} +} + +--- @type MISSION.Clients +-- @list + +function MISSION:Meta() + + local self = BASE:Inherit( self, BASE:New() ) + self:F() + + return self +end + +--- This is the main MISSION declaration method. Each Mission is like the master or a Mission orchestration between, Clients, Tasks, Stages etc. +-- @param string MissionName is the name of the mission. This name will be used to reference the status of each mission by the players. +-- @param string MissionPriority is a string indicating the "priority" of the Mission. f.e. "Primary", "Secondary" or "First", "Second". It is free format and up to the Mission designer to choose. There are no rules behind this field. +-- @param string MissionBriefing is a string indicating the mission briefing to be shown when a player joins a @{CLIENT}. +-- @param string MissionCoalition is a string indicating the coalition or party to which this mission belongs to. It is free format and can be chosen freely by the mission designer. Note that this field is not to be confused with the coalition concept of the ME. Examples of a Mission Coalition could be "NATO", "CCCP", "Intruders", "Terrorists"... +-- @return MISSION +-- @usage +-- -- Declare a few missions. +-- local Mission = MISSIONSCHEDULER.AddMission( 'Russia Transport Troops SA-6', 'Operational', 'Transport troops from the control center to one of the SA-6 SAM sites to activate their operation.', 'Russia' ) +-- local Mission = MISSIONSCHEDULER.AddMission( 'Patriots', 'Primary', 'Our intelligence reports that 3 Patriot SAM defense batteries are located near Ruisi, Kvarhiti and Gori.', 'Russia' ) +-- local Mission = MISSIONSCHEDULER.AddMission( 'Package Delivery', 'Operational', 'In order to be in full control of the situation, we need you to deliver a very important package at a secret location. Fly undetected through the NATO defenses and deliver the secret package. The secret agent is located at waypoint 4.', 'Russia' ) +-- local Mission = MISSIONSCHEDULER.AddMission( 'Rescue General', 'Tactical', 'Our intelligence has received a remote signal behind Gori. We believe it is a very important Russian General that was captured by Georgia. Go out there and rescue him! Ensure you stay out of the battle zone, keep south. Waypoint 4 is the location of our Russian General.', 'Russia' ) +-- local Mission = MISSIONSCHEDULER.AddMission( 'NATO Transport Troops', 'Operational', 'Transport 3 groups of air defense engineers from our barracks "Gold" and "Titan" to each patriot battery control center to activate our air defenses.', 'NATO' ) +-- local Mission = MISSIONSCHEDULER.AddMission( 'SA-6 SAMs', 'Primary', 'Our intelligence reports that 3 SA-6 SAM defense batteries are located near Didmukha, Khetagurov and Berula. Eliminate the Russian SAMs.', 'NATO' ) +-- local Mission = MISSIONSCHEDULER.AddMission( 'NATO Sling Load', 'Operational', 'Fly to the cargo pickup zone at Dzegvi or Kaspi, and sling the cargo to Soganlug airbase.', 'NATO' ) +-- local Mission = MISSIONSCHEDULER.AddMission( 'Rescue secret agent', 'Tactical', 'In order to be in full control of the situation, we need you to rescue a secret agent from the woods behind enemy lines. Avoid the Russian defenses and rescue the agent. Keep south until Khasuri, and keep your eyes open for any SAM presence. The agent is located at waypoint 4 on your kneeboard.', 'NATO' ) +function MISSION:New( MissionName, MissionPriority, MissionBriefing, MissionCoalition ) + + self = MISSION:Meta() + self:T({ MissionName, MissionPriority, MissionBriefing, MissionCoalition }) + + local Valid = true + + Valid = routines.ValidateString( MissionName, "MissionName", Valid ) + Valid = routines.ValidateString( MissionPriority, "MissionPriority", Valid ) + Valid = routines.ValidateString( MissionBriefing, "MissionBriefing", Valid ) + Valid = routines.ValidateString( MissionCoalition, "MissionCoalition", Valid ) + + if Valid then + self.Name = MissionName + self.MissionPriority = MissionPriority + self.MissionBriefing = MissionBriefing + self.MissionCoalition = MissionCoalition + end + + return self +end + +--- Returns if a Mission has completed. +-- @return bool +function MISSION:IsCompleted() + self:F() + return self.MissionStatus == "ACCOMPLISHED" +end + +--- Set a Mission to completed. +function MISSION:Completed() + self:F() + self.MissionStatus = "ACCOMPLISHED" + self:StatusToClients() +end + +--- Returns if a Mission is ongoing. +-- treturn bool +function MISSION:IsOngoing() + self:F() + return self.MissionStatus == "ONGOING" +end + +--- Set a Mission to ongoing. +function MISSION:Ongoing() + self:F() + self.MissionStatus = "ONGOING" + --self:StatusToClients() +end + +--- Returns if a Mission is pending. +-- treturn bool +function MISSION:IsPending() + self:F() + return self.MissionStatus == "PENDING" +end + +--- Set a Mission to pending. +function MISSION:Pending() + self:F() + self.MissionStatus = "PENDING" + self:StatusToClients() +end + +--- Returns if a Mission has failed. +-- treturn bool +function MISSION:IsFailed() + self:F() + return self.MissionStatus == "FAILED" +end + +--- Set a Mission to failed. +function MISSION:Failed() + self:F() + self.MissionStatus = "FAILED" + self:StatusToClients() +end + +--- Send the status of the MISSION to all Clients. +function MISSION:StatusToClients() + self:F() + if self.MissionReportFlash then + for ClientID, Client in pairs( self._Clients ) do + Client:Message( self.MissionCoalition .. ' "' .. self.Name .. '": ' .. self.MissionStatus .. '! ( ' .. self.MissionPriority .. ' mission ) ', 10, self.Name .. '/Status', "Mission Command: Mission Status") + end + end +end + +--- Handles the reporting. After certain time intervals, a MISSION report MESSAGE will be shown to All Players. +function MISSION:ReportTrigger() + self:F() + + if self.MissionReportShow == true then + self.MissionReportShow = false + return true + else + if self.MissionReportFlash == true then + if timer.getTime() >= self.MissionReportTrigger then + self.MissionReportTrigger = timer.getTime() + self.MissionTimeInterval + return true + else + return false + end + else + return false + end + end +end + +--- Report the status of all MISSIONs to all active Clients. +function MISSION:ReportToAll() + self:F() + + local AlivePlayers = '' + for ClientID, Client in pairs( self._Clients ) do + if Client:GetDCSGroup() then + if Client:GetClientGroupDCSUnit() then + if Client:GetClientGroupDCSUnit():getLife() > 0.0 then + if AlivePlayers == '' then + AlivePlayers = ' Players: ' .. Client:GetClientGroupDCSUnit():getPlayerName() + else + AlivePlayers = AlivePlayers .. ' / ' .. Client:GetClientGroupDCSUnit():getPlayerName() + end + end + end + end + end + local Tasks = self:GetTasks() + local TaskText = "" + for TaskID, TaskData in pairs( Tasks ) do + TaskText = TaskText .. " - Task " .. TaskID .. ": " .. TaskData.Name .. ": " .. TaskData:GetGoalProgress() .. "\n" + end + MESSAGE:New( self.MissionCoalition .. ' "' .. self.Name .. '": ' .. self.MissionStatus .. ' ( ' .. self.MissionPriority .. ' mission )' .. AlivePlayers .. "\n" .. TaskText:gsub("\n$",""), "Mission Command: Mission Report", 10, self.Name .. '/Status'):ToAll() +end + + +--- Add a goal function to a MISSION. Goal functions are called when a @{TASK} within a mission has been completed. +-- @param function GoalFunction is the function defined by the mission designer to evaluate whether a certain goal has been reached after a @{TASK} finishes within the @{MISSION}. A GoalFunction must accept 2 parameters: Mission, Client, which contains the current MISSION object and the current CLIENT object respectively. +-- @usage +-- PatriotActivation = { +-- { "US SAM Patriot Zerti", false }, +-- { "US SAM Patriot Zegduleti", false }, +-- { "US SAM Patriot Gvleti", false } +-- } +-- +-- function DeployPatriotTroopsGoal( Mission, Client ) +-- +-- +-- -- Check if the cargo is all deployed for mission success. +-- for CargoID, CargoData in pairs( Mission._Cargos ) do +-- if Group.getByName( CargoData.CargoGroupName ) then +-- CargoGroup = Group.getByName( CargoData.CargoGroupName ) +-- if CargoGroup then +-- -- Check if the cargo is ready to activate +-- CurrentLandingZoneID = routines.IsUnitInZones( CargoGroup:getUnits()[1], Mission:GetTask( 2 ).LandingZones ) -- The second task is the Deploytask to measure mission success upon +-- if CurrentLandingZoneID then +-- if PatriotActivation[CurrentLandingZoneID][2] == false then +-- -- Now check if this is a new Mission Task to be completed... +-- trigger.action.setGroupAIOn( Group.getByName( PatriotActivation[CurrentLandingZoneID][1] ) ) +-- PatriotActivation[CurrentLandingZoneID][2] = true +-- MessageToBlue( "Mission Command: Message to all airborne units! The " .. PatriotActivation[CurrentLandingZoneID][1] .. " is armed. Our air defenses are now stronger.", 60, "BLUE/PatriotDefense" ) +-- MessageToRed( "Mission Command: Our satellite systems are detecting additional NATO air defenses. To all airborne units: Take care!!!", 60, "RED/PatriotDefense" ) +-- Mission:GetTask( 2 ):AddGoalCompletion( "Patriots activated", PatriotActivation[CurrentLandingZoneID][1], 1 ) -- Register Patriot activation as part of mission goal. +-- end +-- end +-- end +-- end +-- end +-- end +-- +-- local Mission = MISSIONSCHEDULER.AddMission( 'NATO Transport Troops', 'Operational', 'Transport 3 groups of air defense engineers from our barracks "Gold" and "Titan" to each patriot battery control center to activate our air defenses.', 'NATO' ) +-- Mission:AddGoalFunction( DeployPatriotTroopsGoal ) +function MISSION:AddGoalFunction( GoalFunction ) + self:F() + self.GoalFunction = GoalFunction +end + +--- Register a new @{CLIENT} to participate within the mission. +-- @param CLIENT Client is the @{CLIENT} object. The object must have been instantiated with @{CLIENT:New}. +-- @return CLIENT +-- @usage +-- Add a number of Client objects to the Mission. +-- Mission:AddClient( CLIENT:FindByName( 'US UH-1H*HOT-Deploy Troops 1', 'Transport 3 groups of air defense engineers from our barracks "Gold" and "Titan" to each patriot battery control center to activate our air defenses.' ):Transport() ) +-- Mission:AddClient( CLIENT:FindByName( 'US UH-1H*RAMP-Deploy Troops 3', 'Transport 3 groups of air defense engineers from our barracks "Gold" and "Titan" to each patriot battery control center to activate our air defenses.' ):Transport() ) +-- Mission:AddClient( CLIENT:FindByName( 'US UH-1H*HOT-Deploy Troops 2', 'Transport 3 groups of air defense engineers from our barracks "Gold" and "Titan" to each patriot battery control center to activate our air defenses.' ):Transport() ) +-- Mission:AddClient( CLIENT:FindByName( 'US UH-1H*RAMP-Deploy Troops 4', 'Transport 3 groups of air defense engineers from our barracks "Gold" and "Titan" to each patriot battery control center to activate our air defenses.' ):Transport() ) +function MISSION:AddClient( Client ) + self:F( { Client } ) + + local Valid = true + + if Valid then + self._Clients[Client.ClientName] = Client + end + + return Client +end + +--- Find a @{CLIENT} object within the @{MISSION} by its ClientName. +-- @param CLIENT ClientName is a string defining the Client Group as defined within the ME. +-- @return CLIENT +-- @usage +-- -- Seach for Client "Bomber" within the Mission. +-- local BomberClient = Mission:FindClient( "Bomber" ) +function MISSION:FindClient( ClientName ) + self:F( { self._Clients[ClientName] } ) + return self._Clients[ClientName] +end + + +--- Register a @{TASK} to be completed within the @{MISSION}. Note that there can be multiple @{TASK}s registered to be completed. Each TASK can be set a certain Goal. The MISSION will not be completed until all Goals are reached. +-- @param TASK Task is the @{TASK} object. The object must have been instantiated with @{TASK:New} or any of its inherited @{TASK}s. +-- @param number TaskNumber is the sequence number of the TASK within the MISSION. This number does have to be chronological. +-- @return TASK +-- @usage +-- -- Define a few tasks for the Mission. +-- PickupZones = { "NATO Gold Pickup Zone", "NATO Titan Pickup Zone" } +-- PickupSignalUnits = { "NATO Gold Coordination Center", "NATO Titan Coordination Center" } +-- +-- -- Assign the Pickup Task +-- local PickupTask = PICKUPTASK:New( PickupZones, CARGO_TYPE.ENGINEERS, CLIENT.ONBOARDSIDE.LEFT ) +-- PickupTask:AddSmokeBlue( PickupSignalUnits ) +-- PickupTask:SetGoalTotal( 3 ) +-- Mission:AddTask( PickupTask, 1 ) +-- +-- -- Assign the Deploy Task +-- local PatriotActivationZones = { "US Patriot Battery 1 Activation", "US Patriot Battery 2 Activation", "US Patriot Battery 3 Activation" } +-- local PatriotActivationZonesSmokeUnits = { "US SAM Patriot - Battery 1 Control", "US SAM Patriot - Battery 2 Control", "US SAM Patriot - Battery 3 Control" } +-- local DeployTask = DEPLOYTASK:New( PatriotActivationZones, CARGO_TYPE.ENGINEERS ) +-- --DeployTask:SetCargoTargetZoneName( 'US Troops Attack ' .. math.random(2) ) +-- DeployTask:AddSmokeBlue( PatriotActivationZonesSmokeUnits ) +-- DeployTask:SetGoalTotal( 3 ) +-- DeployTask:SetGoalTotal( 3, "Patriots activated" ) +-- Mission:AddTask( DeployTask, 2 ) + +function MISSION:AddTask( Task, TaskNumber ) + self:F() + + self._Tasks[TaskNumber] = Task + self._Tasks[TaskNumber]:EnableEvents() + self._Tasks[TaskNumber].ID = TaskNumber + + return Task + end + +--- Get the TASK idenified by the TaskNumber from the Mission. This function is useful in GoalFunctions. +-- @param number TaskNumber is the number of the @{TASK} within the @{MISSION}. +-- @return TASK +-- @usage +-- -- Get Task 2 from the Mission. +-- Task2 = Mission:GetTask( 2 ) + +function MISSION:GetTask( TaskNumber ) + self:F() + + local Valid = true + + local Task = nil + + if type(TaskNumber) ~= "number" then + Valid = false + end + + if Valid then + Task = self._Tasks[TaskNumber] + end + + return Task +end + +--- Get all the TASKs from the Mission. This function is useful in GoalFunctions. +-- @return {TASK,...} Structure of TASKS with the @{TASK} number as the key. +-- @usage +-- -- Get Tasks from the Mission. +-- Tasks = Mission:GetTasks() +-- env.info( "Task 2 Completion = " .. Tasks[2]:GetGoalPercentage() .. "%" ) +function MISSION:GetTasks() + self:F() + + return self._Tasks +end + + +--[[ + _TransportExecuteStage: Defines the different stages of Transport unload/load execution. This table is internal and is used to control the validity of Transport load/unload timing. + + - _TransportExecuteStage.EXECUTING + - _TransportExecuteStage.SUCCESS + - _TransportExecuteStage.FAILED + +--]] +_TransportExecuteStage = { + NONE = 0, + EXECUTING = 1, + SUCCESS = 2, + FAILED = 3 +} + + +--- The MISSIONSCHEDULER is an OBJECT and is the main scheduler of ALL active MISSIONs registered within this scheduler. It's workings are considered internal and is automatically created when the Mission.lua file is included. +-- @type MISSIONSCHEDULER +-- @field #MISSIONSCHEDULER.MISSIONS Missions +MISSIONSCHEDULER = { + Missions = {}, + MissionCount = 0, + TimeIntervalCount = 0, + TimeIntervalShow = 150, + TimeSeconds = 14400, + TimeShow = 5 +} + +--- @type MISSIONSCHEDULER.MISSIONS +-- @list <#MISSION> Mission + +--- This is the main MISSIONSCHEDULER Scheduler function. It is considered internal and is automatically created when the Mission.lua file is included. +function MISSIONSCHEDULER.Scheduler() + + + -- loop through the missions in the TransportTasks + for MissionName, MissionData in pairs( MISSIONSCHEDULER.Missions ) do + + local Mission = MissionData -- #MISSION + + if not Mission:IsCompleted() then + + -- This flag will monitor if for this mission, there are clients alive. If this flag is still false at the end of the loop, the mission status will be set to Pending (if not Failed or Completed). + local ClientsAlive = false + + for ClientID, ClientData in pairs( Mission._Clients ) do + + local Client = ClientData -- Client#CLIENT + + if Client:IsAlive() then + + -- There is at least one Client that is alive... So the Mission status is set to Ongoing. + ClientsAlive = true + + -- If this Client was not registered as Alive before: + -- 1. We register the Client as Alive. + -- 2. We initialize the Client Tasks and make a link to the original Mission Task. + -- 3. We initialize the Cargos. + -- 4. We flag the Mission as Ongoing. + if not Client.ClientAlive then + Client.ClientAlive = true + Client.ClientBriefingShown = false + for TaskNumber, Task in pairs( Mission._Tasks ) do + -- Note that this a deepCopy. Each client must have their own Tasks with own Stages!!! + Client._Tasks[TaskNumber] = routines.utils.deepCopy( Mission._Tasks[TaskNumber] ) + -- Each MissionTask must point to the original Mission. + Client._Tasks[TaskNumber].MissionTask = Mission._Tasks[TaskNumber] + Client._Tasks[TaskNumber].Cargos = Mission._Tasks[TaskNumber].Cargos + Client._Tasks[TaskNumber].LandingZones = Mission._Tasks[TaskNumber].LandingZones + end + + Mission:Ongoing() + end + + + -- For each Client, check for each Task the state and evolve the mission. + -- This flag will indicate if the Task of the Client is Complete. + local TaskComplete = false + + for TaskNumber, Task in pairs( Client._Tasks ) do + + if not Task.Stage then + Task:SetStage( 1 ) + end + + + local TransportTime = timer.getTime() + + if not Task:IsDone() then + + if Task:Goal() then + Task:ShowGoalProgress( Mission, Client ) + end + + --env.info( 'Scheduler: Mission = ' .. Mission.Name .. ' / Client = ' .. Client.ClientName .. ' / Task = ' .. Task.Name .. ' / Stage = ' .. Task.ActiveStage .. ' - ' .. Task.Stage.Name .. ' - ' .. Task.Stage.StageType ) + + -- Action + if Task:StageExecute() then + Task.Stage:Execute( Mission, Client, Task ) + end + + -- Wait until execution is finished + if Task.ExecuteStage == _TransportExecuteStage.EXECUTING then + Task.Stage:Executing( Mission, Client, Task ) + end + + -- Validate completion or reverse to earlier stage + if Task.Time + Task.Stage.WaitTime <= TransportTime then + Task:SetStage( Task.Stage:Validate( Mission, Client, Task ) ) + end + + if Task:IsDone() then + --env.info( 'Scheduler: Mission '.. Mission.Name .. ' Task ' .. Task.Name .. ' Stage ' .. Task.Stage.Name .. ' done. TaskComplete = ' .. string.format ( "%s", TaskComplete and "true" or "false" ) ) + TaskComplete = true -- when a task is not yet completed, a mission cannot be completed + + else + -- break only if this task is not yet done, so that future task are not yet activated. + TaskComplete = false -- when a task is not yet completed, a mission cannot be completed + --env.info( 'Scheduler: Mission "'.. Mission.Name .. '" Task "' .. Task.Name .. '" Stage "' .. Task.Stage.Name .. '" break. TaskComplete = ' .. string.format ( "%s", TaskComplete and "true" or "false" ) ) + break + end + + if TaskComplete then + + if Mission.GoalFunction ~= nil then + Mission.GoalFunction( Mission, Client ) + end + if MISSIONSCHEDULER.Scoring then + MISSIONSCHEDULER.Scoring:_AddMissionTaskScore( Client:GetClientGroupDCSUnit(), Mission.Name, 25 ) + end + +-- if not Mission:IsCompleted() then +-- end + end + end + end + + local MissionComplete = true + for TaskNumber, Task in pairs( Mission._Tasks ) do + if Task:Goal() then +-- Task:ShowGoalProgress( Mission, Client ) + if Task:IsGoalReached() then + else + MissionComplete = false + end + else + MissionComplete = false -- If there is no goal, the mission should never be ended. The goal status will be set somewhere else. + end + end + + if MissionComplete then + Mission:Completed() + if MISSIONSCHEDULER.Scoring then + MISSIONSCHEDULER.Scoring:_AddMissionScore( Mission.Name, 100 ) + end + else + if TaskComplete then + -- Reset for new tasking of active client + Client.ClientAlive = false -- Reset the client tasks. + end + end + + + else + if Client.ClientAlive then + env.info( 'Scheduler: Client "' .. Client.ClientName .. '" is inactive.' ) + Client.ClientAlive = false + + -- This is tricky. If we sanitize Client._Tasks before sanitizing Client._Tasks[TaskNumber].MissionTask, then the original MissionTask will be sanitized, and will be lost within the garbage collector. + -- So first sanitize Client._Tasks[TaskNumber].MissionTask, after that, sanitize only the whole _Tasks structure... + --Client._Tasks[TaskNumber].MissionTask = nil + --Client._Tasks = nil + end + end + end + + -- If all Clients of this Mission are not activated, then the Mission status needs to be put back into Pending status. + -- But only if the Mission was Ongoing. In case the Mission is Completed or Failed, the Mission status may not be changed. In these cases, this will be the last run of this Mission in the Scheduler. + if ClientsAlive == false then + if Mission:IsOngoing() then + -- Mission status back to pending... + Mission:Pending() + end + end + end + + Mission:StatusToClients() + + if Mission:ReportTrigger() then + Mission:ReportToAll() + end + end + + return true +end + +--- Start the MISSIONSCHEDULER. +function MISSIONSCHEDULER.Start() + if MISSIONSCHEDULER ~= nil then + --MISSIONSCHEDULER.SchedulerId = routines.scheduleFunction( MISSIONSCHEDULER.Scheduler, { }, 0, 2 ) + MISSIONSCHEDULER.SchedulerId = SCHEDULER:New( nil, MISSIONSCHEDULER.Scheduler, { }, 0, 2 ) + end +end + +--- Stop the MISSIONSCHEDULER. +function MISSIONSCHEDULER.Stop() + if MISSIONSCHEDULER.SchedulerId then + routines.removeFunction(MISSIONSCHEDULER.SchedulerId) + MISSIONSCHEDULER.SchedulerId = nil + end +end + +--- This is the main MISSION declaration method. Each Mission is like the master or a Mission orchestration between, Clients, Tasks, Stages etc. +-- @param Mission is the MISSION object instantiated by @{MISSION:New}. +-- @return MISSION +-- @usage +-- -- Declare a mission. +-- Mission = MISSION:New( 'Russia Transport Troops SA-6', +-- 'Operational', +-- 'Transport troops from the control center to one of the SA-6 SAM sites to activate their operation.', +-- 'Russia' ) +-- MISSIONSCHEDULER:AddMission( Mission ) +function MISSIONSCHEDULER.AddMission( Mission ) + MISSIONSCHEDULER.Missions[Mission.Name] = Mission + MISSIONSCHEDULER.MissionCount = MISSIONSCHEDULER.MissionCount + 1 + -- Add an overall AI Client for the AI tasks... This AI Client will facilitate the Events in the background for each Task. + --MissionAdd:AddClient( CLIENT:Register( 'AI' ) ) + + return Mission +end + +--- Remove a MISSION from the MISSIONSCHEDULER. +-- @param MissionName is the name of the MISSION given at declaration using @{AddMission}. +-- @usage +-- -- Declare a mission. +-- Mission = MISSION:New( 'Russia Transport Troops SA-6', +-- 'Operational', +-- 'Transport troops from the control center to one of the SA-6 SAM sites to activate their operation.', +-- 'Russia' ) +-- MISSIONSCHEDULER:AddMission( Mission ) +-- +-- -- Now remove the Mission. +-- MISSIONSCHEDULER:RemoveMission( 'Russia Transport Troops SA-6' ) +function MISSIONSCHEDULER.RemoveMission( MissionName ) + MISSIONSCHEDULER.Missions[MissionName] = nil + MISSIONSCHEDULER.MissionCount = MISSIONSCHEDULER.MissionCount - 1 +end + +--- Find a MISSION within the MISSIONSCHEDULER. +-- @param MissionName is the name of the MISSION given at declaration using @{AddMission}. +-- @return MISSION +-- @usage +-- -- Declare a mission. +-- Mission = MISSION:New( 'Russia Transport Troops SA-6', +-- 'Operational', +-- 'Transport troops from the control center to one of the SA-6 SAM sites to activate their operation.', +-- 'Russia' ) +-- MISSIONSCHEDULER:AddMission( Mission ) +-- +-- -- Now find the Mission. +-- MissionFind = MISSIONSCHEDULER:FindMission( 'Russia Transport Troops SA-6' ) +function MISSIONSCHEDULER.FindMission( MissionName ) + return MISSIONSCHEDULER.Missions[MissionName] +end + +-- Internal function used by the MISSIONSCHEDULER menu. +function MISSIONSCHEDULER.ReportMissionsShow( ) + for MissionName, Mission in pairs( MISSIONSCHEDULER.Missions ) do + Mission.MissionReportShow = true + Mission.MissionReportFlash = false + end +end + +-- Internal function used by the MISSIONSCHEDULER menu. +function MISSIONSCHEDULER.ReportMissionsFlash( TimeInterval ) + local Count = 0 + for MissionName, Mission in pairs( MISSIONSCHEDULER.Missions ) do + Mission.MissionReportShow = false + Mission.MissionReportFlash = true + Mission.MissionReportTrigger = timer.getTime() + Count * TimeInterval + Mission.MissionTimeInterval = MISSIONSCHEDULER.MissionCount * TimeInterval + env.info( "TimeInterval = " .. Mission.MissionTimeInterval ) + Count = Count + 1 + end +end + +-- Internal function used by the MISSIONSCHEDULER menu. +function MISSIONSCHEDULER.ReportMissionsHide( Prm ) + for MissionName, Mission in pairs( MISSIONSCHEDULER.Missions ) do + Mission.MissionReportShow = false + Mission.MissionReportFlash = false + end +end + +--- Enables a MENU option in the communications menu under F10 to control the status of the active missions. +-- This function should be called only once when starting the MISSIONSCHEDULER. +function MISSIONSCHEDULER.ReportMenu() + local ReportMenu = SUBMENU:New( 'Status' ) + local ReportMenuShow = COMMANDMENU:New( 'Show Report Missions', ReportMenu, MISSIONSCHEDULER.ReportMissionsShow, 0 ) + local ReportMenuFlash = COMMANDMENU:New('Flash Report Missions', ReportMenu, MISSIONSCHEDULER.ReportMissionsFlash, 120 ) + local ReportMenuHide = COMMANDMENU:New( 'Hide Report Missions', ReportMenu, MISSIONSCHEDULER.ReportMissionsHide, 0 ) +end + +--- Show the remaining mission time. +function MISSIONSCHEDULER:TimeShow() + self.TimeIntervalCount = self.TimeIntervalCount + 1 + if self.TimeIntervalCount >= self.TimeTriggerShow then + local TimeMsg = string.format("%00d", ( self.TimeSeconds / 60 ) - ( timer.getTime() / 60 )) .. ' minutes left until mission reload.' + MESSAGE:New( TimeMsg, "Mission time", self.TimeShow, '/TimeMsg' ):ToAll() + self.TimeIntervalCount = 0 + end +end + +function MISSIONSCHEDULER:Time( TimeSeconds, TimeIntervalShow, TimeShow ) + + self.TimeIntervalCount = 0 + self.TimeSeconds = TimeSeconds + self.TimeIntervalShow = TimeIntervalShow + self.TimeShow = TimeShow +end + +--- Adds a mission scoring to the game. +function MISSIONSCHEDULER:Scoring( Scoring ) + + self.Scoring = Scoring +end + +--- The CLEANUP class keeps an area clean of crashing or colliding airplanes. It also prevents airplanes from firing within this area. +-- @module CleanUp +-- @author Flightcontrol + +Include.File( "Routines" ) +Include.File( "Base" ) +Include.File( "Mission" ) +Include.File( "Client" ) +Include.File( "Task" ) + +--- The CLEANUP class. +-- @type CLEANUP +-- @extends Base#BASE +CLEANUP = { + ClassName = "CLEANUP", + ZoneNames = {}, + TimeInterval = 300, + CleanUpList = {}, +} + +--- Creates the main object which is handling the cleaning of the debris within the given Zone Names. +-- @param #CLEANUP self +-- @param #table ZoneNames Is a table of zone names where the debris should be cleaned. Also a single string can be passed with one zone name. +-- @param #number TimeInterval The interval in seconds when the clean activity takes place. The default is 300 seconds, thus every 5 minutes. +-- @return #CLEANUP +-- @usage +-- -- Clean these Zones. +-- CleanUpAirports = CLEANUP:New( { 'CLEAN Tbilisi', 'CLEAN Kutaisi' }, 150 ) +-- or +-- CleanUpTbilisi = CLEANUP:New( 'CLEAN Tbilisi', 150 ) +-- CleanUpKutaisi = CLEANUP:New( 'CLEAN Kutaisi', 600 ) +function CLEANUP:New( ZoneNames, TimeInterval ) local self = BASE:Inherit( self, BASE:New() ) + self:F( { ZoneNames, TimeInterval } ) + + if type( ZoneNames ) == 'table' then + self.ZoneNames = ZoneNames + else + self.ZoneNames = { ZoneNames } + end + if TimeInterval then + self.TimeInterval = TimeInterval + end + + _EVENTDISPATCHER:OnBirth( self._OnEventBirth, self ) + + --self.CleanUpScheduler = routines.scheduleFunction( self._CleanUpScheduler, { self }, timer.getTime() + 1, TimeInterval ) + self.CleanUpScheduler = SCHEDULER:New( self, self._CleanUpScheduler, {}, 1, TimeInterval ) + + return self +end + + +--- Destroys a group from the simulator, but checks first if it is still existing! +-- @param #CLEANUP self +-- @param DCSGroup#Group GroupObject The object to be destroyed. +-- @param #string CleanUpGroupName The groupname... +function CLEANUP:_DestroyGroup( GroupObject, CleanUpGroupName ) + self:F( { GroupObject, CleanUpGroupName } ) + + if GroupObject then -- and GroupObject:isExist() then + --MESSAGE:New( "Destroy Group " .. CleanUpGroupName, CleanUpGroupName, 1, CleanUpGroupName ):ToAll() + trigger.action.deactivateGroup(GroupObject) + self:T( { "GroupObject Destroyed", GroupObject } ) + end +end + +--- Destroys a @{DCSUnit#Unit} from the simulator, but checks first if it is still existing! +-- @param #CLEANUP self +-- @param DCSUnit#Unit CleanUpUnit The object to be destroyed. +-- @param #string CleanUpUnitName The Unit name ... +function CLEANUP:_DestroyUnit( CleanUpUnit, CleanUpUnitName ) + self:F( { CleanUpUnit, CleanUpUnitName } ) + + if CleanUpUnit then + --MESSAGE:New( "Destroy " .. CleanUpUnitName, CleanUpUnitName, 1, CleanUpUnitName ):ToAll() + local CleanUpGroup = Unit.getGroup(CleanUpUnit) + -- TODO Client bug in 1.5.3 + if CleanUpGroup and CleanUpGroup:isExist() then + local CleanUpGroupUnits = CleanUpGroup:getUnits() + if #CleanUpGroupUnits == 1 then + local CleanUpGroupName = CleanUpGroup:getName() + --self:CreateEventCrash( timer.getTime(), CleanUpUnit ) + CleanUpGroup:destroy() + self:T( { "Destroyed Group:", CleanUpGroupName } ) + else + CleanUpUnit:destroy() + self:T( { "Destroyed Unit:", CleanUpUnitName } ) + end + self.CleanUpList[CleanUpUnitName] = nil -- Cleaning from the list + CleanUpUnit = nil + end + end +end + +-- TODO check DCSTypes#Weapon +--- Destroys a missile from the simulator, but checks first if it is still existing! +-- @param #CLEANUP self +-- @param DCSTypes#Weapon MissileObject +function CLEANUP:_DestroyMissile( MissileObject ) + self:F( { MissileObject } ) + + if MissileObject and MissileObject:isExist() then + MissileObject:destroy() + self:T( "MissileObject Destroyed") + end +end + +function CLEANUP:_OnEventBirth( Event ) + self:F( { Event } ) + + self.CleanUpList[Event.IniDCSUnitName] = {} + self.CleanUpList[Event.IniDCSUnitName].CleanUpUnit = Event.IniDCSUnit + self.CleanUpList[Event.IniDCSUnitName].CleanUpGroup = Event.IniDCSGroup + self.CleanUpList[Event.IniDCSUnitName].CleanUpGroupName = Event.IniDCSGroupName + self.CleanUpList[Event.IniDCSUnitName].CleanUpUnitName = Event.IniDCSUnitName + + _EVENTDISPATCHER:OnEngineShutDownForUnit( Event.IniDCSUnitName, self._EventAddForCleanUp, self ) + _EVENTDISPATCHER:OnEngineStartUpForUnit( Event.IniDCSUnitName, self._EventAddForCleanUp, self ) + _EVENTDISPATCHER:OnHitForUnit( Event.IniDCSUnitName, self._EventAddForCleanUp, self ) + _EVENTDISPATCHER:OnPilotDeadForUnit( Event.IniDCSUnitName, self._EventCrash, self ) + _EVENTDISPATCHER:OnDeadForUnit( Event.IniDCSUnitName, self._EventCrash, self ) + _EVENTDISPATCHER:OnCrashForUnit( Event.IniDCSUnitName, self._EventCrash, self ) + _EVENTDISPATCHER:OnShotForUnit( Event.IniDCSUnitName, self._EventShot, self ) + + --self:AddEvent( world.event.S_EVENT_ENGINE_SHUTDOWN, self._EventAddForCleanUp ) + --self:AddEvent( world.event.S_EVENT_ENGINE_STARTUP, self._EventAddForCleanUp ) +-- self:AddEvent( world.event.S_EVENT_HIT, self._EventAddForCleanUp ) -- , self._EventHitCleanUp ) +-- self:AddEvent( world.event.S_EVENT_CRASH, self._EventCrash ) -- , self._EventHitCleanUp ) +-- --self:AddEvent( world.event.S_EVENT_DEAD, self._EventCrash ) +-- self:AddEvent( world.event.S_EVENT_SHOT, self._EventShot ) +-- +-- self:EnableEvents() + + +end + +--- Detects if a crash event occurs. +-- Crashed units go into a CleanUpList for removal. +-- @param #CLEANUP self +-- @param DCSTypes#Event event +function CLEANUP:_EventCrash( Event ) + self:F( { Event } ) + + --TODO: This stuff is not working due to a DCS bug. Burning units cannot be destroyed. + --MESSAGE:New( "Crash ", "Crash", 10, "Crash" ):ToAll() + -- self:T("before getGroup") + -- local _grp = Unit.getGroup(event.initiator)-- Identify the group that fired + -- self:T("after getGroup") + -- _grp:destroy() + -- self:T("after deactivateGroup") + -- event.initiator:destroy() + + self.CleanUpList[Event.IniDCSUnitName] = {} + self.CleanUpList[Event.IniDCSUnitName].CleanUpUnit = Event.IniDCSUnit + self.CleanUpList[Event.IniDCSUnitName].CleanUpGroup = Event.IniDCSGroup + self.CleanUpList[Event.IniDCSUnitName].CleanUpGroupName = Event.IniDCSGroupName + self.CleanUpList[Event.IniDCSUnitName].CleanUpUnitName = Event.IniDCSUnitName + +end + +--- Detects if a unit shoots a missile. +-- If this occurs within one of the zones, then the weapon used must be destroyed. +-- @param #CLEANUP self +-- @param DCSTypes#Event event +function CLEANUP:_EventShot( Event ) + self:F( { Event } ) + + -- Test if the missile was fired within one of the CLEANUP.ZoneNames. + local CurrentLandingZoneID = 0 + CurrentLandingZoneID = routines.IsUnitInZones( Event.IniDCSUnit, self.ZoneNames ) + if ( CurrentLandingZoneID ) then + -- Okay, the missile was fired within the CLEANUP.ZoneNames, destroy the fired weapon. + --_SEADmissile:destroy() + --routines.scheduleFunction( CLEANUP._DestroyMissile, { self, Event.Weapon }, timer.getTime() + 0.1) + SCHEDULER:New( self, CLEANUP._DestroyMissile, { Event.Weapon }, 0.1 ) + end +end + + +--- Detects if the Unit has an S_EVENT_HIT within the given ZoneNames. If this is the case, destroy the unit. +-- @param #CLEANUP self +-- @param DCSTypes#Event event +function CLEANUP:_EventHitCleanUp( Event ) + self:F( { Event } ) + + if Event.IniDCSUnit then + if routines.IsUnitInZones( Event.IniDCSUnit, self.ZoneNames ) ~= nil then + self:T( { "Life: ", Event.IniDCSUnitName, ' = ', Event.IniDCSUnit:getLife(), "/", Event.IniDCSUnit:getLife0() } ) + if Event.IniDCSUnit:getLife() < Event.IniDCSUnit:getLife0() then + self:T( "CleanUp: Destroy: " .. Event.IniDCSUnitName ) + --routines.scheduleFunction( CLEANUP._DestroyUnit, { self, Event.IniDCSUnit }, timer.getTime() + 0.1) + SCHEDULER:New( self, CLEANUP._DestroyUnit, { Event.IniDCSUnit }, 0.1 ) + end + end + end + + if Event.TgtDCSUnit then + if routines.IsUnitInZones( Event.TgtDCSUnit, self.ZoneNames ) ~= nil then + self:T( { "Life: ", Event.TgtDCSUnitName, ' = ', Event.TgtDCSUnit:getLife(), "/", Event.TgtDCSUnit:getLife0() } ) + if Event.TgtDCSUnit:getLife() < Event.TgtDCSUnit:getLife0() then + self:T( "CleanUp: Destroy: " .. Event.TgtDCSUnitName ) + --routines.scheduleFunction( CLEANUP._DestroyUnit, { self, Event.TgtDCSUnit }, timer.getTime() + 0.1 ) + SCHEDULER:New( self, CLEANUP._DestroyUnit, { Event.TgtDCSUnit }, 0.1 ) + end + end + end +end + +--- Add the @{DCSUnit#Unit} to the CleanUpList for CleanUp. +function CLEANUP:_AddForCleanUp( CleanUpUnit, CleanUpUnitName ) + self:F( { CleanUpUnit, CleanUpUnitName } ) + + self.CleanUpList[CleanUpUnitName] = {} + self.CleanUpList[CleanUpUnitName].CleanUpUnit = CleanUpUnit + self.CleanUpList[CleanUpUnitName].CleanUpUnitName = CleanUpUnitName + self.CleanUpList[CleanUpUnitName].CleanUpGroup = Unit.getGroup(CleanUpUnit) + self.CleanUpList[CleanUpUnitName].CleanUpGroupName = Unit.getGroup(CleanUpUnit):getName() + self.CleanUpList[CleanUpUnitName].CleanUpTime = timer.getTime() + self.CleanUpList[CleanUpUnitName].CleanUpMoved = false + + self:T( { "CleanUp: Add to CleanUpList: ", Unit.getGroup(CleanUpUnit):getName(), CleanUpUnitName } ) + +end + +--- Detects if the Unit has an S_EVENT_ENGINE_SHUTDOWN or an S_EVENT_HIT within the given ZoneNames. If this is the case, add the Group to the CLEANUP List. +-- @param #CLEANUP self +-- @param DCSTypes#Event event +function CLEANUP:_EventAddForCleanUp( Event ) + + if Event.IniDCSUnit then + if self.CleanUpList[Event.IniDCSUnitName] == nil then + if routines.IsUnitInZones( Event.IniDCSUnit, self.ZoneNames ) ~= nil then + self:_AddForCleanUp( Event.IniDCSUnit, Event.IniDCSUnitName ) + end + end + end + + if Event.TgtDCSUnit then + if self.CleanUpList[Event.TgtDCSUnitName] == nil then + if routines.IsUnitInZones( Event.TgtDCSUnit, self.ZoneNames ) ~= nil then + self:_AddForCleanUp( Event.TgtDCSUnit, Event.TgtDCSUnitName ) + end + end + end + +end + +local CleanUpSurfaceTypeText = { + "LAND", + "SHALLOW_WATER", + "WATER", + "ROAD", + "RUNWAY" + } + +--- At the defined time interval, CleanUp the Groups within the CleanUpList. +-- @param #CLEANUP self +function CLEANUP:_CleanUpScheduler() + self:F( { "CleanUp Scheduler" } ) + + local CleanUpCount = 0 + for CleanUpUnitName, UnitData in pairs( self.CleanUpList ) do + CleanUpCount = CleanUpCount + 1 + + self:T( { CleanUpUnitName, UnitData } ) + local CleanUpUnit = Unit.getByName(UnitData.CleanUpUnitName) + local CleanUpGroupName = UnitData.CleanUpGroupName + local CleanUpUnitName = UnitData.CleanUpUnitName + if CleanUpUnit then + self:T( { "CleanUp Scheduler", "Checking:", CleanUpUnitName } ) + if _DATABASE:GetStatusGroup( CleanUpGroupName ) ~= "ReSpawn" then + local CleanUpUnitVec3 = CleanUpUnit:getPoint() + --self:T( CleanUpUnitVec3 ) + local CleanUpUnitVec2 = {} + CleanUpUnitVec2.x = CleanUpUnitVec3.x + CleanUpUnitVec2.y = CleanUpUnitVec3.z + --self:T( CleanUpUnitVec2 ) + local CleanUpSurfaceType = land.getSurfaceType(CleanUpUnitVec2) + --self:T( CleanUpSurfaceType ) + --MESSAGE:New( "Surface " .. CleanUpUnitName .. " = " .. CleanUpSurfaceTypeText[CleanUpSurfaceType], CleanUpUnitName, 10, CleanUpUnitName ):ToAll() + + if CleanUpUnit and CleanUpUnit:getLife() <= CleanUpUnit:getLife0() * 0.95 then + if CleanUpSurfaceType == land.SurfaceType.RUNWAY then + if CleanUpUnit:inAir() then + local CleanUpLandHeight = land.getHeight(CleanUpUnitVec2) + local CleanUpUnitHeight = CleanUpUnitVec3.y - CleanUpLandHeight + self:T( { "CleanUp Scheduler", "Height = " .. CleanUpUnitHeight } ) + if CleanUpUnitHeight < 30 then + self:T( { "CleanUp Scheduler", "Destroy " .. CleanUpUnitName .. " because below safe height and damaged." } ) + self:_DestroyUnit(CleanUpUnit, CleanUpUnitName) + end + else + self:T( { "CleanUp Scheduler", "Destroy " .. CleanUpUnitName .. " because on runway and damaged." } ) + self:_DestroyUnit(CleanUpUnit, CleanUpUnitName) + end + end + end + -- Clean Units which are waiting for a very long time in the CleanUpZone. + if CleanUpUnit then + local CleanUpUnitVelocity = CleanUpUnit:getVelocity() + local CleanUpUnitVelocityTotal = math.abs(CleanUpUnitVelocity.x) + math.abs(CleanUpUnitVelocity.y) + math.abs(CleanUpUnitVelocity.z) + if CleanUpUnitVelocityTotal < 1 then + if UnitData.CleanUpMoved then + if UnitData.CleanUpTime + 180 <= timer.getTime() then + self:T( { "CleanUp Scheduler", "Destroy due to not moving anymore " .. CleanUpUnitName } ) + self:_DestroyUnit(CleanUpUnit, CleanUpUnitName) + end + end + else + UnitData.CleanUpTime = timer.getTime() + UnitData.CleanUpMoved = true + --MESSAGE:New( "Moved " .. CleanUpUnitName, CleanUpUnitName, 10, CleanUpUnitName ):ToAll() + end + end + + else + -- Do nothing ... + self.CleanUpList[CleanUpUnitName] = nil -- Not anymore in the DCSRTE + end + else + self:T( "CleanUp: Group " .. CleanUpUnitName .. " cannot be found in DCS RTE, removing ..." ) + self.CleanUpList[CleanUpUnitName] = nil -- Not anymore in the DCSRTE + end + end + self:T(CleanUpCount) + + return true +end + +--- This module contains the SPAWN class. +-- +-- 1) @{Spawn#SPAWN} class, extends @{Base#BASE} +-- ============================================= +-- The @{#SPAWN} class allows to spawn dynamically new groups, based on pre-defined initialization settings, modifying the behaviour when groups are spawned. +-- For each group to be spawned, within the mission editor, a group has to be created with the "late activation flag" set. We call this group the *"Spawn Template"* of the SPAWN object. +-- A reference to this Spawn Template needs to be provided when constructing the SPAWN object, by indicating the name of the group within the mission editor in the constructor methods. +-- +-- Within the SPAWN object, there is an internal index that keeps track of which group from the internal group list was spawned. +-- When new groups get spawned by using the SPAWN functions (see below), it will be validated whether the Limits (@{#SPAWN.Limit}) of the SPAWN object are not reached. +-- When all is valid, a new group will be created by the spawning methods, and the internal index will be increased with 1. +-- +-- Regarding the name of new spawned groups, a _SpawnPrefix_ will be assigned for each new group created. +-- If you want to have the Spawn Template name to be used as the _SpawnPrefix_ name, use the @{#SPAWN.New} constructor. +-- However, when the @{#SPAWN.NewWithAlias} constructor was used, the Alias name will define the _SpawnPrefix_ name. +-- Groups will follow the following naming structure when spawned at run-time: +-- +-- 1. Spawned groups will have the name _SpawnPrefix_#ggg, where ggg is a counter from 0 to 999. +-- 2. Spawned units will have the name _SpawnPrefix_#ggg-uu, where uu is a counter from 0 to 99 for each new spawned unit belonging to the group. +-- +-- Some additional notes that need to be remembered: +-- +-- * Templates are actually groups defined within the mission editor, with the flag "Late Activation" set. As such, these groups are never used within the mission, but are used by the @{#SPAWN} module. +-- * It is important to defined BEFORE you spawn new groups, a proper initialization of the SPAWN instance is done with the options you want to use. +-- * When designing a mission, NEVER name groups using a "#" within the name of the group Spawn Template(s), or the SPAWN module logic won't work anymore. +-- +-- 1.1) SPAWN construction methods +-- ------------------------------- +-- Create a new SPAWN object with the @{#SPAWN.New} or the @{#SPAWN.NewWithAlias} methods: +-- +-- * @{#SPAWN.New}: Creates a new SPAWN object taking the name of the group that functions as the Template. +-- +-- It is important to understand how the SPAWN class works internally. The SPAWN object created will contain internally a list of groups that will be spawned and that are already spawned. +-- The initialization functions will modify this list of groups so that when a group gets spawned, ALL information is already prepared when spawning. This is done for performance reasons. +-- So in principle, the group list will contain all parameters and configurations after initialization, and when groups get actually spawned, this spawning can be done quickly and efficient. +-- +-- 1.2) SPAWN initialization methods +-- --------------------------------- +-- A spawn object will behave differently based on the usage of initialization methods: +-- +-- * @{#SPAWN.Limit}: Limits the amount of groups that can be alive at the same time and that can be dynamically spawned. +-- * @{#SPAWN.RandomizeRoute}: Randomize the routes of spawned groups. +-- * @{#SPAWN.RandomizeTemplate}: Randomize the group templates so that when a new group is spawned, a random group template is selected from one of the templates defined. +-- * @{#SPAWN.Uncontrolled}: Spawn plane groups uncontrolled. +-- * @{#SPAWN.Array}: Make groups visible before they are actually activated, and order these groups like a batallion in an array. +-- * @{#SPAWN.InitRepeat}: Re-spawn groups when they land at the home base. Similar functions are @{#SPAWN.InitRepeatOnLanding} and @{#SPAWN.InitRepeatOnEngineShutDown}. +-- +-- 1.3) SPAWN spawning methods +-- --------------------------- +-- Groups can be spawned at different times and methods: +-- +-- * @{#SPAWN.Spawn}: Spawn one new group based on the last spawned index. +-- * @{#SPAWN.ReSpawn}: Re-spawn a group based on a given index. +-- * @{#SPAWN.SpawnScheduled}: Spawn groups at scheduled but randomized intervals. You can use @{#SPAWN.SpawnScheduleStart} and @{#SPAWN.SpawnScheduleStop} to start and stop the schedule respectively. +-- * @{#SPAWN.SpawnFromUnit}: Spawn a new group taking the position of a @{UNIT}. +-- * @{#SPAWN.SpawnInZone}: Spawn a new group in a @{ZONE}. +-- +-- Note that @{#SPAWN.Spawn} and @{#SPAWN.ReSpawn} return a @{GROUP#GROUP.New} object, that contains a reference to the DCSGroup object. +-- You can use the @{GROUP} object to do further actions with the DCSGroup. +-- +-- 1.4) SPAWN object cleaning +-- -------------------------- +-- Sometimes, it will occur during a mission run-time, that ground or especially air objects get damaged, and will while being damged stop their activities, while remaining alive. +-- In such cases, the SPAWN object will just sit there and wait until that group gets destroyed, but most of the time it won't, +-- and it may occur that no new groups are or can be spawned as limits are reached. +-- To prevent this, a @{#SPAWN.CleanUp} initialization method has been defined that will silently monitor the status of each spawned group. +-- Once a group has a velocity = 0, and has been waiting for a defined interval, that group will be cleaned or removed from run-time. +-- There is a catch however :-) If a damaged group has returned to an airbase within the coalition, that group will not be considered as "lost"... +-- In such a case, when the inactive group is cleaned, a new group will Re-spawned automatically. +-- This models AI that has succesfully returned to their airbase, to restart their combat activities. +-- Check the @{#SPAWN.CleanUp} for further info. +-- +-- +-- @module Spawn +-- @author FlightControl + +Include.File( "Routines" ) +Include.File( "Base" ) +Include.File( "Database" ) +Include.File( "Group" ) +Include.File( "Zone" ) +Include.File( "Event" ) +Include.File( "Scheduler" ) + +--- SPAWN Class +-- @type SPAWN +-- @extends Base#BASE +-- @field ClassName +-- @field #string SpawnTemplatePrefix +-- @field #string SpawnAliasPrefix +SPAWN = { + ClassName = "SPAWN", + SpawnTemplatePrefix = nil, + SpawnAliasPrefix = nil, +} + + + +--- Creates the main object to spawn a GROUP defined in the DCS ME. +-- @param #SPAWN self +-- @param #string SpawnTemplatePrefix is the name of the Group in the ME that defines the Template. Each new group will have the name starting with SpawnTemplatePrefix. +-- @return #SPAWN +-- @usage +-- -- NATO helicopters engaging in the battle field. +-- Spawn_BE_KA50 = SPAWN:New( 'BE KA-50@RAMP-Ground Defense' ) +-- @usage local Plane = SPAWN:New( "Plane" ) -- Creates a new local variable that can initiate new planes with the name "Plane#ddd" using the template "Plane" as defined within the ME. +function SPAWN:New( SpawnTemplatePrefix ) + local self = BASE:Inherit( self, BASE:New() ) + self:F( { SpawnTemplatePrefix } ) + + local TemplateGroup = Group.getByName( SpawnTemplatePrefix ) + if TemplateGroup then + self.SpawnTemplatePrefix = SpawnTemplatePrefix + self.SpawnIndex = 0 + self.SpawnCount = 0 -- The internal counter of the amount of spawning the has happened since SpawnStart. + self.AliveUnits = 0 -- Contains the counter how many units are currently alive + self.SpawnIsScheduled = false -- Reflects if the spawning for this SpawnTemplatePrefix is going to be scheduled or not. + self.SpawnTemplate = self._GetTemplate( self, SpawnTemplatePrefix ) -- Contains the template structure for a Group Spawn from the Mission Editor. Note that this group must have lateActivation always on!!! + self.Repeat = false -- Don't repeat the group from Take-Off till Landing and back Take-Off by ReSpawning. + self.UnControlled = false -- When working in UnControlled mode, all planes are Spawned in UnControlled mode before the scheduler starts. + self.SpawnMaxUnitsAlive = 0 -- The maximum amount of groups that can be alive of SpawnTemplatePrefix at the same time. + self.SpawnMaxGroups = 0 -- The maximum amount of groups that can be spawned. + self.SpawnRandomize = false -- Sets the randomization flag of new Spawned units to false. + self.SpawnVisible = false -- Flag that indicates if all the Groups of the SpawnGroup need to be visible when Spawned. + + self.SpawnGroups = {} -- Array containing the descriptions of each Group to be Spawned. + else + error( "SPAWN:New: There is no group declared in the mission editor with SpawnTemplatePrefix = '" .. SpawnTemplatePrefix .. "'" ) + end + + return self +end + +--- Creates a new SPAWN instance to create new groups based on the defined template and using a new alias for each new group. +-- @param #SPAWN self +-- @param #string SpawnTemplatePrefix is the name of the Group in the ME that defines the Template. +-- @param #string SpawnAliasPrefix is the name that will be given to the Group at runtime. +-- @return #SPAWN +-- @usage +-- -- NATO helicopters engaging in the battle field. +-- Spawn_BE_KA50 = SPAWN:NewWithAlias( 'BE KA-50@RAMP-Ground Defense', 'Helicopter Attacking a City' ) +-- @usage local PlaneWithAlias = SPAWN:NewWithAlias( "Plane", "Bomber" ) -- Creates a new local variable that can instantiate new planes with the name "Bomber#ddd" using the template "Plane" as defined within the ME. +function SPAWN:NewWithAlias( SpawnTemplatePrefix, SpawnAliasPrefix ) + local self = BASE:Inherit( self, BASE:New() ) + self:F( { SpawnTemplatePrefix, SpawnAliasPrefix } ) + + local TemplateGroup = Group.getByName( SpawnTemplatePrefix ) + if TemplateGroup then + self.SpawnTemplatePrefix = SpawnTemplatePrefix + self.SpawnAliasPrefix = SpawnAliasPrefix + self.SpawnIndex = 0 + self.SpawnCount = 0 -- The internal counter of the amount of spawning the has happened since SpawnStart. + self.AliveUnits = 0 -- Contains the counter how many units are currently alive + self.SpawnIsScheduled = false -- Reflects if the spawning for this SpawnTemplatePrefix is going to be scheduled or not. + self.SpawnTemplate = self._GetTemplate( self, SpawnTemplatePrefix ) -- Contains the template structure for a Group Spawn from the Mission Editor. Note that this group must have lateActivation always on!!! + self.Repeat = false -- Don't repeat the group from Take-Off till Landing and back Take-Off by ReSpawning. + self.UnControlled = false -- When working in UnControlled mode, all planes are Spawned in UnControlled mode before the scheduler starts. + self.SpawnMaxUnitsAlive = 0 -- The maximum amount of groups that can be alive of SpawnTemplatePrefix at the same time. + self.SpawnMaxGroups = 0 -- The maximum amount of groups that can be spawned. + self.SpawnRandomize = false -- Sets the randomization flag of new Spawned units to false. + self.SpawnVisible = false -- Flag that indicates if all the Groups of the SpawnGroup need to be visible when Spawned. + + self.SpawnGroups = {} -- Array containing the descriptions of each Group to be Spawned. + else + error( "SPAWN:New: There is no group declared in the mission editor with SpawnTemplatePrefix = '" .. SpawnTemplatePrefix .. "'" ) + end + + return self +end + + +--- Limits the Maximum amount of Units that can be alive at the same time, and the maximum amount of groups that can be spawned. +-- Note that this method is exceptionally important to balance the performance of the mission. Depending on the machine etc, a mission can only process a maximum amount of units. +-- If the time interval must be short, but there should not be more Units or Groups alive than a maximum amount of units, then this function should be used... +-- When a @{#SPAWN.New} is executed and the limit of the amount of units alive is reached, then no new spawn will happen of the group, until some of these units of the spawn object will be destroyed. +-- @param #SPAWN self +-- @param #number SpawnMaxUnitsAlive The maximum amount of units that can be alive at runtime. +-- @param #number SpawnMaxGroups The maximum amount of groups that can be spawned. When the limit is reached, then no more actual spawns will happen of the group. +-- This parameter is useful to define a maximum amount of airplanes, ground troops, helicopters, ships etc within a supply area. +-- This parameter accepts the value 0, which defines that there are no maximum group limits, but there are limits on the maximum of units that can be alive at the same time. +-- @return #SPAWN self +-- @usage +-- -- NATO helicopters engaging in the battle field. +-- -- This helicopter group consists of one Unit. So, this group will SPAWN maximum 2 groups simultaneously within the DCSRTE. +-- -- There will be maximum 24 groups spawned during the whole mission lifetime. +-- Spawn_BE_KA50 = SPAWN:New( 'BE KA-50@RAMP-Ground Defense' ):Limit( 2, 24 ) +function SPAWN:Limit( SpawnMaxUnitsAlive, SpawnMaxGroups ) + self:F( { self.SpawnTemplatePrefix, SpawnMaxUnitsAlive, SpawnMaxGroups } ) + + self.SpawnMaxUnitsAlive = SpawnMaxUnitsAlive -- The maximum amount of groups that can be alive of SpawnTemplatePrefix at the same time. + self.SpawnMaxGroups = SpawnMaxGroups -- The maximum amount of groups that can be spawned. + + for SpawnGroupID = 1, self.SpawnMaxGroups do + self:_InitializeSpawnGroups( SpawnGroupID ) + end + + return self +end + + +--- Randomizes the defined route of the SpawnTemplatePrefix group in the ME. This is very useful to define extra variation of the behaviour of groups. +-- @param #SPAWN self +-- @param #number SpawnStartPoint is the waypoint where the randomization begins. +-- Note that the StartPoint = 0 equaling the point where the group is spawned. +-- @param #number SpawnEndPoint is the waypoint where the randomization ends counting backwards. +-- This parameter is useful to avoid randomization to end at a waypoint earlier than the last waypoint on the route. +-- @param #number SpawnRadius is the radius in meters in which the randomization of the new waypoints, with the original waypoint of the original template located in the middle ... +-- @return #SPAWN +-- @usage +-- -- NATO helicopters engaging in the battle field. +-- -- The KA-50 has waypoints Start point ( =0 or SP ), 1, 2, 3, 4, End point (= 5 or DP). +-- -- Waypoints 2 and 3 will only be randomized. The others will remain on their original position with each new spawn of the helicopter. +-- -- The randomization of waypoint 2 and 3 will take place within a radius of 2000 meters. +-- Spawn_BE_KA50 = SPAWN:New( 'BE KA-50@RAMP-Ground Defense' ):RandomizeRoute( 2, 2, 2000 ) +function SPAWN:RandomizeRoute( SpawnStartPoint, SpawnEndPoint, SpawnRadius ) + self:F( { self.SpawnTemplatePrefix, SpawnStartPoint, SpawnEndPoint, SpawnRadius } ) + + self.SpawnRandomizeRoute = true + self.SpawnRandomizeRouteStartPoint = SpawnStartPoint + self.SpawnRandomizeRouteEndPoint = SpawnEndPoint + self.SpawnRandomizeRouteRadius = SpawnRadius + + for GroupID = 1, self.SpawnMaxGroups do + self:_RandomizeRoute( GroupID ) + end + + return self +end + + +--- This function is rather complicated to understand. But I'll try to explain. +-- This function becomes useful when you need to spawn groups with random templates of groups defined within the mission editor, +-- but they will all follow the same Template route and have the same prefix name. +-- In other words, this method randomizes between a defined set of groups the template to be used for each new spawn of a group. +-- @param #SPAWN self +-- @param #string SpawnTemplatePrefixTable A table with the names of the groups defined within the mission editor, from which one will be choosen when a new group will be spawned. +-- @return #SPAWN +-- @usage +-- -- NATO Tank Platoons invading Gori. +-- -- Choose between 13 different 'US Tank Platoon' configurations for each new SPAWN the Group to be spawned for the +-- -- 'US Tank Platoon Left', 'US Tank Platoon Middle' and 'US Tank Platoon Right' SpawnTemplatePrefixes. +-- -- Each new SPAWN will randomize the route, with a defined time interval of 200 seconds with 40% time variation (randomization) and +-- -- with a limit set of maximum 12 Units alive simulteneously and 150 Groups to be spawned during the whole mission. +-- Spawn_US_Platoon = { 'US Tank Platoon 1', 'US Tank Platoon 2', 'US Tank Platoon 3', 'US Tank Platoon 4', 'US Tank Platoon 5', +-- 'US Tank Platoon 6', 'US Tank Platoon 7', 'US Tank Platoon 8', 'US Tank Platoon 9', 'US Tank Platoon 10', +-- 'US Tank Platoon 11', 'US Tank Platoon 12', 'US Tank Platoon 13' } +-- Spawn_US_Platoon_Left = SPAWN:New( 'US Tank Platoon Left' ):Limit( 12, 150 ):Schedule( 200, 0.4 ):RandomizeTemplate( Spawn_US_Platoon ):RandomizeRoute( 3, 3, 2000 ) +-- Spawn_US_Platoon_Middle = SPAWN:New( 'US Tank Platoon Middle' ):Limit( 12, 150 ):Schedule( 200, 0.4 ):RandomizeTemplate( Spawn_US_Platoon ):RandomizeRoute( 3, 3, 2000 ) +-- Spawn_US_Platoon_Right = SPAWN:New( 'US Tank Platoon Right' ):Limit( 12, 150 ):Schedule( 200, 0.4 ):RandomizeTemplate( Spawn_US_Platoon ):RandomizeRoute( 3, 3, 2000 ) +function SPAWN:RandomizeTemplate( SpawnTemplatePrefixTable ) + self:F( { self.SpawnTemplatePrefix, SpawnTemplatePrefixTable } ) + + self.SpawnTemplatePrefixTable = SpawnTemplatePrefixTable + self.SpawnRandomizeTemplate = true + + for SpawnGroupID = 1, self.SpawnMaxGroups do + self:_RandomizeTemplate( SpawnGroupID ) + end + + return self +end + + + + + +--- For planes and helicopters, when these groups go home and land on their home airbases and farps, they normally would taxi to the parking spot, shut-down their engines and wait forever until the Group is removed by the runtime environment. +-- This function is used to re-spawn automatically (so no extra call is needed anymore) the same group after it has landed. +-- This will enable a spawned group to be re-spawned after it lands, until it is destroyed... +-- Note: When the group is respawned, it will re-spawn from the original airbase where it took off. +-- So ensure that the routes for groups that respawn, always return to the original airbase, or players may get confused ... +-- @param #SPAWN self +-- @return #SPAWN self +-- @usage +-- -- RU Su-34 - AI Ship Attack +-- -- Re-SPAWN the Group(s) after each landing and Engine Shut-Down automatically. +-- SpawnRU_SU34 = SPAWN:New( 'TF1 RU Su-34 Krymsk@AI - Attack Ships' ):Schedule( 2, 3, 1800, 0.4 ):SpawnUncontrolled():RandomizeRoute( 1, 1, 3000 ):RepeatOnEngineShutDown() +function SPAWN:InitRepeat() + self:F( { self.SpawnTemplatePrefix, self.SpawnIndex } ) + + self.Repeat = true + self.RepeatOnEngineShutDown = false + self.RepeatOnLanding = true + + return self +end + +--- Respawn group after landing. +-- @param #SPAWN self +-- @return #SPAWN self +function SPAWN:InitRepeatOnLanding() + self:F( { self.SpawnTemplatePrefix } ) + + self:InitRepeat() + self.RepeatOnEngineShutDown = false + self.RepeatOnLanding = true + + return self +end + + +--- Respawn after landing when its engines have shut down. +-- @param #SPAWN self +-- @return #SPAWN self +function SPAWN:InitRepeatOnEngineShutDown() + self:F( { self.SpawnTemplatePrefix } ) + + self:InitRepeat() + self.RepeatOnEngineShutDown = true + self.RepeatOnLanding = false + + return self +end + + +--- CleanUp groups when they are still alive, but inactive. +-- When groups are still alive and have become inactive due to damage and are unable to contribute anything, then this group will be removed at defined intervals in seconds. +-- @param #SPAWN self +-- @param #string SpawnCleanUpInterval The interval to check for inactive groups within seconds. +-- @return #SPAWN self +-- @usage Spawn_Helicopter:CleanUp( 20 ) -- CleanUp the spawning of the helicopters every 20 seconds when they become inactive. +function SPAWN:CleanUp( SpawnCleanUpInterval ) + self:F( { self.SpawnTemplatePrefix, SpawnCleanUpInterval } ) + + self.SpawnCleanUpInterval = SpawnCleanUpInterval + self.SpawnCleanUpTimeStamps = {} + --self.CleanUpFunction = routines.scheduleFunction( self._SpawnCleanUpScheduler, { self }, timer.getTime() + 1, SpawnCleanUpInterval ) + self.CleanUpScheduler = SCHEDULER:New( self, self._SpawnCleanUpScheduler, {}, 1, SpawnCleanUpInterval, 0.2 ) + return self +end + + + +--- Makes the groups visible before start (like a batallion). +-- The method will take the position of the group as the first position in the array. +-- @param #SPAWN self +-- @param #number SpawnAngle The angle in degrees how the groups and each unit of the group will be positioned. +-- @param #number SpawnWidth The amount of Groups that will be positioned on the X axis. +-- @param #number SpawnDeltaX The space between each Group on the X-axis. +-- @param #number SpawnDeltaY The space between each Group on the Y-axis. +-- @return #SPAWN self +-- @usage +-- -- Define an array of Groups. +-- Spawn_BE_Ground = SPAWN:New( 'BE Ground' ):Limit( 2, 24 ):Visible( 90, "Diamond", 10, 100, 50 ) +function SPAWN:Array( SpawnAngle, SpawnWidth, SpawnDeltaX, SpawnDeltaY ) + self:F( { self.SpawnTemplatePrefix, SpawnAngle, SpawnWidth, SpawnDeltaX, SpawnDeltaY } ) + + self.SpawnVisible = true -- When the first Spawn executes, all the Groups need to be made visible before start. + + local SpawnX = 0 + local SpawnY = 0 + local SpawnXIndex = 0 + local SpawnYIndex = 0 + + for SpawnGroupID = 1, self.SpawnMaxGroups do + self:T( { SpawnX, SpawnY, SpawnXIndex, SpawnYIndex } ) + + self.SpawnGroups[SpawnGroupID].Visible = true + self.SpawnGroups[SpawnGroupID].Spawned = false + + SpawnXIndex = SpawnXIndex + 1 + if SpawnWidth and SpawnWidth ~= 0 then + if SpawnXIndex >= SpawnWidth then + SpawnXIndex = 0 + SpawnYIndex = SpawnYIndex + 1 + end + end + + local SpawnRootX = self.SpawnGroups[SpawnGroupID].SpawnTemplate.x + local SpawnRootY = self.SpawnGroups[SpawnGroupID].SpawnTemplate.y + + self:_TranslateRotate( SpawnGroupID, SpawnRootX, SpawnRootY, SpawnX, SpawnY, SpawnAngle ) + + self.SpawnGroups[SpawnGroupID].SpawnTemplate.lateActivation = true + self.SpawnGroups[SpawnGroupID].SpawnTemplate.visible = true + + self.SpawnGroups[SpawnGroupID].Visible = true + + _EVENTDISPATCHER:OnBirthForTemplate( self.SpawnGroups[SpawnGroupID].SpawnTemplate, self._OnBirth, self ) + _EVENTDISPATCHER:OnCrashForTemplate( self.SpawnGroups[SpawnGroupID].SpawnTemplate, self._OnDeadOrCrash, self ) + _EVENTDISPATCHER:OnDeadForTemplate( self.SpawnGroups[SpawnGroupID].SpawnTemplate, self._OnDeadOrCrash, self ) + + if self.Repeat then + _EVENTDISPATCHER:OnTakeOffForTemplate( self.SpawnGroups[SpawnGroupID].SpawnTemplate, self._OnTakeOff, self ) + _EVENTDISPATCHER:OnLandForTemplate( self.SpawnGroups[SpawnGroupID].SpawnTemplate, self._OnLand, self ) + end + if self.RepeatOnEngineShutDown then + _EVENTDISPATCHER:OnEngineShutDownForTemplate( self.SpawnGroups[SpawnGroupID].SpawnTemplate, self._OnEngineShutDown, self ) + end + + self.SpawnGroups[SpawnGroupID].Group = _DATABASE:Spawn( self.SpawnGroups[SpawnGroupID].SpawnTemplate ) + + SpawnX = SpawnXIndex * SpawnDeltaX + SpawnY = SpawnYIndex * SpawnDeltaY + end + + return self +end + + + +--- Will spawn a group based on the internal index. +-- Note: Uses @{DATABASE} module defined in MOOSE. +-- @param #SPAWN self +-- @return Group#GROUP The group that was spawned. You can use this group for further actions. +function SPAWN:Spawn() + self:F( { self.SpawnTemplatePrefix, self.SpawnIndex } ) + + return self:SpawnWithIndex( self.SpawnIndex + 1 ) +end + +--- Will re-spawn a group based on a given index. +-- Note: Uses @{DATABASE} module defined in MOOSE. +-- @param #SPAWN self +-- @param #string SpawnIndex The index of the group to be spawned. +-- @return Group#GROUP The group that was spawned. You can use this group for further actions. +function SPAWN:ReSpawn( SpawnIndex ) + self:F( { self.SpawnTemplatePrefix, SpawnIndex } ) + + if not SpawnIndex then + SpawnIndex = 1 + end + +-- TODO: This logic makes DCS crash and i don't know why (yet). + local SpawnGroup = self:GetGroupFromIndex( SpawnIndex ) + if SpawnGroup then + local SpawnDCSGroup = SpawnGroup:GetDCSGroup() + if SpawnDCSGroup then + SpawnGroup:Destroy() + end + end + + return self:SpawnWithIndex( SpawnIndex ) +end + +--- Will spawn a group with a specified index number. +-- Uses @{DATABASE} global object defined in MOOSE. +-- @param #SPAWN self +-- @return Group#GROUP The group that was spawned. You can use this group for further actions. +function SPAWN:SpawnWithIndex( SpawnIndex ) + self:F( { self.SpawnTemplatePrefix, SpawnIndex, self.SpawnMaxGroups } ) + + if self:_GetSpawnIndex( SpawnIndex ) then + + if self.SpawnGroups[self.SpawnIndex].Visible then + self.SpawnGroups[self.SpawnIndex].Group:Activate() + else + self:T( self.SpawnGroups[self.SpawnIndex].SpawnTemplate ) + _EVENTDISPATCHER:OnBirthForTemplate( self.SpawnGroups[self.SpawnIndex].SpawnTemplate, self._OnBirth, self ) + _EVENTDISPATCHER:OnCrashForTemplate( self.SpawnGroups[self.SpawnIndex].SpawnTemplate, self._OnDeadOrCrash, self ) + _EVENTDISPATCHER:OnDeadForTemplate( self.SpawnGroups[self.SpawnIndex].SpawnTemplate, self._OnDeadOrCrash, self ) + + if self.Repeat then + _EVENTDISPATCHER:OnTakeOffForTemplate( self.SpawnGroups[self.SpawnIndex].SpawnTemplate, self._OnTakeOff, self ) + _EVENTDISPATCHER:OnLandForTemplate( self.SpawnGroups[self.SpawnIndex].SpawnTemplate, self._OnLand, self ) + end + if self.RepeatOnEngineShutDown then + _EVENTDISPATCHER:OnEngineShutDownForTemplate( self.SpawnGroups[self.SpawnIndex].SpawnTemplate, self._OnEngineShutDown, self ) + end + + self:T( self.SpawnGroups[self.SpawnIndex].SpawnTemplate ) + + self.SpawnGroups[self.SpawnIndex].Group = _DATABASE:Spawn( self.SpawnGroups[self.SpawnIndex].SpawnTemplate ) + + -- If there is a SpawnFunction hook defined, call it. + if self.SpawnFunctionHook then + self.SpawnFunctionHook( self.SpawnGroups[self.SpawnIndex].Group, unpack( self.SpawnFunctionArguments ) ) + end + -- TODO: Need to fix this by putting an "R" in the name of the group when the group repeats. + --if self.Repeat then + -- _DATABASE:SetStatusGroup( SpawnTemplate.name, "ReSpawn" ) + --end + end + + self.SpawnGroups[self.SpawnIndex].Spawned = true + + local SpawnGroup = self.SpawnGroups[self.SpawnIndex].Group -- Group#GROUP + local Route = SpawnGroup:GetTaskRoute() + SpawnGroup:Route(Route) + + + return self.SpawnGroups[self.SpawnIndex].Group + else + --self:E( { self.SpawnTemplatePrefix, "No more Groups to Spawn:", SpawnIndex, self.SpawnMaxGroups } ) + end + + return nil +end + +--- Spawns new groups at varying time intervals. +-- This is useful if you want to have continuity within your missions of certain (AI) groups to be present (alive) within your missions. +-- @param #SPAWN self +-- @param #number SpawnTime The time interval defined in seconds between each new spawn of new groups. +-- @param #number SpawnTimeVariation The variation to be applied on the defined time interval between each new spawn. +-- The variation is a number between 0 and 1, representing the %-tage of variation to be applied on the time interval. +-- @return #SPAWN self +-- @usage +-- -- NATO helicopters engaging in the battle field. +-- -- The time interval is set to SPAWN new helicopters between each 600 seconds, with a time variation of 50%. +-- -- The time variation in this case will be between 450 seconds and 750 seconds. +-- -- This is calculated as follows: +-- -- Low limit: 600 * ( 1 - 0.5 / 2 ) = 450 +-- -- High limit: 600 * ( 1 + 0.5 / 2 ) = 750 +-- -- Between these two values, a random amount of seconds will be choosen for each new spawn of the helicopters. +-- Spawn_BE_KA50 = SPAWN:New( 'BE KA-50@RAMP-Ground Defense' ):Schedule( 600, 0.5 ) +function SPAWN:SpawnScheduled( SpawnTime, SpawnTimeVariation ) + self:F( { SpawnTime, SpawnTimeVariation } ) + + if SpawnTime ~= nil and SpawnTimeVariation ~= nil then + self.SpawnScheduler = SCHEDULER:New( self, self._Scheduler, {}, 1, SpawnTime, SpawnTimeVariation ) + end + + return self +end + +--- Will re-start the spawning scheduler. +-- Note: This function is only required to be called when the schedule was stopped. +function SPAWN:SpawnScheduleStart() + self:F( { self.SpawnTemplatePrefix } ) + + self.SpawnScheduler:Start() +end + +--- Will stop the scheduled spawning scheduler. +function SPAWN:SpawnScheduleStop() + self:F( { self.SpawnTemplatePrefix } ) + + self.SpawnScheduler:Stop() +end + + +--- Allows to place a CallFunction hook when a new group spawns. +-- The provided function will be called when a new group is spawned, including its given parameters. +-- The first parameter of the SpawnFunction is the @{Group#GROUP} that was spawned. +-- @param #SPAWN self +-- @param #function SpawnFunctionHook The function to be called when a group spawns. +-- @param SpawnFunctionArguments A random amount of arguments to be provided to the function when the group spawns. +-- @return #SPAWN +function SPAWN:SpawnFunction( SpawnFunctionHook, ... ) + self:F( SpawnFunction ) + + self.SpawnFunctionHook = SpawnFunctionHook + self.SpawnFunctionArguments = {} + if arg then + self.SpawnFunctionArguments = arg + end + + return self +end + + + + +--- Will spawn a group from a hosting unit. This function is mostly advisable to be used if you want to simulate spawning from air units, like helicopters, which are dropping infantry into a defined Landing Zone. +-- Note that each point in the route assigned to the spawning group is reset to the point of the spawn. +-- You can use the returned group to further define the route to be followed. +-- @param #SPAWN self +-- @param Unit#UNIT HostUnit The air or ground unit dropping or unloading the group. +-- @param #number OuterRadius The outer radius in meters where the new group will be spawned. +-- @param #number InnerRadius The inner radius in meters where the new group will NOT be spawned. +-- @param #number SpawnIndex (Optional) The index which group to spawn within the given zone. +-- @return Group#GROUP that was spawned. +-- @return #nil Nothing was spawned. +function SPAWN:SpawnFromUnit( HostUnit, OuterRadius, InnerRadius, SpawnIndex ) + self:F( { self.SpawnTemplatePrefix, HostUnit, OuterRadius, InnerRadius, SpawnIndex } ) + + if HostUnit and HostUnit:IsAlive() then -- and HostUnit:getUnit(1):inAir() == false then + + if SpawnIndex then + else + SpawnIndex = self.SpawnIndex + 1 + end + + if self:_GetSpawnIndex( SpawnIndex ) then + + local SpawnTemplate = self.SpawnGroups[self.SpawnIndex].SpawnTemplate + + if SpawnTemplate then + + local UnitPoint = HostUnit:GetPointVec2() + + self:T( { "Current point of ", self.SpawnTemplatePrefix, UnitPoint } ) + + --for PointID, Point in pairs( SpawnTemplate.route.points ) do + --Point.x = UnitPoint.x + --Point.y = UnitPoint.y + --Point.alt = nil + --Point.alt_type = nil + --end + + SpawnTemplate.route.points[1].x = UnitPoint.x + SpawnTemplate.route.points[1].y = UnitPoint.y + + if not InnerRadius then + InnerRadius = 10 + end + + if not OuterRadius then + OuterRadius = 50 + end + + -- Apply SpawnFormation + for UnitID = 1, #SpawnTemplate.units do + if InnerRadius == 0 then + SpawnTemplate.units[UnitID].x = UnitPoint.x + SpawnTemplate.units[UnitID].y = UnitPoint.y + else + local CirclePos = routines.getRandPointInCircle( UnitPoint, OuterRadius, InnerRadius ) + SpawnTemplate.units[UnitID].x = CirclePos.x + SpawnTemplate.units[UnitID].y = CirclePos.y + end + self:T( 'SpawnTemplate.units['..UnitID..'].x = ' .. SpawnTemplate.units[UnitID].x .. ', SpawnTemplate.units['..UnitID..'].y = ' .. SpawnTemplate.units[UnitID].y ) + end + + local SpawnPos = routines.getRandPointInCircle( UnitPoint, OuterRadius, InnerRadius ) + local Point = {} + Point.type = "Turning Point" + Point.x = SpawnPos.x + Point.y = SpawnPos.y + Point.action = "Cone" + Point.speed = 5 + + table.insert( SpawnTemplate.route.points, 2, Point ) + + return self:SpawnWithIndex( self.SpawnIndex ) + end + end + end + + return nil +end + +--- Will spawn a Group within a given @{Zone#ZONE}. +-- Once the group is spawned within the zone, it will continue on its route. +-- The first waypoint (where the group is spawned) is replaced with the zone coordinates. +-- @param #SPAWN self +-- @param Zone#ZONE Zone The zone where the group is to be spawned. +-- @param #number ZoneRandomize (Optional) Set to true if you want to randomize the starting point in the zone. +-- @param #number SpawnIndex (Optional) The index which group to spawn within the given zone. +-- @return Group#GROUP that was spawned. +-- @return #nil when nothing was spawned. +function SPAWN:SpawnInZone( Zone, ZoneRandomize, SpawnIndex ) + self:F( { self.SpawnTemplatePrefix, Zone, ZoneRandomize, SpawnIndex } ) + + if Zone then + + if SpawnIndex then + else + SpawnIndex = self.SpawnIndex + 1 + end + + if self:_GetSpawnIndex( SpawnIndex ) then + + local SpawnTemplate = self.SpawnGroups[self.SpawnIndex].SpawnTemplate + + if SpawnTemplate then + + local ZonePoint + + if ZoneRandomize == true then + ZonePoint = Zone:GetRandomPointVec2() + else + ZonePoint = Zone:GetPointVec2() + end + + SpawnTemplate.route.points[1].x = ZonePoint.x + SpawnTemplate.route.points[1].y = ZonePoint.y + + -- Apply SpawnFormation + for UnitID = 1, #SpawnTemplate.units do + local ZonePointUnit = Zone:GetRandomPointVec2() + SpawnTemplate.units[UnitID].x = ZonePointUnit.x + SpawnTemplate.units[UnitID].y = ZonePointUnit.y + self:T( 'SpawnTemplate.units['..UnitID..'].x = ' .. SpawnTemplate.units[UnitID].x .. ', SpawnTemplate.units['..UnitID..'].y = ' .. SpawnTemplate.units[UnitID].y ) + end + + return self:SpawnWithIndex( self.SpawnIndex ) + end + end + end + + return nil +end + + + + +--- Will spawn a plane group in uncontrolled mode... +-- This will be similar to the uncontrolled flag setting in the ME. +-- @return #SPAWN self +function SPAWN:UnControlled() + self:F( { self.SpawnTemplatePrefix } ) + + self.SpawnUnControlled = true + + for SpawnGroupID = 1, self.SpawnMaxGroups do + self.SpawnGroups[SpawnGroupID].UnControlled = true + end + + return self +end + + + +--- Will return the SpawnGroupName either with with a specific count number or without any count. +-- @param #SPAWN self +-- @param #number SpawnIndex Is the number of the Group that is to be spawned. +-- @return #string SpawnGroupName +function SPAWN:SpawnGroupName( SpawnIndex ) + self:F( { self.SpawnTemplatePrefix, SpawnIndex } ) + + local SpawnPrefix = self.SpawnTemplatePrefix + if self.SpawnAliasPrefix then + SpawnPrefix = self.SpawnAliasPrefix + end + + if SpawnIndex then + local SpawnName = string.format( '%s#%03d', SpawnPrefix, SpawnIndex ) + self:T( SpawnName ) + return SpawnName + else + self:T( SpawnPrefix ) + return SpawnPrefix + end + +end + +--- Find the first alive group. +-- @param #SPAWN self +-- @param #number SpawnCursor A number holding the index from where to find the first group from. +-- @return Group#GROUP, #number The group found, the new index where the group was found. +-- @return #nil, #nil When no group is found, #nil is returned. +function SPAWN:GetFirstAliveGroup( SpawnCursor ) + self:F( { self.SpawnTemplatePrefix, self.SpawnAliasPrefix, SpawnCursor } ) + + for SpawnIndex = 1, self.SpawnCount do + local SpawnGroup = self:GetGroupFromIndex( SpawnIndex ) + if SpawnGroup and SpawnGroup:IsAlive() then + SpawnCursor = SpawnIndex + return SpawnGroup, SpawnCursor + end + end + + return nil, nil +end + + +--- Find the next alive group. +-- @param #SPAWN self +-- @param #number SpawnCursor A number holding the last found previous index. +-- @return Group#GROUP, #number The group found, the new index where the group was found. +-- @return #nil, #nil When no group is found, #nil is returned. +function SPAWN:GetNextAliveGroup( SpawnCursor ) + self:F( { self.SpawnTemplatePrefix, self.SpawnAliasPrefix, SpawnCursor } ) + + SpawnCursor = SpawnCursor + 1 + for SpawnIndex = SpawnCursor, self.SpawnCount do + local SpawnGroup = self:GetGroupFromIndex( SpawnIndex ) + if SpawnGroup and SpawnGroup:IsAlive() then + SpawnCursor = SpawnIndex + return SpawnGroup, SpawnCursor + end + end + + return nil, nil +end + +--- Find the last alive group during runtime. +function SPAWN:GetLastAliveGroup() + self:F( { self.SpawnTemplatePrefixself.SpawnAliasPrefix } ) + + self.SpawnIndex = self:_GetLastIndex() + for SpawnIndex = self.SpawnIndex, 1, -1 do + local SpawnGroup = self:GetGroupFromIndex( SpawnIndex ) + if SpawnGroup and SpawnGroup:IsAlive() then + self.SpawnIndex = SpawnIndex + return SpawnGroup + end + end + + self.SpawnIndex = nil + return nil +end + + + +--- Get the group from an index. +-- Returns the group from the SpawnGroups list. +-- If no index is given, it will return the first group in the list. +-- @param #SPAWN self +-- @param #number SpawnIndex The index of the group to return. +-- @return Group#GROUP +function SPAWN:GetGroupFromIndex( SpawnIndex ) + self:F( { self.SpawnTemplatePrefix, self.SpawnAliasPrefix, SpawnIndex } ) + + if not SpawnIndex then + SpawnIndex = 1 + end + + if self.SpawnGroups and self.SpawnGroups[SpawnIndex] then + local SpawnGroup = self.SpawnGroups[SpawnIndex].Group + return SpawnGroup + else + return nil + end +end + +--- Get the group index from a DCSUnit. +-- The method will search for a #-mark, and will return the index behind the #-mark of the DCSUnit. +-- It will return nil of no prefix was found. +-- @param #SPAWN self +-- @param DCSUnit The DCS unit to be searched. +-- @return #string The prefix +-- @return #nil Nothing found +function SPAWN:_GetGroupIndexFromDCSUnit( DCSUnit ) + self:F( { self.SpawnTemplatePrefix, self.SpawnAliasPrefix, DCSUnit } ) + + if DCSUnit and DCSUnit:getName() then + local IndexString = string.match( DCSUnit:getName(), "#.*-" ):sub( 2, -2 ) + self:T( IndexString ) + + if IndexString then + local Index = tonumber( IndexString ) + self:T( { "Index:", IndexString, Index } ) + return Index + end + end + + return nil +end + +--- Return the prefix of a DCSUnit. +-- The method will search for a #-mark, and will return the text before the #-mark. +-- It will return nil of no prefix was found. +-- @param #SPAWN self +-- @param DCSUnit The DCS unit to be searched. +-- @return #string The prefix +-- @return #nil Nothing found +function SPAWN:_GetPrefixFromDCSUnit( DCSUnit ) + self:F( { self.SpawnTemplatePrefix, self.SpawnAliasPrefix, DCSUnit } ) + + if DCSUnit and DCSUnit:getName() then + local SpawnPrefix = string.match( DCSUnit:getName(), ".*#" ) + if SpawnPrefix then + SpawnPrefix = SpawnPrefix:sub( 1, -2 ) + end + self:T( SpawnPrefix ) + return SpawnPrefix + end + + return nil +end + +--- Return the group within the SpawnGroups collection with input a DCSUnit. +function SPAWN:_GetGroupFromDCSUnit( DCSUnit ) + self:F( { self.SpawnTemplatePrefix, self.SpawnAliasPrefix, DCSUnit } ) + + if DCSUnit then + local SpawnPrefix = self:_GetPrefixFromDCSUnit( DCSUnit ) + + if self.SpawnTemplatePrefix == SpawnPrefix or ( self.SpawnAliasPrefix and self.SpawnAliasPrefix == SpawnPrefix ) then + local SpawnGroupIndex = self:_GetGroupIndexFromDCSUnit( DCSUnit ) + local SpawnGroup = self.SpawnGroups[SpawnGroupIndex].Group + self:T( SpawnGroup ) + return SpawnGroup + end + end + + return nil +end + + +--- Get the index from a given group. +-- The function will search the name of the group for a #, and will return the number behind the #-mark. +function SPAWN:GetSpawnIndexFromGroup( SpawnGroup ) + self:F( { self.SpawnTemplatePrefix, self.SpawnAliasPrefix, SpawnGroup } ) + + local IndexString = string.match( SpawnGroup:GetName(), "#.*$" ):sub( 2 ) + local Index = tonumber( IndexString ) + + self:T( IndexString, Index ) + return Index + +end + +--- Return the last maximum index that can be used. +function SPAWN:_GetLastIndex() + self:F( { self.SpawnTemplatePrefix, self.SpawnAliasPrefix } ) + + return self.SpawnMaxGroups +end + +--- Initalize the SpawnGroups collection. +function SPAWN:_InitializeSpawnGroups( SpawnIndex ) + self:F( { self.SpawnTemplatePrefix, self.SpawnAliasPrefix, SpawnIndex } ) + + if not self.SpawnGroups[SpawnIndex] then + self.SpawnGroups[SpawnIndex] = {} + self.SpawnGroups[SpawnIndex].Visible = false + self.SpawnGroups[SpawnIndex].Spawned = false + self.SpawnGroups[SpawnIndex].UnControlled = false + self.SpawnGroups[SpawnIndex].SpawnTime = 0 + + self.SpawnGroups[SpawnIndex].SpawnTemplatePrefix = self.SpawnTemplatePrefix + self.SpawnGroups[SpawnIndex].SpawnTemplate = self:_Prepare( self.SpawnGroups[SpawnIndex].SpawnTemplatePrefix, SpawnIndex ) + end + + self:_RandomizeTemplate( SpawnIndex ) + self:_RandomizeRoute( SpawnIndex ) + --self:_TranslateRotate( SpawnIndex ) + + return self.SpawnGroups[SpawnIndex] +end + + + +--- Gets the CategoryID of the Group with the given SpawnPrefix +function SPAWN:_GetGroupCategoryID( SpawnPrefix ) + local TemplateGroup = Group.getByName( SpawnPrefix ) + + if TemplateGroup then + return TemplateGroup:getCategory() + else + return nil + end +end + +--- Gets the CoalitionID of the Group with the given SpawnPrefix +function SPAWN:_GetGroupCoalitionID( SpawnPrefix ) + local TemplateGroup = Group.getByName( SpawnPrefix ) + + if TemplateGroup then + return TemplateGroup:getCoalition() + else + return nil + end +end + +--- Gets the CountryID of the Group with the given SpawnPrefix +function SPAWN:_GetGroupCountryID( SpawnPrefix ) + self:F( { self.SpawnTemplatePrefix, self.SpawnAliasPrefix, SpawnPrefix } ) + + local TemplateGroup = Group.getByName( SpawnPrefix ) + + if TemplateGroup then + local TemplateUnits = TemplateGroup:getUnits() + return TemplateUnits[1]:getCountry() + else + return nil + end +end + +--- Gets the Group Template from the ME environment definition. +-- This method used the @{DATABASE} object, which contains ALL initial and new spawned object in MOOSE. +-- @param #SPAWN self +-- @param #string SpawnTemplatePrefix +-- @return @SPAWN self +function SPAWN:_GetTemplate( SpawnTemplatePrefix ) + self:F( { self.SpawnTemplatePrefix, self.SpawnAliasPrefix, SpawnTemplatePrefix } ) + + local SpawnTemplate = nil + + SpawnTemplate = routines.utils.deepCopy( _DATABASE.Templates.Groups[SpawnTemplatePrefix].Template ) + + if SpawnTemplate == nil then + error( 'No Template returned for SpawnTemplatePrefix = ' .. SpawnTemplatePrefix ) + end + + SpawnTemplate.SpawnCoalitionID = self:_GetGroupCoalitionID( SpawnTemplatePrefix ) + SpawnTemplate.SpawnCategoryID = self:_GetGroupCategoryID( SpawnTemplatePrefix ) + SpawnTemplate.SpawnCountryID = self:_GetGroupCountryID( SpawnTemplatePrefix ) + + self:T( { SpawnTemplate } ) + return SpawnTemplate +end + +--- Prepares the new Group Template. +-- @param #SPAWN self +-- @param #string SpawnTemplatePrefix +-- @param #number SpawnIndex +-- @return #SPAWN self +function SPAWN:_Prepare( SpawnTemplatePrefix, SpawnIndex ) + self:F( { self.SpawnTemplatePrefix, self.SpawnAliasPrefix } ) + + local SpawnTemplate = self:_GetTemplate( SpawnTemplatePrefix ) + SpawnTemplate.name = self:SpawnGroupName( SpawnIndex ) + + SpawnTemplate.groupId = nil + --SpawnTemplate.lateActivation = false + SpawnTemplate.lateActivation = false -- TODO BUGFIX + + if SpawnTemplate.SpawnCategoryID == Group.Category.GROUND then + self:T( "For ground units, visible needs to be false..." ) + SpawnTemplate.visible = false -- TODO BUGFIX + end + + if SpawnTemplate.SpawnCategoryID == Group.Category.HELICOPTER or SpawnTemplate.SpawnCategoryID == Group.Category.AIRPLANE then + SpawnTemplate.uncontrolled = false + end + + for UnitID = 1, #SpawnTemplate.units do + SpawnTemplate.units[UnitID].name = string.format( SpawnTemplate.name .. '-%02d', UnitID ) + SpawnTemplate.units[UnitID].unitId = nil + SpawnTemplate.units[UnitID].x = SpawnTemplate.route.points[1].x + SpawnTemplate.units[UnitID].y = SpawnTemplate.route.points[1].y + end + + self:T( { "Template:", SpawnTemplate } ) + return SpawnTemplate + +end + +--- Private method randomizing the routes. +-- @param #SPAWN self +-- @param #number SpawnIndex The index of the group to be spawned. +-- @return #SPAWN +function SPAWN:_RandomizeRoute( SpawnIndex ) + self:F( { self.SpawnTemplatePrefix, SpawnIndex, self.SpawnRandomizeRoute, self.SpawnRandomizeRouteStartPoint, self.SpawnRandomizeRouteEndPoint, self.SpawnRandomizeRouteRadius } ) + + if self.SpawnRandomizeRoute then + local SpawnTemplate = self.SpawnGroups[SpawnIndex].SpawnTemplate + local RouteCount = #SpawnTemplate.route.points + + for t = self.SpawnRandomizeRouteStartPoint + 1, ( RouteCount - self.SpawnRandomizeRouteEndPoint ) do + SpawnTemplate.route.points[t].x = SpawnTemplate.route.points[t].x + math.random( self.SpawnRandomizeRouteRadius * -1, self.SpawnRandomizeRouteRadius ) + SpawnTemplate.route.points[t].y = SpawnTemplate.route.points[t].y + math.random( self.SpawnRandomizeRouteRadius * -1, self.SpawnRandomizeRouteRadius ) + -- TODO: manage altitude for airborne units ... + SpawnTemplate.route.points[t].alt = nil + --SpawnGroup.route.points[t].alt_type = nil + self:T( 'SpawnTemplate.route.points[' .. t .. '].x = ' .. SpawnTemplate.route.points[t].x .. ', SpawnTemplate.route.points[' .. t .. '].y = ' .. SpawnTemplate.route.points[t].y ) + end + end + + return self +end + +--- Private method that randomizes the template of the group. +-- @param #SPAWN self +-- @param #number SpawnIndex +-- @return #SPAWN self +function SPAWN:_RandomizeTemplate( SpawnIndex ) + self:F( { self.SpawnTemplatePrefix, SpawnIndex, self.SpawnRandomizeTemplate } ) + + if self.SpawnRandomizeTemplate then + self.SpawnGroups[SpawnIndex].SpawnTemplatePrefix = self.SpawnTemplatePrefixTable[ math.random( 1, #self.SpawnTemplatePrefixTable ) ] + self.SpawnGroups[SpawnIndex].SpawnTemplate = self:_Prepare( self.SpawnGroups[SpawnIndex].SpawnTemplatePrefix, SpawnIndex ) + self.SpawnGroups[SpawnIndex].SpawnTemplate.route = routines.utils.deepCopy( self.SpawnTemplate.route ) + self.SpawnGroups[SpawnIndex].SpawnTemplate.x = self.SpawnTemplate.x + self.SpawnGroups[SpawnIndex].SpawnTemplate.y = self.SpawnTemplate.y + self.SpawnGroups[SpawnIndex].SpawnTemplate.start_time = self.SpawnTemplate.start_time + for UnitID = 1, #self.SpawnGroups[SpawnIndex].SpawnTemplate.units do + self.SpawnGroups[SpawnIndex].SpawnTemplate.units[UnitID].heading = self.SpawnTemplate.units[1].heading + end + end + + self:_RandomizeRoute( SpawnIndex ) + + return self +end + +function SPAWN:_TranslateRotate( SpawnIndex, SpawnRootX, SpawnRootY, SpawnX, SpawnY, SpawnAngle ) + self:F( { self.SpawnTemplatePrefix, SpawnIndex, SpawnRootX, SpawnRootY, SpawnX, SpawnY, SpawnAngle } ) + + -- Translate + local TranslatedX = SpawnX + local TranslatedY = SpawnY + + -- Rotate + -- From Wikipedia: https://en.wikipedia.org/wiki/Rotation_matrix#Common_rotations + -- x' = x \cos \theta - y \sin \theta\ + -- y' = x \sin \theta + y \cos \theta\ + local RotatedX = - TranslatedX * math.cos( math.rad( SpawnAngle ) ) + + TranslatedY * math.sin( math.rad( SpawnAngle ) ) + local RotatedY = TranslatedX * math.sin( math.rad( SpawnAngle ) ) + + TranslatedY * math.cos( math.rad( SpawnAngle ) ) + + -- Assign + self.SpawnGroups[SpawnIndex].SpawnTemplate.x = SpawnRootX - RotatedX + self.SpawnGroups[SpawnIndex].SpawnTemplate.y = SpawnRootY + RotatedY + + + local SpawnUnitCount = table.getn( self.SpawnGroups[SpawnIndex].SpawnTemplate.units ) + for u = 1, SpawnUnitCount do + + -- Translate + local TranslatedX = SpawnX + local TranslatedY = SpawnY - 10 * ( u - 1 ) + + -- Rotate + local RotatedX = - TranslatedX * math.cos( math.rad( SpawnAngle ) ) + + TranslatedY * math.sin( math.rad( SpawnAngle ) ) + local RotatedY = TranslatedX * math.sin( math.rad( SpawnAngle ) ) + + TranslatedY * math.cos( math.rad( SpawnAngle ) ) + + -- Assign + self.SpawnGroups[SpawnIndex].SpawnTemplate.units[u].x = SpawnRootX - RotatedX + self.SpawnGroups[SpawnIndex].SpawnTemplate.units[u].y = SpawnRootY + RotatedY + self.SpawnGroups[SpawnIndex].SpawnTemplate.units[u].heading = self.SpawnGroups[SpawnIndex].SpawnTemplate.units[u].heading + math.rad( SpawnAngle ) + end + + return self +end + +--- Get the next index of the groups to be spawned. This function is complicated, as it is used at several spaces. +function SPAWN:_GetSpawnIndex( SpawnIndex ) + self:F( { self.SpawnTemplatePrefix, SpawnIndex, self.SpawnMaxGroups, self.SpawnMaxUnitsAlive, self.AliveUnits, #self.SpawnTemplate.units } ) + + + if ( self.SpawnMaxGroups == 0 ) or ( SpawnIndex <= self.SpawnMaxGroups ) then + if ( self.SpawnMaxUnitsAlive == 0 ) or ( self.AliveUnits < self.SpawnMaxUnitsAlive * #self.SpawnTemplate.units ) or self.UnControlled then + if SpawnIndex and SpawnIndex >= self.SpawnCount + 1 then + self.SpawnCount = self.SpawnCount + 1 + SpawnIndex = self.SpawnCount + end + self.SpawnIndex = SpawnIndex + if not self.SpawnGroups[self.SpawnIndex] then + self:_InitializeSpawnGroups( self.SpawnIndex ) + end + else + return nil + end + else + return nil + end + + return self.SpawnIndex +end + + +-- TODO Need to delete this... _DATABASE does this now ... +function SPAWN:_OnBirth( event ) + + if timer.getTime0() < timer.getAbsTime() then -- dont need to add units spawned in at the start of the mission if mist is loaded in init line + if event.initiator and event.initiator:getName() then + local EventPrefix = self:_GetPrefixFromDCSUnit( event.initiator ) + if EventPrefix == self.SpawnTemplatePrefix or ( self.SpawnAliasPrefix and EventPrefix == self.SpawnAliasPrefix ) then + self:T( { "Birth event: " .. event.initiator:getName(), event } ) + --MessageToAll( "Mission command: unit " .. SpawnTemplatePrefix .. " spawned." , 5, EventPrefix .. '/Event') + self.AliveUnits = self.AliveUnits + 1 + self:T( "Alive Units: " .. self.AliveUnits ) + end + end + end + +end + +--- Obscolete +-- @todo Need to delete this... _DATABASE does this now ... +function SPAWN:_OnDeadOrCrash( event ) + self:F( self.SpawnTemplatePrefix, event ) + + if event.initiator and event.initiator:getName() then + local EventPrefix = self:_GetPrefixFromDCSUnit( event.initiator ) + if EventPrefix == self.SpawnTemplatePrefix or ( self.SpawnAliasPrefix and EventPrefix == self.SpawnAliasPrefix ) then + self:T( { "Dead event: " .. event.initiator:getName(), event } ) +-- local DestroyedUnit = Unit.getByName( EventPrefix ) +-- if DestroyedUnit and DestroyedUnit.getLife() <= 1.0 then + --MessageToAll( "Mission command: unit " .. SpawnTemplatePrefix .. " crashed." , 5, EventPrefix .. '/Event') + self.AliveUnits = self.AliveUnits - 1 + self:T( "Alive Units: " .. self.AliveUnits ) +-- end + end + end +end + +--- Will detect AIR Units taking off... When the event takes place, the spawned Group is registered as airborne... +-- This is needed to ensure that Re-SPAWNing only is done for landed AIR Groups. +-- @todo Need to test for AIR Groups only... +function SPAWN:_OnTakeOff( event ) + self:F( self.SpawnTemplatePrefix, event ) + + if event.initiator and event.initiator:getName() then + local SpawnGroup = self:_GetGroupFromDCSUnit( event.initiator ) + if SpawnGroup then + self:T( { "TakeOff event: " .. event.initiator:getName(), event } ) + self:T( "self.Landed = false" ) + self.Landed = false + end + end +end + +--- Will detect AIR Units landing... When the event takes place, the spawned Group is registered as landed. +-- This is needed to ensure that Re-SPAWNing is only done for landed AIR Groups. +-- @todo Need to test for AIR Groups only... +function SPAWN:_OnLand( event ) + self:F( self.SpawnTemplatePrefix, event ) + + local SpawnUnit = event.initiator + if SpawnUnit and SpawnUnit:isExist() and Object.getCategory(SpawnUnit) == Object.Category.UNIT then + local SpawnGroup = self:_GetGroupFromDCSUnit( SpawnUnit ) + if SpawnGroup then + self:T( { "Landed event:" .. SpawnUnit:getName(), event } ) + self.Landed = true + self:T( "self.Landed = true" ) + if self.Landed and self.RepeatOnLanding then + local SpawnGroupIndex = self:GetSpawnIndexFromGroup( SpawnGroup ) + self:T( { "Landed:", "ReSpawn:", SpawnGroup:GetName(), SpawnGroupIndex } ) + self:ReSpawn( SpawnGroupIndex ) + end + end + end +end + +--- Will detect AIR Units shutting down their engines ... +-- When the event takes place, and the method @{RepeatOnEngineShutDown} was called, the spawned Group will Re-SPAWN. +-- But only when the Unit was registered to have landed. +-- @param #SPAWN self +-- @see _OnTakeOff +-- @see _OnLand +-- @todo Need to test for AIR Groups only... +function SPAWN:_OnEngineShutDown( event ) + self:F( self.SpawnTemplatePrefix, event ) + + local SpawnUnit = event.initiator + if SpawnUnit and SpawnUnit:isExist() and Object.getCategory(SpawnUnit) == Object.Category.UNIT then + local SpawnGroup = self:_GetGroupFromDCSUnit( SpawnUnit ) + if SpawnGroup then + self:T( { "EngineShutDown event: " .. SpawnUnit:getName(), event } ) + if self.Landed and self.RepeatOnEngineShutDown then + local SpawnGroupIndex = self:GetSpawnIndexFromGroup( SpawnGroup ) + self:T( { "EngineShutDown: ", "ReSpawn:", SpawnGroup:GetName(), SpawnGroupIndex } ) + self:ReSpawn( SpawnGroupIndex ) + end + end + end +end + +--- This function is called automatically by the Spawning scheduler. +-- It is the internal worker method SPAWNing new Groups on the defined time intervals. +function SPAWN:_Scheduler() + self:F( { "_Scheduler", self.SpawnTemplatePrefix, self.SpawnAliasPrefix, self.SpawnIndex, self.SpawnMaxGroups, self.SpawnMaxUnitsAlive } ) + + -- Validate if there are still groups left in the batch... + self:Spawn() + + return true +end + +function SPAWN:_SpawnCleanUpScheduler() + self:F( { "CleanUp Scheduler:", self.SpawnTemplatePrefix } ) + + local SpawnCursor + local SpawnGroup, SpawnCursor = self:GetFirstAliveGroup( SpawnCursor ) + + self:T( { "CleanUp Scheduler:", SpawnGroup } ) + + while SpawnGroup do + + if SpawnGroup:AllOnGround() and SpawnGroup:GetMaxVelocity() < 1 then + if not self.SpawnCleanUpTimeStamps[SpawnGroup:GetName()] then + self.SpawnCleanUpTimeStamps[SpawnGroup:GetName()] = timer.getTime() + else + if self.SpawnCleanUpTimeStamps[SpawnGroup:GetName()] + self.SpawnCleanUpInterval < timer.getTime() then + self:T( { "CleanUp Scheduler:", "Cleaning:", SpawnGroup } ) + SpawnGroup:Destroy() + end + end + else + self.SpawnCleanUpTimeStamps[SpawnGroup:GetName()] = nil + end + + SpawnGroup, SpawnCursor = self:GetNextAliveGroup( SpawnCursor ) + + self:T( { "CleanUp Scheduler:", SpawnGroup } ) + + end + + return true -- Repeat + +end +--- Limit the simultaneous movement of Groups within a running Mission. +-- This module is defined to improve the performance in missions, and to bring additional realism for GROUND vehicles. +-- Performance: If in a DCSRTE there are a lot of moving GROUND units, then in a multi player mission, this WILL create lag if +-- the main DCS execution core of your CPU is fully utilized. So, this class will limit the amount of simultaneous moving GROUND units +-- on defined intervals (currently every minute). +-- @module MOVEMENT + +Include.File( "Routines" ) + +--- the MOVEMENT class +-- @type +MOVEMENT = { + ClassName = "MOVEMENT", +} + +--- Creates the main object which is handling the GROUND forces movement. +-- @param table{string,...}|string MovePrefixes is a table of the Prefixes (names) of the GROUND Groups that need to be controlled by the MOVEMENT Object. +-- @param number MoveMaximum is a number that defines the maximum amount of GROUND Units to be moving during one minute. +-- @return MOVEMENT +-- @usage +-- -- Limit the amount of simultaneous moving units on the ground to prevent lag. +-- Movement_US_Platoons = MOVEMENT:New( { 'US Tank Platoon Left', 'US Tank Platoon Middle', 'US Tank Platoon Right', 'US CH-47D Troops' }, 15 ) + +function MOVEMENT:New( MovePrefixes, MoveMaximum ) + local self = BASE:Inherit( self, BASE:New() ) + self:F( { MovePrefixes, MoveMaximum } ) + + if type( MovePrefixes ) == 'table' then + self.MovePrefixes = MovePrefixes + else + self.MovePrefixes = { MovePrefixes } + end + self.MoveCount = 0 -- The internal counter of the amount of Moveing the has happened since MoveStart. + self.MoveMaximum = MoveMaximum -- Contains the Maximum amount of units that are allowed to move... + self.AliveUnits = 0 -- Contains the counter how many units are currently alive + self.MoveUnits = {} -- Reflects if the Moving for this MovePrefixes is going to be scheduled or not. + + _EVENTDISPATCHER:OnBirth( self.OnBirth, self ) + +-- self:AddEvent( world.event.S_EVENT_BIRTH, self.OnBirth ) +-- +-- self:EnableEvents() + + self:ScheduleStart() + + return self +end + +--- Call this function to start the MOVEMENT scheduling. +function MOVEMENT:ScheduleStart() + self:F() + --self.MoveFunction = routines.scheduleFunction( self._Scheduler, { self }, timer.getTime() + 1, 120 ) + self.MoveFunction = SCHEDULER:New( self, self._Scheduler, {}, 1, 120 ) +end + +--- Call this function to stop the MOVEMENT scheduling. +-- @todo need to implement it ... Forgot. +function MOVEMENT:ScheduleStop() + self:F() + +end + +--- Captures the birth events when new Units were spawned. +-- @todo This method should become obsolete. The new @{DATABASE} class will handle the collection administration. +function MOVEMENT:OnBirth( Event ) + self:F( { Event } ) + + if timer.getTime0() < timer.getAbsTime() then -- dont need to add units spawned in at the start of the mission if mist is loaded in init line + if Event.IniDCSUnit then + self:T( "Birth object : " .. Event.IniDCSUnitName ) + if Event.IniDCSGroup and Event.IniDCSGroup:isExist() then + for MovePrefixID, MovePrefix in pairs( self.MovePrefixes ) do + if string.find( Event.IniDCSUnitName, MovePrefix, 1, true ) then + self.AliveUnits = self.AliveUnits + 1 + self.MoveUnits[Event.IniDCSUnitName] = Event.IniDCSGroupName + self:T( self.AliveUnits ) + end + end + end + end + _EVENTDISPATCHER:OnCrashForUnit( Event.IniDCSUnitName, self.OnDeadOrCrash, self ) + _EVENTDISPATCHER:OnDeadForUnit( Event.IniDCSUnitName, self.OnDeadOrCrash, self ) + end + +end + +--- Captures the Dead or Crash events when Units crash or are destroyed. +-- @todo This method should become obsolete. The new @{DATABASE} class will handle the collection administration. +function MOVEMENT:OnDeadOrCrash( Event ) + self:F( { Event } ) + + if Event.IniDCSUnit then + self:T( "Dead object : " .. Event.IniDCSUnitName ) + for MovePrefixID, MovePrefix in pairs( self.MovePrefixes ) do + if string.find( Event.IniDCSUnitName, MovePrefix, 1, true ) then + self.AliveUnits = self.AliveUnits - 1 + self.MoveUnits[Event.IniDCSUnitName] = nil + self:T( self.AliveUnits ) + end + end + end +end + +--- This function is called automatically by the MOVEMENT scheduler. A new function is scheduled when MoveScheduled is true. +function MOVEMENT:_Scheduler() + self:F( { self.MovePrefixes, self.MoveMaximum, self.AliveUnits, self.MovementGroups } ) + + if self.AliveUnits > 0 then + local MoveProbability = ( self.MoveMaximum * 100 ) / self.AliveUnits + self:T( 'Move Probability = ' .. MoveProbability ) + + for MovementUnitName, MovementGroupName in pairs( self.MoveUnits ) do + local MovementGroup = Group.getByName( MovementGroupName ) + if MovementGroup and MovementGroup:isExist() then + local MoveOrStop = math.random( 1, 100 ) + self:T( 'MoveOrStop = ' .. MoveOrStop ) + if MoveOrStop <= MoveProbability then + self:T( 'Group continues moving = ' .. MovementGroupName ) + trigger.action.groupContinueMoving( MovementGroup ) + else + self:T( 'Group stops moving = ' .. MovementGroupName ) + trigger.action.groupStopMoving( MovementGroup ) + end + else + self.MoveUnits[MovementUnitName] = nil + end + end + end + return true +end +--- Provides defensive behaviour to a set of SAM sites within a running Mission. +-- @module Sead +-- @author to be searched on the forum +-- @author (co) Flightcontrol (Modified and enriched with functionality) + +Include.File( "Routines" ) +Include.File( "Event" ) +Include.File( "Base" ) +Include.File( "Mission" ) +Include.File( "Client" ) +Include.File( "Task" ) + +--- The SEAD class +-- @type SEAD +-- @extends Base#BASE +SEAD = { + ClassName = "SEAD", + TargetSkill = { + Average = { Evade = 50, DelayOff = { 10, 25 }, DelayOn = { 10, 30 } } , + Good = { Evade = 30, DelayOff = { 8, 20 }, DelayOn = { 20, 40 } } , + High = { Evade = 15, DelayOff = { 5, 17 }, DelayOn = { 30, 50 } } , + Excellent = { Evade = 10, DelayOff = { 3, 10 }, DelayOn = { 30, 60 } } + }, + SEADGroupPrefixes = {} +} + +--- Creates the main object which is handling defensive actions for SA sites or moving SA vehicles. +-- When an anti radiation missile is fired (KH-58, KH-31P, KH-31A, KH-25MPU, HARM missiles), the SA will shut down their radars and will take evasive actions... +-- Chances are big that the missile will miss. +-- @param table{string,...}|string SEADGroupPrefixes which is a table of Prefixes of the SA Groups in the DCSRTE on which evasive actions need to be taken. +-- @return SEAD +-- @usage +-- -- CCCP SEAD Defenses +-- -- Defends the Russian SA installations from SEAD attacks. +-- SEAD_RU_SAM_Defenses = SEAD:New( { 'RU SA-6 Kub', 'RU SA-6 Defenses', 'RU MI-26 Troops', 'RU Attack Gori' } ) +function SEAD:New( SEADGroupPrefixes ) + local self = BASE:Inherit( self, BASE:New() ) + self:F( SEADGroupPrefixes ) + if type( SEADGroupPrefixes ) == 'table' then + for SEADGroupPrefixID, SEADGroupPrefix in pairs( SEADGroupPrefixes ) do + self.SEADGroupPrefixes[SEADGroupPrefix] = SEADGroupPrefix + end + else + self.SEADGroupNames[SEADGroupPrefixes] = SEADGroupPrefixes + end + _EVENTDISPATCHER:OnShot( self.EventShot, self ) + + return self +end + +--- Detects if an SA site was shot with an anti radiation missile. In this case, take evasive actions based on the skill level set within the ME. +-- @see SEAD +function SEAD:EventShot( Event ) + self:F( { Event } ) + + local SEADUnit = Event.IniDCSUnit + local SEADUnitName = Event.IniDCSUnitName + local SEADWeapon = Event.Weapon -- Identify the weapon fired + local SEADWeaponName = Event.WeaponName -- return weapon type + --trigger.action.outText( string.format("Alerte, depart missile " ..string.format(SEADWeaponName)), 20) --debug message + -- Start of the 2nd loop + self:T( "Missile Launched = " .. SEADWeaponName ) + if SEADWeaponName == "KH-58" or SEADWeaponName == "KH-25MPU" or SEADWeaponName == "AGM-88" or SEADWeaponName == "KH-31A" or SEADWeaponName == "KH-31P" then -- Check if the missile is a SEAD + local _evade = math.random (1,100) -- random number for chance of evading action + local _targetMim = Event.Weapon:getTarget() -- Identify target + local _targetMimname = Unit.getName(_targetMim) + local _targetMimgroup = Unit.getGroup(Weapon.getTarget(SEADWeapon)) + local _targetMimgroupName = _targetMimgroup:getName() + local _targetMimcont= _targetMimgroup:getController() + local _targetskill = _DATABASE.Templates.Units[_targetMimname].Template.skill + self:T( self.SEADGroupPrefixes ) + self:T( _targetMimgroupName ) + local SEADGroupFound = false + for SEADGroupPrefixID, SEADGroupPrefix in pairs( self.SEADGroupPrefixes ) do + if string.find( _targetMimgroupName, SEADGroupPrefix, 1, true ) then + SEADGroupFound = true + self:T( 'Group Found' ) + break + end + end + if SEADGroupFound == true then + if _targetskill == "Random" then -- when skill is random, choose a skill + local Skills = { "Average", "Good", "High", "Excellent" } + _targetskill = Skills[ math.random(1,4) ] + end + self:T( _targetskill ) -- debug message for skill check + if self.TargetSkill[_targetskill] then + if (_evade > self.TargetSkill[_targetskill].Evade) then + self:T( string.format("Evading, target skill " ..string.format(_targetskill)) ) --debug message + local _targetMim = Weapon.getTarget(SEADWeapon) + local _targetMimname = Unit.getName(_targetMim) + local _targetMimgroup = Unit.getGroup(Weapon.getTarget(SEADWeapon)) + local _targetMimcont= _targetMimgroup:getController() + routines.groupRandomDistSelf(_targetMimgroup,300,'Diamond',250,20) -- move randomly + local SuppressedGroups1 = {} -- unit suppressed radar off for a random time + local function SuppressionEnd1(id) + id.ctrl:setOption(AI.Option.Ground.id.ALARM_STATE,AI.Option.Ground.val.ALARM_STATE.GREEN) + SuppressedGroups1[id.groupName] = nil + end + local id = { + groupName = _targetMimgroup, + ctrl = _targetMimcont + } + local delay1 = math.random(self.TargetSkill[_targetskill].DelayOff[1], self.TargetSkill[_targetskill].DelayOff[2]) + if SuppressedGroups1[id.groupName] == nil then + SuppressedGroups1[id.groupName] = { + SuppressionEndTime1 = timer.getTime() + delay1, + SuppressionEndN1 = SuppressionEndCounter1 --Store instance of SuppressionEnd() scheduled function + } + Controller.setOption(_targetMimcont, AI.Option.Ground.id.ALARM_STATE,AI.Option.Ground.val.ALARM_STATE.GREEN) + timer.scheduleFunction(SuppressionEnd1, id, SuppressedGroups1[id.groupName].SuppressionEndTime1) --Schedule the SuppressionEnd() function + --trigger.action.outText( string.format("Radar Off " ..string.format(delay1)), 20) + end + + local SuppressedGroups = {} + local function SuppressionEnd(id) + id.ctrl:setOption(AI.Option.Ground.id.ALARM_STATE,AI.Option.Ground.val.ALARM_STATE.RED) + SuppressedGroups[id.groupName] = nil + end + local id = { + groupName = _targetMimgroup, + ctrl = _targetMimcont + } + local delay = math.random(self.TargetSkill[_targetskill].DelayOn[1], self.TargetSkill[_targetskill].DelayOn[2]) + if SuppressedGroups[id.groupName] == nil then + SuppressedGroups[id.groupName] = { + SuppressionEndTime = timer.getTime() + delay, + SuppressionEndN = SuppressionEndCounter --Store instance of SuppressionEnd() scheduled function + } + timer.scheduleFunction(SuppressionEnd, id, SuppressedGroups[id.groupName].SuppressionEndTime) --Schedule the SuppressionEnd() function + --trigger.action.outText( string.format("Radar On " ..string.format(delay)), 20) + end + end + end + end + end +end +--- Taking the lead of AI escorting your flight. +-- +-- @{#ESCORT} class +-- ================ +-- The @{#ESCORT} class allows you to interact with escorting AI on your flight and take the lead. +-- Each escorting group can be commanded with a whole set of radio commands (radio menu in your flight, and then F10). +-- +-- The radio commands will vary according the category of the group. The richest set of commands are with Helicopters and AirPlanes. +-- Ships and Ground troops will have a more limited set, but they can provide support through the bombing of targets designated by the other escorts. +-- +-- RADIO MENUs that can be created: +-- ================================ +-- Find a summary below of the current available commands: +-- +-- Navigation ...: +-- --------------- +-- Escort group navigation functions: +-- +-- * **"Join-Up and Follow at x meters":** The escort group fill follow you at about x meters, and they will follow you. +-- * **"Flare":** Provides menu commands to let the escort group shoot a flare in the air in a color. +-- * **"Smoke":** Provides menu commands to let the escort group smoke the air in a color. Note that smoking is only available for ground and naval troops. +-- +-- Hold position ...: +-- ------------------ +-- Escort group navigation functions: +-- +-- * **"At current location":** Stops the escort group and they will hover 30 meters above the ground at the position they stopped. +-- * **"At client location":** Stops the escort group and they will hover 30 meters above the ground at the position they stopped. +-- +-- Report targets ...: +-- ------------------- +-- Report targets will make the escort group to report any target that it identifies within a 8km range. Any detected target can be attacked using the 4. Attack nearby targets function. (see below). +-- +-- * **"Report now":** Will report the current detected targets. +-- * **"Report targets on":** Will make the escort group to report detected targets and will fill the "Attack nearby targets" menu list. +-- * **"Report targets off":** Will stop detecting targets. +-- +-- Scan targets ...: +-- ----------------- +-- Menu items to pop-up the escort group for target scanning. After scanning, the escort group will resume with the mission or defined task. +-- +-- * **"Scan targets 30 seconds":** Scan 30 seconds for targets. +-- * **"Scan targets 60 seconds":** Scan 60 seconds for targets. +-- +-- Attack targets ...: +-- ------------------- +-- This menu item will list all detected targets within a 15km range. Depending on the level of detection (known/unknown) and visuality, the targets type will also be listed. +-- +-- Request assistance from ...: +-- ---------------------------- +-- This menu item will list all detected targets within a 15km range, as with the menu item **Attack Targets**. +-- This menu item allows to request attack support from other escorts supporting the current client group. +-- eg. the function allows a player to request support from the Ship escort to attack a target identified by the Plane escort with its Tomahawk missiles. +-- eg. the function allows a player to request support from other Planes escorting to bomb the unit with illumination missiles or bombs, so that the main plane escort can attack the area. +-- +-- ROE ...: +-- -------- +-- Sets the Rules of Engagement (ROE) of the escort group when in flight. +-- +-- * **"Hold Fire":** The escort group will hold fire. +-- * **"Return Fire":** The escort group will return fire. +-- * **"Open Fire":** The escort group will open fire on designated targets. +-- * **"Weapon Free":** The escort group will engage with any target. +-- +-- Evasion ...: +-- ------------ +-- Will define the evasion techniques that the escort group will perform during flight or combat. +-- +-- * **"Fight until death":** The escort group will have no reaction to threats. +-- * **"Use flares, chaff and jammers":** The escort group will use passive defense using flares and jammers. No evasive manoeuvres are executed. +-- * **"Evade enemy fire":** The rescort group will evade enemy fire before firing. +-- * **"Go below radar and evade fire":** The escort group will perform evasive vertical manoeuvres. +-- +-- Resume Mission ...: +-- ------------------- +-- Escort groups can have their own mission. This menu item will allow the escort group to resume their Mission from a given waypoint. +-- Note that this is really fantastic, as you now have the dynamic of taking control of the escort groups, and allowing them to resume their path or mission. +-- +-- ESCORT construction methods. +-- ============================ +-- Create a new SPAWN object with the @{#ESCORT.New} method: +-- +-- * @{#ESCORT.New}: Creates a new ESCORT object from a @{Group#GROUP} for a @{Client#CLIENT}, with an optional briefing text. +-- +-- ESCORT initialization methods. +-- ============================== +-- The following menus are created within the RADIO MENU of an active unit hosted by a player: +-- +-- * @{#ESCORT.MenuFollowAt}: Creates a menu to make the escort follow the client. +-- * @{#ESCORT.MenuHoldAtEscortPosition}: Creates a menu to hold the escort at its current position. +-- * @{#ESCORT.MenuHoldAtLeaderPosition}: Creates a menu to hold the escort at the client position. +-- * @{#ESCORT.MenuScanForTargets}: Creates a menu so that the escort scans targets. +-- * @{#ESCORT.MenuFlare}: Creates a menu to disperse flares. +-- * @{#ESCORT.MenuSmoke}: Creates a menu to disparse smoke. +-- * @{#ESCORT.MenuReportTargets}: Creates a menu so that the escort reports targets. +-- * @{#ESCORT.MenuReportPosition}: Creates a menu so that the escort reports its current position from bullseye. +-- * @{#ESCORT.MenuAssistedAttack: Creates a menu so that the escort supportes assisted attack from other escorts with the client. +-- * @{#ESCORT.MenuROE: Creates a menu structure to set the rules of engagement of the escort. +-- * @{#ESCORT.MenuEvasion: Creates a menu structure to set the evasion techniques when the escort is under threat. +-- * @{#ESCORT.MenuResumeMission}: Creates a menu structure so that the escort can resume from a waypoint. +-- +-- @module Escort +-- @author FlightControl + +Include.File( "Routines" ) +Include.File( "Base" ) +Include.File( "Database" ) +Include.File( "Group" ) +Include.File( "Zone" ) + +--- +-- @type ESCORT +-- @extends Base#BASE +-- @field Client#CLIENT EscortClient +-- @field Group#GROUP EscortGroup +-- @field #string EscortName +-- @field #ESCORT.MODE EscortMode The mode the escort is in. +-- @field #number FollowScheduler The id of the _FollowScheduler function. +-- @field #boolean ReportTargets If true, nearby targets are reported. +-- @Field DCSTypes#AI.Option.Air.val.ROE OptionROE Which ROE is set to the EscortGroup. +-- @field DCSTypes#AI.Option.Air.val.REACTION_ON_THREAT OptionReactionOnThreat Which REACTION_ON_THREAT is set to the EscortGroup. +-- @field Menu#MENU_CLIENT EscortMenuResumeMission +ESCORT = { + ClassName = "ESCORT", + EscortName = nil, -- The Escort Name + EscortClient = nil, + EscortGroup = nil, + EscortMode = nil, + MODE = { + FOLLOW = 1, + MISSION = 2, + }, + Targets = {}, -- The identified targets + FollowScheduler = nil, + ReportTargets = true, + OptionROE = AI.Option.Air.val.ROE.OPEN_FIRE, + OptionReactionOnThreat = AI.Option.Air.val.REACTION_ON_THREAT.ALLOW_ABORT_MISSION, + TaskPoints = {} +} + +--- ESCORT.Mode class +-- @type ESCORT.MODE +-- @field #number FOLLOW +-- @field #number MISSION + +--- MENUPARAM type +-- @type MENUPARAM +-- @field #ESCORT ParamSelf +-- @field #Distance ParamDistance +-- @field #function ParamFunction +-- @field #string ParamMessage + +--- ESCORT class constructor for an AI group +-- @param #ESCORT self +-- @param Client#CLIENT EscortClient The client escorted by the EscortGroup. +-- @param Group#GROUP EscortGroup The group AI escorting the EscortClient. +-- @param #string EscortName Name of the escort. +-- @return #ESCORT self +function ESCORT:New( EscortClient, EscortGroup, EscortName, EscortBriefing ) + local self = BASE:Inherit( self, BASE:New() ) + self:F( { EscortClient, EscortGroup, EscortName } ) + + self.EscortClient = EscortClient -- Client#CLIENT + self.EscortGroup = EscortGroup -- Group#GROUP + self.EscortName = EscortName + self.EscortBriefing = EscortBriefing + + self:T( EscortGroup:GetClassNameAndID() ) + + -- Set EscortGroup known at EscortClient. + if not self.EscortClient._EscortGroups then + self.EscortClient._EscortGroups = {} + end + + if not self.EscortClient._EscortGroups[EscortGroup:GetName()] then + self.EscortClient._EscortGroups[EscortGroup:GetName()] = {} + self.EscortClient._EscortGroups[EscortGroup:GetName()].EscortGroup = self.EscortGroup + self.EscortClient._EscortGroups[EscortGroup:GetName()].EscortName = self.EscortName + self.EscortClient._EscortGroups[EscortGroup:GetName()].Targets = {} + self.EscortMode = ESCORT.MODE.FOLLOW + end + + + self.EscortMenu = MENU_CLIENT:New( self.EscortClient, self.EscortName ) + + self.EscortGroup:WayPointInitialize(1) + + self.EscortGroup:OptionROTVertical() + self.EscortGroup:OptionROEOpenFire() + + EscortGroup:MessageToClient( EscortGroup:GetCategoryName() .. " '" .. EscortName .. "' (" .. EscortGroup:GetCallsign() .. ") reporting! " .. + "We're escorting your flight. " .. + "Use the Radio Menu and F10 and use the options under + " .. EscortName .. "\n", + 60, EscortClient + ) + + return self +end + + +--- Defines the default menus +-- @param #ESCORT self +-- @return #ESCORT +function ESCORT:Menus() + self:F() + + self:MenuFollowAt( 100 ) + self:MenuFollowAt( 200 ) + self:MenuFollowAt( 300 ) + self:MenuFollowAt( 400 ) + + self:MenuScanForTargets( 100, 60 ) + + self:MenuHoldAtEscortPosition( 30 ) + self:MenuHoldAtLeaderPosition( 30 ) + + self:MenuFlare() + self:MenuSmoke() + + self:MenuReportTargets( 60 ) + self:MenuAssistedAttack() + self:MenuROE() + self:MenuEvasion() + self:MenuResumeMission() + + return self +end + + + +--- Defines a menu slot to let the escort Join and Follow you at a certain distance. +-- This menu will appear under **Navigation**. +-- @param #ESCORT self +-- @param DCSTypes#Distance Distance The distance in meters that the escort needs to follow the client. +-- @return #ESCORT +function ESCORT:MenuFollowAt( Distance ) + self:F(Distance) + + if self.EscortGroup:IsAir() then + if not self.EscortMenuReportNavigation then + self.EscortMenuReportNavigation = MENU_CLIENT:New( self.EscortClient, "Navigation", self.EscortMenu ) + end + + if not self.EscortMenuJoinUpAndFollow then + self.EscortMenuJoinUpAndFollow = {} + end + + self.EscortMenuJoinUpAndFollow[#self.EscortMenuJoinUpAndFollow+1] = MENU_CLIENT_COMMAND:New( self.EscortClient, "Join-Up and Follow at " .. Distance, self.EscortMenuReportNavigation, ESCORT._JoinUpAndFollow, { ParamSelf = self, ParamDistance = Distance } ) + + self.EscortMode = ESCORT.MODE.FOLLOW + end + + return self +end + +--- Defines a menu slot to let the escort hold at their current position and stay low with a specified height during a specified time in seconds. +-- This menu will appear under **Hold position**. +-- @param #ESCORT self +-- @param DCSTypes#Distance Height Optional parameter that sets the height in meters to let the escort orbit at the current location. The default value is 30 meters. +-- @param DCSTypes#Time Seconds Optional parameter that lets the escort orbit at the current position for a specified time. (not implemented yet). The default value is 0 seconds, meaning, that the escort will orbit forever until a sequent command is given. +-- @param #string MenuTextFormat Optional parameter that shows the menu option text. The text string is formatted, and should contain two %d tokens in the string. The first for the Height, the second for the Time (if given). If no text is given, the default text will be displayed. +-- @return #ESCORT +-- TODO: Implement Seconds parameter. Challenge is to first develop the "continue from last activity" function. +function ESCORT:MenuHoldAtEscortPosition( Height, Seconds, MenuTextFormat ) + self:F( { Height, Seconds, MenuTextFormat } ) + + if self.EscortGroup:IsAir() then + + if not self.EscortMenuHold then + self.EscortMenuHold = MENU_CLIENT:New( self.EscortClient, "Hold position", self.EscortMenu ) + end + + if not Height then + Height = 30 + end + + if not Seconds then + Seconds = 0 + end + + local MenuText = "" + if not MenuTextFormat then + if Seconds == 0 then + MenuText = string.format( "Hold at %d meter", Height ) + else + MenuText = string.format( "Hold at %d meter for %d seconds", Height, Seconds ) + end + else + if Seconds == 0 then + MenuText = string.format( MenuTextFormat, Height ) + else + MenuText = string.format( MenuTextFormat, Height, Seconds ) + end + end + + if not self.EscortMenuHoldPosition then + self.EscortMenuHoldPosition = {} + end + + self.EscortMenuHoldPosition[#self.EscortMenuHoldPosition+1] = MENU_CLIENT_COMMAND + :New( + self.EscortClient, + MenuText, + self.EscortMenuHold, + ESCORT._HoldPosition, + { ParamSelf = self, + ParamOrbitGroup = self.EscortGroup, + ParamHeight = Height, + ParamSeconds = Seconds + } + ) + end + + return self +end + + +--- Defines a menu slot to let the escort hold at the client position and stay low with a specified height during a specified time in seconds. +-- This menu will appear under **Navigation**. +-- @param #ESCORT self +-- @param DCSTypes#Distance Height Optional parameter that sets the height in meters to let the escort orbit at the current location. The default value is 30 meters. +-- @param DCSTypes#Time Seconds Optional parameter that lets the escort orbit at the current position for a specified time. (not implemented yet). The default value is 0 seconds, meaning, that the escort will orbit forever until a sequent command is given. +-- @param #string MenuTextFormat Optional parameter that shows the menu option text. The text string is formatted, and should contain one or two %d tokens in the string. The first for the Height, the second for the Time (if given). If no text is given, the default text will be displayed. +-- @return #ESCORT +-- TODO: Implement Seconds parameter. Challenge is to first develop the "continue from last activity" function. +function ESCORT:MenuHoldAtLeaderPosition( Height, Seconds, MenuTextFormat ) + self:F( { Height, Seconds, MenuTextFormat } ) + + if self.EscortGroup:IsAir() then + + if not self.EscortMenuHold then + self.EscortMenuHold = MENU_CLIENT:New( self.EscortClient, "Hold position", self.EscortMenu ) + end + + if not Height then + Height = 30 + end + + if not Seconds then + Seconds = 0 + end + + local MenuText = "" + if not MenuTextFormat then + if Seconds == 0 then + MenuText = string.format( "Rejoin and hold at %d meter", Height ) + else + MenuText = string.format( "Rejoin and hold at %d meter for %d seconds", Height, Seconds ) + end + else + if Seconds == 0 then + MenuText = string.format( MenuTextFormat, Height ) + else + MenuText = string.format( MenuTextFormat, Height, Seconds ) + end + end + + if not self.EscortMenuHoldAtLeaderPosition then + self.EscortMenuHoldAtLeaderPosition = {} + end + + self.EscortMenuHoldAtLeaderPosition[#self.EscortMenuHoldAtLeaderPosition+1] = MENU_CLIENT_COMMAND + :New( + self.EscortClient, + MenuText, + self.EscortMenuHold, + ESCORT._HoldPosition, + { ParamSelf = self, + ParamOrbitGroup = self.EscortClient, + ParamHeight = Height, + ParamSeconds = Seconds + } + ) + end + + return self +end + +--- Defines a menu slot to let the escort scan for targets at a certain height for a certain time in seconds. +-- This menu will appear under **Scan targets**. +-- @param #ESCORT self +-- @param DCSTypes#Distance Height Optional parameter that sets the height in meters to let the escort orbit at the current location. The default value is 30 meters. +-- @param DCSTypes#Time Seconds Optional parameter that lets the escort orbit at the current position for a specified time. (not implemented yet). The default value is 0 seconds, meaning, that the escort will orbit forever until a sequent command is given. +-- @param #string MenuTextFormat Optional parameter that shows the menu option text. The text string is formatted, and should contain one or two %d tokens in the string. The first for the Height, the second for the Time (if given). If no text is given, the default text will be displayed. +-- @return #ESCORT +function ESCORT:MenuScanForTargets( Height, Seconds, MenuTextFormat ) + self:F( { Height, Seconds, MenuTextFormat } ) + + if self.EscortGroup:IsAir() then + if not self.EscortMenuScan then + self.EscortMenuScan = MENU_CLIENT:New( self.EscortClient, "Scan for targets", self.EscortMenu ) + end + + if not Height then + Height = 100 + end + + if not Seconds then + Seconds = 30 + end + + local MenuText = "" + if not MenuTextFormat then + if Seconds == 0 then + MenuText = string.format( "At %d meter", Height ) + else + MenuText = string.format( "At %d meter for %d seconds", Height, Seconds ) + end + else + if Seconds == 0 then + MenuText = string.format( MenuTextFormat, Height ) + else + MenuText = string.format( MenuTextFormat, Height, Seconds ) + end + end + + if not self.EscortMenuScanForTargets then + self.EscortMenuScanForTargets = {} + end + + self.EscortMenuScanForTargets[#self.EscortMenuScanForTargets+1] = MENU_CLIENT_COMMAND + :New( + self.EscortClient, + MenuText, + self.EscortMenuScan, + ESCORT._ScanTargets, + { ParamSelf = self, + ParamScanDuration = 30 + } + ) + end + + return self +end + + + +--- Defines a menu slot to let the escort disperse a flare in a certain color. +-- This menu will appear under **Navigation**. +-- The flare will be fired from the first unit in the group. +-- @param #ESCORT self +-- @param #string MenuTextFormat Optional parameter that shows the menu option text. If no text is given, the default text will be displayed. +-- @return #ESCORT +function ESCORT:MenuFlare( MenuTextFormat ) + self:F() + + if not self.EscortMenuReportNavigation then + self.EscortMenuReportNavigation = MENU_CLIENT:New( self.EscortClient, "Navigation", self.EscortMenu ) + end + + local MenuText = "" + if not MenuTextFormat then + MenuText = "Flare" + else + MenuText = MenuTextFormat + end + + if not self.EscortMenuFlare then + self.EscortMenuFlare = MENU_CLIENT:New( self.EscortClient, MenuText, self.EscortMenuReportNavigation, ESCORT._Flare, { ParamSelf = self } ) + self.EscortMenuFlareGreen = MENU_CLIENT_COMMAND:New( self.EscortClient, "Release green flare", self.EscortMenuFlare, ESCORT._Flare, { ParamSelf = self, ParamColor = UNIT.FlareColor.Green, ParamMessage = "Released a green flare!" } ) + self.EscortMenuFlareRed = MENU_CLIENT_COMMAND:New( self.EscortClient, "Release red flare", self.EscortMenuFlare, ESCORT._Flare, { ParamSelf = self, ParamColor = UNIT.FlareColor.Red, ParamMessage = "Released a red flare!" } ) + self.EscortMenuFlareWhite = MENU_CLIENT_COMMAND:New( self.EscortClient, "Release white flare", self.EscortMenuFlare, ESCORT._Flare, { ParamSelf = self, ParamColor = UNIT.FlareColor.White, ParamMessage = "Released a white flare!" } ) + self.EscortMenuFlareYellow = MENU_CLIENT_COMMAND:New( self.EscortClient, "Release yellow flare", self.EscortMenuFlare, ESCORT._Flare, { ParamSelf = self, ParamColor = UNIT.FlareColor.Yellow, ParamMessage = "Released a yellow flare!" } ) + end + + return self +end + +--- Defines a menu slot to let the escort disperse a smoke in a certain color. +-- This menu will appear under **Navigation**. +-- Note that smoke menu options will only be displayed for ships and ground units. Not for air units. +-- The smoke will be fired from the first unit in the group. +-- @param #ESCORT self +-- @param #string MenuTextFormat Optional parameter that shows the menu option text. If no text is given, the default text will be displayed. +-- @return #ESCORT +function ESCORT:MenuSmoke( MenuTextFormat ) + self:F() + + if not self.EscortGroup:IsAir() then + if not self.EscortMenuReportNavigation then + self.EscortMenuReportNavigation = MENU_CLIENT:New( self.EscortClient, "Navigation", self.EscortMenu ) + end + + local MenuText = "" + if not MenuTextFormat then + MenuText = "Smoke" + else + MenuText = MenuTextFormat + end + + if not self.EscortMenuSmoke then + self.EscortMenuSmoke = MENU_CLIENT:New( self.EscortClient, "Smoke", self.EscortMenuReportNavigation, ESCORT._Smoke, { ParamSelf = self } ) + self.EscortMenuSmokeGreen = MENU_CLIENT_COMMAND:New( self.EscortClient, "Release green smoke", self.EscortMenuSmoke, ESCORT._Smoke, { ParamSelf = self, ParamColor = UNIT.SmokeColor.Green, ParamMessage = "Releasing green smoke!" } ) + self.EscortMenuSmokeRed = MENU_CLIENT_COMMAND:New( self.EscortClient, "Release red smoke", self.EscortMenuSmoke, ESCORT._Smoke, { ParamSelf = self, ParamColor = UNIT.SmokeColor.Red, ParamMessage = "Releasing red smoke!" } ) + self.EscortMenuSmokeWhite = MENU_CLIENT_COMMAND:New( self.EscortClient, "Release white smoke", self.EscortMenuSmoke, ESCORT._Smoke, { ParamSelf = self, ParamColor = UNIT.SmokeColor.White, ParamMessage = "Releasing white smoke!" } ) + self.EscortMenuSmokeOrange = MENU_CLIENT_COMMAND:New( self.EscortClient, "Release orange smoke", self.EscortMenuSmoke, ESCORT._Smoke, { ParamSelf = self, ParamColor = UNIT.SmokeColor.Orange, ParamMessage = "Releasing orange smoke!" } ) + self.EscortMenuSmokeBlue = MENU_CLIENT_COMMAND:New( self.EscortClient, "Release blue smoke", self.EscortMenuSmoke, ESCORT._Smoke, { ParamSelf = self, ParamColor = UNIT.SmokeColor.Blue, ParamMessage = "Releasing blue smoke!" } ) + end + end + + return self +end + +--- Defines a menu slot to let the escort report their current detected targets with a specified time interval in seconds. +-- This menu will appear under **Report targets**. +-- Note that if a report targets menu is not specified, no targets will be detected by the escort, and the attack and assisted attack menus will not be displayed. +-- @param #ESCORT self +-- @param DCSTypes#Time Seconds Optional parameter that lets the escort report their current detected targets after specified time interval in seconds. The default time is 30 seconds. +-- @return #ESCORT +function ESCORT:MenuReportTargets( Seconds ) + self:F( { Seconds } ) + + if not self.EscortMenuReportNearbyTargets then + self.EscortMenuReportNearbyTargets = MENU_CLIENT:New( self.EscortClient, "Report targets", self.EscortMenu ) + end + + if not Seconds then + Seconds = 30 + end + + -- Report Targets + self.EscortMenuReportNearbyTargetsNow = MENU_CLIENT_COMMAND:New( self.EscortClient, "Report targets now!", self.EscortMenuReportNearbyTargets, ESCORT._ReportNearbyTargetsNow, { ParamSelf = self } ) + self.EscortMenuReportNearbyTargetsOn = MENU_CLIENT_COMMAND:New( self.EscortClient, "Report targets on", self.EscortMenuReportNearbyTargets, ESCORT._SwitchReportNearbyTargets, { ParamSelf = self, ParamReportTargets = true } ) + self.EscortMenuReportNearbyTargetsOff = MENU_CLIENT_COMMAND:New( self.EscortClient, "Report targets off", self.EscortMenuReportNearbyTargets, ESCORT._SwitchReportNearbyTargets, { ParamSelf = self, ParamReportTargets = false, } ) + + -- Attack Targets + self.EscortMenuAttackNearbyTargets = MENU_CLIENT:New( self.EscortClient, "Attack targets", self.EscortMenu ) + + + --self.ReportTargetsScheduler = routines.scheduleFunction( self._ReportTargetsScheduler, { self }, timer.getTime() + 1, Seconds ) + self.ReportTargetsScheduler = SCHEDULER:New( self, self._ReportTargetsScheduler, {}, 1, Seconds ) + + return self +end + +--- Defines a menu slot to let the escort attack its detected targets using assisted attack from another escort joined also with the client. +-- This menu will appear under **Request assistance from**. +-- Note that this method needs to be preceded with the method MenuReportTargets. +-- @param #ESCORT self +-- @return #ESCORT +function ESCORT:MenuAssistedAttack() + self:F() + + -- Request assistance from other escorts. + -- This is very useful to let f.e. an escorting ship attack a target detected by an escorting plane... + self.EscortMenuTargetAssistance = MENU_CLIENT:New( self.EscortClient, "Request assistance from", self.EscortMenu ) + + return self +end + +--- Defines a menu to let the escort set its rules of engagement. +-- All rules of engagement will appear under the menu **ROE**. +-- @param #ESCORT self +-- @return #ESCORT +function ESCORT:MenuROE( MenuTextFormat ) + self:F( MenuTextFormat ) + + if not self.EscortMenuROE then + -- Rules of Engagement + self.EscortMenuROE = MENU_CLIENT:New( self.EscortClient, "ROE", self.EscortMenu ) + if self.EscortGroup:OptionROEHoldFirePossible() then + self.EscortMenuROEHoldFire = MENU_CLIENT_COMMAND:New( self.EscortClient, "Hold Fire", self.EscortMenuROE, ESCORT._ROE, { ParamSelf = self, ParamFunction = self.EscortGroup:OptionROEHoldFire(), ParamMessage = "Holding weapons!" } ) + end + if self.EscortGroup:OptionROEReturnFirePossible() then + self.EscortMenuROEReturnFire = MENU_CLIENT_COMMAND:New( self.EscortClient, "Return Fire", self.EscortMenuROE, ESCORT._ROE, { ParamSelf = self, ParamFunction = self.EscortGroup:OptionROEReturnFire(), ParamMessage = "Returning fire!" } ) + end + if self.EscortGroup:OptionROEOpenFirePossible() then + self.EscortMenuROEOpenFire = MENU_CLIENT_COMMAND:New( self.EscortClient, "Open Fire", self.EscortMenuROE, ESCORT._ROE, { ParamSelf = self, ParamFunction = self.EscortGroup:OptionROEOpenFire(), ParamMessage = "Opening fire on designated targets!!" } ) + end + if self.EscortGroup:OptionROEWeaponFreePossible() then + self.EscortMenuROEWeaponFree = MENU_CLIENT_COMMAND:New( self.EscortClient, "Weapon Free", self.EscortMenuROE, ESCORT._ROE, { ParamSelf = self, ParamFunction = self.EscortGroup:OptionROEWeaponFree(), ParamMessage = "Opening fire on targets of opportunity!" } ) + end + end + + return self +end + + +--- Defines a menu to let the escort set its evasion when under threat. +-- All rules of engagement will appear under the menu **Evasion**. +-- @param #ESCORT self +-- @return #ESCORT +function ESCORT:MenuEvasion( MenuTextFormat ) + self:F( MenuTextFormat ) + + if self.EscortGroup:IsAir() then + if not self.EscortMenuEvasion then + -- Reaction to Threats + self.EscortMenuEvasion = MENU_CLIENT:New( self.EscortClient, "Evasion", self.EscortMenu ) + if self.EscortGroup:OptionROTNoReactionPossible() then + self.EscortMenuEvasionNoReaction = MENU_CLIENT_COMMAND:New( self.EscortClient, "Fight until death", self.EscortMenuEvasion, ESCORT._ROT, { ParamSelf = self, ParamFunction = self.EscortGroup:OptionROTNoReaction(), ParamMessage = "Fighting until death!" } ) + end + if self.EscortGroup:OptionROTPassiveDefensePossible() then + self.EscortMenuEvasionPassiveDefense = MENU_CLIENT_COMMAND:New( self.EscortClient, "Use flares, chaff and jammers", self.EscortMenuEvasion, ESCORT._ROT, { ParamSelf = self, ParamFunction = self.EscortGroup:OptionROTPassiveDefense(), ParamMessage = "Defending using jammers, chaff and flares!" } ) + end + if self.EscortGroup:OptionROTEvadeFirePossible() then + self.EscortMenuEvasionEvadeFire = MENU_CLIENT_COMMAND:New( self.EscortClient, "Evade enemy fire", self.EscortMenuEvasion, ESCORT._ROT, { ParamSelf = self, ParamFunction = self.EscortGroup:OptionROTEvadeFire(), ParamMessage = "Evading on enemy fire!" } ) + end + if self.EscortGroup:OptionROTVerticalPossible() then + self.EscortMenuOptionEvasionVertical = MENU_CLIENT_COMMAND:New( self.EscortClient, "Go below radar and evade fire", self.EscortMenuEvasion, ESCORT._ROT, { ParamSelf = self, ParamFunction = self.EscortGroup:OptionROTVertical(), ParamMessage = "Evading on enemy fire with vertical manoeuvres!" } ) + end + end + end + + return self +end + +--- Defines a menu to let the escort resume its mission from a waypoint on its route. +-- All rules of engagement will appear under the menu **Resume mission from**. +-- @param #ESCORT self +-- @return #ESCORT +function ESCORT:MenuResumeMission() + self:F() + + if not self.EscortMenuResumeMission then + -- Mission Resume Menu Root + self.EscortMenuResumeMission = MENU_CLIENT:New( self.EscortClient, "Resume mission from", self.EscortMenu ) + end + + return self +end + + +--- @param #MENUPARAM MenuParam +function ESCORT._HoldPosition( MenuParam ) + + local self = MenuParam.ParamSelf + local EscortGroup = self.EscortGroup + local EscortClient = self.EscortClient + + local OrbitGroup = MenuParam.ParamOrbitGroup -- Group#GROUP + local OrbitUnit = OrbitGroup:GetUnit(1) -- Unit#UNIT + local OrbitHeight = MenuParam.ParamHeight + local OrbitSeconds = MenuParam.ParamSeconds -- Not implemented yet + + routines.removeFunction( self.FollowScheduler ) + + local PointFrom = {} + local GroupPoint = EscortGroup:GetUnit(1):GetPointVec3() + PointFrom = {} + PointFrom.x = GroupPoint.x + PointFrom.y = GroupPoint.z + PointFrom.speed = 250 + PointFrom.type = AI.Task.WaypointType.TURNING_POINT + PointFrom.alt = GroupPoint.y + PointFrom.alt_type = AI.Task.AltitudeType.BARO + + local OrbitPoint = OrbitUnit:GetPointVec2() + local PointTo = {} + PointTo.x = OrbitPoint.x + PointTo.y = OrbitPoint.y + PointTo.speed = 250 + PointTo.type = AI.Task.WaypointType.TURNING_POINT + PointTo.alt = OrbitHeight + PointTo.alt_type = AI.Task.AltitudeType.BARO + PointTo.task = EscortGroup:TaskOrbitCircleAtVec2( OrbitPoint, OrbitHeight, 0 ) + + local Points = { PointFrom, PointTo } + + EscortGroup:OptionROEHoldFire() + EscortGroup:OptionROTPassiveDefense() + + EscortGroup:SetTask( EscortGroup:TaskRoute( Points ) ) + EscortGroup:MessageToClient( "Orbiting at location.", 10, EscortClient ) +end + +--- @param #MENUPARAM MenuParam +function ESCORT._JoinUpAndFollow( MenuParam ) + + local self = MenuParam.ParamSelf + local EscortGroup = self.EscortGroup + local EscortClient = self.EscortClient + + self.Distance = MenuParam.ParamDistance + + self:JoinUpAndFollow( EscortGroup, EscortClient, self.Distance ) +end + +--- JoinsUp and Follows a CLIENT. +-- @param Escort#ESCORT self +-- @param Group#GROUP EscortGroup +-- @param Client#CLIENT EscortClient +-- @param DCSTypes#Distance Distance +function ESCORT:JoinUpAndFollow( EscortGroup, EscortClient, Distance ) + self:F( { EscortGroup, EscortClient, Distance } ) + + if self.FollowScheduler then + routines.removeFunction( self.FollowScheduler ) + end + + EscortGroup:OptionROEHoldFire() + EscortGroup:OptionROTPassiveDefense() + + self.EscortMode = ESCORT.MODE.FOLLOW + + self.CT1 = 0 + self.GT1 = 0 + --self.FollowScheduler = routines.scheduleFunction( self._FollowScheduler, { self, Distance }, timer.getTime() + 1, .5 ) + self.FollowScheduler = SCHEDULER:New( self, self._FollowScheduler, { Distance }, 1, .5, .1 ) + EscortGroup:MessageToClient( "Rejoining and Following at " .. Distance .. "!", 30, EscortClient ) +end + +--- @param #MENUPARAM MenuParam +function ESCORT._Flare( MenuParam ) + + local self = MenuParam.ParamSelf + local EscortGroup = self.EscortGroup + local EscortClient = self.EscortClient + + local Color = MenuParam.ParamColor + local Message = MenuParam.ParamMessage + + EscortGroup:GetUnit(1):Flare( Color ) + EscortGroup:MessageToClient( Message, 10, EscortClient ) +end + +--- @param #MENUPARAM MenuParam +function ESCORT._Smoke( MenuParam ) + + local self = MenuParam.ParamSelf + local EscortGroup = self.EscortGroup + local EscortClient = self.EscortClient + + local Color = MenuParam.ParamColor + local Message = MenuParam.ParamMessage + + EscortGroup:GetUnit(1):Smoke( Color ) + EscortGroup:MessageToClient( Message, 10, EscortClient ) +end + + +--- @param #MENUPARAM MenuParam +function ESCORT._ReportNearbyTargetsNow( MenuParam ) + + local self = MenuParam.ParamSelf + local EscortGroup = self.EscortGroup + local EscortClient = self.EscortClient + + self:_ReportTargetsScheduler() + +end + +function ESCORT._SwitchReportNearbyTargets( MenuParam ) + + local self = MenuParam.ParamSelf + local EscortGroup = self.EscortGroup + local EscortClient = self.EscortClient + + self.ReportTargets = MenuParam.ParamReportTargets + + if self.ReportTargets then + if not self.ReportTargetsScheduler then + --self.ReportTargetsScheduler = routines.scheduleFunction( self._ReportTargetsScheduler, { self }, timer.getTime() + 1, 30 ) + self.ReportTargetsScheduler = SCHEDULER:New( self, self._ReportTargetsScheduler, {}, 1, 30 ) + end + else + routines.removeFunction( self.ReportTargetsScheduler ) + self.ReportTargetsScheduler = nil + end +end + +--- @param #MENUPARAM MenuParam +function ESCORT._ScanTargets( MenuParam ) + + local self = MenuParam.ParamSelf + local EscortGroup = self.EscortGroup + local EscortClient = self.EscortClient + + local ScanDuration = MenuParam.ParamScanDuration + + if self.FollowScheduler then + routines.removeFunction( self.FollowScheduler ) + end + + self:T( { "FollowScheduler after removefunction: ", self.FollowScheduler } ) + + if EscortGroup:IsHelicopter() then + SCHEDULER:New( EscortGroup, EscortGroup.PushTask, + { EscortGroup:TaskControlled( + EscortGroup:TaskOrbitCircle( 200, 20 ), + EscortGroup:TaskCondition( nil, nil, nil, nil, ScanDuration, nil ) + ) + }, + 1 + ) + elseif EscortGroup:IsAirPlane() then + SCHEDULER:New( EscortGroup, EscortGroup.PushTask, + { EscortGroup:TaskControlled( + EscortGroup:TaskOrbitCircle( 1000, 500 ), + EscortGroup:TaskCondition( nil, nil, nil, nil, ScanDuration, nil ) + ) + }, + 1 + ) + end + + EscortGroup:MessageToClient( "Scanning targets for " .. ScanDuration .. " seconds.", ScanDuration, EscortClient ) + + if self.EscortMode == ESCORT.MODE.FOLLOW then + --self.FollowScheduler = routines.scheduleFunction( self._FollowScheduler, { self, Distance }, timer.getTime() + ScanDuration, 1 ) + self.FollowScheduler:Start() + end + +end + +function _Resume( EscortGroup ) + env.info( '_Resume' ) + + local Escort = EscortGroup.Escort -- #ESCORT + env.info( "EscortMode = " .. Escort.EscortMode ) + if Escort.EscortMode == ESCORT.MODE.FOLLOW then + Escort:JoinUpAndFollow( EscortGroup, Escort.EscortClient, Escort.Distance ) + end + +end + +--- @param #MENUPARAM MenuParam +function ESCORT._AttackTarget( MenuParam ) + + local self = MenuParam.ParamSelf + local EscortGroup = self.EscortGroup + local EscortClient = self.EscortClient + local AttackUnit = MenuParam.ParamUnit -- Unit#UNIT + + if self.FollowScheduler then + routines.removeFunction( self.FollowScheduler ) + end + + self:T( AttackUnit ) + + if EscortGroup:IsAir() then + EscortGroup:OptionROEOpenFire() + EscortGroup:OptionROTPassiveDefense() + EscortGroup.Escort = self -- Need to do this trick to get the reference for the escort in the _Resume function. +-- routines.scheduleFunction( +-- EscortGroup.PushTask, +-- { EscortGroup, +-- EscortGroup:TaskCombo( +-- { EscortGroup:TaskAttackUnit( AttackUnit ), +-- EscortGroup:TaskFunction( 1, 2, "_Resume", {"''"} ) +-- } +-- ) +-- }, timer.getTime() + 10 +-- ) + SCHEDULER:New( EscortGroup, + EscortGroup.PushTask, + { EscortGroup:TaskCombo( + { EscortGroup:TaskAttackUnit( AttackUnit ), + EscortGroup:TaskFunction( 1, 2, "_Resume", {"''"} ) + } + ) + }, 10 + ) + else +-- routines.scheduleFunction( +-- EscortGroup.PushTask, +-- { EscortGroup, +-- EscortGroup:TaskCombo( +-- { EscortGroup:TaskFireAtPoint( AttackUnit:GetPointVec2(), 50 ) +-- } +-- ) +-- }, timer.getTime() + 10 +-- ) + SCHEDULER:New( EscortGroup, + EscortGroup.PushTask, + { EscortGroup:TaskCombo( + { EscortGroup:TaskFireAtPoint( AttackUnit:GetPointVec2(), 50 ) + } + ) + }, 10 + ) + end + EscortGroup:MessageToClient( "Engaging Designated Unit!", 10, EscortClient ) + + +end + +--- @param #MENUPARAM MenuParam +function ESCORT._AssistTarget( MenuParam ) + + local self = MenuParam.ParamSelf + local EscortGroup = self.EscortGroup + local EscortClient = self.EscortClient + local EscortGroupAttack = MenuParam.ParamEscortGroup + local AttackUnit = MenuParam.ParamUnit -- Unit#UNIT + + if self.FollowScheduler then + routines.removeFunction( self.FollowScheduler ) + end + + + self:T( AttackUnit ) + + if EscortGroupAttack:IsAir() then + EscortGroupAttack:OptionROEOpenFire() + EscortGroupAttack:OptionROTVertical() +-- routines.scheduleFunction( +-- EscortGroupAttack.PushTask, +-- { EscortGroupAttack, +-- EscortGroupAttack:TaskCombo( +-- { EscortGroupAttack:TaskAttackUnit( AttackUnit ), +-- EscortGroupAttack:TaskOrbitCircle( 500, 350 ) +-- } +-- ) +-- }, timer.getTime() + 10 +-- ) + SCHDULER:New( EscortGroupAttack, + EscortGroupAttack.PushTask, + { EscortGroupAttack:TaskCombo( + { EscortGroupAttack:TaskAttackUnit( AttackUnit ), + EscortGroupAttack:TaskOrbitCircle( 500, 350 ) + } + ) + }, 10 + ) + else +-- routines.scheduleFunction( +-- EscortGroupAttack.PushTask, +-- { EscortGroupAttack, +-- EscortGroupAttack:TaskCombo( +-- { EscortGroupAttack:TaskFireAtPoint( AttackUnit:GetPointVec2(), 50 ) +-- } +-- ) +-- }, timer.getTime() + 10 +-- ) + SCHEDULER:New( EscortGroupAttack, + EscortGroupAttack.PushTask, + { EscortGroupAttack:TaskCombo( + { EscortGroupAttack:TaskFireAtPoint( AttackUnit:GetPointVec2(), 50 ) + } + ) + }, 10 + ) + end + EscortGroupAttack:MessageToClient( "Assisting with the destroying the enemy unit!", 10, EscortClient ) + +end + +--- @param #MENUPARAM MenuParam +function ESCORT._ROE( MenuParam ) + + local self = MenuParam.ParamSelf + local EscortGroup = self.EscortGroup + local EscortClient = self.EscortClient + + local EscortROEFunction = MenuParam.ParamFunction + local EscortROEMessage = MenuParam.ParamMessage + + pcall( function() EscortROEFunction() end ) + EscortGroup:MessageToClient( EscortROEMessage, 10, EscortClient ) +end + +--- @param #MENUPARAM MenuParam +function ESCORT._ROT( MenuParam ) + + local self = MenuParam.ParamSelf + local EscortGroup = self.EscortGroup + local EscortClient = self.EscortClient + + local EscortROTFunction = MenuParam.ParamFunction + local EscortROTMessage = MenuParam.ParamMessage + + pcall( function() EscortROTFunction() end ) + EscortGroup:MessageToClient( EscortROTMessage, 10, EscortClient ) +end + +--- @param #MENUPARAM MenuParam +function ESCORT._ResumeMission( MenuParam ) + + local self = MenuParam.ParamSelf + local EscortGroup = self.EscortGroup + local EscortClient = self.EscortClient + + local WayPoint = MenuParam.ParamWayPoint + + routines.removeFunction( self.FollowScheduler ) + self.FollowScheduler = nil + + local WayPoints = EscortGroup:GetTaskRoute() + self:T( WayPoint, WayPoints ) + + for WayPointIgnore = 1, WayPoint do + table.remove( WayPoints, 1 ) + end + + --routines.scheduleFunction( EscortGroup.SetTask, {EscortGroup, EscortGroup:TaskRoute( WayPoints ) }, timer.getTime() + 1 ) + SCHEDULER:New( EscortGroup, EscortGroup.SetTask, { EscortGroup:TaskRoute( WayPoints ) }, 1 ) + + EscortGroup:MessageToClient( "Resuming mission from waypoint " .. WayPoint .. ".", 10, EscortClient ) +end + +--- Registers the waypoints +-- @param #ESCORT self +-- @return #table +function ESCORT:RegisterRoute() + self:F() + + local EscortGroup = self.EscortGroup -- Group#GROUP + + local TaskPoints = EscortGroup:GetTaskRoute() + + self:T( TaskPoints ) + + return TaskPoints +end + +--- @param Escort#ESCORT self +function ESCORT:_FollowScheduler( FollowDistance ) + self:F( { FollowDistance }) + + if self.EscortGroup:IsAlive() and self.EscortClient:IsAlive() then + + local ClientUnit = self.EscortClient:GetClientGroupUnit() + local GroupUnit = self.EscortGroup:GetUnit( 1 ) + + if self.CT1 == 0 and self.GT1 == 0 then + self.CV1 = ClientUnit:GetPointVec3() + self.CT1 = timer.getTime() + self.GV1 = GroupUnit:GetPointVec3() + self.GT1 = timer.getTime() + else + local CT1 = self.CT1 + local CT2 = timer.getTime() + local CV1 = self.CV1 + local CV2 = ClientUnit:GetPointVec3() + self.CT1 = CT2 + self.CV1 = CV2 + + local CD = ( ( CV2.x - CV1.x )^2 + ( CV2.y - CV1.y )^2 + ( CV2.z - CV1.z )^2 ) ^ 0.5 + local CT = CT2 - CT1 + + local CS = ( 3600 / CT ) * ( CD / 1000 ) + + self:T2( { "Client:", CS, CD, CT, CV2, CV1, CT2, CT1 } ) + + local GT1 = self.GT1 + local GT2 = timer.getTime() + local GV1 = self.GV1 + local GV2 = GroupUnit:GetPointVec3() + self.GT1 = GT2 + self.GV1 = GV2 + + local GD = ( ( GV2.x - GV1.x )^2 + ( GV2.y - GV1.y )^2 + ( GV2.z - GV1.z )^2 ) ^ 0.5 + local GT = GT2 - GT1 + + local GS = ( 3600 / GT ) * ( GD / 1000 ) + + self:T2( { "Group:", GS, GD, GT, GV2, GV1, GT2, GT1 } ) + + -- Calculate the group direction vector + local GV = { x = GV2.x - CV2.x, y = GV2.y - CV2.y, z = GV2.z - CV2.z } + + -- Calculate GH2, GH2 with the same height as CV2. + local GH2 = { x = GV2.x, y = CV2.y, z = GV2.z } + + -- Calculate the angle of GV to the orthonormal plane + local alpha = math.atan2( GV.z, GV.x ) + + -- Now we calculate the intersecting vector between the circle around CV2 with radius FollowDistance and GH2. + -- From the GeoGebra model: CVI = (x(CV2) + FollowDistance cos(alpha), y(GH2) + FollowDistance sin(alpha), z(CV2)) + local CVI = { x = CV2.x + FollowDistance * math.cos(alpha), + y = GH2.y, + z = CV2.z + FollowDistance * math.sin(alpha), + } + + -- Calculate the direction vector DV of the escort group. We use CVI as the base and CV2 as the direction. + local DV = { x = CV2.x - CVI.x, y = CV2.y - CVI.y, z = CV2.z - CVI.z } + + -- We now calculate the unary direction vector DVu, so that we can multiply DVu with the speed, which is expressed in meters / s. + -- We need to calculate this vector to predict the point the escort group needs to fly to according its speed. + -- The distance of the destination point should be far enough not to have the aircraft starting to swipe left to right... + local DVu = { x = DV.x / FollowDistance, y = DV.y / FollowDistance, z = DV.z / FollowDistance } + + -- Now we can calculate the group destination vector GDV. + local GDV = { x = DVu.x * CS * 8 + CVI.x, y = CVI.y, z = DVu.z * CS * 8 + CVI.z } + + --trigger.action.smoke( GDV, trigger.smokeColor.Red ) + self:T2( { "CV2:", CV2 } ) + self:T2( { "CVI:", CVI } ) + self:T2( { "GDV:", GDV } ) + + -- Measure distance between client and group + local CatchUpDistance = ( ( GDV.x - GV2.x )^2 + ( GDV.y - GV2.y )^2 + ( GDV.z - GV2.z )^2 ) ^ 0.5 + + -- The calculation of the Speed would simulate that the group would take 30 seconds to overcome + -- the requested Distance). + local Time = 10 + local CatchUpSpeed = ( CatchUpDistance - ( CS * 8.4 ) ) / Time + + local Speed = CS + CatchUpSpeed + if Speed < 0 then + Speed = 0 + end + + self:T( { "Client Speed, Escort Speed, Speed, FlyDistance, Time:", CS, GS, Speed, Distance, Time } ) + + -- Now route the escort to the desired point with the desired speed. + self.EscortGroup:TaskRouteToVec3( GDV, Speed / 3.6 ) -- DCS models speed in Mps (Miles per second) + end + return true + end + + return false +end + + +--- Report Targets Scheduler. +-- @param #ESCORT self +function ESCORT:_ReportTargetsScheduler() + self:F( self.EscortGroup:GetName() ) + + if self.EscortGroup:IsAlive() and self.EscortClient:IsAlive() then + local EscortGroupName = self.EscortGroup:GetName() + local EscortTargets = self.EscortGroup:GetDetectedTargets() + + local ClientEscortTargets = self.EscortClient._EscortGroups[EscortGroupName].Targets + + local EscortTargetMessages = "" + for EscortTargetID, EscortTarget in pairs( EscortTargets ) do + local EscortObject = EscortTarget.object + self:T( EscortObject ) + if EscortObject and EscortObject:isExist() and EscortObject.id_ < 50000000 then + + local EscortTargetUnit = UNIT:Find( EscortObject ) + local EscortTargetUnitName = EscortTargetUnit:GetName() + + + + -- local EscortTargetIsDetected, + -- EscortTargetIsVisible, + -- EscortTargetLastTime, + -- EscortTargetKnowType, + -- EscortTargetKnowDistance, + -- EscortTargetLastPos, + -- EscortTargetLastVelocity + -- = self.EscortGroup:IsTargetDetected( EscortObject ) + -- + -- self:T( { EscortTargetIsDetected, + -- EscortTargetIsVisible, + -- EscortTargetLastTime, + -- EscortTargetKnowType, + -- EscortTargetKnowDistance, + -- EscortTargetLastPos, + -- EscortTargetLastVelocity } ) + + + local EscortTargetUnitPositionVec3 = EscortTargetUnit:GetPointVec3() + local EscortPositionVec3 = self.EscortGroup:GetPointVec3() + local Distance = ( ( EscortTargetUnitPositionVec3.x - EscortPositionVec3.x )^2 + + ( EscortTargetUnitPositionVec3.y - EscortPositionVec3.y )^2 + + ( EscortTargetUnitPositionVec3.z - EscortPositionVec3.z )^2 + ) ^ 0.5 / 1000 + + self:T( { self.EscortGroup:GetName(), EscortTargetUnit:GetName(), Distance, EscortTarget } ) + + if Distance <= 15 then + + if not ClientEscortTargets[EscortTargetUnitName] then + ClientEscortTargets[EscortTargetUnitName] = {} + end + ClientEscortTargets[EscortTargetUnitName].AttackUnit = EscortTargetUnit + ClientEscortTargets[EscortTargetUnitName].visible = EscortTarget.visible + ClientEscortTargets[EscortTargetUnitName].type = EscortTarget.type + ClientEscortTargets[EscortTargetUnitName].distance = EscortTarget.distance + else + if ClientEscortTargets[EscortTargetUnitName] then + ClientEscortTargets[EscortTargetUnitName] = nil + end + end + end + end + + self:T( { "Sorting Targets Table:", ClientEscortTargets } ) + table.sort( ClientEscortTargets, function( a, b ) return a.Distance < b.Distance end ) + self:T( { "Sorted Targets Table:", ClientEscortTargets } ) + + -- Remove the sub menus of the Attack menu of the Escort for the EscortGroup. + self.EscortMenuAttackNearbyTargets:RemoveSubMenus() + + if self.EscortMenuTargetAssistance then + self.EscortMenuTargetAssistance:RemoveSubMenus() + end + + --for MenuIndex = 1, #self.EscortMenuAttackTargets do + -- self:T( { "Remove Menu:", self.EscortMenuAttackTargets[MenuIndex] } ) + -- self.EscortMenuAttackTargets[MenuIndex] = self.EscortMenuAttackTargets[MenuIndex]:Remove() + --end + + + if ClientEscortTargets then + for ClientEscortTargetUnitName, ClientEscortTargetData in pairs( ClientEscortTargets ) do + + for ClientEscortGroupName, EscortGroupData in pairs( self.EscortClient._EscortGroups ) do + + if ClientEscortTargetData and ClientEscortTargetData.AttackUnit:IsAlive() then + + local EscortTargetMessage = "" + local EscortTargetCategoryName = ClientEscortTargetData.AttackUnit:GetCategoryName() + local EscortTargetCategoryType = ClientEscortTargetData.AttackUnit:GetTypeName() + if ClientEscortTargetData.type then + EscortTargetMessage = EscortTargetMessage .. EscortTargetCategoryName .. " (" .. EscortTargetCategoryType .. ") at " + else + EscortTargetMessage = EscortTargetMessage .. "Unknown target at " + end + + local EscortTargetUnitPositionVec3 = ClientEscortTargetData.AttackUnit:GetPointVec3() + local EscortPositionVec3 = self.EscortGroup:GetPointVec3() + local Distance = ( ( EscortTargetUnitPositionVec3.x - EscortPositionVec3.x )^2 + + ( EscortTargetUnitPositionVec3.y - EscortPositionVec3.y )^2 + + ( EscortTargetUnitPositionVec3.z - EscortPositionVec3.z )^2 + ) ^ 0.5 / 1000 + + self:T( { self.EscortGroup:GetName(), ClientEscortTargetData.AttackUnit:GetName(), Distance, ClientEscortTargetData.AttackUnit } ) + if ClientEscortTargetData.visible == false then + EscortTargetMessage = EscortTargetMessage .. string.format( "%.2f", Distance ) .. " estimated km" + else + EscortTargetMessage = EscortTargetMessage .. string.format( "%.2f", Distance ) .. " km" + end + + if ClientEscortTargetData.visible then + EscortTargetMessage = EscortTargetMessage .. ", visual" + end + + if ClientEscortGroupName == EscortGroupName then + + MENU_CLIENT_COMMAND:New( self.EscortClient, + EscortTargetMessage, + self.EscortMenuAttackNearbyTargets, + ESCORT._AttackTarget, + { ParamSelf = self, + ParamUnit = ClientEscortTargetData.AttackUnit + } + ) + EscortTargetMessages = EscortTargetMessages .. "\n - " .. EscortTargetMessage + else + if self.EscortMenuTargetAssistance then + local MenuTargetAssistance = MENU_CLIENT:New( self.EscortClient, EscortGroupData.EscortName, self.EscortMenuTargetAssistance ) + MENU_CLIENT_COMMAND:New( self.EscortClient, + EscortTargetMessage, + MenuTargetAssistance, + ESCORT._AssistTarget, + { ParamSelf = self, + ParamEscortGroup = EscortGroupData.EscortGroup, + ParamUnit = ClientEscortTargetData.AttackUnit + } + ) + end + end + else + ClientEscortTargetData = nil + end + end + end + + if EscortTargetMessages ~= "" and self.ReportTargets == true then + self.EscortGroup:MessageToClient( "Detected targets within 15 km range:" .. EscortTargetMessages:gsub("\n$",""), 20, self.EscortClient ) + else + self.EscortGroup:MessageToClient( "No targets detected!", 20, self.EscortClient ) + end + end + + if self.EscortMenuResumeMission then + self.EscortMenuResumeMission:RemoveSubMenus() + + -- if self.EscortMenuResumeWayPoints then + -- for MenuIndex = 1, #self.EscortMenuResumeWayPoints do + -- self:T( { "Remove Menu:", self.EscortMenuResumeWayPoints[MenuIndex] } ) + -- self.EscortMenuResumeWayPoints[MenuIndex] = self.EscortMenuResumeWayPoints[MenuIndex]:Remove() + -- end + -- end + + local TaskPoints = self:RegisterRoute() + for WayPointID, WayPoint in pairs( TaskPoints ) do + local EscortPositionVec3 = self.EscortGroup:GetPointVec3() + local Distance = ( ( WayPoint.x - EscortPositionVec3.x )^2 + + ( WayPoint.y - EscortPositionVec3.z )^2 + ) ^ 0.5 / 1000 + MENU_CLIENT_COMMAND:New( self.EscortClient, "Waypoint " .. WayPointID .. " at " .. string.format( "%.2f", Distance ).. "km", self.EscortMenuResumeMission, ESCORT._ResumeMission, { ParamSelf = self, ParamWayPoint = WayPointID } ) + end + end + return true + end + + return false +end +--- Provides missile training functions. +-- +-- @{#MISSILETRAINER} class +-- ======================== +-- The @{#MISSILETRAINER} class uses the DCS world messaging system to be alerted of any missiles fired, and when a missile would hit your aircraft, +-- the class will destroy the missile within a certain range, to avoid damage to your aircraft. +-- It suports the following functionality: +-- +-- * Track the missiles fired at you and other players, providing bearing and range information of the missiles towards the airplanes. +-- * Provide alerts of missile launches, including detailed information of the units launching, including bearing, range … +-- * Provide alerts when a missile would have killed your aircraft. +-- * Provide alerts when the missile self destructs. +-- * Enable / Disable and Configure the Missile Trainer using the various menu options. +-- +-- When running a mission where MISSILETRAINER is used, the following radio menu structure ( 'Radio Menu' -> 'Other (F10)' -> 'MissileTrainer' ) options are available for the players: +-- +-- * **Messages**: Menu to configure all messages. +-- * **Messages On**: Show all messages. +-- * **Messages Off**: Disable all messages. +-- * **Tracking**: Menu to configure missile tracking messages. +-- * **To All**: Shows missile tracking messages to all players. +-- * **To Target**: Shows missile tracking messages only to the player where the missile is targetted at. +-- * **Tracking On**: Show missile tracking messages. +-- * **Tracking Off**: Disable missile tracking messages. +-- * **Frequency Increase**: Increases the missile tracking message frequency with one second. +-- * **Frequency Decrease**: Decreases the missile tracking message frequency with one second. +-- * **Alerts**: Menu to configure alert messages. +-- * **To All**: Shows alert messages to all players. +-- * **To Target**: Shows alert messages only to the player where the missile is (was) targetted at. +-- * **Hits On**: Show missile hit alert messages. +-- * **Hits Off**: Disable missile hit alert messages. +-- * **Launches On**: Show missile launch messages. +-- * **Launches Off**: Disable missile launch messages. +-- * **Details**: Menu to configure message details. +-- * **Range On**: Shows range information when a missile is fired to a target. +-- * **Range Off**: Disable range information when a missile is fired to a target. +-- * **Bearing On**: Shows bearing information when a missile is fired to a target. +-- * **Bearing Off**: Disable bearing information when a missile is fired to a target. +-- * **Distance**: Menu to configure the distance when a missile needs to be destroyed when near to a player, during tracking. This will improve/influence hit calculation accuracy, but has the risk of damaging the aircraft when the missile reaches the aircraft before the distance is measured. +-- * **50 meter**: Destroys the missile when the distance to the aircraft is below or equal to 50 meter. +-- * **100 meter**: Destroys the missile when the distance to the aircraft is below or equal to 100 meter. +-- * **150 meter**: Destroys the missile when the distance to the aircraft is below or equal to 150 meter. +-- * **200 meter**: Destroys the missile when the distance to the aircraft is below or equal to 200 meter. +-- +-- +-- MISSILETRAINER construction methods: +-- ==================================== +-- Create a new MISSILETRAINER object with the @{#MISSILETRAINER.New} method: +-- +-- * @{#MISSILETRAINER.New}: Creates a new MISSILETRAINER object taking the maximum distance to your aircraft to evaluate when a missile needs to be destroyed. +-- +-- MISSILETRAINER will collect each unit declared in the mission with a skill level "Client" and "Player", and will monitor the missiles shot at those. +-- +-- MISSILETRAINER initialization methods: +-- ====================================== +-- A MISSILETRAINER object will behave differently based on the usage of initialization methods: +-- +-- * @{#MISSILETRAINER.InitMessagesOnOff}: Sets by default the display of any message to be ON or OFF. +-- * @{#MISSILETRAINER.InitTrackingToAll}: Sets by default the missile tracking report for all players or only for those missiles targetted to you. +-- * @{#MISSILETRAINER.InitTrackingOnOff}: Sets by default the display of missile tracking report to be ON or OFF. +-- * @{#MISSILETRAINER.InitTrackingFrequency}: Increases, decreases the missile tracking message display frequency with the provided time interval in seconds. +-- * @{#MISSILETRAINER.InitAlertsToAll}: Sets by default the display of alerts to be shown to all players or only to you. +-- * @{#MISSILETRAINER.InitAlertsHitsOnOff}: Sets by default the display of hit alerts ON or OFF. +-- * @{#MISSILETRAINER.InitAlertsLaunchesOnOff}: Sets by default the display of launch alerts ON or OFF. +-- * @{#MISSILETRAINER.InitRangeOnOff}: Sets by default the display of range information of missiles ON of OFF. +-- * @{#MISSILETRAINER.InitBearingOnOff}: Sets by default the display of bearing information of missiles ON of OFF. +-- * @{#MISSILETRAINER.InitMenusOnOff}: Allows to configure the options through the radio menu. +-- +-- @module MissileTrainer +-- @author FlightControl + + +Include.File( "Client" ) +Include.File( "Scheduler" ) + +--- The MISSILETRAINER class +-- @type MISSILETRAINER +-- @extends Base#BASE +MISSILETRAINER = { + ClassName = "MISSILETRAINER", +} + +--- Creates the main object which is handling missile tracking. +-- When a missile is fired a SCHEDULER is set off that follows the missile. When near a certain a client player, the missile will be destroyed. +-- @param #MISSILETRAINER self +-- @param #number Distance The distance in meters when a tracked missile needs to be destroyed when close to a player. +-- @param #string Briefing (Optional) Will show a text to the players when starting their mission. Can be used for briefing purposes. +-- @return #MISSILETRAINER +function MISSILETRAINER:New( Distance, Briefing ) + local self = BASE:Inherit( self, BASE:New() ) + self:F( Distance ) + + if Briefing then + self.Briefing = Briefing + end + + self.Schedulers = {} + self.SchedulerID = 0 + + self.MessageInterval = 2 + self.MessageLastTime = timer.getTime() + + self.Distance = Distance / 1000 + + _EVENTDISPATCHER:OnShot( self._EventShot, self ) + + self.DB = DATABASE:New():FilterStart() + self.DBClients = self.DB.Clients + self.DBUnits = self.DB.Units + + for ClientID, Client in pairs( self.DBClients ) do + + local function _Alive( Client ) + + if self.Briefing then + Client:Message( self.Briefing, 15, "HELLO WORLD", "Trainer" ) + end + + if self.MenusOnOff == true then + Client:Message( "Use the 'Radio Menu' -> 'Other (F10)' -> 'Missile Trainer' menu options to change the Missile Trainer settings (for all players).", 15, "MENU", "Trainer" ) + + Client.MainMenu = MENU_CLIENT:New( Client, "Missile Trainer", nil ) -- Menu#MENU_CLIENT + + Client.MenuMessages = MENU_CLIENT:New( Client, "Messages", Client.MainMenu ) + Client.MenuOn = MENU_CLIENT_COMMAND:New( Client, "Messages On", Client.MenuMessages, self._MenuMessages, { MenuSelf = self, MessagesOnOff = true } ) + Client.MenuOff = MENU_CLIENT_COMMAND:New( Client, "Messages Off", Client.MenuMessages, self._MenuMessages, { MenuSelf = self, MessagesOnOff = false } ) + + Client.MenuTracking = MENU_CLIENT:New( Client, "Tracking", Client.MainMenu ) + Client.MenuTrackingToAll = MENU_CLIENT_COMMAND:New( Client, "To All", Client.MenuTracking, self._MenuMessages, { MenuSelf = self, TrackingToAll = true } ) + Client.MenuTrackingToTarget = MENU_CLIENT_COMMAND:New( Client, "To Target", Client.MenuTracking, self._MenuMessages, { MenuSelf = self, TrackingToAll = false } ) + Client.MenuTrackOn = MENU_CLIENT_COMMAND:New( Client, "Tracking On", Client.MenuTracking, self._MenuMessages, { MenuSelf = self, TrackingOnOff = true } ) + Client.MenuTrackOff = MENU_CLIENT_COMMAND:New( Client, "Tracking Off", Client.MenuTracking, self._MenuMessages, { MenuSelf = self, TrackingOnOff = false } ) + Client.MenuTrackIncrease = MENU_CLIENT_COMMAND:New( Client, "Frequency Increase", Client.MenuTracking, self._MenuMessages, { MenuSelf = self, TrackingFrequency = -1 } ) + Client.MenuTrackDecrease = MENU_CLIENT_COMMAND:New( Client, "Frequency Decrease", Client.MenuTracking, self._MenuMessages, { MenuSelf = self, TrackingFrequency = 1 } ) + + Client.MenuAlerts = MENU_CLIENT:New( Client, "Alerts", Client.MainMenu ) + Client.MenuAlertsToAll = MENU_CLIENT_COMMAND:New( Client, "To All", Client.MenuAlerts, self._MenuMessages, { MenuSelf = self, AlertsToAll = true } ) + Client.MenuAlertsToTarget = MENU_CLIENT_COMMAND:New( Client, "To Target", Client.MenuAlerts, self._MenuMessages, { MenuSelf = self, AlertsToAll = false } ) + Client.MenuHitsOn = MENU_CLIENT_COMMAND:New( Client, "Hits On", Client.MenuAlerts, self._MenuMessages, { MenuSelf = self, AlertsHitsOnOff = true } ) + Client.MenuHitsOff = MENU_CLIENT_COMMAND:New( Client, "Hits Off", Client.MenuAlerts, self._MenuMessages, { MenuSelf = self, AlertsHitsOnOff = false } ) + Client.MenuLaunchesOn = MENU_CLIENT_COMMAND:New( Client, "Launches On", Client.MenuAlerts, self._MenuMessages, { MenuSelf = self, AlertsLaunchesOnOff = true } ) + Client.MenuLaunchesOff = MENU_CLIENT_COMMAND:New( Client, "Launches Off", Client.MenuAlerts, self._MenuMessages, { MenuSelf = self, AlertsLaunchesOnOff = false } ) + + Client.MenuDetails = MENU_CLIENT:New( Client, "Details", Client.MainMenu ) + Client.MenuDetailsDistanceOn = MENU_CLIENT_COMMAND:New( Client, "Range On", Client.MenuDetails, self._MenuMessages, { MenuSelf = self, DetailsRangeOnOff = true } ) + Client.MenuDetailsDistanceOff = MENU_CLIENT_COMMAND:New( Client, "Range Off", Client.MenuDetails, self._MenuMessages, { MenuSelf = self, DetailsRangeOnOff = false } ) + Client.MenuDetailsBearingOn = MENU_CLIENT_COMMAND:New( Client, "Bearing On", Client.MenuDetails, self._MenuMessages, { MenuSelf = self, DetailsBearingOnOff = true } ) + Client.MenuDetailsBearingOff = MENU_CLIENT_COMMAND:New( Client, "Bearing Off", Client.MenuDetails, self._MenuMessages, { MenuSelf = self, DetailsBearingOnOff = false } ) + + Client.MenuDistance = MENU_CLIENT:New( Client, "Set distance to plane", Client.MainMenu ) + Client.MenuDistance50 = MENU_CLIENT_COMMAND:New( Client, "50 meter", Client.MenuDistance, self._MenuMessages, { MenuSelf = self, Distance = 50 / 1000 } ) + Client.MenuDistance100 = MENU_CLIENT_COMMAND:New( Client, "100 meter", Client.MenuDistance, self._MenuMessages, { MenuSelf = self, Distance = 100 / 1000 } ) + Client.MenuDistance150 = MENU_CLIENT_COMMAND:New( Client, "150 meter", Client.MenuDistance, self._MenuMessages, { MenuSelf = self, Distance = 150 / 1000 } ) + Client.MenuDistance200 = MENU_CLIENT_COMMAND:New( Client, "200 meter", Client.MenuDistance, self._MenuMessages, { MenuSelf = self, Distance = 200 / 1000 } ) + else + if Client.MainMenu then + Client.MainMenu:Remove() + end + end + + + local ClientID = Client:GetID() + self:T( ClientID ) + if not self.TrackingMissiles[ClientID] then + self.TrackingMissiles[ClientID] = {} + end + self.TrackingMissiles[ClientID].Client = Client + if not self.TrackingMissiles[ClientID].MissileData then + self.TrackingMissiles[ClientID].MissileData = {} + end + end + + Client:Alive( _Alive ) + + end + +-- self.DB:ForEachClient( +-- --- @param Client#CLIENT Client +-- function( Client ) +-- +-- ... actions ... +-- +-- end +-- ) + + self.MessagesOnOff = true + + self.TrackingToAll = false + self.TrackingOnOff = true + self.TrackingFrequency = 3 + + self.AlertsToAll = true + self.AlertsHitsOnOff = true + self.AlertsLaunchesOnOff = true + + self.DetailsRangeOnOff = true + self.DetailsBearingOnOff = true + + self.MenusOnOff = true + + self.TrackingMissiles = {} + + self.TrackingScheduler = SCHEDULER:New( self, self._TrackMissiles, {}, 0.5, 0.05, 0 ) + + return self +end + +-- Initialization methods. + + +--- Sets by default the display of any message to be ON or OFF. +-- @param #MISSILETRAINER self +-- @param #boolean MessagesOnOff true or false +-- @return #MISSILETRAINER self +function MISSILETRAINER:InitMessagesOnOff( MessagesOnOff ) + self:F( MessagesOnOff ) + + self.MessagesOnOff = MessagesOnOff + if self.MessagesOnOff == true then + MESSAGE:New( "Messages ON", "Menu", 15, "ID" ):ToAll() + else + MESSAGE:New( "Messages OFF", "Menu", 15, "ID" ):ToAll() + end + + return self +end + +--- Sets by default the missile tracking report for all players or only for those missiles targetted to you. +-- @param #MISSILETRAINER self +-- @param #boolean TrackingToAll true or false +-- @return #MISSILETRAINER self +function MISSILETRAINER:InitTrackingToAll( TrackingToAll ) + self:F( TrackingToAll ) + + self.TrackingToAll = TrackingToAll + if self.TrackingToAll == true then + MESSAGE:New( "Missile tracking to all players ON", "Menu", 15, "ID" ):ToAll() + else + MESSAGE:New( "Missile tracking to all players OFF", "Menu", 15, "ID" ):ToAll() + end + + return self +end + +--- Sets by default the display of missile tracking report to be ON or OFF. +-- @param #MISSILETRAINER self +-- @param #boolean TrackingOnOff true or false +-- @return #MISSILETRAINER self +function MISSILETRAINER:InitTrackingOnOff( TrackingOnOff ) + self:F( TrackingOnOff ) + + self.TrackingOnOff = TrackingOnOff + if self.TrackingOnOff == true then + MESSAGE:New( "Missile tracking ON", "Menu", 15, "ID" ):ToAll() + else + MESSAGE:New( "Missile tracking OFF", "Menu", 15, "ID" ):ToAll() + end + + return self +end + +--- Increases, decreases the missile tracking message display frequency with the provided time interval in seconds. +-- The default frequency is a 3 second interval, so the Tracking Frequency parameter specifies the increase or decrease from the default 3 seconds or the last frequency update. +-- @param #MISSILETRAINER self +-- @param #number TrackingFrequency Provide a negative or positive value in seconds to incraese or decrease the display frequency. +-- @return #MISSILETRAINER self +function MISSILETRAINER:InitTrackingFrequency( TrackingFrequency ) + self:F( TrackingFrequency ) + + self.TrackingFrequency = self.TrackingFrequency + TrackingFrequency + if self.TrackingFrequency < 0.5 then + self.TrackingFrequency = 0.5 + end + if self.TrackingFrequency then + MESSAGE:New( "Missile tracking frequency is " .. self.TrackingFrequency .. " seconds.", "Menu", 15, "ID" ):ToAll() + end + + return self +end + +--- Sets by default the display of alerts to be shown to all players or only to you. +-- @param #MISSILETRAINER self +-- @param #boolean AlertsToAll true or false +-- @return #MISSILETRAINER self +function MISSILETRAINER:InitAlertsToAll( AlertsToAll ) + self:F( AlertsToAll ) + + self.AlertsToAll = AlertsToAll + if self.AlertsToAll == true then + MESSAGE:New( "Alerts to all players ON", "Menu", 15, "ID" ):ToAll() + else + MESSAGE:New( "Alerts to all players OFF", "Menu", 15, "ID" ):ToAll() + end + + return self +end + +--- Sets by default the display of hit alerts ON or OFF. +-- @param #MISSILETRAINER self +-- @param #boolean AlertsHitsOnOff true or false +-- @return #MISSILETRAINER self +function MISSILETRAINER:InitAlertsHitsOnOff( AlertsHitsOnOff ) + self:F( AlertsHitsOnOff ) + + self.AlertsHitsOnOff = AlertsHitsOnOff + if self.AlertsHitsOnOff == true then + MESSAGE:New( "Alerts Hits ON", "Menu", 15, "ID" ):ToAll() + else + MESSAGE:New( "Alerts Hits OFF", "Menu", 15, "ID" ):ToAll() + end + + return self +end + +--- Sets by default the display of launch alerts ON or OFF. +-- @param #MISSILETRAINER self +-- @param #boolean AlertsLaunchesOnOff true or false +-- @return #MISSILETRAINER self +function MISSILETRAINER:InitAlertsLaunchesOnOff( AlertsLaunchesOnOff ) + self:F( AlertsLaunchesOnOff ) + + self.AlertsLaunchesOnOff = AlertsLaunchesOnOff + if self.AlertsLaunchesOnOff == true then + MESSAGE:New( "Alerts Launches ON", "Menu", 15, "ID" ):ToAll() + else + MESSAGE:New( "Alerts Launches OFF", "Menu", 15, "ID" ):ToAll() + end + + return self +end + +--- Sets by default the display of range information of missiles ON of OFF. +-- @param #MISSILETRAINER self +-- @param #boolean DetailsRangeOnOff true or false +-- @return #MISSILETRAINER self +function MISSILETRAINER:InitRangeOnOff( DetailsRangeOnOff ) + self:F( DetailsRangeOnOff ) + + self.DetailsRangeOnOff = DetailsRangeOnOff + if self.DetailsRangeOnOff == true then + MESSAGE:New( "Range display ON", "Menu", 15, "ID" ):ToAll() + else + MESSAGE:New( "Range display OFF", "Menu", 15, "ID" ):ToAll() + end + + return self +end + +--- Sets by default the display of bearing information of missiles ON of OFF. +-- @param #MISSILETRAINER self +-- @param #boolean DetailsBearingOnOff true or false +-- @return #MISSILETRAINER self +function MISSILETRAINER:InitBearingOnOff( DetailsBearingOnOff ) + self:F( DetailsBearingOnOff ) + + self.DetailsBearingOnOff = DetailsBearingOnOff + if self.DetailsBearingOnOff == true then + MESSAGE:New( "Bearing display OFF", "Menu", 15, "ID" ):ToAll() + else + MESSAGE:New( "Bearing display OFF", "Menu", 15, "ID" ):ToAll() + end + + return self +end + +--- Enables / Disables the menus. +-- @param #MISSILETRAINER self +-- @param #boolean MenusOnOff true or false +-- @return #MISSILETRAINER self +function MISSILETRAINER:InitMenusOnOff( MenusOnOff ) + self:F( MenusOnOff ) + + self.MenusOnOff = MenusOnOff + if self.MenusOnOff == true then + MESSAGE:New( "Menus are ENABLED (only when a player rejoins a slot)", "Menu", 15, "ID" ):ToAll() + else + MESSAGE:New( "Menus are DISABLED", "Menu", 15, "ID" ):ToAll() + end + + return self +end + + +-- Menu functions + +function MISSILETRAINER._MenuMessages( MenuParameters ) + + local self = MenuParameters.MenuSelf + + if MenuParameters.MessagesOnOff ~= nil then + self:InitMessagesOnOff( MenuParameters.MessagesOnOff ) + end + + if MenuParameters.TrackingToAll ~= nil then + self:InitTrackingToAll( MenuParameters.TrackingToAll ) + end + + if MenuParameters.TrackingOnOff ~= nil then + self:InitTrackingOnOff( MenuParameters.TrackingOnOff ) + end + + if MenuParameters.TrackingFrequency ~= nil then + self:InitTrackingFrequency( MenuParameters.TrackingFrequency ) + end + + if MenuParameters.AlertsToAll ~= nil then + self:InitAlertsToAll( MenuParameters.AlertsToAll ) + end + + if MenuParameters.AlertsHitsOnOff ~= nil then + self:InitAlertsHitsOnOff( MenuParameters.AlertsHitsOnOff ) + end + + if MenuParameters.AlertsLaunchesOnOff ~= nil then + self:InitAlertsLaunchesOnOff( MenuParameters.AlertsLaunchesOnOff ) + end + + if MenuParameters.DetailsRangeOnOff ~= nil then + self:InitRangeOnOff( MenuParameters.DetailsRangeOnOff ) + end + + if MenuParameters.DetailsBearingOnOff ~= nil then + self:InitBearingOnOff( MenuParameters.DetailsBearingOnOff ) + end + + if MenuParameters.Distance ~= nil then + self.Distance = MenuParameters.Distance + MESSAGE:New( "Hit detection distance set to " .. self.Distance .. " meters", "Menu", 15, "ID" ):ToAll() + end + +end + +--- Detects if an SA site was shot with an anti radiation missile. In this case, take evasive actions based on the skill level set within the ME. +-- @param #MISSILETRAINER self +-- @param Event#EVENTDATA Event +function MISSILETRAINER:_EventShot( Event ) + self:F( { Event } ) + + local TrainerSourceDCSUnit = Event.IniDCSUnit + local TrainerSourceDCSUnitName = Event.IniDCSUnitName + local TrainerWeapon = Event.Weapon -- Identify the weapon fired + local TrainerWeaponName = Event.WeaponName -- return weapon type + + self:T( "Missile Launched = " .. TrainerWeaponName ) + + local TrainerTargetDCSUnit = TrainerWeapon:getTarget() -- Identify target + local TrainerTargetDCSUnitName = Unit.getName( TrainerTargetDCSUnit ) + local TrainerTargetSkill = _DATABASE.Templates.Units[TrainerTargetDCSUnitName].Template.skill + + self:T(TrainerTargetDCSUnitName ) + + local Client = self.DBClients[TrainerTargetDCSUnitName] + if Client then + + local TrainerSourceUnit = UNIT:Find( TrainerSourceDCSUnit ) + local TrainerTargetUnit = UNIT:Find( TrainerTargetDCSUnit ) + + if self.MessagesOnOff == true and self.AlertsLaunchesOnOff == true then + + local Message = MESSAGE:New( + string.format( "%s launched a %s", + TrainerSourceUnit:GetTypeName(), + TrainerWeaponName + ) .. self:_AddRange( Client, TrainerWeapon ) .. self:_AddBearing( Client, TrainerWeapon ),"Launch Alert", 5, "ID" ) + + if self.AlertsToAll then + Message:ToAll() + else + Message:ToClient( Client ) + end + end + + local ClientID = Client:GetID() + local MissileData = {} + MissileData.TrainerSourceUnit = TrainerSourceUnit + MissileData.TrainerWeapon = TrainerWeapon + MissileData.TrainerTargetUnit = TrainerTargetUnit + MissileData.TrainerWeaponTypeName = TrainerWeapon:getTypeName() + MissileData.TrainerWeaponLaunched = true + table.insert( self.TrackingMissiles[ClientID].MissileData, MissileData ) + --self:T( self.TrackingMissiles ) + end +end + +function MISSILETRAINER:_AddRange( Client, TrainerWeapon ) + + local RangeText = "" + + if self.DetailsRangeOnOff then + + local PositionMissile = TrainerWeapon:getPoint() + local PositionTarget = Client:GetPointVec3() + + local Range = ( ( PositionMissile.x - PositionTarget.x )^2 + + ( PositionMissile.y - PositionTarget.y )^2 + + ( PositionMissile.z - PositionTarget.z )^2 + ) ^ 0.5 / 1000 + + RangeText = string.format( ", at %4.2fkm", Range ) + end + + return RangeText +end + +function MISSILETRAINER:_AddBearing( Client, TrainerWeapon ) + + local BearingText = "" + + if self.DetailsBearingOnOff then + + local PositionMissile = TrainerWeapon:getPoint() + local PositionTarget = Client:GetPointVec3() + + self:T2( { PositionTarget, PositionMissile }) + + local DirectionVector = { x = PositionMissile.x - PositionTarget.x, y = PositionMissile.y - PositionTarget.y, z = PositionMissile.z - PositionTarget.z } + local DirectionRadians = math.atan2( DirectionVector.z, DirectionVector.x ) + --DirectionRadians = DirectionRadians + routines.getNorthCorrection( PositionTarget ) + if DirectionRadians < 0 then + DirectionRadians = DirectionRadians + 2 * math.pi + end + local DirectionDegrees = DirectionRadians * 180 / math.pi + + BearingText = string.format( ", %d degrees", DirectionDegrees ) + end + + return BearingText +end + + +function MISSILETRAINER:_TrackMissiles() + self:F2() + + + local ShowMessages = false + if self.MessagesOnOff and self.MessageLastTime + self.TrackingFrequency <= timer.getTime() then + self.MessageLastTime = timer.getTime() + ShowMessages = true + end + + -- ALERTS PART + + -- Loop for all Player Clients to check the alerts and deletion of missiles. + for ClientDataID, ClientData in pairs( self.TrackingMissiles ) do + + local Client = ClientData.Client + self:T2( { Client:GetName() } ) + + for MissileDataID, MissileData in pairs( ClientData.MissileData ) do + self:T3( MissileDataID ) + + local TrainerSourceUnit = MissileData.TrainerSourceUnit + local TrainerWeapon = MissileData.TrainerWeapon + local TrainerTargetUnit = MissileData.TrainerTargetUnit + local TrainerWeaponTypeName = MissileData.TrainerWeaponTypeName + local TrainerWeaponLaunched = MissileData.TrainerWeaponLaunched + + if Client and Client:IsAlive() and TrainerSourceUnit and TrainerSourceUnit:IsAlive() and TrainerWeapon and TrainerWeapon:isExist() and TrainerTargetUnit and TrainerTargetUnit:IsAlive() then + local PositionMissile = TrainerWeapon:getPosition().p + local PositionTarget = Client:GetPointVec3() + + local Distance = ( ( PositionMissile.x - PositionTarget.x )^2 + + ( PositionMissile.y - PositionTarget.y )^2 + + ( PositionMissile.z - PositionTarget.z )^2 + ) ^ 0.5 / 1000 + + if Distance <= self.Distance then + -- Hit alert + TrainerWeapon:destroy() + if self.MessagesOnOff == true and self.AlertsHitsOnOff == true then + + self:T( "killed" ) + + local Message = MESSAGE:New( + string.format( "%s launched by %s killed %s", + TrainerWeapon:getTypeName(), + TrainerSourceUnit:GetTypeName(), + TrainerTargetUnit:GetPlayerName() + ),"Hit Alert", 15, "ID" ) + + if self.AlertsToAll == true then + Message:ToAll() + else + Message:ToClient( Client ) + end + + MissileData = nil + table.remove( ClientData.MissileData, MissileDataID ) + self:T(ClientData.MissileData) + end + end + else + if not ( TrainerWeapon and TrainerWeapon:isExist() ) then + if self.MessagesOnOff == true and self.AlertsLaunchesOnOff == true then + -- Weapon does not exist anymore. Delete from Table + local Message = MESSAGE:New( + string.format( "%s launched by %s self destructed!", + TrainerWeaponTypeName, + TrainerSourceUnit:GetTypeName() + ),"Tracking", 5, "ID" ) + + if self.AlertsToAll == true then + Message:ToAll() + else + Message:ToClient( Client ) + end + end + MissileData = nil + table.remove( ClientData.MissileData, MissileDataID ) + self:T( ClientData.MissileData ) + end + end + end + end + + if ShowMessages == true and self.MessagesOnOff == true and self.TrackingOnOff == true then -- Only do this when tracking information needs to be displayed. + + -- TRACKING PART + + -- For the current client, the missile range and bearing details are displayed To the Player Client. + -- For the other clients, the missile range and bearing details are displayed To the other Player Clients. + -- To achieve this, a cross loop is done for each Player Client <-> Other Player Client missile information. + + -- Main Player Client loop + for ClientDataID, ClientData in pairs( self.TrackingMissiles ) do + + local Client = ClientData.Client + self:T2( { Client:GetName() } ) + + + ClientData.MessageToClient = "" + ClientData.MessageToAll = "" + + -- Other Players Client loop + for TrackingDataID, TrackingData in pairs( self.TrackingMissiles ) do + + for MissileDataID, MissileData in pairs( TrackingData.MissileData ) do + self:T3( MissileDataID ) + + local TrainerSourceUnit = MissileData.TrainerSourceUnit + local TrainerWeapon = MissileData.TrainerWeapon + local TrainerTargetUnit = MissileData.TrainerTargetUnit + local TrainerWeaponTypeName = MissileData.TrainerWeaponTypeName + local TrainerWeaponLaunched = MissileData.TrainerWeaponLaunched + + if Client and Client:IsAlive() and TrainerSourceUnit and TrainerSourceUnit:IsAlive() and TrainerWeapon and TrainerWeapon:isExist() and TrainerTargetUnit and TrainerTargetUnit:IsAlive() then + + if ShowMessages == true then + local TrackingTo + TrackingTo = string.format( " -> %s", + TrainerWeaponTypeName + ) + + if ClientDataID == TrackingDataID then + if ClientData.MessageToClient == "" then + ClientData.MessageToClient = "Missiles to You:\n" + end + ClientData.MessageToClient = ClientData.MessageToClient .. TrackingTo .. self:_AddRange( ClientData.Client, TrainerWeapon ) .. self:_AddBearing( ClientData.Client, TrainerWeapon ) .. "\n" + else + if self.TrackingToAll == true then + if ClientData.MessageToAll == "" then + ClientData.MessageToAll = "Missiles to other Players:\n" + end + ClientData.MessageToAll = ClientData.MessageToAll .. TrackingTo .. self:_AddRange( ClientData.Client, TrainerWeapon ) .. self:_AddBearing( ClientData.Client, TrainerWeapon ) .. " ( " .. TrainerTargetUnit:GetPlayerName() .. " )\n" + end + end + end + end + end + end + + -- Once the Player Client and the Other Player Client tracking messages are prepared, show them. + if ClientData.MessageToClient ~= "" or ClientData.MessageToAll ~= "" then + local Message = MESSAGE:New( ClientData.MessageToClient .. ClientData.MessageToAll, "Tracking", 1, "ID" ):ToClient( Client ) + end + end + end + + return true +end +env.info( '*** MOOSE INCLUDE END *** ' ) diff --git a/Moose Test Missions/Moose_Test_CLEANUP/Moose_Test_CLEANUP.miz b/Moose Test Missions/Moose_Test_CLEANUP/Moose_Test_CLEANUP.miz index 3090778e9eed937c96bf587e786e08584fb152e7..84c83e5c20992a21be4a76a9aaa299a69a56d8fe 100644 GIT binary patch delta 110556 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

    t;UD9$ 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